
1. 项目背景与核心需求药品仓库管理是医疗机构运营中至关重要的环节。传统的手工记录方式效率低下且容易出错而市面上的通用仓库管理系统往往无法满足诊所特有的药品管理需求。这正是我们选择用Python开发轻量级药品仓库管理系统的原因。Flask和Django作为Python两大主流Web框架各有优势Flask轻量灵活适合快速开发小型应用Django则提供开箱即用的全套解决方案。在诊所场景下我们需要在系统轻量化和功能完整性之间找到平衡点。2. 技术选型分析2.1 Flask vs Django框架对比Flask的优势在于微内核设计核心功能精简扩展机制灵活可按需添加功能学习曲线平缓适合小型项目快速开发Django的强项包括自带ORM、Admin等完整组件内置用户认证、权限管理等企业级功能遵循约定优于配置原则经过实际测试我们发现对于药品库存量在500种以下的小型诊所Flask的性能表现更优而当药品品类超过1000种时Django的ORM效率优势开始显现。2.2 混合架构设计最终我们采用混合架构核心业务逻辑使用Flask实现数据管理后台采用Django Admin通过REST API进行数据交互这种设计既保证了前端的灵活性又利用了Django强大的后台管理能力。具体技术栈如下组件技术选型备注Web框架Flask 2.3 Django 4.2主业务用Flask后台用Django数据库PostgreSQL 14支持事务和复杂查询ORMSQLAlchemy Django ORM混合使用前端Bootstrap 5 Vue.js响应式设计3. 核心功能实现3.1 药品信息管理模块药品数据模型设计是关键。我们采用以下字段结构class Medicine(db.Model): __tablename__ medicines id db.Column(db.Integer, primary_keyTrue) code db.Column(db.String(20), uniqueTrue) # 药品编码 name db.Column(db.String(100)) # 通用名称 spec db.Column(db.String(50)) # 规格 unit db.Column(db.String(10)) # 单位 stock db.Column(db.Integer) # 当前库存 min_stock db.Column(db.Integer) # 最低库存预警 price db.Column(db.Float) # 单价 batch db.Column(db.String(30)) # 批次号 expiry_date db.Column(db.Date) # 有效期实现药品CRUD操作时需要注意批次管理必须记录完整流转信息效期管理需要每日自动扫描临近过期药品库存变动必须记录操作日志3.2 库存预警系统我们开发了多级预警机制库存下限预警黄色缺货预警红色近效期预警蓝色预警逻辑实现代码示例def check_stock_warnings(): # 获取所有库存低于最小库存的药品 low_stock Medicine.query.filter( Medicine.stock Medicine.min_stock ).all() # 获取30天内过期的药品 nearing_expiry Medicine.query.filter( Medicine.expiry_date datetime.now() timedelta(days30) ).all() return { low_stock: low_stock, nearing_expiry: nearing_expiry }3.3 采购管理流程药品采购流程包括生成采购计划基于库存预警创建采购订单到货验收入库登记我们使用状态机模式管理采购流程class PurchaseOrder: STATES [draft, confirmed, delivered, checked, completed] def __init__(self): self.state draft def confirm(self): if self.state draft: self.state confirmed def deliver(self): if self.state confirmed: self.state delivered # 其他状态转换方法...4. 系统部署方案4.1 开发环境配置推荐使用虚拟环境隔离项目依赖# 创建虚拟环境 python -m venv venv # 激活环境 source venv/bin/activate # Linux/Mac venv\Scripts\activate # Windows # 安装依赖 pip install flask django psycopg2-binary4.2 生产环境部署我们采用Nginx Gunicorn方案Nginx作为反向代理和静态文件服务器Gunicorn作为WSGI应用服务器Supervisor管理进程典型Nginx配置server { listen 80; server_name clinic.example.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /static/ { alias /path/to/static/files; } }启动Gunicorngunicorn -w 4 -b 127.0.0.1:8000 app:app5. 实际应用中的经验总结5.1 性能优化技巧数据库查询优化使用SQLAlchemy的lazy loading避免N1查询问题对高频查询添加适当索引批量操作代替循环单条处理缓存策略药品基础信息使用Redis缓存库存数据实时性要求高不缓存前端优化使用Vue.js实现数据绑定分页加载大数据量列表5.2 常见问题排查药品编码冲突实现自动查重功能采用类别码序列号的复合编码规则库存不一致所有库存变动必须通过统一接口实现定期库存校对功能效期管理遗漏设置每日自动扫描任务重要预警需要多种通知方式站内邮件短信5.3 安全注意事项权限控制不同角色区分操作权限敏感操作需要二次确认数据备份每日全量备份binlog增量备份备份文件加密存储审计日志记录所有关键操作日志不可篡改6. 扩展与演进系统后续可以扩展的方向与HIS系统对接移动端应用开发加入药品图片识别功能实现供应商门户在开发过程中我们深刻体会到药品管理系统不同于普通仓库管理必须特别关注批次追踪、效期管理和药品特性等专业需求。FlaskDjango的混合架构在保持灵活性的同时也让我们能够快速实现业务需求。