苍穹外卖项目笔记(9)— 用户下单

前言

代码链接:https://gitee.com/niesir04/sky-take-out.git

1 导入地址簿模块功能代码

产品原型

接口设计

  • 查询当前登录用户的所有地址信息
  • 新增地址
  • 根据id查询地址 
  • 根据id修改地址
  • 根据id删除地址
  • 查询默认地址

数据库设计

2 用户下单

2.1 需求分析和设计【注】当前用户下单的数据存到订单里面去,由于用户可能点了很多商品,每个商品可能含有多份,对于这样的数据我们一般存在另一张表里, 叫做订单明细表,订单表和订单明细表是一对多的关系

2.2 代码开发

OrderServiceImpl.java

@Service
public class OrderServiceImpl implements OrderService {
 
    @Autowired
    private OrderMapper orderMapper;  //订单表
    @Autowired
    private OrderDetailMapper orderDetailMapper;  //订单明细表
    @Autowired
    private AddressBookMapper addressBookMapper;   //地址簿
    @Autowired
    private ShoppingCartMapper shoppingCartMapper;  //购物车表格
 
    /**
     * 用户下单
     * @param ordersSubmitDTO
     * @return
     */
    public OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO) {
 
        //1、处理各种业务异常问题(地址簿为空、购物车数据为空)
        AddressBook addressBook = addressBookMapper.getById(ordersSubmitDTO.getAddressBookId());
        if (addressBook.getId() == null) {
            //抛出业务异常
            throw new AddressBookBusinessException(MessageConstant.ADDRESS_BOOK_IS_NULL);
        }
        //查询当前用户的购物车数据
        Long userId = BaseContext.getCurrentId();
        ShoppingCart shoppingCart = new ShoppingCart();
        shoppingCart.setUserId(userId);
        List<ShoppingCart> shoppingCartList = shoppingCartMapper.list(shoppingCart);
        if (shoppingCartList == null || shoppingCartList.size() == 0) {
            //抛出业务异常
            throw new ShoppingCartBusinessException(MessageConstant.SHOPPING_CART_IS_NULL);
        }
 
        //2、向订单表插入1条数据
            //构造需要提交的参数orders
        Orders orders = new Orders();
            //因为订单表里面有很多属性,先把DTO里面的属性拷贝一部分进来,
        BeanUtils.copyProperties(ordersSubmitDTO, orders);
        orders.setOrderTime(LocalDateTime.now());
        orders.setPayStatus(Orders.UN_PAID);  //支付状态,未支付
        orders.setDeliveryStatus(Orders.PENDING_PAYMENT);  //订单状态:待付款
        orders.setNumber(String.valueOf(System.currentTimeMillis()));  //使用当前系统时间戳作为订单号
        orders.setPhone(addressBook.getPhone());
        orders.setConsignee(addressBook.getConsignee());  //收货人
        orders.setUserId(userId);  //用户人id
 
            //插入数据
        orderMapper.insert(orders);
 
        //3、向订单明细表插入n条数据,真正下单购买商品的数据是由购物车里面的数据决定,所以遍历购物车,将每个对象封装为订单明细表
        //对于遍历以后进行插入,可以放在for循环里面进行遍历,这样就是单条插入,也可以放在for外面,进行批量插入
        List<OrderDetail> orderDetailList = new ArrayList<>();
        for (ShoppingCart cart : shoppingCartList) {
            OrderDetail orderDetail = new OrderDetail();  //订单明细
            BeanUtils.copyProperties(cart, orderDetail);
            orderDetail.setOrderId(orders.getId());  //设置当前订单明细关联的订单id
            orderDetailList.add(orderDetail);
        }
 
        orderDetailMapper.insertBatch(orderDetailList);
 
        //4、如果下单成功,清空当前用户的购物车数据
        shoppingCartMapper.deleteByUserId(userId);
 
        //5、封装VO返回结果
        OrderSubmitVO orderSubmitVO = OrderSubmitVO.builder()
                .id(orders.getId())
                .orderTime(orders.getOrderTime())
                .orderNumber(orders.getNumber())
                .orderAmount(orders.getAmount())
                .build();
        return orderSubmitVO;
    }
}

3 订单支付

【注】:这部分功能代码个人小程序里面实现不了,所以这部分内容先简单了解流程即可

微信支付时序图

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值