优化促销相关代码,修复bug
This commit is contained in:
		
							parent
							
								
									f0b43ddd32
								
							
						
					
					
						commit
						7dcdb43acf
					
				@ -504,8 +504,8 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        //修改规格索引,发送mq消息
 | 
					        //修改规格索引,发送mq消息
 | 
				
			||||||
        Map<String, Object> updateIndexFieldsMap = EsIndexUtil.getUpdateIndexFieldsMap(
 | 
					        Map<String, Object> updateIndexFieldsMap = EsIndexUtil.getUpdateIndexFieldsMap(
 | 
				
			||||||
                MapUtil.builder().put("id", goodsSku.getId()).build(),
 | 
					                MapUtil.builder(new HashMap<String, Object>()).put("id", goodsSku.getId()).build(),
 | 
				
			||||||
                MapUtil.builder().put("commentNum", goodsSku.getCommentNum()).put("highPraiseNum", highPraiseNum)
 | 
					                MapUtil.builder(new HashMap<String, Object>()).put("commentNum", goodsSku.getCommentNum()).put("highPraiseNum", highPraiseNum)
 | 
				
			||||||
                        .put("grade", grade).build());
 | 
					                        .put("grade", grade).build());
 | 
				
			||||||
        String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX_FIELD.name();
 | 
					        String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX_FIELD.name();
 | 
				
			||||||
        rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(updateIndexFieldsMap), RocketmqSendCallbackBuilder.commonCallback());
 | 
					        rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(updateIndexFieldsMap), RocketmqSendCallbackBuilder.commonCallback());
 | 
				
			||||||
 | 
				
			|||||||
