# Bug #721 诸葛亮分析报告 > **文档类型**: Bug分析 > **分析时间**: 2026-06-13 01:44:34 > **分析模型**: mimo-v2.5 (LLM深度分析) --- ## 基本信息 - **Bug #**: 721 - **标题**: 【影像管理】点击新增检查出现sql语句报错 - **模块**: 住院医生工作站 - **提出人**: 王栩坤 --- 已定位根因,分析完成。 --- ### 一、Bug 理解 **禅道原文:** > **Bug #721**:【影像管理】点击新增检查出现sql语句报错 > > **重现步骤**:登录内科医生1的账号:doctor1 密码:123456进入影像管理→点击新增检查→填写新增影像检查记录→确认 → 出现报错 > > **期望结果**:能够正常的新增成功不会出现报错 **附图关键信息:** - 错误信息:`ERROR: null value in column "patient_id" of relation "radiology_image_comparison" violates not-null constraint` - 失败的 INSERT SQL:`INSERT INTO radiology_image_comparison (id, examination_type, examination_name, body_part, finding_text, conclusion_text, doctor_name, create_by, create_time, tenant_id)` — 注意 **`patient_id` 列根本不在 INSERT 语句中**,说明实体的 `patientId` 字段始终为 null - 表单弹窗里**没有患者ID字段**,只有检查类型、检查名称、检查部位等字段 **综合总结:** 用户在影像对比页面点击"新增检查"时,弹窗表单没有 `patientId` 字段,提交后后端实体的 `patientId` 为 null,而数据库表 `radiology_image_comparison.patient_id` 有 NOT NULL 约束,导致插入失败。 --- ### 二、根因分析 **根因:前后端均缺失 `patientId` 传递** | 层级 | 问题 | |------|------| | **前端 `index.vue`** | `formData` 初始值无 `patientId`,弹窗表单无患者ID输入,`submitForm()` 直接提交 `formData.value`,不含 `patientId` | | **后端 Controller** | `addRecord(@RequestBody RadiologyImageComparison record)` 直接 `save()`,既不校验 `patientId` 是否为空,也不从页面查询区的 `patientId` 中获取 | | **数据库** | `radiology_image_comparison.patient_id` 列有 NOT NULL 约束,插入空值失败 | **涉及文件:** - `healthlink-his-ui/src/views/radiologycomparison/index.vue` — formData 缺少 patientId - `healthlink-his-server/.../RadiologyComparisonController.java` — addRecord 未校验/设置 patientId --- ### 三、修复方案 **修改 1:前端 `index.vue`** — `submitForm()` 中补充 `patientId` ```js async function submitForm() { // 补充患者ID(来自页面查询区) formData.value.patientId = patientId.value ? Number(patientId.value) : null await addRecord(formData.value) ElMessage.success('新增成功') showAdd.value = false loadData() } ``` **修改 2:后端 `RadiologyComparisonController.java`** — `addRecord` 增加参数校验 ```java @PostMapping("/add") @Transactional(rollbackFor = Exception.class) public R addRecord(@RequestBody RadiologyImageComparison record) { if (record.getPatientId() == null) { return R.fail("患者ID不能为空"); } record.setCreateTime(new Date()); comparisonService.save(record); return R.ok(record); } ``` **修改范围:** 2个文件,改动量极小,不破坏现有功能。 --- ### 四、路由决策 **FIXER: guanyu** **REASON: 后端 Controller 缺少参数校验是核心根因(后端权重更高),前端 formData 传递也需要同步修复,优先由 guanyu 处理后端校验 + 前端联动调整。** --- ## 路由决策 - **FIXER_ID**: guanyu - **修复 Agent**: guanyu(后端) - **原因**: 后端 Controller 缺少参数校验是核心根因(后端权重更高),前端 formData 传递也需要同步修复,优先由 guanyu 处理后端校验 + 前端联动调整。** > ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。