项目总结---

尚医通:
主要任务
1.完成了医院设置列表相关开发
主要作用是确保了哪些医院能够加入这个预约挂号平台的增删改查功能开发 里面有医院编号 医院名称 api基础路径 签名秘钥等信息
医院设置主要是用来保存开通医院的一些基本信息,每个医院一条信息,保存了医院编号(平台分配,全局唯一)和接口调用相关的签名key等信息,是整个流程的第一步,只有开通了医院设置信息,才可以上传医院相关信息。

2.数据字典接口相关开发
数据字典接口信息的展示(DictController→根据数据id查询子数据列表,传入参数为1即可,就可以显示所有大类信息,懒加载前端实现),并且这个数据是经常不回变动的数据,就采用Spring Cache + Redis 缓存数据,提高查询速度,并且通过EasyExcel,进行导出导入数据。
2.2上传医院接口(单独的 service_hosp→ApiController→上传医院接口 最后要把医院数据添加到MongoDB中去记住)
首先在hospital-manage点击添加按钮,出现JSON数据输入(输入医院相关信息),点击保存之后,就调用service_hosp,ApiController,上传医院接口将医院数据保存到MongoDB中去,如果已经存在则更新数据信息。
注意需要做一个校验,比如说(只有123医院才能去调这个接口,修改123医院的信息)具体逻辑
//1 获取医院系统传递过来的签名,签名进行MD5加密
//2 根据传递过来医院编码,查询数据库,查询签名
//3 把数据库查询签名进行MD5加密(比较的是加密后的数字 MD5不可逆)
//4 判断签名是否一致

3.排班模块的开发 (ScheduleController)
1.大小科室树形展示:
首先是完成了根据医院编号获取科室接口的开发(传入一个参数医院编号)→查询出医院所有科室列表,但是需要按照树形结构显示。采取的方案是根据大科室编号,bigcode分组,获取每个大科室里面下的子分组。采用的是jdk1.8提供流的方式,先提取出大科室,在将小科室数据,封装在大科室里面,具体可以看看这块的代码实现。
2.排班日期,分页显示
首先是//根据医院编号 和 科室编号 ,查询排班规则数据接口开发(传入四个参数 当前页 每页记录数 医院编号 科室编号) →具体实现 1.根据医院编号和科室编号查询数据 2. 根据工作日workDate期进行分组 3.统计号源数量 4.实现分页
3.根据排班日期获取排班详情列表
//根据医院编号 、科室编号和工作日期,查询排班详细信息接口开发(传入三个参数 医院编号 、科室编号和工作日期)→具体实现//根据参数查询mongodb得到相应List集合 然后//把得到list集合遍历,向设置其他值:医院名称、科室名称、日期对应星期
接下来是整合了服务网关,Spring Cloud Gateway,主要解决了两个问题,一个就是代替了Nginx,还有一个就是解决了跨域问题,不用在每个controller,接口加@CrossOrigin注解。

4.前台用户登录功能,手机验证码,接口开发
UserInfoApiController //用户手机号登录接口→完成这个首先需要完成发送短信接口的开发
1.发送短信接口开发(service_msm下的MsmApiController→发送手机验证码)
(首先传入手机号一个参数)→判断Redis是否存在手机号对应的验证码存在则返回OK→如果不存在 则首先生成一个六位数的随机验证码,调用service方法,通过整合短信服务进行发送→最后 生成验证码放到redis里面,设置有效时间为30秒。
2.下面完成用户手机号登录接口(service_user下的UserInfoApiController→用户手机号登录接口)
(首先传入实体类LoginVo→里面有手机号验证码之类的参数)大概逻辑 :从loginVo获取输入的手机号,和验证码→ 判断手机号和验证码是否为空→判断手机验证码和输入的验证码是否一致→判断是否第一次登录:根据手机号查询数据库,如果不存在相同手机号就是第一次登录(就将信息插入到数据中去)存在则直接登陆→返回登录信息,返回登录用户名,返回Token信息(用户名 和用户id)
token大概意思就是,每次做操作就会进行判断,将token信息,存储到一个字符串中,看字符串中是否存在该信息,存在即可操作,可以设置一个token过期时间。当然也可以用session做这样的功能。当然token可以放在请求头中传递,cookie中传递,或者地址栏中传递都可以。
用户认证与网关整合(server-gateway)
这时候需要用户认证与网关整合1.所有请求都会经过服务网关,服务网关对外暴露服务,在网关进行统一用户证;2.既然要在网关进行用户认证,网关得知道对哪些url进行认证,所以我们得对ur制定规则3.Api接口异步请求的,我们采取url规则匹配,如:/api//auth/,如凡是满足该规则的都必须用户认证
1.在服务网关添加fillter
/api//auth/,如凡是满足该规则的都必须用户认证
2.在服务网关中判断用户登录状态(如果是登陆则可以直接返回,不是登陆则直接返回未登录)
在网关中如何获取用户信息:1,我们统一从header头信息中获取
如何判断用户信息合法:登录时我们返回用户token,在服务网关中获取到token后,我在到redis中去查看用户id,如何用户id存在,则token合法,否则不合法
3.取用户信息

