1.首页
展示内容
(1)获取医院等级(根据数据字典编码获取),
(2)获取地区(根据数据字典编码获取)
(3)医院分页列表(后台已经做过 SelectHospList)
(4)根据医院名称关键字搜索医院列表
医院列表已经做过,直接调用即可。SelectHospList
根据医院名称模糊查询,直接调用mongorepostory的方法查询
另外两个根据数据字典查询,findByDictcode
2.医院详情 (HospitalApiController)
点击医院进到医院详情界面
1.获取医院预约规则
2.获取医院科室
controller
service
获取科室后台系统已经做过,直接调用 findDeptTree
获取医院的预约规则
@Override
public Map<String, Object> item(String hoscode) {
Map<String, Object> result = new HashMap<>();
//医院详情
Hospital hospital = this.setHospitalHosType(this.getByHoscode(hoscode));
result.put("hospital", hospital);
//预约规则
result.put("bookingRule", hospital.getBookingRule());
//不需要重复返回
hospital.setBookingRule(null);
return result;
}
3.用户登录
数据库 mysql yygh_user
模块 service_user
接口:userinfoApicontroller
方法:login
流程:查询传过来的手机号和验证码,进行校验,jwt生成token。
短信模块:service_msm.
点击获取验证码,发送短信,实际就是生成一个随机的6位数,存到redis,有效期为2分钟,校验的时候,从前端获取的和redis做对比,一样说明正确。
4.用户认证
模块:service_user
接口:UserInfoApiController
数据库:mysql user_info
前端填完认证信息,传给接口,根据传过来的用户id查找用户,将传过来的认证信息填加到用户信息中,然后更新数据库。
//用户认证
@Override
public void userAuth(Long userId, UserAuthVo userAuthVo) {
//根据用户id查询用户信息
UserInfo userInfo = baseMapper.selectById(userId);
//设置认证信息
//认证人姓名
userInfo.setName(userAuthVo.getName());
//其他认证信息
userInfo.setCertificatesType(userAuthVo.getCertificatesType());
userInfo.setCertificatesNo(userAuthVo.getCertificatesNo());
userInfo.setCertificatesUrl(userAuthVo.getCertificatesUrl());
userInfo.setAuthStatus(AuthStatusEnum.AUTH_RUN.getStatus());
//进行信息更新
baseMapper.updateById(userInfo);
}
5.就诊人管理
对就诊人的增删改查
数据库:yygh_user patient
模块: service-user
接口:PatientApiController
也要调用数据字典接口,封装就诊人信息,比如证件类型之类的。
(1)根据当前登录的用户id获取所有的就诊人列表
//获取就诊人列表
@Override
public List<Patient> findAllUserId(Long userId) {
//根据userid查询所有就诊人信息列表
QueryWrapper<Patient> wrapper = new QueryWrapper<>();
wrapper.eq("user_id",userId);
List<Patient> patientList = baseMapper.selectList(wrapper);
//通过远程调用,得到编码对应具体内容,查询数据字典表内容
patientList.stream().forEach(item -> {
//其他参数封装
this.packPatient(item);
});
return patientList;
}
packPatient方法
//Patient对象里面其他参数封装
private Patient packPatient(Patient patient) {
//根据证件类型编码,获取证件类型具体指
String certificatesTypeString =
dictFeignClient.getName(DictEnum.CERTIFICATES_TYPE.getDictCode(), patient.getCertificatesType());//联系人证件
//联系人证件类型
String contactsCertificatesTypeString =
dictFeignClient.getName(DictEnum.CERTIFICATES_TYPE.getDictCode(),patient.getContactsCertificatesType());
//省
String provinceString = dictFeignClient.getName(patient.getProvinceCode());
//市
String cityString = dictFeignClient.getName(patient.getCityCode());
//区
String districtString = dictFeignClient.getName(patient.getDistrictCode());
patient.getParam().put("certificatesTypeString", certificatesTypeString);
patient.getParam().put("contactsCertificatesTypeString", contactsCertificatesTypeString);
patient.getParam().put("provinceString", provinceString);
patient.getParam().put("cityString", cityString);
patient.getParam().put("districtString", districtString);
patient.getParam().put("fullAddress", provinceString + cityString + districtString + patient.getAddress());
return patient;
}
(2)添加就诊人
获取请求中的用户id
//添加就诊人
@PostMapping("auth/save")
public Result savePatient(@RequestBody Patient patient,HttpServletRequest request) {
//获取当前登录用户id
Long userId = AuthContextHolder.getUserId(request);
patient.setUserId(userId);
patientService.save(patient);
return Result.ok();
}
(3)删除和修改就诊人
6.用户列表
属于后台系统
模块:service_user
接口:UserController
1.查询用户列表:方法 list
Mybatisplus的条件分页查询。
2.锁定,先根据传过来的id获取用户信息,再将传过来的状态更新,然后再更新数据库。
3.查看用户详情,需要用户信息和就诊人信息
4.用户认证列表,也是调用用户列表接口,要求authstatus值为1的用户。
5.认证审批,根据传过来的authstatus更新数据库。
7.预约挂号
模块:yygh_hosp
接口;HospitalApiController
后台系统已经做过,在医院详情页面,点击某个科室,跳转到预约挂号界面,展示可预约的日期,从当前日期延后10天
1.展示可预约的日期:方法:getbookingschedule
2.点击可预约的日期,展示预约详情 方法:findschedulelist
3.点击剩余号的数量,到预约确认界面,展示预约的信息 方法 getschedule
8.预约下单
点击剩余的号数,进行下单,获取就诊人的信息,展示预约的信息。
模块:service_order
接口:orderApiController
方法:submitorder
点击确认挂号,进行下单,传入就诊人id和排班id,调用servicemanage模块的方法,处理可预约数-1等操作,然后根据manage模块返回的数据,进行数据库更新。然后发送mq,更新mongodb中schedule表的数据(主要是预约数)。
service
//保存订单
@Override
public Long saveOrder(String scheduleId, Long patientId) {
//获取就诊人信息
Patient patient = patientFeignClient.getPatient(patientId);
if(null == patient) {
throw new YyghException(ResultCodeEnum.PARAM_ERROR);
}
//获取排班信息
ScheduleOrderVo scheduleOrderVo = hospitalFeignClient.getScheduleOrderVo(scheduleId);
if(null == scheduleOrderVo) {
throw new YyghException(ResultCodeEnum.PARAM_ERROR);
}
//当前时间不可以预约
if(new DateTime(scheduleOrderVo.getStartTime()).isAfterNow()
|| new DateTime(scheduleOrderVo.getEndTime()).isBeforeNow()) {
throw new YyghException(ResultCodeEnum.TIME_NO);
}
//获取下单引用签名 主要是apiurl和signkey
SignInfoVo signInfoVo = hospitalFeignClient.getSignInfoVo(scheduleOrderVo.getHoscode());
if(null == scheduleOrderVo) {
throw new YyghException(ResultCodeEnum.PARAM_ERROR);
}
if(scheduleOrderVo.getAvailableNumber() <= 0) {
throw new YyghException(ResultCodeEnum.NUMBER_NO);
}
OrderInfo orderInfo = new OrderInfo();
BeanUtils.copyProperties(scheduleOrderVo, orderInfo);
String outTradeNo = System.currentTimeMillis() + ""+ new Random().nextInt(100);
orderInfo.setOutTradeNo(outTradeNo);
orderInfo.setScheduleId(scheduleOrderVo.getHosScheduleId());
orderInfo.setUserId(patient.getUserId());
orderInfo.setPatientId(patientId);
orderInfo.setPatientName(patient.getName());
orderInfo.setPatientPhone(patient.getPhone());
orderInfo.setOrderStatus(OrderStatusEnum.UNPAID.getStatus());
this.save(orderInfo);
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("hoscode",orderInfo.getHoscode());
paramMap.put("depcode",orderInfo.getDepcode());
paramMap.put("hosScheduleId",orderInfo.getScheduleId());
paramMap.put("reserveDate",new DateTime(orderInfo.getReserveDate()).toString("yyyy-MM-dd"));
paramMap.put("reserveTime", orderInfo.getReserveTime());
paramMap.put("amount",orderInfo.getAmount());
paramMap.put("name", patient.getName());
paramMap.put("certificatesType",patient.getCertificatesType());
paramMap.put("certificatesNo", patient.getCertificatesNo());
paramMap.put("sex",patient.getSex());
paramMap.put("birthdate", patient.getBirthdate());
paramMap.put("phone",patient.getPhone());
paramMap.put("isMarry", patient.getIsMarry());
paramMap.put("provinceCode",patient.getProvinceCode());
paramMap.put("cityCode", patient.getCityCode());
paramMap.put("districtCode",patient.getDistrictCode());
paramMap.put("address",patient.getAddress());
//联系人
paramMap.put("contactsName",patient.getContactsName());
paramMap.put("contactsCertificatesType", patient.getContactsCertificatesType());
paramMap.put("contactsCertificatesNo",patient.getContactsCertificatesNo());
paramMap.put("contactsPhone",patient.getContactsPhone());
paramMap.put("timestamp", HttpRequestHelper.getTimestamp());
String sign = HttpRequestHelper.getSign(paramMap, signInfoVo.getSignKey());
paramMap.put("sign", sign);
//JSONObject result = HttpRequestHelper.sendRequest(paramMap, signInfoVo.getApiUrl()+"/order/submitOrder");
//if(result.getInteger("code") == 200) {
// JSONObject jsonObject = result.getJSONObject("data");
// //预约记录唯一标识(医院预约记录主键)
// String hosRecordId = jsonObject.getString("hosRecordId");
// //预约序号
// Integer number = jsonObject.getInteger("number");;
// //取号时间
// String fetchTime = jsonObject.getString("fetchTime");;
// //取号地址
// String fetchAddress = jsonObject.getString("fetchAddress");;
// //更新订单
// orderInfo.setHosRecordId(hosRecordId);
// orderInfo.setNumber(number);
// orderInfo.setFetchTime(fetchTime);
// orderInfo.setFetchAddress(fetchAddress);
// baseMapper.updateById(orderInfo);
// //排班可预约数
// Integer reservedNumber = jsonObject.getInteger("reservedNumber");
// //排班剩余预约数
// Integer availableNumber = jsonObject.getInteger("availableNumber");
// //发送mq信息更新号源和短信通知
// //发送mq信息更新号源
// OrderMqVo orderMqVo = new OrderMqVo();
// orderMqVo.setScheduleId(scheduleId);
// orderMqVo.setReservedNumber(reservedNumber);
// orderMqVo.setAvailableNumber(availableNumber);
//
// //短信提示
// MsmVo msmVo = new MsmVo();
// msmVo.setPhone(orderInfo.getPatientPhone());
// msmVo.setTemplateCode("SMS_194640721");
// String reserveDate =
// new DateTime(orderInfo.getReserveDate()).toString("yyyy-MM-dd")
// + (orderInfo.getReserveTime()==0 ? "上午": "下午");
// Map<String,Object> param = new HashMap<String,Object>(){{
// put("title", orderInfo.getHosname()+"|"+orderInfo.getDepname()+"|"+orderInfo.getTitle());
// put("amount", orderInfo.getAmount());
// put("reserveDate", reserveDate);
// put("name", orderInfo.getPatientName());
// put("quitTime", new DateTime(orderInfo.getQuitTime()).toString("yyyy-MM-dd HH:mm"));
// }};
// msmVo.setParam(param);
// //orderMqVo.setMsmVo(msmVo);
// rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_ORDER, MqConst.ROUTING_ORDER, orderMqVo);
//
//} else {
// throw new YyghException(result.getString("message"), ResultCodeEnum.FAIL.getCode());
//}
return orderInfo.getId();
}
9.订单列表
模块:service_order
接口:orderApiController
方法:list
Mybatisplus的条件查询。
10.订单详情
根据订单id查询订单详情
方法:Getorders
11.统计预约数量
后台系统
请求到service-statistics模块,远程调用order模块,实现统计查询。
service
@Override
public Map<String, Object> getCountMap(OrderCountQueryVo orderCountQueryVo) {
Map<String, Object> map = new HashMap<>();
List<OrderCountVo> orderCountVoList
= baseMapper.selectOrderCount(orderCountQueryVo);
//日期列表
List<String> dateList
=orderCountVoList.stream().map(OrderCountVo::getReserveDate).collect(Collectors.toList());
//统计列表
List<Integer> countList
=orderCountVoList.stream().map(OrderCountVo::getCount).collect(Collectors.toList());
map.put("dateList", dateList);
map.put("countList", countList);
return map;
}