@Override
@Transactional
public String create(OrderVo orderVo) throws ExecutionException, InterruptedException {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
CompletableFuture<AddressVo> addressFuture = CompletableFuture.supplyAsync(() -> {
RequestContextHolder.setRequestAttributes(requestAttributes);
return addressService.getAddressVoById(orderVo.getAid());
}, ShopExcutors.getExecutor());
CompletableFuture<UserCarVo> carFuture = CompletableFuture.supplyAsync(() -> {
RequestContextHolder.setRequestAttributes(requestAttributes);
UserCarVo userCar = carService.getUserCar(orderVo.getSelectGid());
log.debug("userCar:{}",userCar);
return userCar;
}, ShopExcutors.getExecutor());
carFuture.get();
CompletableFuture<Boolean> stockFuture = carFuture.thenApplyAsync((userCarVo) -> {
RequestContextHolder.setRequestAttributes(requestAttributes);
List<StockVo> stockVoList = new ArrayList();
for (StoreCarVo storeCarVo : userCarVo.getStoreCarVoList()) {
for (CarVo carVo : storeCarVo.getCarVoList()) {
StockVo stockVo = new StockVo();
stockVo.setGid(carVo.getGid());
stockVo.setCount(carVo.getCount());
stockVoList.add(stockVo);
}
}
return stockService.lockStock(stockVoList);
}, ShopExcutors.getExecutor());
Boolean aBoolean = stockFuture.get();
if (!aBoolean) {
throw new BusinessException("扣减库存失败", 3001);
}
CompletableFuture<Void> future = CompletableFuture.allOf(addressFuture, stockFuture);
future.get();
UserVo userVo = loginInterceptor.get();
String orderId = orderUtils.createOrderId(userVo.getId());
Integer tabIndex = orderDynamicDatasourceInterceptor.get();
AddressVo addressVo = addressFuture.get();
UserCarVo userCarVo = carFuture.get();
CompletableFuture<Void> orderFuture = CompletableFuture.runAsync(() -> {
orderDynamicDatasourceInterceptor.setOrderDataSource(userVo);
OrderEntity orderEntity = new OrderEntity();
orderEntity.setId(orderId);
orderEntity.setUid(Integer.parseInt(userVo.getId()));
orderEntity.setAddress(addressVo.getAddress());
orderEntity.setPhone(addressVo.getPhone());
orderEntity.setName(addressVo.getName());
orderEntity.setStatus(1);
orderEntity.setTotalPrice(userCarVo.getTotalPrice());
orderEntity.setCreateTime(new Date());
orderEntity.setPayType(orderVo.getPayType());
log.debug("orderEntity:{}", orderEntity);
int order = orderMapper.createOrder(orderEntity, tabIndex);
log.debug("order:{}", order);
}, ShopExcutors.getExecutor());
CompletableFuture<Void> orderDetailfuture = CompletableFuture.runAsync(() -> {
orderDynamicDatasourceInterceptor.setOrderDataSource(userVo);
List<OrderDetailEntity> odList = new ArrayList<>();
for (StoreCarVo storeCarVo : userCarVo.getStoreCarVoList()) {
for (CarVo carVo : storeCarVo.getCarVoList()) {
OrderDetailEntity odEntity = new OrderDetailEntity();
odEntity.setCount(carVo.getCount());
odEntity.setGdesc(carVo.getGoodsVo().getGdesc());
odEntity.setGid(carVo.getGid());
odEntity.setGprice(carVo.getGoodsVo().getGprice());
odEntity.setGname(carVo.getGoodsVo().getGname());
odEntity.setGurl(carVo.getGoodsVo().getGoodsPngList().get(0).getUrl());
odEntity.setOid(orderId);
odEntity.setSid(storeCarVo.getStoreVo().getId());
odEntity.setSubTotal(carVo.getSubTotal());
odList.add(odEntity);
}
}
int odCount = orderMapper.batchInsertOrderDetail(odList, tabIndex);
log.debug("odCount:{}", odCount);
}, ShopExcutors.getExecutor());
CompletableFuture<Void> odFulure = CompletableFuture.allOf(orderFuture, orderDetailfuture);
odFulure.get();
return orderId;
}