场景02:药品效期预警
当前阶段: 🔍 探索中 | 行业: 医疗健康 | 关键词: 药品管理、效期管理、过期预警 | 返回医疗场景 →
一、需求探索
1.1 痛点时刻
具体场景:
周三上午,药房主任在例行检查时发现,一批价值2万元的注射用头孢曲松钠(200盒)已过期1周。查询发现:
- 这批药品效期为5月15日,今天是5月22日
- 药房没有收到任何效期预警
- 药品仍在货架上,差点被发放给患者
- 现在只能报损处理,损失2万元
药房主任解释:"我们有1000多种药品,每天都要盘点效期根本忙不过来。如果有自动提醒就好了。"
业务背景:
- 药品规模:中型医院药品SKU 1000-3000个,库存总量5-10万盒
- 效期管理:每批药品都有效期,需要先进先出(FIFO)
- 管理部门:药房负责日常管理,药剂科负责监督
- 监管要求:《药品管理法》要求不得使用过期药品,违者将被处罚
1.2 核心痛点
问题1:发现滞后
- 药品效期记录在系统中,但没有自动预警
- 依赖人工每天盘点,工作量大,容易遗漏
- 发现时往往已经过期,只能报损
问题2:处理不及时
- 效期临近的药品应该优先使用,但没有提醒机制
- 采购部门不知道哪些药品即将过期,继续采购导致积压
- 没有"近效期药品清单",无法及时处理
问题3:责任不清
- 过期药品无法追溯谁负责、为什么没发现
- 药房和采购部门互相推诿责任
- 缺少完整的预警和处理记录
1.3 业务规则(行业标准)
《药品管理法》相关要求:
- 药品经营企业应当按照国家有关规定建立药品追溯制度(第34条)
- 禁止生产、销售、使用假药、劣药(第98条)
- 过期药品按劣药论处(第98条第2款)
- 使用过期药品的,由县级以上卫生主管部门责令改正,给予警告,没收违法所得,并处罚款(第117条)
实际业务规则(基于行业调研):
- 提前3个月预警:效期前3个月 → 推送预警,加快使用
- 提前1个月报警:效期前1个月 → 推送报警,停止采购
- 提前7天紧急:效期前7天 → 紧急处理,优先使用或退货
- 过期自动锁定:过期当天 → 自动锁定,禁止发放
成本测算:
- 报损成本:过期药品报损,平均每月损失1-3万元
- 处罚成本:使用过期药品被检查发现,罚款5万-50万元
- 医疗事故:使用过期药品导致医疗事故,赔偿金额巨大
- 平衡点:宁可提前处理,不可过期使用
二、方案设计
2.1 业务规则设计
规则1:效期判定规则
typescript
// 药品效期判定
interface DrugExpiry {
// 判定条件
expiryDate: Date; // 效期日期
currentDate: Date; // 当前日期
drugCategory: string; // 药品类别
value: number; // 库存金额
// 判定结果
status: 'NORMAL' | 'WARNING' | 'ALERT' | 'URGENT' | 'EXPIRED';
daysRemaining: number; // 剩余天数(负数表示已过期)
alertLevel: 'INFO' | 'WARNING' | 'CRITICAL';
action: string; // 建议动作
}
// 判定逻辑
function checkDrugExpiry(
drug: Drug,
batch: DrugBatch,
currentDate: Date
): DrugExpiry {
const expiryDate = batch.expiryDate;
const daysRemaining = Math.floor(
(expiryDate.getTime() - currentDate.getTime()) / (1000 * 60 * 60 * 24)
);
if (daysRemaining < 0) {
// 已过期 → 自动锁定
return {
status: 'EXPIRED',
daysRemaining,
alertLevel: 'CRITICAL',
action: '立即锁定,禁止发放,报损处理'
};
} else if (daysRemaining <= 7) {
// 7天内到期 → 紧急处理
return {
status: 'URGENT',
daysRemaining,
alertLevel: 'CRITICAL',
action: '优先使用或联系供应商退货'
};
} else if (daysRemaining <= 30) {
// 1个月内到期 → 报警
return {
status: 'ALERT',
daysRemaining,
alertLevel: 'WARNING',
action: '停止采购,加快使用'
};
} else if (daysRemaining <= 90) {
// 3个月内到期 → 预警
return {
status: 'WARNING',
daysRemaining,
alertLevel: 'INFO',
action: '优先使用,减少采购量'
};
}
return { status: 'NORMAL', daysRemaining };
}规则2:自动预警规则
typescript
// 自动预警动作
interface AutoAlert {
// 提前3个月(预警)
month_3_before: {
condition: '距离效期90天';
notifyTo: ['药房主任', '药品管理员'];
channel: ['系统消息', '微信'];
message: '头孢曲松钠(批号20240515)将在3个月后过期,请优先使用';
displayList: '近效期药品清单(3个月内)';
};
// 提前1个月(报警)
month_1_before: {
condition: '距离效期30天';
notifyTo: ['药房主任', '采购部长', '药剂科长'];
channel: ['系统消息', '微信', '短信'];
message: '头孢曲松钠(批号20240515)将在1个月后过期,请停止采购';
autoAction: '采购系统自动标记"停止采购"';
};
// 提前7天(紧急)
week_1_before: {
condition: '距离效期7天';
notifyTo: ['药房主任', '采购部长', '药剂科长', '分管院长'];
channel: ['系统消息', '微信', '短信', '电话'];
message: '头孢曲松钠(批号20240515)将在7天后过期,请紧急处理';
autoAction: '生成"近效期药品处理单",联系供应商退货';
};
// 过期当天(锁定)
expired_day: {
condition: '效期当天';
notifyTo: ['药房主任', '药剂科长', '医务科长'];
channel: ['系统消息', '微信', '短信'];
message: '头孢曲松钠(批号20240515)已过期,已自动锁定';
autoAction: '药品状态 → 锁定,禁止发放,生成报损单';
};
}规则3:自动锁定规则
typescript
// 药品锁定逻辑
interface DrugLocking {
// 锁定条件
condition: {
expiryDate: Date; // 效期日期 <= 当前日期
status: string; // 药品状态 = '在库'
};
// 锁定动作
actions: {
updateStatus: '药品状态 → 锁定';
blockDispensing: '禁止发放(HIS系统联动)';
generateLossReport: '自动生成报损单';
notifyDepartments: ['药房', '药剂科', '财务科'];
displayWarning: '药品列表显示红色"过期"标识';
};
// 报损流程
lossProcess: {
step1: '药房主任确认报损';
step2: '药剂科长审核';
step3: '财务科记账';
step4: '销毁处理(委托有资质的公司)';
};
}2.2 技术方案
技术架构
药品管理系统 → 定时任务(每天凌晨2点) → 规则引擎 → 预警推送
↓
药品效期数据
↓
HIS系统联动(药品锁定) + 采购系统联动(停止采购)核心技术点
1. 定时任务调度
- 执行时间:每天凌晨2:00检查所有在库药品
- 检查范围:状态为"在库"的药品批次
- 数据来源:药品管理系统的批次效期表
2. 效期判断逻辑
- 计算剩余天数:
(效期日期 - 当前日期) / 86400000 - 判断预警级别:3个月(预警)、1个月(报警)、7天(紧急)、过期(锁定)
- 判断库存金额:高价值药品(>5000元)优先提醒
3. 规则引擎
- 基于时间窗口的规则判断
- 支持规则配置(提前天数可调整)
- 支持药品分类(高价值药品、普通药品)
4. 预警推送
- 多通道推送:系统消息、微信、短信、电话
- 分级推送:预警(微信)、报警(微信+短信)、紧急(微信+短信+电话)
- 推送确认:重要预警需要确认收到
5. 系统联动
- HIS系统:过期药品自动锁定,禁止发放
- 采购系统:效期前1个月自动标记"停止采购"
- 财务系统:自动生成报损单,记账
数据模型
typescript
// 药品信息
interface Drug {
id: string;
name: string; // 药品名称
specification: string; // 规格
manufacturer: string; // 生产厂家
category: string; // 药品类别(抗生素、心血管等)
unitPrice: number; // 单价
status: 'IN_STOCK' | 'LOCKED' | 'OUT_OF_STOCK';
}
// 药品批次
interface DrugBatch {
id: string;
drugId: string;
drugName: string;
batchNumber: string; // 批号
productionDate: Date; // 生产日期
expiryDate: Date; // 效期日期
quantity: number; // 数量
totalValue: number; // 总金额
status: 'NORMAL' | 'WARNING' | 'ALERT' | 'URGENT' | 'EXPIRED';
// 预警记录
alerts: {
sentAt: Date;
type: 'WARNING' | 'ALERT' | 'URGENT' | 'EXPIRED';
recipients: string[];
confirmed: boolean;
}[];
// 处理记录
disposal: {
disposalType: 'USED' | 'RETURNED' | 'LOSS'; // 使用完、退货、报损
disposalAt: Date;
operator: string;
note: string;
};
}三、AI辅助开发方案
3.1 技术迁移分析
复用已有资产:矿山场景的"设备巡检到期预警"规则
相似点:
- 都是基于时间的到期判断
- 都需要提前预警 + 到期报警
- 都需要分级提醒 + 自动处理
差异点:
| 维度 | 设备校准场景 | 药品效期场景 |
|---|---|---|
| 判断对象 | 校准计划 | 药品批次效期 |
| 预警时间 | 到期前7天/15天 | 到期前3个月/1个月/7天 |
| 到期处理 | 设备停用 | 药品锁定 + 报损 |
| 系统联动 | HIS系统 | HIS系统 + 采购系统 + 财务系统 |
技术复用度:90%
- 规则引擎逻辑:100%复用
- 预警推送逻辑:100%复用
- 到期判断逻辑:95%复用(调整时间阈值)
- 新增:采购系统联动、财务系统联动(10%新开发)
3.2 Cursor Skill设计
Skill名称: inspection-overdue-alert.md (直接复用)
调整说明:
- 将"校准计划"改为"药品批次效期"
- 将"7天/15天"改为"3个月/1个月/7天"
- 将"设备停用"改为"药品锁定"
- 新增"采购系统联动"、"财务系统联动"
3.3 PROMPT模板
PROMPT 1:生成效期判断代码
你是一个业务逻辑开发专家。请根据以下业务规则,生成药品效期预警判断的代码。
## 业务场景
药品有效期到期前需要自动预警,过期后需要自动锁定禁止发放。
## 业务规则
1. 效期判定:
- 提前3个月(90天) → 预警
- 提前1个月(30天) → 报警
- 提前7天 → 紧急
- 过期当天 → 自动锁定
2. 预警推送:
- 预警:推送给药房主任、药品管理员(微信)
- 报警:推送给药房主任、采购部长、药剂科长(微信+短信)
- 紧急:推送给药房主任、采购部长、药剂科长、分管院长(微信+短信+电话)
- 锁定:推送给药房主任、药剂科长、医务科长(微信+短信)
3. 自动处理:
- 效期前1个月 → 采购系统标记"停止采购"
- 过期当天 → 药品状态改为"锁定",禁止发放,生成报损单
## 数据模型
- Drug:药品信息(id, name, unitPrice, status)
- DrugBatch:药品批次(drugId, batchNumber, expiryDate, quantity, status)
## 技术要求
- 使用TypeScript
- 定时任务(每天凌晨2:00执行)
- 支持规则配置(提前天数可调整)
- 记录所有预警和处理过程
请生成完整的代码实现。PROMPT 2:生成系统联动代码
你是一个业务逻辑开发专家。请根据以下业务规则,生成药品过期时多系统联动的代码。
## 业务场景
药品过期后,需要联动HIS系统(锁定药品)、采购系统(停止采购)、财务系统(生成报损单)。
## 业务规则
1. HIS系统联动:
- 更新药品状态为"锁定"
- 禁止发放(开单时检查状态)
- 返回提示:"该批次药品已过期,禁止使用"
2. 采购系统联动:
- 标记该药品"停止采购"
- 采购员下单时提示:"该药品有近效期库存,暂停采购"
3. 财务系统联动:
- 自动生成报损单
- 记录报损金额、批号、数量
- 推送给财务科审核
## 技术要求
- 调用各系统API(RESTful接口)
- 支持事务回滚(任一系统更新失败时回滚)
- 记录所有操作日志
请生成完整的代码实现。3.4 开发周期预估
基于已有资产(设备校准场景):
原型验证:1天
- Day 1:复用inspection-overdue-alert规则,调整时间阈值,测试效期判断
首版上线:5-7天
- Day 2:完善预警推送逻辑,对接微信/短信
- Day 3-4:开发HIS、采购、财务系统联动接口
- Day 5:测试药品锁定和报损流程
- Day 6-7:部署上线
迭代优化:根据实际使用反馈调整提前天数、优化预警策略
四、开发资产
4.1 Cursor Skill
文件名: inspection-overdue-alert.md (复用设备校准场景)
调整内容:
markdown
# 药品效期预警规则
## 业务场景
药品有效期到期前需要自动预警,过期后需要自动锁定禁止发放。
## 核心业务规则
### 1. 效期判定规则
**规则一:提前3个月预警**
```typescript
// 效期前3个月预警
function checkWarning_3Months(
batch: DrugBatch,
currentDate: Date
): boolean {
const daysRemaining = Math.floor(
(batch.expiryDate.getTime() - currentDate.getTime()) / (1000 * 60 * 60 * 24)
);
return daysRemaining === 90;
}规则二:提前1个月报警
typescript
// 效期前1个月报警
function checkAlert_1Month(
batch: DrugBatch,
currentDate: Date
): boolean {
const daysRemaining = Math.floor(
(batch.expiryDate.getTime() - currentDate.getTime()) / (1000 * 60 * 60 * 24)
);
return daysRemaining === 30;
}规则三:提前7天紧急
typescript
// 效期前7天紧急
function checkUrgent_7Days(
batch: DrugBatch,
currentDate: Date
): boolean {
const daysRemaining = Math.floor(
(batch.expiryDate.getTime() - currentDate.getTime()) / (1000 * 60 * 60 * 24)
);
return daysRemaining === 7;
}规则四:过期自动锁定
typescript
// 过期当天自动锁定
function checkExpired(
batch: DrugBatch,
currentDate: Date
): boolean {
return batch.expiryDate < currentDate;
}2. 自动预警规则
规则一:分级推送
typescript
async function sendAlert(
drug: Drug,
batch: DrugBatch,
alertType: 'WARNING' | 'ALERT' | 'URGENT' | 'EXPIRED'
) {
const config = {
WARNING: {
recipients: ['药房主任', '药品管理员'],
channels: ['系统消息', '微信'],
priority: 'NORMAL'
},
ALERT: {
recipients: ['药房主任', '采购部长', '药剂科长'],
channels: ['系统消息', '微信', '短信'],
priority: 'HIGH'
},
URGENT: {
recipients: ['药房主任', '采购部长', '药剂科长', '分管院长'],
channels: ['系统消息', '微信', '短信', '电话'],
priority: 'CRITICAL'
},
EXPIRED: {
recipients: ['药房主任', '药剂科长', '医务科长'],
channels: ['系统消息', '微信', '短信'],
priority: 'CRITICAL'
}
};
await notificationService.send({
...config[alertType],
message: generateMessage(drug, batch, alertType)
});
}3. 自动锁定规则
规则一:药品锁定
typescript
async function lockDrug(drug: Drug, batch: DrugBatch) {
// 1. 更新药品批次状态
await drugBatchService.updateStatus(batch.id, 'LOCKED', {
reason: '效期到期',
lockedAt: new Date(),
operator: 'SYSTEM'
});
// 2. HIS系统联动
await hisService.lockDrugBatch(batch.id);
// 3. 生成报损单
const lossReport = await financeService.createLossReport({
drugId: drug.id,
drugName: drug.name,
batchNumber: batch.batchNumber,
quantity: batch.quantity,
totalValue: batch.totalValue,
reason: '效期到期'
});
// 4. 通知相关部门
await notificationService.send({
recipients: ['药房', '药剂科', '财务科'],
message: `${drug.name}(批号${batch.batchNumber})已过期,已自动锁定并生成报损单`
});
}规则二:停止采购
typescript
async function stopPurchasing(drug: Drug, batch: DrugBatch) {
// 效期前1个月,采购系统标记"停止采购"
await purchaseService.markStopPurchasing(drug.id, {
reason: `有近效期库存(批号${batch.batchNumber},${batch.quantity}盒)`,
markedAt: new Date(),
expiryDate: batch.expiryDate
});
}数据模型
药品信息
typescript
interface Drug {
id: string;
name: string;
specification: string;
unitPrice: number;
status: 'IN_STOCK' | 'LOCKED' | 'OUT_OF_STOCK';
}药品批次
typescript
interface DrugBatch {
id: string;
drugId: string;
batchNumber: string;
expiryDate: Date;
quantity: number;
totalValue: number;
status: 'NORMAL' | 'WARNING' | 'ALERT' | 'URGENT' | 'EXPIRED';
alerts: {
sentAt: Date;
type: 'WARNING' | 'ALERT' | 'URGENT' | 'EXPIRED';
recipients: string[];
}[];
}关键处理流程
- 定时检查 → 每天凌晨2:00检查所有在库药品批次
- 效期判断 → 计算剩余天数,判断预警/报警/紧急/过期
- 自动预警 → 分级推送给相关人员
- 停止采购 → 效期前1个月,采购系统标记"停止采购"
- 药品锁定 → 过期当天自动锁定,HIS系统联动,生成报损单
开发注意事项
- 时间阈值可配置:不要硬编码3个月/1个月/7天,支持运营人员配置
- 高价值药品优先:库存金额>5000元的药品优先提醒
- 系统联动:确保HIS、采购、财务系统状态同步
- 数据留痕:所有预警、锁定、报损操作必须记录
相似场景复用
这个规则可以复用到:
- 医疗耗材管理:一次性耗材效期预警
- 试剂管理:检验科试剂效期预警
- 食品管理:医院食堂食材效期预警
### 4.2 技术迁移说明
**可复用的已有资产:**
1. **设备校准场景:设备校准到期提醒规则**
- 复用:规则引擎框架、预警推送逻辑、到期判断逻辑
- 调整:时间阈值(7天/15天 → 3个月/1个月/7天)
- 复用度:90%
2. **新增部分:**
- 采购系统联动接口(5%)
- 财务系统联动接口(5%)
### 4.3 实施指南
**步骤1:准备环境**
```bash
# 安装依赖
npm install
# 配置系统接口
# 编辑 config/system-config.json步骤2:使用Cursor Skill
1. 将 inspection-overdue-alert.md 保存到 .cursor/rules/
2. 在Cursor中告诉AI:
"参考 inspection-overdue-alert.md 中的业务规则,
实现药品效期预警功能"
3. AI会基于规则生成代码步骤3:调整配置
typescript
// config/expiry-rules.ts
export const EXPIRY_CONFIG = {
warningDays: 90, // 提前3个月预警
alertDays: 30, // 提前1个月报警
urgentDays: 7, // 提前7天紧急
stopPurchasingDays: 30, // 提前1个月停止采购
highValueThreshold: 5000, // 高价值药品阈值
};步骤4:测试验证
bash
# 运行测试
npm test
# 模拟效期场景
npm run simulate:drug-expiry五、下一步行动
如果您对这个场景感兴趣
- 快速验证:我们可以用1天时间,基于模拟数据做原型演示
- 技术对接:提供HIS、采购、财务系统接口文档,评估对接工作量
- 成本预估:根据药品SKU数量、批次数量,给出详细报价
相关场景
- 场景01:医疗设备校准到期提醒 - 到期提醒类场景
- 矿山场景:设备巡检漏检预警 - 原始复用资产

