订单业务在整个电商平台中处于核心位置,也是比较复杂的一块业务。是把“物”变为“钱”的一个中转站。
整个订单模块一共分四部分组成:
- 结算
- 下单
- 对接支付服务
- 对接库存管理系统
入口:购物车点击计算按钮 ,结算必须要登录!
分析页面需要的数据:
1、 需要用户地址信息
2、 购物车中选择的商品列表
3、 用户地址信息在service-user模块,购物车信息在service-cart模块,所以我们要在相应模块提供api接口,通过feign client调用获取数据
2.1在 service-user模块获取地址列表
常规
2.2 在service-cart模块获取选中商品数据
分析用到那几张表
cart_info(购物车表) user_id sku_id
SQL语句
控制层
业务层Dao层
List getCartCheckedList(String userId);
难点
1 定义key user:userId:cart 获取redis中的所有商品
2 // 获取选中的商品!遍历所有条件判断加入集合
if (cartInfo.getIsChecked().intValue() == 1) {
cartInfoList.add(cartInfo);
}
3 //返回集合
@Override
public List<CartInfo> getCartCheckedList(String userId) {
List<CartInfo> cartInfoList = new ArrayList<>();
// 定义key user:userId:cart
String cartKey = this.getCartKey(userId);
List<CartInfo> cartCachInfoList = redisTemplate.opsForHash().values(cartKey);
if (null != cartCachInfoList && cartCachInfoList.size() > 0) {
for (CartInfo cartInfo : cartCachInfoList) {
// 获取选中的商品!
if (cartInfo.getIsChecked().intValue() == 1) {
cartInfoList.add(cartInfo);
}
}
}
return cartInfoList;
}
2.3 搭建service-order模块
2.3.4 订单的数据结构
orderInfo :订单表
orderDetail :订单明细
2.3.5 接口封装OrderApiController
确认订单
1 // 获取到用户Id
2 //远程调用 获取用户地址
3 // 先得到用户想要购买的商品!
4 // 声明一个集合来存储订单明细 订单需要放每个用户选中的物品集合详情
ArrayList<OrderDetail> detailArrayList = new ArrayList<>();
循环添加完所有商品后
5 // 计算总金额
6 // 保存总金额
```java
package com.atguigu.gmall.order.controller;
@RestController
@RequestMapping("api/order")
public class OrderApiController {
@Autowired
private UserFeignClient userFeignClient;
@Autowired
private CartFeignClient cartFeignClient;
/**
* 确认订单
* @param request
* @return
*/
@GetMapping("auth/trade")
public Result<Map<String, Object>> trade(HttpServletRequest request) {
// 获取到用户Id
String userId = AuthContextHolder.getUserId(request);
//获取用户地址
List<UserAddress> userAddressList = userFeignClient.findUserAddressListByUserId(userId);
// 渲染送货清单
// 先得到用户想要购买的商品!
List<CartInfo> cartInfoList = cartFeignClient.getCartCheckedList(userId);
// 声明一个集合来存储订单明细
ArrayList<OrderDetail> detailArrayList = new ArrayList<>();
for (CartInfo cartInfo : cartInfoList) {
OrderDetail orderDetail = new OrderDetail();
orderDetail.setSkuId(cartInfo.getSkuId());
orderDetail.setSkuName(cartInfo.getSkuName());
orderDetail.setImgUrl(cartInfo.getImgUrl());
orderDetail.setSkuNum(cartInfo.getSkuNum());
orderDetail.setOrderPrice(cartInfo.getSkuPrice());
// 添加到集合
detailArrayList.add(orderDetail);
}
// 计算总金额
OrderInfo orderInfo = new OrderInfo();
orderInfo.setOrderDetailList(detailArrayList);
orderInfo.sumTotalAmount();
Map<String, Object> result = new HashMap