Files
his/MD/bugs/BUG_721_ANALYSIS.md

102 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 处理后端校验 + 前端联动调整。**
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。