5.就诊人管理模块开发(service_user)
预约下单需要选择就诊人,因此我们要实现就诊人管理,前端就诊人管理其实就是要实现一个完整的增删改查
主要做的就是就诊人的增删改查。(PatientApiController)
1.获取就诊人列表(auth/findAll)
首先传入参数(HttpServletRequest request)从请求中获取获取用户id(有一个工工具类AuthContextHolder,实际是从Token中取出来的)→然后根据用户id从就诊人表中查出所有就诊人自己实现这个方法。→具体就是先根据用户id,调用baseMapper方法,查出所有就诊人信息(List集合)→然后通过Sream流的方式封装额外的参数,其中用到了feign,要调用cmn中的接口,主要做的是根据证件类型编码,证件类型,获取证件类型具体值(就是要将patien表中某些字段的编码,通过Dict变成具体内容,通过BaseEntity里有一个HashMap设置进去)→最后返回这个集合
2. 添加就诊人
比较简单,传入对象,和http请求。然后通过request获取当前登录用户id,然后将这个id设置到Patient对象中去,然后插入数据库。
3. 根据id获取就诊人信息
4. 修改就诊人
5. 删除就诊人
都比较简单
6.预约挂号模块开发 (service_hosp)
一.预约挂号详情(HospApiController)
1、接口分析
(1)根据预约周期,展示可预约日期数据,按分页展示
(2)选择日期展示当天可预约列表(该接口后台已经实现过)
2、页面展示分析
(1)分页展示可预约日期,根据有号、无号、约满等状态展示不同颜色,以示区分
(2)可预约最后一个日期为即将放号日期,根据放号时间页面展示倒计时
大致逻辑就是,首先需要传递四个参数进接口(当前页码 page,每页记录数 limit,医院code hashcode,科室code depcode)→根据医院编号获取到医院数据(医院数据是在MongoDB中的)然后提取里面的预约数据→将预约数据做一个分页处理。
其中获取可预约日志分页数据做了细节处理,首先获取到当天放号时间(只有时和分,比如08:30 在和当天的年月日拼接起来),年月日,小时分钟。→获取预约周期(有一个cycle为10,比如说能预约3月1日到10日的号)如果当天放号时间已经过去了,预约周期从后一天开始计算,周期+1→获取可预约所有日期,最后一天显示即将放号(其中显示做了细节处理//因为预约周期不同的,每页显示日期最多7天数据,超过7天分页:如果可以显示数据小于7,直接显示,如果可以显示数据大于7,进行分页)→接下来获取可预约日期里面科室的剩余预约数(需要同时满足三个条件,hoscode,depcode,workDate 最后实现的事情就是根据workData分组,求和可预约数量和放号数量)→得到两处数据之后合并这两个数据(用一个map集合存储:合并数据 map集合 key日期 value预约规则和剩余数量等具体细节看接口)→最后将数据放入map集合,并且将其他基础数据放入map集合。
二.预约确认(service_hosp)
1、根据排班id获取排班信息(数据是在MongoDB中,id为主键是schedule表),在页面展示(HospApiController→获取排班id获取排班数据)
2、选择就诊人
3、预约下单(下单完成后,会在order_info就是订单表中生成一条数据,里面有订单的相关信息)

7.预约下单模块(service-order下的OrderApiController)
下单参数:就诊人id与排班id
1、下单我们要获取就诊人信息
首先在service-user里的PatientApiController根据id获取就诊人信息(将这个接口实现,注意是内部接口,不需要认证)然后添加到feign中去→然后再OrderApiController远程调用
2、获取排班下单信息与规则信息
然后在service-hosp里的HospApiController根据排班id获取预约下单数据(将这个接口实现,注意是内部接口,不需要认证)添加到feign中去→然后再OrderApiController远程调用
3、获取医院签名信息,然后通过接口去医院预约下单(传入一个参数hoscode 编号)
然后在service-hosp里的HospApiController获取医院签名信息(将这个接口实现,注意是内部接口,不需要认证)需要做个比对,这个数据是在hosptitalset里的sign_key,和ApiUrl,最后将数据封装在SignInfoVo(签名信息实体类)里面返回同样添加到feign。
4、下单成功更新排班信息与发送短信
1.//生成挂号订单
下面正式开始生成挂号订单OrderApiController→//获取就诊人信息 //获取排班相关信息 //判断当前时间是否还可以预约 //获取签名信息 //添加到订单表(OrderInfo实体类 里面是具体订单信息) //scheduleOrderVo 数据复制到 orderInfo //向orderInfo设置其他数据 (默认将订单状态设置为,预约成功待支付) //调用医院接口(hospital-manage→HospitalController→下的预约下单),实现预约挂号操作 //设置调用医院接口需要参数,参数放到map集合 //请求医院系统接口(因为医院管理系统没有在Nacos中注册过,相当于独立的,通过 HttpRequestHelper工具类来请求,实现预约下单操作,此时可以立即更新消息预约数量等 但可能会有频繁变动交给mq比较好 //发送mq消息,号源更新和短信通知 //发送mq信息更新号源)
mq首先做了一个短信的封装,mq发送短信封装。然后创建短信监听器(在service_msm MsmReceiver模块),监听到相关信息后,就发送短信。然后做了一个更新排班数量的封装(在service_hosp HospitalReceiver模块),监听到相关信息后,就发送短信。
接下来继续,在OrderMqVo实体类设置 可预约数 剩余预约数 排班id→然后进行短信提示 在MsmVo实体类
设置就诊人手机号,短信模版参数。再将MsmVo实体设置到OrderMqVo里的MsmVo。然后发送消息。
总结逻辑就是,封装消息,发送到指定消息队列,等待监听器监听并消费消息,实现预约下单之后短信发送。
order是生产者,msm和hosptital模块是消费者,order发送到两个模块接受。
首先下单→预约下单mq监听器接受并更新排班信息→在通过mq发送短信到指定消息队列→短信mq监听器接收,做发送短信操作。

8.微信支付模块
有了订单之后就需要支付,微信支付(WeiXinController)。首先生成微信支付二维码, //1 根据orderId获取订单信息,//2 向支付记录表添加信息→3.然后设置参数,调用微信生成二维码接口,把参数转化成xml格式,使用商户key进行加密→4 调用微信生成二维码接口,httpclient调用 设置map参数→5 返回相关数据 转换map集合→封装返回结果集 codeUrl是二维码地址(对返回结果加入到redis中去,做一个超时时间限制,就是二维码有效期)
调用查询支付状态,通过微信接口实现支付状态查询,支付成功则更新状态信息(//1 根据订单编号得到支付记录 //2 更新支付记录信息 //3 根据订单号得到订单信息 //4 更新订单信息 //5 调用医院接口,更新订单支付信息)
9.取消预约模块
取消订单分两种情况:
1、未支付取消订单,直接通知医院更新取消预约状态
2.已支付取消订单,先退款给用户,然后通知医院更新取消预约状态
退款我们是根据支付记录发起退款的→首先在接口传入一个orderId→然后获取支付记录信息需要两个参数分别是orderId和支付类型这里选择微信支付类型→然后添加退款信息到退款记录表去(会判断退款信息表是否重复,如果数据库有相同的则不添加)→判断当前订单数据是否已经退款 没有就调用微信接口实现退款 通过HttpClient发送(封装需要的参数)→然后接收返回回来的数据如果退款成功就更新退款状态之类的信息。
下面开始开发Controller部分 OrderApiController开发 //取消预约
首先是传入orderId即订单id→然后获取订单信息 判断是否可以取消因为有一个时间限制过了就不能取消如果过了就抛出异常→然后//调用医院接口实现预约取消 //根据医院接口返回数据→然后判断是否成功 如果成功 则判断当前订单是否可以取消 如果未支付就不用退钱 已支付就退钱→调用刚才写的退款方法 成功后→更新订单状态 将orderInfo里的状态信息 更新为取消状态→然后发送mq更新预约数量这时候需要+1了

10.就医提醒模块
我们通过定时任务,每天8点执行,提醒就诊 service_task模块 →
首先发送消息到相应的消息队列→然后在OrderReceiver添加一个监听 监听到就会调用监听器下面的方法来实现我们的功能→然后封装条件(当天的 然后消息未被取消的满足这两个)返回满足条件的订单信息集合→遍历他像通过rabbitservice 像每一个就诊人发送就医提醒
整体逻辑就是,每天八点会执行一个定时任务向rabbitmq对应队列(QUEUE_TASK_8)发送一个消息,然后在Order里面写上一个mq的监听器监听这个队列→队列中有消息之后然后封装条件(当天的 然后消息未被取消的满足这两个)返回满足条件的订单信息集合→遍历他像通过rabbitservice 像每一个就诊人发送就医提醒

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值