Merge branch 'main' of http://47.97.125.165:8902/jiangs/lis8.0-vue3
This commit is contained in:
commit
6de3f69bb7
@ -330,5 +330,29 @@ export function clinicInfo(query?: Object) {
|
|||||||
params: query
|
params: query
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
// 指定为某样本复查结果
|
||||||
|
export function setredoSample(query?: Object) {
|
||||||
|
return request({
|
||||||
|
url: '/lisworkoper/setredosample',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 锁定报告
|
||||||
|
export function lockSample(query?: Object) {
|
||||||
|
return request({
|
||||||
|
url: '/lisworkoper/locksample',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 解锁报告
|
||||||
|
export function unLockSample(query?: Object) {
|
||||||
|
return request({
|
||||||
|
url: '/lisworkoper/unlocksample',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -57,6 +57,10 @@ const getDataValue = (val: any) => {
|
|||||||
emits('getDataValue', val);
|
emits('getDataValue', val);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
watch(() => props.data, (val) => {
|
||||||
|
modelValue.value = val;
|
||||||
|
});
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// 初始化时同步一次父级值(如果有)到内部 modelValue
|
// 初始化时同步一次父级值(如果有)到内部 modelValue
|
||||||
if (props.data !== undefined && props.data !== null) {
|
if (props.data !== undefined && props.data !== null) {
|
||||||
|
|||||||
@ -31,9 +31,9 @@ import emitter from '@/utils/mitt';
|
|||||||
|
|
||||||
// 组件Props
|
// 组件Props
|
||||||
const props = withDefaults(defineProps<{
|
const props = withDefaults(defineProps<{
|
||||||
items: ContextMenuItem[];
|
items: ContextMenuItem[]; // 菜单项
|
||||||
autoClose?: boolean;
|
autoClose?: boolean; // 是否自动关闭菜单
|
||||||
menuWidth?: number | string;
|
menuWidth?: number | string; // 菜单宽度
|
||||||
}>(), {
|
}>(), {
|
||||||
autoClose: true,
|
autoClose: true,
|
||||||
menuWidth: 180,
|
menuWidth: 180,
|
||||||
@ -51,14 +51,29 @@ const visible = ref(false);
|
|||||||
const top = ref(0);
|
const top = ref(0);
|
||||||
const left = ref(0);
|
const left = ref(0);
|
||||||
|
|
||||||
const handleContextMenu = (e: MouseEvent) => {
|
|
||||||
// 打开当前菜单关闭其他菜单
|
const handleContextMenu = async (e: MouseEvent) => {
|
||||||
emitter.emit('closeAllContextMenus');
|
emitter.emit('closeAllContextMenus');
|
||||||
|
|
||||||
top.value = Math.min(e.clientY, window.innerHeight - 200);
|
// 先计算初始位置
|
||||||
left.value = Math.min(e.clientX, window.innerWidth - 200);
|
left.value = Math.min(e.clientX, window.innerWidth - (typeof props.menuWidth === 'number' ? props.menuWidth : 180));
|
||||||
|
top.value = e.clientY;
|
||||||
visible.value = true;
|
visible.value = true;
|
||||||
emit('open');
|
emit('open');
|
||||||
|
|
||||||
|
// 等待菜单渲染完成后获取实际高度
|
||||||
|
await nextTick();
|
||||||
|
const menuEl = document.querySelector('.hospital-menu') as HTMLElement;
|
||||||
|
if (menuEl) {
|
||||||
|
const menuHeight = menuEl.offsetHeight;
|
||||||
|
const maxTop = window.innerHeight - menuHeight;
|
||||||
|
// 确保菜单不会超出底部可视区域
|
||||||
|
if (top.value > maxTop) {
|
||||||
|
top.value = maxTop;
|
||||||
|
// 如果向上调整后仍超出顶部,则取最小0值
|
||||||
|
if (top.value < 0) top.value = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 处理菜单项点击
|
// 处理菜单项点击
|
||||||
@ -74,10 +89,8 @@ const handleItemClick = (item: ContextMenuItem) => {
|
|||||||
|
|
||||||
// 隐藏菜单
|
// 隐藏菜单
|
||||||
const hideMenu = () => {
|
const hideMenu = () => {
|
||||||
if (visible.value) {
|
visible.value = false;
|
||||||
visible.value = false;
|
emit('close');
|
||||||
emit('close');
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// 点击外部区域关闭菜单
|
// 点击外部区域关闭菜单
|
||||||
@ -87,12 +100,15 @@ const handleClickOutside = (e: MouseEvent) => {
|
|||||||
|
|
||||||
// 键盘事件处理
|
// 键盘事件处理
|
||||||
const handleKeyDown = (e: KeyboardEvent) => {
|
const handleKeyDown = (e: KeyboardEvent) => {
|
||||||
// console.log('e==>', e);
|
if (!visible.value) return;
|
||||||
if (e.key === 'Escape') {
|
if (e.key === 'Escape') {
|
||||||
hideMenu();
|
hideMenu();
|
||||||
}
|
}
|
||||||
if (e.key === 'e' && visible.value) {
|
// 统一转换小写
|
||||||
console.log('e==>', e);
|
const row: ContextMenuItem | undefined = props.items.find(item => item.shortcut?.toLowerCase() === e.key?.toLowerCase());
|
||||||
|
|
||||||
|
if (row && !row.disabled) {
|
||||||
|
handleItemClick(row)
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@ -331,6 +331,10 @@ const setCurrentRow = (row: Object) => {
|
|||||||
tableRef.value?.setCurrentRow(row);
|
tableRef.value?.setCurrentRow(row);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const setScrollTo = (top: number) => {
|
||||||
|
tableRef.value?.scrollTo(top);
|
||||||
|
};
|
||||||
|
|
||||||
const clearSort = () => {
|
const clearSort = () => {
|
||||||
tableRef.value?.clearSort();
|
tableRef.value?.clearSort();
|
||||||
};
|
};
|
||||||
@ -349,6 +353,7 @@ defineExpose({
|
|||||||
toggleRowSelection,
|
toggleRowSelection,
|
||||||
toggleAllSelection,
|
toggleAllSelection,
|
||||||
setCurrentRow,
|
setCurrentRow,
|
||||||
|
setScrollTo,
|
||||||
clearSort,
|
clearSort,
|
||||||
doLayout,
|
doLayout,
|
||||||
sort,
|
sort,
|
||||||
|
|||||||
@ -1,19 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="dict-input-wrapper">
|
<div class="dict-input-wrapper">
|
||||||
<!-- <el-input v-model="displayValue" :placeholder="placeholder" :clearable="clearable"
|
|
||||||
:disabled="isDictLoading || disabled" @blur="handleBlur" @clear="handleClear" @dblclick="handleDblClick">
|
|
||||||
<template #prefix>
|
|
||||||
<el-icon v-if="isDictLoading" size="16">
|
|
||||||
<Loading />
|
|
||||||
</el-icon>
|
|
||||||
</template>
|
|
||||||
<template #suffix>
|
|
||||||
<el-icon @click="openDictSelector" size="16" class="select-icon">
|
|
||||||
<ArrowDown />
|
|
||||||
</el-icon>
|
|
||||||
</template>
|
|
||||||
</el-input> -->
|
|
||||||
|
|
||||||
<!-- 字典选择弹窗 -->
|
<!-- 字典选择弹窗 -->
|
||||||
<el-dialog v-model="dialogVisible" :title="dialogTitle" width="30vw" :close-on-click-modal="false" :draggable="true"
|
<el-dialog v-model="dialogVisible" :title="dialogTitle" width="30vw" :close-on-click-modal="false" :draggable="true"
|
||||||
@close="handleDialogClose">
|
@close="handleDialogClose">
|
||||||
@ -31,55 +17,52 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, watch, onMounted } from 'vue';
|
import { ref, computed, watch, onMounted } from 'vue';
|
||||||
import { Loading, ArrowDown } from '@element-plus/icons-vue';
|
import { queryXmInfo } from '@/api/liswork/work/LisWork'
|
||||||
|
|
||||||
import { getFirstLetter } from '@/utils/pinyin.js'; // 引入拼音处理工具
|
import { getFirstLetter } from '@/utils/pinyin.js'; // 引入拼音处理工具
|
||||||
// 组件参数
|
// 组件参数
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
modelValue: { type: [String, Number], default: '' },
|
modelValue: { type: [String, Number], default: '' },
|
||||||
dictType: { type: String, required: true },
|
dictType: { type: String },
|
||||||
placeholder: { type: String, default: '请输入或双击选择' },
|
placeholder: { type: String, default: '请输入或双击选择' },
|
||||||
clearable: { type: Boolean, default: true },
|
clearable: { type: Boolean, default: true },
|
||||||
disabled: { type: Boolean, default: false },
|
disabled: { type: Boolean, default: false },
|
||||||
fetchDict: { type: Function, required: true },
|
|
||||||
dialogTitle: { type: String, default: '选择字典项' },
|
dialogTitle: { type: String, default: '选择字典项' },
|
||||||
loadOnMount: { type: Boolean, default: true }
|
tableKey: { type: Object, default: () => { } },
|
||||||
});
|
});
|
||||||
|
|
||||||
// 组件事件
|
// 组件事件
|
||||||
const emit = defineEmits(['update:modelValue', 'update:labelValue', 'select']);
|
const emit = defineEmits(['select']);
|
||||||
|
|
||||||
|
|
||||||
// 内部状态
|
|
||||||
const tempValue = ref('');
|
|
||||||
const labelValue = ref('');
|
|
||||||
const dictData = ref([]); // 存储带简拼的字典数据
|
const dictData = ref([]); // 存储带简拼的字典数据
|
||||||
const filteredDictData = ref([]);
|
const filteredDictData = ref([]);
|
||||||
const isDictLoading = ref(false);
|
const isDictLoading = ref(false);
|
||||||
const dialogVisible = ref(false);
|
const dialogVisible = ref(false);
|
||||||
const searchKey = ref('');
|
const searchKey = ref('');
|
||||||
|
|
||||||
// 显示值计算
|
|
||||||
const displayValue = computed({
|
|
||||||
get() {
|
|
||||||
return labelValue.value || tempValue.value || props.modelValue || '';
|
|
||||||
},
|
|
||||||
set(newValue) {
|
|
||||||
tempValue.value = newValue;
|
|
||||||
if (labelValue.value && newValue !== labelValue.value) {
|
|
||||||
labelValue.value = '';
|
|
||||||
emit('update:labelValue', '');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 加载字典数据(并添加简拼字段)
|
// 加载字典数据(并添加简拼字段)
|
||||||
const loadDictData = async () => {
|
const loadDictData = async () => {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
isDictLoading.value = true;
|
isDictLoading.value = true;
|
||||||
const rawData = await props.fetchDict(props.dictType);
|
const requestParams = {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 1000, // 加载足够多的项目
|
||||||
|
yq: props.tableKey.yq, // 当前选中的仪器
|
||||||
|
};
|
||||||
|
const response = await queryXmInfo(requestParams);
|
||||||
|
|
||||||
|
const rawData = response.data.map((item, index) => {
|
||||||
|
return {
|
||||||
|
value: item.xmdh || `未知编码_${index}`, // 确保value存在
|
||||||
|
label: item.xmmc || `未知名称_${index}`, // 确保label存在
|
||||||
|
dw: item.dw || "",
|
||||||
|
refs: item.refs || "",
|
||||||
|
};
|
||||||
|
});
|
||||||
// 为每个字典项添加简拼字段
|
// 为每个字典项添加简拼字段
|
||||||
dictData.value = (rawData || []).map(item => ({
|
dictData.value = (rawData || []).map(item => ({
|
||||||
...item,
|
...item,
|
||||||
@ -117,12 +100,7 @@ const filterDictData = () => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// 双击事件处理
|
|
||||||
const handleDblClick = () => {
|
|
||||||
if (!props.disabled && !isDictLoading.value) {
|
|
||||||
dialogVisible.value = true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
// 关键修改:打开弹窗时重新加载数据
|
// 关键修改:打开弹窗时重新加载数据
|
||||||
const openDictSelector = async () => {
|
const openDictSelector = async () => {
|
||||||
if (props.disabled || isDictLoading.value) {
|
if (props.disabled || isDictLoading.value) {
|
||||||
@ -141,39 +119,18 @@ const openDictSelector = async () => {
|
|||||||
|
|
||||||
// 选择字典项
|
// 选择字典项
|
||||||
const selectItem = (item) => {
|
const selectItem = (item) => {
|
||||||
emit('update:modelValue', item.value);
|
|
||||||
emit('update:labelValue', item.label);
|
|
||||||
emit('select', item);
|
emit('select', item);
|
||||||
tempValue.value = item.value;
|
|
||||||
labelValue.value = item.label;
|
|
||||||
dialogVisible.value = false;
|
dialogVisible.value = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
// 其他方法(失焦、清空等)保持不变
|
|
||||||
const handleBlur = () => { /* ... */
|
|
||||||
};
|
|
||||||
const handleClear = () => { /* ... */
|
|
||||||
};
|
|
||||||
const handleDialogClose = () => {
|
const handleDialogClose = () => {
|
||||||
dialogVisible.value = false;
|
dialogVisible.value = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
// 监听初始值变化
|
|
||||||
watch(() => props.modelValue, (newVal) => {
|
|
||||||
tempValue.value = newVal || '';
|
|
||||||
if (newVal && !isDictLoading.value) {
|
|
||||||
const matched = dictData.value.find(item => String(item.value) === String(newVal));
|
|
||||||
labelValue.value = matched?.label || newVal;
|
|
||||||
emit('update:labelValue', labelValue.value);
|
|
||||||
}
|
|
||||||
}, { immediate: true });
|
|
||||||
|
|
||||||
// 组件挂载时加载字典
|
|
||||||
onMounted(async () => {
|
|
||||||
if (props.loadOnMount) { // 仅当loadOnMount为true时(默认),才在挂载时加载
|
|
||||||
await loadDictData();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
defineExpose({
|
defineExpose({
|
||||||
openDictSelector, // 暴露打开弹窗的方法
|
openDictSelector, // 暴露打开弹窗的方法
|
||||||
// 可选:暴露其他可能需要的方法(如刷新字典数据)
|
// 可选:暴露其他可能需要的方法(如刷新字典数据)
|
||||||
@ -62,49 +62,8 @@
|
|||||||
|
|
||||||
|
|
||||||
<!-- 医生校验 -->
|
<!-- 医生校验 -->
|
||||||
<el-dialog v-model="visible" title="请输入审核人员密码..." :width="500" :close-on-click-modal="false" :draggable="true">
|
<YhVerification ref="formRef" :form-value="form" :labPatKey="labPatKey" @confirm="handleConfirm"
|
||||||
<el-form ref="formRef" :model="form" label-width="100px">
|
@cancel="handleCancel" />
|
||||||
<!-- 用户代号 -->
|
|
||||||
<el-form-item label="用户代号:">
|
|
||||||
<el-input v-model="form.yhdh" disabled placeholder="用户代号" />
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<!-- 用户姓名 -->
|
|
||||||
<el-form-item label="用户姓名:">
|
|
||||||
<el-input v-model="form.userName" disabled placeholder="用户姓名" />
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<!-- 密码输入 -->
|
|
||||||
<el-form-item label="密码:" prop="mm" :rules="[{ required: true, message: '请输入密码', trigger: 'blur' }]">
|
|
||||||
<el-input v-model="form.mm" type="password" placeholder="请输入密码" />
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<!-- 操作选项 -->
|
|
||||||
<el-form-item label="">
|
|
||||||
<el-radio-group v-model="form.type" @change="handleRadioChange">
|
|
||||||
<el-radio :label="1">仅修改当前标本</el-radio>
|
|
||||||
<el-radio :label="2">修改当天所有未审核并且无核对医生的标本</el-radio>
|
|
||||||
<el-radio :label="3"><span style="color: #f00;">修改当天所有未审核标本(将覆盖原有的核对医生)</span></el-radio>
|
|
||||||
<el-radio :label="4">
|
|
||||||
<el-row :gutter="5">
|
|
||||||
<el-col :span="8">指定样本号区间</el-col>
|
|
||||||
<template v-if="form.type == 4">
|
|
||||||
<el-col :span="8"> <el-input v-model="form.ybh1" size="small" /></el-col>
|
|
||||||
<el-col :span="8"><el-input v-model="form.ybh2" size="small" /></el-col>
|
|
||||||
</template>
|
|
||||||
</el-row>
|
|
||||||
</el-radio>
|
|
||||||
</el-radio-group>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
|
|
||||||
<template #footer>
|
|
||||||
<div class="dialog-footer ">
|
|
||||||
<el-button type="primary" @click="handleConfirm"> 确定 </el-button>
|
|
||||||
<el-button @click="handleCancel"> 取消 </el-button>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-dialog>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -112,11 +71,12 @@
|
|||||||
import { ref, reactive, watch, toRaw, computed, onMounted, nextTick } from 'vue';
|
import { ref, reactive, watch, toRaw, computed, onMounted, nextTick } from 'vue';
|
||||||
import { changepatcolumn, updateLabPat, checkYsUser } from "@/api/liswork/work/LisWork";
|
import { changepatcolumn, updateLabPat, checkYsUser } from "@/api/liswork/work/LisWork";
|
||||||
import SelectTable from '@/components/SelectTable/index.vue';
|
import SelectTable from '@/components/SelectTable/index.vue';
|
||||||
// @ts-ignore
|
import YhVerification from './yhVerification.vue';
|
||||||
import { listUser } from '@/api/system/user.js'
|
|
||||||
import { PropType } from 'vue';
|
import { PropType } from 'vue';
|
||||||
import emitter from '@/utils/mitt';
|
import emitter from '@/utils/mitt';
|
||||||
import { classCom } from '@/utils/classCom';
|
import { classCom } from '@/utils/classCom';
|
||||||
|
import { use } from 'vxe-pc-ui';
|
||||||
const aotuSize = classCom.useAutoSize();
|
const aotuSize = classCom.useAutoSize();
|
||||||
interface LabSysItem {
|
interface LabSysItem {
|
||||||
kj: string;
|
kj: string;
|
||||||
@ -142,6 +102,10 @@ const props = defineProps({
|
|||||||
type: Object,
|
type: Object,
|
||||||
default: () => { }
|
default: () => { }
|
||||||
},
|
},
|
||||||
|
userList: {
|
||||||
|
type: Array as PropType<object[]>,
|
||||||
|
default: () => []
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
const lastJgbz = ref();
|
const lastJgbz = ref();
|
||||||
@ -170,8 +134,6 @@ const ysFields = ref([
|
|||||||
{ prop: 'nickName', label: '用户姓名', width: 150, enablePinyinSearch: true },
|
{ prop: 'nickName', label: '用户姓名', width: 150, enablePinyinSearch: true },
|
||||||
])
|
])
|
||||||
|
|
||||||
const visible = ref(false);
|
|
||||||
// 表单数据
|
|
||||||
const form = ref({
|
const form = ref({
|
||||||
yhdh: '',
|
yhdh: '',
|
||||||
userName: '',
|
userName: '',
|
||||||
@ -194,25 +156,12 @@ const formRef = ref();
|
|||||||
|
|
||||||
// 处理确定按钮点击
|
// 处理确定按钮点击
|
||||||
const handleConfirm = async () => {
|
const handleConfirm = async () => {
|
||||||
if (!formRef.value) return;
|
form.value.mm = ''
|
||||||
|
handleFieldChange()
|
||||||
// 表单验证
|
|
||||||
const valid = await formRef.value.validate();
|
|
||||||
if (valid) {
|
|
||||||
checkYsUser({ ...form.value, ...props.labPatKey }).then((res: any) => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
visible.value = false
|
|
||||||
form.value.mm = ''
|
|
||||||
handleFieldChange()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// 处理取消按钮点击
|
// 处理取消按钮点击
|
||||||
const handleCancel = () => {
|
const handleCancel = () => {
|
||||||
formRef.value?.resetFields();
|
|
||||||
visible.value = false
|
|
||||||
if (form.value.zdmc = 'yhdh') {
|
if (form.value.zdmc = 'yhdh') {
|
||||||
props.labPat.yhdh = JSON.parse(lastValue.value).yhdh
|
props.labPat.yhdh = JSON.parse(lastValue.value).yhdh
|
||||||
}
|
}
|
||||||
@ -222,13 +171,6 @@ const handleCancel = () => {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleRadioChange = () => {
|
|
||||||
if (form.value.type == 4) {
|
|
||||||
form.value.ybh1 = ''
|
|
||||||
form.value.ybh2 = ''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 医生校验
|
// 医生校验
|
||||||
const getJyysData = (data: any) => {
|
const getJyysData = (data: any) => {
|
||||||
if (data.userName == JSON.parse(lastValue.value).yhdh) return
|
if (data.userName == JSON.parse(lastValue.value).yhdh) return
|
||||||
@ -236,7 +178,7 @@ const getJyysData = (data: any) => {
|
|||||||
form.value.userName = data.nickName;
|
form.value.userName = data.nickName;
|
||||||
form.value.zdmc = 'yhdh';
|
form.value.zdmc = 'yhdh';
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
visible.value = true
|
formRef.value?.open()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
const getHdysData = (data: any) => {
|
const getHdysData = (data: any) => {
|
||||||
@ -245,7 +187,7 @@ const getHdysData = (data: any) => {
|
|||||||
form.value.userName = data.nickName;
|
form.value.userName = data.nickName;
|
||||||
form.value.zdmc = 'hdys';
|
form.value.zdmc = 'hdys';
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
visible.value = true
|
formRef.value?.open()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -378,13 +320,7 @@ const getColor = (type: string) => {
|
|||||||
return 'default';
|
return 'default';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const userList = ref([]);
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
const data = { status: 0, del_flag: 0, pageSize: 1000, pageNum: 1 }
|
|
||||||
listUser(data).then((res: any) => {
|
|
||||||
userList.value = res.rows;
|
|
||||||
});
|
|
||||||
|
|
||||||
// 监听保存病人结果
|
// 监听保存病人结果
|
||||||
emitter.on('saveResult', () => {
|
emitter.on('saveResult', () => {
|
||||||
saveLabPat(null)
|
saveLabPat(null)
|
||||||
|
|||||||
@ -63,10 +63,10 @@
|
|||||||
<div class="form-box">
|
<div class="form-box">
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<span>仪器:</span>
|
<span>仪器:</span>
|
||||||
<yqSelectTable v-model:data="tableKey.yq" :instrGroup="tableKey.instrGroup" />
|
<yqSelectTable v-model:data="fcYq" :instrGroup="tableKey.instrGroup" />
|
||||||
</div>
|
</div>
|
||||||
<div class="mt10">请输入复查的样本号:</div>
|
<div class="mt10">请输入复查的样本号:</div>
|
||||||
<el-input v-model="fcYbh" />
|
<el-input v-model="fcYbh" @keyup.enter="subHandle()" />
|
||||||
</div>
|
</div>
|
||||||
<div class="mt10" style="text-align: center; width: 100%;">
|
<div class="mt10" style="text-align: center; width: 100%;">
|
||||||
<el-button type="primary" @click="subHandle()"> 确认 </el-button>
|
<el-button type="primary" @click="subHandle()"> 确认 </el-button>
|
||||||
@ -77,11 +77,12 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, nextTick, onMounted } from 'vue'
|
import { ref, nextTick, onMounted, watch } from 'vue'
|
||||||
import CommonTable from '@/components/vxeTable/index.vue'
|
import CommonTable from '@/components/vxeTable/index.vue'
|
||||||
import ContextMenu from "@/components/contextMenu/index.vue";
|
import ContextMenu from "@/components/contextMenu/index.vue";
|
||||||
import { ContextMenuItem } from '@/types/index'
|
import { ContextMenuItem } from '@/types/index'
|
||||||
import yqSelectTable from '@/components/SelectTable/YQSelectTable/index.vue'
|
import yqSelectTable from '@/components/SelectTable/YQSelectTable/index.vue';
|
||||||
|
import { setredoSample } from '@/api/liswork/work/LisWork'
|
||||||
import { ElMessage } from 'element-plus';
|
import { ElMessage } from 'element-plus';
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
labPatList: {
|
labPatList: {
|
||||||
@ -106,13 +107,21 @@ const emits = defineEmits(['select'])
|
|||||||
const show = ref(false)
|
const show = ref(false)
|
||||||
|
|
||||||
const fcYbh = ref('')
|
const fcYbh = ref('')
|
||||||
|
const fcYq = ref('')
|
||||||
|
|
||||||
const subHandle = () => {
|
const subHandle = () => {
|
||||||
if (!fcYbh.value.trim()) return ElMessage.warning('请输入复查的样本号')
|
if (!fcYbh.value.trim()) return ElMessage.warning('请输入复查的样本号')
|
||||||
const data = {
|
const data = {
|
||||||
fcYbh: fcYbh.value,
|
newybh: fcYbh.value,
|
||||||
|
newyq: fcYq.value,
|
||||||
...props.tableKey
|
...props.tableKey
|
||||||
}
|
}
|
||||||
console.log('data==>', data);
|
setredoSample(data).then((res: any) => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
ElMessage.success('操作成功')
|
||||||
|
closeHandle()
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
const closeHandle = () => {
|
const closeHandle = () => {
|
||||||
fcYbh.value = ''
|
fcYbh.value = ''
|
||||||
@ -124,6 +133,7 @@ const contextMenuItems = computed<ContextMenuItem[]>(() => [
|
|||||||
]);
|
]);
|
||||||
const handleMenuSelect = ((item: ContextMenuItem) => {
|
const handleMenuSelect = ((item: ContextMenuItem) => {
|
||||||
show.value = true
|
show.value = true
|
||||||
|
fcYq.value = props.tableKey.yq
|
||||||
})
|
})
|
||||||
// 表格列配置
|
// 表格列配置
|
||||||
const tableColumns = ref([
|
const tableColumns = ref([
|
||||||
|
|||||||
@ -73,9 +73,7 @@
|
|||||||
label="qz" />
|
label="qz" />
|
||||||
|
|
||||||
<!-- 新增明细 -->
|
<!-- 新增明细 -->
|
||||||
<ItemInput ref="itemDictRef" v-model="selectedItemValue" :label-value.sync="selectedItemLabel"
|
<ProjectDetails ref="itemDictRef" :dialog-title="'选择检验项目'" :tableKey="tableKey" @select="handleItemSelect" />
|
||||||
:dict-type="'LAB_ITEM'" :fetch-dict="fetchLabItemDict" :dialog-title="'选择检验项目'" :disabled="false"
|
|
||||||
:load-on-mount="false" :table-data.sync="labResuts" class="hidden-dict-input" @select="handleItemSelect" />
|
|
||||||
|
|
||||||
<!-- 校验用户 -->
|
<!-- 校验用户 -->
|
||||||
<el-dialog v-model="checkShow" title="用户身份验证" width="500" :close-on-click-modal="false" :draggable="true"
|
<el-dialog v-model="checkShow" title="用户身份验证" width="500" :close-on-click-modal="false" :draggable="true"
|
||||||
@ -155,17 +153,56 @@
|
|||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 合并当前病人其他结果 -->
|
||||||
|
<el-dialog v-model="jgShow" title="绑定其他结果" width="40vw" :close-on-click-modal="false" :draggable="true">
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-radio-group v-model="radio2">
|
||||||
|
<el-radio value="1">5天内</el-radio>
|
||||||
|
<el-radio value="2">10天内</el-radio>
|
||||||
|
<el-radio value="2">20天内</el-radio>
|
||||||
|
<el-radio value="2">30天内</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="4">
|
||||||
|
<el-radio-group v-model="radio2">
|
||||||
|
<el-radio value="1">复制</el-radio>
|
||||||
|
<el-radio value="2">移动</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="4">
|
||||||
|
<el-radio-group v-model="radio2">
|
||||||
|
<el-radio value="1">覆盖</el-radio>
|
||||||
|
<el-radio value="2">不覆盖</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<div> <el-checkbox>只显示同一申请单号</el-checkbox> </div>
|
||||||
|
<div>
|
||||||
|
<el-button type="primary">确定</el-button>
|
||||||
|
<el-button>取消</el-button>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
|
||||||
|
<YhVerification ref="formRef" title="请输入锁定人员账号密码" :form-value="formData" @confirm="handleConfirm"
|
||||||
|
@cancel="handleCancel" :labelShow="false" />
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, toRefs, watch, nextTick, onMounted, computed } from "vue";
|
import { ref, toRefs, watch, nextTick, onMounted, computed } from "vue";
|
||||||
|
import YhVerification from "./yhVerification.vue";
|
||||||
import {
|
import {
|
||||||
check1, check2, uncheck2, unconfirmlog, checkuser, reglimit, queryXmInfo, deleteresult, changeresult,
|
check1, check2, uncheck2, unconfirmlog, checkuser, reglimit, deleteresult, changeresult,
|
||||||
newresult, queryXmVal, printListwork, getresultchangelog, setinputmdl, saveResult
|
newresult, queryXmVal, printListwork, getresultchangelog, setinputmdl, saveResult, lockSample, unLockSample
|
||||||
} from "@/api/liswork/work/LisWork";
|
} from "@/api/liswork/work/LisWork";
|
||||||
import { ElMessageBox, ElMessage } from "element-plus";
|
import { ElMessageBox, ElMessage } from "element-plus";
|
||||||
import ItemInput from "@/views/liswork/work/components/ItemInput.vue";
|
import ProjectDetails from "@/components/projectDetails/index.vue";
|
||||||
import projectsJg from "@/components/projectsjg/index.vue"
|
import projectsJg from "@/components/projectsjg/index.vue"
|
||||||
import { classCom } from '@/utils/classCom'
|
import { classCom } from '@/utils/classCom'
|
||||||
import CustomTable from '@/components/elTable/index.vue'
|
import CustomTable from '@/components/elTable/index.vue'
|
||||||
@ -184,14 +221,19 @@ const props = defineProps({
|
|||||||
type: Object, default: () => { }
|
type: Object, default: () => { }
|
||||||
},
|
},
|
||||||
labPat: { type: Object, required: true },
|
labPat: { type: Object, required: true },
|
||||||
|
userList: { type: Array, default: () => [] },
|
||||||
});
|
});
|
||||||
|
|
||||||
// 解构props
|
// 解构props
|
||||||
const { tableData, tableKey, } = toRefs(props);
|
const { tableData, tableKey, labPat, userList } = toRefs(props);
|
||||||
const selectedRows = ref([]);
|
const selectedRows = ref([]);
|
||||||
const lastjyrq = ref('');
|
const lastjyrq = ref('');
|
||||||
const mbStore = useCommonStore();
|
const mbStore = useCommonStore();
|
||||||
const aotuSize = classCom.useAutoSize();
|
const aotuSize = classCom.useAutoSize();
|
||||||
|
const radio2 = ref('1');
|
||||||
|
const jgShow = ref(false);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
watch(() => props.tableData, (newVal) => {
|
watch(() => props.tableData, (newVal) => {
|
||||||
selectedRows.value = [];
|
selectedRows.value = [];
|
||||||
@ -256,27 +298,27 @@ const contextMenuItems = computed(() => [
|
|||||||
{ label: '锁定报告', action: 'Lock', shortcut: 'L', },
|
{ label: '锁定报告', action: 'Lock', shortcut: 'L', },
|
||||||
{ label: '解除报告锁定', action: 'lift', shortcut: 'W', },
|
{ label: '解除报告锁定', action: 'lift', shortcut: 'W', },
|
||||||
{ type: 'divider' },
|
{ type: 'divider' },
|
||||||
{ label: '删除记录', action: 'delete', danger: true, shortcut: 'd', }
|
// { label: '删除记录', action: 'delete', danger: true, shortcut: 'd', },
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// 处理菜单选择
|
// 处理菜单选择
|
||||||
const handleMenuSelect = (item) => {
|
const handleMenuSelect = (item) => {
|
||||||
// 根据不同的操作执行相应逻辑
|
|
||||||
switch (item.action) {
|
switch (item.action) {
|
||||||
case 'view':
|
case 'view':
|
||||||
alert(`打印预览`);
|
printHandle() //打印预览
|
||||||
break;
|
break;
|
||||||
case 'bgyl':
|
case 'bgyl':
|
||||||
alert(`PDF报告预览`);
|
previewHandle() //PDF报告预览
|
||||||
break;
|
break;
|
||||||
case 'merge':
|
case 'merge':
|
||||||
alert(`合并病人当前其他结果`);
|
jgShow.value = true;
|
||||||
|
// alert(`合并病人当前其他结果`);
|
||||||
break;
|
break;
|
||||||
case 'Lock':
|
case 'Lock':
|
||||||
alert(`锁定报告`);
|
lockHandle();
|
||||||
break;
|
break;
|
||||||
case 'lift':
|
case 'lift':
|
||||||
alert(`解除报告锁定`);
|
unlockHandle()
|
||||||
break;
|
break;
|
||||||
case 'delete':
|
case 'delete':
|
||||||
if (confirm(`确定要删除患者的记录吗?`)) {
|
if (confirm(`确定要删除患者的记录吗?`)) {
|
||||||
@ -285,6 +327,56 @@ const handleMenuSelect = (item) => {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const formRef = ref();
|
||||||
|
|
||||||
|
const formData = ref({
|
||||||
|
yhdh: '',
|
||||||
|
userName: '',
|
||||||
|
mm: '',
|
||||||
|
})
|
||||||
|
const lockType = ref(1)
|
||||||
|
// 锁定报告
|
||||||
|
const lockHandle = () => {
|
||||||
|
lockType.value = 1
|
||||||
|
formRef.value.open()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解除锁定报告
|
||||||
|
const unlockHandle = () => {
|
||||||
|
lockType.value = 2
|
||||||
|
formRef.value.open()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 锁定样本
|
||||||
|
const handleConfirm = (data) => {
|
||||||
|
const obj = {
|
||||||
|
yhdh: data.yhdh,
|
||||||
|
...tableKey.value
|
||||||
|
}
|
||||||
|
if (lockType.value == 1) {
|
||||||
|
lockSample(obj).then((res) => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
formRef.value?.cancel()
|
||||||
|
ElMessage.success(res.msg)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
unLockSample(obj).then((res) => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
formRef.value?.cancel()
|
||||||
|
ElMessage.success(res.msg)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const handleCancel = () => {
|
||||||
|
formData.value = {
|
||||||
|
yhdh: '',
|
||||||
|
userName: '',
|
||||||
|
mm: '',
|
||||||
|
}
|
||||||
|
}
|
||||||
const columns = ref([
|
const columns = ref([
|
||||||
{ label: 'No', prop: 'index', width: 30, align: 'center', visible: true, slot: "index" },
|
{ label: 'No', prop: 'index', width: 30, align: 'center', visible: true, slot: "index" },
|
||||||
{ label: "复", prop: "redo_flag", width: 30, align: 'center', visible: true, },
|
{ label: "复", prop: "redo_flag", width: 30, align: 'center', visible: true, },
|
||||||
@ -413,46 +505,15 @@ const rules = ref(
|
|||||||
const csjgRef = ref();
|
const csjgRef = ref();
|
||||||
|
|
||||||
const itemDictRef = ref(); // DictInput组件引用
|
const itemDictRef = ref(); // DictInput组件引用
|
||||||
const selectedItemValue = ref(""); // 选择的项目编码xmdh
|
|
||||||
const selectedItemLabel = ref(""); // 选择的项目名称xmmc
|
|
||||||
const labResuts = ref([])
|
|
||||||
const tableRef = ref();
|
const tableRef = ref();
|
||||||
const fetchLabItemDict = async (dictType) => {
|
|
||||||
try {
|
|
||||||
// 1. 验证必要参数(如当前仪器yq)
|
|
||||||
if (!tableKey.value.yq) {
|
|
||||||
ElMessage.error("请先选择仪器");
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
const requestParams = {
|
|
||||||
pageNum: 1,
|
|
||||||
pageSize: 1000, // 加载足够多的项目
|
|
||||||
yq: tableKey.value.yq, // 当前选中的仪器
|
|
||||||
};
|
|
||||||
const response = await queryXmInfo(requestParams);
|
|
||||||
|
|
||||||
const formattedData = response.data.map((item, index) => {
|
|
||||||
return {
|
|
||||||
value: item.xmdh || `未知编码_${index}`, // 确保value存在
|
|
||||||
label: item.xmmc || `未知名称_${index}`, // 确保label存在
|
|
||||||
dw: item.dw || "",
|
|
||||||
refs: item.refs || "",
|
|
||||||
};
|
|
||||||
});
|
|
||||||
return formattedData;
|
|
||||||
} catch (error) {
|
|
||||||
console.error(`[fetchLabItemDict] 加载失败:`, error.message);
|
|
||||||
return []; // 失败时返回空数组,避免弹窗报错
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
const handleCheck = (checkType) => {
|
const handleCheck = (checkType) => {
|
||||||
// yhdh = checkuserid.value
|
// yhdh = checkuserid.value
|
||||||
switch (checkType) {
|
switch (checkType) {
|
||||||
case 1: // 初审
|
case 1: // 初审
|
||||||
check1({ ...tableKey.value, yhdh: 'admin' }).then(res => {
|
check1({ ...tableKey.value, yhdh: props.labPat.yhdh }).then(res => {
|
||||||
emits("changeStatus", props.labPat);
|
emits("changeStatus", props.labPat);
|
||||||
})
|
})
|
||||||
break;
|
break;
|
||||||
@ -473,7 +534,7 @@ const handleCheck = (checkType) => {
|
|||||||
|
|
||||||
|
|
||||||
const shHandleCheck = () => {
|
const shHandleCheck = () => {
|
||||||
check2({ ...props.tableKey, yhdh: 'admin' }).then(res => {
|
check2({ ...props.tableKey, yhdh: props.labPat.yhdh }).then(res => {
|
||||||
emits("changeStatus", props.labPat);
|
emits("changeStatus", props.labPat);
|
||||||
if (res.code == "4" && res.problemId === 4) {
|
if (res.code == "4" && res.problemId === 4) {
|
||||||
tableKey.value.problemId = res.problemId;
|
tableKey.value.problemId = res.problemId;
|
||||||
@ -515,7 +576,7 @@ const handleWarningSuccess = async () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const unShHandle = () => {
|
const unShHandle = () => {
|
||||||
uncheck2({ ...tableKey.value, yhdh: 'admin' }).then(res => {
|
uncheck2({ ...tableKey.value, yhdh: props.labPat.yhdh }).then(res => {
|
||||||
if (res.code == "4") {
|
if (res.code == "4") {
|
||||||
tableKey.value.problemId = res.problemId;
|
tableKey.value.problemId = res.problemId;
|
||||||
reasonText.value = res.msg;
|
reasonText.value = res.msg;
|
||||||
@ -579,11 +640,7 @@ const resetForm = () => {
|
|||||||
};
|
};
|
||||||
// 2. 打开项目选择弹窗
|
// 2. 打开项目选择弹窗
|
||||||
const openItemDictDialog = () => {
|
const openItemDictDialog = () => {
|
||||||
if (itemDictRef.value && typeof itemDictRef.value.openDictSelector === 'function') {
|
itemDictRef.value.openDictSelector();
|
||||||
itemDictRef.value.openDictSelector(); // 确保方法存在再调用
|
|
||||||
} else {
|
|
||||||
console.warn("DictInput组件未加载完成或方法未暴露");
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// 3. 处理项目选择结果:传递给labresult子组件新增行
|
// 3. 处理项目选择结果:传递给labresult子组件新增行
|
||||||
@ -605,6 +662,31 @@ const handleItemSelect = async (selectedItem) => {
|
|||||||
// ElMessage.success(`已新增项目:${newRow.xmmc}`);
|
// ElMessage.success(`已新增项目:${newRow.xmmc}`);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// 新增行核心方法:接收父组件传递的项目数据
|
||||||
|
const addRowFromDict = async (rowData) => {
|
||||||
|
if (!rowData.xmdh) return ElMessage.error("新增失败:项目编码不能为空");
|
||||||
|
|
||||||
|
const isDuplicate = tableData.value.some(item => item.xmdh === rowData.xmdh);
|
||||||
|
if (isDuplicate) return ElMessage.warning(`项目【${rowData.xmmc}】已存在`);
|
||||||
|
|
||||||
|
const newRow = { ...rowData, csjg: "" };
|
||||||
|
tableData.value.push(newRow);
|
||||||
|
|
||||||
|
// 5. 自动聚焦
|
||||||
|
nextTick(() => {
|
||||||
|
selectedRows.value = [newRow];
|
||||||
|
tableRef.value.setCurrentRow(newRow);
|
||||||
|
tableRef.value.setScrollTo(tableData.value.length - 1)
|
||||||
|
// 聚焦到新行的输入框
|
||||||
|
const inputs = document.querySelectorAll('.full-width-input .el-input__inner');
|
||||||
|
if (inputs.length > 0) {
|
||||||
|
inputs[inputs.length - 1].focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// 事件定义
|
// 事件定义
|
||||||
const emits = defineEmits([
|
const emits = defineEmits([
|
||||||
'fetchLabResults',
|
'fetchLabResults',
|
||||||
@ -647,7 +729,7 @@ const handleCsjgEnter = async (row) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
if (row.id) {
|
if (row && row.id) {
|
||||||
emitter.emit('saveResult');
|
emitter.emit('saveResult');
|
||||||
newresult(row).then(response => {
|
newresult(row).then(response => {
|
||||||
ElMessage.success("结果保存成功");
|
ElMessage.success("结果保存成功");
|
||||||
@ -708,62 +790,6 @@ const handleAdd = () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
// 新增行核心方法:接收父组件传递的项目数据
|
|
||||||
const addRowFromDict = async (rowData) => {
|
|
||||||
if (!rowData?.xmdh) {
|
|
||||||
ElMessage.error("项目编码不能为空");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// 1. 校验输入数据有效性
|
|
||||||
if (!rowData || !rowData.xmdh) {
|
|
||||||
ElMessage.error("新增失败:项目编码不能为空");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. 检查是否重复添加同一项目(根据xmdh判断)
|
|
||||||
const isDuplicate = tableData.value.some(item => item.xmdh === rowData.xmdh);
|
|
||||||
if (isDuplicate) {
|
|
||||||
ElMessage.warning(`项目【${rowData.xmmc}】已存在`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. 补全新增行的必要字段(如无则初始化)
|
|
||||||
const newRow = { ...rowData, csjg: "" };
|
|
||||||
|
|
||||||
// 4. 添加到表格数据
|
|
||||||
tableData.value.push(newRow);
|
|
||||||
console.log("子组件新增行:", newRow);
|
|
||||||
|
|
||||||
|
|
||||||
// // 4. 同步缓存
|
|
||||||
// await nextTick();
|
|
||||||
// updateOriginalCsjgMap();
|
|
||||||
|
|
||||||
|
|
||||||
// 5. 自动聚焦
|
|
||||||
nextTick(() => {
|
|
||||||
selectedRows.value = [newRow];
|
|
||||||
tableRef.value.setCurrentRow(newRow);
|
|
||||||
nextTick(() => {
|
|
||||||
tableRef.value.setScrollTop(23 * tableRef.value.length)
|
|
||||||
})
|
|
||||||
nextTick(() => {
|
|
||||||
const tableBody = document.querySelector('.el-table__body-wrapper');
|
|
||||||
if (tableBody) {
|
|
||||||
tableBody.scrollTop = tableBody.scrollHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 聚焦到新行的输入框
|
|
||||||
const inputs = document.querySelectorAll('.full-width-input .el-input__inner');
|
|
||||||
if (inputs.length > 0) {
|
|
||||||
inputs[inputs.length - 1].focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -833,13 +859,8 @@ const previewHandle = () => {
|
|||||||
const getRowIndex = (index) => {
|
const getRowIndex = (index) => {
|
||||||
return index + 1;
|
return index + 1;
|
||||||
};
|
};
|
||||||
const userList = ref([]);
|
|
||||||
onMounted(() => {
|
|
||||||
const data = { status: 0, del_flag: 0, pageSize: 1000, pageNum: 1 }
|
|
||||||
listUser(data).then((res) => {
|
|
||||||
userList.value = res.rows;
|
|
||||||
});
|
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
// 获取模板项目
|
// 获取模板项目
|
||||||
emitter.on('dbMbHandle', (info) => {
|
emitter.on('dbMbHandle', (info) => {
|
||||||
// console.log('data==>', info);
|
// console.log('data==>', info);
|
||||||
|
|||||||
133
src/views/liswork/work/components/yhVerification.vue
Normal file
133
src/views/liswork/work/components/yhVerification.vue
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<el-dialog v-model="visible" :title="title" :width="500" :close-on-click-modal="false" :draggable="true">
|
||||||
|
<el-form ref="formRef" :model="formValue" label-width="100px">
|
||||||
|
<!-- 用户代号 -->
|
||||||
|
<el-form-item label="用户代号:">
|
||||||
|
<el-input v-model="formValue.yhdh" :disabled="labelShow" placeholder="用户代号" />
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<!-- 用户姓名 -->
|
||||||
|
<el-form-item label="用户姓名:">
|
||||||
|
<el-input v-model="formValue.userName" :disabled="labelShow" placeholder="用户姓名" />
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<!-- 密码输入 -->
|
||||||
|
<el-form-item label="密码:" prop="mm" :rules="[{ required: true, message: '请输入密码', trigger: 'blur' }]">
|
||||||
|
<el-input ref="passwordRef" v-model="formValue.mm" type="password" placeholder="请输入密码"
|
||||||
|
@keyup.enter="handleConfirm" />
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<!-- 操作选项 -->
|
||||||
|
<el-form-item label="" v-if="labelShow">
|
||||||
|
<el-radio-group v-model="formValue.type" @change="handleRadioChange">
|
||||||
|
<el-radio :label="1">仅修改当前标本</el-radio>
|
||||||
|
<el-radio :label="2">修改当天所有未审核并且无核对医生的标本</el-radio>
|
||||||
|
<el-radio :label="3"><span style="color: #f00;">修改当天所有未审核标本(将覆盖原有的核对医生)</span></el-radio>
|
||||||
|
<el-radio :label="4">
|
||||||
|
<el-row :gutter="5">
|
||||||
|
<el-col :span="8">指定样本号区间</el-col>
|
||||||
|
<template v-if="formValue.type == 4">
|
||||||
|
<el-col :span="8"> <el-input v-model="formValue.ybh1" size="small" /></el-col>
|
||||||
|
<el-col :span="8"><el-input v-model="formValue.ybh2" size="small" /></el-col>
|
||||||
|
</template>
|
||||||
|
</el-row>
|
||||||
|
</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
|
<template #footer>
|
||||||
|
<div class="dialog-footer ">
|
||||||
|
<el-button type="primary" @click="handleConfirm"> 确定 </el-button>
|
||||||
|
<el-button @click="cancel"> 取消 </el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { checkYsUser } from '@/api/liswork/work/LisWork'
|
||||||
|
const props = defineProps({
|
||||||
|
formValue: {
|
||||||
|
type: Object,
|
||||||
|
default: {
|
||||||
|
yhdh: '',
|
||||||
|
userName: '',
|
||||||
|
mm: '',
|
||||||
|
type: 1,
|
||||||
|
zdmc: '',
|
||||||
|
ybh1: '',
|
||||||
|
ybh2: '',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
labPatKey: {
|
||||||
|
type: Object,
|
||||||
|
default: () => { }
|
||||||
|
},
|
||||||
|
labelShow: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
type: String,
|
||||||
|
default: '请输入审核人员密码...'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const visible = ref(false);
|
||||||
|
// 表单数据
|
||||||
|
|
||||||
|
|
||||||
|
const formRef = ref();
|
||||||
|
const passwordRef = ref();
|
||||||
|
const open = () => {
|
||||||
|
visible.value = true
|
||||||
|
nextTick(() => {
|
||||||
|
// formRef.value.clearValidate('mm');
|
||||||
|
// passwordRef.value.focus();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const emit = defineEmits(["confirm", "cancel",]);
|
||||||
|
// 处理确定按钮点击
|
||||||
|
const handleConfirm = async () => {
|
||||||
|
if (!formRef.value) return;
|
||||||
|
|
||||||
|
// 表单验证
|
||||||
|
const valid = await formRef.value.validate();
|
||||||
|
if (valid) {
|
||||||
|
checkYsUser({ ...props.formValue, ...props.labPatKey }).then((res: any) => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
emit('confirm', props.formValue)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 处理取消按钮点击
|
||||||
|
const cancel = () => {
|
||||||
|
formRef.value?.resetFields();
|
||||||
|
visible.value = false
|
||||||
|
emit('cancel',)
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const handleRadioChange = () => {
|
||||||
|
if (props.formValue.type == 4) {
|
||||||
|
props.formValue.ybh1 = ''
|
||||||
|
props.formValue.ybh2 = ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
open,
|
||||||
|
cancel
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped></style>
|
||||||
@ -141,7 +141,7 @@ import CheckUser from './components/CheckUser.vue'
|
|||||||
import uploadwarning from './components/uploadwarning.vue'
|
import uploadwarning from './components/uploadwarning.vue'
|
||||||
import UCKDictInput from './components/DictInput.vue';
|
import UCKDictInput from './components/DictInput.vue';
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import ItemInput from "@/views/liswork/work/components/ItemInput.vue";
|
import ItemInput from "@/components/projectDetails/index.vue";
|
||||||
|
|
||||||
|
|
||||||
const showuploadwarning = ref(false);
|
const showuploadwarning = ref(false);
|
||||||
|
|||||||
@ -48,12 +48,12 @@
|
|||||||
<el-row :gutter="5">
|
<el-row :gutter="5">
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<LabPat ref="labPatRef" v-model:labPat="labPat" :labPatKey="queryParams" :labSysList="labInputcolList"
|
<LabPat ref="labPatRef" v-model:labPat="labPat" :labPatKey="queryParams" :labSysList="labInputcolList"
|
||||||
@changeStatus="changeStatus" />
|
:userList="userList" @changeStatus="changeStatus" />
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="16">
|
<el-col :span="16">
|
||||||
<LabResult ref="labResultRef" v-model:labPat="labPat" :tableData="labResuts" :tableKey="queryParams"
|
<LabResult ref="labResultRef" v-model:labPat="labPat" :tableData="labResuts" :tableKey="queryParams"
|
||||||
:resultSysList="resultConfig" @fetchLabResults="fetchLabResults" @changeStatus="changeStatus"
|
:userList="userList" :resultSysList="resultConfig" @fetchLabResults="fetchLabResults"
|
||||||
@previewHandle="previewHandle" />
|
@changeStatus="changeStatus" @previewHandle="previewHandle" />
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</div>
|
</div>
|
||||||
@ -99,7 +99,7 @@
|
|||||||
</template>
|
</template>
|
||||||
<!-- 结果复查 -->
|
<!-- 结果复查 -->
|
||||||
<template v-if="activeTab == 4">
|
<template v-if="activeTab == 4">
|
||||||
<Reexamination :queryParams="queryParams" @fetchResults="fetchLabResults" />
|
<Reexamination :queryParams="queryParams" @fetchResults="fetchLabResults" :tablekey="queryParams" />
|
||||||
</template>
|
</template>
|
||||||
<!-- 收费信息 -->
|
<!-- 收费信息 -->
|
||||||
<template v-if="activeTab == 5">
|
<template v-if="activeTab == 5">
|
||||||
@ -159,7 +159,8 @@ import { getNextNumber, getPreviousNumber } from "@/utils/getNextNumber";
|
|||||||
import { useCommonStore } from '@/store/modules/commonStore';
|
import { useCommonStore } from '@/store/modules/commonStore';
|
||||||
import { classCom } from '@/utils/classCom';
|
import { classCom } from '@/utils/classCom';
|
||||||
import PatientQueryForm from '@/components/selectSearch/index.vue'
|
import PatientQueryForm from '@/components/selectSearch/index.vue'
|
||||||
|
// @ts-ignore
|
||||||
|
import { listUser } from '@/api/system/user.js'
|
||||||
|
|
||||||
const aotuSize = classCom.useAutoSize();
|
const aotuSize = classCom.useAutoSize();
|
||||||
|
|
||||||
@ -611,7 +612,12 @@ const getSysList = () => {
|
|||||||
}
|
}
|
||||||
getSysList()
|
getSysList()
|
||||||
|
|
||||||
|
const userList = ref([]);
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
|
const data = { status: 0, del_flag: 0, pageSize: 1000, pageNum: 1 }
|
||||||
|
listUser(data).then((res: any) => {
|
||||||
|
userList.value = res.rows;
|
||||||
|
});
|
||||||
// 加载病人来源字典
|
// 加载病人来源字典
|
||||||
const dictRefs = await comDict('PT', 'AU', 'SX', 'DP', 'BT', 'SRD', 'HOS', 'ST');
|
const dictRefs = await comDict('PT', 'AU', 'SX', 'DP', 'BT', 'SRD', 'HOS', 'ST');
|
||||||
// 从 ref 中获取实际数据
|
// 从 ref 中获取实际数据
|
||||||
|
|||||||
@ -19,10 +19,8 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
||||||
<!-- 新增明细 -->
|
<!-- 新增明细-->
|
||||||
<ItemInput ref="itemDictRef" v-model="selectedItemValue" :label-value.sync="selectedItemLabel"
|
<ProjectDetails ref="itemDictRef" :dialog-title="'选择检验项目'" :tableKey="tablekey" @select="handleItemSelect" />
|
||||||
:dict-type="'LAB_ITEM'" :fetch-dict="fetchLabItemDict" :dialog-title="'选择检验项目'" :disabled="false"
|
|
||||||
:load-on-mount="false" :table-data.sync="labResuts" class="hidden-dict-input" @select="handleItemSelect" />
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -31,7 +29,7 @@ import { ref, watch, toRefs, onMounted, nextTick } from 'vue'
|
|||||||
import { redoResult, queryXmInfo, saveRedo, swapRedo, delRedo } from "@/api/liswork/work/LisWork";
|
import { redoResult, queryXmInfo, saveRedo, swapRedo, delRedo } from "@/api/liswork/work/LisWork";
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
import ItemInput from '../components/ItemInput.vue'
|
import ProjectDetails from '@/components/projectDetails/index.vue'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
// 主键
|
// 主键
|
||||||
@ -39,6 +37,10 @@ const props = defineProps({
|
|||||||
type: Object,
|
type: Object,
|
||||||
default: {}
|
default: {}
|
||||||
},
|
},
|
||||||
|
tablekey: {
|
||||||
|
type: Object,
|
||||||
|
default: () => { }
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// 解构 props
|
// 解构 props
|
||||||
@ -58,51 +60,16 @@ watch(() => queryParams.value, () => {
|
|||||||
|
|
||||||
const tableRef = ref();
|
const tableRef = ref();
|
||||||
const itemDictRef = ref(); // DictInput组件引用
|
const itemDictRef = ref(); // DictInput组件引用
|
||||||
const selectedItemValue = ref(""); // 选择的项目编码xmdh
|
|
||||||
const labResuts = ref([])
|
|
||||||
const selectedItemLabel = ref(""); // 选择的项目名称xmmc
|
|
||||||
|
|
||||||
|
|
||||||
// 事件定义
|
// 事件定义
|
||||||
const emits = defineEmits(['fetchResults',]);
|
const emits = defineEmits(['fetchResults',]);
|
||||||
|
|
||||||
const openItemDictDialog = () => {
|
const openItemDictDialog = () => {
|
||||||
if (itemDictRef.value && typeof itemDictRef.value.openDictSelector === 'function') {
|
itemDictRef.value.openDictSelector(); // 确保方法存在再调用
|
||||||
itemDictRef.value.openDictSelector(); // 确保方法存在再调用
|
|
||||||
} else {
|
|
||||||
console.warn("DictInput组件未加载完成或方法未暴露");
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const fetchLabItemDict = async (dictType: string) => {
|
|
||||||
try {
|
|
||||||
// 1. 验证必要参数(如当前仪器yq)
|
|
||||||
if (!queryParams.value.yq) {
|
|
||||||
ElMessage.error("请先选择仪器");
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
const requestParams = {
|
|
||||||
pageNum: 1,
|
|
||||||
pageSize: 1000, // 加载足够多的项目
|
|
||||||
yq: queryParams.value.yq, // 当前选中的仪器
|
|
||||||
};
|
|
||||||
const response = await queryXmInfo(requestParams);
|
|
||||||
|
|
||||||
const formattedData = response.data.map((item: any, index: number) => {
|
|
||||||
return {
|
|
||||||
value: item.xmdh || `未知编码_${index}`, // 确保value存在
|
|
||||||
label: item.xmmc || `未知名称_${index}`, // 确保label存在
|
|
||||||
dw: item.dw || "",
|
|
||||||
refs: item.refs || "",
|
|
||||||
};
|
|
||||||
});
|
|
||||||
return formattedData;
|
|
||||||
} catch (error: any) {
|
|
||||||
console.error(`[fetchLabItemDict] 加载失败:`, error.message);
|
|
||||||
return []; // 失败时返回空数组,避免弹窗报错
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleItemSelect = async (selectedItem: any) => {
|
const handleItemSelect = async (selectedItem: any) => {
|
||||||
// 1. 构造新增行数据
|
// 1. 构造新增行数据
|
||||||
@ -123,50 +90,24 @@ const handleItemSelect = async (selectedItem: any) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const addRowFromDict = async (rowData: any) => {
|
const addRowFromDict = async (rowData: any) => {
|
||||||
if (!rowData?.xmdh) {
|
if (!rowData.xmdh) return ElMessage.error("新增失败:项目编码不能为空");
|
||||||
ElMessage.error("项目编码不能为空");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// 1. 校验输入数据有效性
|
|
||||||
if (!rowData || !rowData.xmdh) {
|
|
||||||
ElMessage.error("新增失败:项目编码不能为空");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. 检查是否重复添加同一项目(根据xmdh判断)
|
|
||||||
const isDuplicate = tableData.value.some((item: any) => item.xmdh === rowData.xmdh);
|
const isDuplicate = tableData.value.some((item: any) => item.xmdh === rowData.xmdh);
|
||||||
if (isDuplicate) {
|
if (isDuplicate) return ElMessage.warning(`项目【${rowData.xmmc}】已存在`);
|
||||||
ElMessage.warning(`项目【${rowData.xmmc}】已存在`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. 补全新增行的必要字段(如无则初始化)
|
|
||||||
const newRow = { ...rowData, csjg: "" };
|
const newRow = { ...rowData, csjg: "" };
|
||||||
|
|
||||||
// 4. 添加到表格数据
|
|
||||||
tableData.value.push(newRow);
|
tableData.value.push(newRow);
|
||||||
|
|
||||||
// 5. 自动聚焦
|
// 5. 自动聚焦
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
tableRef.value.setCurrentRow(newRow);
|
tableRef.value.setCurrentRow(newRow);
|
||||||
nextTick(() => {
|
tableRef.value.setScrollTo(tableData.value.length - 1)
|
||||||
tableRef.value.setScrollTop(23 * tableRef.value.length)
|
// 聚焦到新行的输入框
|
||||||
})
|
const inputs = document.querySelectorAll('.full-width-input .el-input__inner') as NodeListOf<HTMLInputElement>;
|
||||||
nextTick(() => {
|
if (inputs.length > 0) {
|
||||||
const tableBody = document.querySelector('.el-table__body-wrapper');
|
inputs[inputs.length - 1]?.focus();
|
||||||
if (tableBody) {
|
}
|
||||||
tableBody.scrollTop = tableBody.scrollHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 聚焦到新行的输入框
|
|
||||||
const inputs = document.querySelectorAll('.full-width-input .el-input__inner') as NodeListOf<HTMLInputElement>;
|
|
||||||
if (inputs.length > 0) {
|
|
||||||
inputs[inputs.length - 1]?.focus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return true;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleCsjgEnter = (row: any) => {
|
const handleCsjgEnter = (row: any) => {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user