Files
his/MD/bugs/BUG_734_ANALYSIS.md

5.1 KiB
Raw Permalink Blame History

Bug #734 诸葛亮分析报告

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


基本信息

  • Bug #: 734
  • 标题: 【住院医生站-临床医嘱】医嘱开具时录入框右侧缺少最小单位与剂量单位的动态换算公式说明2袋 = 30 g
  • 模块: 住院医生工作站
  • 提出人: 陈显精

Now I have a complete picture. Let me output the analysis.


Bug #734 分析报告

一、Bug 理解

禅道标题: 【住院医生站-临床医嘱】医嘱开具时录入框右侧缺少最小单位与剂量单位的动态换算公式说明2袋 = 30 g

重现步骤:

  1. 登录"住院医生工作站",进入"临床医嘱"页面
  2. 点击【新增】录入一条医嘱,在药品搜索栏输入并选择"荆防颗粒"
  3. 在"单次用量"输入框中输入2单位
  4. 观察"单次用量"单位下拉框右侧的公式显示区域

期望结果: 系统应自动读取该药品的计量换算值15与剂量单位g在单次用量右侧动态显示换算等式2袋 = 30 g (2×15g)

附图关键信息:

  • 图片2539/2540临床医嘱录入表单中单次用量输入框值=2和单位下拉框值=袋)右侧的红框区域为空白
  • 图片2541药品目录荆防颗粒的配置数据 — 计量换算=15剂量单位=g最小单位=袋
  • 临时医嘱同样缺失此公式显示

总结: 医生在开具临床医嘱时,输入单次用量后无法看到最小单位与剂量单位之间的换算公式说明。系统已有换算比例数据(unitConversionRatio=15),但前端未将其渲染为可视化的换算公式文本。


二、根因分析

根因:前端模板缺少换算公式的渲染逻辑

数据流追踪全链路6环

状态 说明
⑤ 存储 medication_detail 表有 unit_conversion_ratio 字段值为15
④ 持久化 DoctorStationAdviceAppMapper.xml 第14行 abi.unit_conversion_ratio 已查询
③ 业务 AdviceBaseDto.unitConversionRatio 字段已定义,数据正常返回
② 验证 API正常返回 unitConversionRatio: 15
① 录入 OrderForm.vue没有换算公式的显示区域

具体分析:

  1. 后端数据完整AdviceBaseDtounitConversionRatioBigDecimalMapper SQL 已查询该字段
  2. 前端数据可达setValue(row) 中通过 ...baseRow 展开,row.unitConversionRatio 在行数据上可用
  3. 已有换算逻辑index.vue:2973convertValues() 函数已使用 row.unitConversionRatio 进行数值转换
  4. 缺失UI展示OrderForm.vue 在"单次用量" + "单位"下拉框之后,没有任何显示换算公式的元素

涉及文件:

  • OrderForm.vue:109-126 — 长期医嘱表单,单位下拉框后缺少公式显示
  • OrderForm.vue:352-362 — 临时医嘱表单,单位下拉框后缺少公式显示
  • useOrder.js — 已有 convertValue 逻辑(数值计算),无需修改

三、修复方案

修改文件: healthlink-his-ui/src/views/inpatientDoctor/home/components/order/OrderForm.vue

修改内容: 在两处单位下拉框(minUnitCode select之后添加换算公式显示元素。

修改点1长期医嘱表单约第125行后

</el-select>minUnitCode</div>form-group关闭之间添加

<span
  v-if="row.unitConversionRatio && row.doseQuantity"
  style="font-size: 13px; color: #409eff; margin-left: 4px; white-space: nowrap"
>
  {{
    row.doseQuantity
    + ' '
    + (row.unitCodeList?.find(i => i.value === row.minUnitCode && i.type === 'minUnit')?.label || '')
    + ' = '
    + (row.doseQuantity * row.unitConversionRatio)
    + ' '
    + (row.unitCodeList?.find(i => i.type === config.unitMap['dose'])?.label || '')
    + ' ('
    + row.doseQuantity + '×' + row.unitConversionRatio
    + ')'
  }}
</span>

修改点2临时医嘱表单约第356行后

同样在 minUnitCode 的 </el-select> 之后,添加相同的换算公式显示元素。

公式渲染逻辑:

  • 条件:row.unitConversionRatio 存在且 row.doseQuantity 有值时才显示
  • 格式:{剂量}{最小单位} = {剂量×换算比} {剂量单位} ({剂量}×{换算比})
  • 示例:2袋 = 30 g (2×15g)
  • 样式:蓝色小字(#409eff),不换行(white-space: nowrap

不需要修改后端:数据链路完整,unitConversionRatio 已正确返回。


四、路由决策

FIXER: zhaoyun REASON: 纯前端模板修改,只需在 OrderForm.vue 两处添加换算公式显示元素属于UI展示层修复无后端改动。


路由决策

  • FIXER_ID: zhaoyun
  • 修复 Agent: zhaoyun前端
  • 原因: ** 纯前端模板修改,只需在 OrderForm.vue 两处添加换算公式显示元素属于UI展示层修复无后端改动。

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