diff --git a/MD/bugs/BUG_744_ANALYSIS.md b/MD/bugs/BUG_744_ANALYSIS.md new file mode 100644 index 000000000..a458b67a8 --- /dev/null +++ b/MD/bugs/BUG_744_ANALYSIS.md @@ -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 分析决策 + +> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。