index.jsx 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  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 $ from 'jquery';
  17. /***
  18. 慢病右侧推送模块规则:
  19. 慢病--显示慢病名称以及管理和评估
  20. 普通病--不显示管理和评估和量表按钮
  21. 明细--量表-计算公式-核心指标
  22. controlType:0-radio 1-checkbox 2-text 3-dropdownlist
  23. **/
  24. class ChronicInfo extends React.Component{
  25. constructor(props){
  26. super(props);
  27. this.state = {
  28. show:true,
  29. showInfo:false,
  30. showOption:false,
  31. showTable: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. radioVal:{}, //可能结果选择内容
  41. possible:{}, //可能结果
  42. };
  43. this.$content = React.createRef();
  44. this.showInfo = this.showInfo.bind(this);
  45. this.closeInfo = this.closeInfo.bind(this);
  46. this.showOption = this.showOption.bind(this);
  47. this.closeOption = this.closeOption.bind(this);
  48. this.showTable = this.showTable.bind(this);//显示量表弹窗
  49. this.closeTable = this.closeTable.bind(this);//关闭量表弹窗
  50. this.showAssessFn = this.showAssessFn.bind(this); //开关评估弹窗
  51. this.close = this.close.bind(this); //关闭量表列表
  52. this.showFormula = this.showFormula.bind(this); //打开计算公式
  53. this.closeFormula = this.closeFormula.bind(this); //关闭计算公式
  54. this.handleAddAssessItem = this.handleAddAssessItem.bind(this); //加入病例记录
  55. this.handleSaveAssess = this.handleSaveAssess.bind(this); //评估弹窗确定
  56. this.onPrint = this.onPrint.bind(this);
  57. }
  58. onPrint() {
  59. let dom = this.state.showTable?$("#printcontent"):$("#AssistResult");
  60. dom.jqprint({
  61. debug: false,
  62. importCSS: true,
  63. printContainer: true,
  64. operaSupport: false,
  65. });
  66. }
  67. componentWillReceiveProps() {
  68. $(this.$content.current)[0].scrollIntoView(true);
  69. }
  70. showTableList(id){//量表
  71. const {getTableList,questionId} = this.props;
  72. // getTableList(questionId&&questionId.id);
  73. if(id){
  74. getTableList(id);
  75. }
  76. }
  77. showInfo(id){//显示静态知识
  78. // 静态知识显示在提示信息里(4-18)
  79. const {getInfomation} = this.props;
  80. const param = {
  81. // id:id,
  82. id:40738,
  83. type:22,
  84. }
  85. getInfomation&&getInfomation(param);
  86. /*this.setState({
  87. infoId:id
  88. })*/
  89. }
  90. closeInfo(){//关闭静态知识
  91. this.setState({
  92. infoId:null
  93. })
  94. }
  95. showOption(id){
  96. this.setState({
  97. optionId:id
  98. })
  99. }
  100. closeOption(){
  101. this.setState({
  102. optionId:null
  103. })
  104. }
  105. showTable(it,parentId){
  106. const {formulaResult} = this.props;
  107. // 密西根糖尿病周围神经病评分(MDNS) 为例
  108. /*const item = {
  109. id:40744,
  110. name:'密西根糖尿病周围神经病评分(MDNS)'
  111. }*/
  112. const item = {
  113. id:it.id,
  114. name:it.name
  115. }
  116. // 判断:store里已经有改该量表就无需重新调接口
  117. // formulaResult
  118. this.props.getScaleInfo(item);
  119. this.setState({
  120. showTable:true,
  121. tableName:it.name,
  122. tableId:it.id,
  123. parentId:parentId
  124. })
  125. }
  126. closeTable(){
  127. this.setState({
  128. showTable:false,
  129. tableName:'',
  130. tableId:null,
  131. parentId:null,
  132. })
  133. }
  134. showAssessFn(){
  135. this.setState({
  136. showAssess:!this.state.showAssess,
  137. isAssessConfirm:false
  138. });
  139. }
  140. close(){
  141. const {hideList} = this.props;
  142. hideList&&hideList();
  143. }
  144. showFormula(id){//计算公式
  145. this.setState({
  146. formulaId:id
  147. })
  148. }
  149. closeFormula(){
  150. this.setState({
  151. formulaId:null
  152. })
  153. }
  154. handleAddAssessItem(v,pIndex,i){
  155. const {addAssessItem} = this.props;
  156. addAssessItem(v,pIndex,i);
  157. }
  158. handleSaveAssess(){
  159. this.setState({
  160. isAssessConfirm:true
  161. });
  162. const that=this;
  163. setTimeout(()=>{
  164. that.showAssessFn();
  165. });
  166. }
  167. handleForRadio(item,parent,pIndex){//计算公式
  168. }
  169. confirmFormula(){//计算公式确定
  170. }
  171. handleRadio(item,parent,pIndex){//可能结果
  172. let {radioVal} = this.props;
  173. this.setState({
  174. radioVal:Object.assign({},radioVal,{[pIndex]:item.detailName})
  175. })
  176. }
  177. confirmOption(parent,pIndex){//可能结果确定
  178. const {radioVal,possible} = this.state;
  179. this.setState({
  180. possible:Object.assign({},possible,radioVal),
  181. radioVal:Object.assign({},possible,radioVal),//不设置radioVal只有最近一次选中的值
  182. optionId:null
  183. })
  184. }
  185. getDetail(){
  186. const {data,indexs} = this.props;
  187. const {showInfo,showOption,infoId,formulaId,optionId,possible,radioVal} = this.state;
  188. let list = data&&data.map((v,i)=>{
  189. return <div className={style["list"]}>
  190. <p ref={this.$content}>
  191. <span>{'患者可能有'+v.name}</span>
  192. <img src={infoPic} className={style["infoPic"]} onClick={this.showInfo.bind(this,v.id)}/>
  193. </p>
  194. {/*<MiniToast title='静态知识'
  195. icon={allTableIcon}
  196. show={infoId&&infoId==v.id?true:false}
  197. close={this.closeInfo}>
  198. {pureText}
  199. </MiniToast>*/}
  200. {v.details&&v.details.map((it,j)=>{
  201. if(it.type==1){
  202. return <p>
  203. <span className={style["listName"]} onClick={this.showTable.bind(this,it.content,v.id)}>{'【'+it.content.name+'】'}</span>
  204. {indexs[i]&&indexs[i].includes(j)?<span className={style["addResult"]}>
  205. <img src={added} />
  206. 已加入
  207. </span>:<span className={style["listResult"]} onClick={()=>this.handleAddAssessItem(v,i,j)}>
  208. <img src={add} />
  209. 加入病历记录
  210. </span>
  211. }
  212. </p>
  213. }else if(it.type==2){
  214. return <div className={style["marTop"]}>
  215. <span>计算公式结果:</span>
  216. <span className={style["blue"]} onClick={this.showFormula.bind(this,v.id)}>请选择</span>
  217. <img src={level1} />
  218. {indexs[i]&&indexs[i].includes(j)?<span className={style["addResult"]}>
  219. <img src={added} />
  220. 已加入
  221. </span>:<span className={style["listResult"]} onClick={()=>this.handleAddAssessItem(v,i,j)}>
  222. <img src={add} />
  223. 加入病历记录
  224. </span>
  225. }
  226. <MiniToast title={it.content.name}
  227. icon={allTableIcon}
  228. show={formulaId&&formulaId==v.id?true:false}
  229. close={this.closeFormula}
  230. confirm={this.confirmFormula.bind(this,v,i)}
  231. footer="true">
  232. <table>
  233. {it.content.details.map((item,idd)=>{
  234. if(item.controlType==0){//单选
  235. return <tr>
  236. <td>
  237. <span>{'请选择'+item.name+':'}</span>
  238. </td>
  239. <td>
  240. {item.details.map((ii,ind)=>{
  241. return <div className={style["chooseItem"]}>
  242. <Radio label={ii.detailName}
  243. isSelect={radioVal[i]==ii.detailName}
  244. handleClick={this.handleForRadio.bind(this,ii,v,i)}>
  245. </Radio>
  246. </div>
  247. })}
  248. </td>
  249. </tr>
  250. }else if(item.controlType==1){//多选
  251. }else if(item.controlType==2){//输入框
  252. return <tr>
  253. <td>
  254. <span>{'请输入'+item.name+':'}</span>
  255. </td>
  256. <td>
  257. <input type="text" placeholder="请输入" value={item.value}/>
  258. </td>
  259. <td>
  260. <span>{item.uint}</span>
  261. </td>
  262. </tr>
  263. }else if(item.controlType==3){//下拉
  264. return <tr>
  265. <td>
  266. <span>{'请选择'+item.name+':'}</span>
  267. </td>
  268. <td>
  269. {item.details.map((ii,ind)=>{
  270. return <div className={style["chooseItem"]}>
  271. <Radio label={ii.detailName}
  272. isSelect={radioVal[i]==ii.detailName}
  273. handleClick={this.handleForRadio.bind(this,ii,v,i)}>
  274. </Radio>
  275. </div>
  276. })}
  277. </td>
  278. </tr>
  279. }
  280. })}
  281. </table>
  282. <div className={style["forMulBtn"]}>计算</div>
  283. </MiniToast>
  284. </div>
  285. }else if(it.type==3){
  286. return <div className={style["marTop"]}>
  287. <span>可能结果:</span>
  288. <span onClick={this.showOption.bind(this,v.id)} className={style["blue"]}>{possible[i]?possible[i]:'请选择'}</span>
  289. <img src={level1} />
  290. {indexs[i]&&indexs[i].includes(j)?<span className={style["addResult"]}>
  291. <img src={added} />
  292. 已加入
  293. </span>:<span className={style["listResult"]} onClick={()=>this.handleAddAssessItem(v,i,j)}>
  294. <img src={add} />
  295. 加入病历记录
  296. </span>
  297. }
  298. <MiniToast title='结果选择'
  299. icon={checkIcon}
  300. show={optionId&&optionId==v.id?true:false}
  301. close={this.closeOption}
  302. confirm={this.confirmOption.bind(this,v,i)}
  303. footer="true">
  304. <div className={style["infoOption"]}>
  305. <span>是否贫血:</span>
  306. {it.content.details&&it.content.details.map((lis,ind)=>{
  307. return <div className={style["chooseItem"]}>
  308. <Radio label={lis.detailName}
  309. isSelect={radioVal[i]==lis.detailName}
  310. handleClick={this.handleRadio.bind(this,lis,v,i)}>
  311. </Radio>
  312. </div>
  313. })}
  314. </div>
  315. </MiniToast>
  316. </div>
  317. }
  318. })}
  319. </div>
  320. })
  321. return list;
  322. }
  323. render(){
  324. const footer = <div className={style['footer']}>
  325. <span className={style['print']} onClick={this.onPrint}><img src={printIcon} alt=""/>打印</span>
  326. <span className={style['okBtn']} onClick={()=>this.handleSaveAssess()}>确定</span>
  327. </div>;
  328. const {chronicMagItem,showList,tableList,scaleInfo,data,saveAssessInfos,chronicDesease} = this.props;
  329. const {showInfo,showOption,showTable,showAssess,isAssessConfirm,tableName,tableId,parentId} = this.state;
  330. //console.log(8989,chronicMagItem,chronicDesease);
  331. return <div className={style["tips"]} style={{marginBottom:'15px'}}>
  332. <div className={`${style["tips-title"]} ${style["chronic"]}`}>
  333. <div className={style["tips-name"]}>
  334. <img src={chronicPic} />
  335. <h2>{chronicMagItem&&chronicMagItem.name||chronicDesease&&chronicDesease.name||'推荐信息'}</h2>
  336. <span className={style["redTips"]}>(页面信息有更新可能影响评估结果)</span>
  337. </div>
  338. <div className={style["tips-btn"]} style={{display:chronicMagItem&&chronicMagItem.name||chronicDesease&&chronicDesease.name?'block':'none'}}>
  339. <span
  340. className={style["tipsDetails"]}
  341. style={{width:'70px'}}
  342. onClick={this.showAssessFn}
  343. >
  344. 管理和评估
  345. </span>
  346. <span className={style["tipsDetails"]} onClick={() => this.showTableList(chronicDesease&&chronicDesease.id||chronicMagItem&&chronicMagItem.id)}>量表
  347. </span>
  348. </div>
  349. </div>
  350. <div className={style["content"]}>
  351. {this.getDetail()}
  352. </div>
  353. <ConfirmModal visible={showList} noFooter='true' title='全部量表' close={this.close} titleBg="#DFEAFE" icon={allTableIcon} height={300}>
  354. <ul className={style['toast-cont']}>
  355. {tableList&&tableList.map((v,i)=>{
  356. return <li>
  357. <span>{'【'+v.name+'】'}</span>
  358. </li>
  359. })}
  360. </ul>
  361. </ConfirmModal>
  362. {showTable?<ComplexModal onclose={this.closeTable} footer={footer}
  363. title={tableName}
  364. icon={tableIcon}
  365. top={20}
  366. bottom={20}
  367. width={820}>
  368. <ScaleTable data={scaleInfo} title={tableName} tableId={tableId} parentId={parentId}></ScaleTable>
  369. </ComplexModal>:''}
  370. {showAssess?<ComplexModal onclose={this.showAssessFn} footer={footer}
  371. title='管理和评估'
  372. icon={manageIcon}
  373. top={20}
  374. bottom={20}
  375. width={820}>
  376. <AssessResult handleSave={saveAssessInfos} isAssessConfirm={isAssessConfirm}></AssessResult>
  377. </ComplexModal>:''}
  378. </div>
  379. }
  380. }
  381. export default ChronicInfo;