Merge branch 'master' into Bulbasaur

# Conflicts:
#	consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java
#	consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java
#	framework/src/main/java/cn/lili/common/trigger/delay/AbstractDelayQueueMachineFactory.java
#	framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
#	framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java
This commit is contained in:
Chopper 2021-06-15 15:50:54 +08:00
commit a97b698d8e
32 changed files with 516 additions and 413 deletions

View File

@ -21,6 +21,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
@ -62,8 +63,8 @@ public class ConnectBuyerWebController {
@ApiOperation(value = "信任登录统一回调地址", hidden = true) @ApiOperation(value = "信任登录统一回调地址", hidden = true)
@GetMapping("/callback/{type}") @GetMapping("/callback/{type}")
public void callBack(@PathVariable String type, AuthCallback callback, HttpServletResponse httpServletResponse) throws IOException { public void callBack(@PathVariable String type, AuthCallback callback, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {
connectUtil.callback(type, callback, httpServletResponse); connectUtil.callback(type, callback,httpServletRequest, httpServletResponse);
} }
@ApiOperation(value = "信任登录响应结果获取") @ApiOperation(value = "信任登录响应结果获取")

View File

@ -1,12 +1,12 @@
package cn.lili.timetask.handler.impl.promotion; package cn.lili.timetask.handler.impl.promotion;
import cn.hutool.core.date.DateTime;
import cn.lili.modules.order.cart.entity.vo.FullDiscountVO; import cn.lili.modules.order.cart.entity.vo.FullDiscountVO;
import cn.lili.modules.promotion.entity.dos.MemberCoupon; import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import cn.lili.modules.promotion.entity.dos.PromotionGoods; import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.dos.Seckill; import cn.lili.modules.promotion.entity.dos.Seckill;
import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum; import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.entity.vos.CouponVO;
import cn.lili.modules.promotion.entity.vos.PintuanVO; import cn.lili.modules.promotion.entity.vos.PintuanVO;
import cn.lili.modules.promotion.service.*; import cn.lili.modules.promotion.service.*;
import cn.lili.modules.search.service.EsGoodsIndexService; import cn.lili.modules.search.service.EsGoodsIndexService;
@ -18,6 +18,7 @@ import cn.lili.timetask.handler.EveryDayExecute;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.google.gson.Gson; import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Criteria;
@ -34,8 +35,8 @@ import java.util.List;
* @author Chopper * @author Chopper
* @date 2021/3/18 3:23 下午 * @date 2021/3/18 3:23 下午
*/ */
@Slf4j
@Component @Component
public class PromotionEverydayExecute implements EveryDayExecute { public class PromotionEverydayExecute implements EveryDayExecute {
//Mongo //Mongo
@ -59,35 +60,137 @@ public class PromotionEverydayExecute implements EveryDayExecute {
//促销商品 //促销商品
@Autowired @Autowired
private PromotionGoodsService promotionGoodsService; private PromotionGoodsService promotionGoodsService;
//设置
// 系统设置
@Autowired @Autowired
private SettingService settingService; private SettingService settingService;
//秒杀活动
@Autowired @Autowired
private SeckillService seckillService; private SeckillService seckillService;
/** /**
* 将已过期的促销活动置为结束 * 将已过期的促销活动置为结束
*/ */
@Override @Override
public void execute() { public void execute() {
//mongo查询条件
Query query = new Query(); Query query = new Query();
// 结束条件 活动关闭/活动结束 //结束条件 活动关闭/活动结束
query.addCriteria(Criteria.where("promotionStatus").ne(PromotionStatusEnum.END.name()) query.addCriteria(Criteria.where("promotionStatus").ne(PromotionStatusEnum.END.name())
.orOperator(Criteria.where("promotionStatus").ne(PromotionStatusEnum.CLOSE.name()))); .orOperator(Criteria.where("promotionStatus").ne(PromotionStatusEnum.CLOSE.name())));
//结束条件 活动结束时间大于当前时间
query.addCriteria(Criteria.where("endTime").lt(new Date())); query.addCriteria(Criteria.where("endTime").lt(new Date()));
List<String> promotionIds = new ArrayList<>(); //结束满减活动
//关闭满减活动 endFullDiscount(query);
endFullDiscount(promotionIds, query);
//关闭拼团活动 //关闭拼团活动
endPintuan(promotionIds, query); endPintuan(query);
//关闭优惠券
endCoupon(); //结束优惠券
//每日新增秒杀活动 endCoupon(query);
//定时创建活动
addSeckill(); addSeckill();
promotionGoodsService.update(this.getUpdatePromotionGoodsWrapper(promotionIds));
}
/**
* 结束优惠券活动
*
* @param query
*/
private void endCoupon(Query query) {
try {
//关闭优惠券活动
List<CouponVO> couponVOS = mongoTemplate.find(query, CouponVO.class);
if (!couponVOS.isEmpty()) {
List<String> ids = new ArrayList<>();
// // 关闭的优惠券活动
for (CouponVO vo : couponVOS) {
vo.setPromotionStatus(PromotionStatusEnum.END.name());
if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) {
for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) {
promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name());
esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId());
}
}
mongoTemplate.save(vo);
ids.add(vo.getId());
}
couponService.update(this.getUpdatePromotionWrapper(ids));
LambdaUpdateWrapper<MemberCoupon> memberCouponLambdaUpdateWrapper = new LambdaUpdateWrapper<MemberCoupon>().in(MemberCoupon::getCouponId, ids).set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name());
memberCouponService.update(memberCouponLambdaUpdateWrapper);
//将活动商品对照表进行结束处理
promotionGoodsService.update(this.getUpdatePromotionGoodsWrapper(ids));
}
} catch (Exception e) {
log.error("优惠券活动关闭错误", e);
}
}
/**
* 结束拼团活动
*
* @param query
*/
private void endPintuan(Query query) {
try {
//关闭拼团活动
List<PintuanVO> pintuanVOS = mongoTemplate.find(query, PintuanVO.class);
if (!pintuanVOS.isEmpty()) {
//准备修改活动的id
List<String> ids = new ArrayList<>();
for (PintuanVO vo : pintuanVOS) {
vo.setPromotionStatus(PromotionStatusEnum.END.name());
if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) {
for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) {
promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name());
esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId());
}
}
mongoTemplate.save(vo);
ids.add(vo.getId());
}
pintuanService.update(this.getUpdatePromotionWrapper(ids));
//将活动商品对照表进行结束处理
promotionGoodsService.update(this.getUpdatePromotionGoodsWrapper(ids));
}
} catch (Exception e) {
log.error("拼团活动关闭错误", e);
}
}
/**
* 结束满减活动
*
* @param query
*/
private void endFullDiscount(Query query) {
try {
//关闭满减活动
List<FullDiscountVO> fullDiscountVOS = mongoTemplate.find(query, FullDiscountVO.class);
if (!fullDiscountVOS.isEmpty()) {
List<String> ids = new ArrayList<>();
//循环活动 关闭活动
for (FullDiscountVO vo : fullDiscountVOS) {
vo.setPromotionStatus(PromotionStatusEnum.END.name());
if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) {
for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) {
promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name());
esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId());
}
}
mongoTemplate.save(vo);
ids.add(vo.getId());
}
fullDiscountService.update(this.getUpdatePromotionWrapper(ids));
}
} catch (Exception e) {
log.error("满减活动关闭错误", e);
}
} }
/** /**
@ -98,76 +201,10 @@ public class PromotionEverydayExecute implements EveryDayExecute {
private void addSeckill() { private void addSeckill() {
Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name()); Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name());
SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class); SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class);
Seckill seckill = new Seckill(30,seckillSetting.getHours(), seckillSetting.getSeckillRule()); Seckill seckill = new Seckill(30, seckillSetting.getHours(), seckillSetting.getSeckillRule());
seckillService.saveSeckill(seckill); seckillService.saveSeckill(seckill);
} }
/**
* 修改满额活动下的商品
*
* @param promotionIds 促销活动ID
* @param query 查询Wrapper
*/
private void endFullDiscount(List<String> promotionIds, Query query) {
//关闭满减活动
List<FullDiscountVO> fullDiscountVOS = mongoTemplate.find(query, FullDiscountVO.class);
if (!fullDiscountVOS.isEmpty()) {
List<String> ids = new ArrayList<>();
for (FullDiscountVO vo : fullDiscountVOS) {
vo.setPromotionStatus(PromotionStatusEnum.END.name());
if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) {
for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) {
promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name());
esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId());
}
}
mongoTemplate.save(vo);
ids.add(vo.getId());
}
fullDiscountService.update(this.getUpdatePromotionWrapper(ids));
promotionIds.addAll(ids);
}
}
/**
* 修改拼团活动下的商品
*
* @param promotionIds 促销活动ID
* @param query 查询Wrapper
*/
private void endPintuan(List<String> promotionIds, Query query) {
List<PintuanVO> pintuanVOS = mongoTemplate.find(query, PintuanVO.class);
if (!pintuanVOS.isEmpty()) {
//准备修改活动的id
List<String> ids = new ArrayList<>();
for (PintuanVO vo : pintuanVOS) {
vo.setPromotionStatus(PromotionStatusEnum.END.name());
if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) {
for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) {
promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name());
esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId());
}
}
mongoTemplate.save(vo);
ids.add(vo.getId());
}
pintuanService.update(this.getUpdatePromotionWrapper(ids));
promotionIds.addAll(ids);
}
}
/**
* 修改优惠券下的商品
*/
private void endCoupon() {
//修改超时的动态时间优惠券的状态
LambdaUpdateWrapper<MemberCoupon> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name())
.le(MemberCoupon::getEndTime, new DateTime())
.set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name());
memberCouponService.update(lambdaUpdateWrapper);
}
/** /**
* 获取促销修改查询条件 修改活动状态 * 获取促销修改查询条件 修改活动状态
* *

View File

@ -0,0 +1,94 @@
package cn.lili.trigger;
import cn.hutool.json.JSONUtil;
import cn.lili.common.cache.Cache;
import cn.lili.common.utils.ThreadPoolUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.DefaultTypedTuple;
import org.springframework.util.CollectionUtils;
import javax.annotation.PostConstruct;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* 延时队列工厂
*
* @author paulG
* @since 2020/11/7
**/
@Slf4j
public abstract class AbstractDelayQueueListen {
@Autowired
private Cache cache;
/**
* 延时队列机器开始运作
*/
private void startDelayQueueMachine() {
log.info("延时队列机器{}开始运作", setDelayQueueName());
// 监听redis队列
while (true) {
try {
// 获取当前时间的时间戳
long now = System.currentTimeMillis() / 1000;
// 获取当前时间前需要执行的任务列表
Set<DefaultTypedTuple> tuples = cache.zRangeByScore(setDelayQueueName(), 0, now);
// 如果任务不为空
if (!CollectionUtils.isEmpty(tuples)) {
log.info("执行任务:{}", JSONUtil.toJsonStr(tuples));
for (DefaultTypedTuple tuple : tuples) {
String jobId = (String) tuple.getValue();
// 移除缓存如果移除成功则表示当前线程处理了延时任务则执行延时任务
Long num = cache.zRemove(setDelayQueueName(), jobId);
// 如果移除成功, 则执行
if (num > 0) {
ThreadPoolUtil.execute(() -> invoke(jobId));
}
}
}
} catch (Exception e) {
log.error("处理延时任务发生异常,异常原因为{}", e.getMessage(), e);
} finally {
// 间隔一秒钟搞一次
try {
TimeUnit.SECONDS.sleep(5L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 最终执行的任务方法
*
* @param jobId 任务id
*/
public abstract void invoke(String jobId);
/**
* 要实现延时队列的名字
*/
public abstract String setDelayQueueName();
/**
* 监听队列
*/
@PostConstruct
public void init() {
new Thread(this::startDelayQueueMachine).start();
}
}

View File

@ -2,9 +2,8 @@ package cn.lili.trigger;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.common.cache.Cache; import cn.lili.common.cache.Cache;
import cn.lili.common.trigger.interfaces.TimeTriggerExecutor;
import cn.lili.common.trigger.model.TimeTriggerMsg; import cn.lili.common.trigger.model.TimeTriggerMsg;
import cn.lili.common.trigger.util.TimeTriggerUtil; import cn.lili.common.trigger.util.DelayQueueTools;
import cn.lili.common.utils.SpringContextUtil; import cn.lili.common.utils.SpringContextUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
@ -28,7 +27,7 @@ public class TimeTriggerConsumer implements RocketMQListener<TimeTriggerMsg> {
@Override @Override
public void onMessage(TimeTriggerMsg timeTriggerMsg) { public void onMessage(TimeTriggerMsg timeTriggerMsg) {
try { try {
String key = TimeTriggerUtil.generateKey(timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getTriggerTime(), timeTriggerMsg.getUniqueKey()); String key = DelayQueueTools.generateKey(timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getTriggerTime(), timeTriggerMsg.getUniqueKey());
if (cache.get(key) == null) { if (cache.get(key) == null) {
log.info("执行器执行被取消:{} | 任务标识:{}", timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getUniqueKey()); log.info("执行器执行被取消:{} | 任务标识:{}", timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getUniqueKey());

View File

@ -1,4 +1,4 @@
package cn.lili.common.trigger.interfaces; package cn.lili.trigger;
/** /**
* 延时任务执行器接口 * 延时任务执行器接口

View File

@ -1,13 +1,12 @@
package cn.lili.trigger.executor; package cn.lili.trigger.executor;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.common.trigger.interfaces.TimeTrigger;
import cn.lili.trigger.TimeTriggerExecutor;
import cn.lili.common.trigger.message.PintuanOrderMessage; import cn.lili.common.trigger.message.PintuanOrderMessage;
import cn.lili.common.trigger.message.PromotionMessage; import cn.lili.common.trigger.message.PromotionMessage;
import cn.lili.common.trigger.interfaces.TimeTrigger;
import cn.lili.common.trigger.interfaces.TimeTriggerExecutor;
import cn.lili.common.trigger.model.TimeExecuteConstant; import cn.lili.common.trigger.model.TimeExecuteConstant;
import cn.lili.common.trigger.model.TimeTriggerMsg; import cn.lili.common.trigger.model.TimeTriggerMsg;
import cn.lili.common.utils.DateUtil;
import cn.lili.config.rocketmq.RocketmqCustomProperties; import cn.lili.config.rocketmq.RocketmqCustomProperties;
import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
@ -48,13 +47,21 @@ public class PromotionTimeTriggerExecutor implements TimeTriggerExecutor {
log.info("促销活动信息消费:{}", promotionMessage); log.info("促销活动信息消费:{}", promotionMessage);
// 如果为促销活动开始则需要发布促销活动结束的定时任务 // 如果为促销活动开始则需要发布促销活动结束的定时任务
if (PromotionStatusEnum.START.name().equals(promotionMessage.getPromotionStatus())) { if (PromotionStatusEnum.START.name().equals(promotionMessage.getPromotionStatus())) {
//设置活动关闭时间 if (!promotionService.updatePromotionStatus(promotionMessage)) {
setCloseTime(promotionMessage); log.error("开始促销活动失败: {}", promotionMessage);
} return;
//更新促销活动状态 }
if (!promotionService.updatePromotionStatus(promotionMessage)) { // 促销活动开始后设置促销活动结束的定时任务
log.error("开始促销活动失败: {}", promotionMessage); promotionMessage.setPromotionStatus(PromotionStatusEnum.END.name());
return; String uniqueKey = "{TIME_TRIGGER_" + promotionMessage.getPromotionType() + "}_" + promotionMessage.getPromotionId();
// 结束时间延时一分钟
long closeTime = promotionMessage.getEndTime().getTime() + 60000;
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, closeTime, promotionMessage, uniqueKey, rocketmqCustomProperties.getPromotionTopic());
//添加延时任务
timeTrigger.addDelay(timeTriggerMsg);
} else {
//不是开始则修改活动状态
promotionService.updatePromotionStatus(promotionMessage);
} }
return; return;
} }
@ -67,22 +74,5 @@ public class PromotionTimeTriggerExecutor implements TimeTriggerExecutor {
} }
} }
/**
* 设置促销活动结束时间
*
* @param promotionMessage 信息队列传输促销信息实体
*/
private void setCloseTime(PromotionMessage promotionMessage) {
//如果设置了活动结束时间则创建促销结束延时任务
if(promotionMessage.getEndTime()!=null){
// 促销活动开始后设置促销活动结束的定时任务
promotionMessage.setPromotionStatus(PromotionStatusEnum.END.name());
String uniqueKey = "{TIME_TRIGGER_" + promotionMessage.getPromotionType() + "}_" + promotionMessage.getPromotionId();
// 结束时间延时一分钟
long closeTime = promotionMessage.getEndTime().getTime() + 60000;
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, closeTime, promotionMessage, uniqueKey, rocketmqCustomProperties.getPromotionTopic());
timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(promotionMessage.getEndTime().getTime()));
}
}
} }

View File

@ -0,0 +1,34 @@
package cn.lili.trigger.listen;
import cn.hutool.json.JSONUtil;
import cn.lili.common.trigger.enums.DelayQueueEnums;
import cn.lili.common.trigger.interfaces.TimeTrigger;
import cn.lili.common.trigger.model.TimeTriggerMsg;
import cn.lili.trigger.AbstractDelayQueueListen;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* PromotionTimeTriggerListen
*
* @author Chopper
* @version v1.0
* 2021-06-11 10:47
*/
@Component
public class PromotionDelayQueueListen extends AbstractDelayQueueListen {
@Autowired
private TimeTrigger timeTrigger;
@Override
public void invoke(String jobId) {
timeTrigger.execute(JSONUtil.toBean(jobId, TimeTriggerMsg.class));
}
@Override
public String setDelayQueueName() {
return DelayQueueEnums.PROMOTION_QUEUE.name();
}
}

View File

@ -1,17 +1,9 @@
package cn.lili.common.trigger.delay; package cn.lili.common.trigger.delay;
import cn.hutool.json.JSONUtil;
import cn.lili.common.cache.Cache; import cn.lili.common.cache.Cache;
import cn.lili.common.utils.ThreadPoolUtil; import cn.lili.common.utils.DateUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.DefaultTypedTuple;
import org.springframework.util.CollectionUtils;
import javax.annotation.PostConstruct;
import java.util.Calendar;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/** /**
* 延时队列工厂 * 延时队列工厂
@ -28,83 +20,25 @@ public abstract class AbstractDelayQueueMachineFactory {
/** /**
* 插入任务id * 插入任务id
* *
* @param jobId 任务id(队列内唯一) * @param jobId 任务id(队列内唯一)
* @param time 延时时间(单位 :) * @param triggerTime 执行时间 时间戳毫秒
* @return 是否插入成功 * @return 是否插入成功
*/ */
public boolean addJob(String jobId, Integer time) { public boolean addJob(String jobId, Long triggerTime) {
//获取时间
Calendar instance = Calendar.getInstance(); //redis 中排序时间
instance.add(Calendar.SECOND, time); long delaySeconds = triggerTime / 1000;
long delaySeconds = instance.getTimeInMillis() / 1000;
//增加延时任务 参数依次为队列名称执行时间任务id //增加延时任务 参数依次为队列名称执行时间任务id
boolean result = cache.zAdd(setDelayQueueName(), delaySeconds, jobId); boolean result = cache.zAdd(setDelayQueueName(), delaySeconds, jobId);
log.info("增加延时任务, 缓存key {}, 等待时间 {}", setDelayQueueName(), time); log.info("增加延时任务, 缓存key {}, 执行时间 {},任务id {}", setDelayQueueName(), DateUtil.toString(triggerTime), jobId);
return result; return result;
} }
/**
* 延时队列机器开始运作
*/
private void startDelayQueueMachine() {
log.info("延时队列机器{}开始运作", setDelayQueueName());
// 监听redis队列
while (true) {
try {
// 获取当前时间的时间戳
long now = System.currentTimeMillis() / 1000;
// 获取当前时间前的任务列表
Set<DefaultTypedTuple> tuples = cache.zRangeByScore(setDelayQueueName(), 0, now);
// 如果任务不为空
if (!CollectionUtils.isEmpty(tuples)) {
log.info("执行任务:{}", JSONUtil.toJsonStr(tuples));
for (DefaultTypedTuple tuple : tuples) {
String jobId = (String) tuple.getValue();
// 移除缓存如果移除成功则表示当前线程处理了延时任务则执行延时任务
Long num = cache.zRemove(setDelayQueueName(), jobId);
// 如果移除成功, 则执行
if (num > 0) {
ThreadPoolUtil.execute(() -> invoke(jobId));
}
}
}
} catch (Exception e) {
log.error("处理延时任务发生异常,异常原因为{}", e.getMessage(), e);
} finally {
// 间隔一秒钟搞一次
try {
TimeUnit.SECONDS.sleep(5L);
} catch (InterruptedException e) {
log.error("延时队列机器开始运作错误",e);
}
}
}
}
/**
* 最终执行的任务方法
*
* @param jobId 任务id
*/
public abstract void invoke(String jobId);
/** /**
* 要实现延时队列的名字 * 要实现延时队列的名字
*/ */
public abstract String setDelayQueueName(); public abstract String setDelayQueueName();
@PostConstruct
public void init() {
new Thread(this::startDelayQueueMachine).start();
}
} }

View File

@ -1,8 +1,8 @@
package cn.lili.common.trigger.delay; package cn.lili.common.trigger.delay.queue;
import cn.hutool.json.JSONUtil; import cn.lili.common.trigger.delay.AbstractDelayQueueMachineFactory;
import cn.lili.common.trigger.enums.DelayQueueEnums;
import cn.lili.common.trigger.interfaces.TimeTrigger; import cn.lili.common.trigger.interfaces.TimeTrigger;
import cn.lili.common.trigger.model.TimeTriggerMsg;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -21,13 +21,8 @@ public class PromotionDelayQueue extends AbstractDelayQueueMachineFactory {
@Autowired @Autowired
private TimeTrigger timeTrigger; private TimeTrigger timeTrigger;
@Override
public void invoke(String jobId) {
timeTrigger.add(JSONUtil.toBean(jobId, TimeTriggerMsg.class));
}
@Override @Override
public String setDelayQueueName() { public String setDelayQueueName() {
return "promotion_delay"; return DelayQueueEnums.PROMOTION_QUEUE.name();
} }
} }

View File

@ -0,0 +1,19 @@
package cn.lili.common.trigger.enums;
/**
* 队列枚举
*/
public enum DelayQueueEnums {
/**
* 促销任务队列
*/
PROMOTION_QUEUE("促销任务队列");
private String description;
DelayQueueEnums(String description) {
this.description = description;
}
}

View File

@ -5,8 +5,8 @@ package cn.lili.common.trigger.enums;
* *
* @author paulG * @author paulG
* @since 2021/5/7 * @since 2021/5/7
**/ */
public enum DelayQueueType { public enum PromotionDelayTypeEnums {
/** /**
* 促销活动 * 促销活动
@ -22,14 +22,10 @@ public enum DelayQueueType {
*/ */
BROADCAST("直播"); BROADCAST("直播");
private final String description; private String description;
DelayQueueType(String des) { PromotionDelayTypeEnums(String description) {
this.description = des; this.description = description;
}
public String description() {
return this.description;
} }
} }

View File

@ -9,22 +9,20 @@ import cn.lili.common.trigger.model.TimeTriggerMsg;
*/ */
public interface TimeTrigger { public interface TimeTrigger {
/** /**
* 添加延时任务 * 添加延时任务
* *
* @param timeTriggerMsg 延时任务信息 * @param timeTriggerMsg 延时任务信息
*/ */
void add(TimeTriggerMsg timeTriggerMsg); void addDelay(TimeTriggerMsg timeTriggerMsg);
/** /**
* 添加延时任务 * 执行延时任务
* *
* @param timeTriggerMsg 延时任务信息 * @param timeTriggerMsg 延时任务信息
* @param delayTime 延时时间
*/ */
void addDelay(TimeTriggerMsg timeTriggerMsg, int delayTime); void execute(TimeTriggerMsg timeTriggerMsg);
/** /**
* 修改延时任务 * 修改延时任务

View File

@ -1,12 +1,12 @@
package cn.lili.common.trigger; package cn.lili.common.trigger.interfaces.impl;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.common.cache.Cache; import cn.lili.common.cache.Cache;
import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder; import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.common.trigger.delay.PromotionDelayQueue; import cn.lili.common.trigger.delay.queue.PromotionDelayQueue;
import cn.lili.common.trigger.interfaces.TimeTrigger; import cn.lili.common.trigger.interfaces.TimeTrigger;
import cn.lili.common.trigger.model.TimeTriggerMsg; import cn.lili.common.trigger.model.TimeTriggerMsg;
import cn.lili.common.trigger.util.TimeTriggerUtil; import cn.lili.common.trigger.util.DelayQueueTools;
import cn.lili.common.utils.DateUtil; import cn.lili.common.utils.DateUtil;
import cn.lili.common.utils.StringUtils; import cn.lili.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -34,12 +34,38 @@ public class RocketmqTimerTrigger implements TimeTrigger {
@Override @Override
public void add(TimeTriggerMsg timeTriggerMsg) { public void addDelay(TimeTriggerMsg timeTriggerMsg) {
this.addExecute(timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getParam(), timeTriggerMsg.getTriggerTime(), timeTriggerMsg.getUniqueKey(), timeTriggerMsg.getTopic()); //执行器唯一key
String uniqueKey = timeTriggerMsg.getUniqueKey();
if (StringUtils.isEmpty(uniqueKey)) {
uniqueKey = StringUtils.getRandStr(10);
}
//执行任务key
String generateKey = DelayQueueTools.generateKey(timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getTriggerTime(), uniqueKey);
this.cache.put(generateKey, 1);
//设置延时任务
if (Boolean.TRUE.equals(promotionDelayQueue.addJob(JSONUtil.toJsonStr(timeTriggerMsg), timeTriggerMsg.getTriggerTime()))) {
log.info("延时任务标识: {}", generateKey);
log.info("定时执行在【" + DateUtil.toString(timeTriggerMsg.getTriggerTime(), "yyyy-MM-dd HH:mm:ss") + "】,消费【" + timeTriggerMsg.getParam().toString() + "");
} else {
log.error("延时任务添加失败:{}", timeTriggerMsg);
}
}
@Override
public void execute(TimeTriggerMsg timeTriggerMsg) {
this.addExecute(timeTriggerMsg.getTriggerExecutor(),
timeTriggerMsg.getParam(),
timeTriggerMsg.getTriggerTime(),
timeTriggerMsg.getUniqueKey(),
timeTriggerMsg.getTopic()
);
} }
/** /**
* 添加延时任务 * 将任务添加到mqmq异步队列执行
* <p>
* 本系统中redis相当于延时任务吊起机制而mq才是实际的业务消费执行任务的存在
* *
* @param executorName 执行器beanId * @param executorName 执行器beanId
* @param param 执行参数 * @param param 执行参数
@ -50,7 +76,7 @@ public class RocketmqTimerTrigger implements TimeTrigger {
* 业务内全局唯一 * 业务内全局唯一
* @param topic rocketmq topic * @param topic rocketmq topic
*/ */
public void addExecute(String executorName, Object param, Long triggerTime, String uniqueKey, String topic) { private void addExecute(String executorName, Object param, Long triggerTime, String uniqueKey, String topic) {
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(executorName, triggerTime, param, uniqueKey, topic); TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(executorName, triggerTime, param, uniqueKey, topic);
Message<TimeTriggerMsg> message = MessageBuilder.withPayload(timeTriggerMsg).build(); Message<TimeTriggerMsg> message = MessageBuilder.withPayload(timeTriggerMsg).build();
@ -58,34 +84,15 @@ public class RocketmqTimerTrigger implements TimeTrigger {
this.rocketMQTemplate.asyncSend(topic, message, RocketmqSendCallbackBuilder.commonCallback()); this.rocketMQTemplate.asyncSend(topic, message, RocketmqSendCallbackBuilder.commonCallback());
} }
@Override
public void addDelay(TimeTriggerMsg timeTriggerMsg, int delayTime) {
//执行器唯一key
String uniqueKey = timeTriggerMsg.getUniqueKey();
if (StringUtils.isEmpty(uniqueKey)) {
uniqueKey = StringUtils.getRandStr(10);
}
//执行任务key
String generateKey = TimeTriggerUtil.generateKey(timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getTriggerTime(), uniqueKey);
this.cache.put(generateKey, 1);
//设置延时任务
if (Boolean.TRUE.equals(promotionDelayQueue.addJob(JSONUtil.toJsonStr(timeTriggerMsg), delayTime))) {
log.info("add Redis key {}", generateKey);
log.info("定时执行在【" + DateUtil.toString(timeTriggerMsg.getTriggerTime(), "yyyy-MM-dd HH:mm:ss") + "】,消费【" + timeTriggerMsg.getParam().toString() + "");
} else {
log.error("延时任务添加失败:{}", timeTriggerMsg);
}
}
@Override @Override
public void edit(String executorName, Object param, Long oldTriggerTime, Long triggerTime, String uniqueKey, int delayTime, String topic) { public void edit(String executorName, Object param, Long oldTriggerTime, Long triggerTime, String uniqueKey, int delayTime, String topic) {
this.delete(executorName, oldTriggerTime, uniqueKey, topic); this.delete(executorName, oldTriggerTime, uniqueKey, topic);
this.addDelay(new TimeTriggerMsg(executorName, triggerTime, param, uniqueKey, topic), delayTime); this.addDelay(new TimeTriggerMsg(executorName, triggerTime, param, uniqueKey, topic));
} }
@Override @Override
public void delete(String executorName, Long triggerTime, String uniqueKey, String topic) { public void delete(String executorName, Long triggerTime, String uniqueKey, String topic) {
String generateKey = TimeTriggerUtil.generateKey(executorName, triggerTime, uniqueKey); String generateKey = DelayQueueTools.generateKey(executorName, triggerTime, uniqueKey);
log.info("删除延时任务{}", generateKey); log.info("删除延时任务{}", generateKey);
this.cache.remove(generateKey); this.cache.remove(generateKey);
} }

View File

@ -1,6 +1,6 @@
package cn.lili.common.trigger.util; package cn.lili.common.trigger.util;
import cn.lili.common.trigger.enums.DelayQueueType; import cn.lili.common.trigger.enums.PromotionDelayTypeEnums;
/** /**
* 延时任务工具类 * 延时任务工具类
@ -10,6 +10,11 @@ import cn.lili.common.trigger.enums.DelayQueueType;
**/ **/
public class DelayQueueTools { public class DelayQueueTools {
/**
* 前缀
*/
private static final String PREFIX = "{rocketmq_trigger}_";
/** /**
* 组装延时任务唯一键 * 组装延时任务唯一键
* *
@ -17,8 +22,21 @@ public class DelayQueueTools {
* @param id id * @param id id
* @return 唯一键 * @return 唯一键
*/ */
public static String wrapperUniqueKey(DelayQueueType type, String id) { public static String wrapperUniqueKey(PromotionDelayTypeEnums type, String id) {
return "{TIME_TRIGGER_" + type.name() + "}_" + id; return "{TIME_TRIGGER_" + type.name() + "}_" + id;
} }
/**
* 生成延时任务标识key
*
* @param executorName 执行器beanId
* @param triggerTime 执行时间
* @param uniqueKey 自定义表示
* @return 延时任务标识key
*/
public static String generateKey(String executorName, Long triggerTime, String uniqueKey) {
return PREFIX + (executorName + triggerTime + uniqueKey).hashCode();
}
} }

View File

@ -1,28 +0,0 @@
package cn.lili.common.trigger.util;
/**
* 延时任务mq实现内容提供加密算法以及任务前缀参数
*
* @author Chopper
*/
public class TimeTriggerUtil {
/**
* 前缀
*/
private static final String PREFIX = "{rocketmq_trigger}_";
/**
* 生成延时任务标识key
*
* @param executorName 执行器beanId
* @param triggerTime 执行时间
* @param uniqueKey 自定义表示
* @return 延时任务标识key
*/
public static String generateKey(String executorName, Long triggerTime, String uniqueKey) {
return PREFIX + (executorName + triggerTime + uniqueKey).hashCode();
}
}

View File

@ -200,6 +200,15 @@ public class DateUtil {
public static String toString(Date date) { public static String toString(Date date) {
return toString(date,STANDARD_FORMAT); return toString(date,STANDARD_FORMAT);
} }
/**
* 把日期转换成字符串型
*
* @param Long 日期
* @return
*/
public static String toString(Long date) {
return toString(date,STANDARD_FORMAT);
}
/** /**
* 把日期转换成字符串型 * 把日期转换成字符串型
* *

View File

@ -4,9 +4,9 @@ import cn.hutool.json.JSONUtil;
import cn.lili.common.cache.Cache; import cn.lili.common.cache.Cache;
import cn.lili.common.cache.CachePrefix; import cn.lili.common.cache.CachePrefix;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.token.Token; import cn.lili.common.token.Token;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
import cn.lili.config.properties.ApiProperties; import cn.lili.config.properties.ApiProperties;
import cn.lili.config.properties.DomainProperties; import cn.lili.config.properties.DomainProperties;
@ -17,6 +17,7 @@ import cn.lili.modules.connect.entity.dto.AuthCallback;
import cn.lili.modules.connect.entity.dto.AuthResponse; import cn.lili.modules.connect.entity.dto.AuthResponse;
import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
import cn.lili.modules.connect.exception.AuthException; import cn.lili.modules.connect.exception.AuthException;
import cn.lili.modules.connect.request.AuthQQRequest;
import cn.lili.modules.connect.request.AuthRequest; import cn.lili.modules.connect.request.AuthRequest;
import cn.lili.modules.connect.request.AuthWeChatPCRequest; import cn.lili.modules.connect.request.AuthWeChatPCRequest;
import cn.lili.modules.connect.request.AuthWeChatRequest; import cn.lili.modules.connect.request.AuthWeChatRequest;
@ -32,8 +33,11 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** /**
* 联合登陆工具类 * 联合登陆工具类
@ -71,9 +75,10 @@ public class ConnectUtil {
* @param type * @param type
* @param callback * @param callback
* @param httpServletResponse * @param httpServletResponse
* @param httpServletRequest
* @throws IOException * @throws IOException
*/ */
public void callback(String type, AuthCallback callback, HttpServletResponse httpServletResponse) throws IOException { public void callback(String type, AuthCallback callback, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {
AuthRequest authRequest = this.getAuthRequest(type); AuthRequest authRequest = this.getAuthRequest(type);
AuthResponse<ConnectAuthUser> response = authRequest.login(callback); AuthResponse<ConnectAuthUser> response = authRequest.login(callback);
ResultMessage<Object> resultMessage; ResultMessage<Object> resultMessage;
@ -95,8 +100,11 @@ public class ConnectUtil {
//缓存写入登录结果300秒有效 //缓存写入登录结果300秒有效
cache.put(CachePrefix.CONNECT_RESULT.getPrefix() + callback.getCode(), resultMessage, 300L); cache.put(CachePrefix.CONNECT_RESULT.getPrefix() + callback.getCode(), resultMessage, 300L);
// String url = buyer + "/login?state=" + callback.getCode(); //跳转地址
String url = domainProperties.getWap() + "/pages/public/login?state=" + callback.getCode(); String url = this.check(httpServletRequest.getHeader("user-agent")) ?
domainProperties.getWap() + "/pages/passport/login?state=" + callback.getCode() :
domainProperties.getPc() + "/login?state=" + callback.getCode();
try { try {
httpServletResponse.sendRedirect(url); httpServletResponse.sendRedirect(url);
} catch (Exception e) { } catch (Exception e) {
@ -172,7 +180,7 @@ public class ConnectUtil {
QQConnectSetting qqConnectSetting = JSONUtil.toBean(setting.getSettingValue(), QQConnectSetting.class); QQConnectSetting qqConnectSetting = JSONUtil.toBean(setting.getSettingValue(), QQConnectSetting.class);
for (QQConnectSettingItem qqConnectSettingItem : qqConnectSetting.getQqConnectSettingItemList()) { for (QQConnectSettingItem qqConnectSettingItem : qqConnectSetting.getQqConnectSettingItemList()) {
if (qqConnectSettingItem.getClientType().equals(ClientTypeEnum.PC.name())) { if (qqConnectSettingItem.getClientType().equals(ClientTypeEnum.PC.name())) {
authRequest = new AuthWeChatPCRequest(AuthConfig.builder() authRequest = new AuthQQRequest(AuthConfig.builder()
.clientId(qqConnectSettingItem.getAppId()) .clientId(qqConnectSettingItem.getAppId())
.clientSecret(qqConnectSettingItem.getAppKey()) .clientSecret(qqConnectSettingItem.getAppKey())
.redirectUri(getRedirectUri(authInterface)) .redirectUri(getRedirectUri(authInterface))
@ -223,6 +231,40 @@ public class ConnectUtil {
return authRequest; return authRequest;
} }
// \b 是单词边界(连着的两个(字母字符 非字母字符) 之间的逻辑上的间隔),
// 字符串在编译时会被转码一次,所以是 "\\b"
// \B 是单词内部逻辑间隔(连着的两个字母字符之间的逻辑上的间隔)
static String phoneReg = "\\b(ip(hone|od)|android|opera m(ob|in)i"
+ "|windows (phone|ce)|blackberry"
+ "|s(ymbian|eries60|amsung)|p(laybook|alm|rofile/midp"
+ "|laystation portable)|nokia|fennec|htc[-_]"
+ "|mobile|up.browser|[1-4][0-9]{2}x[1-4][0-9]{2})\\b";
static String tableReg = "\\b(ipad|tablet|(Nexus 7)|up.browser"
+ "|[1-4][0-9]{2}x[1-4][0-9]{2})\\b";
//移动设备正则匹配手机端平板
static Pattern phonePat = Pattern.compile(phoneReg, Pattern.CASE_INSENSITIVE);
static Pattern tablePat = Pattern.compile(tableReg, Pattern.CASE_INSENSITIVE);
/**
* 检测是否是移动设备访问
*
* @param userAgent 浏览器标识
* @return true:移动设备接入false:pc端接入
* @Title: check
*/
private boolean check(String userAgent) {
if (null == userAgent) {
userAgent = "";
}
// 匹配
Matcher matcherPhone = phonePat.matcher(userAgent);
Matcher matcherTable = tablePat.matcher(userAgent);
if (matcherPhone.find() || matcherTable.find()) {
return true;
} else {
return false;
}
}
} }

View File

@ -194,9 +194,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
if (goodsSku == null) { if (goodsSku == null) {
throw new ServiceException("商品已下架"); throw new ServiceException("商品已下架");
} }
} }
// 获取当前商品的索引信息 // 获取当前商品的索引信息
EsGoodsIndex goodsIndex = goodsIndexService.findById(skuId); EsGoodsIndex goodsIndex = goodsIndexService.findById(skuId);
if (goodsIndex == null) { if (goodsIndex == null) {

View File

@ -11,7 +11,7 @@ import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter; import cn.hutool.poi.excel.ExcelWriter;
import cn.lili.common.aop.syslog.annotation.SystemLogPoint; import cn.lili.common.aop.syslog.annotation.SystemLogPoint;
import cn.lili.common.trigger.util.DelayQueueTools; import cn.lili.common.trigger.util.DelayQueueTools;
import cn.lili.common.trigger.enums.DelayQueueType; import cn.lili.common.trigger.enums.PromotionDelayTypeEnums;
import cn.lili.common.trigger.message.PintuanOrderMessage; import cn.lili.common.trigger.message.PintuanOrderMessage;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
@ -642,11 +642,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR,
startTime, startTime,
pintuanOrderMessage, pintuanOrderMessage,
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PINTUAN_ORDER, (pintuanId + parentOrderSn)), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PINTUAN_ORDER, (pintuanId + parentOrderSn)),
rocketmqCustomProperties.getPromotionTopic()); rocketmqCustomProperties.getPromotionTopic());
this.timeTrigger.addDelay(timeTriggerMsg, cn.lili.common.utils.DateUtil.getDelayTime(startTime));
} else if (pintuan.getRequiredNum() <= count) { this.timeTrigger.addDelay(timeTriggerMsg);
//拼团所需人数小于等于 参团后的人数则说明成团所有订单成团 }
//拼团所需人数小于等于 参团后的人数则说明成团所有订单成团
if (pintuan.getRequiredNum() <= count) {
this.pintuanOrderSuccess(list); this.pintuanOrderSuccess(list);
} }
} }

View File

@ -51,10 +51,10 @@ public class PageDataServiceImpl extends ServiceImpl<PageDataMapper, PageData> i
@Override @Override
public PageData addPageData(PageData pageData) { public PageData addPageData(PageData pageData) {
//如果页面为发布则关闭其他页面开启此页面 //如果页面为发布则关闭其他页面开启此页面
if(pageData.getPageShow().equals(SwitchEnum.OPEN.name())){ if (pageData.getPageShow().equals(SwitchEnum.OPEN.name())) {
LambdaUpdateWrapper<PageData> lambdaUpdateWrapper = Wrappers.lambdaUpdate(); LambdaUpdateWrapper<PageData> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
lambdaUpdateWrapper.eq(PageData::getPageType,pageData.getPageType()); lambdaUpdateWrapper.eq(PageData::getPageType, pageData.getPageType());
lambdaUpdateWrapper.eq(PageData::getPageClientType,pageData.getPageClientType()); lambdaUpdateWrapper.eq(PageData::getPageClientType, pageData.getPageClientType());
lambdaUpdateWrapper.set(PageData::getPageShow, SwitchEnum.CLOSE.name()); lambdaUpdateWrapper.set(PageData::getPageShow, SwitchEnum.CLOSE.name());
this.update(lambdaUpdateWrapper); this.update(lambdaUpdateWrapper);
} }
@ -65,12 +65,14 @@ public class PageDataServiceImpl extends ServiceImpl<PageDataMapper, PageData> i
@Override @Override
public PageData updatePageData(PageData pageData) { public PageData updatePageData(PageData pageData) {
//如果页面为发布则关闭其他页面开启此页面 //如果页面为发布则关闭其他页面开启此页面
if(pageData.getPageShow().equals(SwitchEnum.OPEN.name())){ if (pageData.getPageShow() != null && pageData.getPageShow().equals(SwitchEnum.OPEN.name())) {
LambdaUpdateWrapper<PageData> lambdaUpdateWrapper = Wrappers.lambdaUpdate(); LambdaUpdateWrapper<PageData> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
lambdaUpdateWrapper.eq(PageData::getPageType,pageData.getPageType()); lambdaUpdateWrapper.eq(PageData::getPageType, pageData.getPageType());
lambdaUpdateWrapper.eq(PageData::getPageClientType,pageData.getPageClientType()); lambdaUpdateWrapper.eq(PageData::getPageClientType, pageData.getPageClientType());
lambdaUpdateWrapper.set(PageData::getPageShow, SwitchEnum.CLOSE.name()); lambdaUpdateWrapper.set(PageData::getPageShow, SwitchEnum.CLOSE.name());
this.update(lambdaUpdateWrapper); this.update(lambdaUpdateWrapper);
} else {
pageData.setPageShow(SwitchEnum.CLOSE.name());
} }
LambdaUpdateWrapper<PageData> lambdaUpdateWrapper = Wrappers.lambdaUpdate(); LambdaUpdateWrapper<PageData> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
lambdaUpdateWrapper.set(PageData::getPageData, pageData.getPageData()); lambdaUpdateWrapper.set(PageData::getPageData, pageData.getPageData());

View File

@ -104,10 +104,6 @@ public interface CouponService extends IService<Coupon> {
void usedCoupon(String couponId, Integer usedNum); void usedCoupon(String couponId, Integer usedNum);
/**
* 活动优惠券列表
*/
IPage<Coupon> activityCoupons();
} }

View File

@ -2,7 +2,7 @@ package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.trigger.util.DelayQueueTools; import cn.lili.common.trigger.util.DelayQueueTools;
import cn.lili.common.trigger.enums.DelayQueueType; import cn.lili.common.trigger.enums.PromotionDelayTypeEnums;
import cn.lili.common.trigger.message.PromotionMessage; import cn.lili.common.trigger.message.PromotionMessage;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.trigger.interfaces.TimeTrigger; import cn.lili.common.trigger.interfaces.TimeTrigger;
@ -89,17 +89,14 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
this.updateScopePromotionGoods(coupon); this.updateScopePromotionGoods(coupon);
// 保存到MONGO中 // 保存到MONGO中
this.mongoTemplate.save(coupon); this.mongoTemplate.save(coupon);
// 如果是动态时间优惠券不走延时任务 PromotionMessage promotionMessage = new PromotionMessage(coupon.getId(), PromotionTypeEnum.COUPON.name(), PromotionStatusEnum.START.name(), coupon.getStartTime(), coupon.getEndTime());
if (coupon.getRangeDayType().equals(CouponRangeDayEnum.FIXEDTIME.name())) { TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR,
PromotionMessage promotionMessage = new PromotionMessage(coupon.getId(), PromotionTypeEnum.COUPON.name(), PromotionStatusEnum.START.name(), coupon.getStartTime(), coupon.getEndTime()); coupon.getStartTime().getTime(),
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, promotionMessage,
coupon.getStartTime().getTime(), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
promotionMessage, rocketmqCustomProperties.getPromotionTopic());
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), // 发送促销活动开始的延时任务
rocketmqCustomProperties.getPromotionTopic()); this.timeTrigger.addDelay(timeTriggerMsg);
// 发送促销活动开始的延时任务
this.timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(coupon.getStartTime().getTime()));
}
return coupon; return coupon;
} }
@ -114,17 +111,14 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
this.updateScopePromotionGoods(couponVO); this.updateScopePromotionGoods(couponVO);
// 保存到MONGO中 // 保存到MONGO中
this.mongoTemplate.save(couponVO); this.mongoTemplate.save(couponVO);
// 如果是动态时间优惠券不走延时任务 PromotionMessage promotionMessage = new PromotionMessage(couponVO.getId(), PromotionTypeEnum.COUPON.name(), PromotionStatusEnum.START.name(), coupon.getStartTime(), coupon.getEndTime());
if (coupon.getRangeDayType().equals(CouponRangeDayEnum.FIXEDTIME.name())) { // 更新延时任务
// 更新延时任务 this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR,
PromotionMessage promotionMessage = new PromotionMessage(couponVO.getId(), PromotionTypeEnum.COUPON.name(), PromotionStatusEnum.START.name(), coupon.getStartTime(), coupon.getEndTime()); promotionMessage,
this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, coupon.getStartTime().getTime(), couponVO.getStartTime().getTime(),
promotionMessage, DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
coupon.getStartTime().getTime(), couponVO.getStartTime().getTime(), DateUtil.getDelayTime(couponVO.getStartTime().getTime()),
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), rocketmqCustomProperties.getPromotionTopic());
DateUtil.getDelayTime(couponVO.getStartTime().getTime()),
rocketmqCustomProperties.getPromotionTopic());
}
return couponVO; return couponVO;
} }
@ -144,18 +138,15 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
couponVO.setPromotionStatus(promotionStatus.name()); couponVO.setPromotionStatus(promotionStatus.name());
this.updateById(couponVO); this.updateById(couponVO);
this.mongoTemplate.save(couponVO); this.mongoTemplate.save(couponVO);
// 如果是动态时间优惠券不走延时任务 if (promotionStatus.name().equals(PromotionStatusEnum.START.name())) {
if (couponVO.getRangeDayType().equals(CouponRangeDayEnum.FIXEDTIME.name())) { PromotionMessage promotionMessage = new PromotionMessage(couponVO.getId(), PromotionTypeEnum.COUPON.name(), PromotionStatusEnum.START.name(), couponVO.getStartTime(), couponVO.getEndTime());
if (promotionStatus.name().equals(PromotionStatusEnum.START.name())) { // 更新延时任务
PromotionMessage promotionMessage = new PromotionMessage(couponVO.getId(), PromotionTypeEnum.COUPON.name(), PromotionStatusEnum.START.name(), couponVO.getStartTime(), couponVO.getEndTime()); this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR,
// 更新延时任务 promotionMessage,
this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, couponVO.getStartTime().getTime(), couponVO.getStartTime().getTime(),
promotionMessage, DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
couponVO.getStartTime().getTime(), couponVO.getStartTime().getTime(), DateUtil.getDelayTime(couponVO.getStartTime().getTime()),
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), rocketmqCustomProperties.getPromotionTopic());
DateUtil.getDelayTime(couponVO.getStartTime().getTime()),
rocketmqCustomProperties.getPromotionTopic());
}
} }
} }
return true; return true;
@ -175,7 +166,7 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
this.mongoTemplate.remove(new Query().addCriteria(Criteria.where("id").is(id)), CouponVO.class); this.mongoTemplate.remove(new Query().addCriteria(Criteria.where("id").is(id)), CouponVO.class);
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR,
couponVO.getStartTime().getTime(), couponVO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.COUPON.name() + couponVO.getId())), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (PromotionTypeEnum.COUPON.name() + couponVO.getId())),
rocketmqCustomProperties.getPromotionTopic()); rocketmqCustomProperties.getPromotionTopic());
return result; return result;
} }
@ -266,53 +257,37 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
this.mongoTemplate.save(couponVO); this.mongoTemplate.save(couponVO);
} }
@Override
public IPage<Coupon> activityCoupons() {
PageVO page = new PageVO();
page.setPageSize(9999);
page.setPageNumber(1);
LambdaQueryWrapper<Coupon> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(Coupon::getGetType, CouponGetEnum.ACTIVITY.name());
return page(PageUtil.initPage(page), queryWrapper);
}
/** /**
* 检查优惠券信息是否合法 * 检查优惠券信息是否合法
* *
* @param coupon 优惠券信息 * @param coupon 优惠券信息
*/ */
private void checkParam(CouponVO coupon) { private void checkParam(CouponVO coupon) {
//判断优惠券领取数量限制
if (coupon.getCouponLimitNum() < 0) { if (coupon.getCouponLimitNum() < 0) {
throw new ServiceException("领取限制数量不能为负数"); throw new ServiceException("领取限制数量不能为负数");
} }
//领取数量不能超过发放数量
if (coupon.getCouponLimitNum() > coupon.getPublishNum()) { if (coupon.getCouponLimitNum() > coupon.getPublishNum()) {
throw new ServiceException("领取限制数量超出发行数量"); throw new ServiceException("领取限制数量超出发行数量");
} }
//判断优惠券面额
if (coupon.getCouponType().equals(CouponTypeEnum.PRICE.name()) && coupon.getPrice() > coupon.getConsumeThreshold()) { if (coupon.getCouponType().equals(CouponTypeEnum.PRICE.name()) && coupon.getPrice() > coupon.getConsumeThreshold()) {
throw new ServiceException("优惠券面额必须小于优惠券消费限额"); throw new ServiceException("优惠券面额必须小于优惠券消费限额");
} else if (coupon.getCouponType().equals(CouponTypeEnum.DISCOUNT.name()) && (coupon.getCouponDiscount() < 0 && coupon.getCouponDiscount() > 10)) { } else if (coupon.getCouponType().equals(CouponTypeEnum.DISCOUNT.name()) && (coupon.getCouponDiscount() < 0 && coupon.getCouponDiscount() > 10)) {
throw new ServiceException("优惠券折扣必须小于10且大于0"); throw new ServiceException("优惠券折扣必须小于10且大于0");
} }
//判断优惠券时间
long nowTime = DateUtil.getDateline() * 1000;
if (coupon.getRangeDayType().equals(CouponRangeDayEnum.FIXEDTIME.name())) {
if (coupon.getStartTime().getTime() < nowTime && coupon.getEndTime().getTime() > nowTime) {
throw new ServiceException("活动时间小于当前时间,不能进行编辑删除操作");
}
PromotionTools.checkPromotionTime(coupon.getStartTime().getTime(), coupon.getEndTime().getTime()); long nowTime = DateUtil.getDateline() * 1000;
//对状态的处理.如果未传递状态则需要 根据当前时间来确认优惠券状态 if (coupon.getStartTime().getTime() < nowTime && coupon.getEndTime().getTime() > nowTime) {
this.promotionStatusEmpty(coupon); throw new ServiceException("活动时间小于当前时间,不能进行编辑删除操作");
} else {
//动态时间优惠券需设置有限期并为活动赠送优惠券
if (coupon.getEffectiveDays() == null || coupon.getGetType().equals(CouponGetEnum.FREE.name())) {
throw new ServiceException("活动赠送优惠券需设置有限期");
}
} }
PromotionTools.checkPromotionTime(coupon.getStartTime().getTime(), coupon.getEndTime().getTime());
this.checkCouponScope(coupon); this.checkCouponScope(coupon);
//对状态的处理.如果未传递状态则需要 根据当前时间来确认优惠券状态
this.promotionStatusEmpty(coupon);
} }
/** /**

View File

@ -1,7 +1,7 @@
package cn.lili.modules.promotion.serviceimpl; package cn.lili.modules.promotion.serviceimpl;
import cn.lili.common.trigger.util.DelayQueueTools; import cn.lili.common.trigger.util.DelayQueueTools;
import cn.lili.common.trigger.enums.DelayQueueType; import cn.lili.common.trigger.enums.PromotionDelayTypeEnums;
import cn.lili.common.trigger.message.PromotionMessage; import cn.lili.common.trigger.message.PromotionMessage;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.trigger.interfaces.TimeTrigger; import cn.lili.common.trigger.interfaces.TimeTrigger;
@ -103,10 +103,10 @@ public class FullDiscountServiceImpl extends ServiceImpl<FullDiscountMapper, Ful
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR,
fullDiscountVO.getStartTime().getTime(), promotionMessage, fullDiscountVO.getStartTime().getTime(), promotionMessage,
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
rocketmqCustomProperties.getPromotionTopic()); rocketmqCustomProperties.getPromotionTopic());
// 发送促销活动开始的延时任务 // 发送促销活动开始的延时任务
this.timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(fullDiscountVO.getStartTime().getTime())); this.timeTrigger.addDelay(timeTriggerMsg);
return fullDiscountVO; return fullDiscountVO;
} }
@ -159,7 +159,7 @@ public class FullDiscountServiceImpl extends ServiceImpl<FullDiscountMapper, Ful
// 发送更新延时任务 // 发送更新延时任务
this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, promotionMessage, this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, promotionMessage,
fullDiscount.getStartTime().getTime(), fullDiscountVO.getStartTime().getTime(), fullDiscount.getStartTime().getTime(), fullDiscountVO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
DateUtil.getDelayTime(fullDiscountVO.getStartTime().getTime()), DateUtil.getDelayTime(fullDiscountVO.getStartTime().getTime()),
rocketmqCustomProperties.getPromotionTopic()); rocketmqCustomProperties.getPromotionTopic());
return fullDiscountVO; return fullDiscountVO;
@ -186,7 +186,7 @@ public class FullDiscountServiceImpl extends ServiceImpl<FullDiscountMapper, Ful
this.promotionGoodsService.removePromotionGoods(fullDiscount.getPromotionGoodsList(), PromotionTypeEnum.FULL_DISCOUNT); this.promotionGoodsService.removePromotionGoods(fullDiscount.getPromotionGoodsList(), PromotionTypeEnum.FULL_DISCOUNT);
} }
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, fullDiscount.getStartTime().getTime(), this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, fullDiscount.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.FULL_DISCOUNT.name() + fullDiscount.getId())), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (PromotionTypeEnum.FULL_DISCOUNT.name() + fullDiscount.getId())),
rocketmqCustomProperties.getPromotionTopic()); rocketmqCustomProperties.getPromotionTopic());
return result; return result;
} }

View File

@ -2,7 +2,7 @@ package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.lili.common.trigger.util.DelayQueueTools; import cn.lili.common.trigger.util.DelayQueueTools;
import cn.lili.common.trigger.enums.DelayQueueType; import cn.lili.common.trigger.enums.PromotionDelayTypeEnums;
import cn.lili.common.trigger.message.PromotionMessage; import cn.lili.common.trigger.message.PromotionMessage;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.trigger.interfaces.TimeTrigger; import cn.lili.common.trigger.interfaces.TimeTrigger;
@ -223,11 +223,10 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
promotionMessage, promotionMessage,
pintuanVO.getStartTime().getTime(), pintuanVO.getStartTime().getTime(),
pintuan.getStartTime().getTime(), pintuan.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
DateUtil.getDelayTime(pintuanVO.getStartTime().getTime()), DateUtil.getDelayTime(pintuanVO.getStartTime().getTime()),
rocketmqCustomProperties.getPromotionTopic()); rocketmqCustomProperties.getPromotionTopic());
} }
return result; return result;
} }
@ -391,10 +390,10 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR,
pintuan.getStartTime().getTime(), pintuan.getStartTime().getTime(),
promotionMessage, promotionMessage,
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
rocketmqCustomProperties.getPromotionTopic()); rocketmqCustomProperties.getPromotionTopic());
// 发送促销活动开始的延时任务 // 发送促销活动开始的延时任务
this.timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(pintuan.getStartTime().getTime())); this.timeTrigger.addDelay(timeTriggerMsg);
} }
/** /**
@ -406,7 +405,7 @@ public class PintuanServiceImpl extends ServiceImpl<PintuanMapper, Pintuan> impl
private void removePintuanGoodsFromEs(String id, Long originStartTime) { private void removePintuanGoodsFromEs(String id, Long originStartTime) {
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR,
originStartTime, originStartTime,
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.PINTUAN.name() + id)), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (PromotionTypeEnum.PINTUAN.name() + id)),
rocketmqCustomProperties.getPromotionTopic()); rocketmqCustomProperties.getPromotionTopic());
} }

View File

@ -2,7 +2,7 @@ package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.lili.common.trigger.util.DelayQueueTools; import cn.lili.common.trigger.util.DelayQueueTools;
import cn.lili.common.trigger.enums.DelayQueueType; import cn.lili.common.trigger.enums.PromotionDelayTypeEnums;
import cn.lili.common.trigger.message.PromotionMessage; import cn.lili.common.trigger.message.PromotionMessage;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.trigger.interfaces.TimeTrigger; import cn.lili.common.trigger.interfaces.TimeTrigger;
@ -120,7 +120,7 @@ public class PointsGoodsServiceImpl extends ServiceImpl<PointsGoodsMapper, Point
promotionMessage, promotionMessage,
pointsGoodsVO.getStartTime().getTime(), pointsGoodsVO.getStartTime().getTime(),
pointsGoods.getStartTime().getTime(), pointsGoods.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
DateUtil.getDelayTime(pointsGoods.getStartTime().getTime()), DateUtil.getDelayTime(pointsGoods.getStartTime().getTime()),
rocketmqCustomProperties.getPromotionTopic()); rocketmqCustomProperties.getPromotionTopic());
} }
@ -149,7 +149,7 @@ public class PointsGoodsServiceImpl extends ServiceImpl<PointsGoodsMapper, Point
this.goodsIndexService.deleteEsGoodsPromotionIndexByList(Collections.singletonList(pointsGoodsVO.getSkuId()), PromotionTypeEnum.POINTS_GOODS); this.goodsIndexService.deleteEsGoodsPromotionIndexByList(Collections.singletonList(pointsGoodsVO.getSkuId()), PromotionTypeEnum.POINTS_GOODS);
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR,
pointsGoodsVO.getStartTime().getTime(), pointsGoodsVO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.POINTS_GOODS.name() + pointsGoodsVO.getId())), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (PromotionTypeEnum.POINTS_GOODS.name() + pointsGoodsVO.getId())),
rocketmqCustomProperties.getPromotionTopic()); rocketmqCustomProperties.getPromotionTopic());
} }
} }
@ -169,7 +169,7 @@ public class PointsGoodsServiceImpl extends ServiceImpl<PointsGoodsMapper, Point
PointsGoodsVO pointsGoodsVO = this.checkExist(id); PointsGoodsVO pointsGoodsVO = this.checkExist(id);
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR,
pointsGoodsVO.getStartTime().getTime(), pointsGoodsVO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.POINTS_GOODS.name() + pointsGoodsVO.getId())), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (PromotionTypeEnum.POINTS_GOODS.name() + pointsGoodsVO.getId())),
rocketmqCustomProperties.getPromotionTopic()); rocketmqCustomProperties.getPromotionTopic());
skuIds.add(pointsGoodsVO.getSkuId()); skuIds.add(pointsGoodsVO.getSkuId());
} }
@ -243,10 +243,10 @@ public class PointsGoodsServiceImpl extends ServiceImpl<PointsGoodsMapper, Point
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR,
promotionMessage.getStartTime().getTime(), promotionMessage.getStartTime().getTime(),
promotionMessage, promotionMessage,
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
rocketmqCustomProperties.getPromotionTopic()); rocketmqCustomProperties.getPromotionTopic());
// 发送促销活动开始的延时任务 // 发送促销活动开始的延时任务
this.timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(promotionMessage.getStartTime().getTime())); this.timeTrigger.addDelay(timeTriggerMsg);
} }
/** /**

View File

@ -1,7 +1,7 @@
package cn.lili.modules.promotion.serviceimpl; package cn.lili.modules.promotion.serviceimpl;
import cn.lili.common.trigger.util.DelayQueueTools; import cn.lili.common.trigger.util.DelayQueueTools;
import cn.lili.common.trigger.enums.DelayQueueType; import cn.lili.common.trigger.enums.PromotionDelayTypeEnums;
import cn.lili.common.trigger.message.PromotionMessage; import cn.lili.common.trigger.message.PromotionMessage;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.trigger.interfaces.TimeTrigger; import cn.lili.common.trigger.interfaces.TimeTrigger;
@ -169,7 +169,7 @@ public class SeckillServiceImpl extends ServiceImpl<SeckillMapper, Seckill> impl
promotionMessage, promotionMessage,
seckill.getStartTime().getTime(), seckill.getStartTime().getTime(),
seckillVO.getStartTime().getTime(), seckillVO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
DateUtil.getDelayTime(seckillVO.getStartTime().getTime()), DateUtil.getDelayTime(seckillVO.getStartTime().getTime()),
rocketmqCustomProperties.getPromotionTopic()); rocketmqCustomProperties.getPromotionTopic());
} }
@ -190,7 +190,7 @@ public class SeckillServiceImpl extends ServiceImpl<SeckillMapper, Seckill> impl
this.promotionGoodsService.update(promotionGoodsQueryWrapper); this.promotionGoodsService.update(promotionGoodsQueryWrapper);
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR,
seckill.getStartTime().getTime(), seckill.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckill.getId())), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckill.getId())),
rocketmqCustomProperties.getPromotionTopic()); rocketmqCustomProperties.getPromotionTopic());
} else { } else {
throw new ServiceException("该秒杀活动活动的状态不能删除"); throw new ServiceException("该秒杀活动活动的状态不能删除");
@ -233,7 +233,7 @@ public class SeckillServiceImpl extends ServiceImpl<SeckillMapper, Seckill> impl
} }
this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR,
seckillVO.getStartTime().getTime(), seckillVO.getStartTime().getTime(),
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckillVO.getId())), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckillVO.getId())),
rocketmqCustomProperties.getPromotionTopic()); rocketmqCustomProperties.getPromotionTopic());
} }
} else { } else {
@ -264,10 +264,10 @@ public class SeckillServiceImpl extends ServiceImpl<SeckillMapper, Seckill> impl
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR,
seckill.getStartTime().getTime(), seckill.getStartTime().getTime(),
promotionMessage, promotionMessage,
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
rocketmqCustomProperties.getPromotionTopic()); rocketmqCustomProperties.getPromotionTopic());
// 发送促销活动开始的延时任务 // 发送促销活动开始的延时任务
this.timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(seckill.getStartTime().getTime())); this.timeTrigger.addDelay(timeTriggerMsg);
} }
/** /**

View File

@ -1,35 +0,0 @@
package cn.lili.test.trigger;
import cn.lili.common.cache.Cache;
import cn.lili.common.trigger.interfaces.TimeTriggerExecutor;
import cn.lili.common.utils.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* TestTimeTrigger
*
* @author Chopper
* @version v1.0
* @since
* 2019-02-19 下午3:01
*/
@Component
public class TestTimeTrigger implements TimeTriggerExecutor {
public static String key = "rabbitmq_test_value";
@Autowired
private Cache cache;
/**
* 执行任务
*
* @param object 任务参数
*/
@Override
public void execute(Object object) {
System.out.println(DateUtil.toString(DateUtil.getDateline(), "yyyy-MM-dd HH:mm:ss"));
System.out.println(key + "===" + object);
cache.put(key, object);
}
}

