diff --git a/src/main/java/com/peanut/config/DelayQueueConfig.java b/src/main/java/com/peanut/config/DelayQueueConfig.java index 3b75d762..da645339 100644 --- a/src/main/java/com/peanut/config/DelayQueueConfig.java +++ b/src/main/java/com/peanut/config/DelayQueueConfig.java @@ -54,13 +54,15 @@ public class DelayQueueConfig { public static final String ORDER_CANCEL_DEAD_LETTER_QUEUE = "order_cancel_dead_letter_queue"; - //超V过期队列+死信 + //超V过期延迟队列 public static final String USERVIP_QUEUE = "uservip_queue"; public static final String USERVIP_EXCHANGE = "uservip_exchange"; public static final String USERVIP_ROUTING_KEY = "uservip_routingKey"; - public static final String USERVIP_DEAD_LETTER_QUEUE = "uservip_dead_letter_queue"; - public static final String USERVIP_DEAD_LETTER_EXCHANGE = "uservip_dead_letter_exchange"; - public static final String USERVIP_DEAD_LETTER_ROUTING_KEY = "uservip_dead_letter_routingKey"; + + //课程过期延迟队列 + public static final String COURSE_QUEUE = "course_queue"; + public static final String COURSE_EXCHANGE = "course_exchange"; + public static final String COURSE_ROUTING_KEY = "course_routingKey"; /** * 快递队列 @@ -225,44 +227,51 @@ public class DelayQueueConfig { .with(ORDER_CANCEL_DEAD_LETTER_ROUTING_KEY); } - //超V过期队列+死信 + //超V过期延迟队列 @Bean public Queue uservipQueue() { - Map arguments = new HashMap<>(2); - // 绑定死信交换机 - arguments.put("x-dead-letter-exchange", USERVIP_DEAD_LETTER_EXCHANGE); - // 绑定我们的路由key - arguments.put("x-dead-letter-routing-key", USERVIP_DEAD_LETTER_ROUTING_KEY); - return new Queue(USERVIP_QUEUE, true, false, false, arguments); + return new Queue(USERVIP_QUEUE, true, false, false); } @Bean - public DirectExchange uservipExchange() { - return new DirectExchange(USERVIP_EXCHANGE); + public CustomExchange uservipExchange() { + Map args = new HashMap<>(); + //自定义交换机的类型 + args.put("x-delayed-type", "direct"); + return new CustomExchange(USERVIP_EXCHANGE, "x-delayed-message", true, false,args); } @Bean public Binding uservipBinding() { return BindingBuilder .bind(uservipQueue()) .to(uservipExchange()) - .with(USERVIP_ROUTING_KEY); + .with(USERVIP_ROUTING_KEY) + .noargs(); + } + + + //课程过期延迟队列 + @Bean + public Queue courseQueue() { + return new Queue(COURSE_QUEUE, true, false, false); } @Bean - public Queue uservipDeadLetterQueue() { - return new Queue(USERVIP_DEAD_LETTER_QUEUE); + public CustomExchange courseExchange() { + Map args = new HashMap<>(); + //自定义交换机的类型 + args.put("x-delayed-type", "direct"); + return new CustomExchange(COURSE_EXCHANGE, "x-delayed-message", true, false,args); } @Bean - public DirectExchange uservipDeadLetterExchange() { - return new DirectExchange(USERVIP_DEAD_LETTER_EXCHANGE); - } - @Bean - public Binding uservipDeadBinding() { + public Binding courseBinding() { return BindingBuilder - .bind(uservipDeadLetterQueue()) - .to(uservipDeadLetterExchange()) - .with(USERVIP_DEAD_LETTER_ROUTING_KEY); + .bind(courseQueue()) + .to(courseExchange()) + .with(COURSE_ROUTING_KEY) + .noargs(); } + @Bean public Queue FMSQueue() { return new Queue(FMS_QUEUE); diff --git a/src/main/java/com/peanut/modules/job/task/CourseTask.java b/src/main/java/com/peanut/modules/job/task/CourseTask.java index bcaeff2e..80b1fbcb 100644 --- a/src/main/java/com/peanut/modules/job/task/CourseTask.java +++ b/src/main/java/com/peanut/modules/job/task/CourseTask.java @@ -1,12 +1,14 @@ package com.peanut.modules.job.task; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.peanut.config.DelayQueueConfig; import com.peanut.modules.common.dao.UserCourseBuyDao; import com.peanut.modules.common.entity.UserCourseBuyEntity; import org.apache.commons.lang.time.DateUtils; +import org.springframework.amqp.core.MessagePostProcessor; +import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; - import java.util.Date; import java.util.List; @@ -15,34 +17,51 @@ public class CourseTask implements ITask{ @Autowired private UserCourseBuyDao userCourseBuyDao; + @Autowired + private RabbitTemplate rabbitTemplate; @Override public void run(String params) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper(); - wrapper.eq(UserCourseBuyEntity::getUserId,params); List list = userCourseBuyDao.selectList(wrapper); if (list.size() > 0) { for (UserCourseBuyEntity userCourseBuyEntity : list) { - if (userCourseBuyEntity.getStartTime()==null) { - //未开始学习,超过一年自动开始 - if (DateUtils.addYears(userCourseBuyEntity.getCreateTime(),1).getTime()<=new Date().getTime()){ - userCourseBuyEntity.setStartTime(DateUtils.addYears(userCourseBuyEntity.getCreateTime(),1)); - userCourseBuyEntity.setEndTime(DateUtils.addDays(userCourseBuyEntity.getStartTime(),userCourseBuyEntity.getDays())); - userCourseBuyDao.updateById(userCourseBuyEntity); - } + if (userCourseBuyEntity.getEndTime()!=null&&userCourseBuyEntity.getEndTime().getTime() { + message.getMessageProperties().setDelay((int)date); + return message; + }; } } diff --git a/src/main/java/com/peanut/modules/job/task/UserVipTask.java b/src/main/java/com/peanut/modules/job/task/UserVipTask.java index 347be1f9..af840480 100644 --- a/src/main/java/com/peanut/modules/job/task/UserVipTask.java +++ b/src/main/java/com/peanut/modules/job/task/UserVipTask.java @@ -35,7 +35,6 @@ public class UserVipTask implements ITask{ public void run(String params) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper(); wrapper.eq(UserVip::getState,0); - wrapper.eq(UserVip::getUserId,params); List list = vipService.list(wrapper); if (list.size() > 0) { for (UserVip userVip : list) { @@ -45,35 +44,34 @@ public class UserVipTask implements ITask{ vipService.saveOrUpdate(userVip); user.setVip("0"); userService.saveOrUpdate(user); - }else if (DateUtils.isSameDay(DateUtils.addDays(new Date(),60),userVip.getEndTime())) { - try { - if (StringUtils.isNotEmpty(user.getTel())){ - userService.sendCodeForRegister(user.getTel(),"VIPWillExpire",86); - }else if (StringUtils.isNotEmpty(user.getEmail())) { - MailUtil.sendMail("太湖超V提醒","超V还有2月到期",user.getEmail()); - } - }catch (Exception e) { - logger.error("userVipTask定时任务超V提醒出错,错误为:{}", e.getMessage()); - } - }else if (DateUtils.isSameDay(DateUtils.addDays(new Date(),30),userVip.getEndTime())) { - try { - if (StringUtils.isNotEmpty(user.getTel())){ - userService.sendCodeForRegister(user.getTel(),"VIPWillExpire",86); - }else if (StringUtils.isNotEmpty(user.getEmail())) { - MailUtil.sendMail("太湖超V提醒","超V还有一月到期",user.getEmail()); - } - }catch (Exception e) { - logger.error("userVipTask定时任务超V提醒出错,错误为:{}", e.getMessage()); - } - }else if (DateUtils.isSameDay(DateUtils.addMinutes(new Date(),3),userVip.getEndTime())) { +// }else if (DateUtils.isSameDay(DateUtils.addDays(new Date(),60),userVip.getEndTime())) { +// try { +// if (StringUtils.isNotEmpty(user.getTel())){ +// userService.sendCodeForRegister(user.getTel(),"VIPWillExpire",86); +// }else if (StringUtils.isNotEmpty(user.getEmail())) { +// MailUtil.sendMail("太湖超V提醒","超V还有2月到期",user.getEmail()); +// } +// }catch (Exception e) { +// logger.error("userVipTask定时任务超V提醒出错,错误为:{}", e.getMessage()); +// } +// }else if (DateUtils.isSameDay(DateUtils.addDays(new Date(),30),userVip.getEndTime())) { +// try { +// if (StringUtils.isNotEmpty(user.getTel())){ +// userService.sendCodeForRegister(user.getTel(),"VIPWillExpire",86); +// }else if (StringUtils.isNotEmpty(user.getEmail())) { +// MailUtil.sendMail("太湖超V提醒","超V还有一月到期",user.getEmail()); +// } +// }catch (Exception e) { +// logger.error("userVipTask定时任务超V提醒出错,错误为:{}", e.getMessage()); +// } + }else if (DateUtils.isSameDay(DateUtils.addDays(new Date(),2),userVip.getEndTime())) { rabbitTemplate.convertAndSend( DelayQueueConfig.USERVIP_EXCHANGE, DelayQueueConfig.USERVIP_ROUTING_KEY, userVip.getId(), messagePostProcessor(userVip.getEndTime().getTime()-new Date().getTime()) ); - System.out.println("----------------------------------------"); - System.out.println("会员还剩7天,加入队列"); + System.out.println("-------------------------会员还剩2天,加入队列"); } } } @@ -81,8 +79,7 @@ public class UserVipTask implements ITask{ private MessagePostProcessor messagePostProcessor(long date) { return message -> { - //设置有效期7天 - message.getMessageProperties().setExpiration(String.valueOf(date)); + message.getMessageProperties().setDelay((int)date); return message; }; } diff --git a/src/main/java/com/peanut/modules/master/controller/CourseController.java b/src/main/java/com/peanut/modules/master/controller/CourseController.java index 97ac8430..26062c3e 100644 --- a/src/main/java/com/peanut/modules/master/controller/CourseController.java +++ b/src/main/java/com/peanut/modules/master/controller/CourseController.java @@ -111,7 +111,14 @@ public class CourseController { @RequestMapping("/addCourseCatalogueChapter") public R addCourseCatalogueChapter(@RequestBody CourseCatalogueChapterEntity courseCatalogueChapterEntity){ - courseCatalogueChapterService.save(courseCatalogueChapterEntity); + if (courseCatalogueChapterService.save(courseCatalogueChapterEntity)){ + if (courseCatalogueChapterEntity.getVideoList()!=null&&courseCatalogueChapterEntity.getVideoList().size() > 0){ + for (CourseCatalogueChapterVideoEntity c:courseCatalogueChapterEntity.getVideoList()) { + c.setChapterId(courseCatalogueChapterEntity.getId()); + courseCatalogueChapterVideoService.save(c); + } + } + } return R.ok(); } diff --git a/src/main/java/com/peanut/modules/master/service/impl/CourseCatalogueChapterVideoServiceImpl.java b/src/main/java/com/peanut/modules/master/service/impl/CourseCatalogueChapterVideoServiceImpl.java index f3eb8aae..e27d77a7 100644 --- a/src/main/java/com/peanut/modules/master/service/impl/CourseCatalogueChapterVideoServiceImpl.java +++ b/src/main/java/com/peanut/modules/master/service/impl/CourseCatalogueChapterVideoServiceImpl.java @@ -74,7 +74,7 @@ public class CourseCatalogueChapterVideoServiceImpl extends ServiceImpl userCourseBuyEntities = userCourseBuyDao.selectList(new LambdaQueryWrapper() .eq(UserCourseBuyEntity::getUserId, uId) .eq(UserCourseBuyEntity::getCatalogueId, courseCatalogueEntity.getId()) - .eq(UserCourseBuyEntity::getEndTime,null)); + .isNull(UserCourseBuyEntity::getEndTime)); if (userCourseBuyEntities.size()>0){ for (UserCourseBuyEntity u:userCourseBuyEntities){ u.setStartTime(new Date()); diff --git a/src/main/java/com/peanut/modules/mq/Consumer/CourseConsumer.java b/src/main/java/com/peanut/modules/mq/Consumer/CourseConsumer.java new file mode 100644 index 00000000..b5e26995 --- /dev/null +++ b/src/main/java/com/peanut/modules/mq/Consumer/CourseConsumer.java @@ -0,0 +1,33 @@ +package com.peanut.modules.mq.Consumer; + +import com.peanut.config.DelayQueueConfig; +import com.peanut.modules.common.dao.UserCourseBuyDao; +import com.peanut.modules.common.entity.UserCourseBuyEntity; +import org.apache.commons.lang.time.DateUtils; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +//购买的课程到期操作 +@Component +public class CourseConsumer { + + @Autowired + private UserCourseBuyDao userCourseBuyDao; + + @RabbitListener(queues = DelayQueueConfig.COURSE_QUEUE) + public void courseConsumer(String userCourseBuyId) { + UserCourseBuyEntity userCourseBuyEntity = userCourseBuyDao.selectById(userCourseBuyId); + if (userCourseBuyEntity.getStartTime()==null) { + //未开始学习,超过一年自动开始 + userCourseBuyEntity.setStartTime(DateUtils.addYears(userCourseBuyEntity.getCreateTime(),1)); + userCourseBuyEntity.setEndTime(DateUtils.addDays(userCourseBuyEntity.getStartTime(),userCourseBuyEntity.getDays())); + userCourseBuyDao.updateById(userCourseBuyEntity); + }else { + //结束时间,过期删除 + userCourseBuyDao.deleteById(userCourseBuyEntity.getId()); + } + } + +} diff --git a/src/main/java/com/peanut/modules/mq/Consumer/UserVipConsumer.java b/src/main/java/com/peanut/modules/mq/Consumer/UserVipConsumer.java index f8bc3102..91da1f53 100644 --- a/src/main/java/com/peanut/modules/mq/Consumer/UserVipConsumer.java +++ b/src/main/java/com/peanut/modules/mq/Consumer/UserVipConsumer.java @@ -18,7 +18,7 @@ public class UserVipConsumer { @Autowired private MyUserDao userDao; - @RabbitListener(queues = DelayQueueConfig.USERVIP_DEAD_LETTER_QUEUE) + @RabbitListener(queues = DelayQueueConfig.USERVIP_QUEUE) public void userVipConsumer(String userVipId) { UserVip userVip = userVipDao.selectById(userVipId); if(userVip == null){ @@ -29,7 +29,7 @@ public class UserVipConsumer { MyUserEntity user = userDao.selectById(userVip.getUserId()); user.setVip("0"); userDao.updateById(user); - System.out.println("vip更新完成"); + System.out.println(user.getName()+"-"+user.getTel()+"-"+user.getEmail()+"超v过期,vip更新完成"); } } diff --git a/src/main/java/com/peanut/modules/sociology/service/impl/CourseServiceImpl.java b/src/main/java/com/peanut/modules/sociology/service/impl/CourseServiceImpl.java index d5b0e9c6..90e75936 100644 --- a/src/main/java/com/peanut/modules/sociology/service/impl/CourseServiceImpl.java +++ b/src/main/java/com/peanut/modules/sociology/service/impl/CourseServiceImpl.java @@ -293,7 +293,7 @@ public class CourseServiceImpl extends ServiceImpl impl List userVipList = userVipDao.selectList(new LambdaQueryWrapper().eq(UserVip::getUserId, user.getId())); List userCourseBuyList = userCourseBuyDao.selectList(new LambdaQueryWrapper().eq(UserCourseBuyEntity::getUserId, ShiroUtils.getUId()).eq(UserCourseBuyEntity::getCatalogueId, courseCatalogueEntity.getId())); //完成度、上次学习时间 - catalogueCompletion(courseCatalogueEntity); +// catalogueCompletion(courseCatalogueEntity); //是否购买,生效时间 if ("1".equals(user.getVip())||"3".equals(user.getVip())){ //是超级会员或者国学会员