import config from '@config/index.js'; import {formatContinueDots,getLabelIndex,checkFullfillText,handleLocalDelTag,shiftLocalDelTag} from '@utils/tools.js'; export function preSetCheckbody(state,action) { let res = Object.assign({},state); const {data} = action; res.preData = data; return res; } //设置查体数据 export function set(state,action){ let res = Object.assign({},state); const {data,isText,isEmpty} = action; if(isText){ //查体只显示文本时(引用预问诊) const label = Object.assign(JSON.parse(config.textLabel),{value:data,noSearch:true}); res.data = [label]; res.saveText = [data]; res.showAll = true; res.update = Math.random(); res.isEmpty = isEmpty; return res; } const obj = checkFullfillText(data); res.data = obj.newArr; res.saveText = obj.saveText;//存逗号 res.showAll = obj.checkHiddenDefault; res.update = Math.random(); res.isEmpty = isEmpty; return res; } //多选标签选中确定处理 export const confirm = (state,action) =>{ let res = Object.assign({},state); let arr = res.data; const {nones,exists,withs,ikey,exclusion,excluName,copyType} = action.data; const items = [...exists||[],...withs||[]]; if((!exists||!withs||items.length==0)&&!nones&&!exclusion){ //取消无殊的选中,空白提交 arr[ikey].value = ''; res.saveText[ikey] = ''; res.selecteds.splice(ikey,1); res.update=Math.random(); return res; } //选中互斥项 if(exclusion){ arr[ikey].value = excluName; res.saveText[ikey] = excluName; res.selecteds[ikey] = action.data; res.update=Math.random(); return res; } //只有无的项目选中 if(+copyType===0) { //原标签保留 arr.splice(ikey,1); } if(arr[ikey].value) arr[ikey].value= ''; let preText = arr[ikey-1].value!==undefined?arr[ikey-1].value:arr[ikey-1].name||''; let newPreText =preText +nones;//console.log(arr[ikey-1],newPreText) if(items.length==0&&nones){ arr[ikey-1].value = newPreText; res.saveText[ikey-1] = newPreText; res.selecteds[ikey] = null; //无殊选中状态遗留bug修改 res.update=Math.random(); return res; } //有,伴,无随配 //arr.splice(ikey-1,1); let flabel = items[items.length-1]; //要插入的最后一个标签 let labelText = flabel.value!==undefined?flabel.value:flabel.name; let text = labelText; //要插入的最后一个标签为自由文本,则和后面的文本标签文字合并 if(flabel.tagType==8){ flabel.value = labelText+nones; text = flabel.value; } arr.splice(ikey,0,...exists,...withs); //arr[ikey-1].value = text; //res.saveText[ikey+items.length] = text; res.saveText = checkFullfillText(arr).saveText; res.update=Math.random(); //用于触发组件更新(data变化了因在对象中无法被组件检测到) return res; }; //查体中数字键盘选中事件 export function setNumberValue(state,action){ let res = Object.assign({},state); const param = action.params; const ikey = param.ikey; let labelInx = getLabelIndex(ikey); // const subInx = ikey.substr(ikey.length-1); const subInx = ikey.split("-")[2]; let item = res.data[labelInx]; if(+item.tagType===1){ //独立数字键盘组件 item.value = param.text; res.saveText[labelInx] = param.text?item.labelPrefix+param.text+item.labelSuffix:''; }else{ //内嵌血压类型组件的数字键盘组件 item.questionMapping[subInx].value = param.text; let hasValue = false; const sub = item.questionMapping.map((it)=>{ if(it.value){ //至少有一个子值才黑显 hasValue = true; } if(it.tagType===8){ return it.name; }else{ if(!it.value){ return ''; } return (it.labelPrefix||'')+(it.value||'')+(it.labelSuffix||''); } }); res.saveText[labelInx] = hasValue?sub.join(''):''; } // res.saveText = fullfillText(res.data).saveText; res.update = Math.random(); return res; } //查体单选下拉选中 export function setRadioValue(state,action){ let res = Object.assign({},state); const {ikey,id,text} = action; let labelInx = getLabelIndex(ikey); const subInx = ikey.split("-")[2]; let item = res.data[labelInx]; if(typeof text != 'string'){ //需要展开项--有无治疗类型 const len = +item.copyType === 0?1:0; res.data.splice(labelInx,len,text); return res; } if(+item.tagType===1){ //独立单选组件 item.value = text; const exist = JSON.parse(localStorage.getItem('radio'+item.id)||null); if(exist){ //选中状态处理 exist[0].selected=exist[0].id==id; localStorage.setItem('radio'+item.id,JSON.stringify(exist)); } item.questionDetailList.map((its)=>{ if(its.id === id){ its.selected = true; }else{ its.selected = false; } }); res.saveText[labelInx] = text; //单选没有前后缀 }else{ //组合组件中的单选组件 item.questionMapping[subInx].value = text; let hasValue = false; const sub = item.questionMapping.map((it)=>{ //添加选中状态 it.questionDetailList.map((its)=>{ if(its.id === id){ its.selected = true; }else{ its.selected = false; } }); if(it.value){ //至少有一个子值才黑显 hasValue = true; } if(it.tagType===8){ return it.name; }else { if(!it.value){ return ''; } return (it.labelPrefix||'')+(it.value||'')+(it.labelSuffix||''); } }); res.saveText[labelInx] = hasValue?sub.join(''):''; } // res.saveText = fullfillText(res.data).saveText; res.update = Math.random(); return res; } //复制标签(如血压)事件 export function addLabelItem(state,action){ let res = Object.assign({},state); const {data,i} = action; const textLabel = Object.assign({},JSON.parse(config._textLabel),{showInCheck:JSON.parse(data).showInCheck}); //使用Object.assign({},data)拷贝操作时复制项和原项会同步修改 if(!data) return res; res.data.splice(+i+2,0,JSON.parse(data),textLabel); res.saveText.splice(+i+2,0,'',''); res.selecteds.splice(+i+2,0,null,null); res.update = Math.random(); return res; } //自由文本 export function setCheckText(state,action) { let res = Object.assign({},state); const {i,text} = action; if(res.data[i]){ res.data[i].value=text; //res.data[i].name=''; //默认显示的文字 } res.saveText[i] = text; res.update = Math.random(); return res; } //多选文字,如杂音 export function setCheckBoxValue(state,action) { let res = Object.assign({},state); const {labelInx,excluName,existsName,nones,withsName,ban} = action.data; let showText = (excluName||'')+(existsName||'')+(ban.name||'')+(withsName||'')+(nones&&nones.replace('、','')||''); // 若每个选项都有符号,去掉最后一个,因与标签间的符号有冲突 let pattern = new RegExp(/\,+$|\,+$|\.+$|\。+$|\、+$/);//+ 一次或多次 if(pattern.test(showText)){ showText = showText.substr(0,showText.length-1); } res.data[labelInx].value = showText; res.selecteds[labelInx] = action.data; res.saveText = checkFullfillText(res.data).saveText; res.update = Math.random(); return res; } //搜索结果 export function setSearchData(state,action){ let res = Object.assign({},state); res.searchData = action.data; res.searchStr = action.inpStr; res.searchInEnd = action.isEnd; return res; } //插入标签数据-搜索 export function insertLabelData(state,action){ let res = Object.assign({},state); const searchStr = res.searchStr; const {index,data,isReplace,span,searchInEnd}=action; const showText = res.saveText[index]; let tempLabels = data.tagType==4?checkFullfillText(data.questionMapping).newArr:[data]; tempLabels = formatContinueDots(tempLabels); //查体中,默认显示区域搜索出来的标签要默认显示,隐藏区域搜索出的默认隐藏 let hideAreaIndex = [...res.data].reverse().findIndex((it)=>it.showInCheck); hideAreaIndex = res.data.length-hideAreaIndex-1; //默认显示的最后一个标签的位置 const text = Object.assign({},JSON.parse(config._textLabel),{showInCheck:index>hideAreaIndex?false:true}); let spreadLabels =tempLabels.map((it)=>{ return Object.assign({},it,{showInCheck:index>hideAreaIndex?false:true}); }); let reg = searchInEnd?new RegExp(searchStr+"$"):new RegExp("^"+searchStr); const newText=showText.replace(reg,'')||''; if(!isReplace){ span.current.innerText?(span.current.innerText = newText):(span.current.innerHTML = newText); const pText = Object.assign({},text,{value:newText}); if(searchInEnd){ res.data.splice(index,1,pText,...spreadLabels,text); res.saveText = checkFullfillText(res.data).saveText; //res.saveText.splice(index,1,newText,'',''); res.selecteds.splice(index,1,null,...new Array(spreadLabels.length).fill(null),null); }else{ res.data.splice(index,1,text,...spreadLabels,pText); res.saveText = checkFullfillText(res.data).saveText; //res.saveText.splice(index,1,'','',newText); res.selecteds.splice(index,1,null,...new Array(spreadLabels.length).fill(null),null); } }else{ span.current.innerText?(span.current.innerText = ' '):(span.current.innerHTML = ' '); if(searchInEnd){ res.data.splice(index+1,0,spreadLabels,text); res.saveText.splice(index+1,0,'',''); res.selecteds.splice(index+1,0,null,null); }else{ res.data.splice(index,0,text,spreadLabels); res.saveText.splice(index,0,'',''); res.selecteds.splice(index,0,null,null); } } res.searchData = []; //选中清空搜索内容(即关闭搜索弹窗) res.update = Math.random(); return res; } export const changeLabelVal = (state,action)=>{//双击标签输入改变值 const res = Object.assign({},state); const {changeVal,totalVal,ikey,prefix,suffix} = action.data; const index = ikey; const newVal = changeVal; //下拉修改的内容 let labText = totalVal?totalVal:newVal; //如单选没有前后缀 let item = res.data[index]; const next = res.data[+index+1]; const nextVal = next.value||next.name; //标签后是不是标点符号标签,是的话删除本标签时一起删除 let nextIsDot = +next.tagType===8&&!nextVal.match(config.punctuationReg); // if(newVal && newVal.trim()){ if(labText && labText.trim()){ if(item){ item.value = newVal; const canAdd=hasNoSame(item.questionDetailList,labText); //单选双击编辑的内容自动加到下拉选项中,双击编辑但未修改不添加 if(canAdd&&+item.tagType===1&&(+item.controlType===1||+item.controlType===0)){ const li = { id:-Math.floor(Math.random()*1000), name:labText, questionId:item.id, orderNo:0, code:0, defaultSelect:"0", remark:null, abnormal:0, selected:true }; const exist = JSON.parse(localStorage.getItem('radio'+item.id)||null); //console.log(exist) if(exist&&typeof exist=='object'){ //已添加过编辑的数据 //exist.push(li); exist[0]=li; //暂限添1条 localStorage.setItem('radio'+item.id,JSON.stringify(exist)); }else{ localStorage.setItem('radio'+item.id,JSON.stringify([li])); } //取消原选中状态 item.questionDetailList.find((it)=>it.selected==true).selected=false; } item.labelPrefix = prefix||''; item.labelSuffix = suffix||''; // res.saveText[index] = totalVal; res.saveText[index] = labText; } }else{//删除完标签内容则删除该标签 const num = nextIsDot?2:1; handleLocalDelTag('4',index,res.data[index]); res.data.splice(index,num); res.selecteds.splice(index,num);//杂音类样式选中状态对应 res.saveText = checkFullfillText(res.data).saveText; } res.update = Math.random(); return res; } function hasNoSame(arr,text){ return arr.findIndex((it)=>text==it.name)==-1; } // 数字键盘较特殊,有直接输入 export const changeNumLabelVal = (state,action)=>{ const res = Object.assign({},state); const {changeVal,totalVal,ikey,prefix,suffix} = action.data; const index = ikey; const newVal = changeVal; let item = res.data[index]; const next = res.data[+index+1]; const next2 = res.data[+index + 2]; const nextVal = next.value||next.name; //下一个非文本标签是数字组件 const next2IsNum = +next2.tagType === 1 && +next2.controlType === 7; //标签后是不是标点符号标签,是的话删除本标签时一起删除 let nextIsDot = +next.tagType===8&&!nextVal.match(config.punctuationReg); if(totalVal.trim()){ if(item){ item.value = newVal; item.labelPrefix = prefix||''; item.labelSuffix = suffix||''; } if(newVal){ res.saveText[index] = totalVal; }else{ res.saveText[index] = ""; } }else{//删除完标签内容则删除该标签 let num = nextIsDot ? 2 : 1; if (nextIsDot && next2IsNum) { //解决连续2个相同的数字组件删除第一个,第二个显示异常bug--临时方案 next.value = ''; num = 1; } res.data.splice(index,num); res.selecteds.splice(index,num); //杂音类样式选中状态对应 res.saveText = checkFullfillText(res.data).saveText; } res.update = Math.random(); return res; } export function clearCheckBody(state,action){ //清空 let res = Object.assign({},state); res.data = action.data; res.preData = []; res.saveText = action.saveText; res.isEmpty = action.isEmpty; res.selecteds = action.selecteds?action.selecteds:[]; if(action.flg){res.showAll = true} return res; } //文本输入标签 export function setInputLabel(state,action){ let res = Object.assign({}, state); const {i,text,prefix,suffix,subIndex} = action; const item = res.data[i]; if(+item.tagType===3){ //multSpred标签 item.questionMapping[subIndex].value = text; let texts = item.questionMapping.map((it)=>{ if(it.tagType===8){ return it.name; }else{ return (it.labelPrefix||'')+(it.value||'')+(it.labelSuffix||''); } }); res.saveText[i] = texts.join(''); res.update = Math.random(); return res; }else{ if(item){ item.value=text; } } if(text){ res.saveText[i] = prefix+text+suffix; }else{//删除完要清空 res.saveText[i] = ""; } res.update = Math.random(); return res; } // backspace删除 export function backspaceText(state,action){ let res = Object.assign({},state); const {delIndex,flag} = action; const data = res.data; if(flag == 'backsp'){ // 前一个是文本标签或者子模板,只改变值 if(data[delIndex-1].flag&&data[delIndex-1].flag==3){//子模板不删 // data[delIndex].value = text; }else if(data[delIndex-1].tagType==8){ data.splice(delIndex,1); res.selecteds.splice(delIndex,1); //杂音类样式选中状态对应 res.saveText.splice(delIndex,1); } else{ handleLocalDelTag(4,delIndex-1,data[delIndex-1]); data.splice(delIndex-1,2); res.selecteds.splice(delIndex-1,2); res.saveText.splice(delIndex-1,2); } }else if(flag == 'del'){ if(data[delIndex+1] && data[delIndex+1].flag&&data[delIndex+1].flag==3){//子模板不删 }else if(data[delIndex+1] && data[delIndex+1].tagType==8){ data.splice(delIndex,1); res.selecteds.splice(delIndex,1); //杂音类样式选中状态对应 res.saveText.splice(delIndex,1); }else if(!data[delIndex+1]){//最后一个文本标签不删除 } else{ handleLocalDelTag(4,delIndex,data[delIndex+1]); data.splice(delIndex,2); res.selecteds.splice(delIndex,2); res.saveText.splice(delIndex,2); } } // res.saveText = fullfillText(data).saveText; res.update = Math.random(); return res; } // 单列多选 export function multipleComfirn(state,action){ let res = Object.assign({},state); const {ikey,seleData,fullIkey} = action.data; let data = res.data;//console.log(action,data[ikey]) let index = fullIkey.substr(fullIkey.length-1,1); if(data[ikey].tagType==3){ //在组合项中 let item = data[ikey].questionMapping; let arr=[]; item[index].value = seleData; item.map((it)=>{ if(it.value){ arr.push(it.labelPrefix+it.value+it.labelSuffix); } }); res.saveText[ikey] = arr.join(""); res.update = Math.random(); res.selecteds[ikey] = {[index]:action.data}; return res; } data[ikey].value = seleData; res.saveText[ikey] = seleData; res.selecteds[ikey] = action.data; res.update = Math.random(); return res; } export function delSingleLable(state,action){ let res = Object.assign({},state); const {index} = action; let data = res.data; // 前一个不是文本标签 并且不是子模板,则删除 if(data[index-1].flag&&data[index-1].flag==3){ } else if(data[index-1].tagType != 8){ data.splice(index-1,1); res.saveText.splice(index-1,1); } res.update = Math.random(); return res; } //查体推送高亮标签 export function setImportCheckbodyLabel(state,action) { let res = Object.assign({},state); res.importLabel = action.labels; res.update = Math.random(); return res; } //恢复已删除的标签 export function recoveTag(state,action) { let res = Object.assign({},state); let arr = [...res.data]; //const text = Object.assign({showInCheck:action.data.showInCheck},JSON.parse(config._textLabel)); arr.splice(action.index,0,action.data); res.data = checkFullfillText(arr).newArr; res.saveText = checkFullfillText(arr).saveText; shiftLocalDelTag(); res.update = Math.random(); return res; }