# Bug 修复总结报告 ## 修复概述 本次修复涉及 Bug #333/#334/#335/#336/#337,其中 #338/#339 由华佗修复,已确认。 **修复人:** 关羽 **修复日期:** 2026-04-06 **项目版本:** OpenHIS v2.0 --- ## Bug #337 - 挂号时间显示异常 ✅ 已修复 ### 一、Bug 原因 **问题描述:** 门诊挂号页面中,"挂号日期/时间"列显示异常或为空。 **根本原因:** - SQL 查询使用 `T1.create_time AS register_time`(下划线格式) - Java DTO `CurrentDayEncounterDto` 中字段名是 `registerTime`(驼峰格式) - 前端 Vue 组件使用 `scope.row.registerTime` 获取数据 - MyBatis 返回的 `register_time` 无法映射到前端的 `registerTime`,导致数据无法显示 **代码位置:** - 文件:`openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientRegistrationAppMapper.xml` - 方法:`getCurrentDayEncounter` - 行号:约第 72 行和第 88 行 ### 二、修改步骤 **文件:** `openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientRegistrationAppMapper.xml` **修改 1:字段别名修正(第 72 行)** ```xml T1.create_time AS register_time, T1.create_time AS registerTime, ``` **修改 2:ORDER BY 子句修正(第 88 行)** ```xml ORDER BY T9.register_time DESC ORDER BY T9.registerTime DESC ``` ### 三、运行结果结论 **修复前:** - 前端页面"挂号日期/时间"列显示为空或格式错误 - 时间数据无法正确映射到表格 **修复后:** - 前端正确显示挂号时间,格式为 `YYYY-MM-DD HH:mm:ss` - 时间排序功能正常工作 - 数据库字段 `create_time` 通过 SQL 别名 `registerTime` 正确映射到 DTO 和前端 **测试结果:** ✅ 验证通过 --- ## Bug #333/#335/#336 - 医嘱保存报错 ✅ 已修复 ### 一、Bug 原因 **问题描述:** 保存药品/耗材/诊疗医嘱时,有时会报字段不能为空的错误或空指针异常。 **根本原因:** - `handMedication()` 方法(药品医嘱)缺少 `practitionerId` 和 `founderOrgId` 的 null-check - `handDevice()` 方法(耗材医嘱)缺少 `practitionerId` 和 `founderOrgId` 的 null-check - `handService()` 方法(诊疗医嘱)缺少 `practitionerId` 和 `founderOrgId` 的 null-check - 当前端未传递这些字段时,它们为 null,导致数据库插入失败或 NullPointerException **代码位置:** - 文件:`openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAdviceAppServiceImpl.java` - 方法:`handMedication()`、`handDevice()`、`handService()` ### 二、修改步骤 **文件:** `openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAdviceAppServiceImpl.java` #### 修改 1:handMedication 方法(约第 756 行) 在 `accountId` 补全逻辑后,添加以下代码: ```java // 🔧 Bug Fix: 确保practitionerId不为null if (adviceSaveDto.getPractitionerId() == null) { adviceSaveDto.setPractitionerId(SecurityUtils.getLoginUser().getPractitionerId()); log.info("handMedication - 自动补全practitionerId: practitionerId={}", adviceSaveDto.getPractitionerId()); } // 🔧 Bug Fix: 确保founderOrgId不为null if (adviceSaveDto.getFounderOrgId() == null) { adviceSaveDto.setFounderOrgId(SecurityUtils.getLoginUser().getOrgId()); log.info("handMedication - 自动补全founderOrgId: founderOrgId={}", adviceSaveDto.getFounderOrgId()); } ``` #### 修改 2:handDevice 方法(约第 1145 行) 在 `accountId` 补全逻辑后,添加以下代码: ```java // 🔧 Bug Fix: 确保practitionerId不为null if (adviceSaveDto.getPractitionerId() == null) { adviceSaveDto.setPractitionerId(SecurityUtils.getLoginUser().getPractitionerId()); log.info("自动补全practitionerId: practitionerId={}", adviceSaveDto.getPractitionerId()); } // 🔧 Bug Fix: 确保founderOrgId不为null if (adviceSaveDto.getFounderOrgId() == null) { adviceSaveDto.setFounderOrgId(SecurityUtils.getLoginUser().getOrgId()); log.info("自动补全founderOrgId: founderOrgId={}", adviceSaveDto.getFounderOrgId()); } ``` #### 修改 3:handService 方法(约第 1395 行) 在 `accountId` 补全逻辑后,添加以下代码: ```java // 🔧 Bug Fix: 确保practitionerId不为null if (adviceSaveDto.getPractitionerId() == null) { adviceSaveDto.setPractitionerId(SecurityUtils.getLoginUser().getPractitionerId()); log.info("handService - 自动补全practitionerId: practitionerId={}", adviceSaveDto.getPractitionerId()); } // 🔧 Bug Fix: 确保(founderOrgId不为null if (adviceSaveDto.getFounderOrgId() == null) { adviceSaveDto.setFounderOrgId(SecurityUtils.getLoginUser().getOrgId()); log.info("handService - 自动补全founderOrgId: founderOrgId={}", adviceSaveDto.getFounderOrgId()); } ``` ### 三、运行结果结论 **修复前:** - 保存药品医嘱时,如果 `practitionerId` 为 null,可能导致数据库插入失败 - 保存耗材医嘱时,如果 `founderOrgId` 为 null,可能导致空指针异常 - 保存诊疗医嘱时,同样存在字段缺失风险 **修复后:** - 所有医嘱保存方法都会自动从登录用户获取 `practitionerId` 和 `founderOrgId` - 即使前端未传递这些字段,也能正常保存医嘱 - 日志会记录自动补全的字段值,便于问题追踪 **测试场景:** 1. ✅ 药品医嘱保存(测试通过) 2. ✅ 耗材医嘱保存(测试通过) 3. ✅ 诊疗医嘱保存(测试通过) **测试结果:** ✅ 验证通过 --- ## Bug #334 - 前端 UI 布局调整 ⚠️ 待补充 ### 当前状态 已读取 `openhis-ui-vue3/src/views/charge/outpatientregistration/index.vue` 文件,未发现明显的 UI 布局问题。 现有页面符合 Element Plus 组件库规范,布局合理。 ### 待补充信息 **请提供以下信息以便进一步修复:** 1. **具体页面路径:** 是哪个功能模块?(例如:门诊挂号、门诊缴费、药房发药等) 2. **当前问题描述:** 具体哪些元素布局异常?(例如:按钮错位、间距过大、表单项重叠等) 3. **期望效果:** 期望的布局样式是什么? 4. **截图或截图链接:** 如果有截图,可帮助快速定位问题 --- ## Bug #338/#339 - 已由华佗修复 ✅ ### Bug #338 - 就诊状态校验 **修复人:** 华佗 **位置:** `DoctorStationAdviceAppServiceImpl.saveAdvice()` 方法(165-182行) **内容:** 新增就诊状态校验,未接诊患者(非1002/1003/1004状态)禁止保存医嘱 **验证状态:** ✅ 已验证 ### Bug #339 - 药房 locationId 过滤 **修复人:** HIS Dev **位置:** `DoctorStationAdviceAppServiceImpl.getAdviceBaseInfo()` 方法 **内容:** 新增 `locationId` 过滤条件,药房筛选功能正常工作 **验证状态:** ✅ 已验证 --- ## 修改文件清单 | 序号 | 文件路径 | 修改类型 | 说明 | |------|---------|---------|------| | 1 | `openhis-server-new/openhis-application/src/main/resources/mapper/chargemanage/OutpatientRegistrationAppMapper.xml` | 字段别名修复 | 将 `register_time` 改为 `registerTime` | | 2 | `openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAdviceAppServiceImpl.java` | 新增字段补全逻辑 | 在三个医嘱处理方法中添加 `practitionerId` 和 `founderOrgId` 自动补全 | --- ## 部署建议 1. **后端部署:** ```bash cd openhis-server-new mvn clean package -DskipTests ``` 2. **重启服务:** ```bash cd openhis-server-new/openhis-application mvn spring-boot:run ``` 3. **前端部署:** 本次修复不涉及前端代码,无需重新编译前端 --- ## 回归测试清单 | 测试项 | 预期结果 | 状态 | |--------|---------|------| | 挂号时间显示 | 正确显示 `YYYY-MM-DD HH:mm:ss` 格式 | ✅ | | 挂号时间排序 | 按时间倒序排列 | ✅ | | 药品医嘱保存 | 可正常保存,不报错 | ✅ | | 耗材医嘱保存 | 可正常保存,不报错 | ✅ | | 诊疗医嘱保存 | 可正常保存,不报错 | ✅ | | 就诊状态校验 | 未接诊患者无法保存医嘱 | ✅ | | 药房筛选 | 可根据 locationId 正确筛选药房 | ✅ | --- **报告人:** 关羽 **报告日期:** 2026-04-06 22:30