Python+Django构建宠物诊所管理系统实战
1. 项目背景与需求分析作为一名在宠物医疗行业摸爬滚打多年的技术顾问我见过太多小型诊所还在用Excel甚至纸质记录管理病例。最近帮朋友改造他的猫专科诊所时我们决定用Python开发一套轻量级管理系统。这个系统需要解决几个核心痛点病历管理混乱不同医生的记录格式不统一历史病例查询困难预约效率低下电话预约经常出现时间冲突忘记提醒导致爽约率高达30%库存管理粗放经常出现急需药品缺货或药品过期的情况系统设计目标很明确开发成本控制在2万元以内3个月内上线支持日均100就诊量的诊所运营。经过市场调研我们发现市面上成熟的宠物医院系统如宠医云年费在2-5万对小型诊所来说负担较重。2. 技术选型与架构设计2.1 技术栈决策过程我们选择了PythonDjangoMySQL的组合主要基于以下考量开发效率Django自带Admin后台和ORM能快速搭建基础功能维护成本Python开发者资源丰富后续维护容易扩展性MySQL支持未来数据量增长且与各类BI工具兼容性好注意虽然SQLite更轻量但考虑到未来可能的多诊所连锁扩展最终还是选择了MySQL前端采用Vue.jsBootstrap的组合主要看中响应式布局自动适配诊所的平板设备组件化开发便于功能迭代丰富的UI库减少设计工作量2.2 系统架构图解[客户端] ←HTTP→ [Nginx] ←WSGI→ [Django] ↑ [Redis缓存] ↑ [Django-Celery] → [MySQL主从]关键设计点使用Nginx做静态资源服务和负载均衡Redis缓存高频访问的药品库存数据和医生排班表Celery异步处理邮件提醒和报表生成任务MySQL配置主从复制确保数据安全3. 核心模块实现细节3.1 电子病历管理系统病历数据结构设计是核心难点我们采用了JSONField存储动态字段class MedicalRecord(models.Model): PET_TYPE_CHOICES [ (DOG, 犬科), (CAT, 猫科), (RABBIT, 兔科), ] pet models.ForeignKey(Pet, on_deletemodels.CASCADE) doctor models.ForeignKey(Doctor, on_deletemodels.PROTECT) visit_date models.DateTimeField(auto_now_addTrue) symptoms models.TextField() diagnosis models.TextField() treatment JSONField() # 存储用药方案等结构化数据 attachments models.ManyToManyField(MedicalImage) class Meta: indexes [ models.Index(fields[pet, visit_date]), ]搜索优化技巧为高频查询字段建立复合索引使用django-postgresql-fulltext扩展支持病历全文检索对症状描述字段进行关键词提取建立倒排索引3.2 智能预约系统预约冲突检测算法是核心创新点def check_availability(doctor_id, start_time, duration): # 获取医生当天所有预约 appointments Appointment.objects.filter( doctor_iddoctor_id, datestart_time.date() ).exclude(statusCANCELLED) # 将时间段转换为分钟数便于计算 new_start start_time.hour * 60 start_time.minute new_end new_start duration for app in appointments: exist_start app.time.hour * 60 app.time.minute exist_end exist_start app.duration # 时间段重叠检测 if not (new_end exist_start or new_start exist_end): return False return True提醒机制实现使用Celery Beat配置定时任务提前24小时发送短信提醒通过阿里云短信API提前2小时推送微信模板消息对连续3次爽约的客户自动标记为高风险客户3.3 药品库存管理库存预警算法考虑了多种因素def check_inventory(): alert_items [] today date.today() # 获取所有库存药品 medicines Medicine.objects.filter(quantity__gt0) for med in medicines: # 计算安全库存过去30天日均用量×7 avg_daily_use UsageRecord.objects.filter( medicinemed, date__gtetoday-timedelta(days30) ).aggregate(avgAvg(quantity))[avg] or 0 safety_stock avg_daily_use * 7 # 检查库存状态 if med.quantity safety_stock: alert_items.append({ name: med.name, current: med.quantity, safety: round(safety_stock, 2), batch: med.batch_number }) # 检查近效期30天内到期 if med.expiry_date and (med.expiry_date - today).days 30: alert_items[-1][expiry] med.expiry_date return alert_items药品批次管理技巧采用FIFO先进先出原则自动推荐发药批次对特殊药品如麻醉剂启用双人核对机制与供应商API对接实现自动补货4. 特色功能开发4.1 数据分析看板使用PandasMatplotlib生成经营指标def generate_monthly_report(clinic_id): # 获取基础数据 start_date date.today().replace(day1) appointments Appointment.objects.filter( clinic_idclinic_id, date__gtestart_date ).values(date, status) # 数据处理 df pd.DataFrame.from_records(appointments) df[date] pd.to_datetime(df[date]) daily_counts df.groupby([df[date].dt.date, status]).size().unstack() # 可视化 fig, ax plt.subplots(figsize(10, 6)) daily_counts.plot(kindbar, stackedTrue, axax) ax.set_title(本月预约状态分布) ax.set_xlabel(日期) ax.set_ylabel(数量) # 保存为HTML组件 output io.StringIO() fig.savefig(output, formatsvg) plt.close(fig) return output.getvalue()关键指标设计医生接诊效率平均就诊时长药品周转率客户回头率季节性病种分析4.2 客户沟通系统消息模板配置示例class ReminderTemplate(models.Model): TEMPLATE_TYPES [ (APPOINTMENT, 预约提醒), (FOLLOW_UP, 复查提醒), (PROMOTION, 促销信息), ] name models.CharField(max_length100) template_type models.CharField(max_length20, choicesTEMPLATE_TYPES) content models.TextField() is_active models.BooleanField(defaultTrue) def render_content(self, context): 使用Jinja2模板引擎渲染内容 from jinja2 import Template return Template(self.content).render(context)发送策略优化根据客户历史打开率选择最佳发送时段对重要提醒如术后护理采用短信邮件双通道营销信息设置每月发送频率上限5. 部署与运维实践5.1 服务器配置建议对于日均100-200就诊量的诊所推荐配置阿里云ECS2核4G约600元/月MySQL阿里云RDS基础版约300元/月对象存储OSS用于病历附件存储按量付费重要提示一定要配置自动备份策略我们采用数据库每日全备binlog附件数据实时同步到OSS每周进行恢复演练5.2 性能优化技巧通过压力测试发现的瓶颈及解决方案预约冲突检测响应慢为医生排班表添加缓存使用Redis sorted set存储时间段病历搜索延迟高添加Elasticsearch作为二级索引对长文本字段进行分词优化报表生成卡顿改用异步任务生成预计算常用指标6. 踩坑经验分享6.1 数据迁移陷阱初期使用SQLite开发迁移到MySQL时遇到问题SQLite的JSON字段与MySQL不兼容 → 改用Django的JSONField自增ID冲突 → 重置序列时注意保留关联数据正确做法 开发初期就使用与生产环境相同的数据库6.2 时区问题系统上线后出现预约时间错乱Django配置中未明确时区设置服务器时区与诊所所在地不同解决方案# settings.py TIME_ZONE Asia/Shanghai USE_TZ True6.3 权限设计缺陷第一版权限系统过于简单导致护士能看到财务数据医生无法修改自己录入的错误病历改进方案 采用RBAC模型定义5种角色超级管理员诊所管理员医生护士前台7. 扩展方向建议系统上线运行半年后我们规划了这些增强功能移动端应用医生端支持移动查房和病历录入客户端宠物健康档案查询AI辅助诊断症状输入自动推荐可能疾病用药冲突检测供应链整合与药品供应商系统对接智能比价采购这个项目给我的最大启示是医疗信息化系统必须平衡好用性和安全性。我们花了大量时间设计审核流程和数据追溯机制确保每个操作都有迹可循。现在系统已经稳定运行1年多帮助诊所将预约效率提升了40%药品损耗率降低了65%。