基于微信小程序的陪诊服务系统设计与实现

基于微信小程序的陪诊服务系统设计与实现

随着社会老龄化加剧与异地就医需求增长,"独自看病难"成为越来越多人的现实困境。陪诊服务通过专业人员协助完成挂号、候诊、取药、送检等流程,正在成为医疗服务的有益补充。本文从工程实践角度,分享一套基于微信小程序的陪诊服务系统的架构设计与核心实现方案。

一、业务背景与场景分析

1.1 独自就医的核心痛点

痛点表现受影响人群
流程陌生不知挂哪科、检查在哪层、怎么取报告老年人、首次就医者
行动不便术后、孕产、残障人群往返科室困难特殊身体状况患者
异地就医对当地医院不熟、语言/交通障碍跨城跨省就医者
时间冲突子女上班无法陪同,老人独赴医院空巢/独居老人家庭
信息理解难报告单看不懂、医嘱记不住文化水平有限人群

1.2 为什么用小程序承载

  • 即用即走:患者/家属无需安装 App,扫码下单,降低使用门槛
  • LBS 原生能力:就近匹配陪诊员、院内导航、路线规划天然适配
  • 微信生态:分享给家属、群沟通、支付、订阅消息提醒一体化
  • 信任与合规:依托微信实名与支付体系,资金与身份可追溯
  • 开发成本可控:一次开发多端复用,便于服务快速上线迭代

二、系统整体架构设计

2.1 架构总览

┌──────────────────────────────────────────────────────┐ │ 微信小程序端 │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────────┐ │ │ │ 首页 │ │ 下单 │ │ 地图 │ │ 沟通 │ │ 个人/档案 │ │ │ └──────┘ └──────┘ └──────┘ └──────┘ └──────────┘ │ └──────────────────┬───────────────────────────────────┘ │ HTTPS / WebSocket ┌──────────────────▼───────────────────────────────────┐ │ API 网关层 │ │ (鉴权 / 限流 / 路由 / 日志) │ └──────────────────┬───────────────────────────────────┘ │ ┌──────────────────▼───────────────────────────────────┐ │ 业务服务层 │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────────┐ │ │ │ 订单 │ │ 陪诊 │ │ 医院 │ │ 就诊 │ │ 支付/保障 │ │ │ │ 服务 │ │ 调度 │ │ 服务 │ │ SOP │ │ 服务 │ │ │ └──────┘ └──────┘ └──────┘ └──────┘ └──────────┘ │ │ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │ IM │ │ 位置 │ │ 档案 │ │ │ │ 服务 │ │ 服务 │ │ 服务 │ │ │ └──────┘ └──────┘ └──────┘ │ └──────────────────┬───────────────────────────────────┘ │ ┌──────────────────▼───────────────────────────────────┐ │ 数据存储层 │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────────┐ │ │ │MySQL │ │Redis │ │MongoDB│ │ ES │ │ 加密存储 │ │ │ └──────┘ └──────┘ └──────┘ └──────┘ └──────────┘ │ └──────────────────────────────────────────────────────┘

2.2 技术选型

层级技术方案说明
小程序端原生小程序 + TDesign关键流程页自定义组件,保障表单体验
状态管理MobX-miniprogram订单态、陪诊员态跨页共享
后端框架Spring Boot 3.x / Node.js NestJS微服务化,调度与支付独立扩容
数据库MySQL 8.0 + Redis 7订单/用户关系 + 缓存与分布式锁
检索Elasticsearch医院、科室、陪诊员模糊检索
实时通信WebSocket + IM陪诊进度推送、医患家属沟通
地图服务腾讯位置服务 / 微信地图院内导航、陪诊员就近匹配
对象存储腾讯云 COS(加密)报告图片、证件等敏感资料加密存储
消息推送微信订阅消息就诊提醒、取药提醒、订单状态变更

三、核心功能模块设计

