2.6 KiB
2.6 KiB
Bug #516 深度分析报告
Bug 描述
[住院医生站-临床医嘱-检验申请] 检验申请单手动填写的"发往科室"与生成的医嘱执行科室不一致
根因分析
前端 Bug(laboratoryTests.vue)
projectWithDepartment 函数(第167行)声明了1个参数,但内部使用了未声明的变量 type:
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))
后果:
type始终为undefined,type === 2永远为 falsemanualDept永远为空字符串- 用户手动选择的"发往科室"在提交时被清空
- 即使
findItem未找到配置的科室,也无法用手动选择兜底
后端 Bug(RequestFormManageAppServiceImpl.java)
第165-171行:
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(即用户手动选择的"发往科室")。
数据流
- 用户在前端选择检验项目 → 触发watch →
projectWithDepartment尝试自动设置科室 - 用户手动切换"发往科室"下拉框 →
form.targetDepartment= 肝胆科ID - 用户点击提交 →
projectWithDepartment(transferValue.value, 2)调用 - 因
type未声明,手动选择的科室被清空 →form.targetDepartment= '' - 前端构建提交参数:
positionId: item.positionId || form.targetDepartment→ 空值 - 后端收到请求,从配置表查默认科室(检验科) →
serviceRequest.setOrgId(检验科) - 医嘱列表中"药房/科室"列显示检验科,而非用户选择的肝胆科
修复方案
前端修复(1行改动)
在 projectWithDepartment 函数签名中添加 type 参数。
后端修复(3行改动)
优先使用前端传来的 positionId,配置表作为兜底值。