309检验项目设置-》套餐管理:查询条件的用户字段下拉选项无内容
310检验项目设置-》套餐管理:点击【编辑】/【查看】套餐设置界面的lis分组字段显示数字 311 检验项目设置-》检验项目:【新增】一条检验项目系统自动在《诊疗目录》增加一条检验收费项目 312检验项目设置-套餐设置:折扣%字段换算公式错误
This commit is contained in:
@@ -146,6 +146,9 @@ public class InspectionPackageController extends BaseController {
|
|||||||
if (inspectionPackage.getIsDisabled() != null) {
|
if (inspectionPackage.getIsDisabled() != null) {
|
||||||
queryWrapper.eq("is_disabled", inspectionPackage.getIsDisabled());
|
queryWrapper.eq("is_disabled", inspectionPackage.getIsDisabled());
|
||||||
}
|
}
|
||||||
|
if (inspectionPackage.getUserId() != null && !inspectionPackage.getUserId().isEmpty()) {
|
||||||
|
queryWrapper.like("user_id", inspectionPackage.getUserId());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 默认只查询未删除的记录
|
// 默认只查询未删除的记录
|
||||||
|
|||||||
@@ -79,7 +79,25 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="filter-item">
|
<div class="filter-item">
|
||||||
<label>用户:</label>
|
<label>用户:</label>
|
||||||
<select></select>
|
<el-select
|
||||||
|
v-model="searchParams.user"
|
||||||
|
placeholder="请选择用户"
|
||||||
|
style="width: 150px;"
|
||||||
|
clearable
|
||||||
|
filterable
|
||||||
|
remote
|
||||||
|
:teleported="true"
|
||||||
|
:remote-method="remoteSearchUser"
|
||||||
|
:loading="userLoading"
|
||||||
|
@focus="handleUserFocus"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="u in userOptions"
|
||||||
|
:key="u.value"
|
||||||
|
:label="u.label"
|
||||||
|
:value="u.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 操作按钮组 -->
|
<!-- 操作按钮组 -->
|
||||||
@@ -261,9 +279,61 @@ const searchParams = ref({
|
|||||||
endDate: getCurrentDate(),
|
endDate: getCurrentDate(),
|
||||||
packageName: '',
|
packageName: '',
|
||||||
packageLevel: '',
|
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加载数据
|
// 从API加载数据
|
||||||
async function loadData() {
|
async function loadData() {
|
||||||
try {
|
try {
|
||||||
@@ -297,6 +367,9 @@ async function loadData() {
|
|||||||
if (searchParams.value.department) {
|
if (searchParams.value.department) {
|
||||||
params.department = searchParams.value.department
|
params.department = searchParams.value.department
|
||||||
}
|
}
|
||||||
|
if (searchParams.value.user) {
|
||||||
|
params.userId = searchParams.value.user
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const response = await listInspectionPackage(params)
|
const response = await listInspectionPackage(params)
|
||||||
@@ -489,9 +562,10 @@ function handleReset() {
|
|||||||
endDate: getCurrentDate(),
|
endDate: getCurrentDate(),
|
||||||
packageName: '',
|
packageName: '',
|
||||||
packageLevel: '',
|
packageLevel: '',
|
||||||
department: ''
|
department: '',
|
||||||
|
user: ''
|
||||||
};
|
};
|
||||||
currentPage.value = 1; // 重置到第一页
|
currentPage.value = 1;
|
||||||
loadData()
|
loadData()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -560,23 +560,30 @@
|
|||||||
<span class="form-label">服务费</span>
|
<span class="form-label">服务费</span>
|
||||||
<el-input :model-value="serviceFee.toFixed(2)" readonly />
|
<el-input :model-value="serviceFee.toFixed(2)" readonly />
|
||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item" v-if="selectedLisGroup || !isViewMode">
|
||||||
<span class="form-label">lis分组</span>
|
<span class="form-label">lis分组</span>
|
||||||
<el-select
|
<template v-if="isViewMode">
|
||||||
v-model="selectedLisGroup"
|
<el-input :model-value="lisGroupList.find(g => g.id === selectedLisGroup)?.groupName || lisGroupList.find(g => g.id === selectedLisGroup)?.lisGroupName || ''" readonly />
|
||||||
placeholder="请选择lis分组"
|
</template>
|
||||||
style="width: 100%;"
|
<template v-else>
|
||||||
:disabled="isViewMode"
|
<el-select
|
||||||
:loading="loadingLisGroup"
|
:model-value="selectedLisGroup || ''"
|
||||||
@visible-change="handleLisGroupVisibleChange"
|
placeholder="请选择lis分组"
|
||||||
>
|
style="width: 100%;"
|
||||||
<el-option
|
:loading="loadingLisGroup"
|
||||||
v-for="group in lisGroupList"
|
clearable
|
||||||
:key="group.id"
|
@change="val => selectedLisGroup = val || undefined"
|
||||||
:label="group.groupName || group.lisGroupName"
|
@visible-change="handleLisGroupVisibleChange"
|
||||||
:value="group.id"
|
@clear="() => selectedLisGroup = undefined"
|
||||||
/>
|
>
|
||||||
</el-select>
|
<el-option
|
||||||
|
v-for="group in lisGroupList"
|
||||||
|
:key="group.id"
|
||||||
|
:label="group.groupName || group.lisGroupName"
|
||||||
|
:value="group.id"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<span class="form-label">血量</span>
|
<span class="form-label">血量</span>
|
||||||
@@ -847,7 +854,7 @@ const route = useRoute();
|
|||||||
// 存储LIS分组数据
|
// 存储LIS分组数据
|
||||||
const lisGroupList = ref([]);
|
const lisGroupList = ref([]);
|
||||||
// 选中的LIS分组
|
// 选中的LIS分组
|
||||||
const selectedLisGroup = ref('');
|
const selectedLisGroup = ref(undefined);
|
||||||
// LIS分组加载状态
|
// LIS分组加载状态
|
||||||
const loadingLisGroup = ref(false);
|
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 {
|
} else {
|
||||||
ElMessage.error('获取LIS分组数据失败');
|
ElMessage.error('获取LIS分组数据失败');
|
||||||
}
|
}
|
||||||
@@ -1552,20 +1559,10 @@ const deletePackageItem = (index) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// 更新项目金额(考虑折扣)
|
// 更新项目金额(金额 = 数量 × 单价,不应用折扣;折扣只影响套餐总金额)
|
||||||
const updateItemAmount = (item) => {
|
const updateItemAmount = (item) => {
|
||||||
// 计算项目原价金额
|
// 金额 = 数量 × 单价
|
||||||
const originalAmount = (item.quantity || 1) * (item.unitPrice || 0.00);
|
item.amount = parseFloat(((item.quantity || 1) * (item.unitPrice || 0.00)).toFixed(2));
|
||||||
|
|
||||||
// 应用折扣到项目金额
|
|
||||||
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 由用户手动输入,不在此处覆盖
|
// 注意:serviceFee 由用户手动输入,不在此处覆盖
|
||||||
|
|
||||||
@@ -1647,15 +1644,9 @@ const cancelEditItem = (index) => {
|
|||||||
|
|
||||||
// 计算套餐金额和服务费
|
// 计算套餐金额和服务费
|
||||||
const calculateAmounts = () => {
|
const calculateAmounts = () => {
|
||||||
// 更新每个项目的折扣金额和总金额
|
// 更新每个项目的金额(金额 = 数量 × 单价,不受折扣影响)和总金额
|
||||||
packageItems.value.forEach(item => {
|
packageItems.value.forEach(item => {
|
||||||
const originalAmount = (item.quantity || 1) * (item.unitPrice || 0.00);
|
item.amount = parseFloat(((item.quantity || 1) * (item.unitPrice || 0.00)).toFixed(2));
|
||||||
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
|
// serviceFee 由用户手动输入,不覆盖;只更新 totalAmount
|
||||||
item.totalAmount = parseFloat(((item.amount) + (item.serviceFee || 0)).toFixed(2));
|
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));
|
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);
|
const rawTotal = packageItems.value.reduce((sum, item) => sum + (item.amount || 0) + (item.serviceFee || 0), 0);
|
||||||
packageAmount.value = parseFloat(totalAmount.toFixed(2));
|
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([]);
|
const itemNameRefs = ref([]);
|
||||||
@@ -2019,7 +2015,7 @@ const saveItem = async (item) => {
|
|||||||
const submitData = {
|
const submitData = {
|
||||||
busNo: item.code.trim(),
|
busNo: item.code.trim(),
|
||||||
name: item.name.trim(),
|
name: item.name.trim(),
|
||||||
categoryCode: inspectionCategoryCode.value,
|
categoryCode: inspectionCategoryCode.value , // '22' 为检验分类的固定字典值,防止字典未加载时为空
|
||||||
inspectionTypeId: item.inspectionTypeId || null,
|
inspectionTypeId: item.inspectionTypeId || null,
|
||||||
feePackageId: item.feePackageId || null,
|
feePackageId: item.feePackageId || null,
|
||||||
subItemId: item.subItemId || null,
|
subItemId: item.subItemId || null,
|
||||||
@@ -2183,7 +2179,7 @@ const handleSave = () => {
|
|||||||
enablePackagePrice: enablePackagePrice.value,
|
enablePackagePrice: enablePackagePrice.value,
|
||||||
packageAmount: packageAmount.value,
|
packageAmount: packageAmount.value,
|
||||||
serviceFee: serviceFee.value,
|
serviceFee: serviceFee.value,
|
||||||
lisGroup: selectedLisGroup.value, // 从下拉框获取
|
lisGroup: selectedLisGroup.value || null,
|
||||||
bloodVolume: bloodVolume.value,
|
bloodVolume: bloodVolume.value,
|
||||||
remarks: remarks.value,
|
remarks: remarks.value,
|
||||||
orgName: (tenantOptions.value.find(t => t.value === selectedTenantId.value)?.label) || userStore.orgName || '', // 卫生机构
|
orgName: (tenantOptions.value.find(t => t.value === selectedTenantId.value)?.label) || userStore.orgName || '', // 卫生机构
|
||||||
@@ -2423,13 +2419,13 @@ const savePackageData = async (basicInfo, detailData) => {
|
|||||||
// 关闭加载提示
|
// 关闭加载提示
|
||||||
loading.close();
|
loading.close();
|
||||||
|
|
||||||
ElMessage.success('保存成功');
|
|
||||||
|
|
||||||
if (isEditMode) {
|
if (isEditMode) {
|
||||||
// 编辑模式:重新加载最新数据,保持在编辑页面
|
// 编辑模式:提示更新成功并跳转到套餐管理页面
|
||||||
loadInspectionPackage(String(packageId));
|
ElMessage.success('更新成功');
|
||||||
|
router.push({ path: '/maintainSystem/Inspection/PackageManagement' });
|
||||||
} else {
|
} else {
|
||||||
// 新增模式:保存成功后重置表单
|
// 新增模式:保存成功后重置表单
|
||||||
|
ElMessage.success('保存成功');
|
||||||
doResetForm();
|
doResetForm();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2498,7 +2494,7 @@ const doResetForm = () => {
|
|||||||
enablePackagePrice.value = true;
|
enablePackagePrice.value = true;
|
||||||
packageAmount.value = 0.00;
|
packageAmount.value = 0.00;
|
||||||
serviceFee.value = 0.00;
|
serviceFee.value = 0.00;
|
||||||
selectedLisGroup.value = '';
|
selectedLisGroup.value = undefined;
|
||||||
bloodVolume.value = '';
|
bloodVolume.value = '';
|
||||||
remarks.value = '';
|
remarks.value = '';
|
||||||
|
|
||||||
@@ -2522,6 +2518,11 @@ const loadInspectionPackage = async (packageId) => {
|
|||||||
background: 'rgba(0, 0, 0, 0.7)',
|
background: 'rgba(0, 0, 0, 0.7)',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 确保 lis分组列表已加载,否则编辑时下拉框无法显示名称
|
||||||
|
if (lisGroupList.value.length === 0) {
|
||||||
|
await getLisGroupList();
|
||||||
|
}
|
||||||
|
|
||||||
// 获取基本信息
|
// 获取基本信息
|
||||||
const basicResponse = await getInspectionPackage(packageId);
|
const basicResponse = await getInspectionPackage(packageId);
|
||||||
if (basicResponse.code !== 200) {
|
if (basicResponse.code !== 200) {
|
||||||
@@ -2551,7 +2552,7 @@ const loadInspectionPackage = async (packageId) => {
|
|||||||
enablePackagePrice.value = basicData.enablePackagePrice !== false;
|
enablePackagePrice.value = basicData.enablePackagePrice !== false;
|
||||||
packageAmount.value = parseFloat(basicData.packageAmount || 0);
|
packageAmount.value = parseFloat(basicData.packageAmount || 0);
|
||||||
serviceFee.value = parseFloat(basicData.serviceFee || 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 || '';
|
bloodVolume.value = basicData.bloodVolume || '';
|
||||||
remarks.value = basicData.remarks || '';
|
remarks.value = basicData.remarks || '';
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user