3.1 医院与科室知识库

陪诊的基础是"懂医院"。需要结构化管理医院、科室、楼层、检查科室位置关系:

// 医院楼层与科室数据模型consthospitalSchema={hospitalId:"HOSP_001",name:"示例市第一人民医院",address:"XX路1号",lat:30.572815,lng:104.066801,departments:[{deptId:"DEP_01",name:"心血管内科",floor:3,building:"门诊楼",avgWaitMinutes:25,// 实时候诊时长(由 HIS/估算获取)guide:"乘门诊楼3号电梯至3层,左转第5诊区"}],// 检查/检验科室与取报告位置(用于动线规划)facilities:[{type:"抽血",floor:2,windowCount:8,avgWaitMinutes:15},{type:"放射",floor:-1,windowCount:4,avgWaitMinutes:30},{type:"取报告",floor:1,selfServiceCount:6}]};

3.2 陪诊员匹配与调度

陪诊员具有技能标签(科室熟悉度、是否可陪轮椅、是否懂方言等)与服务时段,需就近 + 技能匹配:

// 陪诊员匹配(距离优先 + 技能加权)functionmatchCompanion(userLat,userLng,order){// 1. 地理围栏:筛选 5km 内在岗陪诊员constcandidates=companions.filter(c=>c.online&&c.distanceTo(userLat,userLng)<=5000);// 2. 技能过滤:如需要轮椅陪同constfiltered=order.needWheelchair?candidates.filter(c=>c.skills.includes('wheelchair')):candidates;// 3. 综合打分:距离(40%) + 评分(30%) + 科室熟练度(30%)returnfiltered.map(c=>{constdistScore=1-c.distanceTo(userLat,userLng)/5000;constratingScore=c.rating/5;constskillScore=c.deptProficiency[order.deptId]||0.5;c.score=0.4*distScore+0.3*ratingScore+0.3*skillScore;returnc;}).sort((a,b)=>b.score-a.score);}

3.3 就诊流程 SOP 引导

不同就诊类型有标准化流程。系统以 SOP 节点驱动陪诊员与患者:

// 就诊 SOP 节点定义constvisitSop={type:"outpatient",// outpatient|checkup|followupnodes:[{step:1,name:"取号/签到",loc:"门诊大厅自助机",needPhoto:false},{step:2,name:"候诊",loc:"3层候诊区",notifyBefore:3},// 提前3人提醒{step:3,name:"面诊",loc:"5诊区",duration:10},{step:4,name:"缴费",loc:"自助缴费机/线上",payRequired:true},{step:5,name:"检查",loc:"依据医嘱",conditional:true},{step:6,name:"取药",loc:"药房窗口",needPhoto:true},{step:7,name:"取报告",loc:"报告自助机",uploadRequired:true}]};// 进度推进classSopTracker{constructor(sop){this.sop=sop;this.current=0;this.completed=[];}next(photoOrProof){constnode=this.sop.nodes[this.current];// 校验节点约束(如取药需拍照留痕)if(node.needPhoto&&!photoOrProof){thrownewError(`节点「${node.name}」需要拍照确认`);}this.completed.push({...node,doneAt:Date.now()});this.current++;this.broadcastProgress();// 推送给患者家属returnthis.current<this.sop.nodes.length;}broadcastProgress(){// 通过 WebSocket 推送给家属端}}

3.4 实时位置共享

患者家属关心陪诊进度与位置安全,需实时位置共享(脱敏、可关闭):

// 位置共享(患者/陪诊员 → 家属)classLocationShare{startShare(sessionId,role){wx.startLocationUpdate({success:()=>{wx.onLocationChange((res)=>{// 节流:每 10s 上报一次throttledReport(sessionId,role,res.latitude,res.longitude);});}});}stopShare(){wx.stopLocationUpdate();}}

3.5 报告解读与健康档案

