Files
his/MD/bugs/BUG_721_ANALYSIS.md

3.8 KiB
Raw Blame History

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 SQLINSERT 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.vuesubmitForm() 中补充 patientId

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.javaaddRecord 增加参数校验

@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 处理后端校验 + 前端联动调整。**

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