docs: 更新 Bug #547 分析报告 — 修正根因描述为跨科室误报
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -5,37 +5,37 @@
|
|||||||
|
|
||||||
## 根因定位
|
## 根因定位
|
||||||
|
|
||||||
**核心问题在 `OrganizationLocationAppServiceImpl.java:161-174`**
|
**核心问题在 `OrganizationLocationAppServiceImpl.java:161-177`**
|
||||||
|
|
||||||
时间冲突检测的查询逻辑存在两个缺陷:
|
时间冲突检测的查询范围过大:
|
||||||
|
|
||||||
### 缺陷1:查询范围过窄
|
### 缺陷:跨科室冲突检测导致误报
|
||||||
```java
|
```java
|
||||||
// 只查同一科室 + 同一诊疗的记录
|
// 查询同一 activityDefinitionId 的所有记录(跨科室)
|
||||||
getOrgLocListByOrgIdAndActivityDefinitionId(orgLoc.getOrganizationId(), orgLoc.getActivityDefinitionId());
|
organizationLocationService.getOrgLocListByActivityDefinitionId(orgLoc.getActivityDefinitionId());
|
||||||
```
|
```
|
||||||
只查询**同一科室**的记录。如果同一诊疗项目在其他科室已有配置且时间重叠,不会被当前查询检测到。但系统本应阻止同一诊疗在多个科室同时段执行。
|
该查询返回**所有科室**中同一诊疗项目的配置记录。当其他科室(非当前操作科室)已配置了相同诊疗且时间重叠时,会被误判为冲突。
|
||||||
|
|
||||||
### 缺陷2:"未知科室"错误提示
|
"执行科室配置"的业务语义是:为某个科室配置它可执行的诊疗项目及时段。不同科室配置同一诊疗的不同时段是完全合理的(如检验科 08:00-12:00,放射科 14:00-18:00)。跨科室时间重叠不应视为冲突。
|
||||||
当冲突记录关联的科室被软删除(`delete_flag='1'`)时,`organizationService.getById()` 受 `@TableLogic` 注解影响查不到该科室,返回 null,错误提示变成"与未知科室时间冲突"。
|
|
||||||
|
|
||||||
数据库验证发现确实存在软删除科室的组织位置记录(内科门诊、上海学校医院、信息科等,共9条)。
|
### 附带缺陷:"未知科室"错误提示
|
||||||
|
当冲突记录关联的科室被软删除(`delete_flag='1'`)时,`organizationService.getById()` 受 `@TableLogic` 注解影响查不到该科室,返回 null,之前的代码 `continue` 跳过了,但跨科室检测的根本问题未解决。
|
||||||
### 数据流
|
|
||||||
|
|
||||||
1. 前端选择科室 → 点击"添加新项目" → 填写诊疗和时间 → 点击"保存"
|
|
||||||
2. 后端 `addOrEditOrgLoc()` 接收请求
|
|
||||||
3. 查询现有冲突记录(**当前只查同科室**)
|
|
||||||
4. 对冲突记录检查时间重叠
|
|
||||||
5. 查找冲突科室名称 → 若科室被软删除则返回 null → "未知科室"
|
|
||||||
|
|
||||||
## 修复方案
|
## 修复方案
|
||||||
|
|
||||||
1. **修改冲突检测范围**:查询同一 `activityDefinitionId` 的所有记录(跨科室检测),而非仅限当前科室
|
**修改冲突检测范围**:将 `getOrgLocListByActivityDefinitionId` 改为 `getOrgLocListByOrgIdAndActivityDefinitionId`,仅检测**同一科室内**的时间冲突。
|
||||||
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`
|
|
||||||
|
**提交**: `7c6e35dc` Fix Bug #547: 冲突检测改为同科室范围
|
||||||
|
|
||||||
|
**改动行数**: +3/-1(`OrganizationLocationAppServiceImpl.java`)
|
||||||
|
|
||||||
|
**变更内容**:
|
||||||
|
```diff
|
||||||
|
-organizationLocationService.getOrgLocListByActivityDefinitionId(orgLoc.getActivityDefinitionId());
|
||||||
|
+organizationLocationService.getOrgLocListByOrgIdAndActivityDefinitionId(orgLoc.getOrganizationId(),
|
||||||
|
+ orgLoc.getActivityDefinitionId());
|
||||||
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user