1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| @Autowired private ThreadPoolExecutor threadPoolExecutor;
@SneakyThrows @Override public Boolean endDrive(OrderFeeForm orderFeeForm) { CompletableFuture<OrderInfo> orderInfoCompletableFuture = CompletableFuture.supplyAsync(() -> { OrderInfo orderInfo = orderInfoFeignClient.getOrderInfo(orderFeeForm.getOrderId()).getData(); return orderInfo; }, threadPoolExecutor);
CompletableFuture<OrderServiceLastLocationVo> orderServiceLastLocationVoCompletableFuture = CompletableFuture.supplyAsync((() -> { OrderServiceLastLocationVo orderServiceLastLocationVo = locationFeignClient.getOrderServiceLastLocation(orderFeeForm.getOrderId()).getData(); return orderServiceLastLocationVo; }), threadPoolExecutor);
CompletableFuture.allOf(orderInfoCompletableFuture, orderServiceLastLocationVoCompletableFuture ).join();
OrderInfo orderInfo = orderInfoCompletableFuture.get(); OrderServiceLastLocationVo orderServiceLastLocationVo = orderServiceLastLocationVoCompletableFuture.get(); double distance = LocationUtil.getDistance(orderInfo.getEndPointLatitude().doubleValue(), orderInfo.getEndPointLongitude().doubleValue(), orderServiceLastLocationVo.getLatitude().doubleValue(), orderServiceLastLocationVo.getLongitude().doubleValue()); if(distance > SystemConstant.DRIVER_START_LOCATION_DISTION) { throw new GuiguException(ResultCodeEnum.DRIVER_END_LOCATION_DISTION_ERROR); }
CompletableFuture<BigDecimal> realDistanceCompletableFuture = CompletableFuture.supplyAsync(() -> { BigDecimal realDistance = locationFeignClient.calculateOrderRealDistance(orderFeeForm.getOrderId()).getData(); log.info("结束代驾,订单实际里程:{}", realDistance); return realDistance; }, threadPoolExecutor);
CompletableFuture<FeeRuleResponseVo> feeRuleResponseVoCompletableFuture = realDistanceCompletableFuture.thenApplyAsync((realDistance)->{ FeeRuleRequestForm feeRuleRequestForm = new FeeRuleRequestForm(); feeRuleRequestForm.setDistance(realDistance); feeRuleRequestForm.setStartTime(orderInfo.getStartServiceTime()); Integer waitMinute = Math.abs((int) ((orderInfo.getArriveTime().getTime() - orderInfo.getAcceptTime().getTime()) / (1000 * 60))); feeRuleRequestForm.setWaitMinute(waitMinute); log.info("结束代驾,费用参数:{}", JSON.toJSONString(feeRuleRequestForm)); FeeRuleResponseVo feeRuleResponseVo = feeRuleFeignClient.calculateOrderFee(feeRuleRequestForm).getData(); log.info("费用明细:{}", JSON.toJSONString(feeRuleResponseVo)); BigDecimal totalAmount = feeRuleResponseVo.getTotalAmount().add(orderFeeForm.getTollFee()).add(orderFeeForm.getParkingFee()).add(orderFeeForm.getOtherFee()).add(orderInfo.getFavourFee()); feeRuleResponseVo.setTotalAmount(totalAmount); return feeRuleResponseVo; });
CompletableFuture<Long> orderNumCompletableFuture = CompletableFuture.supplyAsync(() -> { String startTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 00:00:00"; String endTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 24:00:00"; Long orderNum = orderInfoFeignClient.getOrderNumByTime(startTime, endTime).getData(); return orderNum; }, threadPoolExecutor); CompletableFuture<RewardRuleResponseVo> rewardRuleResponseVoCompletableFuture = orderNumCompletableFuture.thenApplyAsync((orderNum)->{ RewardRuleRequestForm rewardRuleRequestForm = new RewardRuleRequestForm(); rewardRuleRequestForm.setStartTime(orderInfo.getStartServiceTime()); rewardRuleRequestForm.setOrderNum(orderNum); RewardRuleResponseVo rewardRuleResponseVo = rewardRuleFeignClient.calculateOrderRewardFee(rewardRuleRequestForm).getData(); log.info("结束代驾,系统奖励:{}", JSON.toJSONString(rewardRuleResponseVo)); return rewardRuleResponseVo; });
CompletableFuture<ProfitsharingRuleResponseVo> profitsharingRuleResponseVoCompletableFuture = feeRuleResponseVoCompletableFuture.thenCombineAsync(orderNumCompletableFuture, (feeRuleResponseVo, orderNum)->{ ProfitsharingRuleRequestForm profitsharingRuleRequestForm = new ProfitsharingRuleRequestForm(); profitsharingRuleRequestForm.setOrderAmount(feeRuleResponseVo.getTotalAmount()); profitsharingRuleRequestForm.setOrderNum(orderNum); ProfitsharingRuleResponseVo profitsharingRuleResponseVo = profitsharingRuleFeignClient.calculateOrderProfitsharingFee(profitsharingRuleRequestForm).getData(); log.info("结束代驾,分账信息:{}", JSON.toJSONString(profitsharingRuleResponseVo)); return profitsharingRuleResponseVo; }); CompletableFuture.allOf(orderInfoCompletableFuture, realDistanceCompletableFuture, feeRuleResponseVoCompletableFuture, orderNumCompletableFuture, rewardRuleResponseVoCompletableFuture, profitsharingRuleResponseVoCompletableFuture ).join();
BigDecimal realDistance = realDistanceCompletableFuture.get(); FeeRuleResponseVo feeRuleResponseVo = feeRuleResponseVoCompletableFuture.get(); RewardRuleResponseVo rewardRuleResponseVo = rewardRuleResponseVoCompletableFuture.get(); ProfitsharingRuleResponseVo profitsharingRuleResponseVo = profitsharingRuleResponseVoCompletableFuture.get();
UpdateOrderBillForm updateOrderBillForm = new UpdateOrderBillForm(); updateOrderBillForm.setOrderId(orderFeeForm.getOrderId()); updateOrderBillForm.setDriverId(orderFeeForm.getDriverId()); updateOrderBillForm.setTollFee(orderFeeForm.getTollFee()); updateOrderBillForm.setParkingFee(orderFeeForm.getParkingFee()); updateOrderBillForm.setOtherFee(orderFeeForm.getOtherFee()); updateOrderBillForm.setFavourFee(orderInfo.getFavourFee());
updateOrderBillForm.setRealDistance(realDistance); BeanUtils.copyProperties(rewardRuleResponseVo, updateOrderBillForm); BeanUtils.copyProperties(feeRuleResponseVo, updateOrderBillForm);
BeanUtils.copyProperties(profitsharingRuleResponseVo, updateOrderBillForm); updateOrderBillForm.setProfitsharingRuleId(profitsharingRuleResponseVo.getProfitsharingRuleId()); log.info("结束代驾,更新账单信息:{}", JSON.toJSONString(updateOrderBillForm));
orderInfoFeignClient.endDrive(updateOrderBillForm); return true; }
|