@ -8,7 +8,7 @@
< div class = "app-container" >
< el-form ref = "form" :model = "queryParams" label -width = " 80px " inline >
< el-form-item label = "仪器" prop = "yq" >
< YQSelectTable v -model :data = "queryParams. rptunitid " width = "200px" clearable @get-data-value ="getList" / >
< YQSelectTable v -model :data = "queryParams. yq " width = "200px" clearable @get-data-value ="getList" / >
< / el-form-item >
< / el-form >
< div class = "mb10" >
@ -17,124 +17,33 @@
< el-button type = "danger" @click ="handleDel" > 删除 < / el -button >
< / div >
< div style = "height: calc(100% - 110px);" >
< CustomTable ref = "customTableRef" v -model :data = "tableData" :columns = "columns" :config = "tableConfig"
@ row - click = "selectedRows = $event" >
< template # checktype = "{ row }" >
< el-select v-model = "row.checktype" placeholder="请选择" class="full-width-input" >
< el-option v-for = "item in options" :key="item.value" :label="item.label" :value="item.value" >
< / el-option >
< / el-select >
< / template >
< template # logflag = "{ row }" >
< el-switch v-model = "row.logflag" active-value="1" inactive -value = " 0 "
style = "--el-switch-on-color: #13ce66; " / >
< / template >
< template # ruledisplay = "{ row, $index }" >
< el-input v-model = "row.ruledisplay" class="full-width-input" readonly @dblclick="handleEdit(row, $index)" / >
< / template >
< template # logcontent = "{ row }" >
< el-input v-model = "row.logcontent" class="full-width-input" / >
< / template >
< template # autocheck = "{ row }" >
< el-switch v-model = "row.autocheck" active-value="1" inactive -value = " 0 "
style = "--el-switch-on-color: #13ce66; " / >
< CustomTable ref = "tableRef" v -model :data = "tableData" :columns = "columns" :config = "tableConfig" >
< template # yq = "{ row }" >
< / template >
< / CustomTable >
< / div >
< el-dialog v-model ="dialogVisible" title="组合审核条件生成导向" width="38vw" :close-on-click-modal="false" :draggable ="true" >
< el-input type = "textarea" v-model = "ruledisplayText" :rows="5" / >
< div class = "btn_text" >
< div class = "tips" > 按钮说明 : < / div >
< div >
< el-input type = "textarea" v-model = "explanation" :rows="5" / >
< / div >
< / div >
< el-row :gutter = "15" >
< el-col :span = "12" >
< el-input v-model = "searchKey" ref="searchInput" size="small" placeholder="快速搜索(支持简拼)" class="mb5" clearable
@ clear = "filterDataHandle" @ input = "filterDataHandle" / >
< CustomVxeTable ref = "tableRefs" :data = "filterData" :columns = "xmColumns" class = "mytable-style"
: scrollYConfig = "{ enabled: true, rSize: 30, height: '350', }" @ current - change = "rowHandle" / >
< / el-col >
< el-col :span = "12" >
< div class = "btns" >
< el-button @click ="btnClick('+')" > + 加 < / el -button >
< el-button @click ="btnClick('-')" > - 减 < / el -button >
< el-button @click ="btnClick('*')" > * 乘 < / el -button >
< el-button @click ="btnClick('/')" > / 除 < / el -button >
< / div >
< div class = "btns" >
< el-button @click ="btnClick('>')" > & gt ; < / el -button >
< el-button @click ="btnClick('>=')" > > = < / el-button >
< el-button @click ="btnClick('=')" > = < / el -button >
< el-button @click ="btnClick('<=')" > & lt ; = < / el -button >
< el-button @click ="btnClick('<')" > & lt ; < / el -button >
< / div >
< div class = "btns" >
< el-button @click ="btnClick('(')" > ( < / el -button >
< el-button @click ="btnClick(')')" > ) < / el -button >
< el-button @click ="btnClick('OR')" > or < / el -button >
< el-button @click ="btnClick('AND')" > and < / el -button >
< / div >
< div class = "btns" >
< el-button @click ="btnClick('[性别]')" > 性别 < / el -button >
< el-button @click ="btnClick('[年龄]')" > 年龄 < / el -button >
< el-button @click ="btnClick('[科室]')" > 科室 < / el -button >
< el-button @click ="btnClick('[诊断]')" > 诊断 < / el -button >
< / div >
< div class = "btns" >
< el-button @click ="btnClick('[病人来源]')" > 病人来源 < / el -button >
< el-button @click ="btnClick('[标本类型]')" > 标本类型 < / el -button >
< el-button @click ="btnClick('[报告单备注]')" > 报告单备注 < / el -button >
< / div >
< div class = "btns" >
< el-button @click ="btnClick('[任意项目-ID]')" > 任意项目 -ID < / el -button >
< el-button @click ="btnClick('[任意项目-数值结果]')" > 任意项目 -数值结果 < / el -button >
< / div >
< div class = "btns" >
< el-button @click ="btnClick('[任意项目-文字结果]')" > 任意项目 -文字结果 < / el -button >
< el-button @click ="btnClick('[任意项目-危急值标志]')" > 任意项目 -危急值标志 < / el -button >
< / div >
< div class = "btns" >
< el-button @click ="btnClick('[任意项目-复查标志]')" > 任意项目 -复查标志 < / el -button >
< el-button @click ="btnClick('[任意项目-结果标志]')" > 任意项目 -结果标志 < / el -button >
< / div >
< / el-col >
< / el-row >
< div slot = "footer" class = "dialog-footer" >
< el-button @ click = "dialogVisible = false" > 取 消 < / el-button >
< el-button type = "primary" @click ="subItem" > 确 定 < / el -button >
< / div >
< / el-dialog >
< / div >
< / template >
< script setup lang = "ts" >
import YQSelectTable from '@/components/SelectTable/YQSelectTable/index.vue' ;
import { queryList , updateRules , deleteRules } from '@/api/liswork/advancedReview' ;
import { ElMessage , ElMessageBox } from 'element-plus' ;
import { getFirstLetter } from '@/utils/pinyin' ;
import { queryOldxminfo } from '@/api/liswork/xtwh/xmReqItemVsApi'
import { template } from 'lodash' ;
import { templateRef } from '@vueuse/core' ;
import { queryList } from '@/api/liswork/advancedReview' ;
const queryParams = ref ( {
rptunitid : '46' ,
yq : '46' ,
} ) ;
const customTableRef = templateRef ( 'customTableRef' ) ;
const dialogVisible = ref ( false ) ;
const checkrulesText = ref ( '' )
const ruledisplayText = ref ( '' )
const explanation = ref ( '' )
const tableData = ref < Array < any > > ( [ ] ) ;
const columns = ref ( [
{ label : '规则ID' , prop : 'ruleid' , visible : true , align : 'center' , width : ' 6 0' } ,
{ label : '条件类型' , prop : 'checktype' , visible : true , align : 'center' , width : '150' , slot : 'checktype' , showOverflowTooltip : false } ,
{ label : '审核启用' , prop : 'logflag' , visible : true , align : 'center' , width : '80' , slot : 'logflag' , showOverflowTooltip : false } ,
{ label : '组合条件(双击弹窗编辑)' , prop : 'ruledisplay' , visible : true , align : 'center' , slot : 'ruledisplay' , } ,
{ label : '记录备注信息' , prop : 'logcontent' , visible : true , align : 'center' , width : '300' , slot : 'logcontent' , } ,
{ label : '组合条件' , prop : 'checkrules' , visible : true , } ,
{ label : '自动审核' , prop : 'autocheck' , visible : true , align : 'center' , width : '80' , slot : 'autocheck' , showOverflowTooltip : false } ,
{ label : '规则ID' , prop : 'ruleid' , visible : true , align : 'center' , width : '80' } ,
{ label : '条件类型' , prop : 'checktype' , visible : true , align : 'center' , width : '150' } ,
{ label : '审核启用' , prop : 'logflag' , visible : true , align : 'center' , width : '80' } ,
{ label : '组合条件(双击弹窗编辑)' , prop : 'ruledisplay' , visible : true , align : 'center' , } ,
{ label : '记录备注信息' , prop : 'logcontent' , visible : true , align : 'center' , width : '300' } ,
{ label : '组合条件' , prop : 'checkrules' , visible : true , align : 'center' , } ,
{ label : '自动审核' , prop : 'autocheck' , visible : true , align : 'center' , width : '80' } ,
] ) ;
const tableConfig = ref ( {
@ -149,198 +58,13 @@ const options = [
{ label : '审核生成报告备注' , value : '4' } ,
]
const selectedRows : any = ref ( null )
const searchKey = ref ( '' ) ;
const filterData = ref < { [ key : string ] : any ; pinyinMap : Record < string , string > } [ ] > ( [ ] ) ;
const tableRefs = ref ( )
const currentIndex = ref ( 0 )
const xmList : any = ref ( [ ] )
const xmColumns = ref ( [
{ field : 'xmdh' , title : '项目代号' , align : 'center' , resizable : true , width : 100 } ,
{ field : 'xmmc' , title : '项目名称' , resizable : true , }
] )
const rowHandle = ( row : any ) => {
checkrulesText . value += '[' + row . xmdh + ']'
ruledisplayText . value += '[' + row . xmmc + ']'
}
const btnClick = ( val : string ) => {
checkrulesText . value += val
ruledisplayText . value += val
switch ( val ) {
case '[SEX]' :
explanation . value = '性别:性别取值: 1=男, 2=女, 所以如果下条件性别为男则应该if([SEX]=1,,)'
break ;
case '[病人来源]' :
explanation . value = '病人来源: 病人来源, 1门诊, 3住院, 4体检 例如:[病人来源]="1"'
break ;
case '[标本类型]' :
explanation . value = '标本类型:科室的值需要用双引号引起来,例如:[标本类型]="血清"'
break ;
case '[任意项目-ID]' :
explanation . value = '任意项目-ID:任意项目ID, 指的是LIS项目维护界面的项目代码, 例如: 我要判断24小时尿蛋白(代码是: 24Pro)的值,[任意项目 - ID] = "24Pro"'
break ;
case '[任意项目-数值结果]' :
explanation . value = '任意项目-数值结果: 项目维护里面,只有维护了"结果类型"等于"数字型"的项目,才会生效例如表达式:[任意项目-数值结果] > 100'
break ;
case '[任意项目-文字结果]' :
explanation . value = '任意项目-文字结果: 项目维护里面,只有维护了"结果类型"等于"文字型"或者"数值文字混合型"的项目,才会生效注意,在写表达式的时候,要把数值都用双引号引起来,例如表达式:[任意项目 - 文字结果] = "黄色"或者([任意项目 - 文字结果] like "%++%") 注意使用like条件的时候, 使用括号括起来'
break ;
case '[任意项目-危急值标志]' :
explanation . value = '任意项目-危急值标志:危急值标志的标识有两种, 一种是H, 代表高, 一种是L代表低, 例如表达式: [任意项目-危急值标志]="H"'
break ;
case '[任意项目-复查标志]' :
explanation . value = '任意项目-复查标志:复查标志有就是1,没有就是"",例如表达式:[任意项目-复查标志]="1"'
break ;
case '[任意项目-结果标志]' :
explanation . value = '任意项目-结果标志:结果标志的值有: H高 , L低, N阴性, P阳性, Q弱阳性, M正常, 为空也是正常例如: [任意项目-结果标志]="H"'
break ;
}
}
const subItem = ( ) => {
tableData . value [ currentIndex . value ] . ruledisplay = ruledisplayText . value
tableData . value [ currentIndex . value ] . checkrules = replaceBracketContent ( ruledisplayText . value , nameMap ) ;
dialogVisible . value = false
}
const replaceBracketContent = ( expression : string , replaceMap : Record < string , string > ) => {
/ / 正 则 匹 配 [ 任 意 字 符 ] , 注 意 匹 配 [ ] 内 的 中 文 ( 支 持 [ ] 前 后 有 空 格 )
const regex = /\[([^\]]+)\]/g ;
/ / 替 换 匹 配 到 的 内 容
const result = expression . replace ( regex , ( match , content ) => {
console . log ( '==>' , match , content ) ;
const trimContent = content . trim ( ) ;
return replaceMap [ trimContent ] ? ` [ ${ replaceMap [ trimContent ] } ] ` : match ;
} ) ;
return result ;
}
const nameMap : Record < string , string > = {
'年龄' : 'AGE' ,
'性别' : 'SEX' ,
'病人来源' : 'BRLY' ,
'科室' : 'KSDH' ,
'标本类型' : 'YBLX' ,
'报告单备注' : 'BZ' ,
'诊断' : 'ZD' ,
'任意项目-数值结果' : 'ANY_NUMER' ,
'任意项目-文字结果' : 'ANY_TEXT' ,
'任意项目-危急值标志' : 'ANY_CRI' ,
'任意项目-复查标志' : 'ANY_REV' ,
'任意项目-结果标志' : 'ANY_JGBZ' ,
'任意项目-ID' : 'ANY_ID'
} ;
const handleAdd = ( ) => {
tableData . value . push ( {
actions : '0' ,
ruleid : '' ,
checktype : '0' ,
logflag : '0' ,
ruledisplay : '' ,
logcontent : '' ,
checkrules : '' ,
autocheck : '0' ,
rptunitid : queryParams . value . rptunitid
} ) ;
customTableRef . value . setScrollTop ( tableData . value . length ) ;
} ;
const handleSave = ( ) => {
updateRules ( tableData . value ) . then ( ( res : any ) => {
if ( res . code == 0 ) {
ElMessage . success ( '保存成功' ) ;
getList ( ) ;
}
} ) ;
} ;
const handleDel = ( ) => {
if ( ! selectedRows . value ) return ElMessage . warning ( '请选择要删除的行' ) ;
ElMessageBox . confirm ( '是否确认删除选中数据?' , '提示' , {
type : 'warning'
} ) . then ( ( ) => {
if ( selectedRows . value . ruleid ) {
deleteRules ( { id : selectedRows . value . ruleid } ) . then ( ( res : any ) => {
if ( res . code == 0 ) {
ElMessage . success ( '删除成功' ) ;
getList ( ) ;
selectedRows . value = null
}
} ) ;
} else {
tableData . value = tableData . value . filter ( item => item . ruleid !== selectedRows . value . ruleid )
selectedRows . value = null
}
} )
} ;
const handleEdit = async ( row : any , index : number ) => {
currentIndex . value = index
const res = await queryOldxminfo ( { yq : queryParams . value . rptunitid } ) ;
res . data . forEach ( ( item : any ) => {
nameMap [ item . xmmc ] = item . xmdh ;
} )
xmList . value = processTableData ( res . data )
filterData . value = [ ... xmList . value ]
checkrulesText . value = row . checkrules
ruledisplayText . value = row . ruledisplay
explanation . value = ''
dialogVisible . value = true
}
/ / 预 处 理 数 据 : 生 成 拼 音 信 息
const processTableData = ( data : object [ ] ) => {
return data . map ( ( item : any ) => {
const pinyinMap : Record < string , string > = { } ;
/ / 处 理 l a b e l 字 段 拼 音
if ( item . xmmc ) {
pinyinMap . xmmc = getFirstLetter ( item . xmmc ) . toLowerCase ( ) ;
}
if ( item . xmdh ) {
pinyinMap . xmdh = getFirstLetter ( item . xmdh ) . toLowerCase ( ) ;
}
return { ... item , pinyinMap } ;
} ) ;
} ;
/ / 搜 索 过 滤 逻 辑
const filterDataHandle = ( ) => {
const key = searchKey . value . trim ( ) . toLowerCase ( ) ;
if ( ! key ) {
/ / 空 搜 索 时 显 示 全 部 预 处 理 数 据
filterData . value = [ ... xmList . value ] ;
return ;
}
filterData . value = xmList . value . filter ( ( item : any ) => {
/ / 1 . 原 文 本 匹 配
const matchLabel = item . xmmc ? . toString ( ) . toLowerCase ( ) . includes ( key ) ;
const matchValue = item . xmdh ? . toString ( ) . toLowerCase ( ) . includes ( key ) ;
/ / 2 . 拼 音 匹 配
const matchLabelPinyin = item . pinyinMap . xmmc ? . includes ( key ) ;
const matchValuePinyin = item . pinyinMap . xmdh ? . includes ( key ) ;
return matchLabel || matchValue || matchLabelPinyin || matchValuePinyin ;
} ) ;
if ( filterData . value . length > 0 ) {
tableRefs . value . setCurrentRow ( filterData . value [ 0 ] ) ;
}
} ;
const getList = ( ) => {
selectedRows . value = null
queryList ( queryParams . value ) . then ( ( res : any ) => {
tableData . value = res . data ;
} ) ;
@ -348,18 +72,4 @@ const getList = () => {
getList ( )
< / script >
< style scoped lang = "scss" >
. btn _text {
margin : 20 px 0 ;
. tips {
font - size : 16 px ;
font - family : SourceHanSansCN , SourceHanSansCN ;
color : # 409 eff ;
}
}
. btns {
margin - bottom : 10 px ;
}
< / style >
< style scoped lang = "scss" > < / style >