@@ -562,7 +562,14 @@
</div>
<div class=" form - item ">
<span class=" form - label ">lis分组</span>
<el-select v-model=" selectedLisGroup " placeholder=" 请选择lis分组 " style=" width : 100 % ; " :disabled=" isViewMode ">
<el-select
v-model=" selectedLisGroup "
placeholder=" 请选择lis分组 "
style=" width : 100 % ; "
:disabled=" isViewMode "
:loading=" loadingLisGroup "
@visible-change=" handleLisGroupVisibleChange "
>
<el-option
v-for=" group in lisGroupList "
:key=" group . id "
@@ -841,36 +848,50 @@ const route = useRoute();
const lisGroupList = ref([]);
// 选中的LIS分组
const selectedLisGroup = ref('');
// LIS分组加载状态
const loadingLisGroup = ref(false);
// 点击展开时才加载LIS分组数据
const handleLisGroupVisibleChange = (visible) => {
if (visible && lisGroupList.value.length === 0) {
getLisGroupList();
}
};
// 获取就诊科室数据 - 与门诊挂号页面保持一致,在组件初始化时直接调用
getLocationInfo();
// 获取LIS分组数据
const getLisGroupList = async () => {
loadingLisGroup.value = true;
try {
const response = await listLisGroup();
const response = await listLisGroup({ pageNum: 1, pageSize: 200 } );
if (response.code === 200) {
// 适配可能的不同响应格式
let items = [];
// 检查响应数据
if (response.data) {
// 格式1 : {data: {rows: [], total: number}} - 标准分页格式
if (response.data.row s && Array.isArray(response.data.row s)) {
// 格式0: {data : {data: {records: []}}} - 三层嵌套 MyBatisPlus 分页格式(实际后端返回格式)
if (response.data.data && response.data.data.record s && Array.isArray(response.data.data.record s)) {
items = response.data.data.records;
}
// 格式1: {data: {records: [], total: number}} - MyBatisPlus 分页格式
else if (response.data.records && Array.isArray(response.data.records)) {
items = response.data.records;
}
// 格式2: {data: {rows: [], total: number}} - 标准分页格式
else if (response.data.rows && Array.isArray(response.data.rows)) {
items = response.data.rows;
}
// 格式2 : {data: []} - 简单数组格式
// 格式3 : {data: []} - 简单数组格式
else if (Array.isArray(response.data)) {
items = response.data;
}
// 格式3 : {data: {data: []}} - 双重嵌套格式
// 格式4 : {data: {data: []}} - 双重嵌套数组 格式
else if (response.data.data && Array.isArray(response.data.data)) {
items = response.data.data;
}
// 格式4: {data: {data: {rows: []}}} - 双重嵌套分页格式
else if (response.data.data && response.data.data.rows && Array.isArray(response.data.data.rows)) {
items = response.data.data.rows;
}
}
lisGroupList.value = items;
@@ -878,8 +899,9 @@ const getLisGroupList = async () => {
ElMessage.error('获取LIS分组数据失败');
}
} catch (error) {
console.error('获取LIS分组数据失败:', error);
ElMessage.error('获取LIS分组数据失败');
} finally {
loadingLisGroup.value = false;
}
};
@@ -1545,8 +1567,7 @@ const updateItemAmount = (item) => {
// 更新项目金额
item.amount = parseFloat(discountedAmount.toFixed(2));
// 基于折扣后的金额计算服务费
item.serviceFee = calculateItemServiceFee(item);
// 注意: serviceFee 由用户手动输入,不在此处覆盖
// 更新项目总金额
updateItemTotalAmount(item);
@@ -1624,63 +1645,27 @@ const cancelEditItem = (index) => {
calculateAmounts();
};
// 计算单个项目的服务费(基于折扣后的金额)
const calculateItemServiceFee = (item) => {
if (!generateServiceFee.value) return 0;
// 服务费是项目折扣后金额的10%
return parseFloat((item.amount * 0.1).toFixed(2));
};
// 重新分配所有项目的服务费(基于折扣后的金额)
const redistributeServiceFee = () => {
if (!generateServiceFee.value) {
// 如果不生成服务费, 将所有项目的服务费设为0
packageItems.value.forEach(item => {
item.serviceFee = 0;
updateItemTotalAmount(item);
});
return;
}
// 重新计算每个项目的服务费
packageItems.value.forEach(item => {
item.serviceFee = calculateItemServiceFee(item);
updateItemTotalAmount(item);
});
};
// 计算套餐金额和服务费
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));
// serviceFee 由用户手动输入,不覆盖;只更新 totalAmount
item.totalAmount = parseFloat(((item.amount) + (item.serviceFee || 0)).toFixed(2));
});
// 重新分配所有项目的服务费
redistributeServiceFee();
// 计算套餐总服务费
if (generateServiceFee.value) {
// 汇总各明细行服务费到基本信息服务费(只读展示)
serviceFee.value = parseFloat(packageItems.value.reduce((sum, item) => sum + (item.serviceFee || 0), 0).toFixed(2));
} else {
serviceFee.value = 0;
}
// 计算 套餐总金额( 折扣后金额 + 服务费)
const totalAmount = packageItems.value.reduce((sum, item) => sum + (item.amount || 0), 0);
packageAmount.value = parseFloat(( totalAmount + serviceFee.value) .toFixed(2));
// 套餐总金额 = 各行 折扣后金额之和 + 各行 服务费之和
const totalAmount = packageItems.value.reduce((sum, item) => sum + (item.amount || 0) + (item.serviceFee || 0), 0);
packageAmount.value = parseFloat(totalAmount.toFixed(2));
};
const itemNameRefs = ref([]);
@@ -1890,7 +1875,6 @@ const handleAdd = (row, index) => {
ElMessage.success('删除成功');
getInspectionTypeList();
}).catch(error => {
console.error('删除检验类型失败:', error);
ElMessage.error('删除失败: ' + (error.response?.data?.msg || '未知错误'));
});
} else {
@@ -2230,14 +2214,15 @@ const handleSave = () => {
unit: item.unit,
unitPrice: item.unitPrice,
amount: item.amount,
serviceFee: item.serviceFee,
totalAmount: item.totalAmount ,
serviceFee: item.serviceFee || 0 ,
totalAmount: parseFloat(((item.amount || 0) + (item.serviceFee || 0)).toFixed(2)) ,
origin: item.origin,
createTime: new Date().toISOString(),
updateTime: new Date().toISOString()
}));
// 调用保存API( 暂时使用模拟保存, 后续对接真实API)
// 调用保存API
savePackageData(basicInfo, detailData);
};
@@ -2708,7 +2693,7 @@ onMounted(async () => {
// 1. 启动其他基础数据的加载(这些不需要等待,并行执行即可)
loadParentTypes();
getInspectionTypeList();
getLisGroupList();
// getLisGroupList(); // 改为点击下拉框时懒加载
// 2. 【关键】等待机构列表加载完成
// 等函数执行完成