一位做医疗信息化的朋友找我聊了他们正在做的医院预约挂号小程序,问我对整个业务流程设计有没有什么想法。这类项目一听觉得简单,无非是选个科室、选个医生、选个时间、挂个号,但真正落到产品设计和技术实现上,槽点比想象中多得多。我从头到尾梳理了一遍,结合之前做过的几个医院相关项目,把整个预约挂号小程序的拆解思路和落地细节完整写出来,希望对正在做类似项目或者准备接这类外包的朋友有所帮助。
先说清楚这个项目到底是干什么的:医院预约挂号小程序,本质上是把医院线下窗口的挂号流程搬到线上,让患者通过手机随时完成科室选择、医生选择、号源锁定、挂号费支付、取号提醒等操作,同时为医院侧提供排班管理、号源释放、爽约统计、出诊记录等功能。它解决的从来不只是“排队难”这一个问题,还包括黄牛占号、爽约造成号源浪费、科室号源分配不均、患者到院后重复排队确认等一连串管理问题。适合的人群也很明确:门诊量较大的综合医院、专科医院的信息化科室,以及想承接医院数字化改造项目的开发团队。
- 项目定位与需求拆解:挂号流程到底改了什么
1.1 线下挂号的痛点与小程序的切入点
很多人把预约挂号小程序当成一个“日历选择器 + 支付页”,这是最容易翻车的地方。线下挂号流程里面,“排队”只是表面,真正难搞的是号源分配规则、退号回收规则、爽约规则、多点执业医生的排班规则。做线上化时,每一类规则都要落到产品逻辑里,否则上线第一天就会接到门诊部的投诉电话。
我列出过一份线下挂号的完整路径,大致是:患者到达医院,前往挂号窗口或自助机,选择科室,科室上级分诊台会确认症状归属,有指定医生则挂专家号,无指定医生则挂普通号,缴费后拿挂号单,到科室分诊台扫码报到,等待叫号。整个过程看似简单,但存在三个非常突出的矛盾:
第一,窗口和自助机只能处理“当前时刻的剩余号源”,信息不对称。热门专家号通常在上一个自然日就已挂满,真正到窗口挂号的患者只能碰运气捡退号。
第二,管理方无法提前预估门诊压力。线上化之后,可以拿到未来七天甚至三十天的预约数据,提前调度医生加号或者停诊,这才是有价值的部分。
第三,退号和爽约问题线下几乎不可控。患者不来了,号源白白空着;临时的退号又难以及时回流到窗口,导致资源浪费。
小程序的切入点,就是把“剩余号源”的状态管理从线下搬到一个统一的线上号源池,同时保留窗口、自助机、医生诊间加号等渠道,形成一个多端共用同一数据源的系统。以前的很多医院小程序做得差,差的不是颜值,是后端号源没有统一管理,出现线上挂了号而窗口还在卖同一个号的情况,那种事故对信任是毁灭性的。
1.2 三类核心参与角色与各自诉求
预约挂号小程序的用户不是只有患者,严格来说是三方:
患者方要的是快和确定。操作步骤越少越好,选完科室就看得到医生简介和剩余号数,付款后立刻有凭证。一个细节:很多患者对“医生擅长领域”非常敏感,页面里没有这个信息,他们会觉得不可信。
医院运营方要的是管理效率和排班灵活性。支持医生停诊、加号、替诊操作,停诊后已预约患者自动收到提醒,挂号费原路退回,不需要人工干预。
行政监管方要的是实名、可追溯、防黄牛。所有挂号记录需要留痕,同一患者同一时段不能重复挂多个科室,需有限号逻辑。
三个角色的诉求叠加起来,决定了这个小程序的边界不是做一个预约工具,而是一个“号源管理系统 + 患者通知系统 + 实名认证系统”的轻量组合。
从技术角度看,前端工作量其实不大,真正的大头都在后端的状态判断、排队处理、对账和触达通知上。所以我历来主张做这类项目时,不要一上来画一堆页面原型,而是先把号源状态转换图理清楚,再往回推页面结构。这也能让甲方感受到团队对业务的理解深度,后续谈预算都会顺一些。
- 核心模块设计与关键参数:号源池、就诊人、支付对账怎么安排
2.1 号源池设计:状态机是一切的基础
整个小程序最核心的模块,不是支付,不是预约页,而是号源池。号源池的设计直接决定并发高峰期系统能不能扛得住、退号能不能准实时回流、停诊能不能幂等处理。
我把号源池的状态定义为五态:可预约、已锁定、已支付、已完成、已释放。其中“已锁定”是购买过程中临时占用的状态,患者提交预约申请后锁定,设定一个超时时间,比如15分钟,超时未支付自动释放回池。已支付状态在就诊完成或当天24点之后,流转为已完成,代表一次预约闭环的结束。已释放则包含用户主动退号、后台管理员停诊释放、超时未支付释放三类来源。
这五个状态里,最容易踩坑的是“已锁定”到“已释放”的回收逻辑。很多团队用定时任务批量扫表,每五分钟扫一次超时的锁定记录释放号源,这样必然出现一个现象:患者明明看到有余号,点进去提交订单提示“号源已被抢完”,刷新后又有了。原因就是定时任务扫描间隔内的窗口期不一致,前端看到的数据永远滞后。
我自己的习惯做法是:锁号记录里存上 expire_at 字段,前端倒计时用这个字段计算,而不是用本地缓存或后端再算一次。定时扫表当然要有,但只是兜底,核心还要靠前端下单时的一次强制校验:提交支付时重新检查该锁定记录是否过期,过期就直接拒绝并释放。双保险配合使用,基本可以杜绝脏数据。
号源池需要支持批量初始化。医院排班通常以周为周期,比如每周五生成下一周的号源。不要一条条插入,效率太低,直接用 SQL 按排班模板做集合插入,一次生成一个科室七天内的全部号源。生成时要考虑节假日停诊规则,所以排班表里面要有一类特殊日期标识,标记当天是上午门诊、下午门诊还是全天停诊。
2.2 就诊人管理:实名认证与亲情绑定
挂号小程序和普通电商还有一点非常大的区别:就诊人身份必须可信,否则后续的电子病历、检查报告、处方流转全部没法对接。所以就诊人管理模块不是一个简单的“收货地址管理”,它承担了实名认证、身份核验、多就诊人管理的职能。
就诊人分为本人和非本人两类。本人绑定必须走实名认证,尤其是第一次就诊,需要输入姓名、身份证号、手机号,并且与微信授权手机号一一核对,必要时对接公安身份证核验接口。非本人的亲属绑定,可以只需身份证信息,但要限制每人名下最多绑定人数,比如五人或十人,并且每次挂号时验证主账号和就诊人之间的关系,防止单纯的黄牛囤号。
说到黄牛,这是医疗类小程序绕不开的问题。常见的反制手段包括:同一微信号同一就诊人同一科室同一时段限制一个号;同一手机号月内挂号次数限制;高频挂号行为的风控限制,比如一分钟内提交订单超过三次则触发图形验证码。注意,这些限制不能做得太死,否则真实用户偶尔帮家人都挂号会很烦躁,被限制之后就会直接流失,宁可让号源有少量冗余,也不能牺牲真实用户的操作体验。
2.3 支付与对账:自动退款和原路退回别靠手工
就医场景里有个特有操作,叫“候补退费”。医生停诊了,号源取消,挂号费得退;患者就诊前一天晚上想起来第二天有事,线上申请退号,退费也要处理;还有一种情况是患者线上挂了专家号,到院后医生转普通号处理,多收的挂号费差额需要原路退回。这类操作量不小,如果全部靠财务人工处理,医院财务科会崩溃。
所以支付模块的核心不是收钱,而是对账和退款。小程序端几乎无脑接入微信支付即可,但后端一定要设计好支付订单表和预约订单表的关联关系。我的做法是:预约单表存业务状态,支付单表存交易状态,两表用同一个业务流水号关联。退款时只改支付单的状态,并异步调用微信原路退款,退款成功后回调更新业务状态。
这里必须有异步对账任务。因为支付回调、退款回调都存在失败或延迟的客观可能,每天凌晨跑一次拉单任务,从微信支付商户平台拉前一天的账单,与本地支付单表逐笔核对,对不上的进人工处理列表。别问我为什么强调这个,凡是上线超过半年的医疗类小程序,一定遇到过几次支付回调丢失的情况,没有对账就是一笔糊涂账。
- 关键流程的实现细节:从选科室到取号的完整链路
3.1 选科室与选医生的前置数据准备
挂号链路从首页进入后大概分成三步:选科室、选医生、选号源时间。这里面的数据准备工作很多,如果直接查询线上实时号源库,数据库压力会很大,也没必要。我当时采取的策略是:设一张医生排班缓存表,定期把未来七天的排班汇总写入缓存,前端每次只查缓存,只有提交订单时才回源数据库检查号源是否真实可锁。
选科室的页面有一个常见误区:只做一级科室列表,点击后直接进医生列表。中等以上医院的门诊科室是有层级关系的,比如“内科”下面还有“心血管内科”“呼吸内科”“消化内科”,嵌套层级到两层或者三层,医生直接挂在二级或三级科室下面。如果产品设计没考虑这个层级,患者大概率找不到自己该挂的科室,客服咨询量直接翻倍。
选医生界面需要展示的信息比较固定:头像、科室、职称、擅长方向、本周出诊时间列表、已约人数、剩余号数。这里特别提一个点:剩余号数不要写具体数字,可以用“余3”这种模糊词,也可以直接显示“充足”“紧张”“约满”三档。为什么?因为精确到个位数的实时库存会加剧抢号,并且在高并发下更难保证一致性,模糊展示反而缓和了冲突感。
3.2 锁定号源的并发控制与超时释放
到了用户点下“提交预约”按钮的瞬间,后端开始真正和号源池打交道。这个动作背后的逻辑是:从号源池里获取一张状态为“可预约”的号,立刻改状态为“已锁定”,同时生成一条预约订单记录并设定过期时间,然后订单表进入“待支付”状态。
关键点来了:这个更新动作必须是原子的,不能先查再改。最稳妥的方案是在数据库层做条件更新:
UPDATE number_source SET status = 'LOCKED', lock_user = #{userId}, lock_time = NOW(), expire_at = DATE_ADD(NOW(), INTERVAL 15 MINUTE) WHERE id = #{sourceId} AND status = 'AVAILABLE'注意 where 条件里的 status = 'AVAILABLE',这是保证“只有一个请求能成功锁定”的关键。如果更新的影响行为 0,说明号源已经被别人抢走,直接返回用户友好的失败文案。
从数据库条件更新的角度来看,即使同时有几十个人抢同一个号源,也只有一个人能提交成功,其他人全部拿到失败结果。这是整个系统最简单的防超卖手段,没有之一。
那高并发下会不会有性能瓶颈?真实情况下,一个热门专家号同时抢的人群峰值可能就几百上千,数据库条件更新的性能完全够用,不需要引入 Redis 分布式锁,反而引入了锁超时、锁释放等一堆额外复杂度。关于这一点,在需求评审时可以把原理和方案讲清楚,避免团队陷入“为了高并发而 Redis”的僵局。
锁号之后,用户进入支付页,前端用倒计时组件展示剩余支付时间。这个倒计时的起点是后端返回的 expire_at,不是用户点击提交的时间。这里有一个小细节:很多小程序的前端拿到的是后端 return 的剩余秒数,如果网络延迟几秒,倒计时就会出现偏差。我的做法是返回 expire_at 这个绝对时间戳,前端用本地时间和服务器时间做差值,能有效规避这个问题。
3.3 支付成功后的凭证与取号流程
支付完成后,微信回调通知后端,后端将支付单更新为已支付,预约单更新为已支付,同时调用消息通知服务给用户推送模板消息:挂号成功通知 + 就诊提醒。模板消息里必须包含医院名称、科室、医生、就诊时间、取号地点、注意事项。
取号这个环节,线上化的痛点集中在“凭啥取号”。很多医院需要患者出示身份证,但用微信小程序线上预约后,重复验证身份证反而增加了操作成本。常规的做法是:支付完成后自动生成一个挂号二维码,患者到院直接扫二维码签到取号。二维码内容是预约单号加密后的短码,带有效期,仅在就诊当天有效,这样既兼顾了安全又兼顾了便捷。
注意,这个二维码需要和后端系统有一个校验接口:扫码时调用确认接口,如果预约状态不是“已支付”,就不能取号;如果是“已完成”或“已取消”,返回对应提示。实际开发中的坑在于:有的团队只做了前端展示,没有做后端核销,导致二维码可以被截图反复使用,窗口扫码后业务流程混乱。
- 技术选型与数据模型设计:小程序端与后端的分工边界
4.1 小程序端技术栈与页面结构
前端技术栈,如今的主流路径基本是原生微信小程序或者跨端框架。对于医院这种需要长期迭代、对接多种院内系统的场景,我建议优先考虑原生微信小程序或者以原生为主的混合方案。原因不是原生更高级,而是医疗项目里依赖的微信能力非常多:手机号快捷认证、订阅消息、微信支付、定位、蓝牙(偶尔对接院内设备),这些能力在原生框架下的适配性和调试工具链是最成熟的。
页面结构上,我通常分成五个主包页面组:首页、科室列表、医生详情、预约确认、订单中心。订单中心里再细分:待支付订单、已支付订单、已完成订单、已取消订单、退费记录。再加上一两个次级页面:就诊人管理、常用就诊人列表、消息订阅设置、帮助与客服。页面数量约为十到十二个,不算多,控制好包体大小完全没有问题,不需要拆分包。
有个运营层面的建议:首页不要一上来就是挂号搜索框,要放一个智能分诊入口。患者很多时候并不知道自己该挂哪个科,这个入口通过选择题引导,比如“哪个部位不舒服”,逐步匹配到可能的科室,再引导到挂号流程。这个体验和纯粹让用户自己猜科室,相比,整个预约成功率高很多。分诊规则可以用简单决策树实现,不需要上人工智能,后续如果数据积累够了再做推荐也不迟。
4.2 后端服务拆分与服务端关键表设计
后端语言不限,Java、Go、Node 都可以,关键是服务边界和数据边界要清晰。我的划分习惯是四个主服务:
- 用户与就诊人服务:负责微信登录、手机号绑定、实名认证、就诊人管理。
- 排班与号源服务:负责排班模板维护、号源生成、号源锁定、释放、查询。这是核心中的核心。
- 预约单与支付服务:负责订单状态流转、支付下单、回调处理、退款。
- 通知与消息服务:负责订阅消息推送、短信通知、就诊前一天提醒。
四个服务之间通过内部接口或者消息队列通信,尤其是号源变化和订单状态变化,采用事件发布模式,比如“号源已锁定”事件同时触发待支付订单创建和前端轮询状态更新,“订单已支付”事件触发通知推送和号源状态流转。
数据库表设计上,我必须重点介绍三张表:排班模板表、号源表、预约单表。
排班模板表大致字段是:医生 ID、科室 ID、出诊日期类型(工作日/周末/节假日)、午别(上午/下午)、放号时间、号源总数、已放号天数。这张表是排班的基础,改在这里,号源生成是一次性批量执行的。
号源表是核心中的核心,我使用的核心字段包括:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键号源记录 ID |
| doctor_id | bigint | 医生 ID |
| schedule_date | date | 出诊日期 |
| period_type | tinyint | 上午/下午 |
| time_slot | varchar | 具体时间段,如 09:00-09:30 |
| status | tinyint | 可预约/已锁定/已支付/已完成/已释放 |
| lock_user_id | bigint | 锁定用户 |
| lock_order_id | varchar | 锁定时的订单号 |
| expire_at | datetime | 锁定过期时间 |
| visit_status | tinyint | 是否已就诊 |
预约单表记录整个业务流水,和支付单表保持一对多的关系,一个预约单可能产生多次退款记录。预约单表里的核心字段:预约单号、患者 ID、就诊人 ID、医生 ID、科室 ID、号源 ID、订单状态、支付状态、退款状态、来源渠道(小程序/窗口/自助机)、就诊状态。
表之间的关系要提前约定清楚:号源表的一个 id 在预约单表里只能出现一次,且预约单号与号源 ID 是强绑定关系。这个约束是防重复支付的最后一道防线,也就是后端必须校验同一个号源 ID 不能被两个不同预约单使用。
4.3 消息通知与服务端的触达策略
医疗类服务的消息通知,小程序订阅消息和短信是两条腿走路。小程序订阅消息免费但依赖用户订阅,短信可靠但需要资费,两类结合可以覆盖大多数用户。
实际业务里,需要通知的场景大概有六类:预约成功通知、就诊前一天提醒、医生停诊通知、退号成功通知、退费到账通知、报告出结果通知。其中医生停诊通知非常麻烦,因为医生临时停诊常常发生在当天早上,离就诊只剩几个小时,必须能够在极短时间内批量触达所有预约该医生号源的用户。我建议停诊通知使用“订阅消息 + 短信”双通道,因为有相当一部分用户,尤其是不太会用手机的老年人,根本不会及时看小程序消息,短信是唯一能确保他们看到的通知方式。
这里有一个容易被忽略的数据点:就诊前一天提醒发送的时候,需要判断患者是否已经绑定了就诊人身份,如果没有,提醒文案要带上“请提前在个人中心完成实名认证,否则无法正常取号”这样的提示,能显著降低当天取号失败率。
- 上线后最常见的坑与排查实录
5.1 号源超卖与数据不一致
有次模拟压测,团队兴奋地和我说线上没有超卖,但我拿结果一看,还是发现两个隐患:一是前端连续两次提交同一号源,第一次支付失败关闭,第二次再进入,页面仍显示“待支付”,到支付时却提示订单不存在;二是医生停诊后,号源释放了,但已经支付成功的预约单没有自动进入退费流程,导致患者到院后才发现号被取消了。
排查下来,原因分别是前端状态没有从“已锁定”刷新回“可预约”,以及停诊处理与订单状态机没有联动。修复方法很简单:在进入支付页时重新拉取预约单状态,如果该号源状态为已释放,直接跳转订单中心并提示“该号源已释放,如需继续挂号请重新选择”;在停诊释放号源的同时,在同一个事务里把所有关联的已支付预约单统一置为“待退费”,由退款任务处理原路退回。
这两个案例的价值在于:研发和测试在联调时,只关心主链路通不通,忘了状态分支。但医疗类系统出事故往往就出在这些状态分支上,一定要把状态机矩阵完整列出来写测试用例,别偷懒。
5.2 支付回调丢失与退款未到账
支付回调丢失是所有涉及支付系统都要碰到的经典问题。微信支付官方建议是“支付成功回调处理失败时,要主动通过查询订单接口来兜底”,但后续开发者往往忽略了这一点。真正上线后遇到的是:用户点完“立即支付”后关闭页面,微信支付已经扣款成功,但回调因为网络抖动没到服务器,预约单还停留在“待支付”,用户看到的状态是未支付,再点一次支付就会提示重复。
这个问题最直接的解法,是在前端拿到支付结果后,主动调一次后端对账接口,向后端确认该预约单是否已支付。后端处理逻辑是:本地能查到支付成功直接返回;本地查不到,就主动向微信支付平台查询订单真实状态,查到已支付则立即更新本地状态,再通知用户。这套主动查询 + 被动回调的双保险机制,是医疗类小程序支付可靠性设计的核心。
还要补充退款部分的坑:高频退款操作会产生大量微信支付商户账单,未做账单对账前,这些退款明细不会自动进入财务系统。如果退费状态更新逻辑里没有“退款中”和“退款失败”的区分,财务就只能导出账单手动核对,工作量陡增。所以预约单表中一定要有 refund_status 字段,区分未退款/退款中/退款成功/退款失败,失败的情况下要能手动触发重试。
5.3 医生排班临时变动与患者通知的联动
医生排班变更是医疗场景里最高频的异常路径。变更的类型主要有三种:医生临时停诊、医生换诊、医生加号。换诊场景下,原号源作废,系统自动为患者挂到同科室另一名同级医生,并发送换诊通知。如果患者不同意换诊,可以一键退号退款。这个流程设计得好不好,直接影响门诊纠纷率。
实际开发里,医生换诊的处理逻辑要放在服务端事务里完成,不要只做页面提示。事务里执行的操作是:原号源状态改为已释放,生成一个新的号源,锁定给原预约单患者,更新预约单的医生信息,然后触发通知消息。换诊如果发生在就诊前一小时,一定要用短信通知,很多患者不会在短时间内回看小程序消息。
- 合规与实名制:医疗场景绕不过去的三件事
6.1 实名与就诊人绑定
医疗类互联网产品,实名制是底线。所谓底线,不是说做个身份证输入框就叫实名了,而是要从两端闭环:一端是公安信息核验,一端是就诊记录关联。很多团队在实名认证这块用的是第三方实名认证接口,效果可以,但要注意一个边界:接口查询后的证件信息不能明文存在数据库里,存储时要做脱敏处理,只保留手机号、身份证后四位等必要信息,确保证件全号只有服务端在证件核验时接收,不进业务库。
亲情绑定功能的设计上,要特别小心。通常一个微信账号可以添加多位就诊人,但就诊人信息一旦提交后不能随意修改,尤其是姓名和证件号,只允许增加和停用,不允许编辑。一旦放开编辑,就会有人录入了别人身份信息,完成跑号再修改成自己,直接绕开实名链路。所有的就诊人新增操作,都应该要求输入主账号本人的微信支付密码或短信验证码,这是成本最低且有效的风控手段。
6.2 隐私保护与数据安全
医疗健康数据属于敏感个人信息,这一点再怎么强调都不过分。开发阶段就要做好最小化授权:患者信息、挂号记录、诊断信息、处方信息要分库或者分表存储,不同角色通过不同的 API 接口获取数据。管理后台的操作日志是普查单位基本一定会看的功能,哪个管理员在什么时间修改了哪个医生的排班、操作了什么字段、以及前端的哪个账号在什么时候访问了哪位患者的信息,都要留痕。
小程序端的隐私弹窗也必须做完整。很多团队做医疗小程序时直接复用了电商模板的隐私协议,只提“收集手机号用于登录”,这是不行的。要明确列出收集的每一类信息:身份信息用于实名认证,就诊记录用于医生诊断参考,地理位置用于附近医院推荐。注意,列表要真实,不要写得含糊,否则隐私合规审核过不去。
6.3 客服与纠纷处理
挂号类小程序还隐含一道软性合规要求:畅通的客服与投诉入口。医疗场景里,患者情绪容易紧张,一点小操作不顺就会投诉。小程序内要有在线客服入口,人工服务时段内保证及时响应。常见的纠纷集中在:退号不退费、医生停诊通知不及时、号源被误锁等场景。处理这类问题不能只靠开发人员临时查库解决,要在管理后台提供客服专用查询页面,通过预约单号直接查询该单所有状态流转日志,这样客服响应速度快,患者体验也会好很多。
我参与过的一个项目里,管理后台最初没有客服查询功能,运营人员要申请数据库权限才能查看一个预约单的原始状态。每次出现纠纷处理效率都非常低,后来专门加了一个客服看板,把预约单号、支付状态、退还记录、号源变更日志汇总在一张页面里,才彻底解决。
实际开发过程中更有价值的,是把客服入口和订单详情打通:患者在小程序发起客服咨询时,自动带上当前的订单号,客服端直接能看到该订单的完整轨迹,不需要患者反复描述自己遇到什么问题。这个小功能看起来不起眼,但对患者来说体验提升非常明显,也减少了客服工作量。
- 上线后的数据运营:从能挂上号到挂对号
7.1 爽约率与号源浪费的运营干预
小程序上线初期最大的运营指标,不是日活,而是爽约率。爽约率是预约成功但未到院就诊的比例,通常医院能接受的范围在5%-10%左右,超过这个数值,号源浪费就比较严重了。
降低爽约率的常见手段包括:就诊前一天提醒,以及就诊前两小时的临期提醒;刚性的规则有三种:三个月内爽约三次限制预约一个月,当日上午号源爽约后释放给候补池,以及号源释放的时间窗口政策。这些规则都要在开发期定义好,不要上线后再临时加,临时加规则容易引发投诉。
说一个容易被忽略的细节:号源释放时间。通常医院约定上午号源在就诊当天早上七点后不再线上退号,患者需要到窗口操作。这个规则如果没有在预约确认页面和订单详情里做明确提示,用户会误以为随时可退,产生各种纠纷。界面上的规则说明,必须和后台的逻辑规则完全一致,不能出现前后端规则对不上的情况。
7.2 科室号源配置与医生绩效挂钩
运营层还有一个经常会涉及的问题,就是科室号源的总量和组合。一个科室一天放多少号,是全体普通号还是普通号加专家号混合,什么时候放开未来N天的预约,都直接影响门诊量。实际操作中,号源配置需要和前端的显示规则联动,比如周末只开发半天门诊,节假日自动切换节假日排班模式。
还要考虑医生绩效数据。小程序上线后,医院管理者会通过后台统计每个医生的接诊量、停诊率、平均看诊时长、预约患者比例等。这要求所有排班和预约单数据要保存完整的时间戳,后台统计报表即使前期不做,也要在表设计时预留字段,否则后续补报表功能时会非常痛苦。
我在部署报表时习惯用一张日汇总表,由定时任务每天凌晨基于预约单表做聚合:每个医生当天预约数、实际就诊数、退号数、停诊数、爽约数,全部汇总后插入日表。这种方式的优势是查询报表时不碰源表,避免给订单库造成额外压力。图表展示再快,也不如源器前置聚合来得稳。
7.3 关于扩展方向的思考
这些做完,基本算是一个完整的核心闭环了。但如果医院有后续信息化规划,有几个方向可以展开:一是与院内 HIS 系统深度对接,实现号源池与诊间挂号、窗口挂号的实时互通,真正做到多渠道号源一体化;二是增加在线候补队列,当号源释放时按候补顺序自动分配,进一步降低号源浪费;三是基于预约和就诊数据做专科导流,比如慢病患者复诊预约、检查报告推送、用药提醒等。这些都不是空想,而是基于现有数据模型能顺滑承载的增量功能,前期设计只要把状态机和数据表留好了,后面扩展会轻松很多。
我个人经历里最深的体会是:医疗类小程序的技术背后,真正的壁垒在于“业务规则的正确表达”。支付、界面、通知这些技术问题,都有成熟方案可以抄,唯独“号源状态机 + 医生的排班规则 + 医院的退改规则”这三件事,每个医院都不一样,每一处都需要和医院一线的医护人员反复确认。
最后再分享一个经验:接手这类项目时,第一周不要写代码,先约门诊部、挂号收费处、信息科各聊一次,录音、画流程、列状态流转表。把这三方口中的业务规则理清楚了,后面整个开发流程会顺畅得多;如果跳过这一步,后面大概率要在联调阶段为最初的需求理解偏差反复返工。以上,希望这些经验能帮到你少踩几个坑。