Files
his/MD/bugs/BUG_714_ANALYSIS.md

5.7 KiB
Raw Blame History

Bug #714 诸葛亮分析报告

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


基本信息

  • Bug #: 714
  • 标题: 【住院护士站-医嘱校对】住院护士站-医嘱核对界面:缺少“截止时间”过滤条件且默认单选未选中“全部”
  • 模块: 病区护士工作站
  • 提出人: 陈显精

分析完毕。以下是完整输出。


一、Bug 理解

Bug 标题:【住院护士站-医嘱校对】住院护士站-医嘱核对界面:缺少"截止时间"过滤条件且默认单选未选中"全部"

重现步骤

  1. 登录系统,进入"住院护士站"菜单
  2. 点击进入"医嘱核对"页面,选中左侧"在科"列表中的某位患者
  3. 观察右侧查询条件区域(包含"未校对/已校对/已停止/已退回"四个标签页)

结果

  1. 过滤条件中缺少"截止时间"时间控件,无法限制截止时间进行医嘱筛选
  2. 医嘱分类单选框默认未自动选中"全部"
  3. 切换到"已校对/已停止/已退回"标签页时,同样缺失截止时间字段

期望

  1. 四个标签页均应增加"截止时间"查询条件
  2. "截止时间"默认显示为系统当前时间,且支持手动编辑/选择
  3. 页面初始化默认选中"全部"单项

附图关键信息:截图清晰显示查询条件区域仅有"医嘱分类"(全部/长期/临时)单选框和"查询"按钮无截止时间DatePicker控件且"全部"选项未处于选中状态。

综合总结:用户在住院护士站医嘱核对界面无法按时间节点批量筛选医嘱,因为查询区域缺少截止时间过滤条件。同时初始化时医嘱分类默认未选中"全部",不利于日常操作。这是一个典型的设计缺陷——查询条件不完整影响护士工作效率。


二、根因分析

经代码全链路追踪Bug 涉及前端组件 + 后端 DTO + Service + Mapper 四层:

前端层medicalOrderProofread/components/prescriptionList.vue

  1. <el-radio-group> 中"全部"选项的 :value 原为 nullcommit 376ddd46f 中添加),导致 type 初始值为 nullUI 上无选项被选中
  2. 组件中完全没有 <el-date-picker> 日期选择控件,无法选择截止时间
  3. handleGetPrescription() 构造请求参数时未传递 deadline 字段

后端 DTO 层InpatientAdviceParam.java

  • deadline 字段已存在(在初始重构中引入),但此前未被 Service 层实际使用

Service 层AdviceProcessAppServiceImpl.javagetInpatientAdvicePage()

  • 未提取 deadline 参数,未在 QueryWrapper 中拼接时间范围条件

Mapper 层AdviceProcessAppMapper.xml

  • SQL 使用 ${ew.customSqlSegment} 拼接条件Service 未设置条件则 SQL 无截止时间过滤

根因总结:前端查询组件设计时遗漏了截止时间控件,且默认值设置不当;后端虽然 DTO 有字段但 Service 层未处理该参数,导致整条链路断裂。


三、修复方案(⚠️ 已在 ca812421d 中修复)

注意:经过 git 历史追踪,此 Bug 的修复已作为 Bug #665 的附带修复在 commit ca812421d 中完成。以下是修复内容详解:

3.1 前端修复(prescriptionList.vue

修改点 修改前 修改后
Radio 默认值 :value="null" :value="0"
type 初始值 ref(null) ref(0)
截止时间控件 新增 <el-date-picker> (datetime类型)
deadline 初始值 ref(formatDateStr(new Date(), 'YYYY-MM-DD') + ' 23:59:59')
查询参数 无 deadline ...(deadline.value ? { deadline: deadline.value } : {})
therapyEnum 条件 type.value != null type.value !== 0(仅非"全部"时传递)

3.2 后端修复(AdviceProcessAppServiceImpl.javagetInpatientAdvicePage()

新增代码逻辑:

// 提取 deadline 手动处理
String deadline = inpatientAdviceParam.getDeadline();
inpatientAdviceParam.setDeadline(null);
// ...
// 手动拼接 deadline 条件,按医嘱截止时间筛选
if (deadline != null && !deadline.isEmpty()) {
    LocalDateTime deadlineTime = LocalDateTime.parse(deadline,
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    queryWrapper.le("end_time", deadlineTime);  // ≤ 截止时间
}

3.3 四标签页覆盖机制

index.vue 中四个 tab 各创建独立的 PrescriptionList 实例,每个实例维护独立的 typedeadline ref。切换 tab 时通过 provide/inject + ref 调用目标 tab 组件的 handleGetPrescription(),四标签页均能独立使用截止时间过滤。

3.4 验证检查项

  • 前端编译通过(npm run build:dev
  • 后端编译通过(mvn clean compile -DskipTests
  • "未校对" tab截止时间默认为当日 23:59:59可编辑
  • "全部" radio 默认选中,查询结果包含长期+临时
  • "已校对/已停止/已退回" tab 同样有截止时间控件
  • 修改截止时间后点"查询",结果正确过滤

四、路由决策

FIXER: zhaoyun前端为主+ guanyu后端 Service 层配合)

REASON: Bug 涉及前端 UI 组件DatePicker 控件新增 + Radio 默认值修正)占主要工作量,交赵云处理;后端 Service 层 deadline 条件拼接需关羽配合验证 SQL 正确性。但此 Bug 已在 ca812421d commit 中修复完成,若禅道状态仍为 active建议直接关闭并更新禅道状态为"已解决"。


路由决策

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

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