57 lines
2.6 KiB
Markdown
57 lines
2.6 KiB
Markdown
# 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
|