xiangpei
2025-05-30 32affb9328997ab51b2c88f7f034c16a1e7ed6d0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package cn.lili.modules.order.cart.render;
 
import cn.lili.common.exception.ServiceException;
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
import cn.lili.modules.order.cart.entity.enums.CartTypeEnum;
import cn.lili.modules.order.cart.entity.enums.RenderStepEnums;
import cn.lili.modules.order.cart.service.CartService;
import cn.lili.modules.order.order.entity.dos.Trade;
import cn.lili.modules.order.order.service.TradeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import java.util.List;
 
/**
 * 交易构造&&创建
 *
 * @author Chopper
 * @since2020-04-01 9:47 下午
 */
@Service
@Slf4j
public class TradeBuilder {
 
    /**
     * 购物车渲染步骤
     */
    @Autowired
    private List<CartRenderStep> cartRenderSteps;
    /**
     * 交易
     */
    @Autowired
    private TradeService tradeService;
    /**
     * 购物车业务
     */
    @Autowired
    private CartService cartService;
 
 
    /**
     * 构造购物车
     * 购物车与结算信息不一致的地方主要是优惠券计算和运费计算,其他规则都是一致都
     *
     * @param checkedWay 购物车类型
     * @return 购物车展示信息
     */
    public TradeDTO buildCart(CartTypeEnum checkedWay) {
        //读取对应购物车的商品信息
        TradeDTO tradeDTO = cartService.readDTO(checkedWay);
 
        //购物车需要将交易中的优惠券取消掉
        if (checkedWay.equals(CartTypeEnum.CART)) {
            tradeDTO.setStoreCoupons(null);
            tradeDTO.setPlatformCoupon(null);
        }
 
        //按照计划进行渲染
        renderCartBySteps(tradeDTO, RenderStepStatement.cartRender);
        return tradeDTO;
    }
 
    /**
     * 构造结算页面
     */
    public TradeDTO buildChecked(CartTypeEnum checkedWay) {
        //读取对应购物车的商品信息
        TradeDTO tradeDTO = cartService.readDTO(checkedWay);
        //需要对购物车渲染
        if (isSingle(checkedWay)) {
            renderCartBySteps(tradeDTO, RenderStepStatement.checkedSingleRender);
        } else if (checkedWay.equals(CartTypeEnum.PINTUAN)) {
            renderCartBySteps(tradeDTO, RenderStepStatement.pintuanTradeRender);
        } else {
            renderCartBySteps(tradeDTO, RenderStepStatement.checkedRender);
        }
 
        return tradeDTO;
    }
 
    /**
     * 创建一笔交易
     * 1.构造交易
     * 2.创建交易
     *
     * @param tradeDTO 交易模型
     * @return 交易信息
     */
    public Trade createTrade(TradeDTO tradeDTO) {
 
        //需要对购物车渲染
        if (isSingle(tradeDTO.getCartTypeEnum())) {
            renderCartBySteps(tradeDTO, RenderStepStatement.singleTradeRender);
        } else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.PINTUAN)) {
            renderCartBySteps(tradeDTO, RenderStepStatement.pintuanTradeRender);
        } else {
            renderCartBySteps(tradeDTO, RenderStepStatement.tradeRender);
        }
 
        //添加order订单及order_item子订单并返回
        return tradeService.createTrade(tradeDTO);
    }
 
    /**
     * 是否为单品渲染
     *
     * @param checkedWay 购物车类型
     * @return 返回是否单品
     */
    private boolean isSingle(CartTypeEnum checkedWay) {
        //拼团   积分   砍价商品
 
        return (checkedWay.equals(CartTypeEnum.POINTS) || checkedWay.equals(CartTypeEnum.KANJIA));
    }
 
    /**
     * 根据渲染步骤,渲染购物车信息
     *
     * @param tradeDTO      交易DTO
     * @param defaultRender 渲染枚举
     */
    private void renderCartBySteps(TradeDTO tradeDTO, RenderStepEnums[] defaultRender) {
        for (RenderStepEnums step : defaultRender) {
            for (CartRenderStep render : cartRenderSteps) {
                try {
                    if (render.step().equals(step)) {
                        render.render(tradeDTO);
                    }
                } catch (ServiceException e) {
                    throw e;
                } catch (Exception e) {
                    log.error("购物车{}渲染异常:", render.getClass(), e);
                }
            }
        }
    }
}