From 9195292aa9bb85813fe68cd103537fd8908dafba Mon Sep 17 00:00:00 2001 From: Chopper Date: Thu, 10 Jun 2021 17:40:53 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E6=BC=94=E7=A4=BA=E7=AB=99=E7=82=B9?= =?UTF-8?q?=E9=83=A8=E5=88=86=E6=9D=83=E9=99=90=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lili/controller/member/MemberManagerController.java | 3 +++ .../lili/controller/other/PageDataManagerController.java | 4 ++++ .../controller/passport/AdminUserManagerController.java | 8 +++++++- .../lili/controller/permission/MenuManagerController.java | 6 +++++- .../cn/lili/controller/store/StoreManagerController.java | 3 +++ 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/manager-api/src/main/java/cn/lili/controller/member/MemberManagerController.java b/manager-api/src/main/java/cn/lili/controller/member/MemberManagerController.java index 7210e03a..b63f405f 100644 --- a/manager-api/src/main/java/cn/lili/controller/member/MemberManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/member/MemberManagerController.java @@ -3,6 +3,7 @@ package cn.lili.controller.member; import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; 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.dto.ManagerMemberEditDTO; import cn.lili.modules.member.entity.dto.MemberAddDTO; @@ -56,6 +57,7 @@ public class MemberManagerController { @ApiOperation(value = "修改会员基本信息") @PutMapping + @DemoSite public ResultMessage update(@Valid ManagerMemberEditDTO managerMemberEditDTO) { return ResultUtil.data(memberService.updateMember(managerMemberEditDTO)); } @@ -66,6 +68,7 @@ public class MemberManagerController { @ApiImplicitParam(name = "disabled", required = true, dataType = "boolean", paramType = "query") }) @PutMapping("/updateMemberStatus") + @DemoSite public ResultMessage updateMemberStatus(@RequestParam List memberIds, @RequestParam Boolean disabled) { memberService.updateMemberStatus(memberIds, disabled); return ResultUtil.success(); diff --git a/manager-api/src/main/java/cn/lili/controller/other/PageDataManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/PageDataManagerController.java index 47d80fee..15c16d39 100644 --- a/manager-api/src/main/java/cn/lili/controller/other/PageDataManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/PageDataManagerController.java @@ -3,6 +3,7 @@ package cn.lili.controller.other; import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; 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.dto.PageDataDTO; import cn.lili.modules.page.entity.vos.PageDataListVO; @@ -49,6 +50,7 @@ public class PageDataManagerController { @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path") }) + @DemoSite @PutMapping("/update/{id}") public ResultMessage updatePageData(@Valid PageData pageData, @NotNull @PathVariable String id) { pageData.setId(id); @@ -64,11 +66,13 @@ public class PageDataManagerController { @ApiOperation(value = "发布页面") @ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path") @PutMapping("/release/{id}") + @DemoSite public ResultMessage release(@PathVariable String id) { return ResultUtil.data(pageDataService.releasePageData(id)); } @ApiOperation(value = "删除页面") + @DemoSite @ApiImplicitParam(name = "id", value = "页面ID", required = true, dataType = "String", paramType = "path") @DeleteMapping("/remove/{id}") public ResultMessage remove(@PathVariable String id) { diff --git a/manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java b/manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java index 8586089a..08c3c164 100644 --- a/manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/passport/AdminUserManagerController.java @@ -1,16 +1,17 @@ package cn.lili.controller.passport; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; import cn.lili.common.token.Token; import cn.lili.common.utils.PageUtil; -import cn.lili.common.enums.ResultUtil; import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.ResultMessage; 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.dto.AdminUserDTO; import cn.lili.modules.permission.entity.vo.AdminUserVO; @@ -98,6 +99,7 @@ public class AdminUserManagerController { @PutMapping(value = "/admin/edit") @ApiOperation(value = "超级管理员修改其他管理员资料") + @DemoSite public ResultMessage edit(AdminUser adminUser, @RequestParam(required = false) List roles) { if (!adminUserService.updateAdminUser(adminUser, roles)) { @@ -115,6 +117,7 @@ public class AdminUserManagerController { */ @PutMapping(value = "/editPassword") @ApiOperation(value = "修改密码") + @DemoSite public ResultMessage editPassword(String password, String newPassword) { adminUserService.editPassword(password, newPassword); return ResultUtil.success(ResultCode.USER_EDIT_SUCCESS); @@ -122,6 +125,7 @@ public class AdminUserManagerController { @PostMapping(value = "/resetPassword/{ids}") @ApiOperation(value = "重置密码") + @DemoSite public ResultMessage resetPassword(@PathVariable List ids) { adminUserService.resetPassword(ids); return ResultUtil.success(ResultCode.USER_EDIT_SUCCESS); @@ -155,6 +159,7 @@ public class AdminUserManagerController { @PutMapping(value = "/enable/{userId}") @ApiOperation(value = "禁/启 用 用户") + @DemoSite public ResultMessage disable(@ApiParam("用户唯一id标识") @PathVariable String userId, Boolean status) { AdminUser user = adminUserService.getById(userId); if (user == null) { @@ -167,6 +172,7 @@ public class AdminUserManagerController { @DeleteMapping(value = "/{ids}") @ApiOperation(value = "批量通过ids删除") + @DemoSite public ResultMessage delAllByIds(@PathVariable List ids) { adminUserService.deleteCompletely(ids); return ResultUtil.success(); diff --git a/manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java b/manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java index 0745a60c..47f46bc6 100644 --- a/manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java @@ -1,8 +1,8 @@ package cn.lili.controller.permission; -import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultUtil; 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.dto.MenuSearchParams; import cn.lili.modules.permission.entity.vo.MenuVO; @@ -37,6 +37,7 @@ public class MenuManagerController { @ApiOperation(value = "添加") @PostMapping + @DemoSite public ResultMessage add(Menu menu) { try { menuService.save(menu); @@ -49,6 +50,8 @@ public class MenuManagerController { @ApiImplicitParam(name = "id", value = "菜单ID", required = true, paramType = "path", dataType = "String") @ApiOperation(value = "编辑") @PutMapping(value = "/{id}") + + @DemoSite public ResultMessage edit(@PathVariable String id, Menu menu) { menu.setId(id); menuService.updateById(menu); @@ -57,6 +60,7 @@ public class MenuManagerController { @ApiOperation(value = "批量删除") @DeleteMapping(value = "/{ids}") + @DemoSite public ResultMessage delByIds(@PathVariable List ids) { menuService.deleteIds(ids); return ResultUtil.success(); diff --git a/manager-api/src/main/java/cn/lili/controller/store/StoreManagerController.java b/manager-api/src/main/java/cn/lili/controller/store/StoreManagerController.java index e5079b27..fcb888c0 100644 --- a/manager-api/src/main/java/cn/lili/controller/store/StoreManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/store/StoreManagerController.java @@ -3,6 +3,7 @@ package cn.lili.controller.store; import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.PageVO; 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.store.entity.dos.Store; import cn.lili.modules.store.entity.dto.AdminStoreApplyDTO; @@ -90,6 +91,8 @@ public class StoreManagerController { return ResultUtil.success(); } + + @DemoSite @ApiOperation(value = "关闭店铺") @ApiImplicitParam(name = "id", value = "店铺id", required = true, dataType = "String", paramType = "path") @PutMapping(value = "/disable/{id}") From ebebbcac69dfb557f66b3d03c104ce36842d63a3 Mon Sep 17 00:00:00 2001 From: Chopper Date: Fri, 11 Jun 2021 11:59:21 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E5=BB=B6=E6=97=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=A7=84=E8=8C=83=EF=BC=8C=E4=BB=BB=E5=8A=A1=E8=B0=83=E5=BA=A6?= =?UTF-8?q?=E6=9C=BA=E5=88=B6=EF=BC=8C=E4=BF=AE=E6=94=B9=E4=B8=BAconsumer?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=EF=BC=8C=E4=B8=8D=E5=86=8D=E8=A2=AB=E6=AF=8F?= =?UTF-8?q?=E4=B8=AA=E8=BF=9B=E7=A8=8B=E7=9B=91=E6=8E=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trigger/AbstractDelayQueueListen.java | 94 +++++++++++++++++++ .../cn/lili/trigger/TimeTriggerConsumer.java | 5 +- .../cn/lili/trigger}/TimeTriggerExecutor.java | 2 +- .../PromotionTimeTriggerExecutor.java | 9 +- .../listen/PromotionDelayQueueListen.java | 34 +++++++ .../AbstractDelayQueueMachineFactory.java | 82 ++-------------- .../{ => queue}/PromotionDelayQueue.java | 13 +-- .../common/trigger/enums/DelayQueueEnums.java | 19 ++++ ...Type.java => PromotionDelayTypeEnums.java} | 14 +-- .../trigger/interfaces/TimeTrigger.java | 8 +- .../impl}/RocketmqTimerTrigger.java | 63 +++++++------ .../common/trigger/util/DelayQueueTools.java | 22 ++++- .../common/trigger/util/TimeTriggerUtil.java | 28 ------ .../java/cn/lili/common/utils/DateUtil.java | 9 ++ .../serviceimpl/GoodsSkuServiceImpl.java | 3 +- .../order/serviceimpl/OrderServiceImpl.java | 6 +- .../serviceimpl/CouponServiceImpl.java | 13 ++- .../serviceimpl/FullDiscountServiceImpl.java | 10 +- .../serviceimpl/PintuanServiceImpl.java | 11 +-- .../serviceimpl/PointsGoodsServiceImpl.java | 12 +-- .../serviceimpl/SeckillServiceImpl.java | 12 +-- .../cn/lili/test/trigger/TestTimeTrigger.java | 35 ------- 22 files changed, 271 insertions(+), 233 deletions(-) create mode 100644 consumer/src/main/java/cn/lili/trigger/AbstractDelayQueueListen.java rename {framework/src/main/java/cn/lili/common/trigger/interfaces => consumer/src/main/java/cn/lili/trigger}/TimeTriggerExecutor.java (83%) create mode 100644 consumer/src/main/java/cn/lili/trigger/listen/PromotionDelayQueueListen.java rename framework/src/main/java/cn/lili/common/trigger/delay/{ => queue}/PromotionDelayQueue.java (63%) create mode 100644 framework/src/main/java/cn/lili/common/trigger/enums/DelayQueueEnums.java rename framework/src/main/java/cn/lili/common/trigger/enums/{DelayQueueType.java => PromotionDelayTypeEnums.java} (54%) rename framework/src/main/java/cn/lili/common/trigger/{ => interfaces/impl}/RocketmqTimerTrigger.java (74%) delete mode 100644 framework/src/main/java/cn/lili/common/trigger/util/TimeTriggerUtil.java delete mode 100644 framework/src/test/java/cn/lili/test/trigger/TestTimeTrigger.java diff --git a/consumer/src/main/java/cn/lili/trigger/AbstractDelayQueueListen.java b/consumer/src/main/java/cn/lili/trigger/AbstractDelayQueueListen.java new file mode 100644 index 00000000..6c539183 --- /dev/null +++ b/consumer/src/main/java/cn/lili/trigger/AbstractDelayQueueListen.java @@ -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 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(); + } + +} diff --git a/consumer/src/main/java/cn/lili/trigger/TimeTriggerConsumer.java b/consumer/src/main/java/cn/lili/trigger/TimeTriggerConsumer.java index 32e816a5..f0910140 100644 --- a/consumer/src/main/java/cn/lili/trigger/TimeTriggerConsumer.java +++ b/consumer/src/main/java/cn/lili/trigger/TimeTriggerConsumer.java @@ -2,9 +2,8 @@ package cn.lili.trigger; import cn.hutool.json.JSONUtil; 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.util.TimeTriggerUtil; +import cn.lili.common.trigger.util.DelayQueueTools; import cn.lili.common.utils.SpringContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; @@ -28,7 +27,7 @@ public class TimeTriggerConsumer implements RocketMQListener { @Override public void onMessage(TimeTriggerMsg timeTriggerMsg) { 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) { log.info("执行器执行被取消:{} | 任务标识:{}", timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getUniqueKey()); diff --git a/framework/src/main/java/cn/lili/common/trigger/interfaces/TimeTriggerExecutor.java b/consumer/src/main/java/cn/lili/trigger/TimeTriggerExecutor.java similarity index 83% rename from framework/src/main/java/cn/lili/common/trigger/interfaces/TimeTriggerExecutor.java rename to consumer/src/main/java/cn/lili/trigger/TimeTriggerExecutor.java index f378852c..0a086060 100644 --- a/framework/src/main/java/cn/lili/common/trigger/interfaces/TimeTriggerExecutor.java +++ b/consumer/src/main/java/cn/lili/trigger/TimeTriggerExecutor.java @@ -1,4 +1,4 @@ -package cn.lili.common.trigger.interfaces; +package cn.lili.trigger; /** * 延时任务执行器接口 diff --git a/consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java b/consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java index 13d27854..211c9bde 100644 --- a/consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java +++ b/consumer/src/main/java/cn/lili/trigger/executor/PromotionTimeTriggerExecutor.java @@ -1,13 +1,12 @@ package cn.lili.trigger.executor; 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.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.TimeTriggerMsg; -import cn.lili.common.utils.DateUtil; import cn.lili.config.rocketmq.RocketmqCustomProperties; import cn.lili.modules.order.order.service.OrderService; import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum; @@ -58,8 +57,10 @@ public class PromotionTimeTriggerExecutor implements TimeTriggerExecutor { // 结束时间(延时一分钟) 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())); + //添加延时任务 + timeTrigger.addDelay(timeTriggerMsg); } else { + //不是开始,则修改活动状态 promotionService.updatePromotionStatus(promotionMessage); } return; diff --git a/consumer/src/main/java/cn/lili/trigger/listen/PromotionDelayQueueListen.java b/consumer/src/main/java/cn/lili/trigger/listen/PromotionDelayQueueListen.java new file mode 100644 index 00000000..08091c68 --- /dev/null +++ b/consumer/src/main/java/cn/lili/trigger/listen/PromotionDelayQueueListen.java @@ -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(); + } +} diff --git a/framework/src/main/java/cn/lili/common/trigger/delay/AbstractDelayQueueMachineFactory.java b/framework/src/main/java/cn/lili/common/trigger/delay/AbstractDelayQueueMachineFactory.java index 60da4a6d..a2018a92 100644 --- a/framework/src/main/java/cn/lili/common/trigger/delay/AbstractDelayQueueMachineFactory.java +++ b/framework/src/main/java/cn/lili/common/trigger/delay/AbstractDelayQueueMachineFactory.java @@ -1,17 +1,9 @@ package cn.lili.common.trigger.delay; -import cn.hutool.json.JSONUtil; import cn.lili.common.cache.Cache; -import cn.lili.common.utils.ThreadPoolUtil; +import cn.lili.common.utils.DateUtil; 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.Calendar; -import java.util.Set; -import java.util.concurrent.TimeUnit; /** * 延时队列工厂 @@ -28,83 +20,25 @@ public abstract class AbstractDelayQueueMachineFactory { /** * 插入任务id * - * @param jobId 任务id(队列内唯一) - * @param time 延时时间(单位 :秒) + * @param jobId 任务id(队列内唯一) + * @param triggerTime 执行时间 时间戳(毫秒) * @return 是否插入成功 */ - public boolean addJob(String jobId, Integer time) { - //获取时间 - Calendar instance = Calendar.getInstance(); - instance.add(Calendar.SECOND, time); - long delaySeconds = instance.getTimeInMillis() / 1000; + public boolean addJob(String jobId, Long triggerTime) { + + //redis 中排序时间 + long delaySeconds = triggerTime / 1000; //增加延时任务 参数依次为:队列名称、执行时间、任务id boolean result = cache.zAdd(setDelayQueueName(), delaySeconds, jobId); - log.info("增加延时任务, 缓存key {}, 等待时间 {}", setDelayQueueName(), time); + log.info("增加延时任务, 缓存key {}, 执行时间 {},任务id {}", setDelayQueueName(), DateUtil.toString(triggerTime), jobId); return result; } - /** - * 延时队列机器开始运作 - */ - private void startDelayQueueMachine() { - log.info("延时队列机器{}开始运作", setDelayQueueName()); - - // 监听redis队列 - while (true) { - try { - // 获取当前时间的时间戳 - long now = System.currentTimeMillis() / 1000; - // 获取当前时间前的任务列表 - Set 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(); - } - } diff --git a/framework/src/main/java/cn/lili/common/trigger/delay/PromotionDelayQueue.java b/framework/src/main/java/cn/lili/common/trigger/delay/queue/PromotionDelayQueue.java similarity index 63% rename from framework/src/main/java/cn/lili/common/trigger/delay/PromotionDelayQueue.java rename to framework/src/main/java/cn/lili/common/trigger/delay/queue/PromotionDelayQueue.java index 792e77eb..2a072375 100644 --- a/framework/src/main/java/cn/lili/common/trigger/delay/PromotionDelayQueue.java +++ b/framework/src/main/java/cn/lili/common/trigger/delay/queue/PromotionDelayQueue.java @@ -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.model.TimeTriggerMsg; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -21,13 +21,8 @@ public class PromotionDelayQueue extends AbstractDelayQueueMachineFactory { @Autowired private TimeTrigger timeTrigger; - @Override - public void invoke(String jobId) { - timeTrigger.add(JSONUtil.toBean(jobId, TimeTriggerMsg.class)); - } - @Override public String setDelayQueueName() { - return "promotion_delay"; + return DelayQueueEnums.PROMOTION_QUEUE.name(); } } diff --git a/framework/src/main/java/cn/lili/common/trigger/enums/DelayQueueEnums.java b/framework/src/main/java/cn/lili/common/trigger/enums/DelayQueueEnums.java new file mode 100644 index 00000000..6bfc8618 --- /dev/null +++ b/framework/src/main/java/cn/lili/common/trigger/enums/DelayQueueEnums.java @@ -0,0 +1,19 @@ +package cn.lili.common.trigger.enums; + +/** + * 队列枚举 + */ +public enum DelayQueueEnums { + + + /** + * 促销任务队列 + */ + PROMOTION_QUEUE("促销任务队列"); + + private String description; + + DelayQueueEnums(String description) { + this.description = description; + } +} diff --git a/framework/src/main/java/cn/lili/common/trigger/enums/DelayQueueType.java b/framework/src/main/java/cn/lili/common/trigger/enums/PromotionDelayTypeEnums.java similarity index 54% rename from framework/src/main/java/cn/lili/common/trigger/enums/DelayQueueType.java rename to framework/src/main/java/cn/lili/common/trigger/enums/PromotionDelayTypeEnums.java index 6556f9fd..cf9ea551 100644 --- a/framework/src/main/java/cn/lili/common/trigger/enums/DelayQueueType.java +++ b/framework/src/main/java/cn/lili/common/trigger/enums/PromotionDelayTypeEnums.java @@ -5,8 +5,8 @@ package cn.lili.common.trigger.enums; * * @author paulG * @since 2021/5/7 - **/ -public enum DelayQueueType { + */ +public enum PromotionDelayTypeEnums { /** * 促销活动 @@ -17,14 +17,10 @@ public enum DelayQueueType { */ PINTUAN_ORDER("拼团订单"); - private final String description; + private String description; - DelayQueueType(String des) { - this.description = des; - } - - public String description() { - return this.description; + PromotionDelayTypeEnums(String description) { + this.description = description; } } diff --git a/framework/src/main/java/cn/lili/common/trigger/interfaces/TimeTrigger.java b/framework/src/main/java/cn/lili/common/trigger/interfaces/TimeTrigger.java index 9298b1ec..820314ae 100644 --- a/framework/src/main/java/cn/lili/common/trigger/interfaces/TimeTrigger.java +++ b/framework/src/main/java/cn/lili/common/trigger/interfaces/TimeTrigger.java @@ -9,22 +9,20 @@ import cn.lili.common.trigger.model.TimeTriggerMsg; */ public interface TimeTrigger { - /** * 添加延时任务 * * @param timeTriggerMsg 延时任务信息 */ - void add(TimeTriggerMsg timeTriggerMsg); + void addDelay(TimeTriggerMsg timeTriggerMsg); /** - * 添加延时任务 + * 执行延时任务 * * @param timeTriggerMsg 延时任务信息 - * @param delayTime 延时时间(秒) */ - void addDelay(TimeTriggerMsg timeTriggerMsg, int delayTime); + void execute(TimeTriggerMsg timeTriggerMsg); /** * 修改延时任务 diff --git a/framework/src/main/java/cn/lili/common/trigger/RocketmqTimerTrigger.java b/framework/src/main/java/cn/lili/common/trigger/interfaces/impl/RocketmqTimerTrigger.java similarity index 74% rename from framework/src/main/java/cn/lili/common/trigger/RocketmqTimerTrigger.java rename to framework/src/main/java/cn/lili/common/trigger/interfaces/impl/RocketmqTimerTrigger.java index 009e0f5f..b6589bc1 100644 --- a/framework/src/main/java/cn/lili/common/trigger/RocketmqTimerTrigger.java +++ b/framework/src/main/java/cn/lili/common/trigger/interfaces/impl/RocketmqTimerTrigger.java @@ -1,12 +1,12 @@ -package cn.lili.common.trigger; +package cn.lili.common.trigger.interfaces.impl; import cn.hutool.json.JSONUtil; import cn.lili.common.cache.Cache; 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.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.StringUtils; import lombok.extern.slf4j.Slf4j; @@ -34,12 +34,38 @@ public class RocketmqTimerTrigger implements TimeTrigger { @Override - public void add(TimeTriggerMsg timeTriggerMsg) { - this.addExecute(timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getParam(), timeTriggerMsg.getTriggerTime(), timeTriggerMsg.getUniqueKey(), timeTriggerMsg.getTopic()); + public void addDelay(TimeTriggerMsg timeTriggerMsg) { + //执行器唯一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() + ); } /** - * 添加延时任务 + * 将任务添加到mq,mq异步队列执行。 + *

+ * 本系统中redis相当于延时任务吊起机制,而mq才是实际的业务消费,执行任务的存在 * * @param executorName 执行器beanId * @param param 执行参数 @@ -50,7 +76,7 @@ public class RocketmqTimerTrigger implements TimeTrigger { * 业务内全局唯一 * @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); Message message = MessageBuilder.withPayload(timeTriggerMsg).build(); @@ -58,34 +84,15 @@ public class RocketmqTimerTrigger implements TimeTrigger { 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 public void edit(String executorName, Object param, Long oldTriggerTime, Long triggerTime, String uniqueKey, int delayTime, String 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 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); this.cache.remove(generateKey); } diff --git a/framework/src/main/java/cn/lili/common/trigger/util/DelayQueueTools.java b/framework/src/main/java/cn/lili/common/trigger/util/DelayQueueTools.java index 640719f9..e5055eda 100644 --- a/framework/src/main/java/cn/lili/common/trigger/util/DelayQueueTools.java +++ b/framework/src/main/java/cn/lili/common/trigger/util/DelayQueueTools.java @@ -1,6 +1,6 @@ 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 { + /** + * 前缀 + */ + private static final String PREFIX = "{rocketmq_trigger}_"; + /** * 组装延时任务唯一键 * @@ -17,8 +22,21 @@ public class DelayQueueTools { * @param id id * @return 唯一键 */ - public static String wrapperUniqueKey(DelayQueueType type, String id) { + public static String wrapperUniqueKey(PromotionDelayTypeEnums type, String 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(); + } + } diff --git a/framework/src/main/java/cn/lili/common/trigger/util/TimeTriggerUtil.java b/framework/src/main/java/cn/lili/common/trigger/util/TimeTriggerUtil.java deleted file mode 100644 index 7475c10d..00000000 --- a/framework/src/main/java/cn/lili/common/trigger/util/TimeTriggerUtil.java +++ /dev/null @@ -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(); - } - - -} diff --git a/framework/src/main/java/cn/lili/common/utils/DateUtil.java b/framework/src/main/java/cn/lili/common/utils/DateUtil.java index c6ed8b0b..cb86f07c 100644 --- a/framework/src/main/java/cn/lili/common/utils/DateUtil.java +++ b/framework/src/main/java/cn/lili/common/utils/DateUtil.java @@ -200,6 +200,15 @@ public class DateUtil { public static String toString(Date date) { return toString(date,STANDARD_FORMAT); } + /** + * 把日期转换成字符串型 + * + * @param Long 日期 + * @return + */ + public static String toString(Long date) { + return toString(date,STANDARD_FORMAT); + } /** * 把日期转换成字符串型 * diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java index 17ca7d27..1a8c7788 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java @@ -39,6 +39,7 @@ import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.lang.reflect.Field; import java.util.*; import java.util.stream.Collectors; @@ -194,9 +195,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl i if (goodsSku == null) { throw new ServiceException("商品已下架"); } - } - // 获取当前商品的索引信息 EsGoodsIndex goodsIndex = goodsIndexService.findById(skuId); if (goodsIndex == null) { diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java index 6450a219..c7178617 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java @@ -6,7 +6,7 @@ import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.json.JSONUtil; import cn.lili.common.aop.syslog.annotation.SystemLogPoint; 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.enums.ResultCode; import cn.lili.common.exception.ServiceException; @@ -555,9 +555,9 @@ public class OrderServiceImpl extends ServiceImpl implements TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, startTime, pintuanOrderMessage, - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PINTUAN_ORDER, (pintuanId + parentOrderSn)), + DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PINTUAN_ORDER, (pintuanId + parentOrderSn)), rocketmqCustomProperties.getPromotionTopic()); - this.timeTrigger.addDelay(timeTriggerMsg, cn.lili.common.utils.DateUtil.getDelayTime(startTime)); + this.timeTrigger.addDelay(timeTriggerMsg); } //拼团所需人数,小于等于 参团后的人数,则说明成团,所有订单成团 if (pintuan.getRequiredNum() <= count) { diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java index 3a0654c2..6a7fd73c 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java @@ -2,7 +2,7 @@ package cn.lili.modules.promotion.serviceimpl; import cn.hutool.core.text.CharSequenceUtil; 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.exception.ServiceException; import cn.lili.common.trigger.interfaces.TimeTrigger; @@ -53,7 +53,6 @@ import java.util.stream.Collectors; */ @Service @Transactional(rollbackFor = Exception.class) - public class CouponServiceImpl extends ServiceImpl implements CouponService { //延时任务 @@ -94,10 +93,10 @@ public class CouponServiceImpl extends ServiceImpl impleme TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, coupon.getStartTime().getTime(), promotionMessage, - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), + DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), rocketmqCustomProperties.getPromotionTopic()); // 发送促销活动开始的延时任务 - this.timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(coupon.getStartTime().getTime())); + this.timeTrigger.addDelay(timeTriggerMsg); return coupon; } @@ -117,7 +116,7 @@ public class CouponServiceImpl extends ServiceImpl impleme this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, promotionMessage, coupon.getStartTime().getTime(), couponVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), + DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), DateUtil.getDelayTime(couponVO.getStartTime().getTime()), rocketmqCustomProperties.getPromotionTopic()); return couponVO; @@ -145,7 +144,7 @@ public class CouponServiceImpl extends ServiceImpl impleme this.timeTrigger.edit(TimeExecuteConstant.PROMOTION_EXECUTOR, promotionMessage, couponVO.getStartTime().getTime(), couponVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), + DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), DateUtil.getDelayTime(couponVO.getStartTime().getTime()), rocketmqCustomProperties.getPromotionTopic()); } @@ -167,7 +166,7 @@ public class CouponServiceImpl extends ServiceImpl impleme this.mongoTemplate.remove(new Query().addCriteria(Criteria.where("id").is(id)), CouponVO.class); this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, couponVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.COUPON.name() + couponVO.getId())), + DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (PromotionTypeEnum.COUPON.name() + couponVO.getId())), rocketmqCustomProperties.getPromotionTopic()); return result; } diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/FullDiscountServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/FullDiscountServiceImpl.java index e997dc13..9a6f3260 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/FullDiscountServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/FullDiscountServiceImpl.java @@ -1,7 +1,7 @@ package cn.lili.modules.promotion.serviceimpl; 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.exception.ServiceException; import cn.lili.common.trigger.interfaces.TimeTrigger; @@ -103,10 +103,10 @@ public class FullDiscountServiceImpl extends ServiceImpl impl promotionMessage, pintuanVO.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()), rocketmqCustomProperties.getPromotionTopic()); } - return result; } @@ -390,10 +389,10 @@ public class PintuanServiceImpl extends ServiceImpl impl TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, pintuan.getStartTime().getTime(), promotionMessage, - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), + DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), rocketmqCustomProperties.getPromotionTopic()); // 发送促销活动开始的延时任务 - this.timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(pintuan.getStartTime().getTime())); + this.timeTrigger.addDelay(timeTriggerMsg); } /** @@ -405,7 +404,7 @@ public class PintuanServiceImpl extends ServiceImpl impl private void removePintuanGoodsFromEs(String id, Long originStartTime) { this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, originStartTime, - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.PINTUAN.name() + id)), + DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (PromotionTypeEnum.PINTUAN.name() + id)), rocketmqCustomProperties.getPromotionTopic()); } diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsServiceImpl.java index 7c078748..b9b83bf2 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PointsGoodsServiceImpl.java @@ -2,7 +2,7 @@ package cn.lili.modules.promotion.serviceimpl; import cn.hutool.core.util.StrUtil; 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.exception.ServiceException; import cn.lili.common.trigger.interfaces.TimeTrigger; @@ -120,7 +120,7 @@ public class PointsGoodsServiceImpl extends ServiceImpl impl promotionMessage, seckill.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()), rocketmqCustomProperties.getPromotionTopic()); } @@ -180,7 +180,7 @@ public class SeckillServiceImpl extends ServiceImpl impl this.promotionGoodsService.update(promotionGoodsQueryWrapper); this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, seckill.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckill.getId())), + DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckill.getId())), rocketmqCustomProperties.getPromotionTopic()); } else { throw new ServiceException("该限时抢购活动的状态不能删除"); @@ -223,7 +223,7 @@ public class SeckillServiceImpl extends ServiceImpl impl } this.timeTrigger.delete(TimeExecuteConstant.PROMOTION_EXECUTOR, seckillVO.getStartTime().getTime(), - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckillVO.getId())), + DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (PromotionTypeEnum.SECKILL.name() + seckillVO.getId())), rocketmqCustomProperties.getPromotionTopic()); } } else { @@ -245,10 +245,10 @@ public class SeckillServiceImpl extends ServiceImpl impl TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, seckill.getStartTime().getTime(), promotionMessage, - DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), + DelayQueueTools.wrapperUniqueKey(PromotionDelayTypeEnums.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())), rocketmqCustomProperties.getPromotionTopic()); // 发送促销活动开始的延时任务 - this.timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(seckill.getStartTime().getTime())); + this.timeTrigger.addDelay(timeTriggerMsg); } /** diff --git a/framework/src/test/java/cn/lili/test/trigger/TestTimeTrigger.java b/framework/src/test/java/cn/lili/test/trigger/TestTimeTrigger.java deleted file mode 100644 index 71c45ecb..00000000 --- a/framework/src/test/java/cn/lili/test/trigger/TestTimeTrigger.java +++ /dev/null @@ -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); - } -} From fcca848e4055451101db923ea62da6c309e76f7a Mon Sep 17 00:00:00 2001 From: Chopper Date: Fri, 11 Jun 2021 12:00:01 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java index 1a8c7788..6959fc89 100644 --- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java @@ -39,7 +39,6 @@ import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.lang.reflect.Field; import java.util.*; import java.util.stream.Collectors; From 8913f37f33422515dab17f7df807f36c61a948ea Mon Sep 17 00:00:00 2001 From: Chopper Date: Fri, 11 Jun 2021 14:48:20 +0800 Subject: [PATCH 4/7] =?UTF-8?q?qq=E8=81=94=E5=90=88=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/lili/modules/connect/util/ConnectUtil.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java b/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java index f0234882..3b50fe43 100644 --- a/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java +++ b/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java @@ -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.ConnectAuthUser; 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.AuthWeChatPCRequest; import cn.lili.modules.connect.request.AuthWeChatRequest; @@ -170,7 +171,7 @@ public class ConnectUtil { QQConnectSetting qqConnectSetting = JSONUtil.toBean(setting.getSettingValue(), QQConnectSetting.class); for (QQConnectSettingItem qqConnectSettingItem : qqConnectSetting.getQqConnectSettingItemList()) { if (qqConnectSettingItem.getClientType().equals(ClientTypeEnum.PC.name())) { - authRequest = new AuthWeChatPCRequest(AuthConfig.builder() + authRequest = new AuthQQRequest(AuthConfig.builder() .clientId(qqConnectSettingItem.getAppId()) .clientSecret(qqConnectSettingItem.getAppKey()) .redirectUri(getRedirectUri(authInterface)) From ee01a65d92f27567f147d50c8da83ac17f492991 Mon Sep 17 00:00:00 2001 From: Chopper Date: Fri, 11 Jun 2021 15:39:55 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E4=B9=B0=E5=AE=B6=E7=AB=AF=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E8=B7=B3=E8=BD=AC=E9=97=AE=E9=A2=98=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connect/ConnectBuyerWebController.java | 5 +- .../modules/connect/util/ConnectUtil.java | 49 +++++++++++++++++-- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java b/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java index 0f475c12..d4315341 100644 --- a/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java +++ b/buyer-api/src/main/java/cn/lili/controller/passport/connect/ConnectBuyerWebController.java @@ -20,6 +20,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -60,8 +61,8 @@ public class ConnectBuyerWebController { @ApiOperation(value = "信任登录统一回调地址", hidden = true) @GetMapping("/callback/{type}") - public void callBack(@PathVariable String type, AuthCallback callback, HttpServletResponse httpServletResponse) throws IOException { - connectUtil.callback(type, callback, httpServletResponse); + public void callBack(@PathVariable String type, AuthCallback callback, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { + connectUtil.callback(type, callback,httpServletRequest, httpServletResponse); } @ApiOperation(value = "信任登录响应结果获取") diff --git a/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java b/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java index 3b50fe43..a2f25f5c 100644 --- a/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java +++ b/framework/src/main/java/cn/lili/modules/connect/util/ConnectUtil.java @@ -4,9 +4,9 @@ import cn.hutool.json.JSONUtil; import cn.lili.common.cache.Cache; import cn.lili.common.cache.CachePrefix; import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; import cn.lili.common.exception.ServiceException; import cn.lili.common.token.Token; -import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; import cn.lili.config.properties.ApiProperties; import cn.lili.config.properties.DomainProperties; @@ -32,8 +32,11 @@ import cn.lili.modules.system.service.SettingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * 联合登陆工具类 @@ -70,9 +73,10 @@ public class ConnectUtil { * @param type * @param callback * @param httpServletResponse + * @param httpServletRequest * @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); AuthResponse response = authRequest.login(callback); ResultMessage resultMessage; @@ -94,8 +98,11 @@ public class ConnectUtil { //缓存写入登录结果,300秒有效 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 { httpServletResponse.sendRedirect(url); } catch (Exception e) { @@ -222,6 +229,40 @@ public class ConnectUtil { 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; + } + } } From 6ef71d9dfe52cbc6fb020476ae2cb0ef6a44c3e4 Mon Sep 17 00:00:00 2001 From: lifenlong Date: Sat, 12 Jun 2021 15:16:22 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E8=A7=A3=E5=86=B3PC=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E4=B8=8D=E4=BC=A0=E9=80=92=E5=BC=80=E5=90=AF=E5=85=B3=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../page/serviceimpl/PageDataServiceImpl.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/framework/src/main/java/cn/lili/modules/page/serviceimpl/PageDataServiceImpl.java b/framework/src/main/java/cn/lili/modules/page/serviceimpl/PageDataServiceImpl.java index 9db2181d..60a14f62 100644 --- a/framework/src/main/java/cn/lili/modules/page/serviceimpl/PageDataServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/page/serviceimpl/PageDataServiceImpl.java @@ -51,10 +51,10 @@ public class PageDataServiceImpl extends ServiceImpl i @Override public PageData addPageData(PageData pageData) { //如果页面为发布,则关闭其他页面,开启此页面 - if(pageData.getPageShow().equals(SwitchEnum.OPEN.name())){ + if (pageData.getPageShow().equals(SwitchEnum.OPEN.name())) { LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); - lambdaUpdateWrapper.eq(PageData::getPageType,pageData.getPageType()); - lambdaUpdateWrapper.eq(PageData::getPageClientType,pageData.getPageClientType()); + lambdaUpdateWrapper.eq(PageData::getPageType, pageData.getPageType()); + lambdaUpdateWrapper.eq(PageData::getPageClientType, pageData.getPageClientType()); lambdaUpdateWrapper.set(PageData::getPageShow, SwitchEnum.CLOSE.name()); this.update(lambdaUpdateWrapper); } @@ -65,12 +65,14 @@ public class PageDataServiceImpl extends ServiceImpl i @Override public PageData updatePageData(PageData pageData) { //如果页面为发布,则关闭其他页面,开启此页面 - if(pageData.getPageShow().equals(SwitchEnum.OPEN.name())){ + if (pageData.getPageShow() != null && pageData.getPageShow().equals(SwitchEnum.OPEN.name())) { LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); - lambdaUpdateWrapper.eq(PageData::getPageType,pageData.getPageType()); - lambdaUpdateWrapper.eq(PageData::getPageClientType,pageData.getPageClientType()); + lambdaUpdateWrapper.eq(PageData::getPageType, pageData.getPageType()); + lambdaUpdateWrapper.eq(PageData::getPageClientType, pageData.getPageClientType()); lambdaUpdateWrapper.set(PageData::getPageShow, SwitchEnum.CLOSE.name()); this.update(lambdaUpdateWrapper); + } else { + pageData.setPageShow(SwitchEnum.CLOSE.name()); } LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); lambdaUpdateWrapper.set(PageData::getPageData, pageData.getPageData()); From 2472cfd93be9dbbeb63b0af75a88e9655f90cda5 Mon Sep 17 00:00:00 2001 From: Chopper Date: Sun, 13 Jun 2021 14:48:45 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E9=97=AE=E9=A2=98=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../promotion/PromotionEverydayExecute.java | 119 ++++++++++-------- 1 file changed, 68 insertions(+), 51 deletions(-) diff --git a/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java b/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java index 946931a3..641dd29b 100644 --- a/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java +++ b/consumer/src/main/java/cn/lili/timetask/handler/impl/promotion/PromotionEverydayExecute.java @@ -12,6 +12,7 @@ import cn.lili.modules.search.service.EsGoodsIndexService; import cn.lili.timetask.handler.EveryDayExecute; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; @@ -28,8 +29,8 @@ import java.util.List; * @author Chopper * @date 2021/3/18 3:23 下午 */ +@Slf4j @Component - public class PromotionEverydayExecute implements EveryDayExecute { //Mongo @@ -60,80 +61,94 @@ public class PromotionEverydayExecute implements EveryDayExecute { */ @Override public void execute() { - + //mongo查询条件 Query query = new Query(); -// 结束条件 活动关闭/活动结束 + //结束条件 活动未关闭/活动未结束 query.addCriteria(Criteria.where("promotionStatus").ne(PromotionStatusEnum.END.name()) .orOperator(Criteria.where("promotionStatus").ne(PromotionStatusEnum.CLOSE.name()))); + //结束条件 活动结束时间大于当前时间 query.addCriteria(Criteria.where("endTime").lt(new Date())); - List promotionIds = new ArrayList<>(); - - //关闭满减活动 - List fullDiscountVOS = mongoTemplate.find(query, FullDiscountVO.class); - if (!fullDiscountVOS.isEmpty()) { - List 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()); + try { + //关闭满减活动 + List fullDiscountVOS = mongoTemplate.find(query, FullDiscountVO.class); + if (!fullDiscountVOS.isEmpty()) { + List 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()); } - mongoTemplate.save(vo); - ids.add(vo.getId()); + fullDiscountService.update(this.getUpdatePromotionWrapper(ids)); } - fullDiscountService.update(this.getUpdatePromotionWrapper(ids)); - promotionIds.addAll(ids); + } catch (Exception e) { + log.error("满减活动关闭错误", e); } - //关闭拼团活动 - List pintuanVOS = mongoTemplate.find(query, PintuanVO.class); - if (!pintuanVOS.isEmpty()) { - //准备修改活动的id - List 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()); + try { + //关闭拼团活动 + List pintuanVOS = mongoTemplate.find(query, PintuanVO.class); + if (!pintuanVOS.isEmpty()) { + //准备修改活动的id + List 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()); } - mongoTemplate.save(vo); - ids.add(vo.getId()); + pintuanService.update(this.getUpdatePromotionWrapper(ids)); + //将活动商品对照表进行结束处理 + promotionGoodsService.update(this.getUpdatePromotionGoodsWrapper(ids)); } - pintuanService.update(this.getUpdatePromotionWrapper(ids)); - promotionIds.addAll(ids); + } catch (Exception e) { + log.error("拼团活动关闭错误", e); } - //关闭优惠券活动 - List couponVOS = mongoTemplate.find(query, CouponVO.class); - if (!couponVOS.isEmpty()) { - List 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()); + try { + //关闭优惠券活动 + List couponVOS = mongoTemplate.find(query, CouponVO.class); + if (!couponVOS.isEmpty()) { + List 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()); } - mongoTemplate.save(vo); - ids.add(vo.getId()); + couponService.update(this.getUpdatePromotionWrapper(ids)); + LambdaUpdateWrapper memberCouponLambdaUpdateWrapper = new LambdaUpdateWrapper().in(MemberCoupon::getCouponId, ids).set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name()); + memberCouponService.update(memberCouponLambdaUpdateWrapper); + //将活动商品对照表进行结束处理 + promotionGoodsService.update(this.getUpdatePromotionGoodsWrapper(ids)); } - couponService.update(this.getUpdatePromotionWrapper(ids)); - LambdaUpdateWrapper memberCouponLambdaUpdateWrapper = new LambdaUpdateWrapper().in(MemberCoupon::getCouponId, ids).set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name()); - memberCouponService.update(memberCouponLambdaUpdateWrapper); - promotionIds.addAll(ids); + } catch (Exception e) { + log.error("优惠券活动关闭错误", e); } - promotionGoodsService.update(this.getUpdatePromotionGoodsWrapper(promotionIds)); } /** * 获取促销修改查询条件 修改活动状态 + * * @param ids * @return */ @@ -143,8 +158,10 @@ public class PromotionEverydayExecute implements EveryDayExecute { updateWrapper.set("promotion_status", PromotionStatusEnum.END.name()); return updateWrapper; } + /** * 获取商品的促销修改查询条件 修改商品状态 + * * @param ids * @return */