docs(bug): 诸葛亮分析报告 Bug #722
This commit is contained in:
168
MD/bugs/BUG_722_ANALYSIS.md
Normal file
168
MD/bugs/BUG_722_ANALYSIS.md
Normal file
@@ -0,0 +1,168 @@
|
||||
# Bug #722 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 01:41:53
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 722
|
||||
- **标题**: 【住院医生工作站】住院病历的页面打不开
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
Based on my thorough analysis, here's the complete Bug #722 analysis:
|
||||
|
||||
---
|
||||
|
||||
### 一、Bug 理解
|
||||
|
||||
**Bug 标题**: 【住院医生工作站】住院病历的页面打不开
|
||||
|
||||
**重现步骤**: 登录内科医生1账号 doctor1/123456 → 进入住院管理 → 住院医生增强 → 住院病历
|
||||
|
||||
**期望结果**: 能够正常打开住院病历
|
||||
|
||||
**实际结果**: 页面标签 "住院病历" 已打开,但主内容区域完全空白,无任何表单、列表、患者信息或操作界面加载。无错误提示。
|
||||
|
||||
**附图关键信息**:
|
||||
- 左侧导航菜单"住院病历"已高亮(蓝色)
|
||||
- 顶部已打开"住院病历 ×"标签页
|
||||
- 主内容区域**完全空白**,无任何UI元素
|
||||
- 无弹出错误提示框
|
||||
|
||||
**综合总结**: 用户通过侧边栏菜单点击"住院病历",标签页成功创建,但页面主体内容区域渲染为空白,无任何数据或组件显示。问题可能源于前端路由配置、组件加载失败或数据获取异常。
|
||||
|
||||
---
|
||||
|
||||
### 二、根因分析
|
||||
|
||||
通过代码链路追踪,定位到以下技术问题链:
|
||||
|
||||
#### 根因1(最可能):菜单路由的 `component` 字段路径与实际组件路径不匹配
|
||||
|
||||
**关键代码链路**:
|
||||
- 路由动态加载:`src/store/modules/permission.js` → `loadView()` 函数通过 `import.meta.glob` 匹配组件路径
|
||||
- 匹配逻辑:`dir === view`,其中 `dir = path.split('views/')[1].split('.vue')[0]`
|
||||
- 实际文件:`inpatientDoctor/home/index.vue` → 路径 `inpatientDoctor/home/index`
|
||||
- 如果数据库菜单 `component` 字段为 `inpatientDoctor/home/emr/index`(EMR子组件),则**脱离了 home 页面的患者列表和标签页容器**,EMR 组件独立渲染但无法获取患者上下文
|
||||
|
||||
**验证方法**: 查询数据库 `sys_menu` 表中"住院病历"菜单项的 `component` 字段值
|
||||
|
||||
#### 根因2(补充):EMR 组件无患者上下文时渲染空白
|
||||
|
||||
**关键代码** (`inpatientDoctor/home/emr/index.vue`):
|
||||
```javascript
|
||||
// line 172 - 组件使用 localPatientInfo
|
||||
import {localPatientInfo as patientInfo} from '../store/localPatient.js';
|
||||
|
||||
// line 903 - onMounted 中依赖 patientInfo
|
||||
onMounted(async () => {
|
||||
await queryTemplateTree();
|
||||
if (patientInfo.value && patientInfo.value.patientId && ...) {
|
||||
nextTick(() => { selectDefaultTemplate(); });
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
当 EMR 作为独立路由组件加载时:
|
||||
1. `localPatientInfo` 为空(未通过 home 页面的患者列表选择患者)
|
||||
2. `queryTemplateTree()` 执行后模板树为空(可能因 `primaryMenuEnum=1` 无匹配文书定义)
|
||||
3. `currentComponent` 保持为空字符串,`<component :is="currentComponent" />` 不渲染任何内容
|
||||
4. 整页空白
|
||||
|
||||
#### 根因3(次要):PatientList 组件 API 调用缺少状态过滤
|
||||
|
||||
**关键代码** (`inpatientDoctor/home/index.vue`):
|
||||
```javascript
|
||||
// line 90 - getList 使用 status: 5
|
||||
getPatientList({ status: 5, searchKey: searchData.keyword })
|
||||
```
|
||||
|
||||
**但** `PatientList/patient-list.vue` 内部**独立调用** `getPatientList` **不传 status 参数**,导致返回所有患者(可能为空或不正确)。
|
||||
|
||||
---
|
||||
|
||||
### 三、修复方案
|
||||
|
||||
#### 修复1(核心):确认并修正菜单路由 component 字段
|
||||
|
||||
**检查步骤**:
|
||||
```sql
|
||||
SELECT menu_id, menu_name, component, path
|
||||
FROM sys_menu
|
||||
WHERE menu_name LIKE '%住院病历%';
|
||||
```
|
||||
|
||||
**预期问题**: component 字段值为 `inpatientDoctor/home/emr/index`
|
||||
|
||||
**修复**:
|
||||
```sql
|
||||
UPDATE sys_menu
|
||||
SET component = 'inpatientDoctor/home/index'
|
||||
WHERE menu_name = '住院病历' AND parent_id = (
|
||||
SELECT menu_id FROM sys_menu WHERE menu_name = '住院医生增强'
|
||||
);
|
||||
```
|
||||
|
||||
#### 修复2(防御性):EMR 组件增加患者未选择提示
|
||||
|
||||
**文件**: `healthlink-his-ui/src/views/inpatientDoctor/home/emr/index.vue`
|
||||
|
||||
在 `onMounted` 的 `queryTemplateTree()` 之后增加患者状态检查:
|
||||
|
||||
```javascript
|
||||
onMounted(async () => {
|
||||
await queryTemplateTree();
|
||||
if (
|
||||
patientInfo.value &&
|
||||
patientInfo.value.patientId &&
|
||||
Object.keys(patientInfo.value).length > 0
|
||||
) {
|
||||
nextTick(() => {
|
||||
selectDefaultTemplate();
|
||||
});
|
||||
} else {
|
||||
// 增加:无患者时显示提示而非空白
|
||||
ElMessage.info('请先在左侧选择患者');
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
#### 修复3(可选):PatientList 组件传递 status 参数
|
||||
|
||||
**文件**: `healthlink-his-ui/src/components/PatientList/patient-list.vue`
|
||||
|
||||
确保 `getPatientList` 调用时传入 `status` prop:
|
||||
|
||||
```javascript
|
||||
const getList = () => {
|
||||
queryloading.value = true;
|
||||
getPatientList({
|
||||
status: props.status || 5,
|
||||
searchKey: searchData.keyword
|
||||
}).then(res => {
|
||||
// ...
|
||||
});
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 四、路由决策
|
||||
|
||||
**FIXER**: `zhaoyun`(前端开发)
|
||||
|
||||
**REASON**: 本 Bug 核心是前端路由配置(菜单 component 字段映射)和 EMR 组件渲染问题,涉及前端路由动态加载机制、Vue 组件容器结构、以及患者上下文状态管理,属于纯前端问题链。需要 zhaoyun 验证数据库菜单 component 路径、修复路由映射,并增强 EMR 组件的容错提示。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
Reference in New Issue
Block a user