参数设置

This commit is contained in:
wyuu 2025-12-15 18:06:42 +08:00
parent f0c3aaa59b
commit 4d3c05c762
16 changed files with 759 additions and 263 deletions

View File

@ -5,112 +5,144 @@ import request from '@/utils/request'
//获取列表数据
export function queryXmInfoNewService(query: any){
return request({
url: '/xminfo/query',
method: 'get',
params: query
})
export function queryXmInfoNewService(query: any) {
return request({
url: '/xminfo/query',
method: 'get',
params: query
})
}
//获取明细数据
export function queryXmInfoNewDetailService(xmid: any, yq: any, xmdh: any){
return request({
url: '/xminfo/queryDetail',
method: 'get',
params: {
xmid,
yq,
xmdh
}
})
export function queryXmInfoNewDetailService(xmid: any, yq: any, xmdh: any) {
return request({
url: '/xminfo/queryDetail',
method: 'get',
params: {
xmid,
yq,
xmdh
}
})
}
//获取项目基本信息
export function queryXmInfoNew(xmgl: any){
return request({
url: '/xminfo/queryXmInfoNew',
method: 'get',
params: {
xmgl
}
})
export function queryXmInfoNew(xmgl: any) {
return request({
url: '/xminfo/queryXmInfoNew',
method: 'get',
params: {
xmgl
}
})
}
//获取危急值特定判断条件数据
export function queryXmAlarmdetailNew(xmid:number){
return request({
url: '/xminfo/queryXmAlarmdetailNew',
method: 'get',
params: {xmid}
})
export function queryXmAlarmdetailNew(xmid: number) {
return request({
url: '/xminfo/queryXmAlarmdetailNew',
method: 'get',
params: { xmid }
})
}
//新增危急值特定判断条件数据
export function addXmAlarmdetailNew(query:any){
return request({
url: '/xminfo/addXmAlarmdetailNew',
method: 'post',
data: query
})
export function addXmAlarmdetailNew(query: any) {
return request({
url: '/xminfo/addXmAlarmdetailNew',
method: 'post',
data: query
})
}
//新增危急值特定判断条件数据
export function delXmAlarmdetailNew(xmid:number,seq:number){
return request({
url: '/xminfo/delXmAlarmdetailNew',
method: 'get',
params: {
xmid,
seq
}
})
export function delXmAlarmdetailNew(xmid: number, seq: number) {
return request({
url: '/xminfo/delXmAlarmdetailNew',
method: 'get',
params: {
xmid,
seq
}
})
}
//保存数据
export function saveDataService(query:any){
return request({
url: '/xminfo/update',
method: 'post',
data: query
})
export function saveDataService(query: any) {
return request({
url: '/xminfo/update',
method: 'post',
data: query
})
}
//删除常用取值
export function delXmValNewService(query:any){
return request({
url: '/xminfo/delXmValNew',
method: 'get',
params: query
})
export function delXmValNewService(query: any) {
return request({
url: '/xminfo/delXmValNew',
method: 'get',
params: query
})
}
//删除常见描述
export function delXmTextresultNew(query:any){
return request({
url: '/xminfo/delXmTextresultNew',
method: 'get',
params: query
})
export function delXmTextresultNew(query: any) {
return request({
url: '/xminfo/delXmTextresultNew',
method: 'get',
params: query
})
}
//删除仪器对照
export function deleteXmInfoVs(query:any){
return request({
url: '/xminfo/delvs',
method: 'delete',
params: query
})
export function deleteXmInfoVs(query: any) {
return request({
url: '/xminfo/delvs',
method: 'delete',
params: query
})
}
//删除检验项目
export function deleteXmInfoService(query:any){
return request({
url: '/xminfo/del',
method: 'delete',
params: query
})
export function deleteXmInfoService(query: any) {
return request({
url: '/xminfo/del',
method: 'delete',
params: query
})
}
//删除参考值明细
export function delXmRefNew(query: any) {
return request({
url: '/xminfo/delXmRefNew',
method: 'get',
params: query
})
}
//查询批量数据
export function queryBatchList(query?: Object) {
return request({
url: '/xminfo/queryBatch',
method: 'get',
params: query
})
}
//批量新增数据
export function addBatch(query?: Object) {
return request({
url: '/xminfo/addBatch',
method: 'post',
data: query
})
}
//批量删除数据
export function delBatch(query?: Object) {
return request({
url: '/xminfo/delBatch',
method: 'post',
data: query
})
}

View File

@ -44,10 +44,34 @@ export function paramTree(query?: Object) {
}
// 查询某个参数
export function queryOneService(yq: string,xxdh: string) {
export function queryOneService(yq: string, xxdh: string) {
return request({
url: '/param/queryOne',
method: 'get',
params: {yq,xxdh}
params: { yq, xxdh }
});
}
// 查询滤光片波长对照表
export function queryFilter(data?: Object) {
return request({
url: '/xminfo/queryFilter',
method: 'get',
params: data
});
}
// 新增滤光片波长对照表
export function addXmFilter(data?: Object) {
return request({
url: '/xminfo/addXmFilter',
method: 'post',
data
});
}
// 删除滤光片波长对照表
export function delXmFilter(data?: Object) {
return request({
url: '/xminfo/delXmFilter',
method: 'get',
params: data
});
}

View File

@ -336,18 +336,26 @@ aside {
}
.tabs_box>.el-tabs__header {
height: 1.875rem !important;
margin-bottom: 0px;
font-size: .875rem;
.el-tabs__item {
.tabs_box {
.el-tabs__header {
height: 1.875rem !important;
padding: 0 .625rem;
margin-bottom: 0px;
font-size: .875rem;
&.is-active {
border-bottom: .125rem solid #409eff !important;
background-color: #e9f1fb;
.el-tabs__item {
height: 1.875rem !important;
padding: 0 .625rem;
&.is-active {
border-bottom: .125rem solid #409eff !important;
background-color: #e9f1fb;
}
}
}
.el-tabs__nav-next,
.el-tabs__nav-prev {
line-height: 1.875rem;
color: #1f6dd3;
}
}

View File

@ -69,7 +69,7 @@
</template>
<script setup lang="ts">
import { ref, defineProps, defineEmits, nextTick, watch } from 'vue'
import { ref, nextTick, watch } from 'vue'
import { ElMessage } from 'element-plus'
// 定义下拉选项类型

View File

@ -17,6 +17,7 @@
:height="scrollYConfig.height" @checkbox-change="handleCheckboxChange" :row-config="rowConfig"
:show-overflow="showOverflow" @current-change="handleRowClick" ref="tableRef" :size="size"
:current-row="currentRow" :highlight-current-row="highlightCurrentRow" :scroll-y="scrollYConfig"
:tooltip-config="{ appendToBody: true, zIndex: 3000 }"
:header-cell-class-name="enableColumnDrag ? 'el-table-header-cell' : ''" v-bind="$attrs">
<!-- 动态渲染列 -->
<template v-for="(column, i) in columns" :key="`${column.field}-${i}`">

View File

@ -121,6 +121,7 @@ service.interceptors.response.use(res => {
return res.data
}
if (code == -1) {
ElMessage.error(msg);
return Promise.resolve(res.data)
}
if (code === 401) {

View File

@ -157,7 +157,7 @@
</div>
<el-table ref="diaTableRef" :data="compareTableData" style="width: 100%" @row-click="handleRowClick"
highlight-current-row border max-height="350px">
highlight-current-row border height="350px">
<el-table-column prop="xmdh" label="项目编号" fixed align="center" width="150px" />
<el-table-column prop="xmmc" label="项目名称" fixed align="center" />
<template v-for="(period) in periods" :key="period">
@ -382,8 +382,9 @@ const printPdf = () => {
const printStore = usePrintStore();
const selections = tableRefs.value.allSelection()
if (selections.length <= 0) return ElMessage.warning('请选择要打印的数据!')
const arr = [...new Set(selections.map((item: any) => { return item.brdh }))]
if (arr.length > 1) return ElMessage.warning('只能选中一个病人的报告单打印!')
const merge = selections.map((item: any) => { return `${item.jyrqname.replace(/-/g, '')}_${item.yq.trim()}_${item.ybh}` })
reportPrintPdf(merge).then((res: any) => {
if (res.code == 0) {
if (!res.data) return ElMessage.warning('未找到打印文件')
@ -393,6 +394,8 @@ const printPdf = () => {
// } else {
// classCom.printBase64PDF(res.data)
// }
} else {
ElMessage.warning(res.msg)
}
})
}

View File

@ -1,36 +1,64 @@
<template>
<!-- 批量仪器对应 -->
<el-dialog title="批量项目对应" width="1000px" v-model="batchInstrVsModel.visible" @close="onClose">
<el-form :model="formData" inline>
<el-dialog title="批量项目对应" width="72vw" v-model="batchInstrVsModel.visible" draggable :close-on-click-modal="false"
@close="onClose">
<el-form :model="formData" inline label-width="80px">
<el-form-item label="项目类别" prop="xmgl">
<!-- <el-input placeholder="项目类别" v-model="formData.xmgl"></el-input> -->
<SelectTable v-model:data="formData.xmgl" :fields="xmglFields" :tableData="dictData.XMGL" label="label"
value="value" objKey="value" width="140px" placeholder="项目类别" />
clearable value="value" objKey="value" width="200px" placeholder="项目类别" />
</el-form-item>
<el-form-item label="快速查找" prop="inputcode">
<el-input placeholder="快速查找" v-model="formData.inputcode"></el-input>
<el-input placeholder="快速查找" v-model="formData.inputcode" style="width: 200px;"></el-input>
</el-form-item>
<el-form-item label="细菌标志" prop="itemclass">
<SelectTable v-model:data="formData.xmgl" :fields="xmglFields" :tableData="dictData.ITEMCLASS" label="label"
value="value" objKey="value" width="140px" placeholder="细菌标志" />
<SelectTable v-model:data="formData.itemclass" :fields="xmglFields" :tableData="dictData.ITEMCLASS"
label="label" clearable value="value" objKey="value" width="200px" placeholder="细菌标志" />
</el-form-item>
<el-form-item label="仪器大类" prop="yqdl">
<SelectTable v-model:data="formData.xmgl" :fields="xmglFields" :tableData="dictData.YQDL" label="label"
value="value" objKey="value" width="140px" placeholder="仪器大类" />
<SelectTable v-model:data="formData.yqdl" :fields="xmglFields" :tableData="dictData.YQDL" label="label"
clearable value="value" objKey="value" width="200px" placeholder="仪器大类" />
</el-form-item>
<el-form-item label="仪器" prop="yq">
<YQSelectTable v-model:data="formData.yq" width="200px" placeholder="请输入仪器名称" />
</el-form-item>
<el-form-item>
<el-checkbox v-model="formData.wsw" label="隐藏微生物"></el-checkbox>
<el-checkbox v-model="formData.wsw" label="隐藏微生物" true-value="1" false-value="0"></el-checkbox>
</el-form-item>
<el-form-item>
<el-radio-group v-model="formData.queryDylx" @change="getList">
<el-radio value="1">未对应</el-radio>
<el-radio value="2">已对应</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getList">搜索</el-button>
</el-form-item>
</el-form>
<CustomTable ref="tableRef" :data="tableData" :columns="columns" :enable-column-drag="true"
@column-drag-end="handleColumnDragEnd" :config="tableConfig" @row-click="rowClick">
</CustomTable>
<div style="height: 60vh;">
<VxeTable ref="tableRef" :loading="loading" :data="tableData" :columns="columns" :enable-column-drag="true"
:scrollYConfig="{ enabled: true, rSize: 30, height: '100%', }" @column-drag-end="handleColumnDragEnd"
:config="tableConfig" @current-change="rowClick" class="mytable-style" @selection-change="selecChange">
<template #xmgl="{ row }">
{{ formatDict(row.xmgl, 'XMGL') }}
</template>
<template #xmlb="{ row }">
{{ xmlbObj[row.xmlb] }}
</template>
<template #jsxm="{ row }">
{{ row.jsxm === 'Y' ? '是' : '否' }}
</template>
<template #uflag="{ row }">
{{ row.uflag === '0' ? '否' : '是' }}
</template>
<template #yqdl="{ row }">
{{ formatDict(row.yqdl, 'YQDL') }}
</template>
</VxeTable>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleCancel">取 消</el-button>
<el-button @click="onClose">取 消</el-button>
<el-button type="primary" @click="handleOk">确 定</el-button>
</div>
</template>
@ -39,19 +67,28 @@
</template>
<script setup lang="ts">
import { getDictData, dictData } from '@/hooks';
import { formatDict, getDictData, dictData } from '@/hooks';
import SelectTable from '@/components/SelectTable/index.vue'
import CustomTable from '@/components/elTable/index.vue'
import VxeTable from '@/components/vxeTable/index.vue'
import YQSelectTable from '@/components/SelectTable/YQSelectTable/index.vue'
import { queryBatchList, addBatch, delBatch } from '@/api/liswork/labItem/labItemApi'
import { ElMessage } from 'element-plus';
const formData = ref({
xmgl: '',
inputcode: '',
itemclass: '',
yqdl: '',
wsw: false,
yq: ''
wsw: '0',
yq: '',
queryDylx: '1'
})
const xmlbObj: any = {
1: '数值型',
2: '文字型',
3: '阴阳性型',
4: '数值文字混合型'
}
const tableData = ref()
const batchInstrVsModel = defineModel<any>()
@ -61,33 +98,39 @@ const xmglFields = ref([
])
const columns = ref([
{ prop: 'xmgl', label: '项目类别', visible: true, align: 'center', width: 50 },
{ prop: 'xmdh', label: '英文缩写', visible: true, align: 'center', width: 100 },
{ prop: 'xmmc', label: '名称', visible: true, align: 'center', width: 200 },
{ prop: 'dyckz', label: '参考值', visible: true, align: 'center', width: 100 },
{ prop: 'dw', label: '单位', visible: true, align: 'center', width: 100 },
{ prop: 'xmlb', label: '结果类型', visible: true, align: 'center', width: 100 },
{ prop: 'jsxm', label: '计算项目', visible: true, align: 'center', width: 100 },
{ prop: 'dyxh', label: '序号', visible: true, align: 'center', width: 100 },
{ prop: 'xs', label: '调整系数', visible: true, align: 'center', width: 50 },
{ prop: 'xsws', label: '小数位数', visible: true, align: 'center', width: 50 },
{ prop: 'xsbs', label: '稀释倍数', visible: true, align: 'center', width: 50 },
{ prop: 'uflag', label: '停用', visible: true, align: 'center', width: 50 },
{ prop: 'yqdl', label: '仪器大类', visible: true, align: 'center', width: 100 },
{ prop: 'xmid', label: '项目ID', visible: true, align: 'center', width: 100 },
{ prop: 'knowledge', label: '项目编码', visible: true, align: 'center', width: 100 },
{ prop: 'val1', label: '外部代码1', visible: true, align: 'center', width: 100 },
{ prop: 'val2', label: '外部代码2', visible: true, align: 'center', width: 100 },
{ prop: 'val3', label: '外部代码3', visible: true, align: 'center', width: 100 },
{ prop: 'yymc', label: '英文名称', visible: true, align: 'center', width: 100 },
{ prop: 'qccv', label: '允许CA(%)', visible: true, align: 'center', width: 100 },
{ type: 'selection', field: '', title: '', resizable: true, align: 'center', width: 40 },
{ field: 'xmgl', title: '项目类别', resizable: true, align: 'center', width: 80, slotName: "xmgl" },
{ field: 'xmdh', title: '英文缩写', resizable: true, align: 'center', width: 60 },
{ field: 'xmmc', title: '名称', resizable: true, align: 'center', width: 200 },
{ field: 'dyckz', title: '参考值', resizable: true, align: 'center', width: 80 },
{ field: 'dw', title: '单位', resizable: true, align: 'center', width: 80 },
{ field: 'xmlb', title: '结果类型', resizable: true, align: 'center', width: 100, slotName: "xmlb" },
{ field: 'jsxm', title: '计算项目', resizable: true, align: 'center', width: 80, slotName: "jsxm" },
{ field: 'dyxh', title: '序号', resizable: true, align: 'center', width: 80 },
{ field: 'xs', title: '调整系数', resizable: true, align: 'center', width: 60 },
{ field: 'xsws', title: '小数位数', resizable: true, align: 'center', width: 60 },
{ field: 'xsbs', title: '稀释倍数', resizable: true, align: 'center', width: 60 },
{ field: 'uflag', title: '停用', resizable: true, align: 'center', width: 60, slotName: "uflag" },
{ field: 'yqdl', title: '仪器大类', resizable: true, align: 'center', width: 80, slotName: "yqdl" },
{ field: 'xmid', title: '项目ID', resizable: true, align: 'center', width: 80 },
{ field: 'knowledge', title: '项目编码', resizable: true, align: 'center', width: 80 },
{ field: 'val1', title: '外部代码1', resizable: true, align: 'center', width: 80 },
{ field: 'val2', title: '外部代码2', resizable: true, align: 'center', width: 80 },
{ field: 'val3', title: '外部代码3', resizable: true, align: 'center', width: 80 },
{ field: 'yymc', title: '英文名称', resizable: true, align: 'center', width: 80 },
{ field: 'qccv', title: '允许CA(%)', resizable: true, align: 'center', width: 80 },
]);
const tableConfig = ref({
border: true, // 边框
height: '60vh', // 高度
highlightCurrentRow: true, // 高亮当前行
// cellStyle: cellStyleHd
// 复选框配置
checkboxConfig: {
// 可选配置项
checkField: 'checked', // 绑定数据中的字段(默认:checked)
range: false, // 是否支持范围选择(按住 Shift 连续选择)
disabled: false, // 是否禁用全部复选框
reserve: false, // 是否保留勾选状态(分页/筛选时)
highlight: false // 是否高亮选中行
}
})
@ -104,23 +147,54 @@ const rowClick = () => {
const onClose = () => {
batchInstrVsModel.value.visible = false;
formData.value = {
xmgl: '',
inputcode: '',
itemclass: '',
yqdl: '',
wsw: '0',
yq: '',
queryDylx: '1'
}
tableData.value = []
}
const loading = ref(false);
//刷新数据
const getList = () => {
loading.value = true;
queryBatchList(formData.value).then((res: any) => {
loading.value = false;
tableData.value = res.data;
})
}
const selecRows: any = ref([])
const selecChange = (rows: any[]) => {
selecRows.value = rows
}
//取消
const handleCancel = () => {
}
//确定
const handleOk = () => {
if (formData.value.queryDylx == '1') {
addBatch(selecRows.value).then((res: any) => {
if (res.code == 0) {
ElMessage.success('操作成功!')
getList()
}
})
} else if (formData.value.queryDylx == '2') {
let arr = []
arr = selecRows.value.map((item: any) => { return item.vsid })
delBatch(arr).then((res: any) => {
if (res.code == 0) {
ElMessage.success('操作成功!')
getList()
}
})
}
}
</script>
<style scoped lang="scss"></style>

View File

@ -56,7 +56,7 @@
{{ formatDict(row.xmgl, 'XMGL') }}
</template>
<template #xmlb="{ row }">
{{xmlbList.find(item => item.value === row.xmlb)?.label}}
{{ xmlbObj[row.xmlb] }}
</template>
<template #jsxm="{ row }">
{{ row.jsxm === 'Y' ? '是' : '否' }}
@ -112,12 +112,12 @@ import _ from 'lodash';
import { classCom } from '@/utils/classCom';
const autoSize = classCom.useAutoSize()
const xmlbList = ref<Array<any>>([
{ label: '数值型', value: '1' },
{ label: '文字型', value: '2' },
{ label: '阴阳性型', value: '3' },
{ label: '数值文字混合型', value: '4' }
])
const xmlbObj: any = {
1: '数值型',
2: '文字型',
3: '阴阳性型',
4: '数值文字混合型'
}
const dataList = ref<Array<any>>([])
const queryParams = ref({
xmgl: '', //项目归类
@ -230,7 +230,7 @@ const hasUnsavedChanges = ref(false);
// 保存初始数据快照用于比较
const initialModelParam = ref<any>(null);
const batchInstrVsModel = ref<any>({
visible: false
visible: true
})

View File

@ -97,11 +97,11 @@
</el-form-item>
<el-form-item label="参考值" prop="dyckz">
<el-input v-model="basicData.dyckz" />
<el-button type="primary" class="ml5" @click="multiRefClick">多行参考值向导...</el-button>
<el-button type="primary" class="ml5" @click="multiRefClick">多行参考值向导</el-button>
</el-form-item>
<el-form-item label="公式" prop="jsgs">
<el-input v-model="basicData.jsgs" />
<el-button v-show="basicData.jsxm === 'Y'" type="primary" class="ml5" @click="calcGuildeClick">向导...</el-button>
<el-button v-show="basicData.jsxm === 'Y'" type="primary" class="ml5" @click="calcGuildeClick">向导</el-button>
</el-form-item>
<el-form-item>
<el-checkbox label="参考值与性别有关" v-model="basicData.ygxb" true-value="Y" false-value="N"></el-checkbox>

View File

@ -7,7 +7,9 @@
</el-row>
<el-row>
<el-col :span="12">
<CustomTable ref="tableRefs" :data="tableData" :columns="columns" :config="tableConfig" @row-click="rowHandle"
<el-input v-model="searchKey" ref="searchInput" size="small" placeholder="快速搜索(支持简拼)" class="mb10" clearable
@clear="filterDataHandle" @input="filterDataHandle" />
<CustomTable ref="tableRefs" :data="filterData" :columns="columns" :config="tableConfig" @row-click="rowHandle"
:enableColumnDrag="true" @column-drag-end="handleColumnDragEnd" />
</el-col>
<el-col :span="12" class="right">
@ -38,6 +40,9 @@
<script setup lang="ts">
import CustomTable from '@/components/elTable/index.vue'
import { queryXmInfoNew } from '@/api/liswork/labItem/labItemApi'
// @ts-ignore
import { getFirstLetter } from '@/utils/pinyin.js';
const props = defineProps({
formData: {
@ -46,11 +51,13 @@ const props = defineProps({
}
})
let visible = ref<boolean>()
const currentIndex = ref(0)
const searchKey = ref('');
const filterData = ref<{ [key: string]: any; pinyinMap: Record<string, string> }[]>([]);
const tableData = ref()
const inputText = ref('')
const tableRefs = ref()
const emit = defineEmits(['update:model-value', 'confirm'])
const columns = ref([
@ -83,6 +90,8 @@ const handleColumnDragEnd = (newColumns: any) => {
columns.value = newColumns.columns
}
const rowHandle = (row: any) => {
inputText.value += '[' + row.xmdh + ']'
}
@ -143,9 +152,55 @@ const bClickAge = () => {
const onOpen = async () => {
const res = await queryXmInfoNew(props.formData.xmgl);
tableData.value = res.data
//inputText.value = props.text
tableData.value = processTableData(res.data)
filterData.value = [...tableData.value]
}
// 预处理数据:生成拼音信息
const processTableData = (data: object[]) => {
return data.map((item: any) => {
const pinyinMap: Record<string, string> = {};
// 处理label字段拼音
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 = [...tableData.value];
return;
} else {
currentIndex.value = 0
}
filterData.value = tableData.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.setScrollTop(0)
tableRefs.value.setCurrentRow(filterData.value[0]);
}
};
</script>

View File

@ -5,8 +5,8 @@
<el-button type="primary" @click="onAddClick">增加</el-button>
<el-button type="primary" @click="onDelClick">删除</el-button>
</div>
<CustomTable ref="tableRef" :data="modelParam.commonDescriptionsData" :columns="columns" :enable-column-drag="true"
@column-drag-end="handleColumnDragEnd" :config="tableConfig" @row-click="rowClick">
<CustomTable ref="tableRef" :data="modelParam.commonDescriptionsData" :columns="columns" :config="tableConfig"
@row-click="rowClick">
<template #textresult="{ row }">
<el-input type="textarea" v-model="row.textresult" class="full-width-input" autosize></el-input>
</template>
@ -34,16 +34,12 @@ const columns = ref([
const tableConfig = ref({
border: true, // 边框
height: '78vh', // 高度
// highlightCurrentRow: true, // 高亮当前行
highlightCurrentRow: true, // 高亮当前行
// cellStyle: cellStyleHd
})
//退拽属性
const handleColumnDragEnd = (data: any) => {
// 更新列配置
columns.value = data.columns;
}
const selectRow = ref()
const emit = defineEmits(['refreshTabData'])

View File

@ -1,86 +1,90 @@
<template>
<!-- 参数设置 -->
<div>
<el-form ref="form" :model="formData" :rules="rules" label-width="80px" size="small" class="form-inline" inline>
<el-row>
<span>说明:公式中阴阳对照请用NC,PC表示</span>
</el-row>
<el-form-item label="测试波长" prop="csbc">
<el-input placeholder="测试波长" v-model="formData.csbc"></el-input>
</el-form-item>
<el-form-item label="参考波长" prop="ckbc">
<el-input placeholder="参考波长" v-model="formData.ckbc"></el-input>
<el-button type="primary" @click="">滤光片波长对照表...</el-button>
</el-form-item>
<el-form-item label="阳性判断公式" prop="yxgs" label-width="100px">
<el-input placeholder="阳性判断公式" v-model="formData.yxgs" style="width: 400px;"></el-input>
</el-form-item>
<el-form-item label="上灰区" prop="shq">
<el-input placeholder="上灰区" v-model="formData.shq"></el-input>%
</el-form-item>
<el-form-item label="下灰区" prop="xhq">
<el-input placeholder="下灰区" v-model="formData.xhq"></el-input>%
</el-form-item>
<el-form-item label="阴性对照下限" prop="negxx" label-width="100px">
<el-input placeholder="阴性对照下限" v-model="formData.negxx" style="width: 100px;"></el-input>
</el-form-item>
<el-form-item label="阳性对照下限" prop="posxx" label-width="100px">
<el-input placeholder="阳性对照下限" v-model="formData.posxx"></el-input>
</el-form-item>
<el-form-item label="阴性对照上限" prop="negsx" label-width="100px">
<el-input placeholder="阴性对照上限" v-model="formData.negsx" style="width: 100px;"></el-input>
</el-form-item>
<el-form-item label="阳性对照上限" prop="possx" label-width="100px">
<el-input placeholder="阳性对照上限" v-model="formData.possx"></el-input>
</el-form-item>
<!-- 参数设置 -->
<div>
<el-form ref="form" :model="formData" :rules="rules" label-width="80px" size="small" class="form-inline" inline>
<el-row>
<span>说明:公式中阴阳对照请用NC,PC表示</span>
</el-row>
<el-form-item label="测试波长" prop="csbc">
<el-input placeholder="测试波长" v-model="formData.csbc"></el-input>
</el-form-item>
<el-form-item label="参考波长" prop="ckbc">
<el-input placeholder="参考波长" v-model="formData.ckbc"></el-input>
<el-button type="primary" @click="">滤光片波长对照表...</el-button>
</el-form-item>
<el-form-item label="阳性判断公式" prop="yxgs" label-width="100px">
<el-input placeholder="阳性判断公式" v-model="formData.yxgs" style="width: 400px;"></el-input>
</el-form-item>
<el-form-item label="上灰区" prop="shq">
<el-input placeholder="上灰区" v-model="formData.shq">
<template #append>% </template>
</el-input>
</el-form-item>
<el-form-item label="下灰区" prop="xhq">
<el-input placeholder="下灰区" v-model="formData.xhq">
<template #append>% </template>
</el-input>
</el-form-item>
<el-form-item label="阴性对照下限" prop="negxx" label-width="100px">
<el-input placeholder="阴性对照下限" v-model="formData.negxx" style="width: 100px;"></el-input>
</el-form-item>
<el-form-item label="阳性对照下限" prop="posxx" label-width="100px">
<el-input placeholder="阳性对照下限" v-model="formData.posxx"></el-input>
</el-form-item>
<el-form-item label="阴性对照上限" prop="negsx" label-width="100px">
<el-input placeholder="阴性对照上限" v-model="formData.negsx" style="width: 100px;"></el-input>
</el-form-item>
<el-form-item label="阳性对照上限" prop="possx" label-width="100px">
<el-input placeholder="阳性对照上限" v-model="formData.possx"></el-input>
</el-form-item>
<el-divider></el-divider>
<el-form-item label="项目性质" prop="xmxz">
<el-radio-group v-model="formData.xmxz">
<el-radio value="1">定性</el-radio>
<el-radio value="2">定量</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="移动模式" prop="ydfs">
<el-radio-group v-model="formData.ydfs">
<el-radio value="1">连续</el-radio>
<el-radio value="2">步进</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="测试模式" prop="csms">
<el-radio-group v-model="formData.csms">
<el-radio value="1">终点法</el-radio>
<el-radio value="2">两点法</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="振板频率" prop="zbpl">
<el-radio-group v-model="formData.zbpl">
<el-radio value="1">高</el-radio>
<el-radio value="2">中</el-radio>
<el-radio value="3">低</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="空白形式" prop="kbms">
<el-radio-group v-model="formData.kbms">
<el-radio value="1">空气</el-radio>
<el-radio value="2">试剂</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="振板时间" prop="zbsj">
<el-input placeholder="振板时间" v-model="formData.zbsj"></el-input>秒
</el-form-item>
<el-divider></el-divider>
<el-form-item label="项目性质" prop="xmxz">
<el-radio-group v-model="formData.xmxz">
<el-radio value="1">定性</el-radio>
<el-radio value="2">定量</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="移动模式" prop="ydfs">
<el-radio-group v-model="formData.ydfs">
<el-radio value="1">连续</el-radio>
<el-radio value="2">步进</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="测试模式" prop="csms">
<el-radio-group v-model="formData.csms">
<el-radio value="1">终点法</el-radio>
<el-radio value="2">两点法</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="振板频率" prop="zbpl">
<el-radio-group v-model="formData.zbpl">
<el-radio value="1">高</el-radio>
<el-radio value="2">中</el-radio>
<el-radio value="3">低</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="空白形式" prop="kbms">
<el-radio-group v-model="formData.kbms">
<el-radio value="1">空气</el-radio>
<el-radio value="2">试剂</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="振板时间" prop="zbsj">
<el-input placeholder="振板时间" v-model="formData.zbsj"></el-input>秒
</el-form-item>
<el-divider></el-divider>
<el-form-item label="默认模板" prop="mrmb">
<el-input placeholder="默认模板" v-model="formData.mrmb"></el-input>
</el-form-item>
<el-form-item label="默认试剂" prop="mrsjph">
<el-input placeholder="默认试剂" v-model="formData.mrsjph"></el-input>
<el-button type="primary" @click="">试剂维护</el-button>
</el-form-item>
<el-divider></el-divider>
<el-form-item label="默认模板" prop="mrmb">
<el-input placeholder="默认模板" v-model="formData.mrmb"></el-input>
</el-form-item>
<el-form-item label="默认试剂" prop="mrsjph">
<el-input placeholder="默认试剂" v-model="formData.mrsjph"></el-input>
<el-button type="primary" @click="">试剂维护</el-button>
</el-form-item>
</el-form>
</div>
</el-form>
</div>
</template>
<script setup lang="ts">
@ -130,9 +134,11 @@ const props = defineProps({
padding: 10px;
background-color: #f5f7fa;
height: auto;
.el-input {
width: 150px;
}
.el-form-item {
margin-right: 10px;
margin-bottom: 2px;

View File

@ -8,7 +8,7 @@
<CustomTable ref="tableRefUp" :data="modelParam.referenceValueDetailsData" :columns="columnsUp"
:enable-column-drag="true" @column-drag-end="handleColumnDragEnd" :config="tableConfig" @row-click="rowClick">
<template #xb="{ row }">
<el-select v-model="row.xb" clearable>
<el-select v-model="row.xb" clearable class="full-width-input">
<el-option v-for="item in optionsXb" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</template>
@ -16,7 +16,7 @@
<el-input v-model="row.nl1" class="full-width-input"></el-input>
</template>
<template #cp_nldw1="{ row }">
<el-select v-model="row.nldw" clearable>
<el-select v-model="row.nldw" clearable class="full-width-input">
<el-option v-for="item in optionsNLDW" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</template>
@ -24,16 +24,16 @@
<el-input v-model="row.nl2" class="full-width-input"></el-input>
</template>
<template #cp_nldw2="{ row }">
<el-select v-model="row.nldw" clearable>
<el-select v-model="row.nldw" clearable class="full-width-input">
<el-option v-for="item in optionsNLDW" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</template>
<template #bblx="{ row }">
<SelectTable v-model:data="row.bblx" :fields="fields" :tableData="dictData.BT" label="label" value="label"
objKey="label" :border="true" />
objKey="label" :border="true" class="full-width-input" />
</template>
<template #slzq="{ row }">
<el-select v-model="row.slzq" clearable>
<el-select v-model="row.slzq" clearable class="full-width-input">
<el-option v-for="item in dictData.SLZQ" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
@ -74,12 +74,14 @@ import CustomTable from '@/components/elTable/index.vue'
import { ref } from 'vue';
import { getDictData, dictData } from '@/hooks'
import SelectTable from '@/components/SelectTable/index.vue'
import { ElMessageBox } from 'element-plus';
import { ElMessage, ElMessageBox } from 'element-plus';
import { delXmRefNew } from '@/api/liswork/labItem/labItemApi';
const modelParam = defineModel<any>()
const emit = defineEmits(['refreshTabData'])
watch(() => modelParam.value.referenceValueDetailsData, (val) => {
selectRow.value = null
})
const optionsXb = [
{ value: '1', label: '男' },
{ value: '2', label: '女' },
@ -100,17 +102,17 @@ const fields = ref(
]
)
// const dataListUp = ref();
const dataListDown = ref();
const dataListDown = ref([]);
const columnsUp = ref([
{ prop: 'xmid', label: 'xmid', visible: false, align: 'center' },
{ prop: 'xh', label: '序号', visible: false, align: 'center' },
{ prop: 'xb', label: '性别', visible: true, align: 'center', slot: 'xb', width: 70 },
{ prop: 'xb', label: '性别', visible: true, align: 'center', slot: 'xb', width: 80, showOverflowTooltip: false },
{ prop: 'nl1', label: '年龄下限', visible: true, align: 'center', slot: 'nl1', width: 70 },
{ prop: 'nldw', label: '年龄单位', visible: true, align: 'center', slot: 'cp_nldw1', width: 70 },
{ prop: 'nldw', label: '年龄单位', visible: true, align: 'center', slot: 'cp_nldw1', width: 80, showOverflowTooltip: false },
{ prop: 'nl2', label: '年龄上限', visible: true, align: 'center', slot: 'nl2', width: 70 },
{ prop: 'nldw', label: '年龄单位', visible: true, align: 'center', slot: 'cp_nldw2', width: 70 },
{ prop: 'bblx', label: '标本类型', visible: true, align: 'center', slot: 'bblx', width: 100 },
{ prop: 'slzq', label: '生理周期', visible: true, align: 'center', slot: 'slzq', width: 100 },
{ prop: 'nldw', label: '年龄单位', visible: true, align: 'center', slot: 'cp_nldw2', width: 80, showOverflowTooltip: false },
{ prop: 'bblx', label: '标本类型', visible: true, align: 'center', slot: 'bblx', width: 100, showOverflowTooltip: false },
{ prop: 'slzq', label: '生理周期', visible: true, align: 'center', slot: 'slzq', width: 100, showOverflowTooltip: false },
{ prop: 'zd', label: '诊断', visible: true, align: 'center', slot: 'zd', width: 100 },
{ prop: 'ckxx', label: '参考下限', visible: true, align: 'center', slot: 'ckxx', width: 100 },
{ prop: 'cksx', label: '参考上限', visible: true, align: 'center', slot: 'cksx', width: 100 },
@ -167,12 +169,17 @@ const onAddClick = () => {
modelParam.value.referenceValueDetailsData.push(newData)
}
const onDelClick = async () => {
if (selectRow.value) {
await ElMessageBox.confirm('是否要删除选中的数据?', '警告',
{ confirmButtonText: 'OK', cancelButtonText: 'Cancel', type: 'warning', });
emit('refreshTabData', modelParam.value.basicData)
}
const onDelClick = () => {
if (!selectRow.value) return ElMessage.warning('请选择要删除的数据!');
ElMessageBox.confirm('是否要删除选中的数据?', '警告',
{ confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning', }).then(() => {
delXmRefNew({ xmid: modelParam.value.basicData.xmid, xh: selectRow.value.xh }).then((res: any) => {
if (res.code == 0) {
ElMessage.success('删除成功!')
emit('refreshTabData', modelParam.value.basicData)
}
})
})
}
const rowClick = (row: any) => {

View File

@ -0,0 +1,286 @@
<template>
<div>
<el-row :gutter="10" class="table-toolbar">
<el-col :span="1.5">
<el-button type="primary" plain icon="Check" @click="handleSave">保存</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" @click="handleCancelEdit">取消修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="RefreshRight" @click="handleRestoreDefault">还原默认</el-button>
</el-col>
</el-row>
<el-form ref="form" :model="formData" :rules="rules" label-width="120px" class="form-inline" inline>
<div class="title">说明:公式中阴阳对照请用NC,PC表示</div>
<el-row>
<el-col :span="8">
<el-form-item label="测试波长" prop="csbc">
<el-select v-model="formData.csbc" style="width: 12rem;">
<el-option v-for="item in dzList" :key="item.lgph" :value="item.lgph" :label="item.bc" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8" style="display: flex;">
<el-form-item label="参考波长" prop="ckbc">
<el-select v-model="formData.ckbc" style="width: 12rem;">
<el-option v-for="item in dzList" :key="item.lgph" :value="item.lgph" :label="item.bc" />
</el-select>
</el-form-item>
<el-button type="primary" @click="openDz">滤光片波长对照表</el-button>
</el-col>
<el-col :span="8">
<el-form-item label="阳性判断公式" prop="yxgs">
<el-input v-model="formData.yxgs" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="上灰区" prop="shq">
<el-input v-model="formData.shq">
<template #append>% </template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="下灰区" prop="xhq">
<el-input v-model="formData.xhq">
<template #append>% </template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="阴性对照下限" prop="negxx">
<el-input v-model="formData.negxx" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="阳性对照下限" prop="posxx">
<el-input v-model="formData.posxx" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="阴性对照上限" prop="negsx">
<el-input v-model="formData.negsx" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="阳性对照上限" prop="possx">
<el-input v-model="formData.possx" />
</el-form-item>
</el-col>
<el-col :span="6">
</el-col>
</el-row>
<el-divider></el-divider>
<el-row>
<el-col :span="8">
<el-form-item label="项目性质" prop="xmxz">
<el-radio-group v-model="formData.xmxz">
<el-radio value="1">定性</el-radio>
<el-radio value="2">定量</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="移动模式" prop="ydfs">
<el-radio-group v-model="formData.ydfs">
<el-radio value="1">连续</el-radio>
<el-radio value="2">步进</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="测试模式" prop="csms">
<el-radio-group v-model="formData.csms">
<el-radio value="1">终点法</el-radio>
<el-radio value="2">两点法</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="振板频率" prop="zbpl">
<el-radio-group v-model="formData.zbpl">
<el-radio value="1">高</el-radio>
<el-radio value="2">中</el-radio>
<el-radio value="3">低</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="空白形式" prop="kbms">
<el-radio-group v-model="formData.kbms">
<el-radio value="1">空气</el-radio>
<el-radio value="2">试剂</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="振板时间" prop="zbsj">
<el-input v-model="formData.zbsj">
<template #append>秒</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-divider></el-divider>
<el-row>
<el-col :span="8">
<el-form-item label="默认模板" prop="mrmb">
<el-input v-model="formData.mrmb" />
</el-form-item>
</el-col>
<el-col :span="8" style="display: flex;">
<el-form-item label="默认试剂" prop="mrsjph">
<el-input v-model="formData.mrsjph" />
</el-form-item>
<el-button type="primary" @click="">试剂维护</el-button>
</el-col>
</el-row>
</el-form>
<!-- 波长对照表 -->
<el-dialog v-model="dialogVisible" title="滤光波长对照表" draggable :close-on-click-modal="false" width="500px">
<div class="mb5">
<el-button type="primary" @click="savaItem">保存</el-button>
<el-button type="primary" @click="addItem">新增</el-button>
<el-button type="danger" @click="delItem">删除</el-button>
</div>
<el-table :data="dzList" style="width: 100%" height="450" border highlight-current-row
@row-click="handleRowClick">
<el-table-column type="index" width="50" label="No" align="center" />
<el-table-column label="滤光片号" prop="lgph">
<template #default="scope">
<el-input v-model="scope.row.lgph" class="full-width-input" />
</template>
</el-table-column>
<el-table-column label="波长" prop="bc">
<template #default="scope">
<el-input v-model="scope.row.bc" class="full-width-input" />
</template>
</el-table-column>
</el-table>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import { queryFilter, addXmFilter, delXmFilter } from '@/api/liswork/xtwh/ComOpt'
import { ElMessage } from 'element-plus';
import { get } from 'lodash';
const yq = defineModel<string>()
const dialogVisible = ref(false)
const formData = ref({
csbc: '',
ckbc: '',
yxgs: '',
shq: '',
xhq: '',
negxx: '',
posxx: '',
negsx: '',
possx: '',
xmxz: '1',
ydfs: '1',
csms: '1',
zbpl: '1',
kbms: '1',
zbsj: '',
mrmb: '',
mrsjph: ''
});
const rules = ref({
csbc: [
{ required: true, message: '请选择测试波长', trigger: 'change' }
],
yxgs: [
{ required: true, message: '请输入阳性判断公式', trigger: 'blur' }
]
});
const form = ref();
const handleSave = () => {
console.log('保存')
form.value.validate((valid: boolean) => {
if (valid) {
console.log('submit!')
}
})
}
const handleCancelEdit = () => {
console.log('取消修改')
}
const handleRestoreDefault = () => {
console.log('还原默认')
}
const dzList = ref<Array<{ lgph: string, bc: string, yq?: string }>>([])
const getDzList = () => {
selectRow.value = null
queryFilter({ yq: yq.value }).then((res: any) => {
dzList.value = res.data
})
}
const selectRow = ref()
const handleRowClick = (row: any) => {
selectRow.value = row
}
const openDz = () => {
getDzList()
dialogVisible.value = true
}
const savaItem = () => {
const flag = dzList.value.every(item => item.bc && item.lgph)
if (!flag) return ElMessage.warning('请检查滤光片号和波长填写!')
addXmFilter(dzList.value).then((res: any) => {
if (res.code == 0) {
ElMessage.success('保存成功!')
getDzList()
}
})
}
const addItem = () => {
dzList.value.push({ lgph: '', bc: '', yq: yq.value })
}
const delItem = () => {
if (!selectRow.value) return ElMessage.warning('请选择要删除的行!')
if (selectRow.value.lgph) {
delXmFilter(selectRow.value)
}
dzList.value = dzList.value.filter(item => item.lgph != selectRow.value.lgph)
selectRow.value = null
}
watch(yq, (newVal) => {
getDzList()
}, { immediate: true })
</script>
<style scoped lang="scss">
.table-toolbar {
margin-bottom: 8px;
height: 36px;
line-height: 36px;
}
.title {
font-family: SourceHanSansCN, SourceHanSansCN;
font-size: 16px;
color: #409eff;
font-weight: 600;
margin-bottom: 8px;
}
</style>

View File

@ -27,7 +27,7 @@
<!-- 右侧列表区域 -->
<el-col :span="20" :xs="24" class="table-col">
<el-row :gutter="10" class="yq-title-row">
<h1 class="yq-title">仪器:{{ yqmc }}</h1>
<h1 class="yq-title">仪器: {{ yqmc }}</h1>
</el-row>
<el-tabs v-model="activeName" type="card" class="tabs_box">
<el-tab-pane v-for="tab in tabList" :key="tab.key" :label="tab.label" :name="tab.key" />
@ -49,6 +49,7 @@ import { getFirstLetter } from '@/utils/pinyin.js'
import SysGlobal from './components/sysGlobal.vue'
import SysInput from './components/sysInput.vue'
import SysReport from './components/sysReport.vue'
import SysParameter from './components/sysParameter.vue'
// ========== TypeScript 类型定义 ==========
interface InstrTreeNode {
@ -105,9 +106,10 @@ const queryParams = ref<QueryParams>({
const tabList = [
{ key: 'SysGlobal', label: '全局设定', component: SysGlobal },
{ key: 'SysInput', label: '界面设定', component: SysInput },
{ key: 'SysParameter', label: '参数', component: SysParameter },
{ key: 'SysReport', label: '报告单设置', component: SysReport },
]
const activeName = ref('SysGlobal')
const activeName = ref('SysParameter')
// 计算当前要渲染的组件
const currentComponent = computed(() => {
@ -336,6 +338,7 @@ getDeptTree()
margin-bottom: 8px;
.yq-title {
font-family: SourceHanSansCN, SourceHanSansCN;
font-size: 16px; // 缩小h1字体(默认24px→16px)
color: #409eff; // 蓝色(Element Plus主题色)
font-weight: 600;