创建订单的核心业务逻辑
这个函数实现了电商系统的下单流程,包括:商品查询 → 价格计算 → 订单保存 → 库存扣减 → 购物车清理
详细步骤解析
1. 订单数据准备
// 1.1. 获取订单详情数据
List<OrderDetailDTO> detailDTOS = orderFormDTO.getDetails();
// 1.2. 转换为商品ID和数量的映射
Map<Long, Integer> itemNumMap = detailDTOS.stream()
.collect(Collectors.toMap(OrderDetailDTO::getItemId, OrderDetailDTO::getNum));
// 例如:{1: 2, 2: 1} 表示商品1买2个,商品2买1个
// 1.3. 获取所有商品ID
Set<Long> itemIds = itemNumMap.keySet();
2. 商品验证和查询
// 1.3. 查询商品信息
List<ItemDTO> items = itemService.queryItemByIds(itemIds);
// 验证商品是否存在
if (items == null || items.size() < itemIds.size()) {
throw new BadRequestException("商品不存在");
}
3. 价格计算
// 1.4. 计算订单总价
int total = 0;
for (ItemDTO item : items) {
total += item.getPrice() * itemNumMap.get(item.getId());
}
order.setTotalFee(total);
4. 订单基本信息设置
// 1.5. 设置订单属性
order.setPaymentType(orderFormDTO.getPaymentType()); // 支付方式
order.setUserId(UserContext.getUser()); // 当前用户ID
order.setStatus(1); // 订单状态(1=待支付)
5. 保存订单
// 1.6. 保存主订单
save(order);
6. 保存订单详情
// 2. 构建并保存订单详情
List<OrderDetail> details = buildDetails(order.getId(), items, itemNumMap);
detailService.saveBatch(details);
7. 清理购物车
// 3. 从购物车中移除已购买的商品
cartService.removeByItemIds(itemIds);
8. 扣减库存
// 4. 扣减商品库存
try {
itemService.deductStock(detailDTOS);
} catch (Exception e) {
throw new RuntimeException("库存不足!");
}

最低0.47元/天 解锁文章
1758

被折叠的 条评论
为什么被折叠?



