# Bug #547 分析报告 ## Bug 描述 在"系统管理-执行科室配置"页面,选择科室(如检验科)后添加新项目并保存,显示"与未知科室时间冲突"错误。 ## 根因定位 **核心问题在 `OrganizationLocationAppServiceImpl.java:161-174`** 时间冲突检测的查询逻辑存在两个缺陷: ### 缺陷1:查询范围过窄 ```java // 只查同一科室 + 同一诊疗的记录 getOrgLocListByOrgIdAndActivityDefinitionId(orgLoc.getOrganizationId(), orgLoc.getActivityDefinitionId()); ``` 只查询**同一科室**的记录。如果同一诊疗项目在其他科室已有配置且时间重叠,不会被当前查询检测到。但系统本应阻止同一诊疗在多个科室同时段执行。 ### 缺陷2:"未知科室"错误提示 当冲突记录关联的科室被软删除(`delete_flag='1'`)时,`organizationService.getById()` 受 `@TableLogic` 注解影响查不到该科室,返回 null,错误提示变成"与未知科室时间冲突"。 数据库验证发现确实存在软删除科室的组织位置记录(内科门诊、上海学校医院、信息科等,共9条)。 ### 数据流 1. 前端选择科室 → 点击"添加新项目" → 填写诊疗和时间 → 点击"保存" 2. 后端 `addOrEditOrgLoc()` 接收请求 3. 查询现有冲突记录(**当前只查同科室**) 4. 对冲突记录检查时间重叠 5. 查找冲突科室名称 → 若科室被软删除则返回 null → "未知科室" ## 修复方案 1. **修改冲突检测范围**:查询同一 `activityDefinitionId` 的所有记录(跨科室检测),而非仅限当前科室 2. **优雅处理"未知科室"**:当 `getById` 返回 null 时,使用 "已删除科室( ID )" 替代 "未知科室",提供更有用的信息 3. **新增 Service 方法**:`getOrgLocListByActivityDefinitionId(Long activityDefinitionId)` 用于按诊疗定义查询所有记录 ## 涉及文件 - `openhis-server-new/openhis-application/src/main/java/com/openhis/web/basedatamanage/appservice/impl/OrganizationLocationAppServiceImpl.java` - `openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/IOrganizationLocationService.java` - `openhis-server-new/openhis-domain/src/main/java/com/openhis/administration/service/impl/OrganizationLocationServiceImpl.java`