仪器参数

This commit is contained in:
wyuu 2025-12-16 17:54:51 +08:00
parent 4d3c05c762
commit dbf6cfcd8b
31 changed files with 487 additions and 244 deletions

View File

@ -74,4 +74,28 @@ export function delXmFilter(data?: Object) {
method: 'get', method: 'get',
params: data params: data
}); });
}
// 获取试剂维护数据
export function queryXmLot(data?: Object) {
return request({
url: '/xminfo/queryXmLot',
method: 'get',
params: data
});
}
// 新增试剂维护数据
export function addXmLot(data?: Object) {
return request({
url: '/xminfo/addXmLot',
method: 'post',
data
});
}
// 删除试剂维护数据
export function delXmLot(data?: Object) {
return request({
url: '/xminfo/delXmLot',
method: 'get',
params: data
});
} }

View File

@ -258,6 +258,10 @@
// .el-table__body tr.hover-row>td { // .el-table__body tr.hover-row>td {
// background-color: #a4beef !important; // background-color: #a4beef !important;
// } // }
.el-table__empty-block {
width: 100% !important;
}
} }
.el-table--border { .el-table--border {

View File

@ -44,8 +44,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { reactive, ref, onMounted, watch, nextTick, toRaw } from "vue"; import { reactive, ref, onMounted, watch, nextTick, toRaw } from "vue";
// @ts-ignore import { getFirstLetter } from '@/utils/pinyin';
import { getFirstLetter } from '@/utils/pinyin.js';
import { ElEmpty } from 'element-plus'; import { ElEmpty } from 'element-plus';
// @ts-ignore // @ts-ignore
import { comDict } from '@/utils/dict' import { comDict } from '@/utils/dict'

View File

@ -369,11 +369,9 @@ defineExpose({
<style scoped lang="scss"> <style scoped lang="scss">
.custom-table-wrapper { .custom-table-wrapper {
width: 100%; height: 100%;
} }
// 只在拖拽手柄上显示移动光标 // 只在拖拽手柄上显示移动光标
:deep(.el-table-header-cell .cell) { :deep(.el-table-header-cell .cell) {
cursor: move; cursor: move;

View File

@ -18,8 +18,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, computed, watch, onMounted } from 'vue'; import { ref, computed, watch, onMounted } from 'vue';
import { queryXmInfo } from '@/api/liswork/work/LisWork' import { queryXmInfo } from '@/api/liswork/work/LisWork'
// @ts-ignore import { getFirstLetter } from '@/utils/pinyin'; // 引入拼音处理工具
import { getFirstLetter } from '@/utils/pinyin.js'; // 引入拼音处理工具
// 组件参数 // 组件参数
const props = defineProps({ const props = defineProps({
modelValue: { type: [String, Number], default: '' }, modelValue: { type: [String, Number], default: '' },

View File

@ -15,8 +15,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref, watch, computed, reactive, toRaw } from 'vue'; import { onMounted, ref, watch, computed, reactive, toRaw } from 'vue';
// @ts-ignore import { getFirstLetter } from '@/utils/pinyin';
import { getFirstLetter } from '@/utils/pinyin.js';
interface Props { interface Props {

View File

@ -9,7 +9,7 @@ const instrOptions = ref<{ yq: string; yqmc: string }[]>([]);
export const getYqData = (data?: any) => { export const getYqData = (data?: any) => {
// 避免重复请求 // 避免重复请求
if (instrOptions.value.length > 0) return; // if (instrOptions.value.length > 0) return;
getGroupInstrdList(data).then((res: any) => { getGroupInstrdList(data).then((res: any) => {
if (res.code == 0) { if (res.code == 0) {
instrOptions.value = res.data.map((item: any) => ({ instrOptions.value = res.data.map((item: any) => ({

View File

@ -70,6 +70,12 @@ import ImagePreview from "@/components/ImagePreview"
import TreeSelect from '@/components/TreeSelect' import TreeSelect from '@/components/TreeSelect'
// 字典标签组件 // 字典标签组件
import DictTag from '@/components/DictTag' import DictTag from '@/components/DictTag'
// elTable表格组件
import CustomTable from '@/components/elTable'
// vxeTable 组件
import VxeTable from '@/components/vxeTable'
// 下拉框表格组件
import SelectTable from '@/components/SelectTable'
import print from 'vue3-print-nb'; import print from 'vue3-print-nb';
import Vue3SeamlessScroll from 'vue3-seamless-scroll' // 引入插件 import Vue3SeamlessScroll from 'vue3-seamless-scroll' // 引入插件
const app = createApp(App) const app = createApp(App)
@ -94,6 +100,9 @@ app.component('ImageUpload', ImageUpload)
app.component('ImagePreview', ImagePreview) app.component('ImagePreview', ImagePreview)
app.component('RightToolbar', RightToolbar) app.component('RightToolbar', RightToolbar)
app.component('Editor', Editor) app.component('Editor', Editor)
app.component('CustomTable', CustomTable)
app.component('VxeTable', VxeTable)
app.component('SelectTable', SelectTable)
//VUE3标准方法注入全局方法 //VUE3标准方法注入全局方法
app.provide('comDict', comDict); app.provide('comDict', comDict);

View File

@ -1,43 +0,0 @@
// pinyin.js - 拼音转换工具
// src/utils/pinyin-utils.js
import { pinyin } from 'pinyin-pro';
/**
* 获取文本的拼音首字母
* @param {string} text - 要转换的文本
* @returns {string} - 拼音首字母字符串
*/
export function getFirstLetter(text) {
if (!text) return '';
// 获取拼音(不带音调,数组形式)
const pinyinArray = pinyin(text, { toneType: "none", type: "array" });
// 提取每个拼音的首字母并连接
return pinyinArray.map(word => word.charAt(0)).join('');
}
/**
* 获取文本的拼音全拼
* @param {string} text - 要转换的文本
* @returns {string} - 拼音全拼字符串
*/
export function getFullPinyin(text) {
if (!text) return '';
// 获取拼音(不带音调,字符串形式)
return pinyin(text, { toneType: "none" }).replace(/\s+/g, '');
}
/**
* 处理选项数据,添加拼音和首字母属性
* @param {Array} options - 原始选项数组,每个元素包含id和text属性
* @returns {Array} - 处理后的选项数组,每个元素包含pinyin和firstLetters属性
*/
export function processOptions(options) {
return options.map(option => ({
...option,
pinyin: getFullPinyin(option.text),
firstLetters: getFirstLetter(option.text)
}));
}

60
src/utils/pinyin.ts Normal file
View File

@ -0,0 +1,60 @@
// pinyin.ts - 拼音转换工具
// src/utils/pinyin-utils.ts
import {
pinyin
} from 'pinyin-pro';
/**
* 获取文本的拼音首字母
* @param {string} text - 要转换的文本
* @returns {string} - 拼音首字母字符串
*/
export function getFirstLetter(text: string): string {
if (!text) return '';
// 获取拼音(不带音调,数组形式)
const pinyinArray = pinyin(text, {
toneType: "none",
type: "array"
}) as string[];
// 提取每个拼音的首字母并连接
return pinyinArray.map(word => word.charAt(0)).join('');
}
/**
* 获取文本的拼音全拼
* @param {string} text - 要转换的文本
* @returns {string} - 拼音全拼字符串
*/
export function getFullPinyin(text: string): string {
if (!text) return '';
// 获取拼音(不带音调,字符串形式)
return pinyin(text, {
toneType: "none"
}).replace(/\s+/g, '');
}
interface Option {
id: string | number;
text: string;
}
interface ProcessedOption extends Option {
pinyin: string;
firstLetters: string;
}
/**
* 处理选项数据,添加拼音和首字母属性
* @param {Option[]} options - 原始选项数组,每个元素包含id和text属性
* @returns {ProcessedOption[]} - 处理后的选项数组,每个元素包含pinyin和firstLetters属性
*/
export function processOptions(options: Option[]): ProcessedOption[] {
return options.map(option => ({
...option,
pinyin: getFullPinyin(option.text),
firstLetters: getFirstLetter(option.text)
}));
}

View File

@ -9,7 +9,7 @@
clearable value="value" objKey="value" width="200px" placeholder="项目类别" /> clearable value="value" objKey="value" width="200px" placeholder="项目类别" />
</el-form-item> </el-form-item>
<el-form-item label="快速查找" prop="inputcode"> <el-form-item label="快速查找" prop="inputcode">
<el-input placeholder="快速查找" v-model="formData.inputcode" style="width: 200px;"></el-input> <el-input placeholder="快速查找" v-model="formData.inputcode" clearable style="width: 200px;"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="细菌标志" prop="itemclass"> <el-form-item label="细菌标志" prop="itemclass">
<SelectTable v-model:data="formData.itemclass" :fields="xmglFields" :tableData="dictData.ITEMCLASS" <SelectTable v-model:data="formData.itemclass" :fields="xmglFields" :tableData="dictData.ITEMCLASS"
@ -58,8 +58,8 @@
</div> </div>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button @click="onClose">取 消</el-button>
<el-button type="primary" @click="handleOk">确 定</el-button> <el-button type="primary" @click="handleOk">确 定</el-button>
<el-button @click="onClose">取 消</el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
@ -186,7 +186,12 @@ const handleOk = () => {
}) })
} else if (formData.value.queryDylx == '2') { } else if (formData.value.queryDylx == '2') {
let arr = [] let arr = []
arr = selecRows.value.map((item: any) => { return item.vsid }) arr = selecRows.value.map((item: any) => {
return {
yq: formData.value.yq,
xmid: item.xmid,
}
})
delBatch(arr).then((res: any) => { delBatch(arr).then((res: any) => {
if (res.code == 0) { if (res.code == 0) {
ElMessage.success('操作成功!') ElMessage.success('操作成功!')

View File

@ -50,29 +50,31 @@
</el-col> </el-col>
</el-row> </el-row>
<!-- 表格区域--> <!-- 表格区域-->
<CustomTable ref="tableRef" :data="dataList" :columns="columns" :enable-column-drag="true" <div>
@column-drag-end="handleColumnDragEnd" :config="tableConfig" @row-click="rowChange"> <CustomTable ref="tableRef" :data="dataList" :columns="columns" :enable-column-drag="true"
<template #xmgl="{ row }"> @column-drag-end="handleColumnDragEnd" :config="tableConfig" @row-click="rowChange">
{{ formatDict(row.xmgl, 'XMGL') }} <template #xmgl="{ row }">
</template> {{ formatDict(row.xmgl, 'XMGL') }}
<template #xmlb="{ row }"> </template>
{{ xmlbObj[row.xmlb] }} <template #xmlb="{ row }">
</template> {{ xmlbObj[row.xmlb] }}
<template #jsxm="{ row }"> </template>
{{ row.jsxm === 'Y' ? '是' : '否' }} <template #jsxm="{ row }">
</template> {{ row.jsxm === 'Y' ? '是' : '否' }}
<template #uflag="{ row }"> </template>
{{ row.uflag === '0' ? '否' : '是' }} <template #uflag="{ row }">
</template> {{ row.uflag === '0' ? '否' : '是' }}
<template #yqdl="{ row }"> </template>
{{ formatDict(row.yqdl, 'YQDL') }} <template #yqdl="{ row }">
</template> {{ formatDict(row.yqdl, 'YQDL') }}
</CustomTable> </template>
</CustomTable>
<div class="page-box"> <div class="page-box">
<el-pagination v-model:current-page="queryParams.pageNum" v-model:page-size="queryParams.pageSize" <el-pagination v-model:current-page="queryParams.pageNum" v-model:page-size="queryParams.pageSize"
:page-sizes="[30, 60, 100]" background layout="total, sizes, prev, pager, next,jumper" :total="total" :page-sizes="[30, 60, 100]" background layout="total, sizes, prev, pager, next,jumper" :total="total"
:size="autoSize" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> :size="autoSize" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
</div> </div>
</el-col> </el-col>
<!-- 右侧区域--> <!-- 右侧区域-->
@ -96,9 +98,6 @@ import UseInstr from './tab/useInstr.vue'
import Knowledge from './tab/knowledge.vue' import Knowledge from './tab/knowledge.vue'
import CommonDescriptions from './tab/commonDescriptions.vue' import CommonDescriptions from './tab/commonDescriptions.vue'
import CustomTable from '@/components/elTable/index.vue' import CustomTable from '@/components/elTable/index.vue'
import Sort from './tab/sort.vue'
import Parameter from './tab/parameter.vue';
import ChannelNumber from './tab/channelNumber.vue';
import ReferenceValueDetails from './tab/referenceValueDetails.vue'; import ReferenceValueDetails from './tab/referenceValueDetails.vue';
import { queryXmInfoNewService, queryXmInfoNewDetailService, saveDataService, deleteXmInfoService } from '@/api/liswork/labItem/labItemApi'; import { queryXmInfoNewService, queryXmInfoNewDetailService, saveDataService, deleteXmInfoService } from '@/api/liswork/labItem/labItemApi';
import SelectTable from '@/components/SelectTable/index.vue' import SelectTable from '@/components/SelectTable/index.vue'
@ -150,10 +149,7 @@ const tabList = ref([
{ label: '常用取值', value: 'CommonlyValues' }, { label: '常用取值', value: 'CommonlyValues' },
{ label: '使用仪器', value: 'UseInstr' }, { label: '使用仪器', value: 'UseInstr' },
{ label: '知识库', value: 'Knowledge' }, { label: '知识库', value: 'Knowledge' },
//{ label: '整体排序', value: 'Sort' },
{ label: '常见描述', value: 'CommonDescriptions' }, { label: '常见描述', value: 'CommonDescriptions' },
// { label: '参数', value: 7 },
// { label: '通道号', value: 8 },
{ label: '参考值明细', value: 'ReferenceValueDetails' }, { label: '参考值明细', value: 'ReferenceValueDetails' },
]); ]);
const activeTab = ref('Basic') const activeTab = ref('Basic')
@ -162,7 +158,6 @@ const activeTabMap = {
CommonlyValues, CommonlyValues,
UseInstr, UseInstr,
Knowledge, Knowledge,
Sort,
CommonDescriptions, CommonDescriptions,
ReferenceValueDetails ReferenceValueDetails
} }
@ -230,7 +225,7 @@ const hasUnsavedChanges = ref(false);
// 保存初始数据快照用于比较 // 保存初始数据快照用于比较
const initialModelParam = ref<any>(null); const initialModelParam = ref<any>(null);
const batchInstrVsModel = ref<any>({ const batchInstrVsModel = ref<any>({
visible: true visible: false
}) })

View File

@ -175,8 +175,7 @@ import MultiRef from './child/MultiRef.vue';
import CalcGuilde from './child/CalcGuilde.vue'; import CalcGuilde from './child/CalcGuilde.vue';
import SelectTable from '@/components/SelectTable/index.vue' import SelectTable from '@/components/SelectTable/index.vue'
import Condition from './child/Condition.vue'; import Condition from './child/Condition.vue';
//@ts-ignore import { getFirstLetter } from '@/utils/pinyin';
import { getFirstLetter } from '@/utils/pinyin.js';
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';

View File

@ -5,11 +5,12 @@
<el-row class="input-text"> <el-row class="input-text">
<el-input type="textarea" v-model="inputText"></el-input> <el-input type="textarea" v-model="inputText"></el-input>
</el-row> </el-row>
<el-row> <el-row :gutter="10">
<el-col :span="12"> <el-col :span="12">
<el-input v-model="searchKey" ref="searchInput" size="small" placeholder="快速搜索(支持简拼)" class="mb10" clearable <el-input v-model="searchKey" ref="searchInput" size="small" placeholder="快速搜索(支持简拼)" class="mb5" clearable
@clear="filterDataHandle" @input="filterDataHandle" /> @clear="filterDataHandle" @input="filterDataHandle" />
<CustomTable ref="tableRefs" :data="filterData" :columns="columns" :config="tableConfig" @row-click="rowHandle" <VxeTable ref="tableRefs" :data="filterData" :columns="columns" class="mytable-style"
:scrollYConfig="{ enabled: true, rSize: 30, height: '350', }" @current-change="rowHandle"
:enableColumnDrag="true" @column-drag-end="handleColumnDragEnd" /> :enableColumnDrag="true" @column-drag-end="handleColumnDragEnd" />
</el-col> </el-col>
<el-col :span="12" class="right"> <el-col :span="12" class="right">
@ -38,10 +39,9 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import CustomTable from '@/components/elTable/index.vue' import VxeTable from '@/components/vxeTable/index.vue'
import { queryXmInfoNew } from '@/api/liswork/labItem/labItemApi' import { queryXmInfoNew } from '@/api/liswork/labItem/labItemApi'
// @ts-ignore import { getFirstLetter } from '@/utils/pinyin';
import { getFirstLetter } from '@/utils/pinyin.js';
const props = defineProps({ const props = defineProps({
@ -61,19 +61,10 @@ const tableRefs = ref()
const emit = defineEmits(['update:model-value', 'confirm']) const emit = defineEmits(['update:model-value', 'confirm'])
const columns = ref([ const columns = ref([
{ prop: 'xmdh', label: '项目代号', align: 'center', visible: true, width: 100 }, { field: 'xmdh', title: '项目代号', align: 'center', resizable: true, width: 100 },
{ prop: 'xmmc', label: '项目名称', align: 'center', visible: true, width: 180 } { field: 'xmmc', title: '项目名称', resizable: true, }
]) ])
// 表格配置
const tableConfig = ref(
{
// stripe: true, // 斑马纹
border: true, // 边框
height: '350', // 高度
highlightCurrentRow: true, // 高亮当前行
fit: true
}
)
//向外暴露数据 //向外暴露数据
defineExpose({ inputText }) defineExpose({ inputText })
@ -97,6 +88,7 @@ const rowHandle = (row: any) => {
} }
const onClose = () => { const onClose = () => {
searchKey.value = ''
emit('update:model-value', false) emit('update:model-value', false)
} }
@ -197,7 +189,6 @@ const filterDataHandle = () => {
}); });
if (filterData.value.length > 0) { if (filterData.value.length > 0) {
tableRefs.value.setScrollTop(0)
tableRefs.value.setCurrentRow(filterData.value[0]); tableRefs.value.setCurrentRow(filterData.value[0]);
} }
}; };

View File

@ -20,8 +20,10 @@
</el-row> </el-row>
<el-row class="row-down"> <el-row class="row-down">
<el-col :span="12"> <el-col :span="12">
<VxeTable ref="tableRefs" :data="tableDataDown" :columns="columnsDown" class="mytable-style" <el-input v-model="searchKey" ref="searchInput" size="small" placeholder="快速搜索(支持简拼)" class="mb5" clearable
:scrollYConfig="{ enabled: true, rSize: 30, height: '400', }" @current-change="rowHandleDown" @clear="filterDataHandle" @input="filterDataHandle" />
<VxeTable ref="tableRefs" :data="filterData" :columns="columnsDown" class="mytable-style"
:scrollYConfig="{ enabled: true, rSize: 30, height: '380', }" @current-change="rowHandleDown"
:enableColumnDrag="true" @column-drag-end="handleColumnDragEnd" /> :enableColumnDrag="true" @column-drag-end="handleColumnDragEnd" />
</el-col> </el-col>
<el-col :span="12" class="rigth-col"> <el-col :span="12" class="rigth-col">
@ -48,7 +50,7 @@ import VxeTable from '@/components/vxeTable/index.vue'
import { queryXmInfoNew, queryXmAlarmdetailNew, addXmAlarmdetailNew, delXmAlarmdetailNew } from '@/api/liswork/labItem/labItemApi' import { queryXmInfoNew, queryXmAlarmdetailNew, addXmAlarmdetailNew, delXmAlarmdetailNew } from '@/api/liswork/labItem/labItemApi'
import { XmAlarmdetailNew } from '@/types' import { XmAlarmdetailNew } from '@/types'
import { ElMessageBox, ElMessage } from 'element-plus' import { ElMessageBox, ElMessage } from 'element-plus'
import { getFirstLetter } from '@/utils/pinyin';
const columnsUp = ref([ const columnsUp = ref([
{ prop: 'seq', label: '序号', align: 'center', visible: true, width: 50 }, { prop: 'seq', label: '序号', align: 'center', visible: true, width: 50 },
@ -57,12 +59,17 @@ const columnsUp = ref([
]) ])
const columnsDown = ref([ const columnsDown = ref([
{ field: 'xmdh', title: '项目代号', align: 'center', visible: true, width: 100, resizable: true }, { field: 'xmdh', title: '项目代号', align: 'center', width: 100, resizable: true },
{ field: 'xmmc', title: '项目名称', align: 'center', visible: true, width: 220, resizable: true } { field: 'xmmc', title: '项目名称', resizable: true }
]) ])
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 tableDataUp = ref<Array<XmAlarmdetailNew>>([]) const tableDataUp = ref<Array<XmAlarmdetailNew>>([])
const tableDataDown = ref([]) const tableDataDown = ref<{ [key: string]: any; pinyinMap: Record<string, string> }[]>([])
const selectRowUp = ref<XmAlarmdetailNew>({ const selectRowUp = ref<XmAlarmdetailNew>({
xmid: 0, xmid: 0,
seq: 0, seq: 0,
@ -117,12 +124,59 @@ const onOpen = async () => {
tableDataUp.value = res.data; tableDataUp.value = res.data;
if (!tableDataDown.value.length) { if (!tableDataDown.value.length) {
let res = await queryXmInfoNew(props.formData.xmgl); let res = await queryXmInfoNew(props.formData.xmgl);
tableDataDown.value = res.data; tableDataDown.value = processTableData(res.data)
filterData.value = [...tableDataDown.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 = [...tableDataDown.value];
return;
} else {
currentIndex.value = 0
}
filterData.value = tableDataDown.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 onClose = () => { const onClose = () => {
searchKey.value = ''
tableDataUp.value = [] tableDataUp.value = []
selectRowUp.value = { xmid: 0, seq: 0, samplecondition: '', resultcondition: '' } selectRowUp.value = { xmid: 0, seq: 0, samplecondition: '', resultcondition: '' }
} }

View File

@ -1,49 +0,0 @@
<!--通道号-->
<template>
<div>
<el-row>
<span>说明:“通道号”又称“接口代号”,是指仪器向电脑传送结果时项目的标识符,接口代号对于一个仪器不可重复。</span>
</el-row>
<div class="modifyClass">
<el-button type="primary" @click="">增加</el-button>
<el-button type="primary" @click="">删除</el-button>
</div>
<CustomTable ref="tableRef" :data="dataList" :columns="columns" :enable-column-drag="true" @column-drag-end="handleColumnDragEnd"
:config="tableConfig"/>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import CustomTable from '@/components/elTable/index.vue'
const props = defineProps({
// 是否显示
visible: {
type: Boolean,
required: true,
default: false
}
});
const tableRef = ref<any>(null);
const dataList = ref();
const columns = ref([
{ prop: 'tdh', label: '通道号', visible: true, align: 'center', width: 100 },
{ prop: 'yq', label: '仪器', visible: true, align: 'center', width: 200 },
{ prop: 'xmdh', label: '英文缩写', visible: true, align: 'center', width: 200 }
]);
const tableConfig = ref({
border: true, // 边框
height: '76vh', // 高度
highlightCurrentRow: true, // 高亮当前行
// cellStyle: cellStyleHd
})
//退拽属性
const handleColumnDragEnd = (data: any) => {
// 更新列配置
columns.value = data.columns;
}
</script>

View File

@ -1,51 +0,0 @@
<template>
<!-- 整体排序 -->
<div>
<div class="modifyClass">
<el-button type="primary" @click="">首位</el-button>
<el-button type="primary" @click="">↑上移</el-button>
<el-button type="primary" @click="">↓下移</el-button>
<el-button type="primary" @click="">末位</el-button>
</div>
<CustomTable ref="tableRef" :data="dataList" :columns="columns" :enable-column-drag="true" @column-drag-end="handleColumnDragEnd"
:config="tableConfig"/>
</div>
</template>
<script setup lang="ts">
import CustomTable from '@/components/elTable/index.vue'
import { ref } from 'vue';
const props = defineProps({
dataList: {
type: Array,
default: []
}
});
const tableRef = ref<any>(null);
const dataList = ref();
const columns = ref([
{ prop: 'xmgl', label: '项目类别', visible: true, align: 'center', width: 200 },
{ prop: 'xmid', label: '项目ID', visible: true, align: 'center', width: 100 },
{ prop: 'xmdh', label: '英文缩写', visible: true, align: 'center', width: 100 },
{ prop: 'xmmc', label: '项目名称,', visible: true, align: 'center', width: 100 },
{ prop: 'dyxh', label: '整体排序,', visible: true, align: 'center', width: 100 },
{ prop: 'fzdyxh', label: '分组打印序号,', visible: true, align: 'center', width: 100 },
]);
const tableConfig = ref({
border: true, // 边框
height: '80vh', // 高度
highlightCurrentRow: true, // 高亮当前行
// cellStyle: cellStyleHd
})
//退拽属性
const handleColumnDragEnd = (data: any) => {
// 更新列配置
columns.value = data.columns;
}
</script>

View File

@ -18,7 +18,7 @@
<script setup> <script setup>
import { ref, computed, watch, onMounted } from 'vue'; import { ref, computed, watch, onMounted } from 'vue';
import { getmedgroupList } from '@/api/liswork/micro/index'; import { getmedgroupList } from '@/api/liswork/micro/index';
import { getFirstLetter } from '@/utils/pinyin.js'; // 引入拼音处理工具 import { getFirstLetter } from '@/utils/pinyin'; // 引入拼音处理工具
// 组件参数 // 组件参数
const props = defineProps({ const props = defineProps({
modelValue: { type: [String, Number], default: '' }, modelValue: { type: [String, Number], default: '' },

View File

@ -18,7 +18,7 @@
<script setup> <script setup>
import { ref, computed, watch, onMounted } from 'vue'; import { ref, computed, watch, onMounted } from 'vue';
import { getmeddictList } from '@/api/liswork/micro/index'; import { getmeddictList } from '@/api/liswork/micro/index';
import { getFirstLetter } from '@/utils/pinyin.js'; // 引入拼音处理工具 import { getFirstLetter } from '@/utils/pinyin'; // 引入拼音处理工具
// 组件参数 // 组件参数
const props = defineProps({ const props = defineProps({
modelValue: { type: [String, Number], default: '' }, modelValue: { type: [String, Number], default: '' },

View File

@ -18,8 +18,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, computed, watch, onMounted } from 'vue'; import { ref, computed, watch, onMounted } from 'vue';
import { getbactmediumList } from '@/api/liswork/micro/index'; import { getbactmediumList } from '@/api/liswork/micro/index';
// @ts-ignore import { getFirstLetter } from '@/utils/pinyin'; // 引入拼音处理工具
import { getFirstLetter } from '@/utils/pinyin.js'; // 引入拼音处理工具
// 组件参数 // 组件参数
const props = defineProps({ const props = defineProps({
modelValue: { type: [String, Number], default: '' }, modelValue: { type: [String, Number], default: '' },

View File

@ -37,7 +37,7 @@
import { ref, computed, watch, onMounted } from 'vue'; import { ref, computed, watch, onMounted } from 'vue';
import { Loading, ArrowDown } from '@element-plus/icons-vue'; import { Loading, ArrowDown } from '@element-plus/icons-vue';
import { getFirstLetter } from '@/utils/pinyin.js'; // 引入拼音处理工具 import { getFirstLetter } from '@/utils/pinyin'; // 引入拼音处理工具
// 组件参数 // 组件参数
const props = defineProps({ const props = defineProps({
modelValue: { type: [String, Number], default: '' }, modelValue: { type: [String, Number], default: '' },

View File

@ -38,7 +38,7 @@
<script setup> <script setup>
import { ref, computed, watch, onMounted } from 'vue'; import { ref, computed, watch, onMounted } from 'vue';
import { getFirstLetter } from '@/utils/pinyin.js'; // 拼音处理工具 import { getFirstLetter } from '@/utils/pinyin'; // 拼音处理工具
// 组件参数 // 组件参数
const props = defineProps({ const props = defineProps({

View File

@ -9,7 +9,7 @@
//import { ref, computed, watch, defineProps, defineEmits } from 'vue'; //import { ref, computed, watch, defineProps, defineEmits } from 'vue';
import Select2 from 'vue3-select2-component'; import Select2 from 'vue3-select2-component';
import 'select2/dist/css/select2.min.css'; import 'select2/dist/css/select2.min.css';
import { processOptions } from '@/utils/pinyin.js'; // 引入拼音处理工具 import { processOptions } from '@/utils/pinyin'; // 引入拼音处理工具
// 定义组件props // 定义组件props
const props = defineProps({ const props = defineProps({

View File

@ -0,0 +1,84 @@
<template>
<!-- 通道号配置 -->
<div class="table-container">
<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="addItem">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" @click="delItem">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" @click="allClear">清除所有项目接口号</el-button>
</el-col>
</el-row>
<el-row :gutter="10" class="table-row">
<el-col :span="12" class="table-box">
<el-table :data="tableData" height="100%" border highlight-current-row>
<el-table-column label="通道号" align="center">
<template #default="scope">
<el-input v-model="scope.row.channel" placeholder="请输入通道号" class="full-width-input" />
</template>
</el-table-column>
</el-table>
</el-col>
<el-col :span="6">
<div class="tips">
说明:
“通道号”又称“接口代号”,是指仪器向电脑传送结果时项目的
标识符
接口代号对于一个仪器不可重复。
</div>
</el-col>
</el-row>
</div>
</template>
<script setup lang="ts">
const tableData = ref<Array<{ channel: string }>>([]);
const handleSave = () => {
};
const addItem = () => {
tableData.value.push({ channel: '' })
};
const delItem = () => {
}
const allClear = () => {
}
</script>
<style scoped lang="scss">
.table-container {
height: 100%;
}
.table-toolbar {
margin-bottom: 8px;
height: 36px;
line-height: 36px;
}
.tips {
font-family: SourceHanSansCN, SourceHanSansCN;
font-size: 16px;
color: #409eff;
font-weight: 600;
}
.table-row {
height: calc(100% - 45px);
.table-box {
height: 100%;
}
}
</style>

View File

@ -75,8 +75,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ElMessage, ElTree, TreeNode, ElMessageBox, ElBadge } from 'element-plus' import { ElMessage, ElTree, TreeNode, ElMessageBox, ElBadge } from 'element-plus'
import { paramList, paramTree, getdef, updateParam } from '@/api/liswork/xtwh/ComOpt' import { paramList, paramTree, getdef, updateParam } from '@/api/liswork/xtwh/ComOpt'
// @ts-ignore import { getFirstLetter } from '@/utils/pinyin'
import { getFirstLetter } from '@/utils/pinyin.js'
// @ts-ignore // @ts-ignore
import DynamicInput from "@/views/liswork/xtwh/localconfig/components/DynamicInput.vue" import DynamicInput from "@/views/liswork/xtwh/localconfig/components/DynamicInput.vue"
const emits = defineEmits(['updateTree']) const emits = defineEmits(['updateTree'])
@ -92,7 +91,7 @@ interface RegDictItem {
remark: string remark: string
} }
// 列表相关 // 列表相关
const optiontype= ref<string>("SYSTEM") const optiontype = ref<string>("SYSTEM")
const menuname = ref<string>("系统全局") const menuname = ref<string>("系统全局")
const regdictList = ref<RegDictItem[]>([]) const regdictList = ref<RegDictItem[]>([])
const originRegdictList = ref<RegDictItem[]>([]) const originRegdictList = ref<RegDictItem[]>([])
@ -124,7 +123,7 @@ const tableData3 = computed<RegDictItem[]>(() => {
const getList = async (): Promise<void> => { const getList = async (): Promise<void> => {
loading.value = true loading.value = true
try { try {
const response = await paramList({ yq: yq.value,optiontype:optiontype.value }) const response = await paramList({ yq: yq.value, optiontype: optiontype.value })
regdictList.value = JSON.parse(JSON.stringify(response.data)) regdictList.value = JSON.parse(JSON.stringify(response.data))
originRegdictList.value = JSON.parse(JSON.stringify(response.data)) originRegdictList.value = JSON.parse(JSON.stringify(response.data))
total.value = response.data.length total.value = response.data.length
@ -187,7 +186,7 @@ const handleRestoreDefault = async (): Promise<void> => {
).then(async () => { ).then(async () => {
loading.value = true loading.value = true
try { try {
const res = await getdef({optiontype:optiontype.value }) const res = await getdef({ optiontype: optiontype.value })
regdictList.value = JSON.parse(JSON.stringify(res.data)) regdictList.value = JSON.parse(JSON.stringify(res.data))
originRegdictList.value = JSON.parse(JSON.stringify(res.data)) originRegdictList.value = JSON.parse(JSON.stringify(res.data))
total.value = res.data.length total.value = res.data.length

View File

@ -75,8 +75,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ElMessage, ElTree, TreeNode, ElMessageBox, ElBadge } from 'element-plus' import { ElMessage, ElTree, TreeNode, ElMessageBox, ElBadge } from 'element-plus'
import { paramList, paramTree, getdef, updateParam } from '@/api/liswork/xtwh/ComOpt' import { paramList, paramTree, getdef, updateParam } from '@/api/liswork/xtwh/ComOpt'
// @ts-ignore import { getFirstLetter } from '@/utils/pinyin'
import { getFirstLetter } from '@/utils/pinyin.js'
// @ts-ignore // @ts-ignore
import DynamicInput from "@/views/liswork/xtwh/localconfig/components/DynamicInput.vue" import DynamicInput from "@/views/liswork/xtwh/localconfig/components/DynamicInput.vue"
const emits = defineEmits(['updateTree']) const emits = defineEmits(['updateTree'])
@ -92,7 +91,7 @@ interface RegDictItem {
remark: string remark: string
} }
// 列表相关 // 列表相关
const optiontype= ref<string>("INPUT") const optiontype = ref<string>("INPUT")
const menuname = ref<string>("界面设定") const menuname = ref<string>("界面设定")
const regdictList = ref<RegDictItem[]>([]) const regdictList = ref<RegDictItem[]>([])
const originRegdictList = ref<RegDictItem[]>([]) const originRegdictList = ref<RegDictItem[]>([])
@ -124,7 +123,7 @@ const tableData3 = computed<RegDictItem[]>(() => {
const getList = async (): Promise<void> => { const getList = async (): Promise<void> => {
loading.value = true loading.value = true
try { try {
const response = await paramList({ yq: yq.value,optiontype:optiontype.value }) const response = await paramList({ yq: yq.value, optiontype: optiontype.value })
regdictList.value = JSON.parse(JSON.stringify(response.data)) regdictList.value = JSON.parse(JSON.stringify(response.data))
originRegdictList.value = JSON.parse(JSON.stringify(response.data)) originRegdictList.value = JSON.parse(JSON.stringify(response.data))
total.value = response.data.length total.value = response.data.length
@ -187,7 +186,7 @@ const handleRestoreDefault = async (): Promise<void> => {
).then(async () => { ).then(async () => {
loading.value = true loading.value = true
try { try {
const res = await getdef({optiontype:optiontype.value }) const res = await getdef({ optiontype: optiontype.value })
regdictList.value = JSON.parse(JSON.stringify(res.data)) regdictList.value = JSON.parse(JSON.stringify(res.data))
originRegdictList.value = JSON.parse(JSON.stringify(res.data)) originRegdictList.value = JSON.parse(JSON.stringify(res.data))
total.value = res.data.length total.value = res.data.length

View File

@ -1,4 +1,5 @@
<template> <template>
<!-- 参数列表 -->
<div> <div>
<el-row :gutter="10" class="table-toolbar"> <el-row :gutter="10" class="table-toolbar">
<el-col :span="1.5"> <el-col :span="1.5">
@ -138,14 +139,18 @@
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="默认模板" prop="mrmb"> <el-form-item label="默认模板" prop="mrmb">
<el-input v-model="formData.mrmb" /> <el-select v-model="formData.mrmb" style="width: 12rem;">
<el-option v-for="item in sjtableData" :key="item.sjph" :value="item.sjph" :label="item.sjph" />
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8" style="display: flex;"> <el-col :span="8" style="display: flex;">
<el-form-item label="默认试剂" prop="mrsjph"> <el-form-item label="默认试剂" prop="mrsjph">
<el-input v-model="formData.mrsjph" /> <el-select v-model="formData.mrsjph" style="width: 12rem;">
<el-option v-for="item in sjtableData" :key="item.sjph" :value="item.sjph" :label="item.sjph" />
</el-select>
</el-form-item> </el-form-item>
<el-button type="primary" @click="">试剂维护</el-button> <el-button type="primary" @click="sjHandle">试剂维护</el-button>
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
@ -173,13 +178,51 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
</el-dialog> </el-dialog>
<!-- 试剂维护 -->
<el-dialog v-model="sjShow" title="试剂维护" draggable :close-on-click-modal="false" width="700px">
<div class="mb5">
<el-button type="primary" @click="sjsavaItem">保存</el-button>
<el-button type="primary" @click="sjaddItem">新增</el-button>
<el-button type="danger" @click="sjdelItem">删除</el-button>
</div>
<el-table :data="sjtableData" height="400px" border highlight-current-row @row-click="sjRowClick">
<el-table-column label="试剂批号" prop="sjph" width="120">
<template #default="scope">
<el-input v-model="scope.row.sjph" class="full-width-input" />
</template>
</el-table-column>
<el-table-column label="厂商" prop="sjcs">
<template #default="scope">
<el-select v-model="scope.row.sjcs" class="full-width-input">
<el-option label="请选择" value="" />
</el-select>
</template>
</el-table-column>
<el-table-column label="有效期" prop="yxq">
<template #default="scope">
<el-date-picker v-model="scope.row.yxq" type="datetime" placeholder="0000:00:00 00:00"
format="YYYY-MM-DD HH:mm" value-format="YYYY-MM-DD HH:mm" style="width:100%" />
</template>
</el-table-column>
<el-table-column label="方法" prop="csff">
<template #default="scope">
<el-select v-model="scope.row.csff" class="full-width-input">
<el-option label="请选择" value="" />
</el-select>
</template>
</el-table-column>
</el-table>
</el-dialog>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { queryFilter, addXmFilter, delXmFilter } from '@/api/liswork/xtwh/ComOpt' import { queryFilter, addXmFilter, delXmFilter, addXmLot, delXmLot, queryXmLot } from '@/api/liswork/xtwh/ComOpt'
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
import { get } from 'lodash';
const yq = defineModel<string>() const yq = defineModel<string>()
const dialogVisible = ref(false) const dialogVisible = ref(false)
@ -264,6 +307,43 @@ const delItem = () => {
dzList.value = dzList.value.filter(item => item.lgph != selectRow.value.lgph) dzList.value = dzList.value.filter(item => item.lgph != selectRow.value.lgph)
selectRow.value = null selectRow.value = null
} }
interface sjList {
sjcs: string, sjph: string, yq: string, yxq: string, csff: string
}
const sjShow = ref(false)
const sjtableData = ref<sjList[]>([])
const sjHandle = () => {
sjShow.value = true
getSjList()
}
const sjRowClick = (row: any) => {
selectRow.value = row
}
const getSjList = () => {
selectRow.value = null
queryXmLot().then((res: any) => {
sjtableData.value = res.data
})
}
const sjsavaItem = () => {
}
const sjaddItem = () => {
sjtableData.value.push({
sjcs: '',
sjph: '',
yq: '',
yxq: '',
csff: ''
})
}
const sjdelItem = () => {
}
watch(yq, (newVal) => { watch(yq, (newVal) => {
getDzList() getDzList()
}, { immediate: true }) }, { immediate: true })

View File

@ -0,0 +1,86 @@
<template>
<!-- 整体排序 -->
<div class="sort_box">
<el-row :gutter="10" class="table-toolbar">
<el-col :span="1.5">
<el-button type="primary" @click="">首位</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" icon="top" @click="">上移</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" icon="bottom" @click="">下移</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" @click="">末位</el-button>
</el-col>
</el-row>
<div class="table-row">
<CustomTable ref="tableRef" :data="dataList" :columns="columns" :enable-column-drag="true"
@column-drag-end="handleColumnDragEnd" :config="tableConfig" />
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const props = defineProps({
dataList: {
type: Array,
default: []
}
});
const tableRef = ref<any>(null);
const dataList = ref([]);
const columns = ref([
{ prop: 'xmgl', label: '项目类别', visible: true, align: 'center', },
{ prop: 'xmid', label: '项目ID', visible: true, align: 'center', },
{ prop: 'xmdh', label: '英文缩写', visible: true, align: 'center', },
{ prop: 'xmmc', label: '项目名称', visible: true, align: 'center', },
{ prop: 'dyxh', label: '整体排序', visible: true, align: 'center', },
{ prop: 'fzdyxh', label: '分组打印序号', visible: true, align: 'center', },
]);
const tableConfig = ref({
border: true, // 边框
height: '100%', // 高度
highlightCurrentRow: true, // 高亮当前行
})
//退拽属性
const handleColumnDragEnd = (data: any) => {
// 更新列配置
columns.value = data.columns;
}
</script>
<style scoped lang="scss">
.sort_box {
height: 100%;
}
.table-toolbar {
margin-bottom: 8px;
height: 36px;
line-height: 36px;
}
.tips {
font-family: SourceHanSansCN, SourceHanSansCN;
font-size: 16px;
color: #409eff;
font-weight: 600;
}
.table-row {
height: calc(100% - 45px);
.table-box {
height: 100%;
}
}
</style>

View File

@ -43,13 +43,14 @@
import { ref, watch, nextTick, computed } from 'vue' import { ref, watch, nextTick, computed } from 'vue'
import { ElMessage, ElTree, TreeNode, ElMessageBox, ElBadge } from 'element-plus' import { ElMessage, ElTree, TreeNode, ElMessageBox, ElBadge } from 'element-plus'
import { paramList, paramTree, getdef, updateParam } from '@/api/liswork/xtwh/ComOpt' import { paramList, paramTree, getdef, updateParam } from '@/api/liswork/xtwh/ComOpt'
// @ts-ignore import { getFirstLetter } from '@/utils/pinyin'
import { getFirstLetter } from '@/utils/pinyin.js'
import SysGlobal from './components/sysGlobal.vue' import SysGlobal from './components/sysGlobal/index.vue'
import SysInput from './components/sysInput.vue' import SysInput from './components/sysInput/index.vue'
import SysReport from './components/sysReport.vue' import SysReport from './components/sysReport/index.vue'
import SysParameter from './components/sysParameter.vue' import SysParameter from './components/sysParameter/index.vue'
import SysChannel from './components/sysChannel/index.vue'
import SysSort from './components/sysSort/index.vue'
// ========== TypeScript 类型定义 ========== // ========== TypeScript 类型定义 ==========
interface InstrTreeNode { interface InstrTreeNode {
@ -107,6 +108,8 @@ const tabList = [
{ key: 'SysGlobal', label: '全局设定', component: SysGlobal }, { key: 'SysGlobal', label: '全局设定', component: SysGlobal },
{ key: 'SysInput', label: '界面设定', component: SysInput }, { key: 'SysInput', label: '界面设定', component: SysInput },
{ key: 'SysParameter', label: '参数', component: SysParameter }, { key: 'SysParameter', label: '参数', component: SysParameter },
{ key: 'SysChannel', label: '通道号', component: SysChannel },
{ key: 'SysSort', label: '整体排序', component: SysSort },
{ key: 'SysReport', label: '报告单设置', component: SysReport }, { key: 'SysReport', label: '报告单设置', component: SysReport },
] ]
const activeName = ref('SysParameter') const activeName = ref('SysParameter')

View File

@ -30,7 +30,7 @@
<script setup> <script setup>
import { ref, computed, watch, onMounted } from 'vue'; import { ref, computed, watch, onMounted } from 'vue';
import { queryPatList } from "@/api/mzcx/cydj.js"; import { queryPatList } from "@/api/mzcx/cydj.js";
import { getFirstLetter } from '@/utils/pinyin.js'; // 引入拼音处理工具 import { getFirstLetter } from '@/utils/pinyin'; // 引入拼音处理工具
// 组件参数 // 组件参数
const props = defineProps({ const props = defineProps({
pidValue: { type: [String, Number], default: '' }, pidValue: { type: [String, Number], default: '' },