6.1 KiB
Bug #759 诸葛亮分析报告
文档类型: Bug分析 分析时间: 2026-06-12 14:36:23 分析模型: mimo-v2.5 (LLM深度分析)
基本信息
- Bug #: 759
- 标题: 【门诊医生工作站】电子处方点击新增处方,报卡在100%卡出屏幕且诊断等下拉框无数据回显
- 模块: 门诊医生工作站
- 提出人: 王栩坤
I now have a thorough understanding of both issues. Let me output the analysis.
一、Bug 理解
用户在门诊医生工作站点击"新增处方"时遇到两个问题:报卡(处方弹窗)宽度超出屏幕,在 100% 缩放下内容溢出无法完整显示;诊断和慢病诊断下拉框没有数据,无法选择。
二、根因分析
问题1:弹窗宽度超出屏幕
- 文件:
healthlink-his-ui/src/views/doctorstation/components/eprescriptiondialog.vue:3 - 根因:
el-dialog的width="1840px"是固定像素值。在 100% 缩放的标准 1920px 屏幕上,减去浏览器边框和滚动条后,弹窗右侧内容会超出视口。在 1440px 等更小的屏幕上问题更严重。 - 弹窗内部使用了多个
<el-col :span="12">并排布局(诊断字段在第二行第三个 col),进一步放大了宽度需求。
问题2:诊断下拉框无数据
- 文件:
healthlink-his-ui/src/views/doctorstation/components/eprescriptiondialog.vue:713-720 - 根因:诊断下拉框使用
remote+:remote-method="getInit"模式,getInit函数有条件守卫if(searchKey)——只有用户输入关键词后才调用 API。弹窗打开时(open()函数)从未调用getInit初始化选项列表,导致diagnosisListOption为空。 - 对比父组件
prescriptionlist.vue:它的诊断下拉使用diagnosisList(由getDiagnosisInfo()→getEncounterDiagnosis()直接填充),所以有数据。但eprescriptiondialog用了不同的变量diagnosisListOption,需要通过getDiagnosisListEleAPI 搜索填充。
问题3:慢病诊断下拉无数据(附加分析)
- 文件:
healthlink-his-ui/src/views/doctorstation/components/eprescriptiondialog.vue(getChronicDisease调用) - 根因:
getChronicDisease调用后端/yb-request/getConditionDefinition(YbController.java:159),该接口要求:- 医保系统(YB)已连接
- 患者有医保信息(
InfoPerson不为空) - 患者有当前有效的慢性病记录(日期在
begndate~enddate范围内)
- 如果患者未参保或医保未连接,后端直接抛
ServiceException,前端 catch 后speDiagnosisList为空。这是业务约束而非代码 bug,但前端缺少无数据时的友好提示。
三、修复方案
修复1:弹窗宽度改为响应式
文件:healthlink-his-ui/src/views/doctorstation/components/eprescriptiondialog.vue:3
- <el-dialog v-model="props.openPrescription" :title="title" width="1840px" teleported destroy-on-close @open="open" @close="close">
+ <el-dialog v-model="props.openPrescription" :title="title" width="calc(100vw - 80px)" teleported destroy-on-close @open="open" @close="close">
同时添加样式限制最大宽度,防止超大屏幕上过宽:
<style scoped>
+ :deep(.el-dialog) {
+ max-width: 1800px;
+ }
修复2:诊断下拉框初始加载数据
文件:healthlink-his-ui/src/views/doctorstation/components/eprescriptiondialog.vue
方案A(推荐):在 open() 中将已有的 diagnosisList(从 getEncounterDiagnosis 获取)同步到 diagnosisListOption,同时保留远程搜索能力:
function open() {
conditionId.value = props.prescriptionData.conditionId;
getDiagnosisInfo();
+ // 初始化诊断下拉选项(从已有就诊诊断填充)
+ getDiagnosisInfo().then(() => {
+ diagnosisListOption.value = [...diagnosisList.value];
+ });
}
但 getDiagnosisInfo 目前没有返回 Promise(.then() 后没有 return),需要微调:
修改 getDiagnosisInfo 函数,让它返回 Promise:
function getDiagnosisInfo() {
- getEncounterDiagnosis(props.patient.encounterId).then((res) => {
+ return getEncounterDiagnosis(props.patient.encounterId).then((res) => {
diagnosisList.value = res.data;
+ diagnosisListOption.value = [...(res.data || [])];
// ... existing filtering logic ...
}).catch((error) => {
console.error('获取诊断信息失败:', error);
});
}
方案B(可选增强):修改 getInit 让空搜索词也能返回全量结果:
function getInit(searchKey) {
- if(searchKey) {
- getDiagnosisListEle(searchKey,infoForm.encounterId).then(res => {
- diagnosisListOption.value = res.data
- })
- }
+ getDiagnosisListEle(searchKey || '', infoForm.encounterId).then(res => {
+ diagnosisListOption.value = res.data || []
+ })
}
后端 getEncounterDiagnosisByEncounterId 已处理空 searchKey(直接返回全部),所以这是安全的。
推荐方案A + B 组合:A 确保弹窗打开时立即有数据,B 确保用户输入空字符时也能刷新。
修复3:慢病诊断无数据时显示提示
文件:healthlink-his-ui/src/views/doctorstation/components/eprescriptiondialog.vue
在 getChronicDisease 的 catch 中添加用户提示:
getChronicDisease({ encounterId: props.patient.encounterId }).then((res) => {
speDiagnosisList.value = res.data || [];
+ if (!res.data || res.data.length === 0) {
+ // 静默:患者可能无慢病,不弹警告
+ }
}).catch((error) => {
+ console.warn('获取慢病诊断失败,可能未连接医保:', error);
speDiagnosisList.value = [];
});
四、路由决策
FIXER: zhaoyun(前端开发)
REASON: 两个问题都在 eprescriptiondialog.vue 前端组件中,修复仅涉及 Vue 模板宽度修改和 JS 数据加载逻辑调整,无后端变更。属于纯前端 UI 修复,适合前端开发角色处理。
路由决策
- 修复 Agent: zhaoyun
- 原因: LLM 分析决策