Files
his/MD/bugs/BUG_744_ANALYSIS.md

110 lines
5.0 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 #744 诸葛亮分析报告
> **文档类型**: Bug分析
> **分析时间**: 2026-06-12 22:59:18
> **分析模型**: mimo-v2.5 (LLM深度分析)
---
## 基本信息
- **Bug #**: 744
- **标题**: 【病案管理】申请借阅的报卡出现报错Error updating database. Cause: org.postgresql.util.PSQLException
- **模块**: 疾病报告管理
- **提出人**: 王栩坤
---
分析完成。以下是完整的 Bug 分析报告。
---
### 一、Bug 理解
**禅道 Bug #744 原文:**
- **标题**【病案管理】申请借阅的报卡出现报错Error updating database
- **重现步骤**登录内科医生1的账号doctor1 密码123456 → 进入病案管理 → 打开申请借阅
- **结果**:出现报错 `ERROR: null value in column "medical_record_id" of relation "mr_borrowing" violates not-null constraint`
- **期望**:能够正常操作申请借阅功能,不会出现爆红报错
**附图关键信息:**
- 页面标题"申请借阅",弹窗表单有字段:病案号(`111`)、患者(空)、借阅人(`1111`)、借阅科室(`111`)、借阅原因(`1111`)
- 红色错误条显示 `INSERT INTO mr_borrowing (id, patient_name, mr_number, borrower_name, borrower_dept, borrow_reason, ...)`**注意 INSERT 语句中根本没有 `medical_record_id` 字段**
- `Failing row contains (2064902426836570114, null, , 111, 1111, ...)``medical_record_id` 位置为 null
**综合总结:** 用户在"病案管理 → 申请借阅"页面填写表单并提交时,系统向 `mr_borrowing` 表插入记录失败,因为 `medical_record_id` 字段NOT NULL 约束)未被赋值。这是一个前后端都遗漏了该字段的缺陷——前端表单没有这个输入项,后端 Controller 也没有自动填充。
---
### 二、根因分析
**直接原因:** `mr_borrowing` 表的 `medical_record_id` 列有 `NOT NULL` 约束,但 INSERT 语句中该字段为 null。
**代码层面根因(两处缺失):**
| 层 | 文件 | 问题 |
|---|---|---|
| **前端** | `healthlink-his-ui/src/views/mrmanagement/index.vue` | `borrowForm` 只有 `mrNumber, patientName, borrowerName, borrowerDept, borrowReason`**没有 `medicalRecordId` 字段**。表单提交时不会携带此值 |
| **后端** | `healthlink-his-application/.../MrManagementController.java` | `applyBorrowing()` 方法直接将前端传来的 `MrBorrowing` 对象 save**没有校验或设置 `medicalRecordId`** |
**数据库约束确认:** `V18__emr_mr_nursing_fhir.sql` 中建表语句 `medical_record_id BIGINT NOT NULL`
**`medicalRecordId` 的含义:** 它是 `mr_homepage` 表的 `id`(病案首页记录的主键),是 `mr_borrowing` 表的外键,用于关联具体哪份病案被借阅。
---
### 三、修复方案
#### 修复点 1前端表单补充 `medicalRecordId` 字段(主要修复)
**文件**`healthlink-his-ui/src/views/mrmanagement/index.vue`
1. `borrowForm` reactive 增加 `medicalRecordId: null`
2. 借阅弹窗表单中增加 `medicalRecordId` 的输入方式:
- **方案 A推荐最简**:在"病案号"输入旁增加一个"病案首页ID"输入框(或改为下拉选择,从病案首页列表中选取),绑定 `borrowForm.medicalRecordId`
- **方案 B更好体验**:将"病案号"改为远程搜索下拉(`el-select` + `remote-method`),用户输入病案号后自动查询 `mr_homepage`,选中后自动填充 `medicalRecordId``patientName`
#### 修复点 2后端 Controller 增加校验(防御性编程)
**文件**`healthlink-his-application/.../MrManagementController.java`
`applyBorrowing()` 方法中增加校验:
```java
@PostMapping("/borrowing/apply")
@Transactional(rollbackFor = Exception.class)
public R<?> applyBorrowing(@RequestBody MrBorrowing borrowing) {
// 新增:校验必填字段
if (borrowing.getMedicalRecordId() == null) {
return R.fail("病案首页ID不能为空");
}
borrowing.setStatus(0);
borrowing.setBorrowDate(new Date());
borrowing.setCreateTime(new Date());
borrowingService.save(borrowing);
return R.ok(borrowing);
}
```
#### 修复点 3可选增强后端提供根据病案号查询的接口
如果前端要实现"输入病案号自动查询填充",需要后端提供根据 `mr_number` 查询 `mr_homepage` 的接口,返回 `id``patientName`
---
### 四、路由决策
**FIXER**: `guanyu`(后端)+ `zhaoyun`(前端)
**REASON**: 此 Bug 需要前后端同时修改——后端 Controller 需增加 `medicalRecordId` 校验,前端表单需补充该字段的输入和提交。属于典型的前后端联合修复场景,建议 `guanyu` 修后端校验 + `zhaoyun` 修前端表单,两人并行。
**优先级**:前端修复是关键路径(没有该字段提交永远失败),后端校验是防御性补充。如果只能一个 Agent优先 `zhaoyun`
---
## 路由决策
- **FIXER_ID**: guanyu
- **修复 Agent**: guanyu后端
- **原因**: LLM 分析决策
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。