From b03f563df4781fec7b3d2c4f5ea43c07e8b812ee Mon Sep 17 00:00:00 2001
From: duzhongxu <15039018447@163.com>
Date: Tue, 24 Mar 2026 16:42:24 +0800
Subject: [PATCH] =?UTF-8?q?206=20=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=E8=AE=BE?=
=?UTF-8?q?=E7=BD=AE=EF=BC=9A=E5=8D=AB=E7=94=9F=E6=9C=BA=E6=9E=84=E5=AD=97?=
=?UTF-8?q?=E6=AE=B5=E5=8F=96=E5=80=BC=E5=BD=93=E5=89=8D=E7=99=BB=E5=BD=95?=
=?UTF-8?q?=E8=B4=A6=E6=88=B7=E7=9A=84=E7=A7=91=E5=AE=A4=E5=90=8D=E7=A7=B0?=
=?UTF-8?q?=E4=BA=86=20210=20=E6=A3=80=E9=AA=8C=E9=A1=B9=E7=9B=AE=E8=AE=BE?=
=?UTF-8?q?=E7=BD=AE-=E3=80=8B=E5=A5=97=E9=A4=90=E7=AE=A1=E7=90=86?=
=?UTF-8?q?=EF=BC=9A=E5=8D=AB=E7=94=9F=E6=9C=BA=E6=9E=84=E7=AD=9B=E9=80=89?=
=?UTF-8?q?=E5=AD=97=E6=AE=B5=E4=B8=8B=E6=8B=89=E9=80=89=E9=A1=B9=E5=8F=96?=
=?UTF-8?q?=E5=80=BC=E9=94=99=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Inspection/PackageManagement.vue | 199 +++++++++++------
.../views/maintainSystem/Inspection/index.vue | 207 +++++++++++-------
2 files changed, 259 insertions(+), 147 deletions(-)
diff --git a/openhis-ui-vue3/src/views/maintainSystem/Inspection/PackageManagement.vue b/openhis-ui-vue3/src/views/maintainSystem/Inspection/PackageManagement.vue
index 8cf42d0e..fd8c0151 100644
--- a/openhis-ui-vue3/src/views/maintainSystem/Inspection/PackageManagement.vue
+++ b/openhis-ui-vue3/src/views/maintainSystem/Inspection/PackageManagement.vue
@@ -25,9 +25,20 @@
-
+
+
+
@@ -182,9 +193,8 @@ import {useRouter} from 'vue-router';
import {ElMessage} from 'element-plus';
import {getLocationTree} from '@/views/charge/outpatientregistration/components/outpatientregistration';
import {listInspectionPackage} from '@/api/system/inspectionPackage';
+import { getTenantPage } from '@/api/system/tenant';
-console.log('PackageManagement 组件脚本开始执行')
-console.log('listInspectionPackage 函数:', listInspectionPackage)
// 创建路由实例
const router = useRouter();
@@ -199,9 +209,8 @@ const departments = ref([]);
function getDepartmentList() {
console.log('调用getLocationTree API...');
getLocationTree().then((response) => {
- console.log('getLocationTree API完整返回:', response);
- console.log('getLocationTree API数据结构:', JSON.stringify(response.data, null, 2));
-
+
+
// 检查数据结构并转换为适合el-tree-select的格式
if (Array.isArray(response.data)) {
// 直接使用数组数据
@@ -213,13 +222,12 @@ function getDepartmentList() {
// 处理另一种分页格式数据
departments.value = response.data.rows;
} else {
- console.error('API返回数据格式不符合预期:', response.data);
+
departments.value = [];
}
-
- console.log('最终科室数据:', JSON.stringify(departments.value, null, 2));
+
+
}).catch((error) => {
- console.error('获取科室数据失败:', error);
departments.value = [];
});
}
@@ -257,7 +265,7 @@ const searchParams = ref({
// 从API加载数据
async function loadData() {
try {
- console.log('loadData 函数被调用')
+
loading.value = true
// 构建查询参数(匹配后端 InspectionPackage 实体字段)
@@ -266,7 +274,7 @@ async function loadData() {
pageSize: pageSize.value,
packageCategory: '检验套餐' // InspectionPackage 使用 packageCategory 而不是 packageType
}
-
+
// 处理日期范围(后端可能不支持日期范围查询,先保留)
// if (searchParams.value.startDate) {
// params.startDate = searchParams.value.startDate
@@ -274,7 +282,10 @@ async function loadData() {
// if (searchParams.value.endDate) {
// params.endDate = searchParams.value.endDate
// }
-
+ if (selectedTenantId.value) {
+ params.tenantId = selectedTenantId.value;
+ }
+
if (searchParams.value.packageName) {
params.packageName = searchParams.value.packageName
}
@@ -284,62 +295,53 @@ async function loadData() {
if (searchParams.value.department) {
params.department = searchParams.value.department
}
-
- console.log('准备调用 listInspectionPackage API,参数:', params)
+
+
const response = await listInspectionPackage(params)
- console.log('listInspectionPackage API 完整返回:', response)
- console.log('response 类型:', typeof response)
- console.log('response.data 是否存在:', !!response.data)
- console.log('response.rows 是否存在:', !!response.rows)
- console.log('response.total 是否存在:', !!response.total)
-
+
+
if (response) {
// 处理不同的响应格式(优先按若依风格:response.rows / response.total)
let dataList = []
let totalCount = 0
-
+
// 优先检查 response.data(axios 包装的响应)
if (response.data) {
const data = response.data
- console.log('response.data 内容:', data)
- console.log('response.data.rows:', data.rows)
- console.log('response.data.total:', data.total)
-
+
if (Array.isArray(data.rows)) {
// TableDataInfo 格式:{ rows: [], total: 0 }
dataList = data.rows
totalCount = data.total || 0
- console.log('使用 response.data.rows 和 response.data.total, totalCount:', totalCount)
+
} else if (Array.isArray(data.records)) {
// MyBatis Plus 分页格式
dataList = data.records
totalCount = data.total || 0
- console.log('使用 response.data.records 和 response.data.total, totalCount:', totalCount)
+
} else if (Array.isArray(data)) {
// 直接是数组
dataList = data
totalCount = data.length
- console.log('使用 response.data 数组, totalCount:', totalCount)
+
}
} else if (Array.isArray(response.rows)) {
// 直接是 TableDataInfo 格式
dataList = response.rows
totalCount = response.total || 0
- console.log('使用 response.rows 和 response.total, totalCount:', totalCount)
+
} else if (Array.isArray(response)) {
// 直接返回数组
dataList = response
totalCount = response.length
- console.log('使用 response 数组, totalCount:', totalCount)
+
}
-
+
total.value = totalCount
- console.log('设置 total.value =', total.value)
-
+
+
// 转换数据格式以匹配前端显示(InspectionPackage 字段映射)
- console.log('原始数据列表:', dataList)
- console.log('数据列表长度:', dataList.length)
-
+
tableData.value = (dataList || []).map(item => {
const mappedItem = {
id: item.basicInformationId || item.id, // 优先使用 basicInformationId
@@ -362,22 +364,18 @@ async function loadData() {
enabled: item.isDisabled === true ? '否' : '是',
operator: item.createBy || ''
}
- console.log('原始数据项:', item)
- console.log('映射后的数据项:', mappedItem)
+
return mappedItem
})
-
- console.log('最终 tableData.value:', tableData.value)
- console.log('tableData.value 长度:', tableData.value.length)
- console.log('最终 total.value:', total.value)
- console.log('计算的总页数 totalPages:', Math.ceil(total.value / pageSize.value))
+
+
} else {
tableData.value = []
total.value = 0
- console.log('response 为空,重置数据')
+
}
} catch (error) {
- console.error('加载数据失败:', error)
+
ElMessage.error('加载数据失败: ' + (error.message || '未知错误'))
tableData.value = []
total.value = 0
@@ -386,11 +384,70 @@ async function loadData() {
}
}
+const selectedTenantId = ref(null); // 绑定下拉框的值
+const tenantOptions = ref([]); // 存储机构选项
+const loadingTenant = ref(false);
+
+// 获取机构列表函数
+const fetchTenantList = async () => {
+ if (loadingTenant.value) return;
+ loadingTenant.value = true;
+
+ try {
+ const response = await getTenantPage({ pageNum: 1, pageSize: 100 });
+
+ if (response.code !== 200) throw new Error(response.msg || '获取机构列表失败');
+
+ 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 || [];
+ }
+
+ // 过滤启用的机构
+ const activeTenants = (Array.isArray(tenantData) ? tenantData : []).filter(item => item && item.status === "0");
+
+ // 生成下拉选项
+ tenantOptions.value = activeTenants.map(item => ({
+ value: item.id,
+ label: item.tenantName || item.name || item.orgName || String(item.id)
+ }));
+
+ // 默认选中 ID=1 或第一个
+ if (activeTenants.length > 0) {
+ const zhonglianHospital = activeTenants.find(item => item.id === 1);
+ selectedTenantId.value = zhonglianHospital ? 1 : activeTenants[0].id;
+ }
+ } catch (error) {
+ console.error('获取机构列表失败:', error);
+ tenantOptions.value = [];
+ } finally {
+ loadingTenant.value = false;
+ }
+};
// 初始化数据
-onMounted(() => {
- console.log('onMounted 被调用,准备加载数据')
- loadData()
-})
+// 整合后的 onMounted 钩子
+onMounted(async () => {
+ // 1. 加载科室数据
+ getDepartmentList();
+
+ // 2. 加载机构列表 (包含默认选中逻辑)
+ await fetchTenantList();
+
+ // 3. 等待 DOM 更新
+ await nextTick();
+
+ // 4. 防御性检查
+ if (tenantOptions.value.length > 0 && !selectedTenantId.value) {
+ selectedTenantId.value = tenantOptions.value[0].value;
+ }
+
+ // 5. 加载表格数据
+ loadData();
+
+});
// 过滤后的数据 - 现在直接从API获取,这里保留前端过滤作为补充
const filteredData = computed(() => {
@@ -434,7 +491,7 @@ function handleReset() {
// 计算总页数
const totalPages = computed(() => {
const pages = Math.ceil(total.value / pageSize.value)
- console.log('[分页] 计算总页数: total=', total.value, 'pageSize=', pageSize.value, 'totalPages=', pages)
+
return pages > 0 ? pages : 1 // 至少返回1页
})
@@ -448,28 +505,28 @@ function handlePrevPage() {
// 处理分页 - 下一页
function handleNextPage() {
- console.log('[分页] 点击下一页, currentPage:', currentPage.value, 'totalPages:', totalPages.value)
+
if (currentPage.value < totalPages.value) {
currentPage.value++
- console.log('[分页] 跳转到第', currentPage.value, '页')
+
loadData()
} else {
- console.log('[分页] 已经是最后一页,无法继续')
+
}
}
// 处理分页 - 跳转到指定页
function handlePageChange(page) {
- console.log('[分页] 点击页码, page:', page, 'currentPage:', currentPage.value, 'totalPages:', totalPages.value)
+
if (page === '...') {
return // 省略号不可点击
}
if (page >= 1 && page <= totalPages.value && page !== currentPage.value) {
currentPage.value = page
- console.log('[分页] 跳转到第', currentPage.value, '页')
+
loadData()
} else {
- console.log('[分页] 无效的页码或已经是当前页')
+
}
}
@@ -478,15 +535,15 @@ const pageButtons = computed(() => {
const buttons = []
const total = totalPages.value
const current = currentPage.value
-
- console.log('[分页] 计算分页按钮, totalPages:', total, 'currentPage:', current)
-
+
+
+
if (total <= 0) {
// 如果没有数据,至少显示第1页
buttons.push(1)
return buttons
}
-
+
if (total <= 7) {
// 如果总页数小于等于7,显示所有页码
for (let i = 1; i <= total; i++) {
@@ -519,8 +576,8 @@ const pageButtons = computed(() => {
buttons.push(total)
}
}
-
- console.log('[分页] 生成的按钮:', buttons)
+
+
return buttons
})
@@ -582,10 +639,10 @@ function handleDelete(item) {
function handleExport() {
// 获取当前筛选后的数据
const dataToExport = filteredData.value;
-
+
// 转换为CSV格式
const csvContent = convertToCSV(dataToExport);
-
+
// 创建下载链接
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
const url = URL.createObjectURL(blob);
@@ -601,13 +658,13 @@ function handleExport() {
// 将数据转换为CSV格式的函数
function convertToCSV(data) {
if (data.length === 0) return '';
-
+
// 获取表头
const headers = Object.keys(data[0]);
-
+
// 构建CSV内容
let csv = headers.join(',') + '\n';
-
+
// 添加数据行
data.forEach(row => {
const values = headers.map(header => {
@@ -617,7 +674,7 @@ function convertToCSV(data) {
});
csv += values.join(',') + '\n';
});
-
+
return csv;
}
diff --git a/openhis-ui-vue3/src/views/maintainSystem/Inspection/index.vue b/openhis-ui-vue3/src/views/maintainSystem/Inspection/index.vue
index 490ddc3c..69af9051 100644
--- a/openhis-ui-vue3/src/views/maintainSystem/Inspection/index.vue
+++ b/openhis-ui-vue3/src/views/maintainSystem/Inspection/index.vue
@@ -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;
+ }
+ }
+
+
+});
+
+