Files
his/bug547_analysis.md

2.3 KiB
Raw Blame History

Bug #547 分析报告

Bug 描述

在"系统管理-执行科室配置"页面,选择科室(如检验科)后添加新项目并保存,显示"与未知科室时间冲突"错误。

根因定位

核心问题在 OrganizationLocationAppServiceImpl.java:161-174

时间冲突检测的查询逻辑存在两个缺陷:

缺陷1查询范围过窄

// 只查同一科室 + 同一诊疗的记录
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