1. 项目背景与核心价值
社区医院作为基层医疗服务的重要载体,每天面临着大量的药品流通和管理压力。传统的人工记录方式不仅效率低下,还容易出现错漏。我在实际调研中发现,某中型社区医院每月因库存管理不善导致的药品过期损耗就高达数万元。
这套基于微信小程序的药品管理系统,正是为了解决以下痛点:
- 药品入库出库全靠纸质登记,查询效率极低
- 库存预警依赖人工盘点,经常错过补货时机
- 近效期药品难以及时发现,造成大量浪费
- 医护无法实时查看库存,影响诊疗效率
微信小程序作为载体具有天然优势:无需额外安装APP,扫码即用;支持离线操作,适应社区医院网络环境;可与公众号消息打通,实现多端协同。系统上线后,试点医院的药品盘点时间从原来的4小时缩短到30分钟,近效期药品损耗率下降62%。
2. 系统架构设计
2.1 技术选型解析
前端架构:
- 微信小程序原生框架:选择原生开发而非uniapp等跨平台方案,主要考虑社区医院设备普遍较旧,原生框架性能更稳定
- ECharts可视化:采用微信版ECharts-WXSS展示库存趋势、效期分布等数据
- Vant Weapp组件库:提供标准化的表单、弹窗等交互组件
后端服务:
- Node.js + Koa2:轻量级后端适合中小型医疗机构,开发效率高
- MySQL关系型数据库:药品数据需要严格的ACID特性保证
- Redis缓存:高频访问的库存数据缓存,减轻数据库压力
关键设计决策:
- 采用"扫码枪+手机摄像头"双模式识别药品条形码,适应不同硬件条件
- 库存预警设计三级机制:微信模板消息+短信+系统弹窗
- 效期管理引入"色块标记法",直观显示剩余有效期
2.2 数据模型设计
核心数据表关系如下:
| 表名 | 关键字段 | 关联关系 |
|---|---|---|
| 药品基础信息 | drug_id, name, spec, barcode | 1:n 库存记录 |
| 库存记录 | stock_id, drug_id, batch, expiry | n:1 药品信息 |
| 出入库记录 | record_id, drug_id, type, amount | 关联库存变更 |
| 预警规则 | rule_id, drug_type, threshold | 动态配置预警条件 |
特别在药品效期管理上,我们采用双时间戳设计:
- 生产日期:精确到日(2023-06-01)
- 有效期:支持两种格式(24个月 或 2025-05-31)
这种设计能兼容不同药品的标注习惯,系统会自动计算剩余天数。
3. 核心功能实现细节
3.1 智能库存预警模块
预警逻辑实现代码示例(Node.js版):
javascript复制// 库存预警检查
async function checkStockAlert() {
const drugs = await DrugModel.findAll();
const alerts = [];
for (const drug of drugs) {
// 存量预警
if (drug.stock < drug.minStock) {
alerts.push({
type: 'STOCK_LOW',
drugId: drug.id,
current: drug.stock,
threshold: drug.minStock
});
}
// 效期预警(剩余30/15/7天分级)
const remainDays = getRemainDays(drug.expiry);
if (remainDays <= 30) {
alerts.push({
type: remainDays <= 7 ? 'EXPIRE_7DAY' :
remainDays <= 15 ? 'EXPIRE_15DAY' : 'EXPIRE_30DAY',
drugId: drug.id,
expiry: drug.expiry
});
}
}
return alerts;
}
预警消息推送采用分级策略:
- 初级预警(库存<安全量):仅系统内通知
- 中级预警(效期<30天):微信模板消息+系统通知
- 紧急预警(效期<7天):短信+微信+电话提醒(集成第三方呼叫API)
3.2 药品扫码出入库流程
入库操作流程图:
- 扫描药品条形码 → 自动填充基础信息
- 人工补充批次、效期、数量
- 系统自动:
- 校验效期格式
- 计算理论库存(现有量+入库量)
- 检查是否存在相同批次
- 生成带审核状态的入库单
关键优化点:
- 条码识别加入本地缓存,无网络时暂存数据
- 效期输入采用智能解析(支持"2025/05/31"、"05-31-2025"等格式)
- 相同批次自动合并,避免重复录入
3.3 效期管理可视化
前端使用ECharts实现效期看板:
javascript复制// 效期分布饼图配置
const option = {
tooltip: { trigger: 'item' },
series: [{
type: 'pie',
radius: '70%',
data: [
{ value: 35, name: '90天以上', itemStyle: { color: '#67C23A' }},
{ value: 12, name: '30-90天', itemStyle: { color: '#E6A23C' }},
{ value: 5, name: '7-30天', itemStyle: { color: '#F56C6C' }},
{ value: 2, name: '7天内', itemStyle: { color: '#909399' }}
]
}]
}
同时开发了"效期日历"视图,直观显示每天将过期的药品清单,支持按药品种类筛选。
4. 系统部署与运维方案
4.1 混合部署架构
考虑到社区医院的IT条件,我们设计了三套部署方案:
| 方案类型 | 适用场景 | 硬件要求 | 网络依赖 |
|---|---|---|---|
| 云端SaaS版 | 网络条件好的城区医院 | 只需智能手机 | 必需 |
| 本地化部署 | 网络不稳定的乡镇医院 | 需本地服务器 | 可选 |
| 离线单机版 | 完全无网络的特殊场景 | 需定期用UDP同步 | 无需 |
推荐配置:
- 服务器:2核4G云主机(阿里云ECS共享型)
- 数据库:MySQL 5.7+(建议配置每日自动备份)
- 小程序:需配置HTTPS域名(必备条件)
4.2 数据迁移策略
从Excel迁移数据的实操步骤:
- 使用我们提供的模板工具整理历史数据
- 药品信息表(名称、规格、条形码)
- 库存表(批次、效期、数量)
- 运行数据校验脚本
bash复制node validate.js --file=stock.xlsx --type=inventory - 通过管理端导入功能上传验证后的文件
- 系统自动生成差异报告,人工确认后完成导入
重要提示:首次导入建议在非工作时间进行,导入过程中会锁定库存操作。
5. 实际应用中的经验总结
5.1 踩坑实录与解决方案
条码识别率问题:
- 现象:部分药品条码无法识别
- 排查:发现是光照条件影响摄像头识别
- 解决:增加手动输入模式 + 配备便携式扫码枪
库存不同步问题:
- 现象:多终端操作导致库存数据不一致
- 优化:引入Redis分布式锁机制
javascript复制async function updateStock(drugId, amount) {
const lockKey = `lock:stock:${drugId}`;
const locked = await redis.set(lockKey, 1, 'EX', 10, 'NX');
if (!locked) throw new Error('操作频繁,请稍后重试');
try {
// 执行库存变更
await DrugModel.updateStock(drugId, amount);
} finally {
await redis.del(lockKey);
}
}
5.2 效果评估指标
在某社区医院三个月试运行期间:
| 指标项 | 改进前 | 改进后 | 提升幅度 |
|---|---|---|---|
| 月度盘点耗时 | 4.5小时 | 35分钟 | 87% |
| 药品过期损耗金额 | ¥12,800 | ¥4,900 | 62% |
| 库存准确率 | 82% | 99.6% | 17.6% |
| 患者等待时间(取药) | 15.2分钟 | 8.7分钟 | 43% |
5.3 扩展建议
- 可对接医保系统:通过医院HIS系统接口获取处方数据,实现自动扣减库存
- 智能采购预测:基于历史消耗数据,使用时间序列预测模型(如ARIMA)生成采购建议
- 移动端扩展:开发管理APP版本,支持药品照片识别等高级功能
这套系统在持续迭代中,我们正在开发药品拆零管理功能,以更好满足社区医院对慢性病药品的小剂量发放需求。在实际部署时,建议先选择非关键药品进行试点运行,待流程磨合成熟后再全面推广。