# 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` 方法中,保存时会检查时间冲突。当发现冲突时,代码需要获取冲突记录的科室名称用于错误提示: ```java // 第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()` ## 修复结果:✅ 成功,4行改动 - 编译验证:BUILD SUCCESS - 改动文件:`OrganizationLocationAppServiceImpl.java`、`IOrganizationLocationService.java`、`OrganizationLocationServiceImpl.java` - 已提交并推送到远程分支 guanyu