患者授权后,陪诊员可上传检查报告图片,系统做 OCR + 结构化归档,并提供通俗解读(接入大模型):

// 报告结构化(伪代码)asyncfunctionarchiveReport(orderId,imagePath,openid){// 1. OCR 提取文字consttext=awaitocrService.recognize(imagePath);// 2. 结构化关键指标(项目/结果/参考范围/异常标记)constitems=parseIndicators(text);// 3. 异常项标记items.forEach(it=>{it.abnormal=it.value<it.range[0]||it.value>it.range[1];});// 4. 写入加密健康档案awaithealthArchive.save(orderId,openid,{rawText:text,items,uploadedAt:Date.now()});returnitems;}

3.6 支付与保障

陪诊费用、陪诊险、爽约赔付等需要清晰的交易与保障链路:

// 下单与支付(微信支付)functioncreateOrder(user,companion,sop){constorder={orderId:generateOrderId(),userId:user.userId,companionId:companion.id,amount:calcAmount(sop),// 基础服务费 + 时长费insurance:true,// 默认含陪诊意外险status:'unpaid',createdAt:Date.now()};// 调用微信支付下单,回调后 status -> 'paid' -> 进入调度returnwechatPay.unifiedOrder(order);}

四、关键技术实现

4.1 小程序分包策略

陪诊流程涉及下单、地图、IM、档案等多个重模块,合理分包:

// app.json 分包配置{"pages":["pages/index/index","pages/order/create","pages/profile/profile"],"subpackages":[{"root":"subpkg/map","name":"map","pages":["pages/hospital-nav/hospital-nav"]},{"root":"subpkg/im","name":"im","pages":["pages/chat/chat"]},{"root":"subpkg/archive","name":"archive","pages":["pages/report/report","pages/health-file/health-file"]}],"preloadRule":{"pages/order/create":{"network":"all","packages":["map"]}}}

4.2 实时进度推送(WebSocket)

家属端实时看到"已取号 / 候诊中 / 检查中 / 已取药"等节点,降低焦虑:

// 进度订阅classProgressSubscription{subscribe(orderId,onUpdate){constsocket=wx.connectSocket({url:`wss://api.example.com/progress?orderId=${orderId}`});socket.onMessage((res)=>{constdata=JSON.parse(res.data);// data: { step, nodeName, status, location, timestamp }onUpdate(data);});returnsocket;}}

4.3 IM 即时通讯

患者、陪诊员、家属三方沟通,需消息持久化与已读回执:

// IM 消息发送(含敏感词过滤)asyncfunctionsendMessage(conversationId,from,to,text){// 内容安全校验(医疗场景同样需过滤违规内容)constcheck=awaitmsgSecCheck(text,from.openid);if(!check.safe)thrownewError('消息包含敏感内容');constmsg={msgId:generateMsgId(),conversationId,from,to,text,sentAt:Date.now(),read:false};awaitimStore.append(msg);// 通过 WebSocket 实时投递imPush.push(to,msg);returnmsg;}

4.4 院内地图与导航

医院内部路网复杂,基于楼层平面图 + 步道图做院内路径规划:

// 院内路径(按楼层分段)functionplanIndoorRoute(start,end){if(start.building!==end.building){// 跨楼:先到连廊/电梯厅,再进入目标楼returnconcat(planWithinBuilding(start,buildingExit(start.building)),planCorridor(start.building,end.building),planWithinBuilding(buildingEntry(end.building),end));}returnplanWithinBuilding(start,end);// 同楼内 Dijkstra}

五、性能与体验优化

5.1 关键优化项

优化项做法效果
订单列表虚拟列表长列表按需渲染千级订单不卡顿
地图标记聚合多医院/陪诊员聚合显示标注数降 90%
图片懒加载 + 压缩报告图上传前压缩上传耗时 -50%
进度推送合并节点变更才推送,去抖动消息量减少 70%
骨架屏订单/档案页先出骨架白屏消除

