CuriT
医院设置管理
数据管理
用户管理
订单管理
统计管理
首页数据显示
医院详情显示
用户登录功能
用户实名认证
就诊人管理
预约挂号功能
就医提醒功能
SpringBoot
SpringCloud
Redis
MongoDB
EasyExcel
MyBatisPlus
RabbitMQ
Docker
阿里云OSS
阿里云短信服务
微信登录/支付
定时任务
vue
Element-ui
nuxt
npm
ECharts
请求 service-order 的 OrderApiController 接口
传入参数排班id、就诊人id
调用orderService的saveOrder方法
通过patientFeignClient,调用service-user的PatientApiController的getPatient接口,根据传入的id获取就诊人的信息
调用service-hosp的getScheduleOrderVo接口,根据排班id获取预约下单数据
将排班中的时间与当前时间进行比较,超出当前时间则不可预约
调用service-hosp的getSignInfoVo接口,获取医院签名
封装订单信息
插入订单数据,设置订单状态为 UNPAID(0,"预约成功,待支付")
封装 Map 集合数据,包含就诊人和排班的相关信息,向医院调用 /order/submitOrder
接口提交订单信息
得到医院返回的数据
xxxxxxxxxx
111//预约记录唯一标识(医院预约记录主键)
2String hosRecordId = jsonObject.getString("hosRecordId");
3
4//预约序号
5Integer number = jsonObject.getInteger("number");
6
7//取号时间
8String fetchTime = jsonObject.getString("fetchTime");
9
10//取号地址
11String fetchAddress = jsonObject.getString("fetchAddress");
然后更新挂号平台的订单信息,补全订单上面的信息
向 MQ 中发送消息通知
返回订单id
订单页面点击支付
向 service-order 的 WeixinController 的 /createNative/{orderId}
接口请求,生成微信支付二维码
调用 weixinPayService 的 createNative(orderId) 方法获取生成支付二维码需要的信息
首先从Redis获取 orderId 的二维码信息,如果有信息则直接返回信息
orderService.getById(orderId)
根据id获取订单信息
paymentService.savePaymentInfo(order, PaymentTypeEnum.WEIXIN.getStatus())
保存订单信息,设支付方式订单为微信支付,更新 payment_info 表
封装请求微信支付需要的参数信息
xxxxxxxxxx
201Map paramMap = new HashMap();
2paramMap.put("appid", ConstantPropertiesUtils.APPID);
3paramMap.put("mch_id", ConstantPropertiesUtils.PARTNER);
4paramMap.put("nonce_str", WXPayUtil.generateNonceStr());
5String body = order.getReserveDate() + "就诊" + order.getDepname();
6paramMap.put("body", body);
7//订单交易号,自己生成
8paramMap.put("out_trade_no", order.getOutTradeNo());
9
10//订单金额
11paramMap.put("total_fee", "1");
12paramMap.put("spbill_create_ip", "127.0.0.1");
13paramMap.put("notify_url", "http://guli.shop/api/order/weixinPay/weixinNotify");
14paramMap.put("trade_type", "NATIVE");
15//2、HTTPClient来根据URL访问第三方接口并且传递参数
16HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
17//client设置参数
18client.setXmlParam(WXPayUtil.generateSignedXml(paramMap, ConstantPropertiesUtils.PARTNERKEY));
19client.setHttps(true);
20client.post();
得到微信官方返回的xml数据,取出其中数据,使用 Map 集合封装二维码参数
xxxxxxxxxx
111Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
2//4、封装返回结果集
3Map map = new HashMap<>();
4map.put("orderId", orderId);
5map.put("totalFee", order.getAmount());
6map.put("resultCode", resultMap.get("result_code"));
7map.put("codeUrl", resultMap.get("code_url"));
8if (null != resultMap.get("result_code")) {
9 //微信支付二维码2小时过期,可采取2小时未支付取消订单
10 redisTemplate.opsForValue().set(orderId.toString(), map, 120, TimeUnit.MINUTES);
11}
向Redis存放二维码信息,以orderId为键,结果集为值,设置有效时间为两个小时
返回生成微信支付二维码所需的 Map 集合信息
请求 OrderApiController 的 cancelOrder接口,auth/cancelOrder/{orderId}
,传入订单id,orderId
orderService.cancelOrder(orderId)
取消预约
根据orderId查询订单信息,order_info表
判断订单中的预约排班时间是否超过当前时间,如若超过则无法进行退款
远程调用hospitalFeignClient.getSignInfoVo(orderInfo.getHoscode());
获取医院签名
向医院发送请求,取消订单信息
根据请求返回状态是否为 200
,如果不是则直接return错误信息
判断订单状态,如果为已经支付先进行退款,调用 weixinService.refund(orderId);
根据订单id,orderId
查询支付方式为微信支付的支付信息,payment_info表
根据查询出的 payment_info 信息,将其插入到退款表 refund_info 中
RefundInfo refundInfo = refundInfoService.saveRefundInfo(paymentInfoQuery);
UNREFUND(1,"退款中")
并返回封装的 refundInfo 信息封装微信退款需要的参数信息,封装至Map集合,通过 HttpClient 向微信发送退款请求
获得返回的信息,判断返回的信息中的 result_code
字段是否为 WXPayConstants.SUCCESS
如果是则返回true,并补齐完善 refund_info 的字段信息和退款订单的状态为 REFUND(2,"已退款")
否则返回false
根据 orderId 更改 order_info 表的订单状态为 CANCLE(-1,"取消预约")
发送MQ信息
返回成功 true
效果:
排班分成三部分显示:
x11. 科室信息(大科室与小科室树形展示)
21. 排班日期,分页显示,根据上传排班数据聚合统计产生
31. 排班日期对应的就诊医生信息
请求 service_hosp 的 DepartmentController 的 getDeptList 接口 getDeptList/{hoscode}
调用departmentService.findDeptTree(hoscode)
获得医院的课设列表List<DepartmentVo> list
xxxxxxxxxx
21//创建list集合,用于最终数据封装
2List<DepartmentVo> result = new ArrayList<>();
xxxxxxxxxx
141
2description = "Department") (
3public class DepartmentVo {
4
5 (value = "科室编号")
6 private String depcode;
7
8 (value = "科室名称")
9 private String depname;
10
11 (value = "下级节点")
12 private List<DepartmentVo> children;
13
14}
departmentRepository.findAll(example)
根据 hoscode 向 MongoDB 中的 Department 表查询该医院的所有科室信息
根据大科室编号 bigcode 分组,获取每个大科室里面下级子科室
xxxxxxxxxx
11Map<String, List<Department>> deparmentMap = departmentList.stream().collect(Collectors.groupingBy(Department::getBigcode));
封装数据成DepartmentVo
格式,方便前端渲染
遍历 deparmentMap 获取每个大科室对应的小科室列表
xxxxxxxxxx
221//大科室编号
2String bigcode = entry.getKey();
3//大科室编号对应的全局数据
4List<Department> deparment1List = entry.getValue();
5//封装大科室
6DepartmentVo departmentVo1 = new DepartmentVo();
7departmentVo1.setDepcode(bigcode);
8departmentVo1.setDepname(deparment1List.get(0).getBigname());
9
10//封装小科室
11List<DepartmentVo> children = new ArrayList<>();
12for (Department department : deparment1List) {
13 DepartmentVo departmentVo2 = new DepartmentVo();
14 departmentVo2.setDepcode(department.getDepcode());
15 departmentVo2.setDepname(department.getDepname());
16 //封装到list集合
17 children.add(departmentVo2);
18}
19//把小科室list集合放到大科室children里面
20departmentVo1.setChildren(children);
21//放到最终result里面
22result.add(departmentVo1);
返回封装的 result
, List
return Result.ok(list);
请求 service_hosp 的 ScheduleController 的 getScheduleRule接口getScheduleRule/{page}/{limit}/{hoscode}/{depcode}
查询排班规则数据
调用 scheduleService 的 getRuleSchedule 方法 查询排班规则数据
xxxxxxxxxx
21Map<String, Object> map =
2 scheduleService.getRuleSchedule(page, limit, hoscode, depcode);
根据传过来的信息,设置 MongoDB 查询条件:
hoscode
和depcode
设置查询条件封装 list 结果集为
再次查询 MongoDB 数据库,获取 分组查询的总记录数
根据日期获取对应星期 getDayOfWeek
设置最终数据,进行返回
xxxxxxxxxx
131//设置最终数据,进行返回
2Map<String, Object> result = new HashMap<>();
3result.put("bookingScheduleRuleList", bookingScheduleRuleVoList);
4result.put("total", total);
5
6//获取医院名称
7String hosName = hospitalService.getHospName(hoscode);
8//其他基础数据
9Map<String, String> baseMap = new HashMap<>();
10baseMap.put("hosname", hosName);
11result.put("baseMap", baseMap);
12
13return result;
最后返回封装结果集Result.ok(result)
根据医院编号 、科室编号和工作日期,查询排班详细信息
请求 service_hosp 的 ScheduleController 的 getScheduleDetail 接口,获取当天排班的医护人员信息
x
1List<Schedule> list = scheduleService.getDetailSchedule(hoscode, depcode, workDate);
直接调用 MongoDB 查询 排班的详细信息
其中 packageSchedule(item)
最后返回封装结果集 Result.ok(list);