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