基于微信小程序的陪诊服务系统设计与实现
基于微信小程序的陪诊服务系统设计与实现随着社会老龄化加剧与异地就医需求增长独自看病难成为越来越多人的现实困境。陪诊服务通过专业人员协助完成挂号、候诊、取药、送检等流程正在成为医疗服务的有益补充。本文从工程实践角度分享一套基于微信小程序的陪诊服务系统的架构设计与核心实现方案。一、业务背景与场景分析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 内在岗陪诊员constcandidatescompanions.filter(cc.onlinec.distanceTo(userLat,userLng)5000);// 2. 技能过滤如需要轮椅陪同constfilteredorder.needWheelchair?candidates.filter(cc.skills.includes(wheelchair)):candidates;// 3. 综合打分距离(40%) 评分(30%) 科室熟练度(30%)returnfiltered.map(c{constdistScore1-c.distanceTo(userLat,userLng)/5000;constratingScorec.rating/5;constskillScorec.deptProficiency[order.deptId]||0.5;c.score0.4*distScore0.3*ratingScore0.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.sopsop;this.current0;this.completed[];}next(photoOrProof){constnodethis.sop.nodes[this.current];// 校验节点约束如取药需拍照留痕if(node.needPhoto!photoOrProof){thrownewError(节点「${node.name}」需要拍照确认);}this.completed.push({...node,doneAt:Date.now()});this.current;this.broadcastProgress();// 推送给患者家属returnthis.currentthis.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 提取文字consttextawaitocrService.recognize(imagePath);// 2. 结构化关键指标项目/结果/参考范围/异常标记constitemsparseIndicators(text);// 3. 异常项标记items.forEach(it{it.abnormalit.valueit.range[0]||it.valueit.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){constsocketwx.connectSocket({url:wss://api.example.com/progress?orderId${orderId}});socket.onMessage((res){constdataJSON.parse(res.data);// data: { step, nodeName, status, location, timestamp }onUpdate(data);});returnsocket;}}4.3 IM 即时通讯患者、陪诊员、家属三方沟通需消息持久化与已读回执// IM 消息发送含敏感词过滤asyncfunctionsendMessage(conversationId,from,to,text){// 内容安全校验医疗场景同样需过滤违规内容constcheckawaitmsgSecCheck(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 架构亮点SOP 驱动以标准化就诊流程节点驱动服务质量可控、易培训就近技能匹配地理围栏 多维加权提升匹配效率与满意度三方实时协同患者/陪诊员/家属通过进度推送与 IM 实时互通敏感数据防护加密存储 最小化授权 脱敏守住医疗隐私底线弱网友好分包 草稿 离线队列适配医院弱信号环境8.2 技术展望方向规划AI 预问诊大模型辅助梳理症状推荐就诊科室数字人导诊虚拟导诊员提供院内导航与问答报告智能解读大模型将报告转为通俗语言 风险提醒医保对接对接医保电子凭证陪诊费用可医保结算跨城协同异地就医出发地目的地双端陪诊衔接写在最后陪诊的本质是用人的温度 技术的效率解决就医中的信息不对称。本文从实际项目出发梳理了匹配调度、SOP 引导、实时协同、隐私合规等核心模块的设计与实现思路希望能为医疗健康类小程序开发者提供参考。如果你正在做类似的医疗健康服务系统欢迎在评论区交流踩坑经验与合规实践。

相关新闻

最新新闻

日新闻

周新闻

月新闻