药库采购计划模板审计与修正
Overview
审计医院药库已有的"药品采购计划"Excel 模板的公式逻辑,判断合理性,并在保留原表格结构的前提下做针对性修正。与 pharm-procurement-plan(从消耗数据生成计划)互补:本 skill 处理"已有模板的公式审计 + 修正"。
何时使用
- 用户发来一个采购计划 xlsx,问"公式合不合理 / 帮我看看 / 帮我改公式 / 优化采购模板"。
- 模板含
SUMIF/ROUND/CEILING等公式,汇总表由各药房计划汇总而成。 - 典型案例结构(汇总表):
药品编码/名称/规格/单位+药库上月入库(E)/出库(F)/盘点(G)/周转(H)+各药房计划(I..O)+全院计划(P)+本月已入库(Q)+备注(R)。
环境准备(managed Python + openpyxl)
脚本用 openpyxl 读取公式与缓存值。运行脚本时若 openpyxl 缺失会自动装到托管 venv;也可手动:
<managed python> -m venv <managed>/envs/default
<managed>/envs/default/Scripts/python.exe -m pip install openpyxl
读取要点:load_workbook(path, data_only=False) 拿公式,load_workbook(path, data_only=True) 拿缓存值。若所有公式缓存值为 None/0,说明是空白模板——此时分析对象是公式逻辑而非具体数字(这正是常见情况)。
审计流程(按严重度)
先用 scripts/audit_procurement_template.py <file.xlsx> 跑出逐项发现,再人工复核。核心检查项:
高危 🔴
- 周转列 H = 出库 − 盘点(F−G):盘点是库存快照非流量,减之无业务含义,会算出负周转。修正:
H = F(周转量=出库量)。 - P 用
ROUND(...,−1)十位取整:低用量药(裸量 0.4)被舍成 0 → 漏采断货。修正:CEILING(裸量, 1)(向上取整到最小订购单位);若药品只能整件买,加"最小包装量"列改用CEILING(裸量, 最小包装量)。 - P 误扣 Q("目前入库情况"):⚠️ 这是常见误判。Q 列是参考列,不可计入 P——因为采购计划须每月 10 日前完成,本月实际已入库量可能已大于算出的计划量,故 Q 只供人工参考、不参与计算。审计时若发现 P 含 Q 才提示(
P_SUBQ中危);若 P 不含 Q 则为正确,勿误报。
中危 🟠
- P 无负值保护:当
Σ计划×系数 < 盘点时 P 变负/舍成0,库存虚高则断货。须加IF(裸量<=0,0,...)。
中危 🟠
- 需求基准用"药房申报数"而非"药库实际消耗",再 ×系数放大 → 放大下游误差。
- 固定系数(如 1.25)未按药品分层(慢病/急救/高值/近效期变异度不同)。
- 扣减的是"上月盘点 G"而非"编制日实时库存" → 时点错配。
- 子表列号写死且不统一(如多数取 G 列、输液仓取 E 列)→ 粘贴错位即漏算。
低危 🟡
- 零历史(新增)药品无首单提示;上月数据异常值未剔除。
> 关于 Q 列("目前入库情况"):本模板里它是参考列,不计入 P。理由:采购计划须每月 10 日前完成,本月实际已入库量可能已大于算出的计划量,所以 Q 只摆出来供人工参考、用于"积压预警"的参考信号,绝不可从 P 中扣减。审计/修正时务必保留此规则。
修正流程(保留结构,直接改公式)
用 scripts/fix_procurement_template.py <input.xlsx> [output.xlsx]:
- 默认输出 <input>_修正版.xlsx,不覆盖原文件。
- 对汇总表每个有药品编码的行:
- H = =F{r}(修周转错误,去掉 -盘点)。
- P = =IF((I{r}+..+O{r})*1.25-G{r}<=0,0,CEILING((I{r}+..+O{r})*1.25-G{r},1))(负值保护 + 向上取整;不扣 Q,Q 仅参考)。
- 右侧新增(不破坏原 A..R 结构)断货预警 / 积压预警 两列公式(积压预警可引用 Q 作参考信号)。
- 若源子表为空,改后公式值仍为 0,填入数据后自动生效。
标准模型(深度修正参考,需加列)
仅改公式无法解决"系数分层 / 扣在途 / 安全库存下限 / 最小包装"——这些需新增列。详见 references/standard_model.md。标准可解释模型:
日均消耗 = 近N月消耗 ÷ (N×30)
覆盖需求 = 日均消耗 × (采购提前期 + 补货周期)
裸采购量 = 覆盖需求 + 安全库存 − 当前实时库存 − 在途量 − 本月已入库
建议采购量 = CEILING(裸采购量 ÷ 最小包装量, 1) × 最小包装量 # 向上取整到整件
若 裸采购量 ≤ 0 → 不采购
自检清单(输出前)
- [ ] 已用 audit 脚本跑出发现并核对严重度
- [ ] 修正后 P 不含 Q 扣减(Q 仅参考),并保留负值保护
- [ ] 取整是否改为 CEILING 而非 ROUND(...,−1)
- [ ] H 周转是否改为 =出库(去掉 -盘点)
- [ ] 是否新增预警列且不破坏原 A..R 结构
- [ ] 原文件未被覆盖(输出为 _修正版)
- [ ] 已说明剩余未解项(固定系数/在途/安全库存)及需要的列
Resources
scripts/audit_procurement_template.py— 读取模板、输出公式+缓存值、按严重度列出审计发现。scripts/fix_procurement_template.py— 应用 H/P/预警修正,保存修正版副本。references/standard_model.md— 标准采购公式模型与需加列的深度修正方案。