@ -274,4 +274,14 @@ public interface OrderService extends IService<Order> {
 | 
				
			|||||||
     * @return 订单支付记录分页
 | 
					     * @return 订单支付记录分页
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    IPage<PaymentLog> queryPaymentLogs(IPage<PaymentLog> page, Wrapper<PaymentLog> queryWrapper);
 | 
					    IPage<PaymentLog> queryPaymentLogs(IPage<PaymentLog> page, Wrapper<PaymentLog> queryWrapper);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 检查是否开始虚拟成团
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param pintuanId 拼团活动id
 | 
				
			||||||
 | 
					     * @param requiredNum 成团人数
 | 
				
			||||||
 | 
					     * @param fictitious 是否开启成团
 | 
				
			||||||
 | 
					     * @return 是否成功
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    boolean checkFictitiousOrder(String pintuanId, Integer requiredNum, Boolean fictitious);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -74,10 +74,8 @@ import javax.servlet.ServletOutputStream;
 | 
				
			|||||||
import javax.servlet.http.HttpServletResponse;
 | 
					import javax.servlet.http.HttpServletResponse;
 | 
				
			||||||
import java.io.InputStream;
 | 
					import java.io.InputStream;
 | 
				
			||||||
import java.net.URLEncoder;
 | 
					import java.net.URLEncoder;
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.*;
 | 
				
			||||||
import java.util.Date;
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
import java.util.Objects;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 子订单业务层实现
 | 
					 * 子订单业务层实现
 | 
				
			||||||
@ -684,6 +682,77 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 检查是否开始虚拟成团
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param pintuanId   拼团活动id
 | 
				
			||||||
 | 
					     * @param requiredNum 成团人数
 | 
				
			||||||
 | 
					     * @param fictitious  是否开启成团
 | 
				
			||||||
 | 
					     * @return 是否成功
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public boolean checkFictitiousOrder(String pintuanId, Integer requiredNum, Boolean fictitious) {
 | 
				
			||||||
 | 
					        Map<String, List<Order>> collect = this.queryListByPromotion(pintuanId)
 | 
				
			||||||
 | 
					                .stream().filter(i -> CharSequenceUtil.isNotEmpty(i.getParentOrderSn()))
 | 
				
			||||||
 | 
					                .collect(Collectors.groupingBy(Order::getParentOrderSn));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (Map.Entry<String, List<Order>> entry : collect.entrySet()) {
 | 
				
			||||||
 | 
					            //是否开启虚拟成团
 | 
				
			||||||
 | 
					            if (Boolean.FALSE.equals(fictitious) && entry.getValue().size() < requiredNum) {
 | 
				
			||||||
 | 
					                //如果未开启虚拟成团且已参团人数小于成团人数,则自动取消订单
 | 
				
			||||||
 | 
					                String reason = "拼团活动结束订单未付款,系统自动取消订单";
 | 
				
			||||||
 | 
					                if (CharSequenceUtil.isNotEmpty(entry.getKey())) {
 | 
				
			||||||
 | 
					                    this.systemCancel(entry.getKey(), reason);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    for (Order order : entry.getValue()) {
 | 
				
			||||||
 | 
					                        this.systemCancel(order.getSn(), reason);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else if (Boolean.TRUE.equals(fictitious)) {
 | 
				
			||||||
 | 
					                this.fictitiousPintuan(entry, requiredNum);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 虚拟成团
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param entry       订单列表
 | 
				
			||||||
 | 
					     * @param requiredNum 必须参团人数
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void fictitiousPintuan(Map.Entry<String, List<Order>> entry, Integer requiredNum) {
 | 
				
			||||||
 | 
					        Map<String, List<Order>> listMap = entry.getValue().stream().collect(Collectors.groupingBy(Order::getPayStatus));
 | 
				
			||||||
 | 
					        //未付款订单
 | 
				
			||||||
 | 
					        List<Order> unpaidOrders = listMap.get(PayStatusEnum.UNPAID.name());
 | 
				
			||||||
 | 
					        //未付款订单自动取消
 | 
				
			||||||
 | 
					        if (unpaidOrders != null && !unpaidOrders.isEmpty()) {
 | 
				
			||||||
 | 
					            for (Order unpaidOrder : unpaidOrders) {
 | 
				
			||||||
 | 
					                this.systemCancel(unpaidOrder.getSn(), "拼团活动结束订单未付款,系统自动取消订单");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        List<Order> paidOrders = listMap.get(PayStatusEnum.PAID.name());
 | 
				
			||||||
 | 
					        //如待参团人数大于0,并已开启虚拟成团
 | 
				
			||||||
 | 
					        if (!paidOrders.isEmpty()) {
 | 
				
			||||||
 | 
					            //待参团人数
 | 
				
			||||||
 | 
					            int waitNum = requiredNum - paidOrders.size();
 | 
				
			||||||
 | 
					            //添加虚拟成团
 | 
				
			||||||
 | 
					            for (int i = 0; i < waitNum; i++) {
 | 
				
			||||||
 | 
					                Order order = new Order();
 | 
				
			||||||
 | 
					                BeanUtil.copyProperties(paidOrders.get(0), order);
 | 
				
			||||||
 | 
					                order.setMemberId("-1");
 | 
				
			||||||
 | 
					                order.setMemberName("参团人员");
 | 
				
			||||||
 | 
					                order.setDeleteFlag(true);
 | 
				
			||||||
 | 
					                this.save(order);
 | 
				
			||||||
 | 
					                paidOrders.add(order);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            for (Order paidOrder : paidOrders) {
 | 
				
			||||||
 | 
					                paidOrder.setOrderStatus(OrderStatusEnum.UNDELIVERED.name());
 | 
				
			||||||
 | 
					                orderStatusMessage(paidOrder);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 订单状态变更消息
 | 
					     * 订单状态变更消息
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 | 
				
			|||||||
@ -42,15 +42,31 @@ public interface SeckillApplyService extends IService<SeckillApply> {
 | 
				
			|||||||
     * @param pageVo     分页参数
 | 
					     * @param pageVo     分页参数
 | 
				
			||||||
     * @return 限时请购申请列表
 | 
					     * @return 限时请购申请列表
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    IPage<SeckillApply> getSeckillApply(SeckillSearchParams queryParam, PageVO pageVo);
 | 
					    IPage<SeckillApply> getSeckillApplyPage(SeckillSearchParams queryParam, PageVO pageVo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 分页查询限时请购申请列表
 | 
					     * 查询限时请购申请列表
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param queryParam 秒杀活动申请查询参数
 | 
					     * @param queryParam 秒杀活动申请查询参数
 | 
				
			||||||
     * @return 限时请购申请列表
 | 
					     * @return 限时请购申请列表
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    List<SeckillApply> getSeckillApply(SeckillSearchParams queryParam);
 | 
					    List<SeckillApply> getSeckillApplyList(SeckillSearchParams queryParam);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 查询限时请购申请列表总数
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param queryParam 查询条件
 | 
				
			||||||
 | 
					     * @return 限时请购申请列表总数
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    long getSeckillApplyCount(SeckillSearchParams queryParam);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 查询限时请购申请
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param queryParam 秒杀活动申请查询参数
 | 
				
			||||||
 | 
					     * @return 限时请购申请
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SeckillApply getSeckillApply(SeckillSearchParams queryParam);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 添加秒杀活动申请
 | 
					     * 添加秒杀活动申请
 | 
				
			||||||
@ -72,4 +88,13 @@ public interface SeckillApplyService extends IService<SeckillApply> {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    void removeSeckillApply(String seckillId, String id);
 | 
					    void removeSeckillApply(String seckillId, String id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 更新秒杀商品库存
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param seckillId 秒杀活动id
 | 
				
			||||||
 | 
					     * @param skuId 商品skuId
 | 
				
			||||||
 | 
					     * @param quantity 库存
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void updateSeckillApplyQuantity(String seckillId, String skuId, Integer quantity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -2,7 +2,6 @@ package cn.lili.modules.promotion.serviceimpl;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import cn.hutool.core.text.CharSequenceUtil;
 | 
					import cn.hutool.core.text.CharSequenceUtil;
 | 
				
			||||||
import cn.hutool.json.JSONUtil;
 | 
					import cn.hutool.json.JSONUtil;
 | 
				
			||||||
import cn.lili.common.enums.PromotionTypeEnum;
 | 
					 | 
				
			||||||
import cn.lili.common.enums.ResultCode;
 | 
					import cn.lili.common.enums.ResultCode;
 | 
				
			||||||
import cn.lili.common.exception.ServiceException;
 | 
					import cn.lili.common.exception.ServiceException;
 | 
				
			||||||
import cn.lili.common.properties.RocketmqCustomProperties;
 | 
					import cn.lili.common.properties.RocketmqCustomProperties;
 | 
				
			||||||
@ -32,7 +31,7 @@ import java.util.*;
 | 
				
			|||||||
 * @author paulG
 | 
					 * @author paulG
 | 
				
			||||||
 * @since 2021/11/30
 | 
					 * @since 2021/11/30
 | 
				
			||||||
 **/
 | 
					 **/
 | 
				
			||||||
public class AbstractPromotionsServiceImpl<M extends BaseMapper<T>, T extends BasePromotions> extends ServiceImpl<M, T> implements AbstractPromotionsService<T> {
 | 
					public abstract class AbstractPromotionsServiceImpl<M extends BaseMapper<T>, T extends BasePromotions> extends ServiceImpl<M, T> implements AbstractPromotionsService<T> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 促销商品
 | 
					     * 促销商品
 | 
				
			||||||
@ -264,13 +263,4 @@ public class AbstractPromotionsServiceImpl<M extends BaseMapper<T>, T extends Ba
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 当前促销类型
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @return 当前促销类型
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public PromotionTypeEnum getPromotionType() {
 | 
					 | 
				
			||||||
        return null;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,5 @@
 | 
				
			|||||||
package cn.lili.modules.promotion.serviceimpl;
 | 
					package cn.lili.modules.promotion.serviceimpl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import cn.hutool.core.bean.BeanUtil;
 | 
					 | 
				
			||||||
import cn.hutool.core.text.CharSequenceUtil;
 | 
					import cn.hutool.core.text.CharSequenceUtil;
 | 
				
			||||||
import cn.hutool.json.JSONUtil;
 | 
					import cn.hutool.json.JSONUtil;
 | 
				
			||||||
import cn.lili.common.enums.PromotionTypeEnum;
 | 
					import cn.lili.common.enums.PromotionTypeEnum;
 | 
				
			||||||
@ -34,8 +33,6 @@ import org.springframework.transaction.annotation.Transactional;
 | 
				
			|||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
import java.util.Date;
 | 
					import java.util.Date;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
import java.util.stream.Collectors;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 拼团业务层实现
 | 
					 * 拼团业务层实现
 | 
				
			||||||
@ -201,10 +198,7 @@ public class PintuanServiceImpl extends AbstractPromotionsServiceImpl<PintuanMap
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        if (promotions.getEndTime() == null && promotions.getStartTime() == null) {
 | 
					        if (promotions.getEndTime() == null && promotions.getStartTime() == null) {
 | 
				
			||||||
            //过滤父级拼团订单,根据父级拼团订单分组
 | 
					            //过滤父级拼团订单,根据父级拼团订单分组
 | 
				
			||||||
            Map<String, List<Order>> collect = orderService.queryListByPromotion(promotions.getId())
 | 
					            this.orderService.checkFictitiousOrder(promotions.getId(), promotions.getRequiredNum(), promotions.getFictitious());
 | 
				
			||||||
                    .stream().filter(i -> CharSequenceUtil.isNotEmpty(i.getParentOrderSn()))
 | 
					 | 
				
			||||||
                    .collect(Collectors.groupingBy(Order::getParentOrderSn));
 | 
					 | 
				
			||||||
            this.isOpenFictitiousPintuan(promotions, collect);
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -268,71 +262,6 @@ public class PintuanServiceImpl extends AbstractPromotionsServiceImpl<PintuanMap
 | 
				
			|||||||
        memberVO.setToBeGroupedNum(toBoGrouped);
 | 
					        memberVO.setToBeGroupedNum(toBoGrouped);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 从指定订单列表中检查是否开始虚拟成团
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param pintuan 拼团活动信息
 | 
					 | 
				
			||||||
     * @param collect 检查的订单列表
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void isOpenFictitiousPintuan(Pintuan pintuan, Map<String, List<Order>> collect) {
 | 
					 | 
				
			||||||
        //成团人数
 | 
					 | 
				
			||||||
        Integer requiredNum = pintuan.getRequiredNum();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (Map.Entry<String, List<Order>> entry : collect.entrySet()) {
 | 
					 | 
				
			||||||
            //是否开启虚拟成团
 | 
					 | 
				
			||||||
            if (Boolean.FALSE.equals(pintuan.getFictitious()) && entry.getValue().size() < requiredNum) {
 | 
					 | 
				
			||||||
                //如果未开启虚拟成团且已参团人数小于成团人数,则自动取消订单
 | 
					 | 
				
			||||||
                String reason = "拼团活动结束订单未付款,系统自动取消订单";
 | 
					 | 
				
			||||||
                if (CharSequenceUtil.isNotEmpty(entry.getKey())) {
 | 
					 | 
				
			||||||
                    this.orderService.systemCancel(entry.getKey(), reason);
 | 
					 | 
				
			||||||
                } else {
 | 
					 | 
				
			||||||
                    for (Order order : entry.getValue()) {
 | 
					 | 
				
			||||||
                        this.orderService.systemCancel(order.getSn(), reason);
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            } else if (Boolean.TRUE.equals(pintuan.getFictitious())) {
 | 
					 | 
				
			||||||
                this.fictitiousPintuan(entry, requiredNum);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 虚拟成团
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param entry       订单列表
 | 
					 | 
				
			||||||
     * @param requiredNum 必须参团人数
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void fictitiousPintuan(Map.Entry<String, List<Order>> entry, Integer requiredNum) {
 | 
					 | 
				
			||||||
        Map<String, List<Order>> listMap = entry.getValue().stream().collect(Collectors.groupingBy(Order::getPayStatus));
 | 
					 | 
				
			||||||
        //未付款订单
 | 
					 | 
				
			||||||
        List<Order> unpaidOrders = listMap.get(PayStatusEnum.UNPAID.name());
 | 
					 | 
				
			||||||
        //未付款订单自动取消
 | 
					 | 
				
			||||||
        if (unpaidOrders != null && !unpaidOrders.isEmpty()) {
 | 
					 | 
				
			||||||
            for (Order unpaidOrder : unpaidOrders) {
 | 
					 | 
				
			||||||
                orderService.systemCancel(unpaidOrder.getSn(), "拼团活动结束订单未付款,系统自动取消订单");
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        List<Order> paidOrders = listMap.get(PayStatusEnum.PAID.name());
 | 
					 | 
				
			||||||
        //如待参团人数大于0,并已开启虚拟成团
 | 
					 | 
				
			||||||
        if (!paidOrders.isEmpty()) {
 | 
					 | 
				
			||||||
            //待参团人数
 | 
					 | 
				
			||||||
            int waitNum = requiredNum - paidOrders.size();
 | 
					 | 
				
			||||||
            //添加虚拟成团
 | 
					 | 
				
			||||||
            for (int i = 0; i < waitNum; i++) {
 | 
					 | 
				
			||||||
                Order order = new Order();
 | 
					 | 
				
			||||||
                BeanUtil.copyProperties(paidOrders.get(0), order);
 | 
					 | 
				
			||||||
                order.setMemberId("-1");
 | 
					 | 
				
			||||||
                order.setMemberName("参团人员");
 | 
					 | 
				
			||||||
                orderService.save(order);
 | 
					 | 
				
			||||||
                paidOrders.add(order);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            for (Order paidOrder : paidOrders) {
 | 
					 | 
				
			||||||
                paidOrder.setOrderStatus(OrderStatusEnum.UNDELIVERED.name());
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            orderService.updateBatchById(paidOrders);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 更新记录的促销商品信息
 | 
					     * 更新记录的促销商品信息
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 | 
				
			|||||||
@ -2,9 +2,11 @@ package cn.lili.modules.promotion.serviceimpl;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import cn.hutool.core.map.MapUtil;
 | 
					import cn.hutool.core.map.MapUtil;
 | 
				
			||||||
import cn.hutool.core.text.CharSequenceUtil;
 | 
					import cn.hutool.core.text.CharSequenceUtil;
 | 
				
			||||||
 | 
					import cn.hutool.json.JSONUtil;
 | 
				
			||||||
import cn.lili.common.enums.PromotionTypeEnum;
 | 
					import cn.lili.common.enums.PromotionTypeEnum;
 | 
				
			||||||
import cn.lili.common.enums.ResultCode;
 | 
					import cn.lili.common.enums.ResultCode;
 | 
				
			||||||
import cn.lili.common.exception.ServiceException;
 | 
					import cn.lili.common.exception.ServiceException;
 | 
				
			||||||
 | 
					import cn.lili.common.properties.RocketmqCustomProperties;
 | 
				
			||||||
import cn.lili.modules.goods.entity.dos.GoodsSku;
 | 
					import cn.lili.modules.goods.entity.dos.GoodsSku;
 | 
				
			||||||
import cn.lili.modules.goods.service.GoodsSkuService;
 | 
					import cn.lili.modules.goods.service.GoodsSkuService;
 | 
				
			||||||
import cn.lili.modules.promotion.entity.dos.PointsGoods;
 | 
					import cn.lili.modules.promotion.entity.dos.PointsGoods;
 | 
				
			||||||
@ -15,10 +17,13 @@ import cn.lili.modules.promotion.mapper.PointsGoodsMapper;
 | 
				
			|||||||
import cn.lili.modules.promotion.service.PointsGoodsService;
 | 
					import cn.lili.modules.promotion.service.PointsGoodsService;
 | 
				
			||||||
import cn.lili.modules.promotion.service.PromotionGoodsService;
 | 
					import cn.lili.modules.promotion.service.PromotionGoodsService;
 | 
				
			||||||
import cn.lili.modules.promotion.tools.PromotionTools;
 | 
					import cn.lili.modules.promotion.tools.PromotionTools;
 | 
				
			||||||
import cn.lili.modules.search.service.EsGoodsIndexService;
 | 
					import cn.lili.modules.search.utils.EsIndexUtil;
 | 
				
			||||||
 | 
					import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
 | 
				
			||||||
 | 
					import cn.lili.rocketmq.tags.GoodsTagsEnum;
 | 
				
			||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
					import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
				
			||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 | 
					import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 | 
				
			||||||
import lombok.extern.slf4j.Slf4j;
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
 | 
					import org.apache.rocketmq.spring.core.RocketMQTemplate;
 | 
				
			||||||
import org.springframework.beans.BeanUtils;
 | 
					import org.springframework.beans.BeanUtils;
 | 
				
			||||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
import org.springframework.stereotype.Service;
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
@ -51,14 +56,22 @@ public class PointsGoodsServiceImpl extends AbstractPromotionsServiceImpl<Points
 | 
				
			|||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
    private GoodsSkuService goodsSkuService;
 | 
					    private GoodsSkuService goodsSkuService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * rocketMq配置
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
    private EsGoodsIndexService goodsIndexService;
 | 
					    private RocketmqCustomProperties rocketmqCustomProperties;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * rocketMq
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private RocketMQTemplate rocketMQTemplate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public boolean savePointsGoodsBatch(List<PointsGoods> promotionsList) {
 | 
					    public boolean savePointsGoodsBatch(List<PointsGoods> promotionsList) {
 | 
				
			||||||
        List<PromotionGoods> promotionGoodsList = new ArrayList<>();
 | 
					        List<PromotionGoods> promotionGoodsList = new ArrayList<>();
 | 
				
			||||||
        Map<String, Long> skuPoints = new HashMap<>();
 | 
					 | 
				
			||||||
        for (PointsGoods pointsGoods : promotionsList) {
 | 
					        for (PointsGoods pointsGoods : promotionsList) {
 | 
				
			||||||
            this.initPromotion(pointsGoods);
 | 
					            this.initPromotion(pointsGoods);
 | 
				
			||||||
            this.checkPromotions(pointsGoods);
 | 
					            this.checkPromotions(pointsGoods);
 | 
				
			||||||
@ -73,16 +86,13 @@ public class PointsGoodsServiceImpl extends AbstractPromotionsServiceImpl<Points
 | 
				
			|||||||
            PromotionGoods promotionGoods = new PromotionGoods(pointsGoods, goodsSku);
 | 
					            PromotionGoods promotionGoods = new PromotionGoods(pointsGoods, goodsSku);
 | 
				
			||||||
            promotionGoods.setPromotionType(PromotionTypeEnum.POINTS_GOODS.name());
 | 
					            promotionGoods.setPromotionType(PromotionTypeEnum.POINTS_GOODS.name());
 | 
				
			||||||
            promotionGoodsList.add(promotionGoods);
 | 
					            promotionGoodsList.add(promotionGoods);
 | 
				
			||||||
            skuPoints.put(pointsGoods.getSkuId(), pointsGoods.getPoints());
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        boolean saveBatch = this.saveBatch(promotionsList);
 | 
					        boolean saveBatch = this.saveBatch(promotionsList);
 | 
				
			||||||
        if (saveBatch) {
 | 
					        if (saveBatch) {
 | 
				
			||||||
            this.promotionGoodsService.saveOrUpdateBatch(promotionGoodsList);
 | 
					            this.promotionGoodsService.saveOrUpdateBatch(promotionGoodsList);
 | 
				
			||||||
            for (Map.Entry<String, Long> entry : skuPoints.entrySet()) {
 | 
					            for (PointsGoods pointsGoods : promotionsList) {
 | 
				
			||||||
                Map<String, Object> query = MapUtil.builder(new HashMap<String, Object>()).put("id", entry.getKey()).build();
 | 
					                this.updateEsGoodsIndex(pointsGoods);
 | 
				
			||||||
                Map<String, Object> update = MapUtil.builder(new HashMap<String, Object>()).put("points", entry.getValue()).build();
 | 
					 | 
				
			||||||
                this.goodsIndexService.updateIndex(query, update);
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -205,7 +215,10 @@ public class PointsGoodsServiceImpl extends AbstractPromotionsServiceImpl<Points
 | 
				
			|||||||
    public void updateEsGoodsIndex(PointsGoods promotions) {
 | 
					    public void updateEsGoodsIndex(PointsGoods promotions) {
 | 
				
			||||||
        Map<String, Object> query = MapUtil.builder(new HashMap<String, Object>()).put("id", promotions.getSkuId()).build();
 | 
					        Map<String, Object> query = MapUtil.builder(new HashMap<String, Object>()).put("id", promotions.getSkuId()).build();
 | 
				
			||||||
        Map<String, Object> update = MapUtil.builder(new HashMap<String, Object>()).put("points", promotions.getPoints()).build();
 | 
					        Map<String, Object> update = MapUtil.builder(new HashMap<String, Object>()).put("points", promotions.getPoints()).build();
 | 
				
			||||||
        this.goodsIndexService.updateIndex(query, update);
 | 
					        //修改规格索引,发送mq消息
 | 
				
			||||||
 | 
					        Map<String, Object> updateIndexFieldsMap = EsIndexUtil.getUpdateIndexFieldsMap(query, update);
 | 
				
			||||||
 | 
					        String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX_FIELD.name();
 | 
				
			||||||
 | 
					        rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(updateIndexFieldsMap), RocketmqSendCallbackBuilder.commonCallback());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@ import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
 | 
				
			|||||||
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
 | 
					import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
 | 
				
			||||||
import cn.lili.modules.promotion.entity.vos.BasePromotionsSearchParams;
 | 
					import cn.lili.modules.promotion.entity.vos.BasePromotionsSearchParams;
 | 
				
			||||||
import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams;
 | 
					import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams;
 | 
				
			||||||
 | 
					import cn.lili.modules.promotion.entity.vos.SeckillSearchParams;
 | 
				
			||||||
import cn.lili.modules.promotion.mapper.PromotionGoodsMapper;
 | 
					import cn.lili.modules.promotion.mapper.PromotionGoodsMapper;
 | 
				
			||||||
import cn.lili.modules.promotion.service.CouponService;
 | 
					import cn.lili.modules.promotion.service.CouponService;
 | 
				
			||||||
import cn.lili.modules.promotion.service.FullDiscountService;
 | 
					import cn.lili.modules.promotion.service.FullDiscountService;
 | 
				
			||||||
@ -264,16 +265,14 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
 | 
				
			|||||||
    public void updatePromotionGoodsStock(PromotionTypeEnum typeEnum, String promotionId, String skuId, Integer quantity) {
 | 
					    public void updatePromotionGoodsStock(PromotionTypeEnum typeEnum, String promotionId, String skuId, Integer quantity) {
 | 
				
			||||||
        String promotionStockKey = PromotionGoodsService.getPromotionGoodsStockCacheKey(typeEnum, promotionId, skuId);
 | 
					        String promotionStockKey = PromotionGoodsService.getPromotionGoodsStockCacheKey(typeEnum, promotionId, skuId);
 | 
				
			||||||
        if (typeEnum.equals(PromotionTypeEnum.SECKILL)) {
 | 
					        if (typeEnum.equals(PromotionTypeEnum.SECKILL)) {
 | 
				
			||||||
            LambdaQueryWrapper<SeckillApply> queryWrapper = new LambdaQueryWrapper<>();
 | 
					            SeckillSearchParams searchParams = new SeckillSearchParams();
 | 
				
			||||||
            queryWrapper.eq(SeckillApply::getSeckillId, promotionId).eq(SeckillApply::getSkuId, skuId);
 | 
					            searchParams.setSeckillId(promotionId);
 | 
				
			||||||
            SeckillApply seckillApply = this.seckillApplyService.getOne(queryWrapper, false);
 | 
					            searchParams.setSkuId(skuId);
 | 
				
			||||||
 | 
					            SeckillApply seckillApply = this.seckillApplyService.getSeckillApply(searchParams);
 | 
				
			||||||
            if (seckillApply == null) {
 | 
					            if (seckillApply == null) {
 | 
				
			||||||
                throw new ServiceException(ResultCode.SECKILL_NOT_EXIST_ERROR);
 | 
					                throw new ServiceException(ResultCode.SECKILL_NOT_EXIST_ERROR);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            LambdaUpdateWrapper<SeckillApply> updateWrapper = new LambdaUpdateWrapper<>();
 | 
					            seckillApplyService.updateSeckillApplyQuantity(promotionId, skuId, quantity);
 | 
				
			||||||
            updateWrapper.eq(SeckillApply::getSeckillId, promotionId).eq(SeckillApply::getSkuId, skuId);
 | 
					 | 
				
			||||||
            updateWrapper.set(SeckillApply::getQuantity, quantity);
 | 
					 | 
				
			||||||
            seckillApplyService.update(updateWrapper);
 | 
					 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            LambdaUpdateWrapper<PromotionGoods> updateWrapper = new LambdaUpdateWrapper<>();
 | 
					            LambdaUpdateWrapper<PromotionGoods> updateWrapper = new LambdaUpdateWrapper<>();
 | 
				
			||||||
            updateWrapper.eq(PromotionGoods::getPromotionType, typeEnum.name()).eq(PromotionGoods::getPromotionId, promotionId).eq(PromotionGoods::getSkuId, skuId);
 | 
					            updateWrapper.eq(PromotionGoods::getPromotionType, typeEnum.name()).eq(PromotionGoods::getPromotionId, promotionId).eq(PromotionGoods::getSkuId, skuId);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,6 @@
 | 
				
			|||||||
package cn.lili.modules.promotion.serviceimpl;
 | 
					package cn.lili.modules.promotion.serviceimpl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import cn.lili.common.enums.PromotionTypeEnum;
 | 
					import cn.lili.common.enums.PromotionTypeEnum;
 | 
				
			||||||
import cn.lili.modules.goods.service.GoodsSkuService;
 | 
					 | 
				
			||||||
import cn.lili.modules.promotion.entity.dos.*;
 | 
					import cn.lili.modules.promotion.entity.dos.*;
 | 
				
			||||||
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
 | 
					import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
 | 
				
			||||||
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
 | 
					import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
 | 
				
			||||||
@ -64,9 +63,6 @@ public class PromotionServiceImpl implements PromotionService {
 | 
				
			|||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
    private PointsGoodsService pointsGoodsService;
 | 
					    private PointsGoodsService pointsGoodsService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private GoodsSkuService goodsSkuService;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 获取当前进行的所有促销活动信息
 | 
					     * 获取当前进行的所有促销活动信息
 | 
				
			||||||
@ -176,7 +172,7 @@ public class PromotionServiceImpl implements PromotionService {
 | 
				
			|||||||
        SeckillSearchParams searchParams = new SeckillSearchParams();
 | 
					        SeckillSearchParams searchParams = new SeckillSearchParams();
 | 
				
			||||||
        searchParams.setSeckillId(promotionGoods.getPromotionId());
 | 
					        searchParams.setSeckillId(promotionGoods.getPromotionId());
 | 
				
			||||||
        searchParams.setSkuId(promotionGoods.getSkuId());
 | 
					        searchParams.setSkuId(promotionGoods.getSkuId());
 | 
				
			||||||
        List<SeckillApply> seckillApplyList = seckillApplyService.getSeckillApply(searchParams);
 | 
					        List<SeckillApply> seckillApplyList = seckillApplyService.getSeckillApplyList(searchParams);
 | 
				
			||||||
        if (seckillApplyList != null && !seckillApplyList.isEmpty()) {
 | 
					        if (seckillApplyList != null && !seckillApplyList.isEmpty()) {
 | 
				
			||||||
            SeckillApply seckillApply = seckillApplyList.get(0);
 | 
					            SeckillApply seckillApply = seckillApplyList.get(0);
 | 
				
			||||||
            int nextHour = 23;
 | 
					            int nextHour = 23;
 | 
				
			||||||
 | 
				
			|||||||
@ -27,6 +27,7 @@ import cn.lili.modules.promotion.tools.PromotionCacheKeys;
 | 
				
			|||||||
import cn.lili.modules.promotion.tools.PromotionTools;
 | 
					import cn.lili.modules.promotion.tools.PromotionTools;
 | 
				
			||||||
import cn.lili.mybatis.util.PageUtil;
 | 
					import cn.lili.mybatis.util.PageUtil;
 | 
				
			||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
					import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
				
			||||||
 | 
					import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
				
			||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
					import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
				
			||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
					import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
				
			||||||
import lombok.extern.slf4j.Slf4j;
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
@ -100,7 +101,7 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public IPage<SeckillApply> getSeckillApply(SeckillSearchParams queryParam, PageVO pageVo) {
 | 
					    public IPage<SeckillApply> getSeckillApplyPage(SeckillSearchParams queryParam, PageVO pageVo) {
 | 
				
			||||||
        IPage<SeckillApply> seckillApplyPage = this.page(PageUtil.initPage(pageVo), queryParam.queryWrapper());
 | 
					        IPage<SeckillApply> seckillApplyPage = this.page(PageUtil.initPage(pageVo), queryParam.queryWrapper());
 | 
				
			||||||
        if (seckillApplyPage != null && !seckillApplyPage.getRecords().isEmpty()) {
 | 
					        if (seckillApplyPage != null && !seckillApplyPage.getRecords().isEmpty()) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -126,10 +127,32 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
 | 
				
			|||||||
     * @return 限时请购申请列表
 | 
					     * @return 限时请购申请列表
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public List<SeckillApply> getSeckillApply(SeckillSearchParams queryParam) {
 | 
					    public List<SeckillApply> getSeckillApplyList(SeckillSearchParams queryParam) {
 | 
				
			||||||
        return this.list(queryParam.queryWrapper());
 | 
					        return this.list(queryParam.queryWrapper());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 查询限时请购申请列表总数
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param queryParam 查询条件
 | 
				
			||||||
 | 
					     * @return 限时请购申请列表总数
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public long getSeckillApplyCount(SeckillSearchParams queryParam) {
 | 
				
			||||||
 | 
					        return this.count(queryParam.queryWrapper());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 查询限时请购申请
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param queryParam 秒杀活动申请查询参数
 | 
				
			||||||
 | 
					     * @return 限时请购申请
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public SeckillApply getSeckillApply(SeckillSearchParams queryParam) {
 | 
				
			||||||
 | 
					        return this.getOne(queryParam.queryWrapper(), false);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void addSeckillApply(String seckillId, String storeId, List<SeckillApplyVO> seckillApplyList) {
 | 
					    public void addSeckillApply(String seckillId, String storeId, List<SeckillApplyVO> seckillApplyList) {
 | 
				
			||||||
        Seckill seckill = this.seckillService.getById(seckillId);
 | 
					        Seckill seckill = this.seckillService.getById(seckillId);
 | 
				
			||||||
@ -187,7 +210,7 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
 | 
				
			|||||||
     * 批量删除秒杀活动申请
 | 
					     * 批量删除秒杀活动申请
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param seckillId 秒杀活动活动id
 | 
					     * @param seckillId 秒杀活动活动id
 | 
				
			||||||
     * @param id    id
 | 
					     * @param id        id
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void removeSeckillApply(String seckillId, String id) {
 | 
					    public void removeSeckillApply(String seckillId, String id) {
 | 
				
			||||||
@ -210,6 +233,21 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
 | 
				
			|||||||
        this.promotionGoodsService.deletePromotionGoods(seckillId, Collections.singletonList(seckillApply.getSkuId()));
 | 
					        this.promotionGoodsService.deletePromotionGoods(seckillId, Collections.singletonList(seckillApply.getSkuId()));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 更新秒杀商品库存
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param seckillId 秒杀活动id
 | 
				
			||||||
 | 
					     * @param skuId     商品skuId
 | 
				
			||||||
 | 
					     * @param quantity  库存
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void updateSeckillApplyQuantity(String seckillId, String skuId, Integer quantity) {
 | 
				
			||||||
 | 
					        LambdaUpdateWrapper<SeckillApply> updateWrapper = new LambdaUpdateWrapper<>();
 | 
				
			||||||
 | 
					        updateWrapper.eq(SeckillApply::getSeckillId, seckillId).eq(SeckillApply::getSkuId, skuId);
 | 
				
			||||||
 | 
					        updateWrapper.set(SeckillApply::getQuantity, quantity);
 | 
				
			||||||
 | 
					        this.update(updateWrapper);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 检查秒杀活动申请列表参数信息
 | 
					     * 检查秒杀活动申请列表参数信息
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 | 
				
			|||||||
@ -4,34 +4,41 @@ import cn.hutool.core.date.DatePattern;
 | 
				
			|||||||
import cn.hutool.core.date.DateTime;
 | 
					import cn.hutool.core.date.DateTime;
 | 
				
			||||||
import cn.hutool.core.date.DateUtil;
 | 
					import cn.hutool.core.date.DateUtil;
 | 
				
			||||||
import cn.hutool.core.text.CharSequenceUtil;
 | 
					import cn.hutool.core.text.CharSequenceUtil;
 | 
				
			||||||
 | 
					import cn.hutool.json.JSONUtil;
 | 
				
			||||||
import cn.lili.common.enums.PromotionTypeEnum;
 | 
					import cn.lili.common.enums.PromotionTypeEnum;
 | 
				
			||||||
import cn.lili.common.enums.ResultCode;
 | 
					import cn.lili.common.enums.ResultCode;
 | 
				
			||||||
import cn.lili.common.exception.ServiceException;
 | 
					import cn.lili.common.exception.ServiceException;
 | 
				
			||||||
 | 
					import cn.lili.common.properties.RocketmqCustomProperties;
 | 
				
			||||||
import cn.lili.modules.promotion.entity.dos.Seckill;
 | 
					import cn.lili.modules.promotion.entity.dos.Seckill;
 | 
				
			||||||
import cn.lili.modules.promotion.entity.dos.SeckillApply;
 | 
					import cn.lili.modules.promotion.entity.dos.SeckillApply;
 | 
				
			||||||
import cn.lili.modules.promotion.entity.enums.PromotionsApplyStatusEnum;
 | 
					import cn.lili.modules.promotion.entity.enums.PromotionsApplyStatusEnum;
 | 
				
			||||||
 | 
					import cn.lili.modules.promotion.entity.vos.SeckillSearchParams;
 | 
				
			||||||
import cn.lili.modules.promotion.entity.vos.SeckillVO;
 | 
					import cn.lili.modules.promotion.entity.vos.SeckillVO;
 | 
				
			||||||
import cn.lili.modules.promotion.mapper.SeckillMapper;
 | 
					import cn.lili.modules.promotion.mapper.SeckillMapper;
 | 
				
			||||||
import cn.lili.modules.promotion.service.SeckillApplyService;
 | 
					import cn.lili.modules.promotion.service.SeckillApplyService;
 | 
				
			||||||
import cn.lili.modules.promotion.service.SeckillService;
 | 
					import cn.lili.modules.promotion.service.SeckillService;
 | 
				
			||||||
import cn.lili.modules.promotion.tools.PromotionTools;
 | 
					import cn.lili.modules.promotion.tools.PromotionTools;
 | 
				
			||||||
import cn.lili.modules.search.service.EsGoodsIndexService;
 | 
					 | 
				
			||||||
import cn.lili.modules.system.entity.dos.Setting;
 | 
					import cn.lili.modules.system.entity.dos.Setting;
 | 
				
			||||||
import cn.lili.modules.system.entity.dto.SeckillSetting;
 | 
					import cn.lili.modules.system.entity.dto.SeckillSetting;
 | 
				
			||||||
import cn.lili.modules.system.entity.enums.SettingEnum;
 | 
					import cn.lili.modules.system.entity.enums.SettingEnum;
 | 
				
			||||||
import cn.lili.modules.system.service.SettingService;
 | 
					import cn.lili.modules.system.service.SettingService;
 | 
				
			||||||
 | 
					import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
 | 
				
			||||||
 | 
					import cn.lili.rocketmq.tags.GoodsTagsEnum;
 | 
				
			||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
					import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
				
			||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 | 
					import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 | 
				
			||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
					import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
				
			||||||
import com.google.gson.Gson;
 | 
					import com.google.gson.Gson;
 | 
				
			||||||
import lombok.extern.slf4j.Slf4j;
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
 | 
					import org.apache.rocketmq.spring.core.RocketMQTemplate;
 | 
				
			||||||
import org.springframework.beans.BeanUtils;
 | 
					import org.springframework.beans.BeanUtils;
 | 
				
			||||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
import org.springframework.stereotype.Service;
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
import org.springframework.transaction.annotation.Transactional;
 | 
					import org.springframework.transaction.annotation.Transactional;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Arrays;
 | 
					import java.util.Arrays;
 | 
				
			||||||
 | 
					import java.util.HashMap;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 秒杀活动业务层实现
 | 
					 * 秒杀活动业务层实现
 | 
				
			||||||
@ -44,11 +51,6 @@ import java.util.List;
 | 
				
			|||||||
@Slf4j
 | 
					@Slf4j
 | 
				
			||||||
public class SeckillServiceImpl extends AbstractPromotionsServiceImpl<SeckillMapper, Seckill> implements SeckillService {
 | 
					public class SeckillServiceImpl extends AbstractPromotionsServiceImpl<SeckillMapper, Seckill> implements SeckillService {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 商品索引
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private EsGoodsIndexService goodsIndexService;
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 设置
 | 
					     * 设置
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
@ -58,13 +60,27 @@ public class SeckillServiceImpl extends AbstractPromotionsServiceImpl<SeckillMap
 | 
				
			|||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
    private SeckillApplyService seckillApplyService;
 | 
					    private SeckillApplyService seckillApplyService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * rocketMq配置
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private RocketmqCustomProperties rocketmqCustomProperties;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * rocketMq
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private RocketMQTemplate rocketMQTemplate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public SeckillVO getSeckillDetail(String id) {
 | 
					    public SeckillVO getSeckillDetail(String id) {
 | 
				
			||||||
        Seckill seckill = this.checkSeckillExist(id);
 | 
					        Seckill seckill = this.checkSeckillExist(id);
 | 
				
			||||||
        SeckillVO seckillVO = new SeckillVO();
 | 
					        SeckillVO seckillVO = new SeckillVO();
 | 
				
			||||||
        BeanUtils.copyProperties(seckill, seckillVO);
 | 
					        BeanUtils.copyProperties(seckill, seckillVO);
 | 
				
			||||||
        seckillVO.setSeckillApplyList(this.seckillApplyService.list(new LambdaQueryWrapper<SeckillApply>().eq(SeckillApply::getSeckillId, id)));
 | 
					        SeckillSearchParams searchParams = new SeckillSearchParams();
 | 
				
			||||||
 | 
					        searchParams.setSeckillId(id);
 | 
				
			||||||
 | 
					        seckillVO.setSeckillApplyList(this.seckillApplyService.getSeckillApplyList(searchParams));
 | 
				
			||||||
        return seckillVO;
 | 
					        return seckillVO;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -76,7 +92,7 @@ public class SeckillServiceImpl extends AbstractPromotionsServiceImpl<SeckillMap
 | 
				
			|||||||
        for (Seckill seckill : seckillList) {
 | 
					        for (Seckill seckill : seckillList) {
 | 
				
			||||||
            seckill.setStartTime(null);
 | 
					            seckill.setStartTime(null);
 | 
				
			||||||
            seckill.setEndTime(null);
 | 
					            seckill.setEndTime(null);
 | 
				
			||||||
            this.goodsIndexService.updateEsGoodsIndexAllByList(seckill, PromotionTypeEnum.SECKILL.name() + "-" + seckill.getId());
 | 
					            this.updateEsGoodsIndex(seckill);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        this.remove(new QueryWrapper<>());
 | 
					        this.remove(new QueryWrapper<>());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -103,10 +119,12 @@ public class SeckillServiceImpl extends AbstractPromotionsServiceImpl<SeckillMap
 | 
				
			|||||||
    public void updateSeckillGoodsNum(String seckillId) {
 | 
					    public void updateSeckillGoodsNum(String seckillId) {
 | 
				
			||||||
        Seckill seckill = this.getById(seckillId);
 | 
					        Seckill seckill = this.getById(seckillId);
 | 
				
			||||||
        if (seckill != null) {
 | 
					        if (seckill != null) {
 | 
				
			||||||
 | 
					            SeckillSearchParams searchParams = new SeckillSearchParams();
 | 
				
			||||||
 | 
					            searchParams.setSeckillId(seckillId);
 | 
				
			||||||
            LambdaUpdateWrapper<Seckill> updateWrapper = new LambdaUpdateWrapper<>();
 | 
					            LambdaUpdateWrapper<Seckill> updateWrapper = new LambdaUpdateWrapper<>();
 | 
				
			||||||
            updateWrapper.eq(Seckill::getId, seckillId);
 | 
					            updateWrapper.eq(Seckill::getId, seckillId);
 | 
				
			||||||
            updateWrapper.set(Seckill::getGoodsNum,
 | 
					            updateWrapper.set(Seckill::getGoodsNum,
 | 
				
			||||||
                    this.seckillApplyService.count(new LambdaQueryWrapper<SeckillApply>().eq(SeckillApply::getSeckillId, seckillId)));
 | 
					                    this.seckillApplyService.getSeckillApplyCount(searchParams));
 | 
				
			||||||
            this.update(updateWrapper);
 | 
					            this.update(updateWrapper);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -126,7 +144,17 @@ public class SeckillServiceImpl extends AbstractPromotionsServiceImpl<SeckillMap
 | 
				
			|||||||
                    this.setSeckillApplyTime(seckill, seckillApply);
 | 
					                    this.setSeckillApplyTime(seckill, seckillApply);
 | 
				
			||||||
                    log.info("更新限时抢购商品状态:{}", seckill);
 | 
					                    log.info("更新限时抢购商品状态:{}", seckill);
 | 
				
			||||||
                    String promotionKey = PromotionTypeEnum.SECKILL.name() + "-" + seckillApply.getTimeLine();
 | 
					                    String promotionKey = PromotionTypeEnum.SECKILL.name() + "-" + seckillApply.getTimeLine();
 | 
				
			||||||
                    this.goodsIndexService.updateEsGoodsIndexPromotions(seckillApply.getSkuId(), seckill, promotionKey, seckillApply.getPrice());
 | 
					                    Map<String, Object> map = new HashMap<>();
 | 
				
			||||||
 | 
					                    // es促销key
 | 
				
			||||||
 | 
					                    map.put("esPromotionKey", promotionKey);
 | 
				
			||||||
 | 
					                    // 促销类型全路径名
 | 
				
			||||||
 | 
					                    map.put("promotionsType", Seckill.class.getName());
 | 
				
			||||||
 | 
					                    // 促销实体
 | 
				
			||||||
 | 
					                    map.put("promotions", seckill);
 | 
				
			||||||
 | 
					                    //更新商品促销消息
 | 
				
			||||||
 | 
					                    String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX_PROMOTIONS.name();
 | 
				
			||||||
 | 
					                    //发送mq消息
 | 
				
			||||||
 | 
					                    rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(map), RocketmqSendCallbackBuilder.commonCallback());
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -16,8 +16,8 @@ public class EsIndexUtil {
 | 
				
			|||||||
    private static final String IGNORE_FIELD = "serialVersionUID,promotionMap,id,goodsId";
 | 
					    private static final String IGNORE_FIELD = "serialVersionUID,promotionMap,id,goodsId";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static Map<String, Object> getUpdateIndexFieldsMap(EsGoodsIndex queryGoodsIndex, EsGoodsIndex updateGoodsIndex) {
 | 
					    public static Map<String, Object> getUpdateIndexFieldsMap(EsGoodsIndex queryGoodsIndex, EsGoodsIndex updateGoodsIndex) {
 | 
				
			||||||
        Map<Object, Object> queryFieldsMap = new HashMap<>();
 | 
					        Map<String, Object> queryFieldsMap = new HashMap<>();
 | 
				
			||||||
        Map<Object, Object> updateFieldsMap = new HashMap<>();
 | 
					        Map<String, Object> updateFieldsMap = new HashMap<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (Map.Entry<String, Field> entry : ReflectUtil.getFieldMap(EsGoodsIndex.class).entrySet()) {
 | 
					        for (Map.Entry<String, Field> entry : ReflectUtil.getFieldMap(EsGoodsIndex.class).entrySet()) {
 | 
				
			||||||
            Object queryFieldValue = ReflectUtil.getFieldValue(queryGoodsIndex, entry.getValue());
 | 
					            Object queryFieldValue = ReflectUtil.getFieldValue(queryGoodsIndex, entry.getValue());
 | 
				
			||||||
@ -33,7 +33,7 @@ public class EsIndexUtil {
 | 
				
			|||||||
        return getUpdateIndexFieldsMap(queryFieldsMap, updateFieldsMap);
 | 
					        return getUpdateIndexFieldsMap(queryFieldsMap, updateFieldsMap);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static Map<String, Object> getUpdateIndexFieldsMap(Map<Object, Object> queryFieldsMap, Map<Object, Object> updateFieldsMap) {
 | 
					    public static Map<String, Object> getUpdateIndexFieldsMap(Map<String, Object> queryFieldsMap, Map<String, Object> updateFieldsMap) {
 | 
				
			||||||
        Map<String, Object> updateIndexMap = new HashMap<>();
 | 
					        Map<String, Object> updateIndexMap = new HashMap<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        updateIndexMap.put("queryFields", queryFieldsMap);
 | 
					        updateIndexMap.put("queryFields", queryFieldsMap);
 | 
				
			||||||
 | 
				
			|||||||
@ -32,10 +32,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			|||||||
import org.springframework.stereotype.Service;
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
import org.springframework.transaction.annotation.Transactional;
 | 
					import org.springframework.transaction.annotation.Transactional;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.*;
 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
import java.util.Objects;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 店铺详细业务层实现
 | 
					 * 店铺详细业务层实现
 | 
				
			||||||
@ -103,8 +100,8 @@ public class StoreDetailServiceImpl extends ServiceImpl<StoreDetailMapper, Store
 | 
				
			|||||||
        goodsService.updateStoreDetail(store);
 | 
					        goodsService.updateStoreDetail(store);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Map<String, Object> updateIndexFieldsMap = EsIndexUtil.getUpdateIndexFieldsMap(
 | 
					        Map<String, Object> updateIndexFieldsMap = EsIndexUtil.getUpdateIndexFieldsMap(
 | 
				
			||||||
                MapUtil.builder().put("storeId", store.getId()).build(),
 | 
					                MapUtil.builder(new HashMap<String, Object>()).put("storeId", store.getId()).build(),
 | 
				
			||||||
                MapUtil.builder().put("storeName", store.getStoreName()).put("selfOperated", store.getSelfOperated()).build());
 | 
					                MapUtil.builder(new HashMap<String, Object>()).put("storeName", store.getStoreName()).put("selfOperated", store.getSelfOperated()).build());
 | 
				
			||||||
        String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX_FIELD.name();
 | 
					        String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX_FIELD.name();
 | 
				
			||||||
        //发送mq消息
 | 
					        //发送mq消息
 | 
				
			||||||
        rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(updateIndexFieldsMap), RocketmqSendCallbackBuilder.commonCallback());
 | 
					        rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(updateIndexFieldsMap), RocketmqSendCallbackBuilder.commonCallback());
 | 
				
			||||||
 | 
				
			|||||||
@ -81,7 +81,7 @@ public class SeckillManagerController {
 | 
				
			|||||||
    @ApiOperation(value = "获取秒杀活动申请列表")
 | 
					    @ApiOperation(value = "获取秒杀活动申请列表")
 | 
				
			||||||
    @GetMapping("/apply")
 | 
					    @GetMapping("/apply")
 | 
				
			||||||
    public ResultMessage<IPage<SeckillApply>> getSeckillApply(SeckillSearchParams param, PageVO pageVo) {
 | 
					    public ResultMessage<IPage<SeckillApply>> getSeckillApply(SeckillSearchParams param, PageVO pageVo) {
 | 
				
			||||||
        IPage<SeckillApply> seckillApply = seckillApplyService.getSeckillApply(param, pageVo);
 | 
					        IPage<SeckillApply> seckillApply = seckillApplyService.getSeckillApplyPage(param, pageVo);
 | 
				
			||||||
        return ResultUtil.data(seckillApply);
 | 
					        return ResultUtil.data(seckillApply);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -47,7 +47,7 @@ public class SeckillStoreController {
 | 
				
			|||||||
    public ResultMessage<IPage<SeckillApply>> getSeckillApplyPage(SeckillSearchParams queryParam, PageVO pageVo) {
 | 
					    public ResultMessage<IPage<SeckillApply>> getSeckillApplyPage(SeckillSearchParams queryParam, PageVO pageVo) {
 | 
				
			||||||
        String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId();
 | 
					        String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId();
 | 
				
			||||||
        queryParam.setStoreId(storeId);
 | 
					        queryParam.setStoreId(storeId);
 | 
				
			||||||
        IPage<SeckillApply> seckillPage = seckillApplyService.getSeckillApply(queryParam, pageVo);
 | 
					        IPage<SeckillApply> seckillPage = seckillApplyService.getSeckillApplyPage(queryParam, pageVo);
 | 
				
			||||||
        return ResultUtil.data(seckillPage);
 | 
					        return ResultUtil.data(seckillPage);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user