Ver código fonte

Merge branch 'ChronicMag' into Chronic-ll

Luolei 6 anos atrás
pai
commit
8e3e6d3e8b
48 arquivos alterados com 943 adições e 340 exclusões
  1. 63 0
      src/common/components/CheckBtn/index.jsx
  2. 24 0
      src/common/components/CheckBtn/index.less
  3. 5 0
      src/common/components/ComplexModal/index.less
  4. 7 2
      src/common/components/ConfirmModal/index.jsx
  5. 6 1
      src/common/components/ConfirmModal/index.less
  6. 0 65
      src/common/components/Radio/index.js
  7. 65 0
      src/common/components/Radio/index.jsx
  8. 3 1
      src/common/components/index.js
  9. BIN
      src/common/images/add-result.png
  10. BIN
      src/common/images/加入@3x.png
  11. BIN
      src/common/images/已加入@2x.png
  12. BIN
      src/common/images/已加入@3x.png
  13. 1 1
      src/common/js/func.js
  14. 119 35
      src/components/AssessResult/ChartItem/index.jsx
  15. 61 9
      src/components/AssessResult/ChooseItem/index.jsx
  16. 3 0
      src/components/AssessResult/ScaleItem/index.jsx
  17. 27 28
      src/components/AssessResult/index.jsx
  18. 36 3
      src/components/AssessResult/index.less
  19. 5 0
      src/components/BodyContainer/index.less
  20. 174 94
      src/components/ChronicInfo/index.jsx
  21. 21 4
      src/components/ChronicInfo/index.less
  22. 2 2
      src/components/CurrentIll/index.jsx
  23. 4 5
      src/components/DiagnosticList/index.jsx
  24. 21 4
      src/components/DiagnosticList/index.less
  25. 2 2
      src/components/PushItems/index.jsx
  26. 1 1
      src/components/PushItems/index.less
  27. 38 7
      src/components/ScaleTable/index.jsx
  28. 14 19
      src/components/ScaleTable/index.less
  29. 14 1
      src/config/index.js
  30. 54 7
      src/containers/AssessResult.js
  31. 5 1
      src/containers/ChronicInfo.js
  32. 1 0
      src/containers/DiagnosticList.js
  33. 1 0
      src/containers/PushItemsContainer.js
  34. 1 1
      src/store/actions/checkBody.js
  35. 15 2
      src/store/actions/currentIll.js
  36. 20 12
      src/store/actions/mainSuit.js
  37. 5 2
      src/store/async-actions/diagnosticList.js
  38. 3 3
      src/store/async-actions/fetchModules.js
  39. 3 6
      src/store/async-actions/historyTemplates.js
  40. 11 10
      src/store/async-actions/homePage.js
  41. 20 1
      src/store/async-actions/print.js
  42. 38 3
      src/store/async-actions/pushMessage.js
  43. 30 3
      src/store/reducers/assessResult.js
  44. 5 0
      src/store/reducers/inspect.js
  45. 7 1
      src/store/reducers/pushMessage.js
  46. 4 2
      src/store/types/assessResult.js
  47. 2 0
      src/store/types/pushMessage.js
  48. 2 2
      src/utils/tools.js

+ 63 - 0
src/common/components/CheckBtn/index.jsx

@@ -0,0 +1,63 @@
+import React from 'react';
+/*import PropTypes from 'prop-types';*/
+import on from '@common/images/checked.png';
+import style from './index.less';
+
+/**
+ * 多选按钮
+ * handleClick:点击触发按键 会将输入的props信息作为参数传入
+ * isSelect:是否选中
+ * label:右侧显示文字
+ */
+class CheckBtn extends React.Component {
+  constructor(props){
+    super(props);
+    this.handleClick = this.handleClick.bind(this);
+  }
+
+  handleClick(id){
+    this.props.handleClick(id);
+  }
+
+  getStyle(){
+    if(this.props.display=='block'){
+      return {
+        display:'block',
+        // marginBottom:'10px'
+      }
+    }
+    return {
+      display:'inline-block',
+      /*marginLeft:'10px'*/
+    }
+  }
+
+  render() {
+    const {id,label,isSelect,disabled} = this.props;
+    /*if(disabled){
+        return (
+            <div className={style['check-box']}
+                 style={this.getStyle()}>
+                <span className={style['img']}></span>
+                <span style={{color:'#aaa'}}>{label}</span>
+            </div>
+        )
+    }*/
+    return (
+      <div className={style['check-box']}
+           onClick={() =>this.handleClick(id)}
+           style={this.getStyle()}>
+        <span className={isSelect?style['on']:style['img']}></span>
+        <span>{label}</span>
+      </div>
+    )
+  }
+}
+
+/*Radio.propTypes = {
+    handleClick:PropTypes.func,
+    isSelect:PropTypes.bool,
+    name:PropTypes.string
+};*/
+
+export default CheckBtn;

+ 24 - 0
src/common/components/CheckBtn/index.less

@@ -0,0 +1,24 @@
+.check-box{
+  max-width: 120px;
+  height: 35px;
+  line-height: 35px;
+  cursor: pointer;
+  .img{
+    display: inline-block;
+    width: 14px;
+    height: 14px;
+    vertical-align: middle;
+    margin-right: 4px;
+    background: #fff;
+    -webkit-appearance: none;
+    border: 1px solid #c9c9c9;
+    border-radius: 4px;
+    outline: none;
+    cursor: pointer;
+  }
+  .on{
+    .img;
+    background: url("../../images/first.png") no-repeat;
+    background-size: 93% 100%;
+  }
+}

+ 5 - 0
src/common/components/ComplexModal/index.less

@@ -14,6 +14,11 @@
     bottom:30px;
     text-align: right;
   }
