docs(bug): 诸葛亮分析报告 Bug #731
This commit is contained in:
179
MD/bugs/BUG_731_ANALYSIS.md
Normal file
179
MD/bugs/BUG_731_ANALYSIS.md
Normal file
@@ -0,0 +1,179 @@
|
||||
# Bug #731 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 00:39:06
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 731
|
||||
- **标题**: 【临床医嘱-转科】转科申请成功后主界面未自动刷新,且生成的医嘱名称与科室数据错误
|
||||
- **模块**: 住院医生工作站
|
||||
- **提出人**: 陈显精
|
||||
|
||||
---
|
||||
|
||||
Now I have a complete picture. Here's my analysis:
|
||||
|
||||
---
|
||||
|
||||
## Bug #731 分析报告
|
||||
|
||||
### 一、Bug 理解
|
||||
|
||||
**禅道标题**:【临床医嘱-转科】转科申请成功后主界面未自动刷新,且生成的医嘱名称与科室数据错误
|
||||
|
||||
**重现步骤**:
|
||||
1. 登录住院医生工作站,选择在科患者(如:002,当前科室:呼吸内科病房)
|
||||
2. 进入"临床医嘱"页面,点击【转科】唤起申请弹窗
|
||||
3. 选择"转入科室"为【临床心理科】,"转入病区"为【第二病区】,填写原因后点击【确认】
|
||||
4. 弹窗关闭且提示"转科申请已提交"后,观察医嘱列表状态
|
||||
5. 手动点击【刷新数据】按钮后,核对自动生成的转科医嘱
|
||||
|
||||
**期望结果**:
|
||||
1. 提交成功后自动刷新医嘱列表
|
||||
2. 医嘱名称应为"转科-临床心理科"
|
||||
3. 药房/科室应为患者当前科室"呼吸内科病房"
|
||||
|
||||
**实际结果**:
|
||||
1. 未自动刷新,需手动点击"刷新数据"按钮
|
||||
2. 医嘱名称仅为"转科",缺少转入科室名
|
||||
3. 药房/科室显示为"信息科"(系统管理科室),完全错误
|
||||
|
||||
---
|
||||
|
||||
### 二、根因分析
|
||||
|
||||
本 Bug 包含 **3 个独立问题**,根因分布在前端和后端:
|
||||
|
||||
#### 问题1:未自动刷新
|
||||
|
||||
**根因**:前端 `transferOrganizationDialog.vue` 在成功提交后没有 `emit('success')`,且父组件 `order/index.vue` 没有给该对话框绑定 `@success` 处理函数。
|
||||
|
||||
对比已正常工作的出院对话框 `leaveHospitalDialog.vue`:
|
||||
- 出院对话框有 `emit('success')` 调用
|
||||
- 父组件有 `@success="handleLeaveHospitalSuccess"` → `getListInfo(false)` 刷新列表
|
||||
- 转科对话框两处都缺失
|
||||
|
||||
**涉及文件**:
|
||||
- `healthlink-his-ui/src/views/inpatientDoctor/home/components/order/applicationForm/transferOrganizationDialog.vue`(第149行附近 `submitApplicationForm`)
|
||||
- `healthlink-his-ui/src/views/inpatientDoctor/home/components/order/index.vue`(第673行 `<TransferOrganizationDialog>`)
|
||||
|
||||
#### 问题2:医嘱名称仅为"转科"
|
||||
|
||||
**根因**:后端 `SpecialAdviceAppServiceImpl.saveTransferOrganizationOrders()` 中,`ServiceRequest` 的名称使用了诊疗目录定义的默认名称"转科"(来自 `CommonConstants.BusinessName.TRANSFER_ORGANIZATION = "转科"`),没有拼接转入科室名称。
|
||||
|
||||
**涉及文件**:
|
||||
- `healthlink-his-server/.../regdoctorstation/appservice/impl/SpecialAdviceAppServiceImpl.java`(`saveTransferOrganizationOrders` 方法,约第300行)
|
||||
|
||||
#### 问题3:药房/科室显示为"信息科"
|
||||
|
||||
**根因**:后端 `saveTransferOrganizationOrders()` 中设置了 `serviceRequest.setOrgId(activityAdviceBaseDto.getPositionId())`,其中 `activityAdviceBaseDto` 是从诊疗目录(activity definition)获取的默认数据,其 `positionId` 对应的科室是"信息科"(转科医嘱定义的默认归属科室),而非患者当前所在科室。
|
||||
|
||||
对比出院医嘱 `saveLeaveHospitalOrders()` 使用了 `activityAdviceBaseDto.getPositionId()` 但出院医嘱没有这个问题(因为出院后不需要药房/科室归属)。转科医嘱需要显示的是**患者当前所在的科室**(转出科室)。
|
||||
|
||||
前端 `patientInfo` store 中有 `inHospitalOrgId`(入科科室ID),但后端 `TransferOrganizationParam` 没有传入原科室参数。
|
||||
|
||||
**涉及文件**:
|
||||
- `healthlink-his-server/.../regdoctorstation/appservice/impl/SpecialAdviceAppServiceImpl.java`(`saveTransferOrganizationOrders` 方法)
|
||||
- `healthlink-his-server/.../regdoctorstation/dto/TransferOrganizationParam.java`(缺少 `originalOrganizationId` 字段)
|
||||
- `healthlink-his-ui/.../order/applicationForm/transferOrganizationDialog.vue`(未传入原科室参数)
|
||||
|
||||
---
|
||||
|
||||
### 三、修复方案
|
||||
|
||||
#### 修复1:自动刷新
|
||||
|
||||
**文件**:`transferOrganizationDialog.vue`
|
||||
```diff
|
||||
// 在 <script setup> 中添加 emit 定义
|
||||
+ const emit = defineEmits(['success']);
|
||||
|
||||
// submitApplicationForm 中成功后 emit
|
||||
transferOrganization(form).then((res) => {
|
||||
if (res.code == 200) {
|
||||
proxy.$modal.msgSuccess('转科申请已提交');
|
||||
dialogVisible.value = false;
|
||||
+ emit('success');
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
**文件**:`order/index.vue`
|
||||
```diff
|
||||
<TransferOrganizationDialog
|
||||
ref="transferOrganizationRef"
|
||||
+ @success="handleTransferOrgSuccess"
|
||||
/>
|
||||
|
||||
// 添加回调函数(在 handleTransferOrg 函数附近)
|
||||
+ function handleTransferOrgSuccess() {
|
||||
+ getListInfo(false);
|
||||
+ }
|
||||
```
|
||||
|
||||
#### 修复2:医嘱名称拼接科室
|
||||
|
||||
**文件**:`SpecialAdviceAppServiceImpl.java`(`saveTransferOrganizationOrders` 方法)
|
||||
|
||||
在创建 `ServiceRequest` 后、`save` 前,根据 `targetOrganizationId` 查询转入科室名称并拼接到请求名称中:
|
||||
|
||||
```diff
|
||||
serviceRequest.setRequesterId(practitionerId); // 开方医生
|
||||
serviceRequest.setEncounterId(encounterId); // 就诊id
|
||||
- serviceRequest.setOrgId(activityAdviceBaseDto.getPositionId()); // 执行科室(见修复3)
|
||||
+ // 查询转入科室名称,拼接到医嘱名称
|
||||
+ // 原名称"转科" → "转科-转入的科室名称"
|
||||
serviceRequest.setConditionId(conditionId); // 诊断id
|
||||
serviceRequest.setEncounterDiagnosisId(encounterDiagnosisId); // 就诊诊断id
|
||||
```
|
||||
|
||||
需要在 `ServiceRequest` 上设置名称。具体做法:在 `AdviceManageAppMapper` 或 `SpecialAdviceAppMapper` 中添加查询方法,根据 `targetOrganizationId` 查询科室名称,然后:
|
||||
```java
|
||||
// 设置医嘱显示名称为 "转科-转入科室名"
|
||||
```
|
||||
|
||||
#### 修复3:药房/科室使用患者当前科室
|
||||
|
||||
**文件**:`TransferOrganizationParam.java`
|
||||
```diff
|
||||
+ /** 原科室(患者当前所在科室) */
|
||||
+ @JsonSerialize(using = ToStringSerializer.class)
|
||||
+ private Long originalOrganizationId;
|
||||
```
|
||||
|
||||
**文件**:`transferOrganizationDialog.vue`
|
||||
```diff
|
||||
form.encounterId = patientInfo.value.encounterId
|
||||
form.patientId = patientInfo.value.patientId
|
||||
+ form.originalOrganizationId = patientInfo.value.inHospitalOrgId
|
||||
```
|
||||
|
||||
**文件**:`SpecialAdviceAppServiceImpl.java`
|
||||
```diff
|
||||
- serviceRequest.setOrgId(activityAdviceBaseDto.getPositionId()); // 执行科室(诊疗定义默认)
|
||||
+ serviceRequest.setOrgId(transferOrganizationParam.getOriginalOrganizationId()); // 执行科室(患者当前科室)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 四、路由决策
|
||||
|
||||
**FIXER**: **zhaoyun** + **guanyu**(联合修复)
|
||||
|
||||
**REASON**:
|
||||
- **zhaoyun(赵云/前端)** 负责修复1(自动刷新):修改 `transferOrganizationDialog.vue` 添加 `emit('success')`,修改 `order/index.vue` 添加 `@success` 回调——纯前端改动
|
||||
- **guanyu(关羽/后端)** 负责修复2和修复3(医嘱名称+科室ID):修改 `TransferOrganizationParam.java` 添加 `originalOrganizationId` 字段,修改 `SpecialAdviceAppServiceImpl.java` 的 `saveTransferOrganizationOrders` 方法——纯后端改动
|
||||
|
||||
两个修复互不依赖,可以并行实施。但由于修复3(后端接收 `originalOrganizationId`)需要前端配合传参,**建议由 zhaoyun 先改前端(修复1+修复3前端部分),guanyu 同时改后端(修复2+修复3后端部分),最后联调验证**。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
Reference in New Issue
Block a user