275 276 284 285 286 287 检查项目设置-》套餐管理:卫生机构下拉选项取值错误

检查项目设置-》检查部位:下拉医技类型未做成下拉选项
检查项目设置-》检查方法:费用套餐筛选字段不可以模糊查找选项内容。
检查项目设置-》检查方法:点【导出表格】报错。
检查项目设置-》检查部位:点击【导出表格】报错
检查项目设置-》套餐设置:【套餐设置】改成【套餐管理】好区分
This commit is contained in:
Ranyunqiao
2026-03-27 13:23:44 +08:00
parent 4b92be10b4
commit 112ec2e4a3
3 changed files with 112 additions and 42 deletions

View File

@@ -58,11 +58,14 @@ const service = axios.create({
// 新增:重写响应解析逻辑,大数字自动转字符串(移到这里!) // 新增:重写响应解析逻辑,大数字自动转字符串(移到这里!)
transformResponse: [ transformResponse: [
function (data) { function (data) {
if (!data) return {} // 空数据直接返回,避免解析报错 if (!data) return {}
// 如果是 Blob 或 ArrayBuffer直接返回不进行 JSON 解析
if (data instanceof Blob || data instanceof ArrayBuffer) {
return data
}
try { try {
return jsonBig.parse(data) return jsonBig.parse(data)
} catch (err) { } catch (err) {
// 解析失败时用默认方式,兼容特殊情况
return JSON.parse(data) return JSON.parse(data)
} }
} }

View File

@@ -2,7 +2,7 @@
<div class="package-settings"> <div class="package-settings">
<!-- 顶部操作按钮区 --> <!-- 顶部操作按钮区 -->
<div class="header-actions"> <div class="header-actions">
<el-button type="primary" @click="handlePackageManagement">套餐设置</el-button> <el-button type="primary" @click="handlePackageManagement">套餐管理</el-button>
<el-button type="primary" v-if="!isReadOnly" @click="handleRefresh" :loading="loading">刷新</el-button> <el-button type="primary" v-if="!isReadOnly" @click="handleRefresh" :loading="loading">刷新</el-button>
<el-button v-if="!isReadOnly" type="success" @click="handleSave">保存</el-button> <el-button v-if="!isReadOnly" type="success" @click="handleSave">保存</el-button>
</div> </div>

View File

@@ -40,7 +40,7 @@
<!-- 主内容区域 --> <!-- 主内容区域 -->
<div class="content"> <div class="content">
<!-- 套餐管理和套餐设置 --> <!-- 套餐设置 -->
<template v-if="activeMenu === '套餐设置'"> <template v-if="activeMenu === '套餐设置'">
<!-- 套餐设置界面默认显示 --> <!-- 套餐设置界面默认显示 -->
<PackageSettings <PackageSettings
@@ -553,7 +553,7 @@
<template v-if="item.editing"> <template v-if="item.editing">
<el-select v-model="item.subType" placeholder="选择下级医技类型" style="width: 100%" clearable filterable> <el-select v-model="item.subType" placeholder="选择下级医技类型" style="width: 100%" clearable filterable>
<el-option <el-option
v-for="opt in checkTypeOptionsForMethodPart" v-for="opt in getSubTypeOptions(item.checkType)"
:key="opt.value" :key="opt.value"
:label="opt.label" :label="opt.label"
:value="opt.value" :value="opt.value"
@@ -660,7 +660,7 @@ const menus = ['检查类型', '检查方法', '检查部位', '套餐设置'];
const activeMenu = ref('检查类型'); const activeMenu = ref('检查类型');
// 套餐视图状态: management-套餐管理列表, settings-套餐设置 // 套餐视图状态: management-套餐管理列表, settings-套餐设置
const packageView = ref('management') const packageView = ref('settings')
// 套餐设置模式: add-新增, edit-编辑, view-查看 // 套餐设置模式: add-新增, edit-编辑, view-查看
const packageMode = ref('add') const packageMode = ref('add')
// 当前编辑的套餐数据 // 当前编辑的套餐数据
@@ -719,11 +719,58 @@ const checkTypeOptions = ref([]);
return option ? option.label : value; return option ? option.label : value;
}; };
// 根据字典值获取服务范围标签 // 根据字典值获取服务范围标签
const getServiceScopeLabel = (value) => { const getServiceScopeLabel = (value) => {
const dictItem = serviceScopeDicts.value.find(item => item.dictValue === value); const dictItem = serviceScopeDicts.value.find(item => item.dictValue === value);
return dictItem ? dictItem.dictLabel : value; return dictItem ? dictItem.dictLabel : value;
}; };
// 根据检查类型获取下级医技类型的选项
const getSubTypeOptions = (checkTypeValue) => {
// 根据需求:
// 1. 拿着检查部位页面中的检查类型字段的值去检查类型页面
// 2. 找到其对应真正的检查类型字段的值
// 3. 再看有哪几行检查类型是一样的
// 4. 再把这几行的名称返回给下级医技选项
// 5. 只有选择部位打勾的才返回
if (!checkTypeValue) {
// 如果没有选择检查类型,返回空数组
return [];
}
// 从检查类型数据中查找匹配的记录
// 首先找到当前选中的检查类型对应的完整记录
const currentCheckTypeRecord = checkTypeData.find(record => record.name === checkTypeValue);
if (!currentCheckTypeRecord) {
// 如果找不到对应的记录,返回空数组
return [];
}
// 获取当前记录的"检查类型"字段值
const targetTypeValue = currentCheckTypeRecord.type;
if (!targetTypeValue) {
// 如果没有检查类型值,返回空数组
return [];
}
// 在检查类型数据中查找所有检查类型字段值相同且选择部位打勾的记录
const matchedRecords = checkTypeData.filter(record =>
record.type === targetTypeValue && record.selected
);
// 将匹配记录的名称作为选项返回
return matchedRecords.map(record => ({
value: record.name,
label: record.name,
id: record.id,
code: record.code
}));
};
const checkParts = ref([]); const checkParts = ref([]);
const checkPackages = ref([]); const checkPackages = ref([]);
// 套餐下拉选项的过滤结果 // 套餐下拉选项的过滤结果
@@ -1815,45 +1862,65 @@ function handleExport() {
console.log('导出表格:', activeMenu.value); console.log('导出表格:', activeMenu.value);
if (activeMenu.value === '检查方法') { if (activeMenu.value === '检查方法') {
// 调用检查方法导出API // 使用封装好的API方法
exportCheckMethod(searchParamsMethod).then(blobData => { import('@/api/system/checkType').then(apiModule => {
// 直接使用blobData创建下载链接因为response拦截器已经返回了res.data apiModule.exportCheckMethod(searchParamsMethod)
const blob = new Blob([blobData], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); .then(data => {
const url = window.URL.createObjectURL(blob); const isBlob = data && data.type && data.type.indexOf('application/json') === -1;
if (isBlob) {
const url = window.URL.createObjectURL(data);
const link = document.createElement('a'); const link = document.createElement('a');
link.href = url; link.href = url;
// 设置文件名
link.setAttribute('download', `检查方法数据_${new Date().toISOString().slice(0, 10)}.xlsx`); link.setAttribute('download', `检查方法数据_${new Date().toISOString().slice(0, 10)}.xlsx`);
document.body.appendChild(link); document.body.appendChild(link);
link.click(); link.click();
// 清理
document.body.removeChild(link); document.body.removeChild(link);
window.URL.revokeObjectURL(url); window.URL.revokeObjectURL(url);
ElMessage.success('检查方法数据导出成功'); ElMessage.success('检查方法数据导出成功');
}).catch(error => { } else {
data.text().then(text => {
const errorObj = JSON.parse(text);
ElMessage.error(errorObj.msg || errorObj.message || '导出检查方法数据失败');
}).catch(() => {
ElMessage.error('导出检查方法数据失败');
});
}
})
.catch(error => {
console.error('导出检查方法数据失败:', error); console.error('导出检查方法数据失败:', error);
ElMessage.error('导出检查方法数据失败'); ElMessage.error('导出检查方法数据失败');
}); });
});
} else if (activeMenu.value === '检查部位') { } else if (activeMenu.value === '检查部位') {
// 调用检查部位导出API // 使用封装好的API方法
exportCheckPart(searchParamsPart).then(blobData => { import('@/api/system/checkType').then(apiModule => {
// 直接使用blobData创建下载链接因为response拦截器已经返回了res.data apiModule.exportCheckPart(searchParamsPart)
const blob = new Blob([blobData], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); .then(data => {
const url = window.URL.createObjectURL(blob); const isBlob = data && data.type && data.type.indexOf('application/json') === -1;
if (isBlob) {
const url = window.URL.createObjectURL(data);
const link = document.createElement('a'); const link = document.createElement('a');
link.href = url; link.href = url;
// 设置文件名
link.setAttribute('download', `检查部位数据_${new Date().toISOString().slice(0, 10)}.xlsx`); link.setAttribute('download', `检查部位数据_${new Date().toISOString().slice(0, 10)}.xlsx`);
document.body.appendChild(link); document.body.appendChild(link);
link.click(); link.click();
// 清理
document.body.removeChild(link); document.body.removeChild(link);
window.URL.revokeObjectURL(url); window.URL.revokeObjectURL(url);
ElMessage.success('检查部位数据导出成功'); ElMessage.success('检查部位数据导出成功');
}).catch(error => { } else {
data.text().then(text => {
const errorObj = JSON.parse(text);
ElMessage.error(errorObj.msg || errorObj.message || '导出检查部位数据失败');
}).catch(() => {
ElMessage.error('导出检查部位数据失败');
});
}
})
.catch(error => {
console.error('导出检查部位数据失败:', error); console.error('导出检查部位数据失败:', error);
ElMessage.error('导出检查部位数据失败'); ElMessage.error('导出检查部位数据失败');
}); });
});
} else { } else {
// 其他菜单的导出逻辑可以在这里扩展 // 其他菜单的导出逻辑可以在这里扩展
ElMessage.warning('该功能尚未实现'); ElMessage.warning('该功能尚未实现');