# Bug #547 分析报告 ## Bug 描述 在"系统管理-执行科室配置"页面,选择科室(如检验科)后添加新项目并保存,显示"与未知科室时间冲突"错误。 ## 根因定位 **核心问题在 `OrganizationLocationAppServiceImpl.java:161-177`** 时间冲突检测的查询范围过大: ### 缺陷:跨科室冲突检测导致误报 ```java // 查询同一 activityDefinitionId 的所有记录(跨科室) organizationLocationService.getOrgLocListByActivityDefinitionId(orgLoc.getActivityDefinitionId()); ``` 该查询返回**所有科室**中同一诊疗项目的配置记录。当其他科室(非当前操作科室)已配置了相同诊疗且时间重叠时,会被误判为冲突。 "执行科室配置"的业务语义是:为某个科室配置它可执行的诊疗项目及时段。不同科室配置同一诊疗的不同时段是完全合理的(如检验科 08:00-12:00,放射科 14:00-18:00)。跨科室时间重叠不应视为冲突。 ### 附带缺陷:"未知科室"错误提示 当冲突记录关联的科室被软删除(`delete_flag='1'`)时,`organizationService.getById()` 受 `@TableLogic` 注解影响查不到该科室,返回 null,之前的代码 `continue` 跳过了,但跨科室检测的根本问题未解决。 ## 修复方案 **修改冲突检测范围**:将 `getOrgLocListByActivityDefinitionId` 改为 `getOrgLocListByOrgIdAndActivityDefinitionId`,仅检测**同一科室内**的时间冲突。 ## 修复结果 **修复状态**: ✅ 成功 **提交**: `7c6e35dc` Fix Bug #547: 冲突检测改为同科室范围 **改动行数**: +3/-1(`OrganizationLocationAppServiceImpl.java`) **变更内容**: ```diff -organizationLocationService.getOrgLocListByActivityDefinitionId(orgLoc.getActivityDefinitionId()); +organizationLocationService.getOrgLocListByOrgIdAndActivityDefinitionId(orgLoc.getOrganizationId(), + orgLoc.getActivityDefinitionId()); ```