Files
his/MD/bugs/BUG_731_ANALYSIS.md

180 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 分析决策
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。