day24 微信支付与用户端订单接口

1. 今天做了什么

  1. 微信支付流程的了解

    1. 小程序向后端发起微信支付的请求
    2. 后端向微信的下单接口发起请求,获取支付交易标示,并为小程序返回支付参数
    3. 小程序调起微信支付
    4. 微信调用后端接口,推送支付结果
  2. 用户端订单相关接口

    1. 历史订单(查询用户订单,并逐一查询到每个订单的订单详情,构造OrderVO返回)
    2. 订单详情
    3. 取消订单
    4. 再来一单(根据订单id查询订单详情,使用订单详情构造购物车集合,批量添加到用户的购物车中)

2. 核心知识点

3. 深度思考

4. 踩过的坑

  1. 关于再来一单
    1. 我自己开始的思路是
      1. 查询到订单信息与订单详情
      2. 更新订单号,支付状态,创建时间等,清空主键id
      3. 再次插入进订单表与订单详情表
    2. 问题在于:
      1. 很多字段,以前的旧订单有,但新订单为空,要么逐个清空,要么使用大量的字段重新构造一个订单对象,十分麻烦
      2. 使用这种思路详单于点击订单就直接出发了下单
    3. 实际讲义的实现思路是
      1. 点击再来一单的效果是清空当前购物车,将该订单的菜品套餐添加到购物车,用户可以按正常下单流程下单
      2. 优点:
        1. 实现简单,只需要根据id查询订单详情,转化为购物车对象,插入购物车表即可
    4. 存在的一些问题
      1. 项目中简单实现,未考虑历史订单中的菜品,套餐是否发生修改(信息变更,停售,删除等)
      2. 解决思路 :
        1. 在将订单详情转购物车的时候,逐项判断该商品,如果更新则查询并更新信息,删除或停售则不加入购物车.
        2. 如果简单处理可以检查菜品套餐的更新日期,若存在晚于订单日期的,抛异常

5. 遗留问题 / 想不通

.stream().map(x -> { }).collect(Collectors.toList()).forEach(x->{ })

  1. .forEach(x->{ })
    1. 仅仅是对集合进行遍历,执行某些操作
  2. .stream().map(x -> { }).collect(Collectors.toList())
    1. 要把 List<A> 变成 List<B>
    2. 无需外部集合,自动生成集合
    3. 有返回值,返回一个新集合
    4. 并行流安全(.parallelStream()):Collectors.toList() 内部自动处理多线程合并结果
  3. List<A> 变成 List<B>的场景应当使用.stream().map().collect()
  4. 示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        List<OrderVO> list = null;  

if(page!=null&&page.getResult().size()>0){
// page.getResult().forEach(order->{
// List<OrderDetail> detailList = orderDetailMapper.getByOrderId(order.getId());
// OrderVO orderVO = new OrderVO();
// BeanUtils.copyProperties(order,orderVO);
// orderVO.setOrderDetailList(detailList);
//
// list.add(orderVO);
// });
list = page.getResult().stream().map(order -> {
List<OrderDetail> detailList = orderDetailMapper.getByOrderId(order.getId());
OrderVO orderVO = new OrderVO();
BeanUtils.copyProperties(order, orderVO);
orderVO.setOrderDetailList(detailList);
return orderVO;
}).collect(Collectors.toList());
}