docs(bug): 诸葛亮分析报告 Bug #744
This commit is contained in:
109
MD/bugs/BUG_744_ANALYSIS.md
Normal file
109
MD/bugs/BUG_744_ANALYSIS.md
Normal file
@@ -0,0 +1,109 @@
|
||||
# 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 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
Reference in New Issue
Block a user