免押接口实现
This commit is contained in:
		| @ -239,8 +239,140 @@ public class OrderServiceImpl implements OrderService { | ||||
|  | ||||
|     @Override | ||||
|     public RentCarOrderResultDTO depositFreeSubmitRentCarOrder(RentCarOrderReq rentCarOrderReq) { | ||||
|         //TODO - 免押冻结 | ||||
|         return null; | ||||
|         SimpleUserInfoDTO userInfoDTO = jwtUtil.getUserInfoFromToken(); | ||||
|         if(!(rentCarOrderReq.getIsDepositFree() && StringUtils.equalsIgnoreCase(userInfoDTO.getMiniProgramType(), MiniProgramTypeEnum.ALIPAY.getType()))){ | ||||
|             throw new BizException("不满足支付宝免押条件"); | ||||
|         } | ||||
|  | ||||
|         String redisLockKey = RedisKeyConstants.ORDER_SUB_KEY + userInfoDTO.getUserId(); | ||||
|         if(redisUtil.getRedisLock(redisLockKey, "租车下单")) { | ||||
|             try{ | ||||
|                 //判断是否还有未完成的订单 | ||||
|                 LambdaQueryWrapper<OrderMainPO> currentOrderWrapper = new LambdaQueryWrapper<>(); | ||||
|                 currentOrderWrapper.eq(OrderMainPO::getCustomerId, userInfoDTO.getUserId()) | ||||
|                         .notIn(OrderMainPO::getOrderStatus, Arrays.asList(OrderStatusEnum.AUTO_END.getCode(), OrderStatusEnum.MANUAL_END.getCode())) | ||||
|                         .eq(OrderMainPO::getDelFlag, "0"); | ||||
|                 List<OrderMainPO> currentOrderList = orderMainRepo.list(currentOrderWrapper); | ||||
|                 OrderMainPO waitPayOrder = currentOrderList.stream().filter(order -> order.getOrderStatus().equals(OrderStatusEnum.WAIT_PAY.getCode())).findFirst().orElse(null); | ||||
|                 if(!currentOrderList.isEmpty() && waitPayOrder==null){ | ||||
|                     throw new BizException("您有未完成的订单,请先完成订单"); | ||||
|                 } | ||||
|                 if(waitPayOrder!=null){ | ||||
|                     log.info("存在待支付的订单,取消订单"); | ||||
|                     PayOrderReq payOrderReq = new PayOrderReq(); | ||||
|                     payOrderReq.setOrderNo(waitPayOrder.getOrderNo()); | ||||
|                     cancelOrder(payOrderReq); | ||||
|                 } | ||||
|                 //判断是否存有空闲车辆可用 | ||||
|                 LambdaQueryWrapper<CarPO> carWrapper = new LambdaQueryWrapper<>(); | ||||
|                 carWrapper.eq(CarPO::getModelId, rentCarOrderReq.getCarModelId()) | ||||
|                         .eq(CarPO::getDelFlag, "0") | ||||
|                         .eq(CarPO::getBrsStatus, "0") | ||||
|                         .eq(CarPO::getStoreId, rentCarOrderReq.getStoreId()); | ||||
|                 List<CarPO> carPOList = carRepo.list(carWrapper); | ||||
|                 if(CollectionUtils.isEmpty(carPOList)){ | ||||
|                     throw new BizException("门店没有该车型的车辆可租"); | ||||
|                 } | ||||
|                 //获取门店信息 | ||||
|                 CompanyStoreDTO companyStoreDTO = storeInteg.getStoreById(Integer.valueOf(rentCarOrderReq.getStoreId().toString())); | ||||
|  | ||||
|                 CarModelSimpleDTO carModelSimpleDTO = carInteg.getCarModelByModelId(rentCarOrderReq.getCarModelId()); | ||||
|  | ||||
|                 RentCarRuleDTO rentCarRuleDTO = carInteg.getRentCarRuleByCarRuleId(rentCarOrderReq.getRentCarRuleId()); | ||||
|  | ||||
|                 RentBatteyRuleDTO rentBatteyRuleDTO = null; | ||||
|                 if(rentCarOrderReq.getRentBatteyRuleId()!=null){ | ||||
|                     rentBatteyRuleDTO = carInteg.getRentBatteyRuleByBatteyRuleId(rentCarOrderReq.getRentBatteyRuleId()); | ||||
|                 } | ||||
|                 //生成订单主表 | ||||
|                 OrderMainPO orderMainPO = OrderConvert.INSTANCE.subOrderToPo(rentCarOrderReq, userInfoDTO, rentCarRuleDTO); | ||||
|                 orderMainPO.setOperatorId(Long.valueOf(companyStoreDTO.getOperatingCompanyId())); | ||||
|                 orderMainPO.setOrderNo(OrderUtil.generateOrderNo()); | ||||
|                 orderMainPO.setOrderStatus(OrderStatusEnum.WAIT_PAY.getCode()); | ||||
|                 orderMainPO.setFirstOrderTime(LocalDateTime.now()); | ||||
|  | ||||
|                 //设置预计还车时间 | ||||
|                 LocalDateTime endRentTime = OrderUtil.getEndRentTime(orderMainPO.getFirstOrderTime(),1,rentCarRuleDTO.getRentalDays(), rentCarRuleDTO.getRentalType()); | ||||
|                 orderMainPO.setEndRentTime(endRentTime); | ||||
|  | ||||
|  | ||||
|                 //生成子表订单 | ||||
|                 String paymentType = PaymentTypeEnum.ZFB_PAY.getCode(); | ||||
|                 List<OrderSubPO> orderSubPOList = new ArrayList<>(); | ||||
|  | ||||
|                 //如果未开通免押则要生成押金订单 | ||||
|                 OrderSubPO depositOrder = new OrderSubPO(); | ||||
|                 depositOrder.setSuborderNo(OrderUtil.generateSubOrderNo(OrderUtil.MY_PREFIX)); | ||||
|                 depositOrder.setSuborderType(SubOrderTypeEnum.NO_DEPOSIT.getCode()); | ||||
|                 depositOrder.setAmount(orderMainPO.getDepositPrice()); | ||||
|                 depositOrder.setCreatedAt(LocalDateTime.now()); | ||||
|                 depositOrder.setPaymentMethod(paymentType); | ||||
|                 orderSubPOList.add(depositOrder); | ||||
|                 //如果选择了租电套餐,则还需要生成租电子订单 | ||||
|                 if(rentBatteyRuleDTO!=null){ | ||||
|                     rentBatteyRuleDTO = carInteg.getRentBatteyRuleByBatteyRuleId(rentCarOrderReq.getRentBatteyRuleId()); | ||||
|                     OrderSubPO rentBatteyRuleOrder = new OrderSubPO(); | ||||
|                     rentBatteyRuleOrder.setSuborderNo(OrderUtil.generateSubOrderNo(OrderUtil.ZD_PREFIX)); | ||||
|                     rentBatteyRuleOrder.setSuborderType(SubOrderTypeEnum.RENTBATTEY.getCode()); | ||||
|                     rentBatteyRuleOrder.setAmount(rentBatteyRuleDTO.getRentPrice()); | ||||
|                     rentBatteyRuleOrder.setCreatedAt(LocalDateTime.now()); | ||||
|                     rentBatteyRuleOrder.setPaymentMethod(paymentType); | ||||
|                     orderSubPOList.add(rentBatteyRuleOrder); | ||||
|                 } | ||||
|                 //生成租车订单 | ||||
|                 BigDecimal rentCarOrderAmount = OrderUtil.getRentCarAmount(rentCarRuleDTO.getRentalType(), rentCarRuleDTO.getRentalPrice(), rentCarRuleDTO.getRentalDays()); | ||||
|                 OrderSubPO rentOrder = new OrderSubPO(); | ||||
|                 rentOrder.setSuborderNo(OrderUtil.generateSubOrderNo(OrderUtil.ZC_PREFIX)); | ||||
|                 rentOrder.setSuborderType(SubOrderTypeEnum.RENTCAR.getCode()); | ||||
|                 rentOrder.setAmount(rentCarOrderAmount); | ||||
|                 rentOrder.setCreatedAt(LocalDateTime.now()); | ||||
|                 rentOrder.setPaymentMethod(paymentType); | ||||
|                 rentOrder.setReturnTime(endRentTime); | ||||
|                 orderSubPOList.add(rentOrder); | ||||
|  | ||||
|                 BigDecimal orderAmount = orderSubPOList.stream().map(OrderSubPO::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); | ||||
|                 orderMainPO.setOrderAmount(orderAmount); | ||||
|  | ||||
|                 //发起支付返回预支付信息 | ||||
|                 String paymentId = OrderUtil.generateSubOrderNo(OrderUtil.ZF_PREFIX); | ||||
|                 UnifiedPaymentInfoDTO unifiedPaymentInfoDTO = payService.prepayOrder(paymentType,rentCarRuleDTO.getRuleName(),Long.valueOf(companyStoreDTO.getOperatingCompanyId()),paymentId,userInfoDTO | ||||
|                         ,orderMainPO.getOrderAmount()); | ||||
|  | ||||
|                 for(OrderSubPO orderSubPO : orderSubPOList){ | ||||
|                     orderSubPO.setPaymentId(paymentId); | ||||
|                     orderSubPO.setPayStatus(PayStatusEnum.USERPAYING.getCode()); | ||||
|                 } | ||||
|  | ||||
|                 orderMainRepo.save(orderMainPO); | ||||
|  | ||||
|                 orderSubPOList.forEach(orderSubPO -> { | ||||
|                     orderSubPO.setOrderId(orderMainPO.getOrderId()); | ||||
|                 }); | ||||
|                 orderSubRepo.saveBatch(orderSubPOList); | ||||
|  | ||||
|  | ||||
|                 //返回订单信息 | ||||
|                 OrderDTO orderDTO = OrderConvert.INSTANCE.poToDto(orderMainPO); | ||||
|                 orderDTO.setCompanyStoreDTO(companyStoreDTO); | ||||
|                 orderDTO.setCarModelSimpleDTO(carModelSimpleDTO); | ||||
|  | ||||
|                 RentCarOrderResultDTO rentCarOrderResultDTO = new RentCarOrderResultDTO(); | ||||
|                 rentCarOrderResultDTO.setOrderMainInfo(orderDTO); | ||||
|                 rentCarOrderResultDTO.setUnifiedPaymentInfo(unifiedPaymentInfoDTO); | ||||
|  | ||||
|                 return rentCarOrderResultDTO; | ||||
|  | ||||
|             }catch (Exception e){ | ||||
|                 log.warn("下单失败", e); | ||||
|                 throw e; | ||||
|             } finally { | ||||
|                 redisUtil.deleteRedisLock(redisLockKey); | ||||
|             } | ||||
|         } else { | ||||
|             log.warn("下单失败,锁已被占用"); | ||||
|             throw new InnerException("服务器正在处理,请稍后再试"); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -13,6 +13,7 @@ public class OrderUtil { | ||||
|  | ||||
|     public static final String ORDER_PREFIX = "OC"; | ||||
|  | ||||
|     public static final String MY_PREFIX = "MY"; | ||||
|     public static final String YJ_PREFIX = "YJ"; | ||||
|  | ||||
|     public static final String ZD_PREFIX = "ZD"; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user