# Bug #318 修复总结 - 手术医嘱类型冲突解决 ## 问题描述 手术医嘱的 `adviceType=4` 与耗材类型冲突,导致保存手术医嘱时被错误归类为耗材,进而引发 `device_def_id` 为 null 的数据库错误。 ## 解决方案 引入新的手术类型值 **6**,避免与耗材类型(4)冲突。 ## 类型映射表 | 类型 | 前端 adviceType | 后端 ItemType | 数据库 category_enum | |------|----------------|---------------|---------------------| | 药品 | 1 | MEDICINE(1) | 1 | | 耗材 | 4 | DEVICE(2) | 2 | | 诊疗 | 3 | ACTIVITY(3) | 3 | | 会诊 | 5 | - | 31 | | **手术** | **6** | **SURGERY(6)** | **6** | ## 修改的文件 ### 1. 后端 - 枚举定义 **文件**: `openhis-server-new/openhis-common/src/main/java/com/openhis/common/enums/ItemType.java` - 添加 `SURGERY(6, "6", "手术")` 枚举值 ### 2. 后端 - SQL Mapper(医生站) **文件**: `openhis-server-new/openhis-application/src/main/resources/mapper/doctorstation/DoctorStationAdviceAppMapper.xml` - 修改 SQL:将 `category_enum=4` 映射为 `advice_type=6` - 修改前: `COALESCE(T1.category_enum, 3) AS advice_type` - 修改后: `CASE WHEN T1.category_enum = 4 THEN 6 ELSE COALESCE(T1.category_enum, 3) END AS advice_type` ### 3. 后端 - SQL Mapper(住院医生站) **文件**: `openhis-server-new/openhis-application/src/main/resources/mapper/regdoctorstation/AdviceManageAppMapper.xml` - 同上修改 ### 4. 后端 - 分类逻辑 **文件**: `openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAdviceAppServiceImpl.java` - 更新 `deviceList` 筛选条件:处理 `adviceType=4`(耗材) - 更新 `activityList` 筛选条件:处理 `adviceType=6`(手术) ### 5. 前端 - 医嘱类型选项 **文件**: `openhis-ui-vue3/src/views/inpatientDoctor/home/components/order/index.vue` - 修改手术类型值从 4 改为 6 ## 数据迁移 ### 历史数据更新脚本 **文件**: `sql/迁移记录-DB变更记录/20260401_update_surgery_advice_type.sql` ```sql -- 更新历史手术医嘱的 category_enum 从 4 改为 6 UPDATE wor_service_request SET category_enum = 6 WHERE category_enum = 4 AND delete_flag = '0'; ``` ### 执行步骤 1. **备份数据库**(重要!) 2. 执行上述 UPDATE 语句 3. 重启后端服务 4. 清除前端缓存 ## 验证方法 ### 1. 后端日志验证 保存手术申请单后,检查日志: ``` BugFix#219: 医嘱分类完成 - 药品:{}, 耗材:{}, 诊疗:{} ``` 手术医嘱应该被归类到"诊疗"中。 ### 2. 数据库验证 ```sql -- 检查手术医嘱的 category_enum 是否为 6 SELECT id, bus_no, category_enum, content_json::jsonb->>'surgeryName' FROM wor_service_request WHERE category_enum = 6; ``` ### 3. 前端验证 - 医嘱列表中手术医嘱显示正常 - 手术医嘱的 adviceType 为 6 - 耗材医嘱的 adviceType 为 4 ## 注意事项 1. **部署前必须执行数据迁移脚本**,否则历史手术医嘱无法正确显示 2. 修改后需要重新编译部署后端和前端 3. 建议先在测试环境验证后再部署到生产环境