临时医嘱单编辑弹窗的"给药途径"下拉,补充用户列出的常用给药途径缩写,重复的项不加。
src/api/elderly/elder/bed-change/index.ts 的 MED_ROUTE_OPTIONS(MedOption[]),被 6 个文件共享:
short-doctor-order/Form.vue + short-doctor-order/Print.vuelong-doctor-order/Form.vue + long-doctor-order/Print.vueexecute-doctor-order/index.vue + execute-doctor-order/ExecuteDialog.vuets
{ 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 对齐)