currentIll.js 35 KB

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