diff --git a/framework/src/main/java/cn/lili/modules/broadcast/serviceimpl/StudioServiceImpl.java b/framework/src/main/java/cn/lili/modules/broadcast/serviceimpl/StudioServiceImpl.java index 990dd0cd..b48a6047 100644 --- a/framework/src/main/java/cn/lili/modules/broadcast/serviceimpl/StudioServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/broadcast/serviceimpl/StudioServiceImpl.java @@ -62,9 +62,9 @@ public class StudioServiceImpl extends ServiceImpl impleme public Boolean create(Studio studio) { try { //创建小程序直播 -// Map roomMap = wechatLivePlayerUtil.create(studio); -// studio.setRoomId(Integer.parseInt(roomMap.get("roomId"))); -// studio.setQrCodeUrl(roomMap.get("qrcodeUrl")); + Map roomMap = wechatLivePlayerUtil.create(studio); + studio.setRoomId(Integer.parseInt(roomMap.get("roomId"))); + studio.setQrCodeUrl(roomMap.get("qrcodeUrl")); studio.setStoreId(UserContext.getCurrentUser().getStoreId()); studio.setStatus(StudioStatusEnum.NEW.name()); //直播间添加成功发送直播间开启、关闭延时任务 diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java b/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java index 9a69a2a7..4454c8f9 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java @@ -80,6 +80,10 @@ public class TradeBuilder { /** * 构造一笔交易 + * 1.从缓存中读取交易数据 + * 2.从购物车列表中筛选出已选择的SKU列表存入交易中 + * 3.渲染整个交易(0-> 校验商品 1-》 满优惠渲染 2->渲染优惠 3->优惠券渲染 4->计算运费 5->计算价格 6->分销渲染 7->其他渲染) + * 4.将已选择的购物车列表存入交易中 * * @param checkedWay 购物车类型 * @return 购物车展示信息 @@ -114,6 +118,8 @@ public class TradeBuilder { /** * 创建一笔交易 + * 1.构造交易 + * 2.创建交易 * * @param checkedWay 购物车类型 * @return 交易信息 diff --git a/framework/src/main/java/cn/lili/modules/order/cart/service/CartService.java b/framework/src/main/java/cn/lili/modules/order/cart/service/CartService.java index 2d997b3f..c47b37e9 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/service/CartService.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/service/CartService.java @@ -162,6 +162,13 @@ public interface CartService { /** * 创建交易 + * 1.获取购物车类型,不同的购物车类型有不同的订单逻辑 + * 购物车类型:购物车、立即购买、虚拟商品、拼团、积分 + * 2.校验用户的收件人信息 + * 3.设置交易的基础参数 + * 4.交易信息存储到缓存中 + * 5.创建交易 + * 6.清除购物车选择数据 * * @param tradeParams 创建交易参数 * @return 交易信息 diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java b/framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java index a44078ff..fbc45510 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java +++ b/framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java @@ -70,7 +70,9 @@ public interface OrderService extends IService { OrderDetailVO queryDetail(String orderSn); /** - * 创建交易 + * 创建订单 + * 1.检查交易信息 + * 2.循环交易购物车列表,创建订单以及相关信息 * * @param tradeDTO 交易DTO */ diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/TradeService.java b/framework/src/main/java/cn/lili/modules/order/order/service/TradeService.java index 91457521..21fcfe5b 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/service/TradeService.java +++ b/framework/src/main/java/cn/lili/modules/order/order/service/TradeService.java @@ -14,6 +14,13 @@ public interface TradeService extends IService { /** * 创建交易 + * 1.订单数据校验 + * 2.积分预处理 + * 3.优惠券预处理 + * 4.添加交易 + * 5.添加订单 + * 6.将交易写入缓存供消费者调用 + * 7.发送交易创建消息 * * @param tradeDTO 购物车视图 * @return 交易 diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/TradeServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/TradeServiceImpl.java index ed5d50b3..f1b66b6e 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/TradeServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/TradeServiceImpl.java @@ -1,191 +1 @@ -package cn.lili.modules.order.order.serviceimpl; - -import cn.lili.common.cache.Cache; -import cn.lili.common.cache.CachePrefix; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.exception.ServiceException; -import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; -import cn.lili.common.rocketmq.tags.MqOrderTagsEnum; -import cn.lili.config.rocketmq.RocketmqCustomProperties; -import cn.lili.modules.member.entity.dos.Member; -import cn.lili.modules.member.entity.dos.MemberAddress; -import cn.lili.modules.member.service.MemberService; -import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO; -import cn.lili.modules.order.cart.entity.dto.TradeDTO; -import cn.lili.modules.order.cart.entity.vo.CartVO; -import cn.lili.modules.order.order.entity.dos.Order; -import cn.lili.modules.order.order.entity.dos.Trade; -import cn.lili.modules.order.order.entity.enums.PayStatusEnum; -import cn.lili.modules.order.order.mapper.TradeMapper; -import cn.lili.modules.order.order.service.OrderService; -import cn.lili.modules.order.order.service.TradeService; -import cn.lili.modules.promotion.service.CouponService; -import cn.lili.modules.promotion.service.MemberCouponService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.apache.rocketmq.spring.core.RocketMQTemplate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 交易业务层实现 - * - * @author Chopper - * @date 2020/11/17 7:39 下午 - */ -@Service -@Transactional -public class TradeServiceImpl extends ServiceImpl implements TradeService { - - //缓存 - @Autowired - private Cache cache; - //订单 - @Autowired - private OrderService orderService; - //会员 - @Autowired - private MemberService memberService; - //优惠券 - @Autowired - private CouponService couponService; - //会员优惠券 - @Autowired - private MemberCouponService memberCouponService; - //RocketMQ - @Autowired - private RocketMQTemplate rocketMQTemplate; - //RocketMQ 配置 - @Autowired - private RocketmqCustomProperties rocketmqCustomProperties; - - - @Override - @Transactional(rollbackFor = Exception.class) - public Trade createTrade(TradeDTO tradeDTO) { - - //创建订单预校验 - createTradeCheck(tradeDTO); - - - Trade trade = new Trade(tradeDTO); - String key = CachePrefix.TRADE.getPrefix() + trade.getSn(); - //积分预处理 - pointPretreatment(tradeDTO); - //优惠券预处理 - couponPretreatment(tradeDTO); - //添加交易 - this.save(trade); - //添加订单 - orderService.intoDB(tradeDTO); - //写入缓存,给消费者调用 - cache.put(key, tradeDTO); - //构建订单创建消息 - String destination = rocketmqCustomProperties.getOrderTopic() + ":" + MqOrderTagsEnum.ORDER_CREATE.name(); - //发送订单创建消息 - rocketMQTemplate.asyncSend(destination, key, RocketmqSendCallbackBuilder.commonCallback()); - return trade; - } - - /** - * 创建订单最后一步校验 - * - * @param tradeDTO - */ - private void createTradeCheck(TradeDTO tradeDTO) { - - //创建订单如果没有收获地址, - MemberAddress memberAddress = tradeDTO.getMemberAddress(); - if (memberAddress == null) { - throw new ServiceException(ResultCode.MEMBER_ADDRESS_NOT_EXIST); - } - - /** - * 订单配送区域校验 - */ - if (tradeDTO.getNotSupportFreight() != null && tradeDTO.getNotSupportFreight().size() > 0) { - StringBuilder stringBuilder = new StringBuilder("包含商品有-"); - tradeDTO.getNotSupportFreight().forEach(sku -> { - stringBuilder.append(sku.getGoodsSku().getGoodsName()); - }); - throw new ServiceException(ResultCode.ORDER_NOT_SUPPORT_DISTRIBUTION, stringBuilder.toString()); - } - } - - @Override - public Trade getBySn(String sn) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Trade::getSn, sn); - return this.getOne(queryWrapper); - } - - - @Override - public void payTrade(String tradeSn, String paymentName, String receivableNo) { - LambdaQueryWrapper orderQueryWrapper = new LambdaQueryWrapper<>(); - orderQueryWrapper.eq(Order::getTradeSn, tradeSn); - List orders = orderService.list(orderQueryWrapper); - for (Order order : orders) { - orderService.payOrder(order.getSn(), paymentName, receivableNo); - } - Trade trade = this.getBySn(tradeSn); - trade.setPayStatus(PayStatusEnum.PAID.name()); - this.saveOrUpdate(trade); - } - - /** - * 积分预处理 - * 下单同时,使用积分 - * - * @param tradeDTO - */ - private void pointPretreatment(TradeDTO tradeDTO) { - StringBuilder orderSns = new StringBuilder(); - for (CartVO item : tradeDTO.getCartList()) { - orderSns.append(item.getSn()).append(","); - } - if (tradeDTO.getPriceDetailDTO() != null && tradeDTO.getPriceDetailDTO().getPayPoint() != null && tradeDTO.getPriceDetailDTO().getPayPoint() > 0) { - Member userInfo = memberService.getUserInfo(); - if (userInfo.getPoint() < tradeDTO.getPriceDetailDTO().getPayPoint()) { - throw new ServiceException(ResultCode.PAY_POINT_ENOUGH); - } - boolean result = memberService.updateMemberPoint(tradeDTO.getPriceDetailDTO(). - getPayPoint().longValue(), false, tradeDTO.getMemberId(), - "订单【" + orderSns + "】创建,积分扣减"); - - if (!result) { - throw new ServiceException(ResultCode.PAY_POINT_ENOUGH); - } - } - } - - - /** - * 优惠券预处理 - * 下单同时,扣除优惠券 - * - * @param tradeDTO - */ - private void couponPretreatment(TradeDTO tradeDTO) { - List memberCouponDTOList = new ArrayList<>(); - if (null != tradeDTO.getPlatformCoupon()) { - memberCouponDTOList.add(tradeDTO.getPlatformCoupon()); - } - Collection storeCoupons = tradeDTO.getStoreCoupons().values(); - if (!storeCoupons.isEmpty()) { - memberCouponDTOList.addAll(storeCoupons); - } - List ids = memberCouponDTOList.stream().map(e -> e.getMemberCoupon().getId()).collect(Collectors.toList()); - memberCouponService.used(ids); - memberCouponDTOList.forEach(e -> couponService.usedCoupon(e.getMemberCoupon().getCouponId(), 1)); - - } - - -} \ No newline at end of file +package cn.lili.modules.order.order.serviceimpl; import cn.lili.common.cache.Cache; import cn.lili.common.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; import cn.lili.common.rocketmq.tags.MqOrderTagsEnum; import cn.lili.config.rocketmq.RocketmqCustomProperties; import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.MemberAddress; import cn.lili.modules.member.service.MemberService; import cn.lili.modules.order.cart.entity.dto.MemberCouponDTO; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.order.entity.dos.Order; import cn.lili.modules.order.order.entity.dos.Trade; import cn.lili.modules.order.order.entity.enums.PayStatusEnum; import cn.lili.modules.order.order.mapper.TradeMapper; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.order.service.TradeService; import cn.lili.modules.promotion.service.CouponService; import cn.lili.modules.promotion.service.MemberCouponService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; /** * 交易业务层实现 * * @author Chopper * @date 2020/11/17 7:39 下午 */ @Service @Transactional public class TradeServiceImpl extends ServiceImpl implements TradeService { //缓存 @Autowired private Cache cache; //订单 @Autowired private OrderService orderService; //会员 @Autowired private MemberService memberService; //优惠券 @Autowired private CouponService couponService; //会员优惠券 @Autowired private MemberCouponService memberCouponService; //RocketMQ @Autowired private RocketMQTemplate rocketMQTemplate; //RocketMQ 配置 @Autowired private RocketmqCustomProperties rocketmqCustomProperties; @Override @Transactional(rollbackFor = Exception.class) public Trade createTrade(TradeDTO tradeDTO) { //创建订单预校验 createTradeCheck(tradeDTO); Trade trade = new Trade(tradeDTO); String key = CachePrefix.TRADE.getPrefix() + trade.getSn(); //积分预处理 pointPretreatment(tradeDTO); //优惠券预处理 couponPretreatment(tradeDTO); //添加交易 this.save(trade); //添加订单 orderService.intoDB(tradeDTO); //写入缓存,给消费者调用 cache.put(key, tradeDTO); //构建订单创建消息 String destination = rocketmqCustomProperties.getOrderTopic() + ":" + MqOrderTagsEnum.ORDER_CREATE.name(); //发送订单创建消息 rocketMQTemplate.asyncSend(destination, key, RocketmqSendCallbackBuilder.commonCallback()); return trade; } /** * 创建订单最后一步校验 * * @param tradeDTO */ private void createTradeCheck(TradeDTO tradeDTO) { //创建订单如果没有收获地址, MemberAddress memberAddress = tradeDTO.getMemberAddress(); if (memberAddress == null) { throw new ServiceException(ResultCode.MEMBER_ADDRESS_NOT_EXIST); } /** * 订单配送区域校验 */ if (tradeDTO.getNotSupportFreight() != null && tradeDTO.getNotSupportFreight().size() > 0) { StringBuilder stringBuilder = new StringBuilder("包含商品有-"); tradeDTO.getNotSupportFreight().forEach(sku -> { stringBuilder.append(sku.getGoodsSku().getGoodsName()); }); throw new ServiceException(ResultCode.ORDER_NOT_SUPPORT_DISTRIBUTION, stringBuilder.toString()); } } @Override public Trade getBySn(String sn) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Trade::getSn, sn); return this.getOne(queryWrapper); } @Override public void payTrade(String tradeSn, String paymentName, String receivableNo) { LambdaQueryWrapper orderQueryWrapper = new LambdaQueryWrapper<>(); orderQueryWrapper.eq(Order::getTradeSn, tradeSn); List orders = orderService.list(orderQueryWrapper); for (Order order : orders) { orderService.payOrder(order.getSn(), paymentName, receivableNo); } Trade trade = this.getBySn(tradeSn); trade.setPayStatus(PayStatusEnum.PAID.name()); this.saveOrUpdate(trade); } /** * 积分预处理 * 下单同时,使用积分 * * @param tradeDTO */ private void pointPretreatment(TradeDTO tradeDTO) { StringBuilder orderSns = new StringBuilder(); for (CartVO item : tradeDTO.getCartList()) { orderSns.append(item.getSn()).append(","); } if (tradeDTO.getPriceDetailDTO() != null && tradeDTO.getPriceDetailDTO().getPayPoint() != null && tradeDTO.getPriceDetailDTO().getPayPoint() > 0) { Member userInfo = memberService.getUserInfo(); if (userInfo.getPoint() < tradeDTO.getPriceDetailDTO().getPayPoint()) { throw new ServiceException(ResultCode.PAY_POINT_ENOUGH); } boolean result = memberService.updateMemberPoint(tradeDTO.getPriceDetailDTO(). getPayPoint().longValue(), false, tradeDTO.getMemberId(), "订单【" + orderSns + "】创建,积分扣减"); if (!result) { throw new ServiceException(ResultCode.PAY_POINT_ENOUGH); } } } /** * 优惠券预处理 * 下单同时,扣除优惠券 * * @param tradeDTO */ private void couponPretreatment(TradeDTO tradeDTO) { List memberCouponDTOList = new ArrayList<>(); if (null != tradeDTO.getPlatformCoupon()) { memberCouponDTOList.add(tradeDTO.getPlatformCoupon()); } Collection storeCoupons = tradeDTO.getStoreCoupons().values(); if (!storeCoupons.isEmpty()) { memberCouponDTOList.addAll(storeCoupons); } List ids = memberCouponDTOList.stream().map(e -> e.getMemberCoupon().getId()).collect(Collectors.toList()); memberCouponService.used(ids); memberCouponDTOList.forEach(e -> couponService.usedCoupon(e.getMemberCoupon().getCouponId(), 1)); } } \ No newline at end of file