docs(bug): 诸葛亮分析报告 Bug #721
This commit is contained in:
101
MD/bugs/BUG_721_ANALYSIS.md
Normal file
101
MD/bugs/BUG_721_ANALYSIS.md
Normal file
@@ -0,0 +1,101 @@
|
||||
# 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 处理后端校验 + 前端联动调整。**
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
Reference in New Issue
Block a user