currentIll.js 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005
  1. import config from '@config/index.js';
  2. import {formatContinueDots,getLabelIndex,fullfillText,getIds,resetTagtype} from '@utils/tools';
  3. import {Notify} from '@commonComp';
  4. //插入病程变化模板
  5. function insertPro(data,processModule){
  6. let index;
  7. for(let i=0; i<data.length; i++){
  8. if(data[i].flag && data[i].flag==3 ){
  9. index = i;
  10. }
  11. }
  12. for(let j=0; j<processModule.length; j++){
  13. let pos = index + j;
  14. data.splice(pos,0,processModule[j]);
  15. }
  16. return data;
  17. }
  18. //设置模板
  19. export const setModule = (state,action)=>{
  20. const res = Object.assign({},state);
  21. const originalData = action.data||[];
  22. const originalSonData = action.processModule||[];
  23. const originalEmpty = action.emptyData||[];
  24. const originalEmptySon = action.currentEmptySon||[];
  25. // 处理tagType=4的类型
  26. let spreadLabels=resetTagtype(originalData);
  27. let sonSpreadLabels=resetTagtype(originalSonData);//子模板
  28. let emptySpreadLabels=resetTagtype(originalEmpty);//空模板
  29. let emptySonSpreadLabels=resetTagtype(originalEmptySon);//空模板-子模板
  30. res.moduleData = spreadLabels;
  31. res.processModule = sonSpreadLabels;//病程变化模板
  32. res.emptyData = emptySpreadLabels;//空模板
  33. res.currentEmptySon = emptySonSpreadLabels;//空模板-子模板
  34. let data = action.data;
  35. let sliceIdx;
  36. data&&data.map((v,i)=>{
  37. if(v.flag && v.flag==2){
  38. sliceIdx = i;
  39. }
  40. })
  41. res.addModule = data&&data.slice(0,sliceIdx+1);//截取到flag=2 有无治疗
  42. res.update=Math.random();
  43. return res;
  44. }
  45. //插入病程变化
  46. export const insertProcess = (state,action)=>{
  47. const res = Object.assign({},state);
  48. const useEmpty = res.useEmpty;
  49. let addSmoduleData = [];
  50. if(res.currReadSonM.length>0){
  51. addSmoduleData = JSON.parse(JSON.stringify(res.currReadSonM))
  52. }else{
  53. if(!useEmpty){
  54. addSmoduleData = res.processModule.length>0?JSON.parse(JSON.stringify(res.processModule)):[];
  55. }else{//使用空模板则取空模板的子模板
  56. addSmoduleData = res.currentEmptySon.length>0?JSON.parse(JSON.stringify(res.currentEmptySon)):[];
  57. }
  58. }
  59. if(addSmoduleData.length==0){//未匹配到子模板
  60. Notify.info("未找到相关内容");
  61. return
  62. }
  63. let data = res.data;
  64. let newData = insertPro(data,addSmoduleData);
  65. res.data = fullfillText(newData).newArr;
  66. res.saveText = fullfillText(res.data).saveText;
  67. res.update=Math.random();
  68. return res;
  69. }
  70. function addPos(data,num){
  71. let newData = JSON.parse(JSON.stringify(data));
  72. newData.forEach((it,i)=>{
  73. it.pos = num;
  74. })
  75. return newData;
  76. }
  77. //慢病填充模板
  78. export const fillChronicModule = (state,action)=>{
  79. let res = Object.assign({},state);
  80. let moduleData = JSON.parse(JSON.stringify(res.moduleData));//现病史模板
  81. res.data = fullfillText(moduleData).newArr;
  82. res.saveText = fullfillText(res.data).saveText;
  83. res.editClear = false; //现病史框不可编辑
  84. res.update=Math.random();
  85. return res;
  86. }
  87. //聚焦时设置 现病史模板
  88. export const setData = (state,action) =>{
  89. let res = Object.assign({},state);
  90. res.editClear = false;
  91. const mainIds = action.info.mainIds;
  92. res.symptomIds = JSON.parse(JSON.stringify(mainIds));
  93. const num = action.info.num;//点击了几次添加病情变化
  94. const symptomFeature = action.info.symptomFeature;//分词
  95. let useEmpty,mainData;
  96. let mainModleData = JSON.parse(JSON.stringify(action.info.mainData));//主诉模板数据
  97. let moduleData = JSON.parse(JSON.stringify(res.moduleData));//现病史模板
  98. let current = JSON.parse(JSON.stringify(moduleData));
  99. let newMain = [];
  100. let mainLabelModule = res.mainLabelModule;//主诉选中的症状id获取到的尾巴
  101. let mainLabelModuleArr = [];
  102. if(mainLabelModule){
  103. let keyArr = Object.keys(mainLabelModule);
  104. for(let i=0; i<keyArr.length; i++){
  105. mainLabelModuleArr.push(mainLabelModule[JSON.parse(keyArr[i])]);
  106. }
  107. }
  108. // 是否使用空模板:num=0时判断mainIds,num>=1,截取第一病程遍历是否有症状exist
  109. if(num==0){
  110. useEmpty = mainIds.length>0 ? false:true;
  111. mainData = mainModleData;
  112. }else{
  113. // 模板也分词时得加上分词结果的判断
  114. let sliceIdx;
  115. for(let j=0; j<mainModleData.length; j++){
  116. if(mainModleData[j].pos==1){
  117. sliceIdx = j;
  118. break;
  119. }
  120. }
  121. mainData = mainModleData.slice(0,sliceIdx);//截取第一病程
  122. let existData = mainData.filter((item)=>{
  123. return item.exist;
  124. })
  125. useEmpty = existData&&existData.length>0?false:true;
  126. }
  127. if (useEmpty) {
  128. const data = res.emptyData?JSON.parse(JSON.stringify(res.emptyData)):[];
  129. res.data = fullfillText(data).newArr;
  130. res.useEmpty = true; //取子模板标识
  131. } else {
  132. if(mainData&&mainData.length>0){//主诉使用模板
  133. // 目前只需要将第一个主诉病程移植到现病史
  134. let tongYong = "";
  135. let main = [];//主症状
  136. let withs = [];//伴随
  137. let firstT = 0;
  138. mainData.map((v,i)=>{
  139. // 主诉通用症状描述
  140. // if(v.id==config.tongYId && v.value && !v.pos){tongYong = v.value;}
  141. // id会改变,故通过打标来获取flag=5
  142. if(v.flag==5 && v.value && !v.pos){tongYong = v.value;}
  143. if(v.exist){v.exist==1?main.push(v):withs.push(v)}
  144. // 时间单位
  145. if(v.controlType==5&&v.value){
  146. firstT++;
  147. current.map((it,ii)=>{
  148. if(it.id==v.id&& firstT==1){it.value=v.value}
  149. })
  150. }
  151. })
  152. // 主症状添加tongYong标签选中文字
  153. let mainCopy = JSON.parse(JSON.stringify(main));
  154. let manInput = [];
  155. // 去掉主诉添加的顿号
  156. mainCopy.map((ele,ind)=>{
  157. if(tongYong){
  158. ele.name = tongYong + (ele.name).replace('、',"");
  159. ele.value = tongYong + (ele.value).replace('、',"");
  160. }else{
  161. ele.name = (ele.name).replace('、',"");
  162. ele.value = (ele.value).replace('、',"");
  163. }
  164. //查询是否有手动输入--输入的内容放到最后(3-27)
  165. if(ele.name != ele.value){
  166. const inputText = ele.value.replace(ele.name,"");
  167. const textObj = Object.assign({},JSON.parse(config.textLabel),{name:inputText});
  168. if(config.textReg.test(inputText)){//包含中英文或数字->即不全是标点符号才插入
  169. manInput.push(textObj);
  170. }
  171. ele.value = ele.name;
  172. }
  173. })
  174. // 将ids接口获取到的模板匹配到对应主症状后面
  175. // 主症状
  176. let newMainCopy = JSON.parse(JSON.stringify(mainCopy));
  177. let ind = 0;
  178. let insertInd = 0;
  179. let lengArr=[];
  180. mainCopy.map((it,ii)=>{
  181. mainLabelModuleArr.map((v,i)=>{
  182. if(it.id==v.id){
  183. ind++;
  184. let items = v.questionMapping.filter((item)=>{
  185. return item.symptomType==0||item.symptomType==1;
  186. })
  187. lengArr[ii] = items.length; //每一个主诉尾巴长度
  188. if(items.length==0){//没有尾巴时给症状后加逗号(3.5)
  189. newMainCopy.map((el,ind)=>{
  190. if(el.id==it.id){
  191. el.value = el.name = (it.value||it.name)+',';
  192. }
  193. })
  194. }
  195. if(ind>1){ insertInd += lengArr[ii-1]; }
  196. newMainCopy.splice(ii+insertInd+1,0,...items);
  197. }
  198. })
  199. })
  200. // 伴随
  201. // 去掉顿号
  202. let newWiths = [];
  203. let manWithInput = [];
  204. if(withs.length>0){
  205. withs.map((v,i)=>{
  206. v.name = v.name.replace('、',"");
  207. v.value = v.value.replace('、',"");
  208. if(v.name != v.value){
  209. const inputText = v.value.replace(v.name,"");
  210. const textObj = Object.assign({},JSON.parse(config.textLabel),{name:inputText});
  211. if(config.textReg.test(inputText)){//包含中英文或数字->即不全是标点符号才插入
  212. manWithInput.push(textObj);
  213. }
  214. v.value = v.name;
  215. }
  216. })
  217. newWiths = JSON.parse(JSON.stringify(withs));
  218. let withInd = 0;
  219. let withInsertInd = 0;
  220. let withLengArr=[];
  221. for(let d=0; d <withs.length;d++){
  222. mainLabelModuleArr.map((v,i)=>{
  223. if(withs[d].id==v.id){
  224. withInd++;
  225. let items = v.questionMapping.filter((item)=>{
  226. return item.symptomType==0||item.symptomType==2;
  227. })
  228. withLengArr[d] = items.length;
  229. if(items.length==0){//没有尾巴时给症状后加逗号(3.5)
  230. newWiths.map((it,ind)=>{
  231. if(it.id==withs[d].id){
  232. it.value = it.name = (withs[d].value||withs[d].name)+',';
  233. }
  234. })
  235. }
  236. if(withInd>1){
  237. withInsertInd += withLengArr[d-1];
  238. }
  239. newWiths.splice(d+withInsertInd+1,0,...items);
  240. }
  241. })
  242. }
  243. }
  244. let symptomArr = newMainCopy.concat(manInput,newWiths,manWithInput);
  245. let newSymptomArr = formatContinueDots(JSON.parse(JSON.stringify(symptomArr))); //过滤连续标点
  246. //组装好的主症状和伴随症状插入现病史模板(flag=4前)--现病史是否有模板
  247. if(moduleData&&moduleData.length>0){
  248. let insertIdx = null;
  249. for(let j=0; j<current.length; j++){
  250. if(current[j].flag && current[j].flag==4){
  251. insertIdx = j;
  252. }
  253. }
  254. for(let k=0; k<newSymptomArr.length; k++){
  255. let pos = insertIdx+k;
  256. current.splice(pos,0,newSymptomArr[k]);
  257. }
  258. }else{//现病史没有模板
  259. current = newSymptomArr;
  260. }
  261. let currentData = JSON.parse(JSON.stringify(current));
  262. res.data = fullfillText(currentData).newArr;
  263. }else{//分词
  264. if(symptomFeature&&symptomFeature.length>0){
  265. let featureData = JSON.parse(JSON.stringify(symptomFeature));
  266. let ind = 0;
  267. let insertInd = 0;
  268. let lengArr=[];
  269. for(let k=0; k <symptomFeature.length;k++){
  270. mainLabelModuleArr.map((v,i)=>{
  271. if(symptomFeature[k].id==v.id){
  272. ind++;
  273. let items = v.questionMapping&&v.questionMapping.filter((item)=>{
  274. return item.symptomType==0||item.symptomType==1;
  275. })
  276. lengArr[k] = items.length; //每一个主诉尾巴长度
  277. if(items&&items.length==0){//没有尾巴时给症状后加逗号(3.5)
  278. featureData.map((ele,ind)=>{
  279. if(ele.id==symptomFeature[k].id){
  280. ele.value = ele.name = (symptomFeature[k].value||symptomFeature[k].name)+',';
  281. }
  282. })
  283. }
  284. if(ind>1){
  285. insertInd += lengArr[k-1];
  286. }
  287. featureData.splice(k+insertInd+1,0,...items);
  288. }
  289. })
  290. }
  291. //组装好的主症状和伴随症状插入现病史模板(flag=4前)
  292. let endFeatureData = JSON.parse(JSON.stringify(featureData));
  293. if(moduleData&&moduleData.length>0){
  294. let insertIdx = null;
  295. for(let j=0; j<current.length; j++){
  296. if(current[j].flag && current[j].flag==4){
  297. insertIdx = j;
  298. }
  299. }
  300. for(let k=0; k<endFeatureData.length; k++){
  301. let pos = insertIdx+k;
  302. current.splice(pos,0,endFeatureData[k]);
  303. }
  304. }else{//现病史没有模板
  305. current = endFeatureData;
  306. }
  307. let currentData = JSON.parse(JSON.stringify(current));
  308. res.data = fullfillText(currentData).newArr;
  309. }
  310. }
  311. }
  312. let resData = JSON.parse(JSON.stringify(res.data));
  313. res.saveText = fullfillText(resData).saveText;
  314. res.update=Math.random();
  315. return res;
  316. }
  317. function getLabel(lid,lname){
  318. return {id:lid,name:lname,value:lname,tagType:config.tagType}
  319. }
  320. // 多选展开确定事件--主、伴、无
  321. export const confirm = (state,action) =>{
  322. let res = Object.assign({},state);
  323. let length1 = res.data.length;
  324. let arr = JSON.parse(JSON.stringify(res.data));
  325. const {nones,exists,withs,ikey,exclusion,excluName,ban,noneIds} = action.data;
  326. let existConpId = [];
  327. let withConpId = [];
  328. exists.map((v,i)=>{
  329. existConpId.push(v.conceptId);
  330. })
  331. withs.map((v,i)=>{
  332. withConpId.push(v.conceptId);
  333. })
  334. res.symptomIds = res.symptomIds.concat(existConpId,withConpId,noneIds);//搜索去重
  335. // 伴 标签
  336. const banText = JSON.stringify(ban)=='{}'?'':{id:ban.id,name:ban.name,value:ban.name,tagType:config.tagType};
  337. // 处理主症状标签及尾巴展开symptomType=1
  338. if(exists && exists.length>0){
  339. let tempArr = [];
  340. for(let i=0;i<exists.length; i++){
  341. tempArr.push(getLabel(exists[i].id,exists[i].questionMapping && exists[i].questionMapping.length==0?exists[i].name+',':exists[i].name),...(exists[i].questionMapping && exists[i].questionMapping.filter((item)=>{return item.symptomType==0||item.symptomType==1;})));
  342. }
  343. arr.splice(ikey,0,...tempArr);
  344. }
  345. let length = arr.length - length1;
  346. let withsArr = JSON.parse(JSON.stringify(arr));
  347. // 伴 伴随症状标签及尾巴展开symptomType=2
  348. if(withs && withs.length>0){
  349. let tempArr = [];
  350. for(let i=0;i<withs.length; i++){
  351. tempArr.push(banText,getLabel(withs[i].id,withs[i].questionMapping && withs[i].questionMapping.length==0?(withs[i].name+','):(withs[i].name)),...(withs[i].questionMapping&&withs[i].questionMapping.length>0?withs[i].questionMapping.filter((item)=>{return item.symptomType==0||item.symptomType==2;}):[]));
  352. }
  353. withsArr.splice(parseInt(ikey)+length,0,...tempArr);
  354. }
  355. // 无 不用展开
  356. let lengthN = withsArr.length - length1;
  357. let noneArr = JSON.parse(JSON.stringify(withsArr));
  358. if(nones.length>1){//只点无不上去
  359. const nonesName = nones.slice(0,nones.length-1)+',';
  360. const noneObj = Object.assign({},JSON.parse(config.textLabel),{name:nonesName,value:nonesName});
  361. const none = nones?noneObj:'';
  362. noneArr.splice(parseInt(ikey)+lengthN,0,none);
  363. }
  364. let resData = JSON.parse(JSON.stringify(noneArr));
  365. // res.data = resData;
  366. res.data = fullfillText(resData).newArr;
  367. res.saveText = fullfillText(resData).saveText;
  368. res.update=Math.random();
  369. return res;
  370. };
  371. //普通多选确定事件-主诉通用特征、初为后为等
  372. export const setCheckBox = (state,action)=>{
  373. const res = Object.assign({},state);
  374. const {labelInx,excluName,existsName,nones,withsName,ban} = action.data;
  375. // 若每个选项都有符号,去掉最后一个,因与标签间的符号有冲突
  376. let showText = (excluName||'')+(existsName||'')+(ban.name||'')+(withsName||'')+(nones&&nones.replace('、','')||'');
  377. let pattern = new RegExp(/\,+$|\,+$|\.+$|\。+$|\、+$/);//+ 一次或多次
  378. if(pattern.test(showText)){
  379. showText = showText.substr(0,showText.length-1);
  380. }
  381. res.data[labelInx].value = showText;
  382. res.saveText[labelInx] = showText;
  383. res.selecteds[labelInx] = action.data;
  384. res.update=Math.random();
  385. return res;
  386. }
  387. //数字键盘选中事件
  388. export function setNumberValue(state,action){
  389. let res = Object.assign({},state);
  390. const param = action.params;
  391. const index = param.ikey;
  392. let labelInx = getLabelIndex(index);
  393. const subInx = index.split("-")[2];
  394. let item = res.data[labelInx];
  395. // if(param.text.trim()){
  396. if(+item.tagType===1){
  397. item.value = param.text;
  398. res.saveText[labelInx] = param.text?item.labelPrefix+param.text+item.labelSuffix:'';
  399. }else{
  400. item.questionMapping[subInx].value = param.text;
  401. let hasValue = false;
  402. const sub = item.questionMapping.map((it)=>{
  403. if(it.value){ //至少有一个子值才黑显
  404. hasValue = true;
  405. }
  406. return (it.labelPrefix||'')+(it.value||'')+(it.labelSuffix||'');
  407. });
  408. // res.saveText[labelInx] = sub.join(',');
  409. res.saveText[labelInx] = hasValue?sub.join(''):'';
  410. item.value = sub.join('');
  411. }
  412. /*}else{//删除完标签内容则删除该标签
  413. res.data.splice(labelInx,1);
  414. res.saveText = fullfillText(res.data).saveText;
  415. }*/
  416. res.update = Math.random();
  417. return res;
  418. }
  419. //单选下拉选中
  420. export function setRadioValue(state,action){
  421. let res = Object.assign({},state);
  422. const {ikey,id,text} = action;
  423. let labelInx = getLabelIndex(ikey);
  424. const subInx = ikey.split("-")[2];
  425. let item = res.data[labelInx];
  426. if(typeof text != 'string'){ //需要展开项--有无治疗类型
  427. const len = +item.copyType === 0?1:0;
  428. res.data.splice(labelInx,len,text);
  429. return res;
  430. }
  431. if(+item.tagType===1){
  432. item.value = text;
  433. res.saveText[labelInx] = item.labelPrefix+text+item.labelSuffix;
  434. const exist = JSON.parse(localStorage.getItem('radio'+item.id)||null);
  435. if(exist){ //选中状态处理
  436. exist[0].selected=exist[0].id==id;
  437. localStorage.setItem('radio'+item.id,JSON.stringify(exist));
  438. }
  439. item.questionDetailList.map((its)=>{
  440. if(its.id === id){
  441. its.selected = true;
  442. }else{
  443. its.selected = false;
  444. }
  445. });
  446. }else{
  447. item.questionMapping[subInx].value = text;
  448. /*if(item.questionMapping[subInx].controlType==1){//例如:有无治疗-未经治疗
  449. item.value = text;
  450. }else{
  451. item.questionMapping[subInx].value = text;
  452. }*/
  453. let hasValue = false;
  454. const sub = item.questionMapping.map((it)=>{
  455. //添加选中状态
  456. it.questionDetailList.map((its)=>{
  457. if(its.id === id){
  458. its.selected = true;
  459. }else{
  460. its.selected = false;
  461. }
  462. });
  463. if(it.value){ //至少有一个子值才黑显
  464. hasValue = true;
  465. }
  466. return (it.labelPrefix||'')+(it.value||'')+(it.labelSuffix||'');
  467. });
  468. res.saveText[labelInx] = hasValue?sub.join(''):'';
  469. }
  470. res.update = Math.random();
  471. return res;
  472. }
  473. //单选带输入值保存
  474. export const setRadioInputValue = (state,action)=>{
  475. const res = Object.assign({},state);
  476. const {ikey,values,id} = action.data;
  477. let index = getLabelIndex(ikey);
  478. let innerInx = ikey.split("-")[2];
  479. let item = res.data[index];
  480. if(item.tagType!=1){ //在组合项中
  481. item = res.data[index].questionMapping[innerInx];
  482. }
  483. let str='',temp='',obj=item.questionDetailList;
  484. if(!values){ //清空
  485. let sld=obj.find((item)=>{
  486. return item.selected==true;
  487. });
  488. sld?sld.selected=false:'';
  489. item.vals = null;
  490. item.value = '';
  491. if(res.data[index].tagType!=1){
  492. let hasValue = false;
  493. const sub = res.data[index].questionMapping.map((it)=>{
  494. if(it.value){ //至少有一个子值才黑显
  495. hasValue = true;
  496. }
  497. return (it.labelPrefix||'')+(it.value||'')+(it.labelSuffix||'');
  498. });
  499. res.saveText[index] = hasValue?sub.join(''):'';
  500. }else{
  501. res.saveText[index] = '';
  502. }
  503. res.update = Math.random();
  504. return res;
  505. }
  506. for(let i in values){
  507. temp = values[i];
  508. if(typeof temp=='object'){
  509. str+=temp.value;
  510. }else{
  511. str+=temp;
  512. }
  513. }
  514. //选中状态
  515. if(id){
  516. obj.map((its)=>{
  517. if(its.id === id){
  518. its.selected = true;
  519. }else{
  520. its.selected = false;
  521. }
  522. });
  523. }
  524. item.vals = values;
  525. item.value = str;
  526. if(res.data[index].tagType!=1){
  527. let hasValue = false;
  528. const sub = res.data[index].questionMapping.map((it)=>{
  529. return (it.labelPrefix||'')+(it.value||'')+(it.labelSuffix||'');
  530. });
  531. res.saveText[index] = sub.join('');
  532. }else {
  533. res.saveText[index] = str;
  534. }
  535. res.update = Math.random();
  536. return res;
  537. }
  538. //双击标签输入改变值
  539. export const changeLabelVal = (state,action)=>{
  540. const res = Object.assign({},state);
  541. const {changeVal,totalVal,ikey,prefix,suffix} = action.data;
  542. const index = ikey;
  543. const newVal = changeVal;
  544. let labText = totalVal?totalVal:newVal;
  545. let item = res.data[index];
  546. const next = res.data[+index+1];
  547. let nextVal='',nextIsDot=false;
  548. if(next){
  549. nextVal = next.value||next.name;
  550. //标签后是不是标点符号标签,是的话删除本标签时一起删除
  551. nextIsDot = +next.tagType===8&&!nextVal.match(config.punctuationReg);
  552. }
  553. if(labText.trim()){
  554. if(item){
  555. item.value = newVal;
  556. const canAdd=hasNoSame(item.questionDetailList,labText);
  557. //单选双击编辑的内容自动加到下拉选项中,双击编辑但未修改不添加
  558. if(canAdd&&+item.tagType===1&&(+item.controlType===1||+item.controlType===0)){
  559. const li = {
  560. id:-Math.floor(Math.random()*1000),
  561. name:labText,
  562. questionId:item.id,
  563. orderNo:0,
  564. code:0,
  565. defaultSelect:"0",
  566. remark:null,
  567. abnormal:0,
  568. selected:true
  569. };
  570. const exist = JSON.parse(localStorage.getItem('radio'+item.id)||null);
  571. //console.log(exist)
  572. if(exist&&typeof exist=='object'){ //已添加过编辑的数据
  573. //exist.push(li);
  574. exist[0]=li; //暂限添1条
  575. localStorage.setItem('radio'+item.id,JSON.stringify(exist));
  576. }else{
  577. localStorage.setItem('radio'+item.id,JSON.stringify([li]));
  578. }
  579. //取消原选中状态
  580. const seld = item.questionDetailList.find((it)=>it.selected==true);
  581. if(seld){
  582. seld.selected=false;
  583. }
  584. }
  585. item.labelPrefix = prefix||'';
  586. item.labelSuffix = suffix||'';
  587. res.saveText[index] = labText;
  588. }
  589. }else{//删除完标签内容则删除该标签
  590. const num = nextIsDot?2:1;
  591. res.data.splice(index,num);
  592. res.saveText.splice(index,num);
  593. // res.saveText = fullfillText(res.data).saveText;
  594. }
  595. res.update = Math.random();
  596. return res;
  597. }
  598. function hasNoSame(arr,text){
  599. return arr.findIndex((it)=>text==it.name)==-1;
  600. }
  601. // 数字键盘较特殊,有直接输入
  602. export const changeNumLabelVal = (state,action)=>{
  603. const res = Object.assign({},state);
  604. const {changeVal,totalVal,ikey,prefix,suffix} = action.data;
  605. const index = ikey;
  606. const newVal = changeVal;
  607. let item = res.data[index];
  608. const next = res.data[+index+1];
  609. const next2 = res.data[+index + 2];
  610. const nextVal = next.value||next.name;
  611. //下一个非文本标签是数字组件
  612. const next2IsNum = +next2.tagType === 1 && +next2.controlType === 7;
  613. //标签后是不是标点符号标签,是的话删除本标签时一起删除
  614. let nextIsDot = +next.tagType===8&&!nextVal.match(config.punctuationReg);
  615. // let labText = totalVal?totalVal:newVal; //如单选没有前后缀
  616. if(totalVal.trim()){
  617. if(item){
  618. item.value = newVal;
  619. item.labelPrefix = prefix||'';
  620. item.labelSuffix = suffix||'';
  621. }
  622. res.saveText[index] = totalVal;
  623. }else{//删除完标签内容则删除该标签
  624. let num = nextIsDot ? 2 : 1;
  625. if (nextIsDot && next2IsNum) { //解决连续2个相同的数字组件删除第一个,第二个显示异常bug--临时方案
  626. next.value = '';
  627. num = 1;
  628. }
  629. res.data.splice(index,num);
  630. res.saveText.splice(index,num);
  631. // res.saveText = fullfillText(res.data).saveText;
  632. }
  633. res.update = Math.random();
  634. return res;
  635. }
  636. export const clearCurrentIll = (state,action)=>{
  637. const res = Object.assign({},state);
  638. res.data = action.data;
  639. res.saveText = action.saveText;
  640. res.selecteds = action.selecteds?action.selecteds:[];
  641. res.symptomIds = action.symptomIds;
  642. res.currReadSonM = action.currReadSonM||[];
  643. if(action.editClear){
  644. res.editClear = action.editClear;
  645. }
  646. if(res.data.length>0){
  647. res.editClear = false;
  648. }
  649. res.update = Math.random();
  650. return res;
  651. }
  652. //文本模式下值保存
  653. export const setTextModeValue = (state,action)=>{
  654. const res = Object.assign({},state);
  655. res.saveText[0] = action.text;
  656. return res;
  657. };
  658. //获取大数据推送症状
  659. export const bigDataSymptom = (state,action) => {
  660. const res = Object.assign({},state);
  661. res.bigDataSymptom = action.data;//推送数据
  662. let inlineDatas = res.data;
  663. const index = action.info.ikey;
  664. let labelInx = getLabelIndex(index);
  665. // 添加症状 暂时剔除没有id、questionMapping字段的数据
  666. let pushDataList = action.data;
  667. /*let pushDataList = action.data.filter(function(item){
  668. return item.id
  669. });*/
  670. let dataList = inlineDatas[labelInx].questionMapping;
  671. for(let k=0; k<dataList.length; k++){
  672. if(dataList[k].controlType == 99){
  673. dataList[k].questionDetailList = pushDataList;
  674. }
  675. }
  676. res.update = Math.random();
  677. return res;
  678. }
  679. //自由文本
  680. export function setCheckText(state,action) {
  681. let res = Object.assign({},state);
  682. const {i,text} = action;
  683. if(res.data[i]){
  684. res.data[i].value=text;
  685. //res.data[i].name=''; //默认显示的文字
  686. }
  687. res.saveText[i] = text;
  688. res.update = Math.random();
  689. return res;
  690. }
  691. //搜索 插入标签数据
  692. export function insertLabelData(state,action){
  693. let res = Object.assign({},state);
  694. const {index,data,isReplace,span,conceptId}=action;
  695. let id = data.id;
  696. let searchData = action.name;
  697. // res.symptomIds.push(id);
  698. // const text = Object.assign(JSON.parse(config.textLabel),{name:searchData},{id:id});
  699. const text = Object.assign(JSON.parse(config.textLabel),{name:searchData},{id:id},{conceptId:conceptId});
  700. const textEmpty = Object.assign({},JSON.parse(config.textLabel));
  701. let focusIndex = res.focusIndex;
  702. let saveText = res.saveText;
  703. let banIdx = saveText.indexOf("伴");
  704. //伴随展开数据-过滤了连续标点
  705. const FilteredDotMapping2=formatContinueDots(data.questionMapping.filter((item)=>{
  706. return item.symptomType==0||item.symptomType==2;
  707. }));
  708. //主症状展开数据-过滤连续了标点
  709. const FilteredDotMapping1=formatContinueDots(data.questionMapping.filter((item)=>{
  710. return item.symptomType==0||item.symptomType==1;
  711. }));
  712. if(isReplace){
  713. span.current.innerText?(span.current.innerText = ''):(span.current.innerHTML = '');
  714. // res.data.splice(focusIndex,1,text,data);
  715. // 搜索结果展开伴随symptomType==2的尾巴
  716. let resData = JSON.parse(JSON.stringify(res.data));
  717. resData.splice(focusIndex,1,text,...(FilteredDotMapping2));
  718. res.data = fullfillText(resData).newArr;
  719. res.saveText = fullfillText(res.data).saveText;
  720. }else{
  721. let resData;
  722. const searchStr = res.searchStr;
  723. let innerText = span.current.innerText || span.current.innerHTML;
  724. let strIndex = innerText.indexOf(searchStr);
  725. const value = innerText.replace(searchStr,"");
  726. const pText = Object.assign({},textEmpty,{value:value});
  727. if(data.itemType==0){//症状
  728. // res.symptomIds.push(id);
  729. res.symptomIds.push(conceptId);
  730. // 没有伴展开主诉symptomType=0/1的尾巴,有伴一>第一个点选上去的伴为依据,伴前展开主诉,伴后展开伴随;多余的伴以及手动输入的伴不做处理(2-25)
  731. if(banIdx==-1){
  732. // if(strIndex <= 1){//前
  733. if(strIndex < 1){//前
  734. res.data.splice(index,1,text,...(FilteredDotMapping1),pText);
  735. res.saveText = fullfillText(res.data).saveText;
  736. res.selecteds.splice(index,1,null,...new Array(FilteredDotMapping1.length).fill(null),null);
  737. }else{
  738. res.data.splice(index,1,pText,text,...(FilteredDotMapping1));
  739. res.saveText = fullfillText(res.data).saveText;
  740. res.selecteds.splice(index,1,null,null,...new Array(FilteredDotMapping1.length).fill(null));
  741. }
  742. }else{
  743. if(focusIndex > banIdx){//伴后
  744. if(strIndex < 1){//前
  745. res.data.splice(index,1,text,...(FilteredDotMapping2),pText);
  746. res.saveText = fullfillText(res.data).saveText;
  747. res.selecteds.splice(index,1,null,...new Array(FilteredDotMapping2.length).fill(null),null);
  748. }else{
  749. res.data.splice(index,1,pText,text,...(FilteredDotMapping2));
  750. res.saveText = fullfillText(res.data).saveText;
  751. res.selecteds.splice(index,1,null,null,...new Array(FilteredDotMapping2.length).fill(null));
  752. }
  753. }else{//伴前
  754. if(strIndex < 1){//前
  755. res.data.splice(index,1,text,...(FilteredDotMapping1),pText);
  756. res.saveText = fullfillText(res.data).saveText;
  757. res.selecteds.splice(index,1,null,...new Array(FilteredDotMapping1.length).fill(null),null);
  758. }else{
  759. res.data.splice(index,1,pText,text,...(FilteredDotMapping1));
  760. res.saveText = fullfillText(res.data).saveText;
  761. res.selecteds.splice(index,1,null,null,...new Array(FilteredDotMapping1.length).fill(null));
  762. }
  763. }
  764. }
  765. res.data = fullfillText(res.data).newArr;
  766. res.saveText = fullfillText(res.data).saveText;
  767. }else{//标签
  768. const arr=fullfillText(data.questionMapping).newArr; //过滤连续标点
  769. const spreadLabels = data.tagType==4?formatContinueDots(arr):[data];
  770. if(strIndex < 1){//前
  771. // 判断前一个是否为文本标签,是直接插入标签,不是则在前面插入一个空文本标签
  772. const preItem = res.data[index-1];
  773. if(preItem&&preItem.tagType==8){
  774. res.data.splice(index,1,...spreadLabels,pText);
  775. res.saveText = fullfillText(res.data).saveText;
  776. res.selecteds.splice(index,1,...new Array(spreadLabels.length).fill(null),null);
  777. }else{
  778. res.data.splice(index,1,textEmpty,...spreadLabels,pText);
  779. res.saveText = fullfillText(res.data).saveText;
  780. res.selecteds.splice(index,1,null,...new Array(spreadLabels.length).fill(null),null);
  781. }
  782. // res.data.splice(focusIndex,0,data,textEmpty);
  783. }else{
  784. // 后面插入 :判断后一个标签是否为文本标签,不是则插入一个空标签
  785. const afterItem = res.data[index+1];
  786. if(afterItem&&afterItem.tagType==8){
  787. res.data.splice(index,1,pText,...spreadLabels);
  788. res.saveText = fullfillText(res.data).saveText;
  789. res.selecteds.splice(index,1,null,...new Array(spreadLabels.length).fill(null));
  790. }else{
  791. res.data.splice(index,1,pText,...spreadLabels,textEmpty);
  792. res.saveText = fullfillText(res.data).saveText;
  793. res.selecteds.splice(index,1,null,...new Array(spreadLabels.length).fill(null),null);
  794. }
  795. }
  796. }
  797. }
  798. res.searchData = []; //选中清空搜索内容(即关闭搜索弹窗)
  799. res.update = Math.random();//console.log('现病史',res);
  800. return res;
  801. }
  802. export const clearCurrentEdit = (state,action)=>{
  803. const res = Object.assign({},state);
  804. res.editClear = action.editClear
  805. return res;
  806. }
  807. //复制标签(如血压)事件
  808. export function addLabelItem(state,action){
  809. let res = Object.assign({},state);
  810. const {data,i} = action;
  811. const textLabel = Object.assign({},JSON.parse(config._textLabel),{showInCheck:JSON.parse(data).showInCheck});
  812. //使用Object.assign({},data)拷贝操作时复制项和原项会同步修改
  813. if(!data) return res;
  814. res.data.splice(+i+2,0,JSON.parse(data),textLabel);
  815. res.saveText.splice(+i+2,0,'','');
  816. res.selecteds.splice(+i+2,0,null,null);
  817. res.update = Math.random();
  818. return res;
  819. }
  820. //文本输入标签
  821. export function setInputLabel(state,action){
  822. let res = Object.assign({},state);
  823. const {i,text,prefix,suffix,subIndex,total} = action;
  824. const item = res.data[i];
  825. if(+item.tagType===3){ //multSpred标签
  826. item.questionMapping[subIndex].value = text;
  827. let texts = item.questionMapping.map((it)=>{
  828. return it.value?(it.labelPrefix||'')+(it.value||'')+(it.labelSuffix||''):'';
  829. });
  830. res.saveText[i] = texts.join('');
  831. res.update = Math.random();
  832. return res;
  833. }else{
  834. if(item){
  835. item.value=text;
  836. res.saveText[i] = (prefix ||'')+ text + (suffix||'');
  837. }else if(!total){//整个标签内容完全删除
  838. res.data.splice(i,1);
  839. res.saveText.splice(i,1);
  840. }
  841. }
  842. res.update = Math.random();//console.log(888,res,action)
  843. return res;
  844. }
  845. // backspace删除
  846. export function backspaceText(state,action){
  847. let res = Object.assign({},state);
  848. const {delIndex,text,flag} = action;
  849. const data = res.data;
  850. // if(data[delIndex-1].tagType==8 ||data[delIndex-1].flag&&data[delIndex-1].flag==3){
  851. if(flag == 'backsp'){
  852. // 前一个是文本标签或者子模板,只改变值
  853. if(data[delIndex-1].flag&&data[delIndex-1].flag==3){//子模板不删
  854. // data[delIndex].value = text;
  855. }else if(data[delIndex-1].tagType==8){
  856. data.splice(delIndex,1);
  857. res.selecteds.splice(delIndex,1); //杂音类样式选中状态对应
  858. res.saveText.splice(delIndex,1);
  859. }
  860. else{
  861. data.splice(delIndex-1,2);
  862. res.selecteds.splice(delIndex-1,2);
  863. res.saveText.splice(delIndex-1,2);
  864. }
  865. }else if(flag == 'del'){
  866. if(data[delIndex+1] && data[delIndex+1].flag&&data[delIndex+1].flag==3){//子模板不删
  867. }else if(data[delIndex+1] && data[delIndex+1].tagType==8){
  868. data.splice(delIndex,1);
  869. res.selecteds.splice(delIndex,1); //杂音类样式选中状态对应
  870. res.saveText.splice(delIndex,1);
  871. }
  872. else{
  873. data.splice(delIndex,2);
  874. res.selecteds.splice(delIndex,2);
  875. res.saveText.splice(delIndex,2);
  876. }
  877. }
  878. // res.saveText = fullfillText(data).saveText;
  879. res.update = Math.random();
  880. return res;
  881. }
  882. //删除后移除id
  883. export function removeId(state,action){
  884. let res = Object.assign({},state);
  885. const {index,text,flag} = action;
  886. const data = res.data;
  887. // const id = data[index].id;
  888. const id = data[index].conceptId;
  889. let ids = res.symptomIds;
  890. if(ids.includes(id)){
  891. ids.splice(ids.indexOf(id),1);
  892. }
  893. if(flag == 'del'){
  894. if(!data[index].value && data[index+1] && data[index+1].tagType==8){
  895. data.splice(index,1);
  896. res.saveText.splice(index,1);
  897. }else{
  898. data[index].id = "";
  899. data[index].conceptId = "";
  900. data[index].name = text;
  901. data[index].value = text;
  902. }
  903. }else{
  904. if(!data[index].value && data[index-1].tagType==8){
  905. data.splice(index,1);
  906. res.saveText.splice(index,1);
  907. }else{
  908. data[index].id = "";
  909. data[index].conceptId = "";
  910. data[index].name = text;
  911. data[index].value = text;
  912. }
  913. }
  914. res.update = Math.random();
  915. return res;
  916. }
  917. // 单列多选
  918. export function multipleComfirn(state,action){
  919. let res = Object.assign({},state);
  920. const {ikey,seleData,fullIkey} = action.data;
  921. let data = res.data;
  922. let index = fullIkey.split("-")[2];
  923. if(data[ikey].tagType==3){ //在组合项中
  924. let item = data[ikey].questionMapping;
  925. let arr=[];
  926. item[index].value = seleData;
  927. item.map((it)=>{
  928. if(it.value){
  929. arr.push(it.labelPrefix+it.value+it.labelSuffix);
  930. }
  931. });
  932. res.saveText[ikey] = arr.join("");
  933. res.update = Math.random();
  934. res.selecteds[ikey] = {[index]:action.data};
  935. return res;
  936. }
  937. data[ikey].value = seleData;
  938. res.saveText[ikey] = seleData;
  939. res.selecteds[ikey] = action.data;
  940. return res;
  941. }
  942. export function delSingleLable(state,action){
  943. let res = Object.assign({},state);
  944. const {index} = action;
  945. let data = res.data;
  946. // 前一个不是文本标签 并且不是子模板,则删除
  947. if(data[index-1].flag&&data[index-1].flag==3){
  948. }
  949. else if(data[index-1].tagType != 8){
  950. data.splice(index-1,1);
  951. res.saveText.splice(index-1,1);
  952. }
  953. res.update = Math.random();
  954. return res;
  955. }