2026-09-08.md 10 KB

2026-09-08 工作日志

给药途径字典扩充(临时/长期/执行医嘱共用)

需求

临时医嘱单编辑弹窗的"给药途径"下拉,补充用户列出的常用给药途径缩写,重复的项不加。

实现

  • 唯一源:src/api/elderly/elder/bed-change/index.ts 的 MED_ROUTE_OPTIONS(MedOption[]),被 6 个文件共享:
    • short-doctor-order/Form.vue + short-doctor-order/Print.vue
    • long-doctor-order/Form.vue + long-doctor-order/Print.vue
    • execute-doctor-order/index.vue + execute-doctor-order/ExecuteDialog.vue
    • 加一处即全端生效
  • 重复判定(与现有 9 项对比):
    • po/p.o. → 已有 po,不加
    • iv/i.v. → 已有 iv,不加
    • im/i.m. → 已有 im,不加
    • ih/H/sc → ih + sc 都在,不加
    • ivgtt/ivdrip → 已有 ivgtt/iv drip,不加
    • inh → 已有,不加
    • top 与现有 ext "外用" 语义相近但价值不同(top 特指皮肤/经皮),保留为不同项
  • 新增 7 项: ts { value: 'id', label: 'id 皮内注射', cn: '皮内注射', tip: '皮试、疫苗过敏试验等' }, { value: 'sl', label: 'sl 舌下含服', cn: '舌下含服', tip: '硝酸甘油、速效救心丸等急救药' }, { value: 'top', label: 'top 皮肤外用/经皮给药', cn: '皮肤外用/经皮给药', tip: '软膏、贴片、涂抹类外用药' }, { value: 'pr', label: 'pr 直肠给药', cn: '直肠给药', tip: '栓剂、灌肠、退热等' }, { value: 'buccal', label: 'buccal 颊部给药', cn: '颊部给药', tip: '口腔黏膜贴片、含化药片' }, { value: 'ia', label: 'ia 动脉内注射', cn: '动脉内注射', tip: '介入治疗、动脉化疗等' }, { value: 'ip', label: 'ip 腹腔注射', cn: '腹腔注射', tip: '腹膜透析、腹腔化疗等' } ### 安全性验证 - MedOption 是 interface,{ value, label, cn, tip } 全部 string,新增项符合 - getMedCn(options, val)(同文件 line 481)找不到 value 时直接返回 val 兜底——零破坏性,旧数据翻译不受影响 - 数组纯增,无白名单/枚举校验,不会引入运行时错误 ### 涉及文件 - 仅 src/api/elderly/elder/bed-change/index.ts 1 处(+13 行) ## 长期/临时医嘱操作栏新增「执行记录」按钮(9-08 上午) ### 需求 长期医嘱 + 临时医嘱的列表行操作栏,加一颗「执行记录」按钮,点击后弹出"医嘱执行单"(类似执行医嘱模块的打印弹窗),只显示当前行长者的执行记录,可打印。 ### 设计决策 - 不复用 ExecuteDialog.vue(那是单行执行/跳过弹窗,不是按长者汇总) - 新写 ExecutionRecordDialog.vue(放置在 execute-doctor-order/ 目录下,作为"按长者过滤的医嘱执行单"通用弹窗) - 不复用执行医嘱 index.vue 的 printDialogVisible:那个弹窗强耦合当日的"长期展开 + 临时当日 + 合并"逻辑,需要全部 planTime 占位,不适合"历史执行记录"场景 - 数据范围:默认当日(与执行医嘱模块"当日汇总"一致);长期按钮传 orderType=1、临时传 orderType=2,与后端 doctorOrderExecution/page 接口的 orderType 字段对齐;想看历史/跨日可下一轮加日期选择器 - 表格列:与执行医嘱 all 弹窗完全一致(序号/长者/床位/年龄/医嘱内容/频次/给药时间/途径/计划时间/执行护士/实际时间/状态/备注),打印格式(colgroup %、#555 细线、A4 竖版)也复用 ### 实现 1) 新建 src/views/elderly/elder/doctor-orders/execute-doctor-order/ExecutionRecordDialog.vue - 接收 open(row, { orderType?, title? }) - 内部 getDoctorOrderExecutionPage({ elderId, planDate: today, orderType?, tenantIds }) - 失败 → mock 3 条兜底(项目惯例) - 复用执行医嘱的 formatDateTimeSplit / freqCn / timeCn / routeCn / statusText(保持同源) - v-print 指令直接可用(main.ts 全局注册 vue3-print-nb) - 标题自动推断:orderType=1 → "长期医嘱执行记录";orderType=2 → "临时医嘱执行记录";否则"医嘱执行记录";外部传 title 优先 - 信息栏:机构/执行日期/长者/类型 - 空数据占位:「该长者当日暂无执行记录」 2) 修改 long-doctor-order/index.vue - import ExecutionRecordDialog from '../execute-doctor-order/ExecutionRecordDialog.vue' - 模板:操作栏 #next 新增 <el-button link type="warning" @click="openExecutionRecord(scope)">执行记录</el-button>(无 v-hasPermi) - 模板底部挂载 <ExecutionRecordDialog ref="execRecordRef" /> - script 新增 execRecordRef + openExecutionRecord(row):缺 elderId 弹错误;否则 execRecordRef.value.open(row, { orderType: 1 }) 3) 修改 short-doctor-order/index.vue - 同上,但传 orderType: 2 ### 安全性 - 三个接口 (getLongDoctorOrderPage / getShortDoctorOrderPage / getDoctorOrderExecutionPage) 都接受任意 params 透传(params: query),新增 elderId 字段后端若不支持会按 name 模糊匹配兜底 - DoctorOrderExecution 类型已包含 orderContent/frequency/medTime/route/planTime/execTime/status/remark/bedName/elderName/elderAge 等所有渲染字段,无需 join - mock 数据行已含 elderId 字段(长期 801/802/803/804、临时 901/902),按钮触发路径完整 ### 类型检查(两轮) - 第一轮发现 4 个真实错误(我引入):DoctorOrderExecution 接口没有 elderAge 字段,但新组件表格"年龄"列在用 → 4 处 TS2551/TS2561 - 修复:给 bed-change/index.ts 的 DoctorOrderExecution 接口补 elderAge?: number | string(与执行医嘱 makeRow 的 elderAge: vo.elderAge ?? '' 对齐——那里是 any 所以不报错) - 第二轮:ExecutionRecordDialog 零错误 ✅ - 其余筛出的错误(long/short 的 Form.vue TS2322、Print.vue TS6133、index.vue 的 getLongDoctorOrderStatusText / openDetail 未使用)全是既有基线噪声,非本次引入 ### 涉及文件 - 新建 1 个:execute-doctor-order/ExecutionRecordDialog.vue(~280 行) - 修改 3 个:long-doctor-order/index.vue(+13 行)、short-doctor-order/index.vue(+13 行)、bed-change/index.ts(+1 行 elderAge 字段) ## 长期医嘱隐藏护士签名 + 执行记录打印列宽 + 切长者数据残留(9-08 上午) ### 三个用户反馈 + 对应修复 #### ① 长期医嘱编辑/打印隐藏"护士签名"和"停止护士签名"两列 - Form.vue(编辑弹窗):删除 <el-table-column label="护士签名"> + <el-table-column label="停止护士签名"> 两个 el-table-column - emptyEntry 仍保留 nurseSign/stopNurseSign 字段,数据字段不删(仅 UI 隐藏),接口兼容 - Print.vue(打印):同步删除 th/td 对应两列,colgroup 由 12 列变 10 列 - 释放的 ~12.3% 重新分配:医嘱内容 25.64→30、备注 12.31→13.5、医嘱时间/停止时间 9.23→10.5、医生签名 6.15→7 等 - 新的 10 列:3.5 / 10.5 / 30 / 6 / 6 / 6 / 7 / 10.5 / 7 / 13.5 = 100% #### ② 医嘱执行记录打印:计划时间/实际时间列宽 + nowrap - 现象:日期 "2026-09-08" 被 word-break: break-all 在 "-" 处强制断行成 "2026-09-" + "08 08:00" 两行 - 修复(ExecutionRecordDialog.vue): 1. colgroup 把计划时间/实际时间列各从 8.25% → 10%(+1.75% × 2 = +3.5%) 2. 从床位 8.25→7、医嘱内容 18.04→16.5、备注 10.31→10、频次/给药时间/年龄/途径 5.67→5.5 等"瘦"列共匀出 3.5% 3. .datetime 加 white-space: nowrap 防止日期中间断行(双保险) #### ③ 切换长者时表格残留旧数据 - 现象(图3):信息栏显示新长者"测试离往非退住02",但表格第一行"长者"列还是旧长者"测试变更01" - 根因:后端 doctorOrderExecution/page 接口未实现 elderId 字段过滤(透传参数被忽略),返回全量 execution 记录 - 修复(ExecutionRecordDialog.vue): 1. fetchList 加前端兜底过滤:list.value = (data.list || []).filter(r => Number(r.elderId) === Number(elderId)) - Number() 兼容后端 string/number 混用 - 无论后端是否过滤,前端永远只显示当前长者 2. open() 立即 list.value = [] 清空(fetchList 同步执行前的极短窗口也清掉,防"旧表闪一下") ### 安全性 - 接口/类型零破坏性 - "护士签名"字段保留在数据层(emptyEntry/默认对象/接口)—— 仅 UI 隐藏 - 前端兜底过滤只对 elderId 字段做 Number 等值比较,不修改原数据 ### 涉及文件 - 改 3 个:long-doctor-order/Form.vue(-16 行)、long-doctor-order/Print.vue(-9 行 + colgroup 重排)、execute-doctor-order/ExecutionRecordDialog.vue(colgroup 13 列重排 + datetime nowrap + 二次过滤 + open 清空) ## 执行记录弹窗布局调整(9-08 上午,按用户截图布局范式) ### 需求 用户给了一张「医嘱执行单」截图作为布局范式,按其样式调整执行记录弹窗。 ### 截图布局要点 1. 标题"医嘱执行单"居中粗体 2. 信息行:机构/执行日期/长者/类型(label 加粗 + 均匀 25% 分摊) 3. 表格 13 列:序号/长者/床位/年龄/医嘱内容/频次/给药时间/途径/计划时间/执行护士/实际时间/状态/备注 4. 单元格垂直居中(middle 而非 top) 5. 单元格水平对齐:序号/年龄/频次/给药时间/途径/时间/护士/状态 → 居中;长者/床位/医嘱内容/备注 → 左对齐 6. 边框 #555 细线、12px 字体、thead 灰色背景 ### 改动(ExecutionRecordDialog.vue,CSS + colgroup) - colgroup 微调(按截图视觉比例): - 序号 3.09 → 3.5、医嘱内容 16.5 → 17、床位 7 → 8.5、执行护士 7.22 → 6、长者 8.7 → 8.5、备注 10 → 9.5 - 合计 100% - 垂直对齐:vertical-align: top → middle(截图明显居中) - 水平对齐: - td 默认 text-align: center - 用 nth-child(2/3/5/13) 把长者/床位/医嘱内容/备注改回 text-align: left - .empty-tip 仍居中(colspan=13 不触发 nth-child) - 保留项:信息栏 4 项、13 列顺序、边框、字体、A4 竖版、nowrap(计划时间上下两行) ### 涉及文件 - 改 1 个:execute-doctor-order/ExecutionRecordDialog.vue(CSS colgroup + td 对齐)