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分组
-
-
-
+
+
+
+
+ selectedLisGroup = val || undefined"
+ @visible-change="handleLisGroupVisibleChange"
+ @clear="() => selectedLisGroup = undefined"
+ >
+
+
+
血量
@@ -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 || '';