ARTICLE · 1161792
口腔诊所管理系统 · 技术文档 案例解析
1. 系统定位与边界
目标:替代纸质病历,标准化电子病历;打通"建档—预约—接诊—方案—收费—回访"内部闭环;实现耗材全生命周期管控。
明确剔除(详见需求文档):无患者小程序/公众号、无短信/微信推送、无美团/抖音等第三方对接、无支付/电子发票/医保接口、无供应链集采、无多门店/云端同步。
适用:单门店小型牙科门诊(医生、前台、管理员三类角色)。
2. 技术栈
| 层 | 选型 | 说明 |
|---|---|---|
| 后端 | Python 3.10+ / Flask 3.x | 唯一第三方依赖为 Flask,其余均为标准库 |
| 持久化 | SQLite 3 | 单文件 clinic.db,本地存储,无服务端数据库依赖 |
| 模板 | Jinja2 + 原生 HTML/CSS/JS | 侧边栏后台布局,零前端框架 |
| 鉴权 | Flask session + 自建密码哈希 | hashlib.sha256(salt+password),无外部认证服务 |
| 运行 | 本地进程 python app.py | 监听 127.0.0.1:5000,仅内网/本机访问 |
3. 目录结构
口腔诊所管理系统/
├── app.py # 应用入口:Flask 实例、模板过滤器、蓝图注册、全局上下文
├── db.py # 数据库 Schema、初始化种子、通用查询/审计日志辅助
├── auth.py # 鉴权装饰器 login_required / role_required、密码校验
├── requirements.txt # 仅 flask
├── start.bat / run.sh # 启动脚本(Windows / 跨平台)
├── tests/
│ └── functional_test.py # 功能测试套件(44 用例,含权限与清理)
├── views/ # 蓝图模块(按业务拆分)
│ ├── auth.py # 登录 / 登出
│ ├── dashboard.py # 工作台首页
│ ├── patients.py # 患者档案 / 电子病历 / 附件
│ ├── appointments.py # 预约 / 排班
│ ├── plans.py # 治疗方案
│ ├── charges.py # 收费结算 / 项目库 / 统计
│ ├── inventory.py # 耗材库存
│ ├── followups.py # 回访提醒
│ └── admin.py # 用户权限 / 日志 / 备份 / 报表
├── templates/ # 26 个 Jinja2 页面模板
├── static/ # css/style.css、js/app.js
├── uploads/ # 患者附件(牙片/照片/报告)
├── backups/ # 本地备份(由系统生成)
└── clinic.db # 本地数据库文件(首次启动自动创建)
4. 数据库设计(SQLite)
数据库文件:clinic.db,字符集 UTF-8,开启 PRAGMA foreign_keys=ON。
4.1 核心表一览
| 表名 | 用途 | 关键字段 |
|---|---|---|
users | 员工账号与角色 | username, password(盐哈希), name, role(admin/doctor/reception), status |
patients | 患者基础档案 | name, gender, age, phone, id_card, allergy, medical_history, signs, tags, note |
visits | 就诊台账 | patient_id, doctor_id, visit_date, visit_type, total_fee, status |
medical_records | 口腔电子病历(不可删除) | patient_id, visit_id, doctor_id, chief_complaint, present_illness, exam_result, tooth_chart(JSON), diagnosis, advice |
attachments | 附件存档 | patient_id, file_name, file_path, note, uploaded_by |
schedules | 医生排班 | doctor_id, work_date, start_time, end_time, type(work/rest/stop) |
appointments | 内部预约 | patient_id, doctor_id, item, appointment_time, duration, status(pending/arrived/missed/rescheduled/cancelled) |
treatment_plans | 治疗方案 | patient_id, doctor_id, name, version, status, total_price |
treatment_plan_items | 方案明细 | plan_id, tooth, item, price, qty, subtotal |
charge_items | 收费项目库 | name, category, default_price, status |
charges | 收费流水 | patient_id, plan_id, visit_id, item, amount, method(full/deposit/partial/refund/credit), pay_type(cash/wechat/alipay), status(paid/refunded/credited), operator_id |
consumables | 耗材档案 | name, spec, unit, cost_price, supplier, min_stock, stock |
consumable_logs | 耗材流水 | consumable_id, type(in/out/check/loss/return), qty, balance, operator_id |
followup_rules | 回访规则 | name, template, cycle_days |
followups | 回访任务 | patient_id, rule_id, assigned_to, due_date, status(pending/done), content, feedback, result |
operation_logs | 全量操作审计 | user_id, module, action, record_id, detail, time |
4.2 关键设计点
病历合规:
medical_records不提供删除接口;患者/预约等"删除"均为标记/状态置位而非物理删除,且全部写入operation_logs。牙位图:以 JSON 数组(FDI 牙位号,如
["16","26"])存入tooth_chart,前端 32 颗牙可点击标记。方案联动:方案"确认"后自动写入一条
visits就诊工单,并可后续关联charges收费。耗材成本:库存操作按
in/out/check/loss/return记录流水与结余;出库/报损计入月度耗材消耗成本。
1.1 工作台(首页)
登录后进入工作台,集中展示今日预约、待收费、库存预警、经营概览等关键指标,是日常开诊的总览入口。

2.1 患者档案(列表)
所有患者档案的统一管理入口,支持按姓名 / 电话搜索、分页,并可新增患者、查看详情。

2.2 患者详情
查看患者基本信息、就诊记录、收费记录、会员情况、关联治疗方案与随访任务,是患者全生命周期视图。

3.1 预约排班
以日历 / 时间轴形式安排医生接诊,支持新建预约、调整时间,便于前台排程。

3.2 预约列表
预约的列表视图,可按状态筛选(待到诊 / 已到诊 / 已取消等),进行确认、改期或取消操作。

4.1 治疗方案(列表)
医生制定的治疗方案列表,包含方案名称、版本、总价、状态;可在此新建方案。

4.2 治疗方案详情
方案内多个治疗项目明细、单价、小计;可勾选未收项目“一次结清”,结清后该方案后续无需再来缴费。