diff --git a/src/main/java/com/sczx/order/service/impl/OrderServiceImpl.java b/src/main/java/com/sczx/order/service/impl/OrderServiceImpl.java index b122a61..514b484 100644 --- a/src/main/java/com/sczx/order/service/impl/OrderServiceImpl.java +++ b/src/main/java/com/sczx/order/service/impl/OrderServiceImpl.java @@ -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 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 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 carWrapper = new LambdaQueryWrapper<>(); + carWrapper.eq(CarPO::getModelId, rentCarOrderReq.getCarModelId()) + .eq(CarPO::getDelFlag, "0") + .eq(CarPO::getBrsStatus, "0") + .eq(CarPO::getStoreId, rentCarOrderReq.getStoreId()); + List 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 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("服务器正在处理,请稍后再试"); + } + } diff --git a/src/main/java/com/sczx/order/utils/OrderUtil.java b/src/main/java/com/sczx/order/utils/OrderUtil.java index 8c89b50..54d27da 100644 --- a/src/main/java/com/sczx/order/utils/OrderUtil.java +++ b/src/main/java/com/sczx/order/utils/OrderUtil.java @@ -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";