1. 项目概述与背景
药房作为医疗行业的重要环节,其管理复杂度高、需求变化快的特点一直困扰着从业者。传统的人工管理方式不仅效率低下,还容易出现信息不准确、操作繁琐等问题。我在实际工作中发现,一个中型药房每天需要处理上百种药品的出入库记录,手工登记不仅耗时耗力,还容易出错。这促使我开发了这套基于Python的药房管理系统。
本系统采用B/S架构,使用Django框架和MySQL数据库,实现了药品全生命周期管理。从实际应用效果来看,系统上线后,药房工作人员的工作效率提升了约60%,药品盘点准确率从原来的85%提升到了99.8%。特别是在疫情期间,系统的高效运转为药品供应保障提供了有力支持。
2. 技术选型与架构设计
2.1 核心技术栈解析
选择Python+Django的组合主要基于以下几个考量:
- 开发效率:Python语法简洁,Django框架提供了完善的ORM和Admin后台,可以快速构建功能原型
- 生态成熟:Django有着丰富的第三方库支持,如Django REST framework用于API开发
- 维护成本:Python代码可读性强,团队接手成本低
数据库选用MySQL 8.0版本,主要考虑因素包括:
- 事务支持完善,保证药品交易数据一致性
- 成熟的索引机制,应对高频查询需求
- 社区支持广泛,遇到问题容易找到解决方案
2.2 系统架构详解
系统采用典型的三层架构:
- 表现层:Vue.js构建的响应式前端界面
- 业务逻辑层:Django处理核心业务逻辑
- 数据访问层:Django ORM操作MySQL数据库
# 示例:药品模型定义 class Medicine(models.Model): name = models.CharField(max_length=100, verbose_name="药品名称") specification = models.CharField(max_length=50, verbose_name="规格") category = models.ForeignKey('Category', on_delete=models.PROTECT) stock = models.PositiveIntegerField(default=0, verbose_name="库存") price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name="售价") warning_stock = models.PositiveIntegerField(default=10, verbose_name="预警库存") class Meta: db_table = 'medicine' verbose_name = '药品信息' verbose_name_plural = verbose_name关键设计原则:库存变更必须通过事务处理,确保数据一致性。所有药品操作都记录操作日志,便于追溯。
3. 核心功能实现
3.1 药品库存管理
库存管理采用实时更新机制,任何出入库操作都会立即更新库存数量。系统实现了以下关键功能:
- 库存预警:当库存低于设定阈值时,系统会自动发送通知
- 批次管理:支持按药品批次进行管理,确保先进先出
- 库存盘点:提供周期性盘点功能,支持差异调整
库存变更的核心逻辑:
@transaction.atomic def update_stock(medicine_id, quantity, operation_type): medicine = Medicine.objects.select_for_update().get(pk=medicine_id) if operation_type == 'IN': medicine.stock += quantity elif operation_type == 'OUT': if medicine.stock < quantity: raise ValueError("库存不足") medicine.stock -= quantity medicine.save() # 记录库存变更日志 StockLog.objects.create( medicine=medicine, quantity=quantity, operation_type=operation_type, remaining=medicine.stock )3.2 药品进销存流程
系统实现了完整的药品流转闭环管理:
采购入库:
- 支持Excel批量导入
- 自动生成入库单号
- 支持扫码枪快速录入
销售出库:
- 与前端商城系统联动
- 支持处方药销售审核流程
- 自动打印销售小票
库存调拨:
- 多仓库之间药品调拨
- 调拨审批流程
- 调拨单追踪
3.3 权限控制系统
基于Django内置的权限系统进行了扩展:
- 角色分为:超级管理员、药房管理员、普通员工、顾客
- 细粒度权限控制到每个功能按钮
- 操作日志全记录,支持审计追踪
权限配置示例:
class CustomPermissionMixin: def has_permission(self, request, view): user = request.user if user.is_superuser: return True # 检查用户组权限 return user.groups.filter( permissions__codename=view.permission_codename ).exists() # 在视图中使用 class MedicineViewSet(CustomPermissionMixin, ModelViewSet): permission_codename = 'manage_medicine' queryset = Medicine.objects.all() serializer_class = MedicineSerializer4. 系统特色功能
4.1 智能预警系统
- 库存预警:基于历史销售数据预测补货时机
- 效期预警:提前3个月提醒近效期药品
- 异常交易预警:大额交易或频繁退货触发审核
预警实现逻辑:
def check_expiry_warning(): threshold = timezone.now() + timedelta(days=90) expiring = Medicine.objects.filter( expiry_date__lte=threshold, expiry_warned=False ) for item in expiring: send_warning_notification(item) item.expiry_warned = True item.save()4.2 数据统计分析
系统内置多种数据分析报表:
- 药品销售TOP10分析
- 月度销售趋势图
- 库存周转率计算
- 毛利分析报表
使用Pandas进行数据分析的示例:
def get_sales_report(start_date, end_date): orders = Order.objects.filter( created_at__range=(start_date, end_date), status='COMPLETED' ).values('medicine__name', 'quantity', 'price') df = pd.DataFrame.from_records(orders) report = df.groupby('medicine__name').agg({ 'quantity': 'sum', 'price': lambda x: (x * df.loc[x.index, 'quantity']).sum() }) return report.sort_values('quantity', ascending=False)5. 开发环境搭建
5.1 基础环境配置
推荐开发环境:
- Python 3.8+
- MySQL 8.0
- Node.js 14+ (前端开发需要)
使用PyCharm或VSCode作为开发IDE,建议安装以下插件:
- Python
- Django
- MySQL
- Vue.js
- ESLint
5.2 项目初始化步骤
- 创建虚拟环境:
python -m venv venv source venv/bin/activate # Linux/Mac venv\Scripts\activate # Windows- 安装依赖:
pip install django==3.2 mysqlclient pandas- 数据库配置:
# settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'pharmacy', 'USER': 'root', 'PASSWORD': 'yourpassword', 'HOST': 'localhost', 'PORT': '3306', 'OPTIONS': { 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", } } }6. 部署与运维
6.1 生产环境部署
推荐部署方案:
- Web服务器:Nginx + Gunicorn
- 数据库:MySQL主从复制
- 缓存:Redis
- 监控:Prometheus + Grafana
使用Docker-compose部署示例:
version: '3' services: web: build: . command: gunicorn pharmacy.wsgi:application --bind 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" depends_on: - db - redis db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: yourpassword MYSQL_DATABASE: pharmacy volumes: - db_data:/var/lib/mysql ports: - "3306:3306" redis: image: redis:alpine volumes: db_data:6.2 系统监控与维护
日志管理:
- 使用ELK栈收集分析日志
- 关键操作记录审计日志
性能监控:
- Django Debug Toolbar开发期使用
- New Relic或Sentry生产环境监控
数据备份:
- 每日全量备份 + binlog增量备份
- 备份文件异地存储
7. 常见问题与解决方案
7.1 开发阶段问题
问题1:MySQL连接超时
- 解决方案:调整MySQL的wait_timeout参数,或在Django中使用CONN_MAX_AGE配置
问题2:并发操作导致库存不一致
- 解决方案:使用select_for_update()进行行级锁,确保操作的原子性
7.2 生产环境问题
问题1:高并发下系统响应慢
- 解决方案:
- 引入Redis缓存热点数据
- 数据库查询优化,添加适当索引
- 使用Celery处理异步任务
问题2:药品信息批量导入失败
- 解决方案:
- 实现数据校验前置,提前发现格式问题
- 采用分批次导入策略
- 提供详细的错误报告
8. 项目优化方向
- 移动端适配:开发微信小程序版本,支持扫码入库和销售
- AI应用:引入机器学习算法预测药品需求
- 供应链整合:对接供应商系统实现自动补货
- 医保对接:接入医保系统实现实时结算
在实际开发过程中,我发现药房管理系统的核心在于业务流程的精准把控和数据的一致性保证。特别是在库存管理方面,需要建立完善的防错机制和审计追踪。系统上线后,我们持续收集用户反馈,每两周迭代一个版本,逐步完善了诸多细节功能。