Files
his/MD/bugs/BUG_742_ANALYSIS.md

92 lines
4.5 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 #742 诸葛亮分析报告
> **文档类型**: Bug分析
> **分析时间**: 2026-06-12 23:08:48
> **分析模型**: mimo-v2.5 (LLM深度分析)
---
## 基本信息
- **Bug #**: 742
- **标题**: 【收费工作站-住院登记】待登记入院和已登记入院出现查找数据库的报错
- **模块**: 收费工作站
- **提出人**: 王栩坤
---
编译通过。现在我已完整理解了 Bug 的根因和修复历史。
---
### 一、Bug 理解
**禅道 Bug #742 原文引用:**
- **标题**:【收费工作站-住院登记】待登记入院和已登记入院出现查找数据库的报错
- **严重程度**2 (严重)
- **重现步骤**登录内科医生1账号 → 收费工作站 → 住院登记 → 打开"待登记入院"和"已登记入院"标签页
- **实际结果**:两个页面均出现红色报错:`BindingException: Parameter 'startTime' not found. Available parameters are [formEnum, param5, ew, encounterStatus, param6, page, registeredFlag, param3, param4, param1, encounterClass, param2]`
- **期望结果**:进入住院登记模块,能正常打开"待登记入院"和"已登记入院"板块并显示数据
**附图关键信息**:截图显示两个标签页均为空白/暂无数据,顶部红色错误提示 MyBatis `BindingException`——`startTime` 参数在 Mapper 可用参数列表中不存在。
**综合总结**:用户在"收费工作站→住院登记"模块中,两个核心列表页(待登记入院、已登记入院)均因后端 MyBatis 参数绑定错误而无法加载任何数据,功能完全中断。根本原因是 Mapper XML 引用了 `#{startTime}` 等参数,但 Mapper Java 接口中缺少对应的 `@Param("startTime")` 注解。
---
### 二、根因分析
**根因**Mapper XML 与 Mapper Java 接口参数不匹配。
**时间线追溯**
| 时间 | 操作 | 影响 |
|------|------|------|
| Jun 10 (commit `8c42cf11b`) | 华佗更新 Mapper XML新增 `#{startTime}``#{endTime}``#{organizationId}``<if>` 条件 | ⚠️ XML 引用了 3 个新参数,但**未同步更新 Mapper Java 接口** |
| Jun 11 01:42 UTC | 王栩坤报告 Bug #742 | 此时 Mapper Java 仍缺少 `@Param("startTime")` |
| Jun 11 10:05 (commit `defab36cc`) | 冉芸侨添加 `@Param` 注解,但放在 `queryWrapper` 之后 | 部分修复,参数顺序与 AppService 调用不一致 |
| Jun 11 17:30 (commit `babd8d0c0`) | 华佗重排 Mapper 参数顺序AppService 改为从方法参数取值 | ✅ 修复完成,三层对齐 |
**涉及文件**
| 文件 | 问题 |
|------|------|
| `InHospitalRegisterAppMapper.xml` | 新增 `#{startTime}` 等引用Jun 10但 Mapper Java 未同步 |
| `InHospitalRegisterAppMapper.java` | 缺少 `@Param("startTime")` / `@Param("endTime")` / `@Param("organizationId")` |
| `InHospitalRegisterAppServiceImpl.java` | 调用 Mapper 时参数顺序与 Mapper 签名不匹配 |
**铁律违反**:违反铁律 4前后端 API 路径/参数对齐)和铁律 19编译错误不区分来源——XML 更新后必须同步更新 Mapper Java 接口。
---
### 三、修复方案
**当前代码状态**:经 `defab36cc` + `babd8d0c0` 两次提交,修复已完成,编译通过(已验证 `mvn clean compile -DskipTests` BUILD SUCCESS
**已修复的对齐关系**
1. **Mapper Java** (`InHospitalRegisterAppMapper.java:28-33`)`@Param("startTime")`, `@Param("endTime")`, `@Param("organizationId")` 已在 `queryWrapper` 之前
2. **AppService** (`InHospitalRegisterAppServiceImpl.java:175-193`):方法签名接收 `Date startTime, Date endTime, Long organizationId`,调用 Mapper 时按正确顺序传入
3. **Controller** (`InHospitalRegisterController.java:56-62`)`@RequestParam("startTime")` / `@RequestParam("endTime")` / `@RequestParam("organizationId")` 正确传递到 Service
4. **Mapper XML**`<if test='startTime != null'>` 正确引用 `#{startTime}`
**结论**:代码层面的修复已完成。需要:
- 重新部署编译后的应用(当前服务器运行的是修复前的版本)
- 验证部署后"待登记入院"和"已登记入院"两个列表页能正常加载数据
---
### 四、路由决策
**FIXER**: `guanyu`(后端开发)
**REASON**:这是纯后端 MyBatis Mapper 参数绑定问题,代码已修复但需确认部署和运行验证。如果需要额外的接口测试或边界情况验证,交由 `guanyu` 执行后端验证。
---
## 路由决策
- **FIXER_ID**: guanyu
- **修复 Agent**: guanyu后端
- **原因**: LLM 分析决策
> ⚠️ 修复人员请先验证以上分析是否正确,再执行修复。