140 lines
6.7 KiB
Markdown
140 lines
6.7 KiB
Markdown
# Bug #729 诸葛亮分析报告
|
||
|
||
> **文档类型**: Bug分析
|
||
> **分析时间**: 2026-06-13 00:53:38
|
||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||
|
||
---
|
||
|
||
## 基本信息
|
||
- **Bug #**: 729
|
||
- **标题**: 【住院护士站-入出转管理】待转科列表“入院病区/入院病房”下拉筛选项无数据,未正确读取转科申请数据
|
||
- **模块**: 病区护士工作站
|
||
- **提出人**: 陈显精
|
||
|
||
---
|
||
|
||
Now I have a complete understanding of the issue. Let me finalize my analysis.
|
||
|
||
### 一、Bug 理解
|
||
|
||
**禅道 Bug #729 原文:**
|
||
- **标题**:【住院护士站-入出转管理】待转科列表"入院病区/入院病房"下拉筛选项无数据,未正确读取转科申请数据
|
||
- **重现步骤**:1. 临床医生端为患者提交转科申请(转入科室:临床心理科,转入病区:第二病区);2. 登录住院护士站,进入入出转管理的"转出"页面;3. 点击"入院病区"或"入院病房"下拉框
|
||
- **期望结果**:「入院病区」应去重读取所有"待转科"患者的【转科申请-转入病区】字段值;「入院病房」应去重读取所有"待转科"患者的【转科申请-转入科室/病房】字段值
|
||
|
||
**图片关键信息**:图2中"入院病区"和"入院病房"下拉框展开后为空白,无任何选项数据,红色文字明确标注"应该取值当前有待转科患者的转入科室和转入病区的数据供护士筛选用"。
|
||
|
||
**综合总结**:护士在"转出"页面使用下拉框筛选待转科患者时,下拉框为空。原因是当前代码调用 `getPractitionerWard()` 获取的是当前登录护士被分配的病区列表,而不是从 `doc_order_process` 表中读取待转科患者的转入病区/转入科室数据。正确的数据源应该是所有 encounter_status=6(待转科)的患者的转科申请中的 targetLocationId 和 targetOrganizationId。
|
||
|
||
---
|
||
|
||
### 二、根因分析
|
||
|
||
**核心问题**:前端 `transferOut.vue` 的 `initData()` 函数调用 `getPractitionerWard()`(接口 `/app-common/practitioner-ward`)获取下拉数据,这个接口返回的是当前护士被分配的病区列表,与"待转科患者的转入病区/转入科室"无关。
|
||
|
||
**数据链路分析**:
|
||
1. 医生提交转科申请时,`SpecialAdviceAppServiceImpl.saveTransferOrders()` 创建 `doc_order_process` 记录,其中:
|
||
- `target_location_id` = 转入病区(对应 `adm_location` 表)
|
||
- `target_organization_id` = 转入科室(对应 `adm_organization` 表)
|
||
- `encounter_id` = 关联就诊记录
|
||
2. 患者的 `adm_encounter.status_enum = 6`(PENDING_TRANSFER)
|
||
3. 当前前端下拉框应该查询:`doc_order_process` JOIN `adm_encounter`(status=6),分别获取 DISTINCT `target_location_id` 和 `target_organization_id` 对应的名称
|
||
|
||
**涉及文件**:
|
||
- `healthlink-his-ui/src/views/inpatientNurse/inOut/components/transferOut.vue` — `initData()` 函数调用了错误的 API
|
||
- `healthlink-his-server/.../inhospitalnursestation/controller/ATDManageController.java` — 需要新增端点
|
||
- `healthlink-his-server/.../inhospitalnursestation/appservice/impl/ATDManageAppServiceImpl.java` — 需要新增方法
|
||
- `healthlink-his-server/.../inhospitalnursestation/mapper/ATDManageAppMapper.java` — 需要新增查询
|
||
- `healthlink-his-server/.../resources/mapper/inhospitalnursestation/ATDManageAppMapper.xml` — 需要新增 SQL
|
||
|
||
---
|
||
|
||
### 三、修复方案
|
||
|
||
**后端(3个文件修改 + 1个新增查询):**
|
||
|
||
1. **`ATDManageAppMapper.java`** — 新增方法:
|
||
```java
|
||
List<Map<String, Object>> selectTransferWardOptions(Long currentUserOrgId);
|
||
List<Map<String, Object>> selectTransferOrganizationOptions(Long currentUserOrgId);
|
||
```
|
||
或合并为一个方法返回两个列表。
|
||
|
||
2. **`ATDManageAppMapper.xml`** — 新增 SQL:
|
||
```sql
|
||
<!-- 获取待转科患者的转入病区去重列表 -->
|
||
<select id="selectTransferWardOptions" resultType="map">
|
||
SELECT DISTINCT al.id AS id, al.name AS name
|
||
FROM doc_order_process dop
|
||
JOIN adm_encounter ae ON ae.id = dop.encounter_id AND ae.delete_flag = '0'
|
||
JOIN adm_location al ON al.id = dop.target_location_id AND al.delete_flag = '0'
|
||
WHERE ae.status_enum = 6
|
||
AND ae.class_enum = 1 -- 住院
|
||
AND ae.organization_id = #{currentUserOrgId}
|
||
AND ae.delete_flag = '0'
|
||
AND dop.delete_flag = '0'
|
||
</select>
|
||
|
||
<!-- 获取待转科患者的转入科室去重列表 -->
|
||
<select id="selectTransferOrganizationOptions" resultType="map">
|
||
SELECT DISTINCT ao.id AS id, ao.name AS name
|
||
FROM doc_order_process dop
|
||
JOIN adm_encounter ae ON ae.id = dop.encounter_id AND ae.delete_flag = '0'
|
||
JOIN adm_organization ao ON ao.id = dop.target_organization_id AND ao.delete_flag = '0'
|
||
WHERE ae.status_enum = 6
|
||
AND ae.class_enum = 1
|
||
AND ae.organization_id = #{currentUserOrgId}
|
||
AND ae.delete_flag = '0'
|
||
AND dop.delete_flag = '0'
|
||
</select>
|
||
```
|
||
|
||
3. **`IATDManageAppService.java` / `ATDManageAppServiceImpl.java`** — 新增方法:
|
||
```java
|
||
R<?> getTransferFilterOptions();
|
||
```
|
||
实现中调用 mapper 获取两个去重列表,返回 `{ wardList: [...], organizationList: [...] }`。
|
||
|
||
4. **`ATDManageController.java`** — 新增端点:
|
||
```java
|
||
@GetMapping("/transfer-filter-options")
|
||
public R<?> getTransferFilterOptions() {
|
||
return atdManageAppService.getTransferFilterOptions();
|
||
}
|
||
```
|
||
|
||
**前端(2个文件修改):**
|
||
|
||
5. **`api.js`** — 新增 API:
|
||
```javascript
|
||
export function getTransferFilterOptions() {
|
||
return request({
|
||
url: '/nurse-station/atd-manage/transfer-filter-options',
|
||
method: 'get',
|
||
});
|
||
}
|
||
```
|
||
|
||
6. **`transferOut.vue`** — 修改 `initData()` 函数:
|
||
- 将 `getPractitionerWard()` 替换为 `getTransferFilterOptions()`
|
||
- 用返回的 `wardList` 填充 `initInfoOptions.value.wardListOptions`
|
||
- 用返回的 `organizationList` 填充 `wardLocationList`(或新建变量 `organizationListOptions`)
|
||
- 当选择"入院病区"时,应根据选择的 wardId 过滤对应的转入科室(可选优化,也可独立显示两个下拉框)
|
||
|
||
---
|
||
|
||
### 四、路由决策
|
||
|
||
**FIXER: zhaoyun**
|
||
**REASON**: 这是一个纯前端+后端接口对接问题,涉及下拉框数据源替换。前端 `transferOut.vue` 是主体修改点(替换 API 调用和数据绑定),后端只需新增一个查询端点。赵云负责前端开发,且修改涉及 Vue 组件交互逻辑,由赵云主导、配合荀彧(新增 mapper SQL)最为合适。
|
||
|
||
---
|
||
|
||
## 路由决策
|
||
- **FIXER_ID**: zhaoyun
|
||
- **修复 Agent**: zhaoyun(前端)
|
||
- **原因**: LLM 分析决策
|
||
|
||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|