尚医通

CuriT

一、系统架构

尚医通架构图

尚医通业务流程

 

二、项目总结

后台管理系统

  1. 医院设置管理

    • 医院设置列表、添加、锁定、删除
    • 医院列表、详情、排班、下线
  2. 数据管理

    • 数据字典树形显示、导入、导出
  3. 用户管理

    • 用户列表、查看、锁定
    • 认证用户审批
  4. 订单管理

    • 订单列表、详情
  5. 统计管理

    • 预约统计

前台用户系统

  1. 首页数据显示

    • 医院列表
  2. 医院详情显示

    • 医院科室显示
  3. 用户登录功能

    • 手机号登录(短信验证码发送)
    • 微信扫描登录
  4. 用户实名认证

  5. 就诊人管理

    • 列表、添加、详情、删除
  6. 预约挂号功能

    • 排班和挂号详情信息
    • 确认挂号信息
    • 生成预约挂号订单
    • 挂号订单支付(微信)
    • 取消预约订单
  7. 就医提醒功能

后端技术

  1. SpringBoot

  2. SpringCloud

    • Nacos注册中心
    • Feign
    • GateWay
  3. Redis

    • 使用Redis作为缓存
    • 验证码有效时间、支付二维码有效时间
  4. MongoDB

    • 使用MongoDB存储 医院相关数据
  5. EasyExcel

    • 操作excel表格,进行读和写操作
  6. MyBatisPlus

  7. RabbitMQ

    • 订单相关操作,发送mq消息
  8. Docker

    • 下载镜像 docker pull
    • 创建容器 docker run
  9. 阿里云OSS

  10. 阿里云短信服务

  11. 微信登录/支付

  12. 定时任务

前端技术

  1. vue

    • 前端框架
  2. Element-ui

    • 前端组件库
  3. nuxt

    • 服务端渲染技术
  4. npm

    • 包管理
  5. ECharts

    • 图标展示组件

 

三、业务逻辑

订单

订单生成

  1. 请求 service-order 的 OrderApiController 接口

  2. 传入参数排班id、就诊人id

  3. 调用orderService的saveOrder方法

    1. 通过patientFeignClient,调用service-user的PatientApiController的getPatient接口,根据传入的id获取就诊人的信息

    2. 调用service-hosp的getScheduleOrderVo接口,根据排班id获取预约下单数据

    3. 将排班中的时间与当前时间进行比较,超出当前时间则不可预约

    4. 调用service-hosp的getSignInfoVo接口,获取医院签名

    5. 封装订单信息

      image-20220726205927326

    6. 插入订单数据,设置订单状态为 UNPAID(0,"预约成功,待支付")

    7. 封装 Map 集合数据,包含就诊人和排班的相关信息,向医院调用 /order/submitOrder 接口提交订单信息

    8. 得到医院返回的数据

    9. 然后更新挂号平台的订单信息,补全订单上面的信息

    10. 向 MQ 中发送消息通知

  4. 返回订单id

 

订单支付

  1. 订单页面点击支付

  2. 向 service-order 的 WeixinController 的 /createNative/{orderId}接口请求,生成微信支付二维码

  3. 调用 weixinPayService 的 createNative(orderId) 方法获取生成支付二维码需要的信息

    1. 首先从Redis获取 orderId 的二维码信息,如果有信息则直接返回信息

    2. orderService.getById(orderId)根据id获取订单信息

    3. paymentService.savePaymentInfo(order, PaymentTypeEnum.WEIXIN.getStatus())保存订单信息,设支付方式订单为微信支付,更新 payment_info 表

    4. 封装请求微信支付需要的参数信息

    5. 得到微信官方返回的xml数据,取出其中数据,使用 Map 集合封装二维码参数

    6. 向Redis存放二维码信息,以orderId为键,结果集为值,设置有效时间为两个小时

  4. 返回生成微信支付二维码所需的 Map 集合信息

 

