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 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); } } } } }