Files
his/MD/bugs/BUG_731_ANALYSIS.md

7.5 KiB
Raw Blame History

Bug #731 诸葛亮分析报告

文档类型: Bug分析 分析时间: 2026-06-13 00:39:06 分析模型: mimo-v2.5 (LLM深度分析)


基本信息

  • Bug #: 731
  • 标题: 【临床医嘱-转科】转科申请成功后主界面未自动刷新,且生成的医嘱名称与科室数据错误
  • 模块: 住院医生工作站
  • 提出人: 陈显精

Now I have a complete picture. Here's my analysis:


Bug #731 分析报告

一、Bug 理解

禅道标题:【临床医嘱-转科】转科申请成功后主界面未自动刷新,且生成的医嘱名称与科室数据错误

重现步骤

  1. 登录住院医生工作站选择在科患者002当前科室呼吸内科病房
  2. 进入"临床医嘱"页面,点击【转科】唤起申请弹窗
  3. 选择"转入科室"为【临床心理科】,"转入病区"为【第二病区】,填写原因后点击【确认】
  4. 弹窗关闭且提示"转科申请已提交"后,观察医嘱列表状态
  5. 手动点击【刷新数据】按钮后,核对自动生成的转科医嘱

期望结果

  1. 提交成功后自动刷新医嘱列表
  2. 医嘱名称应为"转科-临床心理科"
  3. 药房/科室应为患者当前科室"呼吸内科病房"

实际结果

  1. 未自动刷新,需手动点击"刷新数据"按钮
  2. 医嘱名称仅为"转科",缺少转入科室名
  3. 药房/科室显示为"信息科"(系统管理科室),完全错误

二、根因分析

本 Bug 包含 3 个独立问题,根因分布在前端和后端:

问题1未自动刷新

根因:前端 transferOrganizationDialog.vue 在成功提交后没有 emit('success'),且父组件 order/index.vue 没有给该对话框绑定 @success 处理函数。

对比已正常工作的出院对话框 leaveHospitalDialog.vue

  • 出院对话框有 emit('success') 调用
  • 父组件有 @success="handleLeaveHospitalSuccess"getListInfo(false) 刷新列表
  • 转科对话框两处都缺失

涉及文件

  • healthlink-his-ui/src/views/inpatientDoctor/home/components/order/applicationForm/transferOrganizationDialog.vue第149行附近 submitApplicationForm
  • healthlink-his-ui/src/views/inpatientDoctor/home/components/order/index.vue第673行 <TransferOrganizationDialog>

问题2医嘱名称仅为"转科"

根因:后端 SpecialAdviceAppServiceImpl.saveTransferOrganizationOrders() 中,ServiceRequest 的名称使用了诊疗目录定义的默认名称"转科"(来自 CommonConstants.BusinessName.TRANSFER_ORGANIZATION = "转科"),没有拼接转入科室名称。

涉及文件

  • healthlink-his-server/.../regdoctorstation/appservice/impl/SpecialAdviceAppServiceImpl.javasaveTransferOrganizationOrders 方法约第300行

问题3药房/科室显示为"信息科"

根因:后端 saveTransferOrganizationOrders() 中设置了 serviceRequest.setOrgId(activityAdviceBaseDto.getPositionId()),其中 activityAdviceBaseDto 是从诊疗目录activity definition获取的默认数据positionId 对应的科室是"信息科"(转科医嘱定义的默认归属科室),而非患者当前所在科室。

对比出院医嘱 saveLeaveHospitalOrders() 使用了 activityAdviceBaseDto.getPositionId() 但出院医嘱没有这个问题(因为出院后不需要药房/科室归属)。转科医嘱需要显示的是患者当前所在的科室(转出科室)。

前端 patientInfo store 中有 inHospitalOrgId入科科室ID但后端 TransferOrganizationParam 没有传入原科室参数。