View File

@ -3,6 +3,7 @@ package cn.lili.controller.member;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.base.aspect.DemoSite;
import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.dto.ManagerMemberEditDTO; import cn.lili.modules.member.entity.dto.ManagerMemberEditDTO;
import cn.lili.modules.member.entity.dto.MemberAddDTO; import cn.lili.modules.member.entity.dto.MemberAddDTO;
@ -56,6 +57,7 @@ public class MemberManagerController {
@ApiOperation(value = "修改会员基本信息") @ApiOperation(value = "修改会员基本信息")
@PutMapping @PutMapping
@DemoSite
public ResultMessage<Member> update(@Valid ManagerMemberEditDTO managerMemberEditDTO) { public ResultMessage<Member> update(@Valid ManagerMemberEditDTO managerMemberEditDTO) {
return ResultUtil.data(memberService.updateMember(managerMemberEditDTO)); return ResultUtil.data(memberService.updateMember(managerMemberEditDTO));
} }
@ -66,6 +68,7 @@ public class MemberManagerController {
@ApiImplicitParam(name = "disabled", required = true, dataType = "boolean", paramType = "query") @ApiImplicitParam(name = "disabled", required = true, dataType = "boolean", paramType = "query")
}) })
@PutMapping("/updateMemberStatus") @PutMapping("/updateMemberStatus")
@DemoSite
public ResultMessage<Object> updateMemberStatus(@RequestParam List<String> memberIds, @RequestParam Boolean disabled) { public ResultMessage<Object> updateMemberStatus(@RequestParam List<String> memberIds, @RequestParam Boolean disabled) {
memberService.updateMemberStatus(memberIds, disabled); memberService.updateMemberStatus(memberIds, disabled);
return ResultUtil.success(); return ResultUtil.success();

View File

@ -3,6 +3,7 @@ package cn.lili.controller.other;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.base.aspect.DemoSite;
import cn.lili.modules.page.entity.dos.PageData; import cn.lili.modules.page.entity.dos.PageData;
import cn.lili.modules.page.entity.dto.PageDataDTO; import cn.lili.modules.page.entity.dto.PageDataDTO;
import cn.lili.modules.page.entity.vos.PageDataListVO; import cn.lili.modules.page.entity.vos.PageDataListVO;
@ -49,6 +50,7 @@ public class PageDataManagerController {
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path")
}) })
@DemoSite
@PutMapping("/update/{id}") @PutMapping("/update/{id}")
public ResultMessage<PageData> updatePageData(@Valid PageData pageData, @NotNull @PathVariable String id) { public ResultMessage<PageData> updatePageData(@Valid PageData pageData, @NotNull @PathVariable String id) {
pageData.setId(id); pageData.setId(id);
@ -64,11 +66,13 @@ public class PageDataManagerController {
@ApiOperation(value = "发布页面") @ApiOperation(value = "发布页面")
@ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path")
@PutMapping("/release/{id}") @PutMapping("/release/{id}")
@DemoSite
public ResultMessage<PageData> release(@PathVariable String id) { public ResultMessage<PageData> release(@PathVariable String id) {
return ResultUtil.data(pageDataService.releasePageData(id)); return ResultUtil.data(pageDataService.releasePageData(id));
} }
@ApiOperation(value = "删除页面") @ApiOperation(value = "删除页面")
@DemoSite
@ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/remove/{id}") @DeleteMapping("/remove/{id}")
public ResultMessage<Object> remove(@PathVariable String id) { public ResultMessage<Object> remove(@PathVariable String id) {

View File

@ -1,16 +1,17 @@
package cn.lili.controller.passport; package cn.lili.controller.passport;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.AuthUser; import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext; import cn.lili.common.security.context.UserContext;
import cn.lili.common.token.Token; import cn.lili.common.token.Token;
import cn.lili.common.utils.PageUtil; import cn.lili.common.utils.PageUtil;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.utils.StringUtils; import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
import cn.lili.common.vo.SearchVO; import cn.lili.common.vo.SearchVO;
import cn.lili.modules.base.aspect.DemoSite;
import cn.lili.modules.permission.entity.dos.AdminUser; import cn.lili.modules.permission.entity.dos.AdminUser;
import cn.lili.modules.permission.entity.dto.AdminUserDTO; import cn.lili.modules.permission.entity.dto.AdminUserDTO;
import cn.lili.modules.permission.entity.vo.AdminUserVO; import cn.lili.modules.permission.entity.vo.AdminUserVO;
@ -98,6 +99,7 @@ public class AdminUserManagerController {
@PutMapping(value = "/admin/edit") @PutMapping(value = "/admin/edit")
@ApiOperation(value = "超级管理员修改其他管理员资料") @ApiOperation(value = "超级管理员修改其他管理员资料")
@DemoSite
public ResultMessage<Object> edit(AdminUser adminUser, public ResultMessage<Object> edit(AdminUser adminUser,
@RequestParam(required = false) List<String> roles) { @RequestParam(required = false) List<String> roles) {
if (!adminUserService.updateAdminUser(adminUser, roles)) { if (!adminUserService.updateAdminUser(adminUser, roles)) {
@ -115,6 +117,7 @@ public class AdminUserManagerController {
*/ */
@PutMapping(value = "/editPassword") @PutMapping(value = "/editPassword")
@ApiOperation(value = "修改密码") @ApiOperation(value = "修改密码")
@DemoSite
public ResultMessage<Object> editPassword(String password, String newPassword) { public ResultMessage<Object> editPassword(String password, String newPassword) {
adminUserService.editPassword(password, newPassword); adminUserService.editPassword(password, newPassword);
return ResultUtil.success(ResultCode.USER_EDIT_SUCCESS); return ResultUtil.success(ResultCode.USER_EDIT_SUCCESS);
@ -122,6 +125,7 @@ public class AdminUserManagerController {
@PostMapping(value = "/resetPassword/{ids}") @PostMapping(value = "/resetPassword/{ids}")
@ApiOperation(value = "重置密码") @ApiOperation(value = "重置密码")
@DemoSite
public ResultMessage<Object> resetPassword(@PathVariable List ids) { public ResultMessage<Object> resetPassword(@PathVariable List ids) {
adminUserService.resetPassword(ids); adminUserService.resetPassword(ids);
return ResultUtil.success(ResultCode.USER_EDIT_SUCCESS); return ResultUtil.success(ResultCode.USER_EDIT_SUCCESS);
@ -155,6 +159,7 @@ public class AdminUserManagerController {
@PutMapping(value = "/enable/{userId}") @PutMapping(value = "/enable/{userId}")
@ApiOperation(value = "禁/启 用 用户") @ApiOperation(value = "禁/启 用 用户")
@DemoSite
public ResultMessage<Object> disable(@ApiParam("用户唯一id标识") @PathVariable String userId, Boolean status) { public ResultMessage<Object> disable(@ApiParam("用户唯一id标识") @PathVariable String userId, Boolean status) {
AdminUser user = adminUserService.getById(userId); AdminUser user = adminUserService.getById(userId);
if (user == null) { if (user == null) {
@ -167,6 +172,7 @@ public class AdminUserManagerController {
@DeleteMapping(value = "/{ids}") @DeleteMapping(value = "/{ids}")
@ApiOperation(value = "批量通过ids删除") @ApiOperation(value = "批量通过ids删除")
@DemoSite
public ResultMessage<Object> delAllByIds(@PathVariable List<String> ids) { public ResultMessage<Object> delAllByIds(@PathVariable List<String> ids) {
adminUserService.deleteCompletely(ids); adminUserService.deleteCompletely(ids);
return ResultUtil.success(); return ResultUtil.success();

View File

@ -2,6 +2,7 @@ package cn.lili.controller.permission;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.base.aspect.DemoSite;
import cn.lili.modules.permission.entity.dos.Menu; import cn.lili.modules.permission.entity.dos.Menu;
import cn.lili.modules.permission.entity.dto.MenuSearchParams; import cn.lili.modules.permission.entity.dto.MenuSearchParams;
import cn.lili.modules.permission.entity.vo.MenuVO; import cn.lili.modules.permission.entity.vo.MenuVO;
@ -38,6 +39,7 @@ public class MenuManagerController {
@ApiOperation(value = "添加") @ApiOperation(value = "添加")
@PostMapping @PostMapping
@DemoSite
public ResultMessage<Menu> add(Menu menu) { public ResultMessage<Menu> add(Menu menu) {
try { try {
menuService.save(menu); menuService.save(menu);
@ -50,6 +52,8 @@ public class MenuManagerController {
@ApiImplicitParam(name = "id", value = "菜单ID", required = true, paramType = "path", dataType = "String") @ApiImplicitParam(name = "id", value = "菜单ID", required = true, paramType = "path", dataType = "String")
@ApiOperation(value = "编辑") @ApiOperation(value = "编辑")
@PutMapping(value = "/{id}") @PutMapping(value = "/{id}")
@DemoSite
public ResultMessage<Menu> edit(@PathVariable String id, Menu menu) { public ResultMessage<Menu> edit(@PathVariable String id, Menu menu) {
menu.setId(id); menu.setId(id);
menuService.updateById(menu); menuService.updateById(menu);
@ -58,6 +62,7 @@ public class MenuManagerController {
@ApiOperation(value = "批量删除") @ApiOperation(value = "批量删除")
@DeleteMapping(value = "/{ids}") @DeleteMapping(value = "/{ids}")
@DemoSite
public ResultMessage<Menu> delByIds(@PathVariable List<String> ids) { public ResultMessage<Menu> delByIds(@PathVariable List<String> ids) {
menuService.deleteIds(ids); menuService.deleteIds(ids);
return ResultUtil.success(); return ResultUtil.success();

View File

@ -3,6 +3,7 @@ package cn.lili.controller.store;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.base.aspect.DemoSite;
import cn.lili.modules.goods.entity.vos.CategoryVO; import cn.lili.modules.goods.entity.vos.CategoryVO;
import cn.lili.modules.store.entity.dos.Store; import cn.lili.modules.store.entity.dos.Store;
import cn.lili.modules.store.entity.dto.AdminStoreApplyDTO; import cn.lili.modules.store.entity.dto.AdminStoreApplyDTO;
@ -90,6 +91,8 @@ public class StoreManagerController {
return ResultUtil.success(); return ResultUtil.success();
} }
@DemoSite
@ApiOperation(value = "关闭店铺") @ApiOperation(value = "关闭店铺")
@ApiImplicitParam(name = "id", value = "店铺id", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "id", value = "店铺id", required = true, dataType = "String", paramType = "path")
@PutMapping(value = "/disable/{id}") @PutMapping(value = "/disable/{id}")