订单取消

  1. 请求 OrderApiController 的 cancelOrder接口,auth/cancelOrder/{orderId},传入订单id,orderId

  2. orderService.cancelOrder(orderId)取消预约

    1. 根据orderId查询订单信息,order_info表

    2. 判断订单中的预约排班时间是否超过当前时间,如若超过则无法进行退款

    3. 远程调用hospitalFeignClient.getSignInfoVo(orderInfo.getHoscode());获取医院签名

    4. 向医院发送请求,取消订单信息

    5. 根据请求返回状态是否为 200 ,如果不是则直接return错误信息

    6. 判断订单状态,如果为已经支付先进行退款,调用 weixinService.refund(orderId);

      1. 根据订单id,orderId 查询支付方式为微信支付的支付信息,payment_info表

      2. 根据查询出的 payment_info 信息,将其插入到退款表 refund_info 中

      3. RefundInfo refundInfo = refundInfoService.saveRefundInfo(paymentInfoQuery);

        1. 根据 paymentInfoQuery 的支付信息,利用其中的订单号在 refund_info 表中查询,如果有记录则直接返回退款信息
        2. 然后封装退款信息,插入至 refund_info 中,订单状态为 UNREFUND(1,"退款中")并返回封装的 refundInfo 信息
      4. 封装微信退款需要的参数信息,封装至Map集合,通过 HttpClient 向微信发送退款请求

      5. 获得返回的信息,判断返回的信息中的 result_code字段是否为 WXPayConstants.SUCCESS

      6. 如果是则返回true,并补齐完善 refund_info 的字段信息和退款订单的状态为 REFUND(2,"已退款")

      7. 否则返回false

    7. 根据 orderId 更改 order_info 表的订单状态为 CANCLE(-1,"取消预约")

    8. 发送MQ信息

    9. 返回成功 true

 

排班

排班管理

效果:

image-20220728084121347

排班分成三部分显示:

 

科室信息

  1. 请求 service_hosp 的 DepartmentController 的 getDeptList 接口 getDeptList/{hoscode}

  2. 调用departmentService.findDeptTree(hoscode)获得医院的课设列表List<DepartmentVo> list

    1.  

       

    2. departmentRepository.findAll(example)根据 hoscode 向 MongoDB 中的 Department 表查询该医院的所有科室信息

    3. 根据大科室编号 bigcode 分组,获取每个大科室里面下级子科室

    4. 封装数据成DepartmentVo格式,方便前端渲染

    5. 遍历 deparmentMap 获取每个大科室对应的小科室列表

    6. 返回封装的 result, List

  3. return Result.ok(list);

 

排班日期

  1. 请求 service_hosp 的 ScheduleController 的 getScheduleRule接口getScheduleRule/{page}/{limit}/{hoscode}/{depcode}查询排班规则数据

  2. 调用 scheduleService 的 getRuleSchedule 方法 查询排班规则数据

  3. 根据传过来的信息,设置 MongoDB 查询条件:

    1. 根据hoscodedepcode设置查询条件
    2. 根据工作日期进行分组

    image-20220728100518063

    1. 封装 list 结果集为

      image-20220728101049411

    2. 再次查询 MongoDB 数据库,获取 分组查询的总记录数

      image-20220728101348969

    3. 根据日期获取对应星期 getDayOfWeek

      image-20220728101503097

    4. 设置最终数据,进行返回

  4. 最后返回封装结果集Result.ok(result)

 

就诊医生信息

  1. 根据医院编号 、科室编号和工作日期,查询排班详细信息

  2. 请求 service_hosp 的 ScheduleController 的 getScheduleDetail 接口,获取当天排班的医护人员信息

    1. 直接调用 MongoDB 查询 排班的详细信息

      image-20220728102707120

    2. 其中 packageSchedule(item)

      image-20220728102810549

  3. 最后返回封装结果集 Result.ok(list);

 

 

 

 

 

 

 

END