Fix Bug #547: 执行科室配置保存时时间冲突检测范围错误 — 根因:addOrEditOrgLoc 方法使用 getOrgLocListByActivityDefinitionId 跨科室查询同一诊疗的所有配置,导致不同科室间的正常时间重叠被误判为冲突;修复:改为 getOrgLocListByOrgIdAndActivityDefinitionId(orgId, activityDefId) 限定同科室范围;同时优化软删除科室处理,当冲突记录关联的科室已被删除时,使用"科室[ID]已删除"替代静默跳过

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-20 12:07:01 +08:00
parent 021f7180c0
commit cfa073bdba

View File

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