SpreadDrop.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. import React ,{Component} from 'react';
  2. import {connect} from 'react-redux';
  3. import SpreadDrop from '@components/SpreadDrop';
  4. import {SETSELECTED,CLEARSELECTED,CONFIRMSELECTED,SETOTHERCHECKBOX,CHANGEOTHERTEXTLABEL} from '@types/otherHistory';
  5. import {RESET,SETDROPSHOW,HIDEDROP,CLICKCOUNT,ISREAD,SET_SELECTED_AREA,SET_CURRENT_MODULE} from '@store/types/homePage.js';
  6. import {getModules as fetchModules} from '@store/async-actions/fetchModules.js';
  7. import {getCommSymptomPush,getCommSymptoms} from '@store/async-actions/mainSuit.js'
  8. import {GET_BIGDATAPUSH,MIX_CONFIRM,COMM_CONFIRM,CHANGE_LABELVAL} from '@store/types/mainSuit';
  9. import {SETCHECKBOX,CHANGECHECKTEXTLABEL,CHECKCONFIRMSELECTED} from '@types/checkBody';
  10. import {CURRENT_CONFIRM,SETMAINCHECKBOX,CURRENT_TEXT_LABEL,CURRENT_GET_BIGDATAPUSH,SHOW_COMMON_ON_CURRENT} from '@types/currentIll';
  11. import {billing,getMRAnalyse} from '@store/async-actions/pushMessage';
  12. import {Notify} from '@commonComp';
  13. import {filterArr,didPushParamChange,filterDataArr,getLabelIndex,fullfillText,checkFullfillText,getIds} from '@utils/tools.js';
  14. import config from '@config/index.js';
  15. import {CLEAR_COMSYMPTOMS} from "../store/types/mainSuit";
  16. import storeGlobal from '@store';
  17. function mapStateToProps(state) {//console.log(state);
  18. const {mainSuit,homePage} = state;
  19. const {readConfig,typeConfig}=state.typeConfig;
  20. const hasReadMode = readConfig!==-1;
  21. const curOtherMode =hasReadMode&&readConfig[2]!==null?readConfig[2]:typeConfig[2];
  22. const curMode =hasReadMode&&readConfig[1]!==null?readConfig[1]:typeConfig[1];
  23. return {
  24. mainSaveText:mainSuit.saveText,
  25. mainData:mainSuit.data,
  26. windowWidth:homePage.windowWidth,
  27. otherDefault:+curOtherMode===1,
  28. curDefault:+curMode===1,
  29. CommonSymptoms:mainSuit.CommonSymptoms,//常见症状
  30. select_start:homePage.select_start,
  31. }
  32. }
  33. function getNames(data,order){//从exist withs 中获取name字段
  34. let nameData = "";
  35. if(+order===1){ //成文默认按点选顺序排序,指定textGenerate=1按从上到下从左到右排序
  36. data.sort(function(a,b){
  37. return a.listIndex-b.listIndex;
  38. });
  39. }
  40. data&&data.forEach((it,i)=>{
  41. nameData += it.name;
  42. });
  43. return nameData;
  44. }
  45. function addPoint(data,num){//给伴随添加顿号
  46. for(let i=num; i<data.length; i++){
  47. data[i].name = '、'+ data[i].name;
  48. }
  49. return data;
  50. }
  51. /***********************标签展开确定事件***************************/
  52. // 主诉--不用展开标签
  53. function mainSuitModule(dispatch,store,params){
  54. const {nones,exists,withs,exclusion,excluName,ban,mainSaveText,mainData} = params;
  55. let text = filterDataArr(mainSaveText);
  56. if(text.length >= config.limited){
  57. Notify.info(config.limitText);
  58. return
  59. }
  60. // 给主症状伴随添加exists字段
  61. if(exists.length>0){
  62. for(let k=0; k<exists.length; k++){
  63. exists[k].value=exists[k].name;
  64. exists[k].exist=1;
  65. }
  66. }
  67. if(withs.length>0){
  68. for(let n=0; n<withs.length; n++){
  69. withs[n].value=withs[n].name;
  70. withs[n].exist=2;
  71. }
  72. }
  73. // let existsName = getNames(exists);
  74. // let withsName = getNames(withs);
  75. const copExists = JSON.parse(JSON.stringify(exists));
  76. const copWiths = JSON.parse(JSON.stringify(withs));
  77. let banName = ban.name;
  78. const index = params.ikey;
  79. let ikey = getLabelIndex(index);
  80. let num = 0;
  81. let existNum = 0;
  82. let forwardId;
  83. let mainText;
  84. for(let n=ikey-1; n>0; n--){
  85. if(mainData[n].flag && mainData[n].flag==1){
  86. forwardId = n;
  87. continue;
  88. }
  89. }
  90. if(forwardId){
  91. mainText = mainSaveText.slice(forwardId,ikey);
  92. const mainSlice = mainData.slice(forwardId,ikey);
  93. let banIndex = mainText.indexOf('伴');
  94. if(banIndex==-1){
  95. num = 1;
  96. }
  97. // ikey前的data里没有exist=1的数据,则existNum=1
  98. if(exists.length>0){
  99. for(let i=0; i<mainSlice.length; i++){
  100. if(!mainSlice[i].exist && mainSlice[i].exist!==1){
  101. existNum = 1;
  102. continue;
  103. }
  104. }
  105. }
  106. }else{
  107. let banIndex = mainSaveText.indexOf("伴");
  108. if(banIndex==-1){
  109. num = 1;
  110. }
  111. }
  112. let withsName = getNames(addPoint(copWiths,num));
  113. let existsName = getNames(addPoint(copExists,existNum));
  114. let names;
  115. if(banName){
  116. names = existsName + banName + withsName;
  117. }else{
  118. names = existsName + withsName;
  119. }
  120. // num==0 说明有“伴”,减1;
  121. let lengths = num==0?text.length + names.length - 1:text.length + names.length;
  122. // console.log(5656,num,existNum,text,text.length,names,lengths);
  123. if(lengths > config.limited){
  124. Notify.info(config.limitText);
  125. return
  126. }
  127. // const index = params.ikey;
  128. // let ikey = getLabelIndex(index);
  129. dispatch({
  130. type: MIX_CONFIRM,
  131. data: {exists:exists,withs:withs,withsName:withsName,existsName:existsName,ikey,ban}
  132. });
  133. dispatch({ //自由文本标签数据更新
  134. type:ISREAD
  135. });
  136. dispatch({//隐藏下拉
  137. type:HIDEDROP
  138. })
  139. }
  140. // 现病史
  141. function currentIll(dispatch,store,params){
  142. const {nones,exists,withs,exclusion,excluName,ban,noneIds,tagType} = params;
  143. const index = params.ikey;
  144. let ikey = getLabelIndex(index);
  145. let existsId = exists && exists.length>0?getIds(exists):[];
  146. let withsId = withs && withs.length>0?getIds(withs):[];
  147. // const ids = (existsId.concat(withsId)).join(",");
  148. const ids = existsId.concat(withsId);
  149. let has = [],wes=[];
  150. if(params.exclusion){//既往史
  151. dispatch({
  152. type: CURRENT_CONFIRM,
  153. data:{exclusion,excluName,exists:has,withs:wes,nones:nones,ikey,ban,noneIds,tagType}
  154. });
  155. return ;
  156. }
  157. //获取选中项目模板
  158. fetchModules(ids).then((res)=>{
  159. if(+res.data.code===0){
  160. const list = res.data.data;
  161. // if(list&&list.length>0){
  162. if(list&&JSON.stringify(list) !== '{}'){
  163. existsId.map((i)=>{
  164. // has.push(...list[i].questionMapping);
  165. has.push(list[i]);
  166. });
  167. withsId.map((i)=>{
  168. // wes.push(...list[i].questionMapping);
  169. wes.push(list[i]);
  170. });
  171. dispatch({
  172. type: CURRENT_CONFIRM,
  173. data: {exclusion,excluName,exists:has,withs:wes,nones:nones,ikey,ban,noneIds,tagType}
  174. });
  175. }else{
  176. dispatch({
  177. type: CURRENT_CONFIRM,
  178. data: {exclusion,excluName,exists:has,withs:wes,nones:nones,ikey,ban,noneIds,tagType}
  179. // data: {exists,withs,nones,ikey,ban,noneIds}
  180. });
  181. }
  182. dispatch({ //自由文本标签数据更新
  183. type:ISREAD
  184. });
  185. }else{
  186. console.log(res);
  187. }
  188. });
  189. }
  190. //其他史多选标签确定事件
  191. function otherHisConfirm(dispatch,store,params){
  192. const {nones,exists,withs,exclusion,excluName,copyType} = params;
  193. // const ikey = params.ikey.substr(1,1);
  194. const index = params.ikey;
  195. let ikey = getLabelIndex(index);
  196. if(params.exclusion){
  197. dispatch({
  198. type: CONFIRMSELECTED,
  199. data:{exclusion,excluName,ikey,copyType}
  200. });
  201. return ;
  202. }
  203. let existsId = getIds(exists);
  204. let withsId = getIds(withs);
  205. // const ids = existsId.length>0?existsId.join(",")+','+withsId.join(","):withsId.join(",");
  206. const ids = existsId.concat(withsId);
  207. if(!ids&&nones){ //只有无的项目
  208. dispatch({
  209. type: CONFIRMSELECTED,
  210. data: {exists:[],withs:[],nones:nones,ikey,copyType}
  211. });
  212. dispatch({
  213. type:ISREAD
  214. });
  215. return;
  216. }
  217. // const ids = exists.join(",")+withs.join(",");
  218. let has = [],wes=[];
  219. //获取选中项目模板
  220. fetchModules(ids).then((res)=>{
  221. if(+res.data.code===0){
  222. const list = res.data.data;
  223. existsId.map((i)=>{
  224. has.push(...list[i].questionMapping);
  225. });
  226. withsId.map((i)=>{
  227. wes.push(...list[i].questionMapping);
  228. });
  229. dispatch({
  230. type: CONFIRMSELECTED,
  231. data: {exists:fullfillText(has,false,true).newArr,withs:fullfillText(wes,false,true).newArr,nones:nones,ikey,copyType}
  232. });
  233. dispatch({
  234. type:ISREAD
  235. });
  236. }
  237. });
  238. }
  239. function checkBodyConfirm(dispatch,store,params){
  240. const {nones,exists,withs,exclusion,excluName,copyType} = params;
  241. // const ikey = params.ikey.substr(1,1);
  242. const index = params.ikey;
  243. let ikey = getLabelIndex(index);
  244. if(params.exclusion){
  245. dispatch({
  246. type: CHECKCONFIRMSELECTED,
  247. data:{exclusion,excluName,ikey,copyType}
  248. });
  249. return ;
  250. }
  251. let existsId = getIds(exists);
  252. let withsId = getIds(withs);
  253. // const ids = existsId.join(",")+','+withsId.join(",");
  254. const ids = existsId.concat(withsId);
  255. if(!ids&&nones){ //只有无的项目
  256. dispatch({
  257. type: CHECKCONFIRMSELECTED,
  258. data: {exists:[],withs:[],nones:nones,ikey,copyType}
  259. });
  260. dispatch({
  261. type:ISREAD
  262. });
  263. return;
  264. }
  265. // const ids = exists.join(",")+withs.join(",");
  266. let has = [],wes=[];
  267. //获取选中项目模板
  268. fetchModules(ids).then((res)=>{
  269. if(+res.data.code===0){
  270. const list = res.data.data;
  271. existsId.map((i)=>{
  272. has.push(...list[i].questionMapping);
  273. });
  274. withsId.map((i)=>{
  275. wes.push(...list[i].questionMapping);
  276. });
  277. dispatch({
  278. type: CHECKCONFIRMSELECTED,
  279. data: {exists:checkFullfillText(has).newArr,withs:checkFullfillText(wes).newArr,nones:nones,ikey,copyType}
  280. });
  281. dispatch({
  282. type:ISREAD
  283. });
  284. }
  285. });
  286. }
  287. //在不同模块(主诉、现病史等)下拉选中调用不同事件
  288. function handleModuleDiff(dispatch,store,params){
  289. const {type,mainSaveText} = params;
  290. switch (+type){
  291. case 1:
  292. /*let text = filterDataArr(mainSaveText);
  293. if(text.length >= config.limited){
  294. Notify.info(config.limitText);
  295. return
  296. }*/
  297. mainSuitModule(dispatch,store,params);
  298. break;
  299. case 2:
  300. currentIll(dispatch,store,params);
  301. break;
  302. case 3:
  303. otherHisConfirm(dispatch,store,params);
  304. break;
  305. case 4:
  306. checkBodyConfirm(dispatch,store,params);
  307. break;
  308. default:
  309. }
  310. }
  311. /*****************普通多选框确定事件**************************/
  312. //主诉普通多选确定
  313. function mainSuitCheck(dispatch,store,params){
  314. const {nones,exists,withs,order,mainSaveText,value,ikey} = params;
  315. let existsName = getNames(exists,order);
  316. let withsName = getNames(withs);
  317. let labelInx = getLabelIndex(ikey);
  318. let text = filterDataArr(mainSaveText);
  319. let lengths = value?(text.length - value.length + existsName.length):(text.length + existsName.length);
  320. if(lengths > config.limited){
  321. Notify.info(config.limitText);
  322. return
  323. }
  324. delete params.mainData; //不需要保存该数据,删除避免死循环
  325. dispatch({
  326. type: COMM_CONFIRM,
  327. data:Object.assign({},params,{existsName,withsName,labelInx})
  328. });
  329. dispatch({//隐藏下拉
  330. type:HIDEDROP
  331. })
  332. }
  333. //现病史普通多选确定
  334. function currentCheck(dispatch,store,params){
  335. const {ikey,exists,withs,order} = params;
  336. let existsName = getNames(exists,order);
  337. let withsName = getNames(withs);
  338. let labelInx = getLabelIndex(ikey);
  339. dispatch({
  340. type:SETMAINCHECKBOX,
  341. // data:{labelInx,ikey,exclusion,excluName,nones,exists,existsName,noneIds,noneOn,nowOn,withOn,withs,withsName}
  342. data:Object.assign({},params,{existsName,withsName,labelInx})
  343. })
  344. }
  345. //查体普通多选确定
  346. function checkBodyCheck(dispatch,store,params){
  347. const {ikey,exclusion,excluName,nones,exists,noneIds,noneOn,nowOn,withOn,withs,order} = params;
  348. let existsName = getNames(exists,order);
  349. let withsName = getNames(withs);
  350. let labelInx = getLabelIndex(ikey);
  351. delete params.mainData; //该数据不用保存到state,删除避免死循环
  352. dispatch({
  353. type:SETCHECKBOX,
  354. // data:{labelInx,ikey,exclusion,excluName,nones,exists,existsName,noneIds,noneOn,nowOn,withOn,withs,withsName}
  355. data:Object.assign({},params,{existsName,withsName,labelInx})
  356. })
  357. }
  358. //其他史普通多选确定
  359. function otherHisCheck(dispatch,store,params){
  360. const {ikey,exclusion,excluName,nones,exists,noneIds,noneOn,nowOn,withOn,withs,order} = params;
  361. let existsName = getNames(exists,order);
  362. let withsName = getNames(withs);
  363. let labelInx = getLabelIndex(ikey);
  364. dispatch({
  365. type:SETOTHERCHECKBOX,
  366. data:Object.assign({},params,{existsName,withsName,labelInx})
  367. })
  368. }
  369. function handleCheckBox(dispatch,store,params){
  370. const {type} = params;
  371. switch (+type){
  372. case 1:
  373. mainSuitCheck(dispatch,store,params);
  374. break;
  375. case 2:
  376. currentCheck(dispatch,store,params);
  377. break;
  378. case 3:
  379. otherHisCheck(dispatch,store,params);
  380. break;
  381. case 4:
  382. checkBodyCheck(dispatch,store,params);
  383. break;
  384. default:
  385. }
  386. }
  387. /**************标签双击输入**************/
  388. //主诉
  389. function mainSuitLabelEdit(dispatch,params){
  390. const index = params.ikey;
  391. let ikey = getLabelIndex(index);
  392. dispatch({
  393. type:CHANGE_LABELVAL,
  394. data:{changeVal:params.changeVal,ikey:ikey}
  395. })
  396. }
  397. //现病史
  398. function currentLabelEdit(dispatch,params){
  399. const index = params.ikey;
  400. let ikey = getLabelIndex(index);
  401. dispatch({
  402. type:CURRENT_TEXT_LABEL,
  403. data:{changeVal:params.changeVal,ikey:ikey}
  404. })
  405. }
  406. //其他史
  407. function otherHisLabelEdit(dispatch,params){
  408. const index = params.ikey;
  409. let ikey = getLabelIndex(index);
  410. dispatch({
  411. type:CHANGEOTHERTEXTLABEL,
  412. data:{changeVal:params.changeVal,ikey:ikey}
  413. })
  414. }
  415. //查体
  416. function checkBodyLabelEdit(dispatch,params){
  417. const index = params.ikey;
  418. let ikey = getLabelIndex(index);
  419. const {changeVal} = params;
  420. dispatch({
  421. type:CHANGECHECKTEXTLABEL,
  422. data:{totalVal:changeVal,ikey:ikey,changeVal}
  423. })
  424. }
  425. function handleLabel(dispatch,params){
  426. const {type} = params;
  427. switch (+type){
  428. case 1:
  429. mainSuitLabelEdit(dispatch,params);
  430. break;
  431. case 2:
  432. currentLabelEdit(dispatch,params);
  433. break;
  434. case 3:
  435. otherHisLabelEdit(dispatch,params);
  436. break;
  437. case 4:
  438. checkBodyLabelEdit(dispatch,params);
  439. break;
  440. default:
  441. }
  442. dispatch(billing('',type));
  443. dispatch({
  444. type:ISREAD
  445. })
  446. }
  447. function mapDispatchToProps(dispatch,store){
  448. return {
  449. handleConfirm(obj){
  450. if(obj.tagType == 6||obj.tagType == 11){//铺开
  451. handleModuleDiff(dispatch,store,obj);
  452. obj.isCommon&&dispatch({ //选中常见后清空常见症状
  453. type:CLEAR_COMSYMPTOMS
  454. });
  455. }else if(obj.tagType == 2){//普通多选
  456. handleCheckBox(dispatch,store,obj);
  457. }
  458. //右侧推送
  459. setTimeout(function(){ //延迟待确定后的数据更新后推送,避免获取的参数还是旧的
  460. if(didPushParamChange()){ //操作后内容有变化才推送
  461. dispatch(billing());
  462. }
  463. },500);
  464. },
  465. handleHide(){
  466. dispatch({
  467. type: HIDEDROP
  468. });
  469. },
  470. async handleShow(obj){
  471. // 埋点dispatch
  472. dispatch({
  473. type:CLICKCOUNT,
  474. data:obj,
  475. clickType:'单击',
  476. num:1
  477. });
  478. // 调大数据接口
  479. if(obj.tagType ==11 ){
  480. const bigData = await getCommSymptomPush();
  481. let result = bigData.data;
  482. if(+result.code == 0){
  483. // let pushDataList = result.data.symptom;
  484. let bigDataList = result.data.symptom;
  485. if(!bigDataList&&!obj.hasCommon){
  486. dispatch(getCommSymptoms());
  487. dispatch({
  488. type:SETDROPSHOW,
  489. data:obj
  490. });
  491. const storeState = storeGlobal.getState()
  492. const {moduleName, moduleObj} = storeState.homePage
  493. if(moduleName != moduleObj[obj.ikey[0]]) {
  494. dispatch({
  495. type: SET_CURRENT_MODULE,
  496. moduleName: moduleObj[obj.ikey[0]]
  497. });
  498. dispatch(getMRAnalyse());
  499. }
  500. return;
  501. }
  502. let pushDataList = [];
  503. if(bigDataList&&bigDataList.length>0){//剔除没有id
  504. pushDataList = bigDataList.filter(function(item){
  505. return item.id
  506. });
  507. }else{
  508. pushDataList = bigDataList;
  509. }
  510. //推送无数据显示空下拉并提示暂无推送--1.9/1.18
  511. //if(!pushDataList || pushDataList.length == 0){Notify.info("暂无推送");}
  512. if(obj.type == 1){// 主诉--添加症状
  513. dispatch({
  514. type:GET_BIGDATAPUSH,
  515. data:pushDataList,
  516. info:obj
  517. })
  518. }else if(obj.type == 2){// 现病史--添加其他症状
  519. dispatch({
  520. type:CURRENT_GET_BIGDATAPUSH,
  521. data:pushDataList,
  522. info:obj
  523. })
  524. }
  525. }else{
  526. if(+obj.type===2){
  527. (!obj.hasCommon)&&dispatch(getCommSymptoms());
  528. dispatch({
  529. type:SETDROPSHOW,
  530. data:obj
  531. });
  532. const storeState = storeGlobal.getState()
  533. const {moduleName, moduleObj} = storeState.homePage
  534. if(moduleName != moduleObj[obj.ikey[0]]) {
  535. dispatch({
  536. type: SET_CURRENT_MODULE,
  537. moduleName: moduleObj[obj.ikey[0]]
  538. });
  539. dispatch(getMRAnalyse());
  540. }
  541. }else{
  542. Notify.info(result.msg);
  543. return;
  544. }
  545. //Notify.info("暂无推送");
  546. // 接口请求失败,不往下执行显示下拉
  547. }
  548. }
  549. dispatch({
  550. type:SETDROPSHOW,
  551. data:obj
  552. });
  553. const storeState = storeGlobal.getState()
  554. const {moduleName, moduleObj} = storeState.homePage
  555. if(moduleName != moduleObj[obj.ikey[0]]) {
  556. dispatch({
  557. type: SET_CURRENT_MODULE,
  558. moduleName: moduleObj[obj.ikey[0]]
  559. });
  560. dispatch(getMRAnalyse());
  561. }
  562. dispatch({
  563. type: RESET
  564. });
  565. },
  566. handleDbclick(obj){//双击统计
  567. dispatch({
  568. type:CLICKCOUNT,
  569. data:obj,
  570. clickType:'双击',
  571. num:1
  572. });
  573. },
  574. handleLabelChange(obj){//标签内输入
  575. handleLabel(dispatch,obj);
  576. },
  577. setSelectArea(data){
  578. dispatch({
  579. type:SET_SELECTED_AREA,
  580. data
  581. })
  582. }
  583. }
  584. }
  585. const SpreadDropCont = connect(
  586. mapStateToProps,
  587. mapDispatchToProps
  588. )(SpreadDrop);
  589. export default SpreadDropCont;