From 4b70cc60a7a17482f61bbe972b893cea5dc86b60 Mon Sep 17 00:00:00 2001 From: xiaofanku Date: Sun, 27 Sep 2020 11:47:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0VIP=E4=BA=A4=E6=98=93?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core.impl/src/main/java/module-info.java | 1 + letterbox.impl/src/main/java/module-info.java | 1 + .../member/impl/MemberTaskScheduleConfig.java | 29 +++++++--- .../forum/member/impl/dao/MemberDaoImpl.java | 21 ++++--- .../dao/MemberPenalizeRecordsDaoImpl.java | 6 +- ...> PenalizeResetMemberStatusQuartzJob.java} | 6 +- .../quartz/ResetMemberGroupQuartzJob.java | 20 ------- .../VipExchangeResetMemberGroupQuartzJob.java | 58 +++++++++++++++++++ member.impl/src/main/java/module-info.java | 1 + .../apobates/forum/member/dao/MemberDao.java | 15 +++-- .../member/dao/MemberPenalizeRecordsDao.java | 4 +- .../dao/MemberVipExchangeRecordsDao.java | 2 +- 12 files changed, 114 insertions(+), 50 deletions(-) rename member.impl/src/main/java/com/apobates/forum/member/impl/quartz/{PenalizeQuartzJob.java => PenalizeResetMemberStatusQuartzJob.java} (92%) delete mode 100644 member.impl/src/main/java/com/apobates/forum/member/impl/quartz/ResetMemberGroupQuartzJob.java create mode 100644 member.impl/src/main/java/com/apobates/forum/member/impl/quartz/VipExchangeResetMemberGroupQuartzJob.java diff --git a/core.impl/src/main/java/module-info.java b/core.impl/src/main/java/module-info.java index 338758ef..4b014f28 100644 --- a/core.impl/src/main/java/module-info.java +++ b/core.impl/src/main/java/module-info.java @@ -11,6 +11,7 @@ open module CoreImpl { requires Member; requires Event; requires Utils; + requires java.persistence; exports com.apobates.forum.core.impl; exports com.apobates.forum.core.impl.service; } \ No newline at end of file diff --git a/letterbox.impl/src/main/java/module-info.java b/letterbox.impl/src/main/java/module-info.java index b56aad4d..7c6cb17f 100644 --- a/letterbox.impl/src/main/java/module-info.java +++ b/letterbox.impl/src/main/java/module-info.java @@ -8,6 +8,7 @@ open module LetterboxImpl { requires Attention; requires Utils; requires Event; + requires java.persistence; exports com.apobates.forum.letterbox.impl; exports com.apobates.forum.letterbox.impl.service; } \ No newline at end of file diff --git a/member.impl/src/main/java/com/apobates/forum/member/impl/MemberTaskScheduleConfig.java b/member.impl/src/main/java/com/apobates/forum/member/impl/MemberTaskScheduleConfig.java index dcdc109a..eafda929 100644 --- a/member.impl/src/main/java/com/apobates/forum/member/impl/MemberTaskScheduleConfig.java +++ b/member.impl/src/main/java/com/apobates/forum/member/impl/MemberTaskScheduleConfig.java @@ -2,7 +2,8 @@ package com.apobates.forum.member.impl; import com.apobates.forum.member.impl.quartz.AutowiringSpringBeanJobFactory; import com.apobates.forum.member.impl.quartz.DuplicateOLRecordsQuartzJob; -import com.apobates.forum.member.impl.quartz.PenalizeQuartzJob; +import com.apobates.forum.member.impl.quartz.PenalizeResetMemberStatusQuartzJob; +import com.apobates.forum.member.impl.quartz.VipExchangeResetMemberGroupQuartzJob; import java.io.IOException; import java.util.Properties; import javax.sql.DataSource; @@ -32,13 +33,24 @@ import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean; @Configuration public class MemberTaskScheduleConfig { private final static Logger logger = LoggerFactory.getLogger(MemberTaskScheduleConfig.class); - - // + //loop Job + @Bean("vipExchangeJob") + public JobDetailFactoryBean vipExchangeScheduleJob(){ + JobDetailFactoryBean factoryBean = new JobDetailFactoryBean(); + factoryBean.setJobClass(VipExchangeResetMemberGroupQuartzJob.class); + factoryBean.setDurability(true); + return factoryBean; + } + @Bean(name = "vipExchangeJobTrigger") + public SimpleTriggerFactoryBean vipExchangeScheduleJobTrigger(@Qualifier("vipExchangeJob") JobDetail jobDetail) { + return createTrigger(jobDetail, 60000); + } + + //loop Job @Bean("penalizeJob") public JobDetailFactoryBean penalizeScheduleJob() { JobDetailFactoryBean factoryBean = new JobDetailFactoryBean(); - factoryBean.setJobClass(PenalizeQuartzJob.class); - // job has to be durable to be stored in DB: + factoryBean.setJobClass(PenalizeResetMemberStatusQuartzJob.class); factoryBean.setDurability(true); return factoryBean; } @@ -46,6 +58,8 @@ public class MemberTaskScheduleConfig { public SimpleTriggerFactoryBean penalizeScheduleJobTrigger(@Qualifier("penalizeJob") JobDetail jobDetail) { return createTrigger(jobDetail, 60000); } + + //loop Job @Bean("duplicateOLRecordsJob") public JobDetailFactoryBean duplicateOLRecordsScheduleJob() { JobDetailFactoryBean factoryBean = new JobDetailFactoryBean(); @@ -71,14 +85,15 @@ public class MemberTaskScheduleConfig { DataSource dataSource, JobFactory jobFactory, @Qualifier("penalizeJobTrigger") SimpleTriggerFactoryBean penalizeJobTrigger, - @Qualifier("duplicateOLRecordsJobTrigger") SimpleTriggerFactoryBean duplicateOLRecordsJobTrigger) throws IOException { + @Qualifier("duplicateOLRecordsJobTrigger") SimpleTriggerFactoryBean duplicateOLRecordsJobTrigger, + @Qualifier("vipExchangeJobTrigger") SimpleTriggerFactoryBean vipExchangeScheduleJobTrigger) throws IOException { SchedulerFactoryBean factory = new SchedulerFactoryBean(); // this allows to update triggers in DB when updating settings in config file: factory.setOverwriteExistingJobs(true); factory.setDataSource(dataSource); factory.setJobFactory(jobFactory); factory.setQuartzProperties(quartzProperties()); - factory.setTriggers(penalizeJobTrigger.getObject(), duplicateOLRecordsJobTrigger.getObject()); + factory.setTriggers(penalizeJobTrigger.getObject(), duplicateOLRecordsJobTrigger.getObject(), vipExchangeScheduleJobTrigger.getObject()); return factory; } @Bean diff --git a/member.impl/src/main/java/com/apobates/forum/member/impl/dao/MemberDaoImpl.java b/member.impl/src/main/java/com/apobates/forum/member/impl/dao/MemberDaoImpl.java index 07a0f4e7..12aff145 100644 --- a/member.impl/src/main/java/com/apobates/forum/member/impl/dao/MemberDaoImpl.java +++ b/member.impl/src/main/java/com/apobates/forum/member/impl/dao/MemberDaoImpl.java @@ -8,18 +8,13 @@ import com.apobates.forum.member.entity.MemberStatusEnum; import com.apobates.forum.utils.Commons; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Optional; -import java.util.TreeMap; import java.util.stream.Stream; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; @@ -166,7 +161,19 @@ public class MemberDaoImpl implements MemberDao { } return affect; } - + + @Transactional(propagation = Propagation.REQUIRED) + @Override + public int editMemberGroup(Set updateMemberIds) { + int affect = 0; + for (Long memberId : updateMemberIds) { + if (editMemberGroup(memberId, MemberGroupEnum.CARD)) { + affect += 1; + } + } + return affect; + } + @Override public Optional getAvatar(long id) { try { diff --git a/member.impl/src/main/java/com/apobates/forum/member/impl/dao/MemberPenalizeRecordsDaoImpl.java b/member.impl/src/main/java/com/apobates/forum/member/impl/dao/MemberPenalizeRecordsDaoImpl.java index 240fb023..a2cafd78 100644 --- a/member.impl/src/main/java/com/apobates/forum/member/impl/dao/MemberPenalizeRecordsDaoImpl.java +++ b/member.impl/src/main/java/com/apobates/forum/member/impl/dao/MemberPenalizeRecordsDaoImpl.java @@ -1,14 +1,11 @@ package com.apobates.forum.member.impl.dao; -import com.apobates.forum.member.dao.MemberDao; import com.apobates.forum.member.dao.MemberPenalizeRecordsDao; import com.apobates.forum.member.entity.MemberPenalizeRecords; -import com.apobates.forum.member.entity.MemberStatusEnum; import com.apobates.forum.utils.persistence.Page; import com.apobates.forum.utils.persistence.Pageable; import java.time.LocalDateTime; import java.util.Collection; -import java.util.Map; import java.util.Optional; import java.util.stream.Stream; import javax.persistence.EntityManager; @@ -17,7 +14,6 @@ import javax.persistence.Query; import javax.persistence.TypedQuery; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -78,7 +74,7 @@ public class MemberPenalizeRecordsDaoImpl implements MemberPenalizeRecordsDao{ } @Override - public Stream findAll(LocalDateTime start, LocalDateTime finish) { + public Stream findAllByExpire(LocalDateTime start, LocalDateTime finish) { final String SQL = "SELECT mpr FROM MemberPenalizeRecords mpr WHERE mpr.status = :sta AND mpr.rebirthDateTime BETWEEN :art AND :ish"; return entityManager.createQuery(SQL, MemberPenalizeRecords.class) .setParameter("sta", true) diff --git a/member.impl/src/main/java/com/apobates/forum/member/impl/quartz/PenalizeQuartzJob.java b/member.impl/src/main/java/com/apobates/forum/member/impl/quartz/PenalizeResetMemberStatusQuartzJob.java similarity index 92% rename from member.impl/src/main/java/com/apobates/forum/member/impl/quartz/PenalizeQuartzJob.java rename to member.impl/src/main/java/com/apobates/forum/member/impl/quartz/PenalizeResetMemberStatusQuartzJob.java index 08c03fd8..66f94b01 100644 --- a/member.impl/src/main/java/com/apobates/forum/member/impl/quartz/PenalizeQuartzJob.java +++ b/member.impl/src/main/java/com/apobates/forum/member/impl/quartz/PenalizeResetMemberStatusQuartzJob.java @@ -26,14 +26,14 @@ import org.springframework.beans.factory.annotation.Value; * @author xiaofanku * @since 20200611 */ -public class PenalizeQuartzJob implements Job{ +public class PenalizeResetMemberStatusQuartzJob implements Job{ @Autowired private MemberPenalizeRecordsDao memberPenalizeRecordsDao; @Autowired private MemberDao memberDao; @Value("${site.appname}") private String appName; - private final static Logger logger = LoggerFactory.getLogger(PenalizeQuartzJob.class); + private final static Logger logger = LoggerFactory.getLogger(PenalizeResetMemberStatusQuartzJob.class); @Override public void execute(JobExecutionContext jec) throws JobExecutionException { @@ -41,7 +41,7 @@ public class PenalizeQuartzJob implements Job{ LocalDateTime finish = LocalDateTime.now(); LocalDateTime start = DateTimeUtils.beforeMinuteForDate(finish, 1); //作业的执行周期 // - List data = memberPenalizeRecordsDao.findAll(start, finish).collect(Collectors.toList()); + List data = memberPenalizeRecordsDao.findAllByExpire(start, finish).collect(Collectors.toList()); if (data.isEmpty()) { //没有结果 logger.info("[QuartzTask][Member][1]没有惩罚记录,作业退出"); return; diff --git a/member.impl/src/main/java/com/apobates/forum/member/impl/quartz/ResetMemberGroupQuartzJob.java b/member.impl/src/main/java/com/apobates/forum/member/impl/quartz/ResetMemberGroupQuartzJob.java deleted file mode 100644 index b13b6377..00000000 --- a/member.impl/src/main/java/com/apobates/forum/member/impl/quartz/ResetMemberGroupQuartzJob.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.apobates.forum.member.impl.quartz; - -import org.quartz.Job; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; - -/** - * Vip会员到期后复位会员的组 - * - * @author xiaofanku - * @since 20200921 - */ -public class ResetMemberGroupQuartzJob implements Job{ - - @Override - public void execute(JobExecutionContext jec) throws JobExecutionException { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - -} diff --git a/member.impl/src/main/java/com/apobates/forum/member/impl/quartz/VipExchangeResetMemberGroupQuartzJob.java b/member.impl/src/main/java/com/apobates/forum/member/impl/quartz/VipExchangeResetMemberGroupQuartzJob.java new file mode 100644 index 00000000..e4581fd7 --- /dev/null +++ b/member.impl/src/main/java/com/apobates/forum/member/impl/quartz/VipExchangeResetMemberGroupQuartzJob.java @@ -0,0 +1,58 @@ +package com.apobates.forum.member.impl.quartz; + +import com.apobates.forum.member.dao.MemberDao; +import com.apobates.forum.member.dao.MemberVipExchangeRecordsDao; +import com.apobates.forum.member.entity.MemberVipExchangeRecords; +import com.apobates.forum.utils.DateTimeUtils; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import java.time.LocalDateTime; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * Vip会员到期后复位会员的组 + * + * @author xiaofanku + * @since 20200921 + */ +public class VipExchangeResetMemberGroupQuartzJob implements Job{ + @Autowired + private MemberVipExchangeRecordsDao memberVipExchangeRecordsDao; + @Autowired + private MemberDao memberDao; + @Value("${site.appname}") + private String appName; + private final static Logger logger = LoggerFactory.getLogger(VipExchangeResetMemberGroupQuartzJob.class); + + @Override + public void execute(JobExecutionContext jec) throws JobExecutionException { + logger.info(String.format("[%s][QuartzTask][Member][3]VIP交易记录作业开始", appName)); + LocalDateTime finish = LocalDateTime.now(); + LocalDateTime start = DateTimeUtils.beforeMinuteForDate(finish, 1); //作业的执行周期 + // + List data = memberVipExchangeRecordsDao.findAllByExpire(start, finish).collect(Collectors.toList()); + if (data.isEmpty()) { //没有结果 + logger.info("[QuartzTask][Member][3]没有VIP交易记录,作业退出"); + return; + } + // + Set exchangeIds = new HashSet<>(); + Set memberIds = new HashSet<>(); + // + for (MemberVipExchangeRecords ver : data) { + exchangeIds.add(ver.getId()); + memberIds.add(ver.getMemberId()); + } + memberVipExchangeRecordsDao.expired(exchangeIds); + memberDao.editMemberGroup(memberIds); + logger.info("[QuartzTask][Member][3]VIP交易记录作业结束"); + } +} diff --git a/member.impl/src/main/java/module-info.java b/member.impl/src/main/java/module-info.java index af52670f..8cbee4b7 100644 --- a/member.impl/src/main/java/module-info.java +++ b/member.impl/src/main/java/module-info.java @@ -9,6 +9,7 @@ open module MemberImpl { requires org.aspectj.runtime; requires spring.context.support; requires Event; + requires java.persistence; exports com.apobates.forum.member.impl; exports com.apobates.forum.member.impl.event; exports com.apobates.forum.member.impl.event.listener; diff --git a/member/src/main/java/com/apobates/forum/member/dao/MemberDao.java b/member/src/main/java/com/apobates/forum/member/dao/MemberDao.java index f34b3fb5..2e57af50 100644 --- a/member/src/main/java/com/apobates/forum/member/dao/MemberDao.java +++ b/member/src/main/java/com/apobates/forum/member/dao/MemberDao.java @@ -5,10 +5,7 @@ import com.apobates.forum.member.entity.MemberGroupEnum; import com.apobates.forum.member.entity.MemberRoleEnum; import com.apobates.forum.member.entity.MemberStatusEnum; import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.TreeMap; +import java.util.*; import java.util.stream.Stream; /** @@ -91,7 +88,15 @@ public interface MemberDao { * @return */ int editMemberStatus(Map status); - + + /** + * 将指定的会员的组更新为MemberGroupEnum.CARD + * + * @param updateMemberIds 更新的会员ID集合 + * @return + */ + int editMemberGroup(Set updateMemberIds); + /** * 查看会员的头像 * diff --git a/member/src/main/java/com/apobates/forum/member/dao/MemberPenalizeRecordsDao.java b/member/src/main/java/com/apobates/forum/member/dao/MemberPenalizeRecordsDao.java index 12c84c4e..8ebdfaf7 100644 --- a/member/src/main/java/com/apobates/forum/member/dao/MemberPenalizeRecordsDao.java +++ b/member/src/main/java/com/apobates/forum/member/dao/MemberPenalizeRecordsDao.java @@ -36,13 +36,13 @@ public interface MemberPenalizeRecordsDao extends PagingAndSortingRepository findAllByMember(long memberId); /** - * 查看指定日期范围内可用的惩罚记录 + * 查看指定日期范围内可用的惩罚记录,MemberPenalizeRecords.rebirthDateTime为参考 * * @param start 开始日期 * @param finish 结束日期 * @return */ - Stream findAll(LocalDateTime start, LocalDateTime finish); + Stream findAllByExpire(LocalDateTime start, LocalDateTime finish); /** * 将指定惩罚记录的作废 diff --git a/member/src/main/java/com/apobates/forum/member/dao/MemberVipExchangeRecordsDao.java b/member/src/main/java/com/apobates/forum/member/dao/MemberVipExchangeRecordsDao.java index 83f07dcc..b074f09c 100644 --- a/member/src/main/java/com/apobates/forum/member/dao/MemberVipExchangeRecordsDao.java +++ b/member/src/main/java/com/apobates/forum/member/dao/MemberVipExchangeRecordsDao.java @@ -43,7 +43,7 @@ public interface MemberVipExchangeRecordsDao extends PagingAndSortingRepository< Stream findAllOfRecent(int size); /** - * 查看即将到期的VIP交易记录 + * 查看即将到期的VIP交易记录,以MemberVipExchangeRecords.lapseDateTime为参考 * * @param lapseDateStart 到期日期的开始(凌晨) * @param lapseDateFinish 到期日期的结束(午夜) -- GitLab