docs(bug): 诸葛亮分析报告 Bug #731

This commit is contained in:
2026-06-13 00:39:06 +08:00
parent e21cc32634
commit f06950ba0f

179
MD/bugs/BUG_731_ANALYSIS.md Normal file
View 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 分析决策
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。