1. 项目背景与核心需求
药品管理系统是医疗行业信息化建设的基础设施,传统手工管理方式存在数据易丢失、统计效率低、库存管理混乱等问题。HX2208项目采用Python技术栈开发,主要解决以下痛点:
- 库存管理难题:药品批次、效期、库存量等关键信息需要实时监控
- 多角色协同:系统需区分管理员、药房人员和采购人员等不同权限
- 数据追溯需求:药品从采购到销售的全流程记录必须完整可查
- 报表自动化:替代手工统计,自动生成各类经营分析报表
提示:药品管理系统开发需特别注意《药品经营质量管理规范》(GSP)要求,包括药品分类管理、近效期预警等特殊功能。
2. 技术选型与架构设计
2.1 为什么选择Python+Django组合
经过对比主流技术方案,本项目采用:
- 后端:Django 3.2框架
- 自带Admin后台,快速实现CRUD功能
- ORM支持多种数据库,便于后期扩展
- 完善的权限管理系统(auth模块)
- 前端:Bootstrap 5 + jQuery
- 响应式布局适配多终端
- 丰富的UI组件加速开发
- 数据库:SQLite(开发) / MySQL(生产)
- SQLite适合原型开发
- 正式环境建议切换至MySQL保证并发性能
2.2 系统模块划分
mermaid复制graph TD
A[药品管理] --> B[库存管理]
A --> C[采购管理]
A --> D[销售管理]
E[系统管理] --> F[用户权限]
E --> G[数据备份]
H[报表中心] --> I[销售统计]
H --> J[库存预警]
3. 核心功能实现细节
3.1 药品基础信息建模
python复制class Medicine(models.Model):
"""药品核心模型"""
CATEGORY_CHOICES = [
('RX', '处方药'),
('OTC', '非处方药'),
('HERB', '中药材')
]
name = models.CharField(max_length=100, verbose_name="药品名称")
barcode = models.CharField(max_length=50, unique=True)
category = models.CharField(max_length=10, choices=CATEGORY_CHOICES)
specification = models.CharField(max_length=100) # 规格:如0.5g*24片
manufacturer = models.ForeignKey('Manufacturer', on_delete=models.PROTECT)
purchase_price = models.DecimalField(max_digits=10, decimal_places=2)
selling_price = models.DecimalField(max_digits=10, decimal_places=2)
is_active = models.BooleanField(default=True)
class Meta:
indexes = [
models.Index(fields=['barcode']),
models.Index(fields=['name'])
]
3.2 库存管理关键逻辑
python复制def stock_in(medicine_id, batch_no, quantity, expiry_date):
"""药品入库核心方法"""
try:
with transaction.atomic():
# 检查药品有效性
med = Medicine.objects.get(pk=medicine_id, is_active=True)
# 创建或更新批次记录
batch, created = Batch.objects.get_or_create(
medicine=med,
batch_no=batch_no,
defaults={'expiry_date': expiry_date}
)
# 更新库存记录
stock, created = Stock.objects.get_or_create(
medicine=med,
batch=batch,
defaults={'quantity': quantity}
)
if not created:
stock.quantity += quantity
stock.save()
# 记录入库流水
Transaction.objects.create(
medicine=med,
batch=batch,
transaction_type='IN',
quantity=quantity,
balance=stock.quantity
)
return True
except Exception as e:
logger.error(f"入库失败: {str(e)}")
return False
4. 特色功能实现
4.1 近效期预警系统
python复制def get_expiry_alert(days=30):
"""获取即将过期的药品清单"""
threshold_date = date.today() + timedelta(days=days)
return Batch.objects.filter(
expiry_date__lte=threshold_date,
expiry_date__gte=date.today()
).select_related('medicine').annotate(
remaining_days=F('expiry_date') - date.today()
).order_by('expiry_date')
4.2 智能采购建议算法
python复制def generate_purchase_suggestion():
"""基于销售数据的采购建议"""
suggestions = []
# 获取过去30天销售数据
sales_data = SaleRecord.objects.filter(
sale_date__gte=date.today()-timedelta(days=30)
).values('medicine').annotate(
total_sold=Sum('quantity'),
avg_daily=Sum('quantity')/30
)
for item in sales_data:
medicine = Medicine.objects.get(pk=item['medicine'])
current_stock = Stock.objects.filter(
medicine=medicine
).aggregate(total=Sum('quantity'))['total'] or 0
# 安全库存 = 日均销量 * 采购周期(7天) * 安全系数(1.5)
safety_stock = item['avg_daily'] * 7 * 1.5
if current_stock < safety_stock:
suggest_qty = max(safety_stock - current_stock, medicine.min_order_qty)
suggestions.append({
'medicine': medicine,
'suggest_quantity': math.ceil(suggest_qty),
'current_stock': current_stock
})
return suggestions
5. 部署与优化实践
5.1 生产环境部署要点
bash复制# 使用Gunicorn+Nginx部署方案
pip install gunicorn
gunicorn --workers 4 --bind unix:/tmp/hx2208.sock hx2208.wsgi:application
# Nginx配置示例
location / {
proxy_pass http://unix:/tmp/hx2208.sock;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
5.2 性能优化技巧
-
数据库优化:
- 为高频查询字段添加索引
- 使用
select_related和prefetch_related减少查询次数 - 批量操作时使用
bulk_create
-
缓存策略:
python复制# 使用Redis缓存药品目录 from django.core.cache import cache def get_medicine_list(): key = 'medicine:all' result = cache.get(key) if not result: result = list(Medicine.objects.values('id', 'name', 'specification')) cache.set(key, result, timeout=3600) # 缓存1小时 return result -
异步任务处理:
python复制# 使用Celery处理报表生成等耗时任务 @shared_task def generate_sales_report(start_date, end_date): # 复杂的报表生成逻辑 report_data = complex_query(start_date, end_date) return render_to_pdf('reports/sales.html', {'data': report_data})
6. 安全防护措施
6.1 权限控制实现
python复制# 自定义权限装饰器
def role_required(*roles):
def decorator(view_func):
@wraps(view_func)
def _wrapped_view(request, *args, **kwargs):
if not request.user.is_authenticated:
return redirect('login')
if request.user.role not in roles:
raise PermissionDenied
return view_func(request, *args, **kwargs)
return _wrapped_view
return decorator
# 视图使用示例
@role_required('ADMIN', 'PHARMACIST')
def manage_inventory(request):
# 药房管理逻辑
6.2 数据安全策略
-
敏感数据加密:
python复制from cryptography.fernet import Fernet key = Fernet.generate_key() # 保存到安全位置 cipher_suite = Fernet(key) encrypted_text = cipher_suite.encrypt(b"Sensitive data") decrypted_text = cipher_suite.decrypt(encrypted_text) -
审计日志记录:
python复制class AuditLog(models.Model): user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) action = models.CharField(max_length=50) # CREATE/UPDATE/DELETE/LOGIN model = models.CharField(max_length=50) # 操作对象 object_id = models.CharField(max_length=50, null=True) ip_address = models.GenericIPAddressField() timestamp = models.DateTimeField(auto_now_add=True) details = models.JSONField(default=dict)
7. 项目扩展方向
-
移动端适配:
- 开发REST API接口
- 使用Django REST framework构建
- 配套开发微信小程序/APP
-
智能分析模块:
- 集成销售预测模型
- 药品关联性分析(经常一起购买的药品)
- 自动生成经营建议
-
供应链对接:
- 与供应商系统API对接
- 电子订单自动处理
- 物流状态跟踪
在实际开发HX2208系统过程中,有几个关键经验值得分享:首先是在药品批次管理上,一定要建立完整的进销存流水记录,这对后期的质量追溯至关重要;其次是权限系统要设计得足够灵活,医疗机构通常有复杂的组织架构;最后是报表功能要考虑导出格式兼容性,医疗系统经常需要对接多种外部平台。