5.2 弱网容错

医院信号往往较差,所有操作需"本地草稿 + 重试 + 离线队列":

// 表单离线草稿functionsaveOrderDraft(form){wx.setStorageSync('order_draft',{...form,savedAt:Date.now()});}// 恢复草稿functionrestoreOrderDraft(){returnwx.getStorageSync('order_draft')||null;}

六、运营后台设计

6.1 陪诊员管理

陪诊员管理后台: ├── 入驻审核 │ ├── 实名认证 / 健康证 / 资质审核 │ ├── 服务技能培训与考核 │ └── 服务区域与时段配置 ├── 调度管理 │ ├── 订单分配(自动/人工) │ ├── 改派 / 紧急替班 │ └── 异常订单监控 ├── 服务质控 │ ├── SOP 完成度统计 │ ├── 患者评价与投诉 │ └── 服务录音/拍照留痕抽查 └── 结算管理 ├── 陪诊员报酬结算 └── 保险理赔对接

6.2 数据看板

// 核心运营指标constmetrics={orderMetrics:{orderCount:0,// 订单量completeRate:0,// 完成率cancelRate:0,// 取消率avgDuration:0,// 平均服务时长avgRating:0// 平均评分},companionMetrics:{onlineCount:0,// 在岗陪诊员utilization:0,// 人效/接单率topSkill:{}// 热门技能分布},hospitalMetrics:{topHospitals:[],// 订单集中医院deptDemand:{}// 科室需求分布}};

七、安全与合规

7.1 医疗数据隐私(重点)

陪诊涉及健康报告、身份证等高度敏感信息,必须重点防护:

  • 加密存储:报告图片、健康档案使用服务端加密存储(AES + 独立密钥)
  • 最小化授权:仅在使用时申请位置/相册权限,家属位置共享可随时关闭
  • 脱敏展示:列表中不展示完整病历,仅本人与授权陪诊员可见
  • 留存期限:档案按法规设置留存与到期销毁策略
  • 内容安全:IM 与 UGC 接入微信内容安全 API
// 上传报告前本地脱敏(遮挡姓名/身份证号区域,示例)functionmaskBeforeUpload(imagePath,maskRegions){// 实际由服务端 OCR 识别后打码,前端仅做区域提示returnwx.compressImage({src:imagePath,quality:70});}

7.2 陪诊员资质与责任

  • 准入审核:实名 + 健康证 + 背景核查,杜绝无资质人员接单
  • 服务留痕:关键节点拍照/录音(患者授权),纠纷可追溯
  • 保险兜底:每单默认含意外险,明确责任边界

八、总结与展望

8.1 架构亮点

  1. SOP 驱动:以标准化就诊流程节点驱动服务,质量可控、易培训
  2. 就近+技能匹配:地理围栏 + 多维加权,提升匹配效率与满意度
  3. 三方实时协同:患者/陪诊员/家属通过进度推送与 IM 实时互通
  4. 敏感数据防护:加密存储 + 最小化授权 + 脱敏,守住医疗隐私底线
  5. 弱网友好:分包 + 草稿 + 离线队列,适配医院弱信号环境

8.2 技术展望

方向规划
AI 预问诊大模型辅助梳理症状,推荐就诊科室
数字人导诊虚拟导诊员提供院内导航与问答
报告智能解读大模型将报告转为通俗语言 + 风险提醒
医保对接对接医保电子凭证,陪诊费用可医保结算
跨城协同异地就医"出发地+目的地"双端陪诊衔接

写在最后:陪诊的本质是用"人的温度 + 技术的效率"解决就医中的信息不对称。本文从实际项目出发,梳理了匹配调度、SOP 引导、实时协同、隐私合规等核心模块的设计与实现思路,希望能为医疗健康类小程序开发者提供参考。

如果你正在做类似的医疗健康服务系统,欢迎在评论区交流踩坑经验与合规实践。