主要还是源代码中将scheduleId与hosScheduleId搞混。
这里简单整理一下,有些细节不太记得了。
解决方法:
在booking方法传多一个参数
之后在booking.vue页面分别取出这两个参数进行传递
后端也用三个参数接收
OrderServiceImpl的saveOrder方法再传对应的参数查询
/**
* 保存订单
* @param id 这个id为mongodb中排班集合的主键id
* @param scheduleId 这个scheduleId为mongodb中排班集合的hosScheduleId
* @param patientId 就诊人id
* @return
*/
@Override
public Long saveOrder(String id,String scheduleId, Long patientId) {
// 1、远程调用得到订单相关信息
// 就诊人信息
Patient patientOrder = patientFeignClient.getPatientOrder(patientId);
if(null == patientOrder) {
throw new YyghException(ResultCodeEnum.PARAM_ERROR);
}
// 排班信息
ScheduleOrderVo scheduleOrderVo = hospitalFeignClient.getScheduleOrderVo(id); // 根据主键id查
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);
}
// 获取医院签名信息,以调医院平台的接口
SignInfoVo signInfo = hospitalFeignClient.getSignInfo(scheduleOrderVo.getHoscode());
// 2、添加到订单表
OrderInfo orderInfo = new OrderInfo();
BeanUtils.copyProperties(scheduleOrderVo,orderInfo);
// 向orderInfo设置其他数据
String outTradeNo = System.currentTimeMillis() + ""+ new Random().nextInt(100);
orderInfo.setOutTradeNo(outTradeNo);
orderInfo.setScheduleId(scheduleId);
orderInfo.setUserId(patientOrder.getUserId());
orderInfo.setPatientId(patientId);
orderInfo.setPatientName(patientOrder.getName());
orderInfo.setPatientPhone(patientOrder.getPhone());
orderInfo.setOrderStatus(OrderStatusEnum.UNPAID.getStatus());
this.save(orderInfo);
// 调用医院接口,实现预约挂号操作
// 设置调用医院接口需要的参数,参数放到map中
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id",patientId);
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", patientOrder.getName());
paramMap.put("certificatesType",patientOrder.getCertificatesType());
paramMap.put("certificatesNo", patientOrder.getCertificatesNo());
paramMap.put("sex",patientOrder.getSex());
paramMap.put("birthdate", new DateTime(patientOrder.getBirthdate()).toString("yyyy-MM-dd"));
paramMap.put("phone",patientOrder.getPhone());
paramMap.put("isMarry", patientOrder.getIsMarry());
paramMap.put("provinceCode",patientOrder.getProvinceCode());
paramMap.put("cityCode", patientOrder.getCityCode());
paramMap.put("districtCode",patientOrder.getDistrictCode());
paramMap.put("address",patientOrder.getAddress());
//联系人
paramMap.put("contactsName",patientOrder.getContactsName());
paramMap.put("contactsCertificatesType", patientOrder.getContactsCertificatesType());
paramMap.put("contactsCertificatesNo",patientOrder.getContactsCertificatesNo());
paramMap.put("contactsPhone",patientOrder.getContactsPhone());
paramMap.put("timestamp", HttpRequestHelper.getTimestamp());
String sign = HttpRequestHelper.getSign(paramMap, signInfo.getSignKey());
paramMap.put("sign", sign);
// 3、请求医院系统接口
JSONObject result = HttpRequestHelper.sendRequest(paramMap, signInfo.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");
// 4、更新订单
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");
// 5、发送mq信息更新号源和短信通知
OrderMqVo orderMqVo = new OrderMqVo();
orderMqVo.setScheduleId(id);
orderMqVo.setReservedNumber(reservedNumber);
orderMqVo.setAvailableNumber(availableNumber);
MsmVo msmVo = new MsmVo(); // 短信实体
msmVo.setPhone(orderInfo.getPatientPhone());
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);
// 发送消息到mq
rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_ORDER, MqConst.ROUTING_ORDER, orderMqVo);
}else{
throw new YyghException(result.getString("message"), ResultCodeEnum.FAIL.getCode());
}
// 返回订单id
return orderInfo.getId();
}
orderInfo数据表的hos_schedule_id字段问题可以直接修改实体类字段对应名称