currentIll.js 35 KB

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