From 30e5c92f0b4f6bd2021fbe48e084389ae04dd063 Mon Sep 17 00:00:00 2001 From: zhaoyun Date: Wed, 20 May 2026 10:16:56 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=20Bug=20#547=20?= =?UTF-8?q?=E5=88=86=E6=9E=90=E6=8A=A5=E5=91=8A=20=E2=80=94=20=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E6=A0=B9=E5=9B=A0=E6=8F=8F=E8=BF=B0=E4=B8=BA=E8=B7=A8?= =?UTF-8?q?=E7=A7=91=E5=AE=A4=E8=AF=AF=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- bug547_analysis.md | 48 +++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/bug547_analysis.md b/bug547_analysis.md index 1c525ccf..e71e5a3e 100644 --- a/bug547_analysis.md +++ b/bug547_analysis.md @@ -5,37 +5,37 @@ ## 根因定位 -**核心问题在 `OrganizationLocationAppServiceImpl.java:161-174`** +**核心问题在 `OrganizationLocationAppServiceImpl.java:161-177`** -时间冲突检测的查询逻辑存在两个缺陷: +时间冲突检测的查询范围过大: -### 缺陷1:查询范围过窄 +### 缺陷:跨科室冲突检测导致误报 ```java -// 只查同一科室 + 同一诊疗的记录 -getOrgLocListByOrgIdAndActivityDefinitionId(orgLoc.getOrganizationId(), orgLoc.getActivityDefinitionId()); +// 查询同一 activityDefinitionId 的所有记录(跨科室) +organizationLocationService.getOrgLocListByActivityDefinitionId(orgLoc.getActivityDefinitionId()); ``` -只查询**同一科室**的记录。如果同一诊疗项目在其他科室已有配置且时间重叠,不会被当前查询检测到。但系统本应阻止同一诊疗在多个科室同时段执行。 +该查询返回**所有科室**中同一诊疗项目的配置记录。当其他科室(非当前操作科室)已配置了相同诊疗且时间重叠时,会被误判为冲突。 -### 缺陷2:"未知科室"错误提示 -当冲突记录关联的科室被软删除(`delete_flag='1'`)时,`organizationService.getById()` 受 `@TableLogic` 注解影响查不到该科室,返回 null,错误提示变成"与未知科室时间冲突"。 +"执行科室配置"的业务语义是:为某个科室配置它可执行的诊疗项目及时段。不同科室配置同一诊疗的不同时段是完全合理的(如检验科 08:00-12:00,放射科 14:00-18:00)。跨科室时间重叠不应视为冲突。 -数据库验证发现确实存在软删除科室的组织位置记录(内科门诊、上海学校医院、信息科等,共9条)。 - -### 数据流 - -1. 前端选择科室 → 点击"添加新项目" → 填写诊疗和时间 → 点击"保存" -2. 后端 `addOrEditOrgLoc()` 接收请求 -3. 查询现有冲突记录(**当前只查同科室**) -4. 对冲突记录检查时间重叠 -5. 查找冲突科室名称 → 若科室被软删除则返回 null → "未知科室" +### 附带缺陷:"未知科室"错误提示 +当冲突记录关联的科室被软删除(`delete_flag='1'`)时,`organizationService.getById()` 受 `@TableLogic` 注解影响查不到该科室,返回 null,之前的代码 `continue` 跳过了,但跨科室检测的根本问题未解决。 ## 修复方案 -1. **修改冲突检测范围**:查询同一 `activityDefinitionId` 的所有记录(跨科室检测),而非仅限当前科室 -2. **优雅处理"未知科室"**:当 `getById` 返回 null 时,使用 "已删除科室( ID )" 替代 "未知科室",提供更有用的信息 -3. **新增 Service 方法**:`getOrgLocListByActivityDefinitionId(Long activityDefinitionId)` 用于按诊疗定义查询所有记录 +**修改冲突检测范围**:将 `getOrgLocListByActivityDefinitionId` 改为 `getOrgLocListByOrgIdAndActivityDefinitionId`,仅检测**同一科室内**的时间冲突。 -## 涉及文件 -- `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()); +```