Skip to content

场景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[];
  }[];
}

关键处理流程

  1. 定时检查 → 每天凌晨2:00检查所有在库药品批次
  2. 效期判断 → 计算剩余天数,判断预警/报警/紧急/过期
  3. 自动预警 → 分级推送给相关人员
  4. 停止采购 → 效期前1个月,采购系统标记"停止采购"
  5. 药品锁定 → 过期当天自动锁定,HIS系统联动,生成报损单

开发注意事项

  1. 时间阈值可配置:不要硬编码3个月/1个月/7天,支持运营人员配置
  2. 高价值药品优先:库存金额>5000元的药品优先提醒
  3. 系统联动:确保HIS、采购、财务系统状态同步
  4. 数据留痕:所有预警、锁定、报损操作必须记录

相似场景复用

这个规则可以复用到:

  • 医疗耗材管理:一次性耗材效期预警
  • 试剂管理:检验科试剂效期预警
  • 食品管理:医院食堂食材效期预警

### 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. 快速验证:我们可以用1天时间,基于模拟数据做原型演示
  2. 技术对接:提供HIS、采购、财务系统接口文档,评估对接工作量
  3. 成本预估:根据药品SKU数量、批次数量,给出详细报价

相关场景

相关资产


← 返回医疗场景 | 联系合作 →

基于 AI 辅助开发,快速、灵活、可靠