index.jsx 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  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. };
  45. this.showInfo = this.showInfo.bind(this);
  46. this.closeInfo = this.closeInfo.bind(this);
  47. this.showOption = this.showOption.bind(this);
  48. this.closeOption = this.closeOption.bind(this);
  49. this.showTable = this.showTable.bind(this);//显示量表弹窗
  50. this.closeTable = this.closeTable.bind(this);//关闭量表弹窗
  51. this.showAssessFn = this.showAssessFn.bind(this); //开关评估弹窗
  52. this.close = this.close.bind(this); //关闭量表列表
  53. this.showFormula = this.showFormula.bind(this); //打开计算公式
  54. this.closeFormula = this.closeFormula.bind(this); //关闭计算公式
  55. this.handleAddAssessItem = this.handleAddAssessItem.bind(this); //加入病例记录
  56. this.handleSaveAssess = this.handleSaveAssess.bind(this); //评估弹窗确定
  57. this.onPrint = this.onPrint.bind(this);
  58. this.handleForRadio = this.handleForRadio.bind(this)
  59. }
  60. onPrint() {
  61. const {showHide} = this.props;
  62. let dom = showHide&&showHide.showTable?$("#printcontent"):$("#AssistResult");
  63. dom.jqprint({
  64. debug: false,
  65. importCSS: true,
  66. printContainer: true,
  67. operaSupport: false,
  68. });
  69. }
  70. showTableList(id){//量表按钮
  71. const {getTableList} = this.props;
  72. if(id){
  73. getTableList(id);
  74. }
  75. }
  76. close(){//关闭量表列表
  77. const {hideList} = this.props;
  78. hideList&&hideList({name:'showList',value:false});
  79. }
  80. handleListClick(item){//量表列表单项点击
  81. this.showTable(item,null);
  82. this.close()
  83. }
  84. showInfo(id){
  85. // 静态知识显示在提示信息里(4-18)
  86. const {getInfomation} = this.props;
  87. const param = {
  88. id:id,
  89. // id:40738, //目前只有“肾功能不全”有数据
  90. type:22,
  91. }
  92. getInfomation&&getInfomation(param);
  93. /*this.setState({
  94. infoId:id
  95. })*/
  96. }
  97. closeInfo(){//关闭静态知识
  98. this.setState({
  99. infoId:null
  100. })
  101. }
  102. showOption(id){
  103. this.setState({
  104. optionId:id,
  105. formulaId:null //关闭计算公式
  106. })
  107. }
  108. closeOption(){
  109. this.setState({
  110. optionId:null
  111. })
  112. }
  113. showTable(it,parentId,parentIndex){
  114. const {formulaResult,scaleInfo} = this.props;
  115. // 密西根糖尿病周围神经病评分(MDNS), id:40744
  116. const item = {
  117. id:it.id,
  118. name:it.name
  119. }
  120. // 判断:store里已经有该量表就无需重新调接口
  121. if(scaleInfo&&scaleInfo[it.id]){
  122. this.props.hideList({name:'showTable',value:true});
  123. }else{
  124. this.props.getScaleInfo(item);
  125. }
  126. this.setState({
  127. tableName:it.name,
  128. tableId:it.id,
  129. parentId:parentId,
  130. parentIndex:parentIndex,
  131. formulaId:null, //关闭计算公式和可能结果弹窗
  132. optionId:null
  133. })
  134. }
  135. closeTable(){
  136. this.setState({
  137. tableName:'',
  138. tableId:null,
  139. parentId:null,
  140. })
  141. this.props.hideList({name:'showTable',value:false});
  142. }
  143. showAssessFn(){
  144. this.setState({
  145. showAssess:!this.state.showAssess,
  146. isAssessConfirm:false
  147. });
  148. }
  149. showFormula(id){//计算公式
  150. this.setState({
  151. formulaId:id,
  152. optionId:null //关闭可能结果
  153. })
  154. }
  155. closeFormula(){
  156. this.setState({
  157. formulaId:null
  158. })
  159. }
  160. handleAddAssessItem(v,pIndex,i){
  161. const {addAssessItem} = this.props;
  162. addAssessItem(v,pIndex,i);
  163. }
  164. handleSaveAssess(){
  165. this.setState({
  166. isAssessConfirm:true
  167. });
  168. const that=this;
  169. setTimeout(()=>{
  170. that.showAssessFn();
  171. });
  172. }
  173. handleInputformula(v,i, j,idd, e) {
  174. const { data, setChronicPush } = this.props
  175. const text = e.target.value
  176. if (data[i].details) {
  177. data[i].details[j].content.details[idd].value = text
  178. }
  179. const data1 = JSON.parse(JSON.stringify(data))
  180. setChronicPush(data1)
  181. }
  182. handleForRadio(ii,v,i, j,idd, ind){//计算公式
  183. const { data, setChronicPush } = this.props
  184. if (data[i].details) {
  185. for(let z = 0; z < data[i].details[j].content.details[idd].details.length; z++) {
  186. data[i].details[j].content.details[idd].details[z].state = 0
  187. }
  188. data[i].details[j].content.details[idd].details[ind].state = 1
  189. }
  190. const data1 = JSON.parse(JSON.stringify(data))
  191. setChronicPush(data1)
  192. }
  193. confirmFormula(){//计算公式确定
  194. }
  195. handleRadio(item,parent,pIndex){//可能结果
  196. let {radioVal} = this.props;
  197. this.setState({
  198. radioVal:Object.assign({},radioVal,{[pIndex]:item.detailName})
  199. })
  200. }
  201. confirmOption(parent,pIndex){//可能结果确定
  202. const {radioVal,possible} = this.state;
  203. this.setState({
  204. possible:Object.assign({},possible,radioVal),
  205. radioVal:Object.assign({},possible,radioVal),//不设置radioVal只有最近一次选中的值
  206. optionId:null
  207. })
  208. }
  209. calcuFormula(it,j, v, i) { //计算公式计算
  210. const { calcuFormula, data } = this.props
  211. let allHasInfo = true
  212. for (let i = 0; i < it.content.details.length; i++) {
  213. if(it.content.details[i].controlType == 2) { //输入框类型的有没有填值
  214. if(!it.content.details[i].value) {
  215. allHasInfo = false
  216. }
  217. } else if(it.content.details[i].controlType == 1) {
  218. let hasSelect = false
  219. for( let z = 0; z <it.content.details[i].details.length; z++) {
  220. if(it.content.details[i].details[z].state == 1) {
  221. hasSelect= true
  222. }
  223. }
  224. if(!hasSelect) {
  225. allHasInfo = false
  226. }
  227. }
  228. }
  229. if(allHasInfo) { //所有都有值,则计算
  230. // delete it.content.resultz
  231. let param = {
  232. type: 2,
  233. data: it,
  234. disId: v.id,
  235. pIndex: j,
  236. ppIndex: i,
  237. }
  238. calcuFormula(param)
  239. } else { //不是所有值都填过了
  240. Notify.info('请填写计算公式内容')
  241. }
  242. }
  243. getDetail(){
  244. const {data,indexs,scaleInfo,formulaResult} = this.props;
  245. const {showInfo,showOption,infoId,formulaId,optionId,possible,radioVal} = this.state;
  246. let list = data&&data.map((v,i)=>{
  247. return <div className={style["list"]}>
  248. {v.name?<p>
  249. <span>{'患者可能有'+v.name}</span>
  250. <img src={infoPic} className={style["infoPic"]} onClick={this.showInfo.bind(this,v.id)}/>
  251. </p>:''}
  252. {/*<MiniToast title='静态知识'
  253. icon={allTableIcon}
  254. show={infoId&&infoId==v.id?true:false}
  255. close={this.closeInfo}>
  256. {pureText}
  257. </MiniToast>*/}
  258. {v.details&&v.details.map((it,j)=>{
  259. if(it.type==1){
  260. return <p>
  261. <span className={style["listName"]} onClick={this.showTable.bind(this,it.content,v.id,i)}>
  262. {'【'+it.content.name+'】'}
  263. {formulaResult&&formulaResult[it.content.id]&&formulaResult[it.content.id].pIndex==i?<i>{'结果:'}{formulaResult[it.content.id].calcalculate&&formulaResult[it.content.id].calcalculate.result.text}</i>:''}
  264. </span>
  265. {indexs[i]&&indexs[i].includes(j)?<span className={style["addResult"]}>
  266. <img src={added} />
  267. 已加入
  268. </span>:<span className={style["listResult"]} onClick={()=>this.handleAddAssessItem(v,i,j)}>
  269. <img src={add} />
  270. 加入病历记录
  271. </span>
  272. }
  273. </p>
  274. }else if(it.type==2){
  275. return <div className={style["marTop"]}>
  276. <span className={style["limit"]}>
  277. 计算公式结果:
  278. <i className={style["blue"]} onClick={this.showFormula.bind(this,v.id)}>请选择</i>
  279. <img src={level1} />
  280. </span>
  281. {indexs[i]&&indexs[i].includes(j)?<span className={style["addResult"]}>
  282. <img src={added} />
  283. 已加入
  284. </span>:<span className={style["listResult"]} onClick={()=>this.handleAddAssessItem(v,i,j)}>
  285. <img src={add} />
  286. 加入病历记录
  287. </span>
  288. }
  289. <MiniToast title={it.content.name}
  290. icon={allTableIcon}
  291. show={formulaId&&formulaId==v.id?true:false}
  292. close={this.closeFormula}
  293. confirm={this.confirmFormula.bind(this,v,i)}
  294. footer="true">
  295. <table>
  296. {it.content.details.map((item,idd)=>{
  297. if(item.controlType==1){//单选
  298. return <tr>
  299. <td>
  300. <span>{'请选择'+item.name+':'}</span>
  301. </td>
  302. <td>
  303. {item.details.map((ii,ind)=>{
  304. return <div className={style["chooseItem"]}>
  305. <Radio label={ii.detailName}
  306. isSelect={ii.state == 1}
  307. handleClick={this.handleForRadio.bind(this,ii,v,i, j,idd, ind)}>
  308. >
  309. </Radio>
  310. </div>
  311. })}
  312. </td>
  313. </tr>
  314. }else if(item.controlType==1){//多选
  315. }else if(item.controlType==2){//输入框
  316. return <tr>
  317. <td>
  318. <span>{'请输入'+item.name+':'}</span>
  319. </td>
  320. <td>
  321. <input type="text" placeholder="请输入" value={item.value} onInput={this.handleInputformula.bind(this,v,i, j,idd)}/>
  322. </td>
  323. <td>
  324. <span>{item.uint}</span>
  325. </td>
  326. </tr>
  327. }else if(item.controlType==3){//下拉
  328. return <tr>
  329. <td>
  330. <span>{'请选择'+item.name+':'}</span>
  331. </td>
  332. <td>
  333. {item.details.map((ii,ind)=>{
  334. return <div className={style["chooseItem"]}>
  335. <Radio label={ii.detailName}
  336. // isSelect={radioVal[i]==ii.detailName}
  337. isSelect={ii.state == 1}
  338. handleClick={this.handleForRadio.bind(this,ii,v,i)}>
  339. </Radio>
  340. </div>
  341. })}
  342. </td>
  343. </tr>
  344. }
  345. })}
  346. </table>
  347. <div className={style["forMulBtn"]} onClick={this.calcuFormula.bind(this,it,j, v, i)}>计算</div>
  348. <table>
  349. {it.content.result && Array.isArray(it.content.result) &&it.content.result.map((itemResult, resultIndex) => {
  350. return <tr>
  351. <td>
  352. <span>{itemResult.name+':'}</span>
  353. </td>
  354. <td>
  355. <span>{itemResult.text}</span>
  356. </td>
  357. </tr>
  358. })}
  359. </table>
  360. </MiniToast>
  361. </div>
  362. }else if(it.type==3){
  363. return <div className={style["marTop"]}>
  364. <span className={style["limit"]}>
  365. 可能结果:
  366. <i onClick={this.showOption.bind(this,v.id)} className={style["blue"]}>{possible[i]?possible[i]:'请选择'}</i>
  367. <img src={level1} />
  368. </span>
  369. {indexs[i]&&indexs[i].includes(j)?<span className={style["addResult"]}>
  370. <img src={added} />
  371. 已加入
  372. </span>:<span className={style["listResult"]} onClick={()=>this.handleAddAssessItem(v,i,j)}>
  373. <img src={add} />
  374. 加入病历记录
  375. </span>
  376. }
  377. <MiniToast title='结果选择'
  378. icon={checkIcon}
  379. show={optionId&&optionId==v.id?true:false}
  380. close={this.closeOption}
  381. confirm={this.confirmOption.bind(this,v,i)}
  382. footer="true">
  383. <div className={style["infoOption"]}>
  384. <span>{it.content.name?it.content.name+':':''}</span>
  385. {it.content.details&&it.content.details.map((lis,ind)=>{
  386. return <div className={style["chooseItem"]}>
  387. <Radio label={lis.detailName}
  388. isSelect={radioVal[i]==lis.detailName}
  389. handleClick={this.handleRadio.bind(this,lis,v,i)}>
  390. </Radio>
  391. </div>
  392. })}
  393. </div>
  394. </MiniToast>
  395. </div>
  396. }
  397. })}
  398. </div>
  399. })
  400. return list;
  401. }
  402. render(){
  403. const footer = <div className={style['footer']}>
  404. <span className={style['print']} onClick={this.onPrint}><img src={printIcon} alt=""/>打印</span>
  405. <span className={style['okBtn']} onClick={()=>this.handleSaveAssess()}>确定</span>
  406. </div>;
  407. const scaleFooter = <div className={style['footer']}>
  408. <span className={style['print']} onClick={this.onPrint}><img src={printIcon} alt=""/>打印</span>
  409. <span className={style['okBtn']} onClick={()=>this.closeTable()}>确定</span>
  410. </div>;
  411. const {chronicMagItem,showList,tableList,scaleInfo,data,saveAssessInfos,chronicDesease,formulaResult,showHide} = this.props;
  412. const {showInfo,showOption,showAssess,isAssessConfirm,tableName,tableId,parentId,possible,radioVal,parentIndex} = this.state;
  413. return <div className={style["tips"]} style={{marginBottom:'15px'}}>
  414. <div className={`${style["tips-title"]} ${style["chronic"]}`}>
  415. <div className={style["tips-name"]}>
  416. <img src={chronicPic} />
  417. <h2>{chronicMagItem&&chronicMagItem.name||chronicDesease&&chronicDesease.name||'推荐信息'}</h2>
  418. <span className={style["redTips"]}>(页面信息有更新可能影响评估结果)</span>
  419. </div>
  420. <div className={style["tips-btn"]} style={{display:chronicMagItem&&chronicMagItem.name||chronicDesease&&chronicDesease.name?'block':'none'}}>
  421. <span
  422. className={style["tipsDetails"]}
  423. style={{width:'70px'}}
  424. onClick={this.showAssessFn}
  425. >
  426. 管理和评估
  427. </span>
  428. <span className={style["tipsDetails"]} onClick={() => this.showTableList(chronicDesease&&chronicDesease.id||chronicMagItem&&chronicMagItem.id)}>量表
  429. </span>
  430. </div>
  431. </div>
  432. <div className={style["content"]}>
  433. {this.getDetail()}
  434. </div>
  435. <ConfirmModal visible={showHide&&showHide.showList} noFooter='true' title='全部量表' close={this.close} titleBg="#DFEAFE" icon={allTableIcon} height={400} width={400}>
  436. <ul className={style['toast-cont']}>
  437. {tableList&&tableList.map((v,i)=>{
  438. return <li onClick={this.handleListClick.bind(this,v)}>
  439. <span>
  440. {'【'+v.name+'】'}
  441. {/*{formulaResult&&formulaResult[v.id]?<i>{'结果:'+formulaResult[v.id].text}</i>:''}*/}
  442. {formulaResult&&formulaResult[v.id]?<i>{'结果:'}{formulaResult[v.id].calcalculate&&formulaResult[v.id].calcalculate.result.text}</i>:''}
  443. </span>
  444. </li>
  445. })}
  446. </ul>
  447. </ConfirmModal>
  448. {showHide&&showHide.showTable?<ComplexModal onclose={this.closeTable} footer={scaleFooter}
  449. title={tableName}
  450. icon={tableIcon}
  451. top={20}
  452. bottom={20}
  453. width={820}>
  454. <ScaleTable title={tableName} tableId={tableId} parentId={parentId} parentIndex={parentIndex}></ScaleTable>
  455. </ComplexModal>:''}
  456. {showAssess?<ComplexModal onclose={this.showAssessFn} footer={footer}
  457. title='管理和评估'
  458. icon={manageIcon}
  459. top={20}
  460. bottom={20}
  461. width={820}>
  462. <AssessResult handleSave={saveAssessInfos}
  463. isAssessConfirm={isAssessConfirm}
  464. possible={possible}
  465. radioVal={radioVal}></AssessResult>
  466. </ComplexModal>:''}
  467. </div>
  468. }
  469. }
  470. export default ChronicInfo;