292 检验项目设置-》套餐设置:检验套餐明细选择项目后,服务费字段=金额字段的值/10
293 检验项目设置-》套餐设置:lis分组字段下拉选项未进行取值 296 检验项目设置-》套餐管理:点击行【编辑】套餐设置界面点击【更新】报错 297 检验项目设置-》套餐管理:点击行【删除】按钮报错提示“删除失败”
This commit is contained in:
@@ -79,6 +79,7 @@ public class InspectionPackageDetail {
|
|||||||
private LocalDateTime updateTime;
|
private LocalDateTime updateTime;
|
||||||
|
|
||||||
/** 删除标志(false-正常,true-删除) */
|
/** 删除标志(false-正常,true-删除) */
|
||||||
|
@TableField(value = "del_flag", fill = FieldFill.INSERT)
|
||||||
@TableLogic(value = "false", delval = "true")
|
@TableLogic(value = "false", delval = "true")
|
||||||
private Boolean delFlag;
|
private Boolean delFlag = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -190,7 +190,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import {computed, onMounted, ref} from 'vue';
|
import {computed, onMounted, ref} from 'vue';
|
||||||
import {useRouter} from 'vue-router';
|
import {useRouter} from 'vue-router';
|
||||||
import {ElMessage} from 'element-plus';
|
import {ElMessage, ElMessageBox} from 'element-plus';
|
||||||
import {getLocationTree} from '@/views/charge/outpatientregistration/components/outpatientregistration';
|
import {getLocationTree} from '@/views/charge/outpatientregistration/components/outpatientregistration';
|
||||||
import {listInspectionPackage, delInspectionPackage} from '@/api/system/inspectionPackage';
|
import {listInspectionPackage, delInspectionPackage} from '@/api/system/inspectionPackage';
|
||||||
import { getTenantPage } from '@/api/system/tenant';
|
import { getTenantPage } from '@/api/system/tenant';
|
||||||
|
|||||||
@@ -562,7 +562,14 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<span class="form-label">lis分组</span>
|
<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
|
<el-option
|
||||||
v-for="group in lisGroupList"
|
v-for="group in lisGroupList"
|
||||||
:key="group.id"
|
:key="group.id"
|
||||||
@@ -841,36 +848,50 @@ const route = useRoute();
|
|||||||
const lisGroupList = ref([]);
|
const lisGroupList = ref([]);
|
||||||
// 选中的LIS分组
|
// 选中的LIS分组
|
||||||
const selectedLisGroup = ref('');
|
const selectedLisGroup = ref('');
|
||||||
|
// LIS分组加载状态
|
||||||
|
const loadingLisGroup = ref(false);
|
||||||
|
|
||||||
|
// 点击展开时才加载LIS分组数据
|
||||||
|
const handleLisGroupVisibleChange = (visible) => {
|
||||||
|
if (visible && lisGroupList.value.length === 0) {
|
||||||
|
getLisGroupList();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// 获取就诊科室数据 - 与门诊挂号页面保持一致,在组件初始化时直接调用
|
// 获取就诊科室数据 - 与门诊挂号页面保持一致,在组件初始化时直接调用
|
||||||
getLocationInfo();
|
getLocationInfo();
|
||||||
|
|
||||||
// 获取LIS分组数据
|
// 获取LIS分组数据
|
||||||
const getLisGroupList = async () => {
|
const getLisGroupList = async () => {
|
||||||
|
loadingLisGroup.value = true;
|
||||||
try {
|
try {
|
||||||
const response = await listLisGroup();
|
const response = await listLisGroup({ pageNum: 1, pageSize: 200 });
|
||||||
if (response.code === 200) {
|
if (response.code === 200) {
|
||||||
// 适配可能的不同响应格式
|
// 适配可能的不同响应格式
|
||||||
let items = [];
|
let items = [];
|
||||||
|
|
||||||
// 检查响应数据
|
// 检查响应数据
|
||||||
if (response.data) {
|
if (response.data) {
|
||||||
// 格式1: {data: {rows: [], total: number}} - 标准分页格式
|
// 格式0: {data: {data: {records: []}}} - 三层嵌套 MyBatisPlus 分页格式(实际后端返回格式)
|
||||||
if (response.data.rows && Array.isArray(response.data.rows)) {
|
if (response.data.data && response.data.data.records && Array.isArray(response.data.data.records)) {
|
||||||
|
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;
|
items = response.data.rows;
|
||||||
}
|
}
|
||||||
// 格式2: {data: []} - 简单数组格式
|
// 格式3: {data: []} - 简单数组格式
|
||||||
else if (Array.isArray(response.data)) {
|
else if (Array.isArray(response.data)) {
|
||||||
items = response.data;
|
items = response.data;
|
||||||
}
|
}
|
||||||
// 格式3: {data: {data: []}} - 双重嵌套格式
|
// 格式4: {data: {data: []}} - 双重嵌套数组格式
|
||||||
else if (response.data.data && Array.isArray(response.data.data)) {
|
else if (response.data.data && Array.isArray(response.data.data)) {
|
||||||
items = 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;
|
lisGroupList.value = items;
|
||||||
@@ -878,8 +899,9 @@ const getLisGroupList = async () => {
|
|||||||
ElMessage.error('获取LIS分组数据失败');
|
ElMessage.error('获取LIS分组数据失败');
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('获取LIS分组数据失败:', error);
|
|
||||||
ElMessage.error('获取LIS分组数据失败');
|
ElMessage.error('获取LIS分组数据失败');
|
||||||
|
} finally {
|
||||||
|
loadingLisGroup.value = false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1545,8 +1567,7 @@ const updateItemAmount = (item) => {
|
|||||||
// 更新项目金额
|
// 更新项目金额
|
||||||
item.amount = parseFloat(discountedAmount.toFixed(2));
|
item.amount = parseFloat(discountedAmount.toFixed(2));
|
||||||
|
|
||||||
// 基于折扣后的金额计算服务费
|
// 注意:serviceFee 由用户手动输入,不在此处覆盖
|
||||||
item.serviceFee = calculateItemServiceFee(item);
|
|
||||||
|
|
||||||
// 更新项目总金额
|
// 更新项目总金额
|
||||||
updateItemTotalAmount(item);
|
updateItemTotalAmount(item);
|
||||||
@@ -1624,63 +1645,27 @@ const cancelEditItem = (index) => {
|
|||||||
calculateAmounts();
|
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 = () => {
|
const calculateAmounts = () => {
|
||||||
// 更新每个项目的折扣金额
|
// 更新每个项目的折扣金额和总金额
|
||||||
packageItems.value.forEach(item => {
|
packageItems.value.forEach(item => {
|
||||||
// 计算项目原价金额
|
|
||||||
const originalAmount = (item.quantity || 1) * (item.unitPrice || 0.00);
|
const originalAmount = (item.quantity || 1) * (item.unitPrice || 0.00);
|
||||||
|
|
||||||
// 应用折扣到项目金额
|
|
||||||
let discountedAmount = originalAmount;
|
let discountedAmount = originalAmount;
|
||||||
if (discount.value && !isNaN(parseFloat(discount.value))) {
|
if (discount.value && !isNaN(parseFloat(discount.value))) {
|
||||||
const discountRate = parseFloat(discount.value) / 100;
|
const discountRate = parseFloat(discount.value) / 100;
|
||||||
discountedAmount = originalAmount * (1 - discountRate);
|
discountedAmount = originalAmount * (1 - discountRate);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新项目金额
|
|
||||||
item.amount = parseFloat(discountedAmount.toFixed(2));
|
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));
|
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);
|
const totalAmount = packageItems.value.reduce((sum, item) => sum + (item.amount || 0) + (item.serviceFee || 0), 0);
|
||||||
packageAmount.value = parseFloat((totalAmount + serviceFee.value).toFixed(2));
|
packageAmount.value = parseFloat(totalAmount.toFixed(2));
|
||||||
};
|
};
|
||||||
|
|
||||||
const itemNameRefs = ref([]);
|
const itemNameRefs = ref([]);
|
||||||
@@ -1890,7 +1875,6 @@ const handleAdd = (row, index) => {
|
|||||||
ElMessage.success('删除成功');
|
ElMessage.success('删除成功');
|
||||||
getInspectionTypeList();
|
getInspectionTypeList();
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
console.error('删除检验类型失败:', error);
|
|
||||||
ElMessage.error('删除失败: ' + (error.response?.data?.msg || '未知错误'));
|
ElMessage.error('删除失败: ' + (error.response?.data?.msg || '未知错误'));
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -2230,14 +2214,15 @@ const handleSave = () => {
|
|||||||
unit: item.unit,
|
unit: item.unit,
|
||||||
unitPrice: item.unitPrice,
|
unitPrice: item.unitPrice,
|
||||||
amount: item.amount,
|
amount: item.amount,
|
||||||
serviceFee: item.serviceFee,
|
serviceFee: item.serviceFee || 0,
|
||||||
totalAmount: item.totalAmount,
|
totalAmount: parseFloat(((item.amount || 0) + (item.serviceFee || 0)).toFixed(2)),
|
||||||
origin: item.origin,
|
origin: item.origin,
|
||||||
createTime: new Date().toISOString(),
|
createTime: new Date().toISOString(),
|
||||||
updateTime: new Date().toISOString()
|
updateTime: new Date().toISOString()
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// 调用保存API(暂时使用模拟保存,后续对接真实API)
|
|
||||||
|
// 调用保存API
|
||||||
savePackageData(basicInfo, detailData);
|
savePackageData(basicInfo, detailData);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2708,7 +2693,7 @@ onMounted(async () => {
|
|||||||
// 1. 启动其他基础数据的加载(这些不需要等待,并行执行即可)
|
// 1. 启动其他基础数据的加载(这些不需要等待,并行执行即可)
|
||||||
loadParentTypes();
|
loadParentTypes();
|
||||||
getInspectionTypeList();
|
getInspectionTypeList();
|
||||||
getLisGroupList();
|
// getLisGroupList(); // 改为点击下拉框时懒加载
|
||||||
|
|
||||||
// 2. 【关键】等待机构列表加载完成
|
// 2. 【关键】等待机构列表加载完成
|
||||||
// 等函数执行完成
|
// 等函数执行完成
|
||||||
|
|||||||
@@ -482,6 +482,8 @@ const organizationOptions = ref([])
|
|||||||
const diagnosisTreatmentList = ref([])
|
const diagnosisTreatmentList = ref([])
|
||||||
// 过滤后的诊疗项目列表(用于搜索)
|
// 过滤后的诊疗项目列表(用于搜索)
|
||||||
const filteredDiagnosisList = ref([])
|
const filteredDiagnosisList = ref([])
|
||||||
|
// lis分组列表
|
||||||
|
const lisGroupOptions = ref([])
|
||||||
// 加载状态
|
// 加载状态
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
|
|
||||||
@@ -738,11 +740,27 @@ onMounted(async () => {
|
|||||||
// 加载卫生机构列表(只获取启用的租户)
|
// 加载卫生机构列表(只获取启用的租户)
|
||||||
await loadOrganizationList()
|
await loadOrganizationList()
|
||||||
|
|
||||||
|
// 加载lis分组列表
|
||||||
|
await loadLisGroupList()
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('✗ 初始化数据失败:', error)
|
console.error('✗ 初始化数据失败:', error)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 加载lis分组列表
|
||||||
|
async function loadLisGroupList() {
|
||||||
|
try {
|
||||||
|
const response = await listLisGroup({ pageNum: 1, pageSize: 100 })
|
||||||
|
if (response && response.code === 200 && response.data) {
|
||||||
|
const items = response.data.records || response.data.rows || (Array.isArray(response.data) ? response.data : [])
|
||||||
|
lisGroupOptions.value = items
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('✗ 获取lis分组列表失败:', error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 加载卫生机构列表(从租户列表获取,只获取启用的)
|
// 加载卫生机构列表(从租户列表获取,只获取启用的)
|
||||||
async function loadOrganizationList() {
|
async function loadOrganizationList() {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user