Files
his/MD/bugs/BUG_744_ANALYSIS.md

5.0 KiB
Raw Permalink Blame History

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,选中后自动填充 medicalRecordIdpatientName

修复点 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 的接口,返回 idpatientName


四、路由决策

FIXER: guanyu(后端)+ zhaoyun(前端)

REASON: 此 Bug 需要前后端同时修改——后端 Controller 需增加 medicalRecordId 校验,前端表单需补充该字段的输入和提交。属于典型的前后端联合修复场景,建议 guanyu 修后端校验 + zhaoyun 修前端表单,两人并行。

优先级:前端修复是关键路径(没有该字段提交永远失败),后端校验是防御性补充。如果只能一个 Agent优先 zhaoyun


路由决策

  • FIXER_ID: guanyu
  • 修复 Agent: guanyu后端
  • 原因: LLM 分析决策

⚠️ 修复人员请先验证以上分析是否正确,再执行修复。