From 466e7296fa579c803bb39b8352ea1b60f24cf0f1 Mon Sep 17 00:00:00 2001 From: duzhongxu <15039018447@163.com> Date: Tue, 31 Mar 2026 15:59:39 +0800 Subject: [PATCH] =?UTF-8?q?309=E6=A3=80=E9=AA=8C=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE-=E3=80=8B=E5=A5=97=E9=A4=90=E7=AE=A1?= =?UTF-8?q?=E7=90=86=EF=BC=9A=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6=E7=9A=84?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=AD=97=E6=AE=B5=E4=B8=8B=E6=8B=89=E9=80=89?= =?UTF-8?q?=E9=A1=B9=E6=97=A0=E5=86=85=E5=AE=B9=20310=E6=A3=80=E9=AA=8C?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E8=AE=BE=E7=BD=AE-=E3=80=8B=E5=A5=97?= =?UTF-8?q?=E9=A4=90=E7=AE=A1=E7=90=86=EF=BC=9A=E7=82=B9=E5=87=BB=E3=80=90?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E3=80=91/=E3=80=90=E6=9F=A5=E7=9C=8B?= =?UTF-8?q?=E3=80=91=E5=A5=97=E9=A4=90=E8=AE=BE=E7=BD=AE=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E7=9A=84lis=E5=88=86=E7=BB=84=E5=AD=97=E6=AE=B5=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=95=B0=E5=AD=97=20311=20=E6=A3=80=E9=AA=8C=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E8=AE=BE=E7=BD=AE-=E3=80=8B=E6=A3=80=E9=AA=8C?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=EF=BC=9A=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E4=B8=80=E6=9D=A1=E6=A3=80=E9=AA=8C=E9=A1=B9=E7=9B=AE=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E8=87=AA=E5=8A=A8=E5=9C=A8=E3=80=8A=E8=AF=8A=E7=96=97?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E3=80=8B=E5=A2=9E=E5=8A=A0=E4=B8=80=E6=9D=A1?= =?UTF-8?q?=E6=A3=80=E9=AA=8C=E6=94=B6=E8=B4=B9=E9=A1=B9=E7=9B=AE=20312?= =?UTF-8?q?=E6=A3=80=E9=AA=8C=E9=A1=B9=E7=9B=AE=E8=AE=BE=E7=BD=AE-?= =?UTF-8?q?=E5=A5=97=E9=A4=90=E8=AE=BE=E7=BD=AE=EF=BC=9A=E6=8A=98=E6=89=A3?= =?UTF-8?q?%=E5=AD=97=E6=AE=B5=E6=8D=A2=E7=AE=97=E5=85=AC=E5=BC=8F?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InspectionPackageController.java | 3 + .../Inspection/PackageManagement.vue | 82 +++++++++++++- .../views/maintainSystem/Inspection/index.vue | 101 +++++++++--------- 3 files changed, 132 insertions(+), 54 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/lab/controller/InspectionPackageController.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/lab/controller/InspectionPackageController.java index 5e6225fa..a011a243 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/lab/controller/InspectionPackageController.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/lab/controller/InspectionPackageController.java @@ -146,6 +146,9 @@ public class InspectionPackageController extends BaseController { if (inspectionPackage.getIsDisabled() != null) { queryWrapper.eq("is_disabled", inspectionPackage.getIsDisabled()); } + if (inspectionPackage.getUserId() != null && !inspectionPackage.getUserId().isEmpty()) { + queryWrapper.like("user_id", inspectionPackage.getUserId()); + } } // 默认只查询未删除的记录 diff --git a/openhis-ui-vue3/src/views/maintainSystem/Inspection/PackageManagement.vue b/openhis-ui-vue3/src/views/maintainSystem/Inspection/PackageManagement.vue index 50774211..7223cd6a 100644 --- a/openhis-ui-vue3/src/views/maintainSystem/Inspection/PackageManagement.vue +++ b/openhis-ui-vue3/src/views/maintainSystem/Inspection/PackageManagement.vue @@ -79,7 +79,25 @@
- + + +
@@ -261,9 +279,61 @@ const searchParams = ref({ endDate: getCurrentDate(), packageName: '', packageLevel: '', - department: '' + department: '', + user: '' }); +// 用户下拉选项 +const userOptions = ref([]) +const userLoading = ref(false) +const allUserOptions = ref([]) // 全量缓存 + +// 点击时加载个人套餐中的用户值 +async function handleUserFocus() { + if (allUserOptions.value.length === 0) { + await loadUserOptions() + } + userOptions.value = allUserOptions.value +} + +// 输入时前端模糊过滤 +function remoteSearchUser(keyword) { + if (!keyword) { + userOptions.value = allUserOptions.value + } else { + userOptions.value = allUserOptions.value.filter(u => u.label.includes(keyword)) + } +} + +// 调套餐接口,取个人套餐的userId字段去重 +async function loadUserOptions() { + try { + userLoading.value = true + const res = await listInspectionPackage({ + pageNum: 1, + pageSize: 50, + packageLevel: '个人套餐', + packageCategory: '检验套餐' + }) + let list = [] + if (res && res.data) { + if (Array.isArray(res.data.rows)) list = res.data.rows + else if (Array.isArray(res.data.records)) list = res.data.records + else if (Array.isArray(res.data)) list = res.data + } else if (Array.isArray(res?.rows)) { + list = res.rows + } + const uniqueUsers = [...new Set( + list.map(item => item.userId).filter(u => u && u.trim()) + )] + allUserOptions.value = uniqueUsers.map(u => ({ value: u, label: u })) + } catch (e) { + ElMessage.error('加载用户列表失败') + } finally { + userLoading.value = false + } +} + // 从API加载数据 async function loadData() { try { @@ -297,6 +367,9 @@ async function loadData() { if (searchParams.value.department) { params.department = searchParams.value.department } + if (searchParams.value.user) { + params.userId = searchParams.value.user + } const response = await listInspectionPackage(params) @@ -489,9 +562,10 @@ function handleReset() { endDate: getCurrentDate(), packageName: '', packageLevel: '', - department: '' + department: '', + user: '' }; - currentPage.value = 1; // 重置到第一页 + currentPage.value = 1; loadData() } diff --git a/openhis-ui-vue3/src/views/maintainSystem/Inspection/index.vue b/openhis-ui-vue3/src/views/maintainSystem/Inspection/index.vue index 0bc965aa..282c1ce9 100644 --- a/openhis-ui-vue3/src/views/maintainSystem/Inspection/index.vue +++ b/openhis-ui-vue3/src/views/maintainSystem/Inspection/index.vue @@ -560,23 +560,30 @@ 服务费 -
+
lis分组 - - - + +
血量 @@ -847,7 +854,7 @@ const route = useRoute(); // 存储LIS分组数据 const lisGroupList = ref([]); // 选中的LIS分组 -const selectedLisGroup = ref(''); +const selectedLisGroup = ref(undefined); // LIS分组加载状态 const loadingLisGroup = ref(false); @@ -894,7 +901,7 @@ const getLisGroupList = async () => { } } - lisGroupList.value = items; + lisGroupList.value = items.map(item => ({ ...item, id: Number(item.id) })); } else { ElMessage.error('获取LIS分组数据失败'); } @@ -1552,20 +1559,10 @@ const deletePackageItem = (index) => { }; -// 更新项目金额(考虑折扣) +// 更新项目金额(金额 = 数量 × 单价,不应用折扣;折扣只影响套餐总金额) const updateItemAmount = (item) => { - // 计算项目原价金额 - const originalAmount = (item.quantity || 1) * (item.unitPrice || 0.00); - - // 应用折扣到项目金额 - let discountedAmount = originalAmount; - if (discount.value && !isNaN(parseFloat(discount.value))) { - const discountRate = parseFloat(discount.value) / 100; - discountedAmount = originalAmount * (1 - discountRate); - } - - // 更新项目金额 - item.amount = parseFloat(discountedAmount.toFixed(2)); + // 金额 = 数量 × 单价 + item.amount = parseFloat(((item.quantity || 1) * (item.unitPrice || 0.00)).toFixed(2)); // 注意:serviceFee 由用户手动输入,不在此处覆盖 @@ -1647,15 +1644,9 @@ const cancelEditItem = (index) => { // 计算套餐金额和服务费 const calculateAmounts = () => { - // 更新每个项目的折扣金额和总金额 + // 更新每个项目的金额(金额 = 数量 × 单价,不受折扣影响)和总金额 packageItems.value.forEach(item => { - const originalAmount = (item.quantity || 1) * (item.unitPrice || 0.00); - let discountedAmount = originalAmount; - if (discount.value && !isNaN(parseFloat(discount.value))) { - const discountRate = parseFloat(discount.value) / 100; - discountedAmount = originalAmount * (1 - discountRate); - } - item.amount = parseFloat(discountedAmount.toFixed(2)); + item.amount = parseFloat(((item.quantity || 1) * (item.unitPrice || 0.00)).toFixed(2)); // serviceFee 由用户手动输入,不覆盖;只更新 totalAmount item.totalAmount = parseFloat(((item.amount) + (item.serviceFee || 0)).toFixed(2)); }); @@ -1663,9 +1654,14 @@ const calculateAmounts = () => { // 汇总各明细行服务费到基本信息服务费(只读展示) serviceFee.value = parseFloat(packageItems.value.reduce((sum, item) => sum + (item.serviceFee || 0), 0).toFixed(2)); - // 套餐总金额 = 各行折扣后金额之和 + 各行服务费之和 - const totalAmount = packageItems.value.reduce((sum, item) => sum + (item.amount || 0) + (item.serviceFee || 0), 0); - packageAmount.value = parseFloat(totalAmount.toFixed(2)); + // 套餐总金额 = (各行金额之和 + 各行服务费之和) × 折扣比例 + const rawTotal = packageItems.value.reduce((sum, item) => sum + (item.amount || 0) + (item.serviceFee || 0), 0); + let finalTotal = rawTotal; + if (discount.value && !isNaN(parseFloat(discount.value)) && parseFloat(discount.value) > 0) { + const discountRate = parseFloat(discount.value) / 100; // 80 → 0.8,表示八折保留80% + finalTotal = rawTotal * discountRate; + } + packageAmount.value = parseFloat(finalTotal.toFixed(2)); }; const itemNameRefs = ref([]); @@ -2019,7 +2015,7 @@ const saveItem = async (item) => { const submitData = { busNo: item.code.trim(), name: item.name.trim(), - categoryCode: inspectionCategoryCode.value, + categoryCode: inspectionCategoryCode.value , // '22' 为检验分类的固定字典值,防止字典未加载时为空 inspectionTypeId: item.inspectionTypeId || null, feePackageId: item.feePackageId || null, subItemId: item.subItemId || null, @@ -2183,7 +2179,7 @@ const handleSave = () => { enablePackagePrice: enablePackagePrice.value, packageAmount: packageAmount.value, serviceFee: serviceFee.value, - lisGroup: selectedLisGroup.value, // 从下拉框获取 + lisGroup: selectedLisGroup.value || null, bloodVolume: bloodVolume.value, remarks: remarks.value, orgName: (tenantOptions.value.find(t => t.value === selectedTenantId.value)?.label) || userStore.orgName || '', // 卫生机构 @@ -2423,13 +2419,13 @@ const savePackageData = async (basicInfo, detailData) => { // 关闭加载提示 loading.close(); - ElMessage.success('保存成功'); - if (isEditMode) { - // 编辑模式:重新加载最新数据,保持在编辑页面 - loadInspectionPackage(String(packageId)); + // 编辑模式:提示更新成功并跳转到套餐管理页面 + ElMessage.success('更新成功'); + router.push({ path: '/maintainSystem/Inspection/PackageManagement' }); } else { // 新增模式:保存成功后重置表单 + ElMessage.success('保存成功'); doResetForm(); } @@ -2498,7 +2494,7 @@ const doResetForm = () => { enablePackagePrice.value = true; packageAmount.value = 0.00; serviceFee.value = 0.00; - selectedLisGroup.value = ''; + selectedLisGroup.value = undefined; bloodVolume.value = ''; remarks.value = ''; @@ -2522,6 +2518,11 @@ const loadInspectionPackage = async (packageId) => { background: 'rgba(0, 0, 0, 0.7)', }); + // 确保 lis分组列表已加载,否则编辑时下拉框无法显示名称 + if (lisGroupList.value.length === 0) { + await getLisGroupList(); + } + // 获取基本信息 const basicResponse = await getInspectionPackage(packageId); if (basicResponse.code !== 200) { @@ -2551,7 +2552,7 @@ const loadInspectionPackage = async (packageId) => { enablePackagePrice.value = basicData.enablePackagePrice !== false; packageAmount.value = parseFloat(basicData.packageAmount || 0); serviceFee.value = parseFloat(basicData.serviceFee || 0); - selectedLisGroup.value = basicData.lisGroup || ''; + selectedLisGroup.value = (basicData.lisGroup != null && basicData.lisGroup !== 0 && basicData.lisGroup !== '0') ? Number(basicData.lisGroup) : undefined; bloodVolume.value = basicData.bloodVolume || ''; remarks.value = basicData.remarks || '';