涉及文件

  • healthlink-his-server/.../regdoctorstation/appservice/impl/SpecialAdviceAppServiceImpl.javasaveTransferOrganizationOrders 方法)
  • healthlink-his-server/.../regdoctorstation/dto/TransferOrganizationParam.java(缺少 originalOrganizationId 字段)
  • healthlink-his-ui/.../order/applicationForm/transferOrganizationDialog.vue(未传入原科室参数)

三、修复方案

修复1自动刷新

文件transferOrganizationDialog.vue

  // 在 <script setup> 中添加 emit 定义
+ const emit = defineEmits(['success']);

  // submitApplicationForm 中成功后 emit
  transferOrganization(form).then((res) => {
    if (res.code == 200) {
      proxy.$modal.msgSuccess('转科申请已提交');
      dialogVisible.value = false;
+     emit('success');
    }
  });

文件order/index.vue

  <TransferOrganizationDialog 
    ref="transferOrganizationRef" 
+   @success="handleTransferOrgSuccess"
  />

  // 添加回调函数(在 handleTransferOrg 函数附近)
+ function handleTransferOrgSuccess() {
+   getListInfo(false);
+ }

修复2医嘱名称拼接科室

文件SpecialAdviceAppServiceImpl.javasaveTransferOrganizationOrders 方法)

在创建 ServiceRequest 后、save 前,根据 targetOrganizationId 查询转入科室名称并拼接到请求名称中:

  serviceRequest.setRequesterId(practitionerId); // 开方医生
  serviceRequest.setEncounterId(encounterId); // 就诊id
- serviceRequest.setOrgId(activityAdviceBaseDto.getPositionId()); // 执行科室见修复3
+ // 查询转入科室名称,拼接到医嘱名称
+ // 原名称"转科" → "转科-转入的科室名称"
  serviceRequest.setConditionId(conditionId); // 诊断id
  serviceRequest.setEncounterDiagnosisId(encounterDiagnosisId); // 就诊诊断id

需要在 ServiceRequest 上设置名称。具体做法:在 AdviceManageAppMapperSpecialAdviceAppMapper 中添加查询方法,根据 targetOrganizationId 查询科室名称,然后:

// 设置医嘱显示名称为 "转科-转入科室名"

修复3药房/科室使用患者当前科室

文件TransferOrganizationParam.java

+ /** 原科室(患者当前所在科室) */
+ @JsonSerialize(using = ToStringSerializer.class)
+ private Long originalOrganizationId;

文件transferOrganizationDialog.vue

  form.encounterId = patientInfo.value.encounterId
  form.patientId = patientInfo.value.patientId
+ form.originalOrganizationId = patientInfo.value.inHospitalOrgId

文件SpecialAdviceAppServiceImpl.java

- serviceRequest.setOrgId(activityAdviceBaseDto.getPositionId()); // 执行科室(诊疗定义默认)
+ serviceRequest.setOrgId(transferOrganizationParam.getOriginalOrganizationId()); // 执行科室(患者当前科室)

四、路由决策

FIXER: zhaoyun + guanyu(联合修复)

REASON:

  • zhaoyun赵云/前端) 负责修复1自动刷新修改 transferOrganizationDialog.vue 添加 emit('success'),修改 order/index.vue 添加 @success 回调——纯前端改动
  • guanyu关羽/后端) 负责修复2和修复3医嘱名称+科室ID修改 TransferOrganizationParam.java 添加 originalOrganizationId 字段,修改 SpecialAdviceAppServiceImpl.javasaveTransferOrganizationOrders 方法——纯后端改动

两个修复互不依赖可以并行实施。但由于修复3后端接收 originalOrganizationId)需要前端配合传参,建议由 zhaoyun 先改前端修复1+修复3前端部分guanyu 同时改后端修复2+修复3后端部分最后联调验证


路由决策

  • FIXER_ID: guanyu
  • 修复 Agent: guanyu后端
  • 原因: LLM 分析决策

⚠️ 修复人员请先验证以上分析是否正确,再执行修复。