@Override
@Transactional
public String create(OrderVo orderVo) throws ExecutionException, InterruptedException {
//因为请求是存于ThreadLocal的,在主线程的请求想要给子线程使用,就需拿出来给下面的子线程共享
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
//1.根据地址id调用地址服务查询地址详情
CompletableFuture<AddressVo> addressFuture = CompletableFuture.supplyAsync(() -> {
RequestContextHolder.setRequestAttributes(requestAttributes);
return addressService.getAddressVoById(orderVo.getAid());
}, ShopExcutors.getExecutor());
//2.根据商品id查询商品详情和购物车数量
CompletableFuture<UserCarVo> carFuture = CompletableFuture.supplyAsync(() -> {
RequestContextHolder.setRequestAttributes(requestAttributes);
UserCarVo userCar = carService.getUserCar(orderVo.getSelectGid());
log.debug("userCar:{}",userCar);
return userCar;
}, ShopExcutors.getExecutor());
// 感觉不需要吧?
carFuture.get();
//3.在2的基础上锁库存
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);
}
//4.订单,需要等123都完成
CompletableFuture<Void> future = CompletableFuture.allOf(addressFuture, stockFuture);
future.get();// 地址任务和库存任务全部执行完
// 5.先获取登录用户
UserVo userVo = loginInterceptor.get();
// 6.创建订单ID(yyyMMdd+用户ID后四位+4位随机数+流水号(唯一))
String orderId = orderUtils.createOrderId(userVo.getId());
// 7、获取表的索引
Integer tabIndex = orderDynamicDatasourceInterceptor.get();
AddressVo addressVo = addressFuture.get();
UserCarVo userCarVo = carFuture.get();
// 8.封装订单数据,插入订单数据
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); // 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());
// 9、插入订单详情
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());
// 订单任务和订单详情任务全部执行完后再返回订单ID
CompletableFuture<Void> odFulure = CompletableFuture.allOf(orderFuture, orderDetailfuture);
odFulure.get(); // 阻塞
// 清空购物车
// carService.clearUserCar(userVo.getId(),orderVo.getSelectGid());
return orderId;
}
05-26
1987