# 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 新增 `执行记录`(**无 v-hasPermi**) - 模板底部挂载 `` - 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 - 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 对齐)