增加折点维护字典
This commit is contained in:
parent
409d625a95
commit
0daeb17792
55
src/api/liswork/xtwh/AntibioticBreakpointApi.ts
Normal file
55
src/api/liswork/xtwh/AntibioticBreakpointApi.ts
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
// 抗生素折点范围字典 API
|
||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 获取菌属列表(从 xm_meddetail 表)
|
||||||
|
export function getGermClassList(params?: any) {
|
||||||
|
return request({
|
||||||
|
url: '/xm/meddetail/germclass/list',
|
||||||
|
method: 'get',
|
||||||
|
params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取抗生素字典列表(从 xm_med 表)
|
||||||
|
export function getAntibioticList(params?: any) {
|
||||||
|
return request({
|
||||||
|
url: '/xm/med/list',
|
||||||
|
method: 'get',
|
||||||
|
params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取折点范围数据
|
||||||
|
export function getBreakpointList(params: any) {
|
||||||
|
return request({
|
||||||
|
url: '/xm/breakpoint/list',
|
||||||
|
method: 'get',
|
||||||
|
params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存折点范围
|
||||||
|
export function saveBreakpoint(data: any) {
|
||||||
|
return request({
|
||||||
|
url: '/xm/breakpoint',
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 批量保存折点范围
|
||||||
|
export function batchSaveBreakpoint(data: any[]) {
|
||||||
|
return request({
|
||||||
|
url: '/xm/breakpoint/batch',
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除折点范围
|
||||||
|
export function deleteBreakpoint(id: number) {
|
||||||
|
return request({
|
||||||
|
url: `/xm/breakpoint/${id}`,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
@ -222,6 +222,28 @@ export const dynamicRoutes = [{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
// ========== 抗生素折点范围字典 ==========
|
||||||
|
{
|
||||||
|
path: '/liswork/xtwh/antibioticBreakpoint',
|
||||||
|
component: Layout,
|
||||||
|
hidden: false,
|
||||||
|
permissions: ['liswork:xtwh:antibioticBreakpoint:list'],
|
||||||
|
meta: {
|
||||||
|
title: '抗生素折点范围字典',
|
||||||
|
icon: 'el-icon-menu'
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: '',
|
||||||
|
name: 'AntibioticBreakpoint',
|
||||||
|
component: () => import('@/views/liswork/xtwh/antibioticBreakpoint/index'),
|
||||||
|
meta: {
|
||||||
|
title: '抗生素折点范围字典',
|
||||||
|
noCache: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@ -101,8 +101,7 @@ function base64ToBlob(base64: string, mimeType: string) {
|
|||||||
* @param type 可选,'pdf' | 'excel',不传默认 pdf
|
* @param type 可选,'pdf' | 'excel',不传默认 pdf
|
||||||
* @param fileName 可选,excel下载文件名
|
* @param fileName 可选,excel下载文件名
|
||||||
*/
|
*/
|
||||||
function printBase64PDF(base64: string, type: 'pdf' | 'excel' = 'pdf', fileName: string = '文件') {
|
function printBase64PDF(base64: string) {
|
||||||
if (type === 'pdf') {
|
|
||||||
// PDF打印逻辑
|
// PDF打印逻辑
|
||||||
const blob = base64ToBlob(base64, 'application/pdf');
|
const blob = base64ToBlob(base64, 'application/pdf');
|
||||||
const pdfUrl = URL.createObjectURL(blob);
|
const pdfUrl = URL.createObjectURL(blob);
|
||||||
@ -117,18 +116,23 @@ function printBase64PDF(base64: string, type: 'pdf' | 'excel' = 'pdf', fileName:
|
|||||||
iframe.remove(); // 修复原代码iframe残留dom
|
iframe.remove(); // 修复原代码iframe残留dom
|
||||||
}, 1000);
|
}, 1000);
|
||||||
};
|
};
|
||||||
} else if (type === 'excel') {
|
}
|
||||||
// excel导出下载逻辑
|
|
||||||
const blob = base64ToBlob(base64, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
|
/**
|
||||||
const downloadUrl = URL.createObjectURL(blob);
|
* 后端返回Blob文件流
|
||||||
const a = document.createElement('a');
|
* @param pdfBlob 后端接口返回的文件流blob,responseType:blob
|
||||||
a.href = downloadUrl;
|
*/
|
||||||
a.download = encodeURIComponent(fileName + '.xlsx');
|
function printBlobPDF(pdfBlob: Blob, fileName: string) {
|
||||||
document.body.appendChild(a);
|
|
||||||
a.click();
|
const pdfUrl = URL.createObjectURL(pdfBlob);
|
||||||
a.remove();
|
const iframe = document.createElement('iframe');
|
||||||
URL.revokeObjectURL(downloadUrl);
|
iframe.style.display = 'none';
|
||||||
}
|
iframe.src = pdfUrl;
|
||||||
|
document.body.appendChild(iframe);
|
||||||
|
iframe.onload = () => {
|
||||||
|
iframe.contentWindow?.print();
|
||||||
|
setTimeout(() => URL.revokeObjectURL(pdfUrl), 1000); // 释放内存
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -209,5 +213,35 @@ function calcMeanWithSymbols(arr) {
|
|||||||
// 保留2位小数返回
|
// 保留2位小数返回
|
||||||
return Math.round(avg * 100) / 100
|
return Math.round(avg * 100) / 100
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 导出文件(Excel下载)
|
||||||
|
* @param blob 文件二进制blob
|
||||||
|
* @param fileName 文件名
|
||||||
|
*/
|
||||||
|
function exportFile(blob: Blob, fileName: string) {
|
||||||
|
const a = document.createElement('a')
|
||||||
|
const url = URL.createObjectURL(blob)
|
||||||
|
a.href = url
|
||||||
|
a.download = fileName
|
||||||
|
document.body.appendChild(a)
|
||||||
|
a.click()
|
||||||
|
// 释放内存
|
||||||
|
URL.revokeObjectURL(url)
|
||||||
|
a.remove()
|
||||||
|
}
|
||||||
|
|
||||||
export const classCom = { decimalToHexColor, convertHexToNumber, getContrastTextColor, printBase64PDF, printPDF, useAutoSize, getDayDiff, calcMeanWithSymbols }
|
|
||||||
|
|
||||||
|
|
||||||
|
export const classCom = {
|
||||||
|
decimalToHexColor,
|
||||||
|
convertHexToNumber,
|
||||||
|
getContrastTextColor,
|
||||||
|
printBase64PDF,
|
||||||
|
printPDF,
|
||||||
|
useAutoSize,
|
||||||
|
getDayDiff,
|
||||||
|
calcMeanWithSymbols,
|
||||||
|
exportFile,
|
||||||
|
printBlobPDF
|
||||||
|
}
|
||||||
|
|||||||
@ -77,7 +77,6 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import SelectTable from '@/components/SelectTable/index.vue';
|
import SelectTable from '@/components/SelectTable/index.vue';
|
||||||
import { getDictData, formatDict, dictData } from '@/hooks'
|
import { getDictData, formatDict, dictData } from '@/hooks'
|
||||||
import { E } from 'vue-router/dist/router-CWoNjPRp.mjs';
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
labPat: {
|
labPat: {
|
||||||
|
|||||||
549
src/views/liswork/xtwh/antibioticBreakpoint/index.vue
Normal file
549
src/views/liswork/xtwh/antibioticBreakpoint/index.vue
Normal file
@ -0,0 +1,549 @@
|
|||||||
|
/**
|
||||||
|
* @file index.vue 抗生素折点范围字典
|
||||||
|
* @author: w
|
||||||
|
* @since: 2026-09-16
|
||||||
|
*/
|
||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<div class="unified-panel">
|
||||||
|
<div class="btn-bar">
|
||||||
|
<el-button type="primary" icon="Search" @click="search">查询</el-button>
|
||||||
|
<el-button type="primary" icon="Check" @click="saveBreakpoints">保存</el-button>
|
||||||
|
<el-button type="warning" icon="Refresh" @click="reset">重置</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="content-container">
|
||||||
|
<!-- 左栏:菌属树 -->
|
||||||
|
<div class="panel left-panel">
|
||||||
|
<div class="panel-header">菌属</div>
|
||||||
|
<div class="panel-content">
|
||||||
|
<el-input v-model="treeFilter" placeholder="搜索菌属" size="small" clearable style="padding: 4px;" />
|
||||||
|
<el-tree
|
||||||
|
ref="treeRef"
|
||||||
|
:data="germClassTree"
|
||||||
|
:props="{ label: 'label', children: 'children' }"
|
||||||
|
node-key="zddh"
|
||||||
|
highlight-current
|
||||||
|
default-expand-all
|
||||||
|
:filter-node-method="filterNode"
|
||||||
|
@node-click="handleTreeNodeClick"
|
||||||
|
>
|
||||||
|
<template #default="{ node, data }">
|
||||||
|
<span class="tree-node">
|
||||||
|
<span class="tree-code">{{ data.zddh }}</span>
|
||||||
|
<span class="tree-name">{{ data.zdmc }}</span>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-tree>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 中栏:折点范围编辑 -->
|
||||||
|
<div class="panel middle-panel">
|
||||||
|
<div class="panel-header">折点范围编辑</div>
|
||||||
|
<div class="panel-content">
|
||||||
|
<el-table
|
||||||
|
:data="breakpointList"
|
||||||
|
border
|
||||||
|
size="mini"
|
||||||
|
height="100%"
|
||||||
|
style="width: 100%"
|
||||||
|
>
|
||||||
|
<el-table-column prop="ywdh" label="药物代号" width="90" fixed />
|
||||||
|
<el-table-column label="抗生素" width="130" fixed show-overflow-tooltip>
|
||||||
|
<template #default="scope">{{ getMedName(scope.row.ywdh) }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="S(MIC<=)" width="75">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-input v-model="scope.row.mic1" size="small" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="R(MIC>=)" width="75">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-input v-model="scope.row.mic2" size="small" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="micref" label="MIC折点" width="130" show-overflow-tooltip />
|
||||||
|
<el-table-column label="S(KB>=)" width="75">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-input v-model="scope.row.rad1" size="small" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="R(KB<=)" width="75">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-input v-model="scope.row.rad2" size="small" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="radref" label="KB折点" width="130" show-overflow-tooltip />
|
||||||
|
<el-table-column label="I=SDD" width="45" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-checkbox v-model="scope.row.sddfalg" :true-value="1" :false-value="null" class="sdd-checkbox" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="xh" label="序号" width="55" />
|
||||||
|
<el-table-column label="操作" width="65" fixed="right">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button type="danger" link size="small" @click="removeBreakpoint(scope.$index)">删除</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 右栏:抗生素字典 -->
|
||||||
|
<div class="panel right-panel">
|
||||||
|
<div class="panel-header">抗生素字典</div>
|
||||||
|
<div class="panel-content right-content">
|
||||||
|
<el-input v-model="antibioticFilter" placeholder="搜索抗生素" size="small" clearable style="padding: 4px;" />
|
||||||
|
<el-table
|
||||||
|
:data="filteredAntibioticList"
|
||||||
|
border
|
||||||
|
size="mini"
|
||||||
|
height="100%"
|
||||||
|
style="width: 100%"
|
||||||
|
@row-dblclick="handleAddBreakpoint"
|
||||||
|
>
|
||||||
|
<el-table-column prop="ywdh" label="代号" width="85" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="ywmc" label="药物名称" width="140" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="zjf" label="简码" width="70" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="yydh" label="英文代码" width="130" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="zjmic" label="中介MIC" width="90" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="nymic" label="尿MIC" width="85" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="multimic" label="多级参数" width="75" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="yf" label="用法" width="80" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="xyfz" label="血药浓度" width="80" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="seq" label="序号" width="55" show-overflow-tooltip />
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, onMounted, computed, watch } from 'vue'
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
import {
|
||||||
|
getGermClassList,
|
||||||
|
getAntibioticList,
|
||||||
|
getBreakpointList,
|
||||||
|
batchSaveBreakpoint
|
||||||
|
} from '@/api/liswork/xtwh/AntibioticBreakpointApi'
|
||||||
|
|
||||||
|
const treeRef = ref(null)
|
||||||
|
const treeFilter = ref('')
|
||||||
|
const antibioticFilter = ref('')
|
||||||
|
const germClassList = ref([])
|
||||||
|
const antibioticList = ref([])
|
||||||
|
const breakpointList = ref([])
|
||||||
|
const currentGermClass = ref(null)
|
||||||
|
const loading = ref(false)
|
||||||
|
let rowWatchers = []
|
||||||
|
|
||||||
|
const germClassTree = computed(() => {
|
||||||
|
return germClassList.value.map(item => ({
|
||||||
|
...item,
|
||||||
|
label: `${item.zddh} ${item.zdmc}`
|
||||||
|
}))
|
||||||
|
})
|
||||||
|
|
||||||
|
const getMedName = (ywdh) => {
|
||||||
|
return antibioticList.value.find(m => m.ywdh === ywdh)?.ywmc || ''
|
||||||
|
}
|
||||||
|
|
||||||
|
const filteredAntibioticList = computed(() => {
|
||||||
|
const kw = antibioticFilter.value.trim().toLowerCase()
|
||||||
|
if (!kw) return antibioticList.value
|
||||||
|
return antibioticList.value.filter(m =>
|
||||||
|
m.ywmc?.toLowerCase().includes(kw) ||
|
||||||
|
m.ywdh?.toLowerCase().includes(kw) ||
|
||||||
|
m.zjf?.toLowerCase().includes(kw) ||
|
||||||
|
m.yydh?.toLowerCase().includes(kw)
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
const calcMicRef = (mic1, mic2) => {
|
||||||
|
const s = mic1 != null && mic1 !== '' ? Number(mic1) : null
|
||||||
|
const r = mic2 != null && mic2 !== '' ? Number(mic2) : null
|
||||||
|
if (s == null && r == null) return ''
|
||||||
|
if (s != null && r != null) {
|
||||||
|
const mid = buildMicMiddle(s, r)
|
||||||
|
return `<=${s}${mid ? ', ' + mid : ''}, >=${r}`
|
||||||
|
}
|
||||||
|
return s != null ? `<=${s}` : `>=${r}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const calcRadRef = (rad1, rad2) => {
|
||||||
|
const s = rad1 != null && rad1 !== '' ? Number(rad1) : null
|
||||||
|
const r = rad2 != null && rad2 !== '' ? Number(rad2) : null
|
||||||
|
if (s == null && r == null) return ''
|
||||||
|
if (s != null && r != null) {
|
||||||
|
const mid = buildRadMiddle(s, r)
|
||||||
|
return `>=${r}${mid ? ', ' + mid : ''}, <=${s}`
|
||||||
|
}
|
||||||
|
return r != null ? `>=${r}` : `<=${s}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const buildMicMiddle = (s, r) => {
|
||||||
|
if (r - s <= 1) return ''
|
||||||
|
if (Number.isInteger(s) && Number.isInteger(r)) {
|
||||||
|
return `${s + 1}-${r - 1}`
|
||||||
|
}
|
||||||
|
const vals = []
|
||||||
|
let v = s + 1
|
||||||
|
while (v < r) {
|
||||||
|
vals.push(Number.isInteger(v) ? v.toString() : v.toFixed(1))
|
||||||
|
v = Math.round((v + 1) * 10) / 10
|
||||||
|
}
|
||||||
|
return vals.join(',')
|
||||||
|
}
|
||||||
|
|
||||||
|
const buildRadMiddle = (s, r) => {
|
||||||
|
if (r - s <= 1) return ''
|
||||||
|
return `${s + 1}-${r - 1}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const setupBreakpointWatchers = (row) => {
|
||||||
|
return [
|
||||||
|
watch(() => row.mic1, val => { row.micref = calcMicRef(val, row.mic2) }),
|
||||||
|
watch(() => row.mic2, val => { row.micref = calcMicRef(row.mic1, val) }),
|
||||||
|
watch(() => row.rad1, val => { row.radref = calcRadRef(val, row.rad2) }),
|
||||||
|
watch(() => row.rad2, val => { row.radref = calcRadRef(row.rad1, val) })
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(treeFilter, val => {
|
||||||
|
treeRef.value?.filter(val)
|
||||||
|
})
|
||||||
|
|
||||||
|
const filterNode = (value, data) => {
|
||||||
|
if (!value) return true
|
||||||
|
return data.zdmc.includes(value) || data.zddh.toLowerCase().includes(value.toLowerCase())
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadGermClassList = () => {
|
||||||
|
getGermClassList().then(res => {
|
||||||
|
germClassList.value = res.data || []
|
||||||
|
if (germClassList.value.length > 0) {
|
||||||
|
currentGermClass.value = germClassList.value[0]
|
||||||
|
loadBreakpoints()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadAntibioticList = () => {
|
||||||
|
getAntibioticList().then(res => {
|
||||||
|
antibioticList.value = res.data || []
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadBreakpoints = () => {
|
||||||
|
if (!currentGermClass.value) return
|
||||||
|
loading.value = true
|
||||||
|
getBreakpointList({ germClassCode: currentGermClass.value.zddh }).then(res => {
|
||||||
|
rowWatchers.forEach(stop => stop())
|
||||||
|
rowWatchers = []
|
||||||
|
breakpointList.value = res.data || []
|
||||||
|
breakpointList.value.forEach(row => {
|
||||||
|
rowWatchers.push(...setupBreakpointWatchers(row))
|
||||||
|
})
|
||||||
|
}).finally(() => {
|
||||||
|
loading.value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleTreeNodeClick = (data) => {
|
||||||
|
currentGermClass.value = data
|
||||||
|
loadBreakpoints()
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleAddBreakpoint = (row) => {
|
||||||
|
if (!currentGermClass.value) {
|
||||||
|
ElMessage.warning('请先选择菌属')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const exists = breakpointList.value.some(item => item.ywdh === row.ywdh)
|
||||||
|
if (exists) {
|
||||||
|
ElMessage.warning(`${row.ywmc} 已在折点列表中`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const maxXh = breakpointList.value.reduce((max, item) => Math.max(max, item.xh || 0), 0)
|
||||||
|
const newRow = {
|
||||||
|
ywdh: row.ywdh,
|
||||||
|
mic1: null,
|
||||||
|
mic2: null,
|
||||||
|
rad1: null,
|
||||||
|
rad2: null,
|
||||||
|
micref: '',
|
||||||
|
radref: '',
|
||||||
|
xh: maxXh + 10,
|
||||||
|
sddfalg: null,
|
||||||
|
bz: null
|
||||||
|
}
|
||||||
|
breakpointList.value.push(newRow)
|
||||||
|
rowWatchers.push(...setupBreakpointWatchers(newRow))
|
||||||
|
}
|
||||||
|
|
||||||
|
const removeBreakpoint = (index) => {
|
||||||
|
breakpointList.value.splice(index, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const search = () => {
|
||||||
|
loadGermClassList()
|
||||||
|
loadAntibioticList()
|
||||||
|
if (currentGermClass.value) {
|
||||||
|
loadBreakpoints()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const saveBreakpoints = () => {
|
||||||
|
if (!currentGermClass.value) {
|
||||||
|
ElMessage.warning('请先选择菌属')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (breakpointList.value.length === 0) {
|
||||||
|
ElMessage.warning('没有可保存的数据')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = breakpointList.value.map(item => ({
|
||||||
|
yq: '_med_',
|
||||||
|
xmdh: currentGermClass.value.zddh,
|
||||||
|
ywzmc: '菌属',
|
||||||
|
ywdh: item.ywdh,
|
||||||
|
mic1: item.mic1 != null ? Number(item.mic1) : null,
|
||||||
|
mic2: item.mic2 != null ? Number(item.mic2) : null,
|
||||||
|
rad1: item.rad1 != null ? Number(item.rad1) : null,
|
||||||
|
rad2: item.rad2 != null ? Number(item.rad2) : null,
|
||||||
|
xh: item.xh,
|
||||||
|
micref: item.micref,
|
||||||
|
radref: item.radref,
|
||||||
|
sddfalg: item.sddfalg,
|
||||||
|
bz: item.bz
|
||||||
|
}))
|
||||||
|
|
||||||
|
batchSaveBreakpoint(data).then(() => {
|
||||||
|
ElMessage.success('保存成功')
|
||||||
|
loadBreakpoints()
|
||||||
|
}).catch(() => {
|
||||||
|
ElMessage.error('保存失败')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const reset = () => {
|
||||||
|
if (currentGermClass.value) {
|
||||||
|
loadBreakpoints()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
search()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.app-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: #d5d5d5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.unified-panel {
|
||||||
|
background: #e6f7fa;
|
||||||
|
border-right: 1px solid #d9e8fb;
|
||||||
|
border-bottom: 1px solid #d9e8fb;
|
||||||
|
border-left: 1px solid #d9e8fb;
|
||||||
|
border-radius: 0 0 8px 8px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow: hidden;
|
||||||
|
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);
|
||||||
|
margin-top: -10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-bar {
|
||||||
|
padding: 8px 12px 8px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-container {
|
||||||
|
display: flex;
|
||||||
|
flex: 1;
|
||||||
|
gap: 5px;
|
||||||
|
padding: 10px;
|
||||||
|
overflow: hidden;
|
||||||
|
min-height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
background: #fff;
|
||||||
|
border: 1px solid #d9e8fb;
|
||||||
|
border-radius: 4px;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-header {
|
||||||
|
padding: 8px 12px;
|
||||||
|
background: #f0f8ff;
|
||||||
|
border-bottom: 1px solid #d9e8fb;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #3282F6;
|
||||||
|
font-family: SimSun, "宋体", serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-content {
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
min-height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left-panel {
|
||||||
|
width: 220px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.middle-panel {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 400px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right-panel {
|
||||||
|
width: 560px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
:deep(.el-table) {
|
||||||
|
flex: 1;
|
||||||
|
min-height: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 表格样式
|
||||||
|
:deep(.el-table) {
|
||||||
|
--el-table-row-height: 20px;
|
||||||
|
--el-table-header-row-height: 26px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-table__header-wrapper th) {
|
||||||
|
height: 26px !important;
|
||||||
|
min-height: 26px !important;
|
||||||
|
max-height: 26px !important;
|
||||||
|
line-height: 26px !important;
|
||||||
|
padding: 0 4px !important;
|
||||||
|
white-space: nowrap !important;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
font-family: SimSun, "宋体", serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-table__body-wrapper td) {
|
||||||
|
height: 20px !important;
|
||||||
|
min-height: 20px !important;
|
||||||
|
max-height: 20px !important;
|
||||||
|
line-height: 20px !important;
|
||||||
|
padding: 0 !important;
|
||||||
|
font-family: SimSun, "宋体", serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-table__cell) {
|
||||||
|
font-family: SimSun, "宋体", serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-table__cell .cell) {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
height: 100%;
|
||||||
|
padding: 0 2px;
|
||||||
|
line-height: 20px;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-table__body-wrapper .el-input) {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-table__body-wrapper .el-input__wrapper) {
|
||||||
|
height: 100%;
|
||||||
|
box-shadow: none;
|
||||||
|
border-radius: 0;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-table__body-wrapper .el-input__inner) {
|
||||||
|
height: 100%;
|
||||||
|
line-height: 20px;
|
||||||
|
padding: 0;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tree-node {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
font-size: 12px;
|
||||||
|
font-family: SimSun, "宋体", serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tree-code {
|
||||||
|
color: #3282F6;
|
||||||
|
font-weight: 600;
|
||||||
|
min-width: 36px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tree-name {
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-tree) {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-tree-node__content) {
|
||||||
|
height: 26px;
|
||||||
|
padding-left: 4px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-tree-node__content:hover) {
|
||||||
|
background: #ecf5ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-tree-node.is-current > .el-tree-node__content) {
|
||||||
|
background: #409eff;
|
||||||
|
color: #fff;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-tree-node.is-current > .el-tree-node__content .tree-code) {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-tree-node.is-current > .el-tree-node__content .tree-name) {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.sdd-checkbox) {
|
||||||
|
margin: 0 auto;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.sdd-checkbox .el-checkbox__input) {
|
||||||
|
transform: scale(1.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
.right-panel :deep(.el-table__row) {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -130,7 +130,8 @@
|
|||||||
<el-input v-model="form.paramName" :placeholder="`请输入${menuname}名称`" />
|
<el-input v-model="form.paramName" :placeholder="`请输入${menuname}名称`" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="`${menuname}默认值`" prop="paramDefvalue">
|
<el-form-item :label="`${menuname}默认值`" prop="paramDefvalue">
|
||||||
<el-select v-model="form.paramDefvalue" :placeholder="`请选择${menuname}默认值`" style="width: 100%" clearable>
|
<el-select v-model="form.paramDefvalue" :placeholder="`请选择${menuname}默认值`" style="width: 100%" clearable
|
||||||
|
filterable allow-create default-first-option>
|
||||||
<el-option v-for="item in defaultOptions" :key="item.value" :label="item.label + ' ' + item.value"
|
<el-option v-for="item in defaultOptions" :key="item.value" :label="item.label + ' ' + item.value"
|
||||||
:value="item.value" />
|
:value="item.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
@ -233,9 +234,8 @@ import {
|
|||||||
updatestatsparam
|
updatestatsparam
|
||||||
} from "@/api/liswork/xtwh/StatsparameterApi.ts";
|
} from "@/api/liswork/xtwh/StatsparameterApi.ts";
|
||||||
import { liststatstemp, copyParameter } from "@/api/liswork/xtwh/StatstemplateApi.ts";
|
import { liststatstemp, copyParameter } from "@/api/liswork/xtwh/StatstemplateApi.ts";
|
||||||
import { copy } from "clipboard";
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
// ========== 基础变量声明(避免提前访问) ==========
|
|
||||||
// 菜单名称
|
// 菜单名称
|
||||||
const menuname = ref("参数");
|
const menuname = ref("参数");
|
||||||
const statsCode = ref("1");
|
const statsCode = ref("1");
|
||||||
@ -349,7 +349,6 @@ const multiple = ref(true); // 是否多选
|
|||||||
const total = ref(0); // 总条数
|
const total = ref(0); // 总条数
|
||||||
const title = ref(""); // 对话框标题
|
const title = ref(""); // 对话框标题
|
||||||
|
|
||||||
// ========== 工具方法 ==========
|
|
||||||
// 获取类别颜色
|
// 获取类别颜色
|
||||||
function getparamTypeColor(type) {
|
function getparamTypeColor(type) {
|
||||||
const item = paramTypeOptions.value.find(item => item.value === type);
|
const item = paramTypeOptions.value.find(item => item.value === type);
|
||||||
@ -380,7 +379,6 @@ function resetForm() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========== 核心业务方法 ==========
|
|
||||||
// 查询列表
|
// 查询列表
|
||||||
function getList() {
|
function getList() {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
@ -389,18 +387,12 @@ function getList() {
|
|||||||
.then(response => {
|
.then(response => {
|
||||||
regdictList.value = response?.rows || [];
|
regdictList.value = response?.rows || [];
|
||||||
total.value = response?.total || 0;
|
total.value = response?.total || 0;
|
||||||
})
|
}).finally(() => {
|
||||||
.catch(() => {
|
|
||||||
regdictList.value = [];
|
|
||||||
total.value = 0;
|
|
||||||
proxy && proxy.$modal.msgError("数据加载失败");
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//获取模板数据
|
||||||
liststatstemp().then(response => {
|
liststatstemp({ pageSize: 100, pageNum: 1 }).then(response => {
|
||||||
copyTemplateOptions.value = response?.rows || [];
|
copyTemplateOptions.value = response?.rows || [];
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user