5.0 KiB
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 约束。
根因链条:
- 前端
healthlink-his-ui/src/views/pathology/order/index.vue:el-input-number的v-model="form.patientId"初始值为null,用户未手动输入时保持null - 前端
submitForm(): 无任何校验逻辑,直接调用add(form.value) - 后端
PathologyController.addOrder(): 无参数校验(无@Valid、无手动检查),直接orderService.save(order) - 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:
@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() 中增加校验逻辑:
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() |
增加前端提交前校验 | 仅影响病理医嘱表单 |
验证步骤:
mvn clean compile -DskipTests→ 编译通过- 不填 patientId 点确定 → 前端提示"请选择患者"
- 填入 patientId 后提交 → 后端正常保存,INSERT 包含
patient_id列
四、路由决策
- FIXER:
guanyu(后端修复 Controller 校验)+zhaoyun(前端修复表单校验) - REASON: 此 Bug 涉及后端 Controller 缺少参数校验和前端表单缺少提交前校验两个独立修改点,后端修复归属关羽,前端修复归属赵云,可并行处理。
路由决策
- FIXER_ID: guanyu
- 修复 Agent: guanyu(后端)
- 原因: LLM 分析决策
⚠️ 修复人员请先验证以上分析是否正确,再执行修复。