Files
his/bug491_analysis.md
guanyu 0a777ee700 Fix Bug #491: 【执行科室配置】保存配置时系统报错
根因:时间冲突检查中 organizationService.getById() 返回 null 时直接调用 getName() 导致 NPE;
同时 getOrgLocListByOrgIdAndActivityDefinitionId 方法只按 activityDefinitionId 查询,未按 organizationId 过滤,
导致跨科室误判冲突且可能查询到已删除机构的脏数据。

修复:
1. 增加 org.getName() 前的双重判空(org != null && org.getName() != null)
2. getOrgLocListByOrgIdAndActivityDefinitionId 增加 organizationId 参数并加入查询条件

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 19:22:27 +08:00

2.4 KiB
Raw Blame History

Bug #491 分析报告

Bug 信息

  • 标题: 【执行科室配置】保存配置时系统报错
  • 报错信息: Cannot invoke "com.openhis.administration.domain.Organization.getName()" because the return value of "com.openhis.administration.service..." is null
  • 严重程度: 3 | 优先级: 3 | 类型: codeerror

复现步骤

  1. 登录 HIS 系统 → 【系统管理】→【业务规则配置】→【执行科室配置】
  2. 左侧选择科室(如"超声诊断科"
  3. 新增或修改某行的时间区间
  4. 点击【保存】按钮
  5. 顶部弹出红色错误提示NPE

根因分析

文件定位

  • openhis-server-new/.../appservice/impl/OrganizationLocationAppServiceImpl.java第161-175行

根本原因

addOrEditOrgLoc 方法中,保存时会检查时间冲突。当发现冲突时,代码需要获取冲突记录的科室名称用于错误提示:

// 第171-172行
Organization org = organizationService.getById(organizationLocation.getOrganizationId());
String organizationName = org.getName(); // NPE 这里!

问题organizationService.getById() 可能返回 null(当冲突记录的 organizationId 指向已被删除的机构时),直接调用 .getName() 导致 NPE。

附加问题

getOrgLocListByOrgIdAndActivityDefinitionId 方法(OrganizationLocationServiceImpl.java:60-62)只按 activityDefinitionId 查询,没有按 organizationId 过滤,导致:

  • 方法名含 "OrgId" 但实际不查 organizationId
  • 时间冲突检测范围过广(跨科室误判冲突)
  • 可能查到已被删除机构的脏数据

数据流

前端保存 → POST /base-data-manage/org-loc/org-loc
→ addOrEditOrgLoc(OrgLocQueryDto)
→ 查询同 activityDefinitionId 的所有机构位置记录(含脏数据)
→ 检查时间是否重叠
→ 若重叠getById(organizationId) → null → getName() → NPE

修复方案

  1. OrganizationLocationAppServiceImpl.java 第172行增加 org != null 判空,回退为 "未知科室"
  2. IOrganizationLocationService.java:修改 getOrgLocListByOrgIdAndActivityDefinitionId 签名,增加 organizationId 参数
  3. OrganizationLocationServiceImpl.java:查询条件增加 .eq(OrganizationLocation::getOrganizationId, organizationId)
  4. OrganizationLocationAppServiceImpl.java 第162行调用时传入 orgLoc.getOrganizationId()