2.6 KiB
2.6 KiB
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
复现步骤
- 登录 HIS 系统 → 【系统管理】→【业务规则配置】→【执行科室配置】
- 左侧选择科室(如"超声诊断科")
- 新增或修改某行的时间区间
- 点击【保存】按钮
- 顶部弹出红色错误提示(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
修复方案
OrganizationLocationAppServiceImpl.java第172行:增加org != null判空,回退为"未知科室"IOrganizationLocationService.java:修改getOrgLocListByOrgIdAndActivityDefinitionId签名,增加organizationId参数OrganizationLocationServiceImpl.java:查询条件增加.eq(OrganizationLocation::getOrganizationId, organizationId)OrganizationLocationAppServiceImpl.java第162行:调用时传入orgLoc.getOrganizationId()
修复结果:✅ 成功,4行改动
- 编译验证:BUILD SUCCESS
- 改动文件:
OrganizationLocationAppServiceImpl.java、IOrganizationLocationService.java、OrganizationLocationServiceImpl.java - 已提交并推送到远程分支 guanyu