This commit is contained in:
wyuu 2026-01-19 12:10:46 +08:00
parent d8197cfb4d
commit 030a068b66
4 changed files with 146 additions and 52 deletions

View File

@ -155,3 +155,11 @@ export function saveQcvalMonth(data?: Object) {
data data
}) })
} }
//复制靶值
export function copyQcSample(data?: Object) {
return request({
url: '/qc/copyQcSample',
method: 'get',
params: data
})
}

View File

@ -3,15 +3,16 @@
<div class="tips">检验科条码打印 &nbsp; 科室:{{ formatDict(queryParams.ksdh, 'DP') }} &nbsp; 登录人:{{ nickName }}</div> <div class="tips">检验科条码打印 &nbsp; 科室:{{ formatDict(queryParams.ksdh, 'DP') }} &nbsp; 登录人:{{ nickName }}</div>
<div ref="compactForm"> <div ref="compactForm">
<el-row :gutter="10" class="compact-form" v-show="showSearch"> <el-row :gutter="10" class="compact-form" v-show="showSearch">
<el-form :model="queryParams" ref="queryRef" :inline="true" :size="aotuSize" :rules="queryRules"> <el-form :model="queryParams" ref="queryRef" :inline="true" :size="aotuSize" :rules="queryRules"
label-width="80px">
<el-form-item label="开始时间:" prop="st"> <el-form-item label="开始时间:" prop="st">
<el-date-picker v-model="queryParams.st" type="date" format="YYYY-MM-DD HH:mm:ss" <el-date-picker v-model="queryParams.st" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
value-format="YYYY-MM-DD HH:mm:ss" @change="handletime" /> @change="handletime" />
</el-form-item> </el-form-item>
<el-form-item label="结束时间:" prop="et"> <el-form-item label="结束时间:" prop="et">
<el-date-picker v-model="queryParams.et" type="date" format="YYYY-MM-DD HH:mm:ss" <el-date-picker v-model="queryParams.et" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
value-format="YYYY-MM-DD HH:mm:ss" @change="handletime" /> @change="handletime" />
</el-form-item> </el-form-item>
<!-- <el-form-item label="医疗机构:" prop="yljg"> <!-- <el-form-item label="医疗机构:" prop="yljg">
@ -82,7 +83,8 @@
<svg-icon v-if="row.zt != 1" icon-class="lvgou" /> <svg-icon v-if="row.zt != 1" icon-class="lvgou" />
</template> </template>
<template #jzbz="{ row }"> <template #jzbz="{ row }">
<div style="color: #f00;"> {{ row.jzbz == '1' ? '急' : '' }}</div> <div style="color: #f00;" v-if="row.jzbz == '1'">急</div>
<div style="color: transparent;" v-else>无</div>
</template> </template>
<template #jjzt="{ row }"> <template #jjzt="{ row }">
{{ row.jjzt == '1' ? '计价' : '无' }} {{ row.jjzt == '1' ? '计价' : '无' }}
@ -180,7 +182,6 @@ import iFrame from "@/components/iFrame/index.vue";
import { comDict } from '@/utils/dict' import { comDict } from '@/utils/dict'
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { log } from 'vxe-pc-ui';
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()
const userStore = useUserStore() const userStore = useUserStore()
@ -209,10 +210,10 @@ interface QueryParams {
} }
// 提交表单数据 // 提交表单数据
const queryParams = reactive<QueryParams>({ const queryParams = reactive<QueryParams>({
st: '2025-07-18 00:00:00', st: '2025-07-18',
et: '2025-07-18 23:59:59', et: '2025-07-18',
yljg: '1', yljg: '1',
zt: '', zt: '2',
queryType: '', queryType: '',
queryValue: '', queryValue: '',
ksdh: '', ksdh: '',
@ -601,13 +602,13 @@ const timeDate = () => {
// 计算前6天的日期(当天 + 前6天 = 7天) // 计算前6天的日期(当天 + 前6天 = 7天)
const startOfWeek = today.subtract(6, 'day'); const startOfWeek = today.subtract(6, 'day');
queryParams.st = route.query.startdate ? String(route.query.startdate) : startOfWeek.format('YYYY-MM-DD HH:mm:ss'); queryParams.st = route.query.startdate ? String(route.query.startdate) : startOfWeek.format('YYYY-MM-DD');
queryParams.et = route.query.endate ? String(route.query.endate) : today.format('YYYY-MM-DD HH:mm:ss'); queryParams.et = route.query.endate ? String(route.query.endate) : today.format('YYYY-MM-DD');
} }
onMounted(async () => { onMounted(async () => {
// timeDate() timeDate()
queryParams.ksdh = (route.query.deptcode as string) ? (route.query.deptcode as string) : ''; queryParams.ksdh = (route.query.deptcode as string) ? (route.query.deptcode as string) : '';
queryParams.userid = (route.query.userid as string) ? (route.query.userid as string) : ''; queryParams.userid = (route.query.userid as string) ? (route.query.userid as string) : '';
@ -653,7 +654,7 @@ const formatDict = (v: string, dictType: string) => {
const handletime = (val: Array<string>) => { const handletime = (val: Array<string>) => {
// 校验日期格式 // 校验日期格式
const dayDiff = getDayDiff(queryParams.st, queryParams.et); const dayDiff = getDayDiff(queryParams.st, queryParams.et);
if (dayDiff === -1) return ElMessage.warning('请选择有效的日期范围'); if (dayDiff === -1 || dayDiff === -2) return ElMessage.warning('请选择有效的日期范围');
//校验是否超过7天 //校验是否超过7天
// if (dayDiff > 7) return ElMessage.warning('查询时间范围不能超过7天,请重新选择'); // if (dayDiff > 7) return ElMessage.warning('查询时间范围不能超过7天,请重新选择');
} }
@ -679,13 +680,12 @@ const getDayDiff = (start: string, end: string): number => {
const startTime = new Date(start).getTime(); const startTime = new Date(start).getTime();
const endTime = new Date(end).getTime(); const endTime = new Date(end).getTime();
// 校验日期有效性
if (isNaN(startTime) || isNaN(endTime)) { if (isNaN(startTime) || isNaN(endTime)) {
return -1; // 无效日期 return -2; // -2 表示日期无效
} }
// 计算毫秒差 → 转换为天数(向上取整,避免因时分秒导致的误差) const dayDiff = Math.ceil((endTime - startTime) / (24 * 60 * 60 * 1000));
return Math.ceil((endTime - startTime) / (24 * 60 * 60 * 1000)); return dayDiff < 0 ? -1 : dayDiff; // -1 表示结束时间早于开始时间,>=0 为正常天数
}; };
// 查询申请单 // 查询申请单
const getList = () => { const getList = () => {
@ -706,12 +706,8 @@ const getList = () => {
// 校验日期格式 // 校验日期格式
const dayDiff = getDayDiff(queryParams.st, queryParams.et); const dayDiff = getDayDiff(queryParams.st, queryParams.et);
if (dayDiff === -1) return ElMessage.warning('请选择有效的日期范围');
//校验是否超过7天
// if (dayDiff > 7) return ElMessage.warning('查询时间范围不能超过7天,请重新选择');
if (dayDiff === -1 || dayDiff === -2) return ElMessage.warning('请选择有效的日期范围');
loading.value = true; loading.value = true;
fetchCodeList(data).then((response: any) => { fetchCodeList(data).then((response: any) => {

View File

@ -5,18 +5,20 @@
<el-row :gutter="5" class="compact-form" v-show="showSearch"> <el-row :gutter="5" class="compact-form" v-show="showSearch">
<el-form :model="queryParams" ref="queryRef" label-width="100px" :rules="queryRules" style="width: 100%;"> <el-form :model="queryParams" ref="queryRef" label-width="100px" :rules="queryRules" style="width: 100%;">
<el-row> <el-row>
<el-col :span="6"> <el-col :span="4">
<el-form-item label="开始时间:" prop="st"> <el-form-item label="开始时间:" prop="st">
<el-date-picker v-model="queryParams.st" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" <el-date-picker v-model="queryParams.st" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
@change="handletime" /> @change="handletime" style="width: 100%" />
</el-form-item> </el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="结束时间:" prop="et"> <el-form-item label="结束时间:" prop="et">
<el-date-picker v-model="queryParams.et" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" <el-date-picker v-model="queryParams.et" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
@change="handletime" /> @change="handletime" style="width: 100%" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="4">
<el-form-item label="打印状态:" prop="dybz"> <el-form-item label="打印状态:" prop="dybz">
<el-select v-model="queryParams.dybz" placeholder="请选择" clearable @change="handleQuery"> <el-select v-model="queryParams.dybz" placeholder="请选择" clearable @change="handleQuery">
<el-option label="已打印" value="1" /> <el-option label="已打印" value="1" />
@ -24,13 +26,13 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="4">
<el-form-item label="科室:" prop="ksdh"> <el-form-item label="科室:" prop="ksdh">
<SelectTable v-model:data="queryParams.ksdh" :fields="ksdhFields" :tableData="dictData.DP || []" <SelectTable v-model:data="queryParams.ksdh" :fields="ksdhFields" :tableData="dictData.DP || []"
label="label" value="value" objKey="value" placeholder="请选择科室" @getDataValue="handleQuery" /> label="label" value="value" objKey="value" placeholder="请选择科室" @getDataValue="handleQuery" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="4">
<el-form-item label="病人类型:" prop="brlyname"> <el-form-item label="病人类型:" prop="brlyname">
<SelectTable v-model:data="queryParams.brlyname" :fields="brlxFields" :tableData="dictData.PT || []" <SelectTable v-model:data="queryParams.brlyname" :fields="brlxFields" :tableData="dictData.PT || []"
label="label" value="label" objKey="label" placeholder="请选择" @getDataValue="handleQuery" /> label="label" value="label" objKey="label" placeholder="请选择" @getDataValue="handleQuery" />
@ -39,32 +41,32 @@
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="6"> <el-col :span="4">
<el-form-item label-width="50px"> <el-form-item label-width="50px">
<el-checkbox v-model="queryParams.alarmflag" label="仅危急值" @change="alarmHandle" size="large" /> <el-checkbox v-model="queryParams.alarmflag" label="仅危急值" @change="alarmHandle" size="large" />
<el-checkbox v-model="queryParams.jzbz" label="仅急诊" @change="jzbzHandle" size="large" /> <el-checkbox v-model="queryParams.jzbz" label="仅急诊" @change="jzbzHandle" size="large" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="4">
<el-form-item label="姓名:" prop="brxm"> <el-form-item label="姓名:" prop="brxm">
<el-input v-model="queryParams.brxm" clearable placeholder="请输入姓名" @keyup.enter="handleQuery" <el-input v-model="queryParams.brxm" clearable placeholder="请输入姓名" @keyup.enter="handleQuery"
@clear="handleQuery" /> @clear="handleQuery" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="4">
<el-form-item label="病人号:" prop="brdh"> <el-form-item label="病人号:" prop="brdh">
<el-input v-model="queryParams.brdh" clearable placeholder="请输入病人号" @keyup.enter="handleQuery" <el-input v-model="queryParams.brdh" clearable placeholder="请输入病人号" @keyup.enter="handleQuery"
@clear="handleQuery" /> @clear="handleQuery" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="4">
<el-form-item label="床号:" prop="ch"> <el-form-item label="床号:" prop="ch">
<el-input v-model="queryParams.ch" clearable placeholder="请输入床号" @keyup.enter="handleQuery" <el-input v-model="queryParams.ch" clearable placeholder="请输入床号" @keyup.enter="handleQuery"
@clear="handleQuery" /> @clear="handleQuery" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="3"> <el-col :span="3">
<el-form-item label-width="50px"> <el-form-item>
<el-button icon="search" type="primary" @click="handleQuery"> <el-button icon="search" type="primary" @click="handleQuery">
搜索 搜索
</el-button> </el-button>
@ -251,12 +253,9 @@ const queryRules = ref({
}) })
const handletime = (val: Array<string>) => { const handletime = (val: Array<string>) => {
// console.log('时间', val);
// 校验日期格式 // 校验日期格式
const dayDiff = getDayDiff(queryParams.st, queryParams.et); const dayDiff = getDayDiff(queryParams.st, queryParams.et);
if (dayDiff === -1) return ElMessage.warning('请选择有效的日期范围'); if (dayDiff === -1 || dayDiff === -2) return ElMessage.warning('请选择有效的日期范围');
//校验是否超过7天
// if (dayDiff > 7) return ElMessage.warning('查询时间范围不能超过7天,请重新选择');
} }
// 时间线数据 // 时间线数据
@ -886,13 +885,12 @@ const getDayDiff = (start: string, end: string): number => {
const startTime = new Date(start).getTime(); const startTime = new Date(start).getTime();
const endTime = new Date(end).getTime(); const endTime = new Date(end).getTime();
// 校验日期有效性
if (isNaN(startTime) || isNaN(endTime)) { if (isNaN(startTime) || isNaN(endTime)) {
return -1; // 无效日期 return -2; // -2 表示日期无效
} }
// 计算毫秒差 → 转换为天数(向上取整,避免因时分秒导致的误差) const dayDiff = Math.ceil((endTime - startTime) / (24 * 60 * 60 * 1000));
return Math.ceil((endTime - startTime) / (24 * 60 * 60 * 1000)); return dayDiff < 0 ? -1 : dayDiff; // -1 表示结束时间早于开始时间,>=0 为正常天数
}; };
const getList = () => { const getList = () => {
@ -916,10 +914,7 @@ const getList = () => {
if (!data.userid) return ElMessage.error('用户userid不能为空'); if (!data.userid) return ElMessage.error('用户userid不能为空');
// 校验日期格式 // 校验日期格式
const dayDiff = getDayDiff(queryParams.st, queryParams.et); const dayDiff = getDayDiff(queryParams.st, queryParams.et);
if (dayDiff === -1) return ElMessage.warning('请选择有效的日期范围'); if (dayDiff === -1 || dayDiff === -2) return ElMessage.warning('请选择有效的日期范围');
//校验是否超过7天
// if (dayDiff > 7) return ElMessage.warning('查询时间范围不能超过7天,请重新选择');
loading.value = true loading.value = true
reportList(data).then((res: any) => { reportList(data).then((res: any) => {

View File

@ -46,10 +46,10 @@
<el-input v-model="row.zkbz" class="full-width-input" /> <el-input v-model="row.zkbz" class="full-width-input" />
</template> </template>
<template #sd="{ row }"> <template #sd="{ row }">
<el-input v-model="row.sd" class="full-width-input" /> <el-input v-model="row.sd" class="full-width-input" @change="handleSdEnter(row)" />
</template> </template>
<template #cv="{ row }"> <template #cv="{ row }">
<el-input v-model="row.cv" class="full-width-input" /> <el-input v-model="row.cv" class="full-width-input" @change="handleCvEnter(row)" />
</template> </template>
<template #bc="{ row }"> <template #bc="{ row }">
<el-input v-model="row.bc" class="full-width-input" /> <el-input v-model="row.bc" class="full-width-input" />
@ -157,21 +157,63 @@
</template> </template>
</el-dialog> </el-dialog>
<el-dialog title="复制靶值" v-model="copyVisible" width="25vw" :close-on-click-modal="false" :draggable="true">
<el-form :model="copyFormData" ref="copyQueryRef" :rules="copyRules" label-position="right" label-width="auto">
<el-form-item label="仪器" prop="yq">
<YQSelectTable v-model:data="copyFormData.yq" width="100%" clearable />
</el-form-item>
<el-form-item label="批号" prop="newzkpph">
<el-input v-model="copyFormData.newzkpph" />
</el-form-item>
<el-form-item label="水平" prop="newzkph">
<el-select v-model="copyFormData.newzkph" placeholder="请选择">
<el-option label="水平1" value="1" />
<el-option label="水平2" value="2" />
<el-option label="水平3" value="3" />
<el-option label="水平4" value="4" />
<el-option label="水平5" value="5" />
<el-option label="水平6" value="6" />
</el-select>
</el-form-item>
<el-form-item label="新启用日期" prop="newstartda">
<el-date-picker v-model="copyFormData.newstartda" type="date" value-format="YYYY-MM-DD" /> &nbsp;
<el-checkbox v-model="copyFormData.newdtflag" label="复制日期" true-value="1" false-value="0" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="subHandle">确定</el-button>
<el-button @click="closeCopyDialog">取消</el-button>
</div>
</template>
</el-dialog>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { queryBatch, queryValXmdh, queryBatchXm, delBatchno, addBatchno, updateBatchno, saveBtQcSample } from '@/api/liswork/qualityControl' import { queryBatch, queryValXmdh, queryBatchXm, delBatchno, addBatchno, updateBatchno, saveBtQcSample, copyQcSample } from '@/api/liswork/qualityControl'
import { templateRef } from '@vueuse/core' import { templateRef } from '@vueuse/core'
import { formatDict, getDictData, dictData } from '@/hooks'; import { formatDict, getDictData, dictData } from '@/hooks';
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
import { log } from 'vxe-pc-ui'; import YQSelectTable from '@/components/SelectTable/YQSelectTable/index.vue';
import dayjs from 'dayjs';
const yq = defineModel<string>() const yq = defineModel<string>()
const title = ref('新增批号') const title = ref('新增批号')
const visible = ref(false) const visible = ref(false)
const selectedRow = ref(null) const selectedRow: any = ref(null)
const queryRef = templateRef('queryRef') const queryRef = templateRef('queryRef')
const copyVisible = ref(false)
const copyFormData = ref({
yq: '',
newzkpph: '',
newzkph: '',
newstartda: dayjs().format('YYYY-MM-DD'),
newdtflag: '0'
})
const copyRules = ref({})
const formData = ref({ const formData = ref({
yq: yq, yq: yq,
zkpph: '', zkpph: '',
@ -252,6 +294,7 @@ const columnDragEnd = (data: any) => {
} }
const rowClick = (row: any) => { const rowClick = (row: any) => {
topTableRef.value.setCurrentRow(row)
selectedRow.value = row selectedRow.value = row
const data = { const data = {
xmdh: row.xmdh, xmdh: row.xmdh,
@ -349,6 +392,18 @@ const batchClick = (row: any) => {
batchInfo.value = row batchInfo.value = row
getXmList(row) getXmList(row)
} }
const handleSdEnter = (row: any) => {
// cv = sd * 100 / zkbz
row.cv = row.sd * 100 / row.zkbz
}
const handleCvEnter = (row: any) => {
// sd = cv * zkbz / 100
row.sd = row.cv * row.zkbz / 100
}
const leftTableRef = templateRef('leftTableRef')
const getBatchList = () => { const getBatchList = () => {
batchInfo.value = null batchInfo.value = null
loading.value = true loading.value = true
@ -357,13 +412,17 @@ const getBatchList = () => {
tableData.value = res.data || [] tableData.value = res.data || []
if (tableData.value.length) { if (tableData.value.length) {
getXmList(tableData.value[0]) getXmList(tableData.value[0])
leftTableRef.value.setCurrentRow(tableData.value[0])
} else { } else {
topTableData.value = [] topTableData.value = []
bottomTableData.value = [] bottomTableData.value = []
} }
}) })
} }
const topTableRef = templateRef('topTableRef')
const getXmList = (row: any) => { const getXmList = (row: any) => {
topTableRef.value.setCurrentRow(row)
queryBatchXm({ yq: yq.value, zkpph: row.zkpph, zkph: row.zkph }).then((res: any) => { queryBatchXm({ yq: yq.value, zkpph: row.zkpph, zkph: row.zkph }).then((res: any) => {
res.data.forEach((item: any) => { item.show = false }) res.data.forEach((item: any) => { item.show = false })
topTableData.value = res.data topTableData.value = res.data
@ -373,6 +432,41 @@ const getXmList = (row: any) => {
}) })
} }
const copyBzHandle = () => { const copyBzHandle = () => {
if (!selectedRow.value) return ElMessage.warning('请选择要复制的行')
copyFormData.value.yq = selectedRow.value.yq.trim()
copyFormData.value.newzkpph = selectedRow.value.zkpph
copyFormData.value.newzkph = selectedRow.value.zkph
copyVisible.value = true
}
const subHandle = () => {
const data = {
yq: selectedRow.value.yq,
zkpph: selectedRow.value.zkpph,
zkph: selectedRow.value.zkph,
newyq: copyFormData.value.yq,
newzkpph: copyFormData.value.newzkpph,
newzkph: selectedRow.value.zkph,
newstartda: copyFormData.value.newstartda,
newdtflag: copyFormData.value.newdtflag
}
copyQcSample(data).then((res: any) => {
if (res.code == 0) {
ElMessage.success('复制成功')
closeCopyDialog()
}
})
}
const closeCopyDialog = () => {
copyFormData.value = {
yq: '',
newzkpph: '',
newzkph: '',
newstartda: dayjs().format('YYYY-MM-DD'),
newdtflag: ''
}
copyVisible.value = false
} }
const addBzHandle = () => { const addBzHandle = () => {
topTableData.value.forEach((item: any) => { topTableData.value.forEach((item: any) => {
@ -391,7 +485,8 @@ const delBzHandle = (row: any) => {
}) })
} }
const handleSave = () => { const handleSave = () => {
console.log(topTableData.value) const flag = topTableData.value.filter((item: any) => item.zkbz).every((item: any) => item.zkbz && item.sd && item.cv && item.ksrq)
if (!flag) return ElMessage.warning('请填写完整信息')
saveBtQcSample(topTableData.value).then((res: any) => { saveBtQcSample(topTableData.value).then((res: any) => {
if (res.code == 0) { if (res.code == 0) {
ElMessage.success('保存成功') ElMessage.success('保存成功')