Fix Bug #516: 根因+修复方案摘要

This commit is contained in:
华佗
2026-05-17 13:32:34 +08:00
committed by 赵云
parent 9f1ca5ec2c
commit ffe5538c62

61
BUG516_ANALYSIS.md Normal file
View File

@@ -0,0 +1,61 @@
# Bug #516 深度分析报告
## Bug 描述
[住院医生站-临床医嘱-检验申请] 检验申请单手动填写的"发往科室"与生成的医嘱执行科室不一致
## 根因分析
### 前端 Bug`laboratoryTests.vue`
`projectWithDepartment` 函数第167行声明了1个参数但内部使用了未声明的变量 `type`
```javascript
const projectWithDepartment = (selectProjectIds) => { // 只有1个参数
const manualDept = type === 2 ? form.targetDepartment : ''; // type 未声明!
...
if (type === 2 && manualDept) { // type 未声明!
```
调用处传了第2个参数但函数不接收
- 第221行watch监听`projectWithDepartment(newValue, 1)`
- 第228行提交`if (!projectWithDepartment(transferValue.value, 2))`
**后果**
1. `type` 始终为 `undefined``type === 2` 永远为 false
2. `manualDept` 永远为空字符串
3. 用户手动选择的"发往科室"在提交时被清空
4. 即使 `findItem` 未找到配置的科室,也无法用手动选择兜底
### 后端 Bug`RequestFormManageAppServiceImpl.java`
第165-171行
```java
Long positionId = activityOrganizationConfig.stream()
.filter(dto -> activitySaveDto.getAdviceDefinitionId().equals(dto.getActivityDefinitionId()))
.map(ActivityOrganizationConfigDto::getOrganizationId).findFirst().orElse(null);
if (positionId == null) {
throw new ServiceException(activitySaveDto.getAdviceDefinitionName() + "未配置当前时间段的执行科室");
}
serviceRequest.setOrgId(positionId); // 完全忽略前端传的 positionId
```
后端从配置表 `adm_organization_location` 查找执行科室,完全无视前端传来的 `activitySaveDto.positionId`(即用户手动选择的"发往科室")。
### 数据流
1. 用户在前端选择检验项目 → 触发watch → `projectWithDepartment` 尝试自动设置科室
2. 用户手动切换"发往科室"下拉框 → `form.targetDepartment` = 肝胆科ID
3. 用户点击提交 → `projectWithDepartment(transferValue.value, 2)` 调用
4.`type` 未声明,手动选择的科室被清空 → `form.targetDepartment` = ''
5. 前端构建提交参数:`positionId: item.positionId || form.targetDepartment` → 空值
6. 后端收到请求,从配置表查默认科室(检验科) → `serviceRequest.setOrgId(检验科)`
7. 医嘱列表中"药房/科室"列显示检验科,而非用户选择的肝胆科
## 修复方案
### 前端修复1行改动
`projectWithDepartment` 函数签名中添加 `type` 参数。
### 后端修复3行改动
优先使用前端传来的 `positionId`,配置表作为兜底值。