+  /*@media print {
+    .shade{
+      display: none;
+    }
+  }*/
   .shade {
     position: fixed;
     left: 0;

+ 7 - 2
src/common/components/ConfirmModal/index.jsx

@@ -122,7 +122,8 @@ class ConfirmModal extends Component {
             width, 
             height, 
             closable, 
-            noFooter
+            noFooter,
+            icon
         } = this.props;
         const marginLeft = -parseInt(width)/2
         const marginTop = -parseInt(height)/2
@@ -130,7 +131,11 @@ class ConfirmModal extends Component {
             <NewPortal visible={visible}>
                 <div className={styles['modal-wrapper']} id='confirm'>
                     <div className={styles[['modal']]} style = {{width: width, marginLeft:marginLeft, height:height, marginTop:marginTop}}>
-                        <div className={styles['modal-title']} style={{background: titleBg}}>{title ? title : ''} {closable ? <img onClick={this.closeModal} className={styles['modal-close']} src = {close}/> : false}</div>
+                        <div className={styles['modal-title']} style={{background: titleBg}}>
+                            {icon?<img src={icon} className={styles['icon']}/>:''}
+                            {title ? title : ''} 
+                            {closable ? <img onClick={this.closeModal} className={styles['modal-close']} src = {close}/> : false}
+                        </div>
                         <div className={styles['modal-content']}>{children}</div>
                         {noFooter ? '' : <div className={styles['modal-operator']+' clearfix'}>
                             <div className={styles['modal-btn-box']}>

+ 6 - 1
src/common/components/ConfirmModal/index.less

@@ -17,6 +17,11 @@
     background: #e5e5e5
 }
 
+.icon{
+    vertical-align: text-top;
+    margin-right: 2px;
+}
+
 .modal-close {
     position: absolute;
     right: 0px;
@@ -80,4 +85,4 @@
     filter:alpha(opacity=60);
     -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(opacity=60);";
     z-index: 9998;
-}
+}

+ 0 - 65
src/common/components/Radio/index.js

@@ -1,65 +0,0 @@
-import React from 'react';
-/*import PropTypes from 'prop-types';*/
-import on from '@common/images/icon-radio-active.png';
-import off from '@common/images/icon-radio-default.png';
-import disable from './img/disable.png';
-import style from './index.less';
-
-/**
- * 单选按钮
- * handleClick:点击触发按键 会将输入的props信息作为参数传入
- * isSelect:是否选中
- * name:右侧显示文字
- */
-class Radio extends React.Component {
-    constructor(props){
-        super(props);
-        this.handleClick = this.handleClick.bind(this);
-    }
-
-    handleClick(id){
-        this.props.handleClick(id);
-    }
-
-    getStyle(){
-        if(this.props.display=='block'){
-            return {
-                display:'block',
-                // marginBottom:'10px'
-            }
-        }
-        return {
-            display:'inline-block',
-            /*marginLeft:'10px'*/
-        }
-    }
-
-    render() {
-        const {id,name,isSelect,disabled} = this.props;
-        if(disabled){
-            return (
-                <div className={style['radio']}
-                     style={this.getStyle()}>
-                    <img src={isSelect?disable:off}/>
-                    <span style={{color:'#aaa'}}>{name}</span>
-                </div>
-            )
-        }
-        return (
-            <div className={style['radio']}
-                 onClick={() =>this.handleClick(id)}
-                 style={this.getStyle()}>
-                <img src={isSelect?on:off}/>
-                <span>{name}</span>
-            </div>
-        )
-    }
-}
-
-/*Radio.propTypes = {
-    handleClick:PropTypes.func,
-    isSelect:PropTypes.bool,
-    name:PropTypes.string
-};*/
-
-export default Radio;

+ 65 - 0
src/common/components/Radio/index.jsx

@@ -0,0 +1,65 @@
+import React from 'react';
+/*import PropTypes from 'prop-types';*/
+import on from '@common/images/icon-radio-active.png';
+import off from '@common/images/icon-radio-default.png';
+import disable from './img/disable.png';
+import style from './index.less';
+
+/**
+ * 单选按钮
+ * handleClick:点击触发按键 会将输入的props信息作为参数传入
+ * isSelect:是否选中
+ * label:右侧显示文字
+ */
+class Radio extends React.Component {
+  constructor(props){
+    super(props);
+    this.handleClick = this.handleClick.bind(this);
+  }
+
+  handleClick(id){
+    this.props.handleClick(id);
+  }
+
+  getStyle(){
+    if(this.props.display=='block'){
+      return {
+        display:'block',
+        // marginBottom:'10px'
+      }
+    }
+    return {
+      display:'inline-block',
+      /*marginLeft:'10px'*/
+    }
+  }
+
+  render() {
+    const {id,label,isSelect,disabled} = this.props;
+    if(disabled){
+      return (
+        <div className={style['radio']}
+             style={this.getStyle()}>
+          <img src={isSelect?disable:off}/>
+          <span style={{color:'#aaa'}}>{label}</span>
+        </div>
+      )
+    }
+    return (
+      <div className={style['radio']}
+           onClick={() =>this.handleClick(id)}
+           style={this.getStyle()}>
+        <img src={isSelect?on:off}/>
+        <span>{label}</span>
+      </div>
+    )
+  }
+}
+
+/*Radio.propTypes = {
+    handleClick:PropTypes.func,
+    isSelect:PropTypes.bool,
+    name:PropTypes.string
+};*/
+
+export default Radio;

+ 3 - 1
src/common/components/index.js

@@ -3,7 +3,8 @@ import Button from "./Button";
 import Loading from "./Loading";
 import Message from "./Message";
 import Modal from "./Modal";
-import Radio from "./Radio";
+import Radio from "./Radio/index";
+import CheckBtn from './CheckBtn';
 import InlineTag from './InlineTag';
 import ItemBox from './ItemBox';
 import Tab from './Tab';
@@ -26,6 +27,7 @@ module.exports = {
     Banner,
     Modal,
     Radio,
+    CheckBtn,
     Loading,
     Button,
     Message,

BIN
src/common/images/add-result.png


BIN
src/common/images/加入@3x.png


BIN
src/common/images/已加入@2x.png


BIN
src/common/images/已加入@3x.png


+ 1 - 1
src/common/js/func.js

@@ -22,7 +22,7 @@ export function dateParser(timestamp,link = '-'){
     let hour = time.getHours().toString().padStart(2,'0');
     let minute = time.getMinutes().toString().padStart(2,'0');
     // let result = year+link+month+link+date;
-    let result = year+link+month+link+date+' '+hour+':'+minute;
+    let result = year+link+(month<10?"0"+month:month)+link+(date<10?"0"+date:date)+' '+hour+':'+minute;
     return result;
 }
 

+ 119 - 35
src/components/AssessResult/ChartItem/index.jsx

@@ -2,6 +2,7 @@ import React, { Component } from "react";
 import style from "../index.less";
 import { Radio} from '@commonComp';
 import echarts from 'echarts';
+import config from "@config";
 /**
  * 来源于后台数据
  * 图表类型
@@ -12,55 +13,92 @@ class ChartItem extends Component {
   constructor(props) {
     super(props);
     this.state={
-      weekArr:[],
-      oneMonthArr:[],
-      threeMonthArr:[],
-      yearMonthArr:[]
+      timeDismen:props.timeTypes
     };
     this.getContainers = this.getContainers.bind(this);
+    this.rangChange = this.rangChange.bind(this);
+    this.getXAxisArr = this.getXAxisArr.bind(this);
   }
-  getXAxisArr(){
+  getXAxisArr(type){
     let now = new Date().getTime();
     let arr = [],temp=0;
-    for(let i=0;i<7;i++){
-      temp=i*1000*60*60*24;
-      arr.unshift(...this.getDayHours(now-temp));
-    }console.log(arr)
+    //近一周
+    switch(type){
+      case 'week':
+        for(let i=0;i<7;i++){
+          temp=i*1000*60*60*24;
+          arr.unshift(...this.getDayHours(now-temp,true));
+        }
+        break;
+      case 'month':
+        for(let i=0;i<30;i++){
+          temp=i*1000*60*60*24;
+          arr.unshift(this.getDayHours(now-temp));
+        }
+        break;
+      case 'sixMonth':
+        for(let i=0;i<180;i++){
+          temp=i*1000*60*60*24;
+          arr.unshift(this.getDayHours(now-temp));
+        }
+        break;
+      case 'year':
+        for(let i=0;i<365;i++){
+          temp=i*1000*60*60*24;
+          arr.unshift(this.getDayHours(now-temp));
+        }
+        break;
+      default:
+    }
+
     return arr;
   }
-  getDayHours(time){
+  getDayHours(time,isHour){
     const year = new Date(time).getFullYear();
     const month = new Date(time).getMonth()+1;
     const date = new Date(time).getDate();
     const hour = new Date(time).getHours();
     let arr=[],temp='';
-    for(let i=0;i<24;i++){
-      temp = hour-i>-1?hour-i:hour-i+24;
-      arr.unshift(year+'-'+(month<10?'0'+month:month)+'-'+(date<10?'0'+date:date)+" "+(temp<10?'0'+temp:temp));
+    const str= year+'-'+(month<10?'0'+month:month)+'-'+(date<10?'0'+date:date);
+    if(isHour){
+      for(let i=0;i<24;i++){
+        temp = hour-i>-1?hour-i:hour-i+24;
+        arr.unshift(str+" "+(temp<10?'0'+temp:temp));
+      }
+      return arr;
+    }else{
+      return str;
     }
-    return arr;
+  }
+  rangChange(type,index){
+    const {initFn} = this.props;
+    const times = this.getXAxisArr(type);
+    const range = [times[0],times[times.length-1]];
+    const temp=this.state.timeDismen;
+    this.setState({
+      timeDismen:Object.assign(temp,{[index]:type})
+    });
+    initFn&&initFn({range,rangeType:type,index});
   }
   getContainers(){
-    const {nameObj,obj} = this.props.data;
-    const {weekArr} = this.state;
+    const timeTypes = this.state.timeDismen;
+    const range = this.getXAxisArr(config.chartDismen);
+    const obj = this.props.data[range[0]+range[range.length-1]];
     let arr = [];
     for(let i in obj){
-      arr.push(<Chart data={obj[i]} index={i} xAxis = {weekArr}/>)
+      arr.push(<Chart data={obj[i]} type={timeTypes&&timeTypes[i]} index={i} getXAxisArr={this.getXAxisArr} handleRangeChange={this.rangChange}/>)
     }
     return arr;
   }
   componentDidMount(){
     const {initFn} = this.props;
-    initFn&&initFn();
-    this.setState({
-      weekArr:this.getXAxisArr(),
-      oneMonthArr:[],
-      threeMonthArr:[],
-      yearMonthArr:[]
-    });
+    const type = config.chartDismen;
+    const times = this.getXAxisArr(config.chartDismen);
+    const range = [times[0],times[times.length-1]];
+    initFn&&initFn({range,rangeType:type});
   }
   render() {
-    const {title,data } = this.props;
+    const {title} = this.props;
     return <div className={style['assess-item']}>
       <h2>{title}</h2>
       <div className={style['item-content']}>
@@ -73,19 +111,43 @@ class ChartItem extends Component {
 class Chart extends Component{
   constructor(props) {
     super(props);
+    this.state={
+      chartObj:null,
+      timeRange:'year',
+      week:props.getXAxisArr('week'),
+      month:props.getXAxisArr('month'),
+      sixMonth:props.getXAxisArr('sixMonth'),
+      year:props.getXAxisArr('year')
+    };
     this.drawChart = this.drawChart.bind(this);
+    this.timeSwitch = this.timeSwitch.bind(this);
   }
   drawChart(){
-    const {index,xAxis,data} = this.props;
+    const {index,data,getXAxisArr,type} = this.props;
+    const xAxis = getXAxisArr(type);
     const id = 'chart'+index;
     let series = [],names=[],inx=-1;
-    var myChart = echarts.init(document.getElementById(id));
-
-    data.map((it)=>{
-      let values=new Array(168);
+    let myChart = echarts.init(document.getElementById(id));//this.state['chartObj'+index];
+    /*if(!myChart){
+      this.setState({
+        ['chartObj'+index]:echarts.init(document.getElementById(id))
+      });
+    }*/
+    const interval = {
+      week:24,
+      month:4,
+      sixMonth:9,
+      year:60
+    };
+    data&&data.map((it)=>{
+      let values=new Array();
+      let name='';
       //values[24]=10;
-      it.creatTime.map((x,i)=>{
-        inx=xAxis.findIndex((a)=>{return a==x.substr(0,13)});     //日期对应横坐标的位置
+      it&&it.creatTime.map((x,i)=>{
+        inx=xAxis.findIndex((a)=>{
+          name=type=='week'?x.substr(0,13):x.substr(0,10);
+          return a==name;
+        });     //日期对应横坐标的位置
         if(inx!=-1){
           values[inx] = it.indexValue[i];       //值对应横坐标的位置
         }
@@ -118,12 +180,12 @@ class Chart extends Component{
         },
         axisTick:{
           show:false,
-          interval:24
+          interval:interval[type]
         },
         axisLabel:{
           show:true,
           showMaxLabel:true,
-          interval:24,
+          interval:interval[type],
           rotate:45,
           fontSize:10
         }
@@ -144,11 +206,33 @@ class Chart extends Component{
     // 使用刚指定的配置项和数据显示图表。
     myChart.setOption(option);
   }
+  timeSwitch(type){
+    const {handleRangeChange,index} = this.props;
+    this.setState({
+      timeRange:type
+    });
+    handleRangeChange&&handleRangeChange(type,index);
+    //
+    const that=this;
+    setTimeout(()=>{
+      that.drawChart();
+    },300);
+
+  }
   componentDidMount(){
     this.drawChart();
   }
   render(){
-    return <div className={style["chart-box"]} id={'chart'+this.props.index}></div>
+    const {timeRange} = this.state;
+    return <div className={style['cont']}>
+              <div className={style['time-range']}>
+                <span className={timeRange=='year'?style['range']+" "+style['on']:style['range']} onClick={()=>this.timeSwitch("year")}>近一年</span>
+                <span className={timeRange=='sixMonth'?style['range']+" "+style['on']:style['range']} onClick={()=>this.timeSwitch("sixMonth")}>近六个月</span>
+                <span className={timeRange=='month'?style['range']+" "+style['on']:style['range']} onClick={()=>this.timeSwitch("month")}>近一个月</span>
+                <span className={timeRange=='week'?style['range']+" "+style['on']:style['range']} onClick={()=>this.timeSwitch("week")}>近一周</span>
+              </div>
+              <div className={style["chart-box"]} id={'chart'+this.props.index}></div>
+            </div>;
   }
 }
 

+ 61 - 9
src/components/AssessResult/ChooseItem/index.jsx

@@ -1,6 +1,6 @@
 import React, { Component } from "react";
 import style from "../index.less";
-import { Radio} from '@commonComp';
+import { Radio,CheckBtn } from '@commonComp';
 /****
  * 大数据推送出的类型
  * 要素:名称、选项、推荐选择
@@ -8,10 +8,53 @@ import { Radio} from '@commonComp';
  * ****/
 class ChooseItem extends Component {
   constructor(props) {
-    super(props)
+    super(props);
+    this.state = {
+      saveData:null,
+      selecteds:{},
+    };
+    //this.setInitState = this.setInitState.bind(this);
+  }
+  /*setInitState(){
+    if(this.state.saveData){
+      this.setState({
+        saveData:this.props.data
+      });
+    }
+  }*/
+  handleRadio(name,value){
+    const {selecteds} = this.state;
+    const {handleChange} = this.props;
+    this.setState({
+      selecteds:Object.assign({},selecteds,{[name]:value})
+    });
+    handleChange&&handleChange(Object.assign({},selecteds,{[name]:value}));     //不能用this.state.selecteds,因为state更新不是即时的
+    /*const list = item.details.map((it)=>{
+      if(it.detailName==value){
+        return Object.assign(it,{isSelected:true});
+      }else{
+        return Object.assign(it,{isSelected:false});
+      }
+    });*/
+  }
+  handleCheckbox(name,value){
+    let {selecteds} = this.state;
+    const {handleChange} = this.props;
+    selecteds[name]?selecteds[name]:selecteds[name]=[];
+    const index = selecteds[name].findIndex((i)=>i==value);
+    if(index!=-1){
+      selecteds[name].splice(index,1);
+    }else{
+      selecteds[name].push(value);
+    }
+    this.setState({
+      selecteds:selecteds
+    });
+    handleChange&&handleChange(selecteds);
   }
   render() {
-    const {title,data  } = this.props;
+    const {title,data} = this.props;
+    const {selecteds} = this.state;
     return <div className={style['assess-item']}>
         <h2>{title}</h2>
         <div className={style['item-content']}>
@@ -21,14 +64,23 @@ class ChooseItem extends Component {
                 <span>{it.name}:</span>
                 <div className={style['row']}>
                   {it.details&&it.details.map((i)=> {
-                    if(it.controltype ==1){
-                      return <div className={style['choose-item']}><Radio name={i.detailName} value={i.detailName} handleClick={null}></Radio>{i.state?<i>(智能推荐)</i>:''}</div>;
+                    if(it.controltype ==0){
+                      return <div className={style['choose-item']}>
+                                <Radio label={i.detailName}
+                                       value={i.detailName}
+                                       isSelect={selecteds[it.name]==i.detailName}
+                                       handleClick={this.handleRadio.bind(this,it.name,i.detailName)}></Radio>
+                                {i.state?<i>(智能推荐)</i>:''}
+                              </div>;
                     }else{
-                      return <span className={style['choose-item']}>
-                                <input id={i.detailName} value={i.detailName} name={it.name} type="checkbox" />
-                                <label htmlFor={i.detailName}>{i.detailName}</label>
+                      return <div className={style['choose-item']}>
+                                <CheckBtn id={i.detailName}
+                                          value={i.detailName}
+                                          label={i.detailName}
+                                          isSelect={selecteds[it.name]&&selecteds[it.name].includes(i.detailName)}
+                                          handleClick={this.handleCheckbox.bind(this,it.name,i.detailName)}/>
                                 {i.state?<i>(智能推荐)</i>:''}
-                              </span>;
+                              </div>;
                     }
                   })}
                 </div>

+ 3 - 0
src/components/AssessResult/ScaleItem/index.jsx

@@ -32,6 +32,9 @@ class ScaleItem extends Component {
               <img src={deleteIcon} />
             </div>
           </li>
+          <li>
+            <textarea className={style['edit-row']} name="supplement" id="" rows="6" placeholder='评估描述'></textarea>
+          </li>
         </ul>
       </div>
     </div>;

+ 27 - 28
src/components/AssessResult/index.jsx

@@ -6,45 +6,44 @@ import ChooseItem from "./ChooseItem";
 import ScaleItem from "./ScaleItem";
 import ChartItem from "./ChartItem";
 
-
 class AssessResult extends Component {
   constructor(props) {
-    super(props)
+    super(props);
+    this.state={
+      chooseSelecteds:{}
+    }
+    //this.handleChooseChange = this.handleChooseChange.bind(this);
   }
   componentWillMount(){
     //获取评估
     this.props.getAssess();
   }
-  parseChartData(){
-    const {indexData}=this.props;
-    let arr=[],obj={},temp={};
-    let nameArr=[],nameObj={};
-    if(!indexData){
-      return [];
-    }
-    indexData.indexConfigData.map((it)=>{
-      arr=obj[it.orderNo]||[];
-      nameArr=nameObj[it.orderNo]||[];
-      temp=indexData.itemIndexData.find((i)=>{return i.itemName==it.indexUnique});
-      obj[it.orderNo]=[...arr,temp];
-      nameObj[it.orderNo]=[...nameArr,it.indexUnique];
+  handleScaleDel(){
+
+  }
+  handleChooseChange(i,selects){
+    const {chooseSelecteds} = this.state;
+    this.setState({
+      chooseSelecteds: Object.assign(chooseSelecteds,{[i]:selects})
     });
-    //nameObj,obj;
-    return {nameObj,obj};
+    console.log(this.state.chooseSelecteds)
+  }
+  handleChartChange(){
+
   }
-  handoutTypes(item){
-    const {getIndexData,indexData} =this.props;
+  handoutTypes(item,i){
+    const {getIndexData,indexData,timeTypes} =this.props;
     //console.log(indexData)
-    const chartData = this.parseChartData();
+    const chartData = indexData;
     const name = item.regionName+":";
     const list = item.data&&item.data.rows;
     switch (+item.regionType){
-      case 0:
-        return <ScaleItem title={name} data={list}></ScaleItem>;
-      case 1:
-        return <ChooseItem title={name} data={list}></ChooseItem>;
-      case 10:
-        return <ChartItem title={name} data={chartData} initFn={getIndexData}></ChartItem>;
+      case 0:     //数据来源与右侧手动添加
+        return <ScaleItem title={name} data={list} handleChange={this.handleScaleDel}></ScaleItem>;
+      case 1:     //数据来源于大数据
+        return <ChooseItem title={name} data={list} handleChange={this.handleChooseChange.bind(this,i)}></ChooseItem>;
+      case 10:    //数据来源于后台
+        return <ChartItem title={name} data={chartData||{}} timeTypes={timeTypes} initFn={getIndexData} handleChange={this.handleChartChange}></ChartItem>;
       default:
         return '';
     }
@@ -52,8 +51,8 @@ class AssessResult extends Component {
   render() {
     const { onClose,data } = this.props;
     return <div className={style['assess-cont']}>
-      {data&&data.map((it)=>{
-        return this.handoutTypes(it);
+      {data&&data.map((it,i)=>{
+        return this.handoutTypes(it,i);
       })}
     </div>;
   }

+ 36 - 3
src/components/AssessResult/index.less

@@ -43,12 +43,45 @@
       color: #929292;
     }
   }
-  .chart-box{
+  .edit-row{
+    width: 100%;
+    border:1px @placeholder-color solid;
+    border-radius: 4px;
+    padding: 5px;
+  }
+  .cont{
     display: inline-block;
     width: 49%;
-    height: 225px;
+    height: 250px;
+    margin-bottom: 20px;
+    position: relative;
+    .chart-box{
+      width: 100%;
+      height: 100%;
+    }
   }
-  .chart-box:nth-child(odd){
+  .cont:nth-child(odd){
     margin-right: 2%;
   }
+  .time-range{
+    position: absolute;
+    top: 26px;
+    z-index: 2;
+    margin-left: 18px;
+    .range{
+      display: inline-block;
+      border:1px #DFDFDF solid;
+      border-radius: 10px;
+      background: #fff;
+      padding: 5px 10px;
+      margin-right: 15px;
+      font-size: 12px;
+      cursor: pointer;
+      &.on{
+        background: @blue;
+        color: #fff;
+        border-color: @blue;
+      }
+    }
+  }
 }

+ 5 - 0
src/components/BodyContainer/index.less

@@ -1,3 +1,8 @@
+/*@media print{
+  .container{
+    display: none;
+  }
+}*/
 .container{
   padding: 50px 10px 0 10px;
   position: relative;

Diferenças do arquivo suprimidas por serem muito extensas
+ 174 - 94
src/components/ChronicInfo/index.jsx


+ 21 - 4
src/components/ChronicInfo/index.less

@@ -67,15 +67,22 @@
         }
         .listName{
           color:#3B9ED0;
+          cursor: pointer;
         }
         .listResult{
           float: right;
-          color: #000012;
-          i{
-            color: #F98F24;
-          }
+          display: inline-block;
+          width: 99px;
+          height: 26px;
+          line-height: 26px;
+          text-align: center;
+          border: 1px solid #EAEDF1;
+          border-radius: 4px;
+          font-size: 12px;
           img{
             vertical-align: middle;
+            width: 12px;
+            margin:-3px 3px 0 0;
           }
         }
         .infoBox{
@@ -105,6 +112,16 @@
           }
         }
       }
+      .marTop{
+        margin-top: 10px;
+        position: relative;
+        img{
+          vertical-align: middle;
+        }
+      }
+      .blue{
+        color:#3B9ED0;
+      }
       .mainList{
         .listBtn{
           display: inline-block;

+ 2 - 2
src/components/CurrentIll/index.jsx

@@ -43,7 +43,7 @@ class CurrentIll extends Component{
 
   handleFocus(e){
     // 判断主诉是否为空
-    const {mainData,mainText,setData,moduleNum,mainIds,data,changeEditIll,editClear,symptomFeature} = this.props;
+    const {mainData,mainText,setData,moduleNum,mainIds,data,changeEditIll,editClear,symptomFeature,isChronic} = this.props;
     const that = this;
     let {setDataTimer} = this.state; 
     let mainFinallyText = filterDataArr(mainText);
@@ -61,7 +61,7 @@ class CurrentIll extends Component{
         // setData && setData({useEmpty,num,mainData,mainIds});
         clearTimeout(setDataTimer);
         setDataTimer = setTimeout(function(){//延时,等待主诉失焦数据返回
-          setData && setData({num,mainData,mainIds,symptomFeature:symptomFeature.featureData});
+          setData && setData({num,mainData,mainIds,symptomFeature:symptomFeature.featureData,isChronic});
         },200)  
         this.setState({
           setDataTimer

+ 4 - 5
src/components/DiagnosticList/index.jsx

@@ -11,6 +11,7 @@ import { initItemList } from '@store/async-actions/historyTemplates';
 import { pushAllDataList } from '@utils/tools';
 import iconRadioDefault from '@common/images/icon-radio-default.png'
 import iconRadioActive from '@common/images/icon-radio-active.png'
+import tableIcon from '@common/images/table.png';
 
 class DiagnosticList extends Component {
     constructor(props) {
@@ -87,10 +88,10 @@ class DiagnosticList extends Component {
         getTips && getTips(item);
     }
     referRecord() {
-        const { hideReferRecord, showHistoryCaseModal } = this.props
+        const { hideReferRecord, showHistoryCaseModal ,chronicMagItem} = this.props
         hideReferRecord && hideReferRecord()
         showHistoryCaseModal && showHistoryCaseModal()
-        store.dispatch(initItemList());
+        store.dispatch(initItemList(chronicMagItem));
 
     }
     noReferRecord() {
@@ -109,7 +110,6 @@ class DiagnosticList extends Component {
   
         // store.dispatch({type: CONFIRM_TYPE, confirmType: baseObj.sign});
         pushAllDataList(baseObj.sign,'push',baseObj,'history')       //引用
-        // store.dispatch(billing())
         this.props.getBilling();
         this.setState({
             activeHistory: -1
@@ -179,13 +179,12 @@ class DiagnosticList extends Component {
                     <ConfirmModal visible={showReferRecord} okText='是' cancelText='否' confirm={this.referRecord}  cancel={this.noReferRecord} close={this.noReferRecord}>
                         <div className={style['confirm-info']}>是否引用往期病历</div> 
                     </ConfirmModal>
-                    <ConfirmModal visible={showHistoryCase} noFooter='true' title='请选择历史病历' close={this.closeHistoryCaseModal}>
+                    <ConfirmModal visible={showHistoryCase} noFooter='true' title='请选择历史病历' close={this.closeHistoryCaseModal} titleBg="#DFEAFE" icon={tableIcon} height={300}>
                         {this.getHistoryCase()}
                         <div className={style['confirm-history']}><span className={style['confirm-history-btn']} onClick={this.referCase}>确定</span></div>
                     </ConfirmModal>
                 </div>
                
-            
         )
     }
 }

+ 21 - 4
src/components/DiagnosticList/index.less

@@ -111,15 +111,32 @@
     padding: 10px 30px;
 }
 .confirm-history {
-    height: 50px;
+    // height: 50px;
     position: relative;
 }
 .confirm-history-btn {
-    border: 1px solid #000;
-    padding: 5px 10px;
     position: absolute;
     right: 15px;
+    // bottom: 10px;
+    display: inline-block;
+    width: 66px;
+    height: 32px;
+    line-height: 32px;
+    text-align: center;
+    color: #3B9ED0;
+    border: 1px solid #3B9ED0;
+    border-radius: 4px;
+    cursor: pointer;
 }
 .history-info {
-
+    height: 185px;
+    overflow-y: auto;
+    padding: 15px;
+    >div{
+        line-height: 26px;
+        img{
+            vertical-align: middle;
+            margin-right: 5px;
+        }
+    }
 }

+ 2 - 2
src/components/PushItems/index.jsx

@@ -160,7 +160,7 @@ class PushItems extends Component {
       tips,
       tmpFlg,
     } = this.props.pushMessage;
-    const { tipsDiscalimer} = this.props;
+    const { tipsDiscalimer,chronicPushItems} = this.props;
     const { moreAssay, moreCheck ,show} = this.state;
     const {
       showMore,
@@ -422,7 +422,7 @@ class PushItems extends Component {
                 )}
               </div>
             </div>
-            {show?<ChronicInfo></ChronicInfo>:''}
+            {chronicPushItems&&chronicPushItems.length>0?<ChronicInfo data={chronicPushItems}></ChronicInfo>:''}
             <div className={style["tips"]}>
               <h1>
                 <img src={tipsImg} />

+ 1 - 1
src/components/PushItems/index.less

@@ -539,4 +539,4 @@
     float: right;
     margin-right: 20px;
   }
-}
+}

+ 38 - 7
src/components/ScaleTable/index.jsx

@@ -6,47 +6,78 @@ import mocks from '../../mock/chronicTable.js'
 class ScaleTable extends React.Component{
   constructor(props){
     super(props);
+    this.handleChange = this.handleChange.bind(this);
+  }
+
+  handleChange(event){
+    console.log(event.target.value);
   }
 
   render(){
+    const {data} = this.props;
+    const content = data && data[1].content;
+    const datas = content && JSON.parse(content);
+    console.log(5555,datas);
+
     return <div className={style['tableBox']}>
             <h1>密西根糖尿病神经筛查表(MDNS)</h1>
             <p>MDNS可与MNSI联合应用以确定是否存在周围神经病变,在一段时间内对患者进行评分可以评估疾病的进展情况。</p>
             <table className={style['table']}>
               <thead>
                 <tr>
-                  {mocks.data.title.map((v,i)=>{
+                  {datas&&datas.title.map((v,i)=>{
                     return <td>{v.name}</td>
                   })}  
                 </tr>
               </thead>
               <tbody>
-                {mocks.data.details.map((v,i)=>{
+                {datas&&datas.rows.map((v,i)=>{
                     return <tr>
                     <td>{v.name}</td>
                     <td>
                       {v.details.map((it,index)=>{
-                        return <td style={{display:'block'}}>{it.detailName}</td>
+                        /*return <td style={{display:'block'}}>{it.detailName}</td>*/
+                        return <td className={style['block']}>
+                          <label>
+                            <input type="radio" name={v.name} value={it.score} onChange={this.handleChange}/>{it.detailName}
+                            {/*<span style={{display:+it.state==1?'inline':'none',color:'#3B9ED0'}}>(智能推荐)</span>*/}
+                            <span style={{display:it.detailName=='正常'?'inline':'none',color:'#3B9ED0'}}>(智能推荐)</span>
+                          </label>
+                        </td>
+                      })}
+                    </td>
+                    <td>
+                      {v.details.map((it,index)=>{
+                        return <td className={style['block']}>{it.score}</td>
                       })}
                     </td>
-                    <td></td>
                     <td></td>
                     </tr>
                   })} 
               </tbody>
+              <tfoot>
+                <tr>
+                  <td colspan="4" className={style['sum']}>总计:</td>
+                </tr>
+              </tfoot>
             </table>
             <div>
               <p>
                 1. 计算方法:<br/>
-              感觉损伤得分=左右两侧感觉检查项目的分数之和
-              肌力得分=左右两侧肌力检查项目的分数之和
-              反射得分=左右两侧反射检查项目的分数之和
+              感觉损伤得分=左右两侧感觉检查项目的分数之和<br/>
+              肌力得分=左右两侧肌力检查项目的分数之和<br/>
+              反射得分=左右两侧反射检查项目的分数之和<br/>
               体格检查得分=感觉损伤得分+肌力得分+反射得分
               </p>
               <p>
                 2. 临床体格检查部分:<br/>
               最低得分0  最高得分46, 分数越高,周围神经病越重
               </p>
+              {datas&&datas.calculate.range.map((v,i)=>{
+                return <p>
+                  <span>{v.min}~{v.max}</span>&nbsp;<span>{v.text}</span>
+                </p>
+              })}
             </div>
           </div>
   }

+ 14 - 19
src/components/ScaleTable/index.less

@@ -1,6 +1,5 @@
 .tableBox{
-  // max-height: 700px;
-  height: 690px;
+  // height: 690px;
   overflow-y: auto;
   padding: 15px;
   h1{
@@ -13,6 +12,13 @@
 .table{
   width: 100%;
   margin: 10px 0 10px;
+  border-top: 10px solid #D8D8D8;
+  border-bottom: 10px solid #D8D8D8;
+  thead,tfoot{
+    tr{
+      height: 54px;
+    }
+  }
   tr{
     border-bottom: 1px solid #979797;
     td{
@@ -20,21 +26,10 @@
       padding: 7px 0;
     }
   }
-}
-/* .tableBtn{
-  // position: absolute;
-  text-align: right;
-  color:#000;
-  padding: 15px 10px 0 0;
-  .confirmBtn{
-    display: inline-block;
-    color:#fff;
-    width: 80px;
-    height: 32px;
-    line-height: 32px;
-    border-radius: 4px;
-    background: #3B9ED0;
-    margin-left: 25px;
-    text-align: center;
+  .sum{
+    text-align: right;
+  }
+  .block{
+    display: block;
   }
-} */
+}

+ 14 - 1
src/config/index.js

@@ -8,7 +8,7 @@ export default {
       'NOSPECIAL':'normal',        //无殊标记
       'EXIST':'exist'          //阴性标记
     },
-    moduleCP:{
+    /*moduleCP:{
       '1':'mainSuit',         //主诉
       '2':'current',          //现病史
       '3':'process',          //病程变化
@@ -16,6 +16,18 @@ export default {
       // '5':'checkbody'        //查体
       '5':'currentEmpty',        //现病史空模板
       '6':'addSymptom'        //添加病情变化--主诉
+    },*/
+    moduleCP:{//使用type
+      '1':'mainSuit',          //主诉
+      '2':'current',           //现病史
+      '3':'otherHisModel',     //其他史
+      '4':'checkbody',         //查体
+      '5':'assay',             //化验
+      '6':'assistCheck',        //辅检
+      '22':'currentEmpty',      //现病史空模板
+      '31':'addSymptom',        //主诉子模板--添加病情变化
+      '32':'process',           //现病史子模板--病程变化
+      '322':'currentEmptySon',  //现病史-空模板-子模板
     },
     textId:'text',        //自由文本标签的id,
     textLabel:'{"tagType":"8","id":"","name":""}',
@@ -42,6 +54,7 @@ export default {
       year:"年",
       age:"岁",
     },
+    chartDismen:'year',   //评估图表默认维度:近1年year,近6个月sixMonth,近1个月month,近1周week
     showCheckNum:16,        //查体默认展开非自由文本标签的个数
     radioOptionPer:'()',     //单选项输入占位符
     textReg:new RegExp("([\u4E00-\uFA29]|[\uE7C7-\uE7F3]|[a-zA-Z0-9])"), //包含中英文或数字

+ 54 - 7
src/containers/AssessResult.js

@@ -4,18 +4,33 @@ import AssessResult from '@components/AssessResult';
 import {ISREAD} from '@store/types/homePage.js';
 import {billing} from '@store/async-actions/pushMessage';
 import {getAssessData,getIndexData} from '@store/async-actions/fetchModules';
-import {SET_ASSESS_DATA,SET_INDEX_DATA} from '@types/assessResult';
+import {SET_ASSESS_DATA,SET_INDEX_DATA,SET_INDEX_SUB_TYPE} from '@types/assessResult';
+import store from '@store';
+
+/***
+ * 管理评估逻辑:
+ * 根据推送弹窗显示“智能推荐”,首次无选中项
+ * 评估内容项接口返回,其中整体评估为右侧操作加入
+ * 点确定等同于页面病例保存按钮(同时保存页面数据和评估结果)
+ * 点确定后再次打开,保留上次操作结果(页面清空,引用除外),
+ * 但推荐选项按最新推送显示
+ *
+ * ***/
 
 function mapStateToProps(state) {
   //console.log(state)
   const {assessResult} = state;
   return {
     data:assessResult.data,
-    indexData:assessResult.indexData
+    indexData:assessResult.indexData,
+    saveIndexData:assessResult.saveIndexData,
+    saveData:assessResult.saveData,
+    update:assessResult.update,
+    timeTypes:assessResult.indexTimeTypes
   }
 }
 
-function mapDispatchToProps(dispatch, store) {
+function mapDispatchToProps(dispatch) {
   return {
     getAssess(){
       dispatch(getAssessData()).then((res)=>{
@@ -29,13 +44,29 @@ function mapDispatchToProps(dispatch, store) {
         console.log(error);
       });
     },
-    getIndexData(){
-      dispatch(getIndexData()).then((res)=>{
+    getIndexData(param){
+      const state=store.getState();
+      const {range,rangeType,index} = param;
+      const indexData = state.assessResult.indexData;
+      const obj = indexData[range[0]+range[range.length-1]];
+      if(obj&&Object.keys(obj).length!=0){      //该维度已获取过数据
+        //console.log(obj,rangeType,index);
+        /*dispatch({
+          type:SET_INDEX_SUB_TYPE,
+          index,
+          rangeType
+        });*/
+        return ;
+      }
+      dispatch(getIndexData(range)).then((res)=>{
         if(res.data.code=='0'){
           dispatch({
             type:SET_INDEX_DATA,
-            data:res.data.data
-          })
+            data:parseChartData(res.data.data),
+            range,
+            index,
+            rangeType
+          });
         }
       }).catch(error=>{
         console.log(error);
@@ -44,6 +75,22 @@ function mapDispatchToProps(dispatch, store) {
   }
 }
 
+function parseChartData(indexData){
+  let arr=[],obj={},temp={};
+  let nameArr=[],nameObj={};  //暂弃
+  if(!indexData){
+    return [];
+  }
+  indexData.itemIndexData.map((it)=>{
+    temp=indexData.indexConfigData.find((i)=>{return it.itemName==i.indexUnique});
+    arr=obj[temp.orderNo]||[];
+    nameArr=nameObj[temp.orderNo]||[];
+    obj[temp.orderNo]=[...arr,it];
+    nameObj[temp.orderNo]=[...nameArr,it.itemName];
+  });
+  //nameObj,obj;
+  return obj;
+}
 const AssessResultContainer = connect(mapStateToProps, mapDispatchToProps)(AssessResult);
 
 export default AssessResultContainer;

+ 5 - 1
src/containers/ChronicInfo.js

@@ -1,7 +1,7 @@
 import {connect} from 'react-redux';
 import ChronicInfo from '../components/ChronicInfo';
 import {SHOW_TABLE_LIST,HIDE_TABLE_LIST} from '@store/types/pushMessage';
-import {getTableList} from '../store/async-actions/pushMessage';
+import {getTableList,getScaleInfo} from '../store/async-actions/pushMessage';
 
 function mapStateToProps(state){
   return{
@@ -9,6 +9,7 @@ function mapStateToProps(state){
     questionId: state.diagnosticList.clickDiag,
     tableList: state.pushMessage.tableList,
     showList: state.pushMessage.showList,
+    scaleInfo: state.pushMessage.scaleInfo,//量表明细
   }
 }
 
@@ -20,6 +21,9 @@ function mapDispatchToProps(dispatch){
     },
     hideList(){
       dispatch({type:HIDE_TABLE_LIST})
+    },
+    getScaleInfo(item){
+      dispatch(getScaleInfo(item))
     }
   }
 }

+ 1 - 0
src/containers/DiagnosticList.js

@@ -20,6 +20,7 @@ function mapStateToProps(state) {
         showReferRecord: state.diagnosticList.showReferRecord,
         showHistoryCase: state.diagnosticList.showHistoryCase,
         items:state.historyTemplates.items,
+        chronicMagItem: state.diagnosticList.chronicMagItem,
     }
 }
 

+ 1 - 0
src/containers/PushItemsContainer.js

@@ -14,6 +14,7 @@ function mapStateToProps(state) {
         questionId: state.diagnosticList.clickDiag,
         tableList: state.pushMessage.tableList,
         showList: state.pushMessage.showList,
+        chronicPushItems: state.pushMessage.chronicPushItems,
     }
 }
 

+ 1 - 1
src/store/actions/checkBody.js

@@ -496,7 +496,7 @@ export function delSingleLable(state,action){
   return res;
 }
 //查体推送高亮标签
-export function setImportCheckbodyLabel(state,action) {//console.log(action)
+export function setImportCheckbodyLabel(state,action) {
   let res = Object.assign({},state);
   res.importLabel = action.labels;
   res.update = Math.random();

+ 15 - 2
src/store/actions/currentIll.js

@@ -1,6 +1,5 @@
 import {getLabelIndex,fullfillText,getIds} from '@common/js/func.js';
 import config from '@config/index.js';
-import {getInitModules} from '@store/async-actions/homePage.js';
 import {formatContinueDots} from '@utils/tools';
 
 //插入病程变化模板
@@ -97,6 +96,7 @@ export const setData = (state,action) =>{
   res.symptomIds = JSON.parse(JSON.stringify(mainIds));
   const num = action.info.num;//点击了几次添加病情变化
   const symptomFeature = action.info.symptomFeature;//分词
+  const isChronic = action.info.isChronic;//慢病标识
   let useEmpty,mainData;
   let mainModleData = JSON.parse(JSON.stringify(action.info.mainData));//主诉模板数据
   let moduleData = JSON.parse(JSON.stringify(res.moduleData));//现病史模板
@@ -117,11 +117,24 @@ export const setData = (state,action) =>{
   /*let mainLabelModuleArr = objToArr.filter((item)=>{
     return item.questionMapping.length>0;
   })*/
+  
+
+  // 是慢病,暂且使用现病史慢病模板,不区分空模板
+  if(isChronic){
+    res.data = fullfillText(moduleData).newArr;
+    res.saveText = fullfillText(res.data).saveText;
+    res.update=Math.random();
+    return res;
+  }
+
+  /****************************************/
   // 是否使用空模板:num=0时判断mainIds,num>=1,截取第一病程遍历是否有症状exist
   if(num==0){
-    useEmpty = mainIds.length>0 ? false:true;
+    // useEmpty = mainIds.length>0 ? false:true;
+    useEmpty = mainIds.length==0 && !symptomFeature || symptomFeature.length==0? true:false;
     mainData = mainModleData;
   }else{
+    // 模板也分词时得加上分词结果的判断
     let sliceIdx;
     for(let j=0; j<mainModleData.length; j++){
       if(mainModleData[j].id==config.tongYId && mainModleData[j].pos==1){

+ 20 - 12
src/store/actions/mainSuit.js

@@ -28,24 +28,29 @@ export const setMainMoudle = (state,action) => {
   const originalSonData = action.addSymptom;
   let spreadLabels=[];
   let sonSpreadLabels=[];//子模板
-  for(let i=0; i<originalData.length;i++){
-    if(originalData[i].tagType==4){
-      spreadLabels.push(...originalData[i].questionMapping);
-    }else{
-      spreadLabels.push(originalData[i]);
+  if(originalData){
+    for(let i=0; i<originalData.length;i++){
+      if(originalData[i].tagType==4){
+        spreadLabels.push(...originalData[i].questionMapping);
+      }else{
+        spreadLabels.push(originalData[i]);
+      }
     }
   }
-  for(let j=0; j<originalSonData.length;j++){
-    if(originalSonData[j].tagType==4){
-      sonSpreadLabels.push(...originalSonData[j].questionMapping);
-    }else{
-      sonSpreadLabels.push(originalSonData[j]);
+  if(originalSonData){
+    for(let j=0; j<originalSonData.length;j++){
+      if(originalSonData[j].tagType==4){
+        sonSpreadLabels.push(...originalSonData[j].questionMapping);
+      }else{
+        sonSpreadLabels.push(originalSonData[j]);
+      }
     }
-  }
+  } 
   // res.moduleData = action.data;
   // res.addSmoduleData = action.addSymptom;
   res.moduleData = spreadLabels;
-  res.saveText = res.save||[];
+  // res.saveText = res.save||[];
+  res.saveText = res.save||res.saveText;//慢病
   res.addSmoduleData = sonSpreadLabels;
   res.addModuleName = action.addModuleName;
   res.update=Math.random();
@@ -668,6 +673,9 @@ export const clearMainSuit = (state,action)=>{//回读和清除
   if(res.data.length > 0){//回读
     res.editClear = false;
   }
+  if(action.symptomFeature !== undefined){//清除分词数据
+    res.symptomFeature.featureData = action.symptomFeature;
+  }
   return res;
 }
 

+ 5 - 2
src/store/async-actions/diagnosticList.js

@@ -1,6 +1,6 @@
 import { SET_DIAG_TO_MAINSUIT, SET_CHRONIC_MAG_ITEM, SHOW_REFER_RECORD } from '@store/types/diagnosticList';
 import {getAllDataList,getAllDataStringList,isAllClear,filterDataArr} from '@utils/tools';
-import {getChronic} from '@store/async-actions/homePage.js';
+import {getChronic,getInitModules} from '@store/async-actions/homePage.js';
 import {storageLocal} from '@utils/tools'
 import { SAVE_FREE } from '@store/types/mainSuit';
 import {ISREAD} from "../types/homePage";
@@ -51,6 +51,8 @@ export const isChronicMag = (item) => {
                                 type: SET_CHRONIC_MAG_ITEM,
                                 chronicMagItem: item
                             })
+                            // 获取慢病模板
+                            dispatch(getInitModules);
                             dispatch({
                                 type: SHOW_REFER_RECORD
                             })
@@ -58,7 +60,6 @@ export const isChronicMag = (item) => {
                     }
                  });
              } else {
-                console.log(999,chronicList)
                 for(let i=0; i<chronicList.length; i++){
                     if(chronicList[i].id==item.id&&chronicList[i].name==item.name){
                         //弹窗提示 “是否引用往期病例”?--往期病例接口、弹窗、引用
@@ -67,6 +68,8 @@ export const isChronicMag = (item) => {
                             type: SET_CHRONIC_MAG_ITEM,
                             chronicMagItem: item
                         })
+                        // 获取慢病模板
+                        dispatch(getInitModules);
                         dispatch({
                             type: SHOW_REFER_RECORD
                         })

+ 3 - 3
src/store/async-actions/fetchModules.js

@@ -199,13 +199,13 @@ export function getAssessData(){
   }
 }
 
-export function getIndexData(){
+export function getIndexData(range){
   return (dispatch,getStore)=>{
     const {patInfo} = getStore();
     const param = {
       diseaseId:21773,
-      startTime:'2017-08-01',
-      endTime:'2019-04-10',
+      startTime:range[0],
+      endTime:range[1],
       patientId:1001,//patInfo.message.patientId,
     };
     return json(api.getIndexData,param);

+ 3 - 6
src/store/async-actions/historyTemplates.js

@@ -3,16 +3,13 @@ import axios from '@utils/ajax';
 import { initHistory } from '@store/actions/historyTemplates';
 import store from '@store';
 
-export const initItemList = () => {
+export const initItemList = (item) => {
     let baseList = store.getState();
     // let whichSign = baseList.typeConfig.typeConfig;
     let state = baseList.patInfo.message;
+    const param = item?{"hospitalId": state.hospitalId,"patientId": state.patientId,"disName":item.name,"disType":1}:{"hospitalId": state.hospitalId,"patientId": state.patientId};
     return (dispatch) => {
-        axios.json('/inquiryInfo/hisInquirys',{
-            "hospitalId": state.hospitalId, 
-            "patientId": state.patientId, 
-            // "sign":whichSign
-        }).then((res)=>{
+        axios.json('/inquiryInfo/hisInquirys',param).then((res)=>{
             const data =res.data;
             if(data.code == 0){
                 dispatch(initHistory(data.data));

+ 11 - 10
src/store/async-actions/homePage.js

@@ -20,10 +20,10 @@ const api = {
 function modulesParseJson(data){
   let json = {},obj={},saveTextJson={},moduleName={};
   data.map((it)=>{
-    moduleName[config.moduleCP[it.id]] = it.name;//添加病情变化/病程变化子模板需要使用模板名称
+    moduleName[config.moduleCP[it.type]] = it.name;//添加病情变化/病程变化子模板需要使用模板名称
     obj = fullfillText(it.moduleDetailDTOList);
-    json[config.moduleCP[it.id]] = formatContinueDots(obj.newArr);
-    saveTextJson[config.moduleCP[it.id]] = obj.saveText;
+    json[config.moduleCP[it.type]] = formatContinueDots(obj.newArr);
+    saveTextJson[config.moduleCP[it.type]] = obj.saveText;
   });
   return {json,saveTextJson,moduleName};
 }
@@ -31,7 +31,8 @@ function modulesParseJson(data){
 export const getInitModules= (dispatch,getStore)=>{
   const state = getStore();
   const {message} = state.patInfo;
-  const chronicId = '';//诊断为慢病复诊时储存慢病信息到store
+  const chronicMagItem = state.diagnosticList.chronicMagItem;
+  const chronicId = chronicMagItem?chronicMagItem.id:'';//诊断为慢病复诊时储存慢病信息到store
   const param = {
     age:message.patientAge,
     sexType:message.sex,
@@ -47,10 +48,9 @@ export const getInitModules= (dispatch,getStore)=>{
         const initSaveText = newObj.saveTextJson;
         const initModuleName = newObj.moduleName;
         // 将所有模板缓存,方便根据id取子模板
-        // localStorage.setItem('modules',JSON.stringify(res.data.data));
         dispatch({
           type: SETALLMODULES,
-          data: res.data.data
+          data: res.data.data,
         });
         dispatch({
           type: SETINITDATA,
@@ -63,14 +63,16 @@ export const getInitModules= (dispatch,getStore)=>{
           data:initData.mainSuit,
           addSymptom:initData.addSymptom,
           addModuleName:initModuleName.addSymptom,//模板名称
-		      save:initSaveText.mainSuit
+		      // save:initSaveText.mainSuit
         });
         dispatch({
           type:SET_CURRENT,
           data:formatContinueDots(initData.current),
           save:initSaveText.current,
-          processModule:formatContinueDots(initData.process),//病程变化
-          processModuleName:initModuleName.process,//病程变化模板名称
+          // processModule:formatContinueDots(initData.process),//病程变化
+          // processModuleName:initModuleName.process,//病程变化模板名称
+          processModule:[],//病程变化
+          processModuleName:'',//病程变化模板名称
           saveProcess:initSaveText.process,
           emptyData:formatContinueDots(initData.currentEmpty),//现病史空模板
           saveEmpty:initSaveText.currentEmpty,
@@ -85,7 +87,6 @@ export const saveClickNum = (dispatch,getState)=>{
   const state = getState();
   const patientInfo = state.patInfo.message;
   const data = state.homePage.clickData;//所有点击事件储存
-  //console.log(999,state,data);
   const params = {
     "doctorId": patientInfo.doctorId,         //医生id
     "hospitalDeptId":patientInfo.hospitalDeptId ,   //部门ID

+ 20 - 1
src/store/async-actions/print.js

@@ -16,14 +16,17 @@ export const saveMessage = (bool) => {
     let whichSign = baseList.typeConfig.typeConfig;
     let jsonStr = getAllDataStringList(baseList);
     let jsonData = getAllDataList(baseList);
+    const lisData = baseList.inspect.pushItem;
+    const lisArr = transferIndexData(lisData);
+    //transferIndexData(lisData);
     // console.log(jsonStr.diag,'保存历史病历')
-    
     json('/inquiryInfo/saveInquiry', {
         "doctorId": state.doctorId,
         "hospitalDeptId": state.hospitalDeptId,
         "hospitalId": state.hospitalId,
         "patientId": state.patientId,         //患者id              
         "dataJson": JSON.stringify(getAllDataList(baseList)),
+        "indexData":lisArr,
         "detailList": [{
             "content": jsonStr.chief,
             "contentValue":filterDataArr(JSON.parse(jsonStr.chief)),
@@ -103,6 +106,22 @@ export const saveMessage = (bool) => {
     }
 };
 
+//转换化验指标保存需要的数据
+function transferIndexData(data) {
+    const arr=[];
+   data.map((it)=>{
+       if(it.uniqueName&&it.value!=''){
+           arr.push({
+             creatTime:it.time,
+             indexUnique:it.uniqueName,
+             indexUnit:it.units,
+             indexValue:it.value,
+             isAbnormal:(it.maxValue||it.minValue)?(it.value<it.minValue||it.value>it.maxValue?1:0):0
+           });
+       }
+   });
+   return arr;
+}
 
 export const clearMessages = () => {
     let baseList = store.getState();

+ 38 - 3
src/store/async-actions/pushMessage.js

@@ -1,5 +1,5 @@
 import { get, post, json } from "@utils/ajax";
-import { BILLING_ADVICE, SET_TIPS, SET_TIPS_DETAILS ,SET_CHRONIC_TABLELIST} from '../types/pushMessage';
+import { BILLING_ADVICE, SET_TIPS, SET_TIPS_DETAILS ,SET_CHRONIC_TABLELIST,SET_SCALE_INFO,SET_CHRONIC_PUSHS} from '../types/pushMessage';
 import { SET_CLICK_DIAG } from '../types/diagnosticList';
 import {storageLocal,getEMRParams} from '@utils/tools';
 import {SET_IMPORT_CHECKBODY_LABEL} from "../types/checkBody";
@@ -21,7 +21,7 @@ export const billing = (mdata) => {
   const emrData = getEMRParams();
   const params = {
     age: emrData.age,
-    featureType: "4,5,6,7",
+    featureType: "4,5,6,7,22",
     diag: emrData.dis,
     lis: emrData.lis,
     other: emrData.other,
@@ -32,7 +32,7 @@ export const billing = (mdata) => {
   };
   storageLocal.set('emrParam',params);      //推送数据存储,用作推送前对比是否有变,有变才推送
     json(url, params).then((data) => {
-        let {dis, lab, pacs,markedVitalIds} = data.data.data||{};console.log(markedVitalIds)
+        let {dis, lab, pacs,markedVitalIds,medicalIndications} = data.data.data||{};
         lab = lab||[];
         pacs = pacs||[];
         // console.log('推送数据', data.data.data);
@@ -63,6 +63,11 @@ export const billing = (mdata) => {
             lab: lab||[],
             pacs: pacs||[],
         });
+        //慢病推送模块数据
+        dispatch({
+          type:SET_CHRONIC_PUSHS,
+          data:medicalIndications
+        });
         //查体高亮标签
         dispatch({
           type:SET_IMPORT_CHECKBODY_LABEL,
@@ -126,6 +131,7 @@ export const getTipsDetails = () => {
     }
 }
 
+// 量表列表
 export const getTableList = (id)=>{
     return (dispatch,getState)=>{
         json(api.getTableList, {disId:id})
@@ -140,4 +146,33 @@ export const getTableList = (id)=>{
             console.log(e)
         })
     }
+}
+
+// 量表明细
+export const getScaleInfo = (it)=>{
+    return (dispatch,getState)=>{
+        const emrData = getEMRParams();
+          const params = {
+            age: emrData.age,
+            featureType: "21",
+            diag: emrData.dis,
+            // lis: emrData.lis,
+            lis: [],
+            sex: emrData.sex,
+            scaleId:it.id,
+            scaleName:it.name
+          };
+        json(api.push, params)
+        .then((res)=>{
+            const result = res.data;
+            if(result.code==0){
+                dispatch({
+                    type: SET_SCALE_INFO,
+                    data: result.data.scale
+                })
+            }
+        }).catch((e) => {
+            console.log(e)
+        })
+    }
 }

+ 30 - 3
src/store/reducers/assessResult.js

@@ -1,14 +1,41 @@
-import {SET_ASSESS_DATA,SET_INDEX_DATA} from '@types/assessResult';
+import {SET_ASSESS_DATA,SET_INDEX_DATA,SET_SAVE_ASSESS_DATA,SET_INDEX_SUB_TYPE} from '@types/assessResult';
+import config from "@config";
 
-const init = {};
+const init = {
+  data:[],        //评估模块数据
+  indexData:{},     //评估图表数据
+  saveData:[],      //保存的评估数据-点确定时保存
+  saveIndexData:{},    //保存的评估图表数据-点确定时保存
+  indexTimeTypes:{},    //单个图表选中的维度
+};
 export default (state=init,action)=>{
   const res = Object.assign({},state);
+  const {data,range,index,rangeType} = action;
   switch (action.type){
     case SET_ASSESS_DATA:
       res.data = action.data;
       return res;
     case SET_INDEX_DATA:
-      res.indexData = action.data;
+      res.indexData[range[0]+range[1]] = data;
+      Object.keys(data).map((i)=>{
+        if(i===index){
+          res.indexTimeTypes[i]=rangeType;
+        }else{
+          res.indexTimeTypes[i]=config.chartDismen;
+        }
+      });
+      res.update = Math.random();   //对象更新
+      return res;
+    case SET_INDEX_SUB_TYPE:
+      if(!index){
+        return res;
+      }
+      res.indexTimeTypes[index] = rangeType;
+      res.update = Math.random();   //对象更新
+      return res;
+    case SET_SAVE_ASSESS_DATA:
+      res.saveData = action.data;
+      res.saveIndexData = action.indexData;
       return res;
     default:
       return res;

+ 5 - 0
src/store/reducers/inspect.js

@@ -12,6 +12,8 @@ import {
     ADD_LABEL
 } from '../types/inspect';
 import store from '@store'
+import {dateParser} from '@common/js/func';
+
 const initSearchList = {
     list: [], //搜索的结果
     labelList: [], //选中的结果,也是需要保存的数据
@@ -265,6 +267,7 @@ function getPushList(data1,data2){     //推送数据
     let tmpArr1 = [];
     let tmpArr2 = [];
     let totalTmpArr = [];
+    const now = dateParser(new Date());
     data1.length>0 && data1.map((items)=>{    //excel导入的数据拼接
         items.lisExcelRes.map((item)=>{
             item.lisExcelItem.map((part)=>{
@@ -275,6 +278,7 @@ function getPushList(data1,data2){     //推送数据
                 tmpObj.source = '1';//数据来源
                 tmpObj.maxValue = part.max || ''; 
                 tmpObj.minValue = part.min || '';
+                tmpObj.time = part.time ||now;
                 tmpObj.units = part.unit || '';//单位
                 tmpObj.value = (part.value-0) === (part.value-0) ? part.value:'';//值
                 tmpObj.otherValue = (part.value-0) === (part.value-0) ?'':part.value; //阴性阳性
@@ -292,6 +296,7 @@ function getPushList(data1,data2){     //推送数据
                 tmpObj.source = '0';     //数据来源
                 tmpObj.maxValue = val.maxValue ? val.maxValue : '';
                 tmpObj.minValue = val.minValue ? val.minValue : '';
+                tmpObj.time = val.time || now;
                 tmpObj.units = val.labelSuffix || '';
                 tmpObj.value = (val.value-0) === (val.value-0) ? val.value:'';
                 tmpObj.otherValue = (val.value-0) === (val.value-0) ?'':val.value;

+ 7 - 1
src/store/reducers/pushMessage.js

@@ -1,4 +1,4 @@
-import {CHANGE_ASSAY, CHANGE_CHECK, BILLING_ADVICE, ADD_SCHEME, SET_TIPS,  SET_TIPS_DETAILS, SET_CHANGE_ADVICE_TREATMENT, SET_CHANGE_ADVICE_ASSAY, SET_CHANGE_ADVICE_CHECK, ADD_BILLING,CLEAR_ALL_PUSH_MESSAGE,SHOW_TIPS_DETAILS, HIDE_TIPS_DETAILS, SET_COMMONTREATMENT, IS_FIRST_MAIN_DIAG, SET_ADVICE_INPUT ,SET_CHRONIC_TABLELIST,SHOW_TABLE_LIST,HIDE_TABLE_LIST} from '../types/pushMessage';
+import {CHANGE_ASSAY, CHANGE_CHECK, BILLING_ADVICE, ADD_SCHEME, SET_TIPS,  SET_TIPS_DETAILS, SET_CHANGE_ADVICE_TREATMENT, SET_CHANGE_ADVICE_ASSAY, SET_CHANGE_ADVICE_CHECK, ADD_BILLING,CLEAR_ALL_PUSH_MESSAGE,SHOW_TIPS_DETAILS, HIDE_TIPS_DETAILS, SET_COMMONTREATMENT, IS_FIRST_MAIN_DIAG, SET_ADVICE_INPUT ,SET_CHRONIC_TABLELIST,SHOW_TABLE_LIST,HIDE_TABLE_LIST,SET_SCALE_INFO,SET_CHRONIC_PUSHS} from '../types/pushMessage';
 import {changeAssay, changeCheck, setAdvice, addScheme, setTips, setTipsDetails, setChangeAdviceTreatment, setChangeAdviceAssay, setChangeAdviceCheck, addBilling, clearAllPushMessage, showTipsDetails, hideTipsDetails, setCommontreatment, isFirstMainDiag, setAdviceInput } from '../actions/pushMessage';
 
 const initState = {
@@ -64,6 +64,12 @@ export default function(state = initState, action) {
     case HIDE_TABLE_LIST://隐藏量表列表数据
       res.showList = false;
       return res;
+    case SET_CHRONIC_PUSHS:
+      res.chronicPushItems = action.data;
+      return res;
+    case SET_SCALE_INFO://量表明细
+      res.scaleInfo = action.data;
+      return res;
     default:
       return state;
   }

+ 4 - 2
src/store/types/assessResult.js

@@ -1,2 +1,4 @@
-export const SET_ASSESS_DATA = 'SET_ASSESS_DATA';
-export const SET_INDEX_DATA = 'SET_INDEX_DATA';
+export const SET_ASSESS_DATA = 'SET_ASSESS_DATA';     //推送的评估弹窗内容
+export const SET_INDEX_DATA = 'SET_INDEX_DATA';       //评估图表数据
+export const SET_SAVE_ASSESS_DATA = 'SET_SAVE_ASSESS_DATA';  //保存的评估弹窗数据
+export const SET_INDEX_SUB_TYPE = 'SET_INDEX_SUB_TYPE';   //保存单个图表时间维度

+ 2 - 0
src/store/types/pushMessage.js

@@ -18,5 +18,7 @@ export const SET_ADVICE_INPUT = 'SET_ADVICE_INPUT' ; //设置医嘱自由输入
 export const SET_CHRONIC_TABLELIST = 'SET_CHRONIC_TABLELIST' ; //设置量表列表
 export const SHOW_TABLE_LIST = 'SHOW_TABLE_LIST' ; //显示量表列表
 export const HIDE_TABLE_LIST = 'HIDE_TABLE_LIST' ; //隐藏量表列表
+export const SET_CHRONIC_PUSHS ='SET_CHRONIC_PUSHS'; //右侧慢病量表评估推送模块数据
+export const SET_SCALE_INFO = 'SET_SCALE_INFO' ; //量表明细
 
 

+ 2 - 2
src/utils/tools.js

@@ -241,7 +241,7 @@ const getAllDataStringList =(baseList) =>{           //获取所有模块文本
 const pushAllDataList =(whichSign,action,reData,type) =>{           //回读清空所有的数据
     if(action == 'clear'){     //清空
       const block = Object.assign(JSON.parse(config.textLabel),{full:true});//空白时保留一个自由文本标签
-      store.dispatch({type: CLEAR_MAIN_SUIT,data:[],saveText:[],selecteds:[],editClear:true,mainIds:[],clearAction:true});
+      store.dispatch({type: CLEAR_MAIN_SUIT,data:[],saveText:[],selecteds:[],editClear:true,mainIds:[],clearAction:true,symptomFeature:[]});
         store.dispatch({type: CLEAR_CURRENT_ILL,data:[],saveText:[],selecteds:[],editClear:true,symptomIds:[]});
         store.dispatch({type: CLEAROTHERHISTORY,data:[block],isEmpty:true,saveText:[],selecteds:[],editClear:true,yjs_1:'',yjs_2:'',yjs_3:'',yjs_4:''});
         store.dispatch({type: CLEARCHECKBODY,data:[block],isEmpty:true,saveText:[],selecteds:[]});
@@ -655,7 +655,7 @@ function didPushParamChange(){
   const oldParams = storageLocal.get('emrParam');
   const newParams = JSON.stringify({
     age: emrData.age,
-    featureType: "4,5,6,7",
+    featureType: "4,5,6,7,22",
     diag: emrData.dis,
     lis: emrData.lis,
     other: emrData.other,