index.jsx 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
  1. import React from 'react';
  2. import style from './index.less';
  3. import infoPic from "../../common/images/info-pic.png";
  4. import chronicPic from "../../common/images/chronic.png";
  5. import level1 from "../../common/images/级别1.png";
  6. import printIcon from '@common/images/team.png';
  7. import manageIcon from '@common/images/manage.png';
  8. import tableIcon from '@common/images/table.png';
  9. import allTableIcon from '@common/images/all-table.png';
  10. import add from '@common/images/add-result.png';
  11. import added from '@common/images/first.png';
  12. import checkIcon from '@common/images/check.png';
  13. import {ComplexModal,ConfirmModal,MiniToast, Radio,CheckBtn} from '@commonComp';
  14. import AssessResult from '@containers/AssessResult';
  15. import ScaleTable from '@containers/ScaleTable';
  16. import Notify from '@commonComp/Notify';
  17. import $ from 'jquery';
  18. /***
  19. 慢病右侧推送模块规则:
  20. 慢病--显示慢病名称以及管理和评估
  21. 普通病--不显示管理和评估和量表按钮
  22. 明细--量表-计算公式-核心指标
  23. controlType:0-radio 1-checkbox 2-text 3-dropdownlist
  24. **/
  25. class ChronicInfo extends React.Component{
  26. constructor(props){
  27. super(props);
  28. this.state = {
  29. show:true,
  30. showInfo:false,
  31. showOption:false,
  32. showAssess:false, //评估弹窗
  33. infoId:null, //静态知识
  34. formulaId:null, //计算公式
  35. optionId:null, //可能结果,
  36. isAssessConfirm:false, //是否点击评估弹窗确定按钮
  37. tableName:'' , //点击的量表名称
  38. tableId:null ,//点击的量表id
  39. parentId:null ,
  40. parentIndex:null,
  41. radioVal:{}, //可能结果选择内容
  42. possible:{}, //可能结果
  43. formulaParam: {}, //量表计算公式计算入参
  44. showRecommend:false, //显示推荐结果弹窗
  45. isRecommendConfirm:false, //推荐结果确定
  46. isFormulaConfirm:false, //计算公式确定
  47. };
  48. this.showInfo = this.showInfo.bind(this);
  49. this.closeInfo = this.closeInfo.bind(this);
  50. this.showOption = this.showOption.bind(this);
  51. this.closeOption = this.closeOption.bind(this);
  52. this.showTable = this.showTable.bind(this);//显示量表弹窗
  53. this.closeTable = this.closeTable.bind(this);//关闭量表弹窗
  54. this.showAssessFn = this.showAssessFn.bind(this); //开关评估弹窗
  55. this.close = this.close.bind(this); //关闭量表列表
  56. this.showFormula = this.showFormula.bind(this); //打开计算公式
  57. this.closeFormula = this.closeFormula.bind(this); //关闭计算公式
  58. this.handleAddAssessItem = this.handleAddAssessItem.bind(this); //加入病例记录
  59. this.handleSaveAssess = this.handleSaveAssess.bind(this); //评估弹窗确定
  60. this.onPrint = this.onPrint.bind(this);
  61. this.handleForRadio = this.handleForRadio.bind(this);
  62. this.showRecommendFn = this.showRecommendFn.bind(this);
  63. this.handleSaveCalcu = this.handleSaveCalcu.bind(this); //保存评估修改的计算和可能结果
  64. }
  65. onPrint() {
  66. const {showHide} = this.props;
  67. let dom = showHide&&showHide.showTable?$("#printcontent"):$("#AssistResult");
  68. dom.jqprint({
  69. debug: false,
  70. importCSS: true,
  71. printContainer: true,
  72. operaSupport: false,
  73. });
  74. // setTimeout(() => {//把生成的图片和iframe删掉
  75. // let imgLis = document.querySelectorAll('.canvasImg')
  76. // let iframe = document.getElementsByTagName('iframe')
  77. // for(let i = 0;i < imgLis.length;i++){
  78. // imgLis[i].remove()
  79. // }
  80. // for(let i = 0;i < iframe.length;i++){
  81. // iframe[i].remove()
  82. // }
  83. // }, 500);
  84. }
  85. showTableList(id){//量表按钮
  86. const {getTableList} = this.props;
  87. if(id){
  88. getTableList(id);
  89. }
  90. }
  91. close(){//关闭量表列表
  92. const {hideList} = this.props;
  93. hideList&&hideList({name:'showList',value:false});
  94. }
  95. handleListClick(item){//量表列表单项点击
  96. this.showTable(item,null);
  97. this.close()
  98. }
  99. showInfo(id){
  100. // 静态知识显示在提示信息里(4-18)
  101. const {getInfomation} = this.props;
  102. const param = {
  103. id:id,
  104. // id:40738, //目前只有“肾功能不全”有数据
  105. type:22,
  106. }
  107. getInfomation&&getInfomation(param);
  108. /*this.setState({
  109. infoId:id
  110. })*/
  111. }
  112. closeInfo(){//关闭静态知识
  113. this.setState({
  114. infoId:null
  115. })
  116. }
  117. showOption(id){
  118. this.setState({
  119. optionId:id,
  120. formulaId:null //关闭计算公式
  121. })
  122. }
  123. closeOption(){
  124. this.setState({
  125. optionId:null
  126. })
  127. }
  128. showTable(it,parentId,parentIndex){
  129. const {formulaResult,scaleInfo} = this.props;
  130. // 密西根糖尿病周围神经病评分(MDNS), id:40744
  131. const item = {
  132. id:it.id,
  133. name:it.name
  134. };
  135. // 判断:store里已经有该量表就无需重新调接口
  136. if(scaleInfo&&scaleInfo[it.id]){
  137. this.props.hideList({name:'showTable',value:true});
  138. }else{
  139. this.props.getScaleInfo(item);
  140. }
  141. this.setState({
  142. tableName:it.name,
  143. tableId:it.id,
  144. parentId:parentId,
  145. parentIndex:parentIndex,
  146. formulaId:null, //关闭计算公式和可能结果弹窗
  147. optionId:null
  148. })
  149. }
  150. closeTable(){
  151. this.setState({
  152. tableName:'',
  153. tableId:null,
  154. parentId:null,
  155. })
  156. this.props.hideList({name:'showTable',value:false});
  157. }
  158. showAssessFn(){
  159. this.setState({
  160. showAssess:!this.state.showAssess,
  161. isAssessConfirm:false
  162. });
  163. }
  164. showRecommendFn(){
  165. this.setState({
  166. isRecommendConfirm:false,
  167. showRecommend:!this.state.showRecommend,
  168. });
  169. }
  170. showFormula(id){//计算公式
  171. this.setState({
  172. formulaId:id,
  173. optionId:null //关闭可能结果
  174. })
  175. }
  176. closeFormula(){
  177. this.setState({
  178. formulaId:null
  179. })
  180. }
  181. handleAddAssessItem(v,pIndex,i){
  182. const {addAssessItem} = this.props;
  183. addAssessItem(v,pIndex,i);
  184. }
  185. handleSaveRecommend(){
  186. this.setState({
  187. isRecommendConfirm:true
  188. });
  189. const that=this;
  190. setTimeout(()=>{
  191. that.showRecommendFn();
  192. });
  193. }
  194. handleSaveAssess(){
  195. this.setState({
  196. isAssessConfirm:true
  197. });
  198. const that=this;
  199. setTimeout(()=>{
  200. that.showAssessFn();
  201. });
  202. }
  203. handleInputformula(v,i, j,idd, e) {
  204. const { data, setChronicPush } = this.props
  205. const text = e.target.value
  206. if (data[i].details) {
  207. data[i].details[j].content.details[idd].value = text
  208. }
  209. const data1 = JSON.parse(JSON.stringify(data))
  210. setChronicPush(data1)
  211. }
  212. handleForRadio(ii,v,i, j,idd, ind){//计算公式
  213. const { data, setChronicPush } = this.props
  214. if (data[i].details) {
  215. for(let z = 0; z < data[i].details[j].content.details[idd].details.length; z++) {
  216. data[i].details[j].content.details[idd].details[z].state = 0
  217. }
  218. data[i].details[j].content.details[idd].details[ind].state = 1
  219. }
  220. const data1 = JSON.parse(JSON.stringify(data))
  221. setChronicPush(data1)
  222. }
  223. confirmFormula(){//计算公式确定
  224. this.setState({
  225. isFormulaConfirm:true,
  226. formulaId:null
  227. });
  228. }
  229. handleRadio(item,parent){//可能结果
  230. let {radioVal} = this.props;
  231. this.setState({
  232. radioVal:Object.assign({},radioVal,{[parent.id]:item.detailName})
  233. })
  234. }
  235. confirmOption(parent,pIndex){//可能结果确定
  236. const {radioVal,possible} = this.state;
  237. this.setState({
  238. possible:Object.assign({},possible,radioVal),
  239. radioVal:Object.assign({},possible,radioVal),//不设置radioVal只有最近一次选中的值
  240. optionId:null
  241. })
  242. }
  243. handleSaveCalcu(obj){
  244. this.setState({
  245. possible:Object.assign({},obj.possible),
  246. radioVal:Object.assign({},obj.radioVal),//不设置radioVal只有最近一次选中的值
  247. })
  248. }
  249. calcuFormula(it,j, v, i) { //计算公式计算
  250. const { calcuFormula, data ,chronicPushItems} = this.props
  251. let allHasInfo = true
  252. for (let i = 0; i < it.content.details.length; i++) {
  253. if(it.content.details[i].controlType == 2) { //输入框类型的有没有填值
  254. if(!it.content.details[i].value) {
  255. allHasInfo = false
  256. }
  257. } else if(it.content.details[i].controlType == 1) {
  258. let hasSelect = false
  259. for( let z = 0; z <it.content.details[i].details.length; z++) {
  260. if(it.content.details[i].details[z].state == 1) {
  261. hasSelect= true
  262. }
  263. }
  264. if(!hasSelect) {
  265. allHasInfo = false
  266. }
  267. }
  268. }
  269. if(allHasInfo) { //所有都有值,则计算
  270. // delete it.content.resultz
  271. let param = {
  272. type: 2,
  273. data: it,
  274. disId: v.id,
  275. pIndex: j,
  276. ppIndex: i
  277. }
  278. calcuFormula({param,chronicPushItems})
  279. } else { //不是所有值都填过了
  280. Notify.info('请填写计算公式内容')
  281. }
  282. }
  283. getDetail(){
  284. const {data,indexs,formulaResult} = this.props;
  285. const {formulaId,optionId,possible,radioVal,isFormulaConfirm} = this.state;
  286. let list = data&&data.map((v,i)=>{
  287. return <div className={style["list"]}>
  288. {v.name?<p>
  289. <span>{'患者可能有'+v.name}</span>
  290. <img src={infoPic} className={style["infoPic"]} onClick={this.showInfo.bind(this,v.id)}/>
  291. </p>:''}
  292. {/*<MiniToast title='静态知识'
  293. icon={allTableIcon}
  294. show={infoId&&infoId==v.id?true:false}
  295. close={this.closeInfo}>
  296. {pureText}
  297. </MiniToast>*/}
  298. {v.details&&v.details.map((it,j)=>{
  299. if(it.type==1){
  300. return <p>
  301. <span className={style["listName"]}>
  302. <i onClick={this.showTable.bind(this,it.content,v.id,i)}>{'【'+it.content.name+'】'}</i>
  303. {formulaResult&&formulaResult[it.content.id]?<i>{'结果:'}{formulaResult[it.content.id].calcalculate&&formulaResult[it.content.id].calcalculate.result.value +' '+ formulaResult[it.content.id].calcalculate.result.text}</i>:''}
  304. </span>
  305. {indexs[i]&&indexs[i].includes(j)?<span className={style["addResult"]}>
  306. <img src={added} />
  307. 已加入
  308. </span>:<span className={style["listResult"]} onClick={()=>this.handleAddAssessItem(v,i,j)}>
  309. <img src={add} />
  310. 加入病历记录
  311. </span>
  312. }
  313. </p>
  314. }else if(it.type==2){
  315. const result = it.content.result&&it.content.result[1]&&it.content.result[1].text;
  316. return <div className={style["marTop"]}>
  317. <span className={style["limit"]}>
  318. 计算公式结果:
  319. <i className={style["blue"]} onClick={this.showFormula.bind(this,v.id)}>{result?result:'请选择'}</i>
  320. <img src={level1} />
  321. </span>
  322. {indexs[i]&&indexs[i].includes(j)?<span className={style["addResult"]}>
  323. <img src={added} />
  324. 已加入
  325. </span>:<span className={style["listResult"]} onClick={()=>this.handleAddAssessItem(v,i,j)}>
  326. <img src={add} />
  327. 加入病历记录
  328. </span>
  329. }
  330. <MiniToast title={it.content.name}
  331. icon={allTableIcon}
  332. show={formulaId&&formulaId==v.id?true:false}
  333. close={this.closeFormula}
  334. confirm={this.confirmFormula.bind(this,v,i)}
  335. footer="true">
  336. <table>
  337. {it.content.details.map((item,idd)=>{
  338. if(item.controlType==1){//单选
  339. return <tr>
  340. <td>
  341. <span>{'请选择'+item.name+':'}</span>
  342. </td>
  343. <td>
  344. {item.details.map((ii,ind)=>{
  345. return <div className={style["chooseItem"]}>
  346. <Radio label={ii.detailName}
  347. isSelect={ii.state == 1}
  348. handleClick={this.handleForRadio.bind(this,ii,v,i, j,idd, ind)}>
  349. </Radio>
  350. </div>
  351. })}
  352. </td>
  353. </tr>
  354. }else if(item.controlType==1){//多选
  355. }else if(item.controlType==2){//输入框
  356. return <tr>
  357. <td>
  358. <span>{'请输入'+item.name+':'}</span>
  359. </td>
  360. <td>
  361. <input type="text" placeholder="请输入" value={item.value} onInput={this.handleInputformula.bind(this,v,i, j,idd)}/>
  362. </td>
  363. <td>
  364. <span>{item.uint}</span>
  365. </td>
  366. </tr>
  367. }else if(item.controlType==3){//下拉
  368. return <tr>
  369. <td>
  370. <span>{'请选择'+item.name+':'}</span>
  371. </td>
  372. <td>
  373. {item.details.map((ii,ind)=>{
  374. return <div className={style["chooseItem"]}>
  375. <Radio label={ii.detailName}
  376. // isSelect={radioVal[i]==ii.detailName}
  377. isSelect={ii.state == 1}
  378. handleClick={this.handleForRadio.bind(this,ii,v,i)}>
  379. </Radio>
  380. </div>
  381. })}
  382. </td>
  383. </tr>
  384. }
  385. })}
  386. </table>
  387. <div className={style["forMulBtn"]} onClick={this.calcuFormula.bind(this,it,j, v, i)}>计算</div>
  388. <table>
  389. {it.content.result && Array.isArray(it.content.result) &&it.content.result.map((itemResult, resultIndex) => {
  390. return <tr>
  391. <td>
  392. <span>{itemResult.name+':'}</span>
  393. </td>
  394. <td>
  395. <span>{itemResult.text}</span>
  396. </td>
  397. </tr>
  398. })}
  399. </table>
  400. </MiniToast>
  401. </div>
  402. }else if(it.type==3){
  403. return <div className={style["marTop"]}>
  404. <span className={style["limit"]}>
  405. 可能结果:
  406. <i onClick={this.showOption.bind(this,v.id)} className={style["blue"]}>{possible[v.id]?possible[v.id]:'请选择'}</i>
  407. <img src={level1} />
  408. </span>
  409. {indexs[i]&&indexs[i].includes(j)?<span className={style["addResult"]}>
  410. <img src={added} />
  411. 已加入
  412. </span>:<span className={style["listResult"]} onClick={()=>this.handleAddAssessItem(v,i,j)}>
  413. <img src={add} />
  414. 加入病历记录
  415. </span>
  416. }
  417. <MiniToast title='结果选择'
  418. icon={checkIcon}
  419. show={optionId&&optionId==v.id?true:false}
  420. close={this.closeOption}
  421. confirm={this.confirmOption.bind(this,v,i)}
  422. footer="true">
  423. <div className={style["infoOption"]}>
  424. <span>{it.content.name?it.content.name+':':''}</span>
  425. {it.content.details&&it.content.details.map((lis,ind)=>{
  426. return <div className={style["chooseItem"]}>
  427. <Radio label={lis.detailName}
  428. isSelect={radioVal[v.id]==lis.detailName}
  429. handleClick={this.handleRadio.bind(this,lis,v)}>
  430. </Radio>
  431. {lis.state==1?<span className={style['recomand']}>(智能推荐)</span>:''}
  432. </div>
  433. })}
  434. </div>
  435. </MiniToast>
  436. </div>
  437. }
  438. })}
  439. </div>
  440. })
  441. return list;
  442. }
  443. render(){
  444. const footer = <div className={style['footer']}>
  445. <span className={style['print']} onClick={this.onPrint}><img src={printIcon} alt=""/>打印</span>
  446. <span className={style['okBtn']} onClick={()=>this.handleSaveAssess()}>确定</span>
  447. </div>;
  448. const recFooter =<div className={style['footer']}>
  449. <span className={style['okBtn']} onClick={()=>this.handleSaveRecommend()}>确定</span>
  450. </div>;
  451. const scaleFooter = <div className={style['footer']}>
  452. <span className={style['print']} onClick={this.onPrint}><img src={printIcon} alt=""/>打印</span>
  453. <span className={style['okBtn']} onClick={()=>this.closeTable()}>确定</span>
  454. </div>;
  455. const {chronicMagItem,tableList,saveAssessInfos,chronicDesease,formulaResult,showHide,calcuFormula} = this.props;
  456. const {showAssess,isAssessConfirm,tableName,tableId,parentId,parentIndex,isRecommendConfirm,showRecommend,radioVal,possible} = this.state;
  457. return <div className={style["tips"]} style={{marginBottom:'15px'}}>
  458. <div className={`${style["tips-title"]} ${style["chronic"]}`}>
  459. <div className={style["tips-name"]}>
  460. <img src={chronicPic} />
  461. <h2>{chronicMagItem&&chronicMagItem.name||chronicDesease&&chronicDesease.name||'病情提示'}</h2>
  462. <span className={style["redTips"]}>(页面信息有更新可能影响评估结果)</span>
  463. </div>
  464. <div className={style["tips-btn"]} style={{display:chronicMagItem&&chronicMagItem.name||chronicDesease&&chronicDesease.name?'block':'none'}}>
  465. <span
  466. className={style["tipsDetails"]}
  467. style={{width:'70px'}}
  468. onClick={this.showAssessFn}
  469. >
  470. 管理和评估
  471. </span>
  472. <span className={style["tipsDetails"]} onClick={() => this.showTableList(chronicDesease&&chronicDesease.id||chronicMagItem&&chronicMagItem.id)}>量表
  473. </span>
  474. </div>
  475. <div className={style["tips-btn"]} style={{display:chronicMagItem&&chronicMagItem.name||chronicDesease&&chronicDesease.name?'none':'block'}}>
  476. <span
  477. className={style["tipsDetails"]}
  478. style={{width:'70px'}}
  479. onClick={this.showRecommendFn}
  480. >
  481. 推荐结果
  482. </span>
  483. </div>
  484. </div>
  485. <div className={style["content"]}>
  486. {this.getDetail()}
  487. </div>
  488. <ConfirmModal visible={showHide&&showHide.showList} noFooter='true' title='全部量表' close={this.close} titleBg="#DFEAFE" icon={allTableIcon} height={400} width={400}>
  489. <ul className={style['toast-cont']}>
  490. {tableList&&tableList.map((v,i)=>{
  491. return <li>
  492. <span>
  493. <i onClick={this.handleListClick.bind(this,v)}>{'【'+v.name+'】'}</i>
  494. {/*{formulaResult&&formulaResult[v.id]?<i>{'结果:'+formulaResult[v.id].text}</i>:''}*/}
  495. {formulaResult&&formulaResult[v.id]?<i className={style['res']}>{'结果:'}{formulaResult[v.id].calcalculate&&formulaResult[v.id].calcalculate.result.value+' '+ (formulaResult[v.id].calcalculate.result.text?formulaResult[v.id].calcalculate.result.text:'')}</i>:''}
  496. </span>
  497. </li>
  498. })}
  499. </ul>
  500. </ConfirmModal>
  501. {showHide&&showHide.showTable?<ComplexModal onclose={this.closeTable} footer={scaleFooter}
  502. title={tableName}
  503. icon={tableIcon}
  504. top={20}
  505. bottom={20}
  506. width={820}>
  507. <ScaleTable title={tableName} tableId={tableId} parentId={parentId} parentIndex={parentIndex}></ScaleTable>
  508. </ComplexModal>:''}
  509. {showAssess?<ComplexModal onclose={this.showAssessFn} footer={footer}
  510. title='管理和评估'
  511. icon={manageIcon}
  512. top={'3%'}
  513. bottom={'3%'}
  514. width={820}>
  515. <AssessResult handleSave={saveAssessInfos}
  516. handleSaveCalcu={this.handleSaveCalcu}
  517. closeAssess={this.showAssessFn}
  518. showScaleFn={this.showTable.bind(this)}
  519. calcuFormula={calcuFormula}
  520. radioVal={radioVal}
  521. possible={possible}
  522. isAssessConfirm={isAssessConfirm}></AssessResult>
  523. </ComplexModal>:''}
  524. {showRecommend?<ComplexModal onclose={this.showRecommendFn} footer={recFooter}
  525. title='推荐结果'
  526. icon={manageIcon}
  527. top={20}
  528. bottom={20}
  529. width={820}>
  530. <AssessResult handleSave={saveAssessInfos}
  531. handleSaveCalcu={this.handleSaveCalcu}
  532. closeAssess={this.showRecommendFn}
  533. isRecommend={true}
  534. showScaleFn={this.showTable.bind(this)}
  535. calcuFormula={calcuFormula}
  536. radioVal={radioVal}
  537. possible={possible}
  538. isAssessConfirm={isRecommendConfirm}></AssessResult>
  539. </ComplexModal>:''}
  540. </div>
  541. }
  542. }
  543. export default ChronicInfo;