检验项目设置-》套餐设置:卫生机构字段取值当前登录账户的科室名称了
210 检验项目设置-》套餐管理:卫生机构筛选字段下拉选项取值错误
This commit is contained in:
2026-03-24 16:42:24 +08:00
parent 22d73e5b44
commit b03f563df4
2 changed files with 259 additions and 147 deletions

View File

@@ -789,6 +789,7 @@ import {
listInspectionPackageDetails,
saveInspectionPackageDetails
} from '@/api/system/inspectionPackage';
import { getTenantPage } from '@/api/system/tenant';
import {deptTreeSelect} from '@/api/system/user';
// 获取当前登录用户信息
@@ -1053,70 +1054,7 @@ const selectedTenantId = ref(null); // 存储当前选中的租户ID
// --- 新增:控制租户列表加载状态 ---
const loadingTenant = ref(false); // 控制下拉框的加载状态
const fetchTenantList = async () => {
if (loadingTenant.value) return; // 防止重复请求
loadingTenant.value = true;
try {
const response = await request({
url: '/system/tenant/page',
method: 'get',
params: {
pageNum: 1,
pageSize: 100
}
});
if (response.code === 200) {
let tenantData = [];
// --- 关键修改:优先检查 records 字段 ---
if (response.data && response.data.records && Array.isArray(response.data.records)) {
tenantData = response.data.records;
} else if (response.data && response.data.rows && Array.isArray(response.data.rows)) {
// 兼容旧的 rows 格式
tenantData = response.data.rows;
} else if (response.data && Array.isArray(response.data)) {
// 兼容最简单的数组格式
tenantData = response.data;
} else {
tenantData = [];
}
// 格式化数据以适应 el-select
tenantOptions.value = tenantData.map(item => ({
value: item.id,
label: item.tenantName || item.name || item.orgName || String(item.id) || '未知机构'
}));
// 如果仍未设置默认值且列表不为空,选择第一个
if (!selectedTenantId.value && tenantOptions.value.length > 0) {
selectedTenantId.value = tenantOptions.value[0].value;
}
} else {
ElMessage.error(response.msg || '获取机构列表失败,请联系管理员');
tenantOptions.value = [];
}
} catch (error) {
ElMessage.error('网络异常或数据解析错误,请检查控制台日志');
tenantOptions.value = [];
} finally {
// 确保无论成功还是失败都停止加载状态
loadingTenant.value = false;
}
};
// 展开时若列表为空则加载数据
const handleTenantVisibleChange = async (visible) => {
if (visible && tenantOptions.value.length === 0) { // 仅在展开且列表为空时加载
@@ -1301,9 +1239,7 @@ const handleEditRow = (row) => {
}
};
onMounted(() => {
loadParentTypes();
});
// 样本类型数据
@@ -2358,6 +2294,95 @@ const handleSave = () => {
savePackageData(basicInfo, detailData);
};
//定义表单数据
const form = ref({
tenantId: undefined, // 卫生机构 ID
packageType: '检验套餐', // 套餐类别
packageLevel: '', // 套餐级别
packageName: '', // 套餐名称
amount: 0.00, // 套餐金额
discount: '', // 折扣 %
creator: '超级管理员', // 制单人
remark: '', // 备注
isDisabled: false, // 是否停用 (false=启用)
showPackageName: true, // 显示套餐名
generateServiceFee: true, // 生成服务费
enablePackagePrice: true, // 套餐价格启用
serviceFee: 0.00, // 服务费
lisGroup: '', // lis分组
bloodVolume: '' // 血量
});
const fetchTenantList = async () => {
if (loadingTenant.value) return;
loadingTenant.value = true;
try {
const response = await getTenantPage({ pageNum: 1, pageSize: 100 });
// 1. 检查业务状态码
if (response.code !== 200) {
throw new Error(response.msg || '获取机构列表失败');
}
// 2. 安全提取数据列表
let tenantData = [];
const data = response.data;
if (Array.isArray(data)) {
tenantData = data;
} else if (data && typeof data === 'object') {
tenantData = data.records || data.rows || data.list || [];
}
if (!Array.isArray(tenantData)) {
tenantData = [];
}
// 3. 过滤启用的机构 (status === "0")
// 根据您提供的JSON这里会成功筛选出 ID=1 的 "中联医院"
const activeTenants = tenantData.filter(item => item && item.status === "0");
// 4. 生成下拉选项
tenantOptions.value = activeTenants.map(item => ({
value: item.id,
label: item.tenantName || item.name || item.orgName || String(item.id)
}));
// 5. 默认选中逻辑
if (activeTenants.length > 0) {
// 优先选中 ID 为 1 的 "中联医院"
const zhonglianHospital = activeTenants.find(item => item.id === 1);
if (zhonglianHospital) {
form.value.tenantId = 1;
} else {
// 增加 userInfoStore 的存在性检查
// 防止 store 未初始化导致报错
const userStore = userInfoStore; // 获取 store 引用
if (userStore && userStore.tenantId) {
const currentTenant = activeTenants.find(item => item.id === userStore.tenantId);
form.value.tenantId = currentTenant ? currentTenant.id : activeTenants[0].id;
} else {
// 如果没有用户信息或 store 未就绪,直接选第一个
form.value.tenantId = activeTenants[0].id;
}
}
} else {
form.value.tenantId = undefined;
}
} catch (error) {
// 打印详细错误,方便调试
ElMessage.error('获取机构列表失败:' + (error.message || '未知错误'));
tenantOptions.value = [];
} finally {
loadingTenant.value = false;
}
};
// 保存套餐数据到数据库
const savePackageData = async (basicInfo, detailData) => {
// 显示保存进度
@@ -2580,16 +2605,7 @@ const refreshPage = () => {
// loadPackageItemsFromAPI();
};
// 页面加载时获取数据
onMounted(() => {
getInspectionTypeList();
getLisGroupList();
// // 加载检验套餐明细项目
// loadPackageItemsFromAPI();
// // 初始化计算套餐金额和服务费
// calculateAmounts();
fetchTenantList(); // 页面加载时获取租户列表
});
// 监听检验分类代码,当字典数据加载完成后加载检验项目数据
@@ -2664,6 +2680,45 @@ const unitOptions = ref([
{ value: '次', label: '次' },
{ value: '天', label: '天' }
]);
onMounted(async () => {
// 1. 启动其他基础数据的加载(这些不需要等待,并行执行即可)
loadParentTypes();
getInspectionTypeList();
getLisGroupList();
// 2. 【关键】等待机构列表加载完成
// 等函数执行完成
await fetchTenantList();
// 3. 等待 Vue 完成下一轮的 DOM 更新
await nextTick();
// 4. 【核心逻辑】强制默认选中“中联医院” (ID = 1)
// 检查下拉列表中是否存在 value 为 1 的选项
const hasZhonglian = tenantOptions.value.some(item => item.value === 1);
if (hasZhonglian) {
// 直接赋值给模板中 v-model 绑定的变量
selectedTenantId.value = 1;
// 💡 防御性编程:防止因渲染延迟导致界面未刷新
// 如果赋值后界面还没变100毫秒后再强制赋一次值
setTimeout(() => {
if (selectedTenantId.value !== 1) {
selectedTenantId.value = 1;
}
}, 100);
} else {
// (可选) 如果没有中联医院,且列表不为空,默认选中第一个
if (tenantOptions.value.length > 0 && !selectedTenantId.value) {
selectedTenantId.value = tenantOptions.value[0].value;
}
}
});
</script>
<style>