Files
his/BUG516_ANALYSIS.md
2026-05-17 13:48:43 +08:00

2.6 KiB
Raw Blame History

Bug #516 深度分析报告

Bug 描述

[住院医生站-临床医嘱-检验申请] 检验申请单手动填写的"发往科室"与生成的医嘱执行科室不一致

根因分析

前端 BuglaboratoryTests.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))

后果

  1. type 始终为 undefinedtype === 2 永远为 false
  2. manualDept 永远为空字符串
  3. 用户手动选择的"发往科室"在提交时被清空
  4. 即使 findItem 未找到配置的科室,也无法用手动选择兜底

后端 BugRequestFormManageAppServiceImpl.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(即用户手动选择的"发往科室")。

数据流

  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,配置表作为兜底值。