docs(bug): 诸葛亮分析报告 Bug #726
This commit is contained in:
134
MD/bugs/BUG_726_ANALYSIS.md
Normal file
134
MD/bugs/BUG_726_ANALYSIS.md
Normal file
@@ -0,0 +1,134 @@
|
||||
# Bug #726 诸葛亮分析报告
|
||||
|
||||
> **文档类型**: Bug分析
|
||||
> **分析时间**: 2026-06-13 01:12:01
|
||||
> **分析模型**: mimo-v2.5 (LLM深度分析)
|
||||
|
||||
---
|
||||
|
||||
## 基本信息
|
||||
- **Bug #**: 726
|
||||
- **标题**: 【病理管理】开病历医嘱出现报错
|
||||
- **模块**: 疾病报告管理
|
||||
- **提出人**: 王栩坤
|
||||
|
||||
---
|
||||
|
||||
Now I have all the information needed for a complete analysis. Let me compile the findings.
|
||||
|
||||
---
|
||||
|
||||
### 一、Bug 理解
|
||||
|
||||
**禅道 Bug #726:【病理管理】开病历医嘱出现报错**
|
||||
|
||||
- **重现步骤**: 登录内科医生1账号(doctor1/123456),进入病理管理→病理医嘱→点击"开病理医嘱"报卡→点击确定
|
||||
- **结果**: 出现报错 `ERROR: null value in column "patient_id" of relation "pathology_order" violates not-null constraint`
|
||||
- **期望**: 能够正常进行该项操作
|
||||
|
||||
**附图关键信息**:
|
||||
- 弹窗表单中"患者ID"、"患者姓名"、"就诊ID"三个字段均为空
|
||||
- `el-input-number` 控件未填入值,`patientId` 为 `null`
|
||||
- 后端执行的 INSERT SQL 中**完全没有 `patient_id` 列**,说明 MyBatis-Plus 对 null 值字段执行了跳过策略
|
||||
|
||||
**综合总结**: 用户在"开病理医嘱"弹窗中未填写患者ID(或系统未自动填充),导致提交时 `patientId=null`。MyBatis-Plus 的默认 insert 策略跳过了 null 字段(INSERT SQL 中无 `patient_id` 列),而数据库 `pathology_order.patient_id` 列有 `NOT NULL` 约束,导致插入失败。
|
||||
|
||||
---
|
||||
|
||||
### 二、根因分析
|
||||
|
||||
**直接原因**: 前端表单提交了 `patientId: null`,后端 Controller `addOrder()` 未做任何校验直接调用 `orderService.save(order)`,MyBatis-Plus 生成的 INSERT 不包含 `patient_id` 列,触发 PostgreSQL NOT NULL 约束。
|
||||
|
||||
**根因链条**:
|
||||
1. **前端** `healthlink-his-ui/src/views/pathology/order/index.vue`: `el-input-number` 的 `v-model="form.patientId"` 初始值为 `null`,用户未手动输入时保持 `null`
|
||||
2. **前端** `submitForm()`: 无任何校验逻辑,直接调用 `add(form.value)`
|
||||
3. **后端** `PathologyController.addOrder()`: 无参数校验(无 `@Valid`、无手动检查),直接 `orderService.save(order)`
|
||||
4. **DB**: `pathology_order.patient_id BIGINT NOT NULL`(V32 迁移脚本定义)
|
||||
|
||||
**涉及文件**:
|
||||
| 文件 | 问题 |
|
||||
|------|------|
|
||||
| `healthlink-his-ui/src/views/pathology/order/index.vue` | 表单无校验,`patientId` 可为 null |
|
||||
| `healthlink-his-server/.../web/pathology/controller/PathologyController.java` | `addOrder()` 无参数校验 |
|
||||
| `healthlink-his-domain/.../pathology/domain/PathologyOrder.java` | Entity 无 `@NotNull` 注解 |
|
||||
|
||||
---
|
||||
|
||||
### 三、修复方案
|
||||
|
||||
**方案:前后端双重校验 + 自动获取患者信息**
|
||||
|
||||
#### 1. 后端:Controller 加校验(1 个文件)
|
||||
|
||||
**文件**: `PathologyController.java` 的 `addOrder()` 方法
|
||||
|
||||
**修改内容**: 在保存前校验必填字段 `patientId` 和 `patientName`:
|
||||
|
||||
```java
|
||||
@PostMapping("/order/add")
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public R<?> addOrder(@RequestBody PathologyOrder order) {
|
||||
if (order.getPatientId() == null) {
|
||||
return R.fail("患者ID不能为空");
|
||||
}
|
||||
if (!StringUtils.hasText(order.getPatientName())) {
|
||||
return R.fail("患者姓名不能为空");
|
||||
}
|
||||
if (!StringUtils.hasText(order.getOrderStatus())) {
|
||||
order.setOrderStatus("PENDING");
|
||||
}
|
||||
order.setApplyTime(new Date());
|
||||
order.setCreateTime(new Date());
|
||||
orderService.save(order);
|
||||
return R.ok(order);
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. 前端:表单提交前校验(1 个文件)
|
||||
|
||||
**文件**: `healthlink-his-ui/src/views/pathology/order/index.vue`
|
||||
|
||||
**修改内容**: 在 `submitForm()` 中增加校验逻辑:
|
||||
|
||||
```javascript
|
||||
const submitForm = async () => {
|
||||
if (!form.value.patientId) { ElMessage.warning('请选择患者'); return }
|
||||
if (!form.value.patientName) { ElMessage.warning('请填写患者姓名'); return }
|
||||
if (isEdit.value) {
|
||||
await update(form.value)
|
||||
} else {
|
||||
await add(form.value)
|
||||
}
|
||||
ElMessage.success('操作成功')
|
||||
dlgVisible.value = false
|
||||
loadData()
|
||||
}
|
||||
```
|
||||
|
||||
**修改总结**:
|
||||
|
||||
| 文件 | 修改内容 | 影响范围 |
|
||||
|------|---------|---------|
|
||||
| `PathologyController.java:~addOrder()` | 增加 `patientId` 和 `patientName` 非空校验 | 仅影响新增病理医嘱接口 |
|
||||
| `pathology/order/index.vue:submitForm()` | 增加前端提交前校验 | 仅影响病理医嘱表单 |
|
||||
|
||||
**验证步骤**:
|
||||
1. `mvn clean compile -DskipTests` → 编译通过
|
||||
2. 不填 patientId 点确定 → 前端提示"请选择患者"
|
||||
3. 填入 patientId 后提交 → 后端正常保存,INSERT 包含 `patient_id` 列
|
||||
|
||||
---
|
||||
|
||||
### 四、路由决策
|
||||
|
||||
- **FIXER**: `guanyu`(后端修复 Controller 校验)+ `zhaoyun`(前端修复表单校验)
|
||||
- **REASON**: 此 Bug 涉及后端 Controller 缺少参数校验和前端表单缺少提交前校验两个独立修改点,后端修复归属关羽,前端修复归属赵云,可并行处理。
|
||||
|
||||
---
|
||||
|
||||
## 路由决策
|
||||
- **FIXER_ID**: guanyu
|
||||
- **修复 Agent**: guanyu(后端)
|
||||
- **原因**: LLM 分析决策
|
||||
|
||||
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。
|
||||
Reference in New Issue
Block a user