SpreadDrop.js 16 KB

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