5.0 KiB
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
borrowFormreactive 增加medicalRecordId: null- 借阅弹窗表单中增加
medicalRecordId的输入方式:- 方案 A(推荐,最简):在"病案号"输入旁增加一个"病案首页ID"输入框(或改为下拉选择,从病案首页列表中选取),绑定
borrowForm.medicalRecordId - 方案 B(更好体验):将"病案号"改为远程搜索下拉(
el-select+remote-method),用户输入病案号后自动查询mr_homepage,选中后自动填充medicalRecordId和patientName
- 方案 A(推荐,最简):在"病案号"输入旁增加一个"病案首页ID"输入框(或改为下拉选择,从病案首页列表中选取),绑定
修复点 2:后端 Controller 增加校验(防御性编程)
文件:healthlink-his-application/.../MrManagementController.java
在 applyBorrowing() 方法中增加校验:
@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 分析决策
⚠️ 修复人员请先验证以上分析是否正确,再执行修复。