diff --git a/src/main/java/com/ai/da/common/task/AccountTask.java b/src/main/java/com/ai/da/common/task/AccountTask.java index 32b0eb70..dcc741c8 100644 --- a/src/main/java/com/ai/da/common/task/AccountTask.java +++ b/src/main/java/com/ai/da/common/task/AccountTask.java @@ -1,11 +1,13 @@ package com.ai.da.common.task; +import com.ai.da.mapper.primary.entity.Account; import com.ai.da.service.AccountService; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.util.List; @Component @Slf4j @@ -22,10 +24,37 @@ public class AccountTask { accountService.refreshCreditsWeekly(); } - // todo 多久执行一次? // @Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes public void getPaidUser(){ // 获取code-create 表中 指定日期之后 订单状态为wc-processing的订单 accountService.extendValidityForCC(); } + + // 每天凌晨0点执行一次 +// @Scheduled(cron = "0 0 0 * * ?") + public void cancelActivityBenefits(){ + // 1、查询当前所有参与了活动且过期的用户 + List accountList = accountService.getExpiredUserBySystemUser(4); + + // 2、将到期用户置为游客 + for(Account account : accountList){ + log.info("参与活动的用户到期,置为游客"); + accountService.toVisitor(account); + } + } + + // 每天检测正式用户到期情况,每天凌晨0点执行 +// @Scheduled(cron = "0 0 0 * * ?") + public void paidUserToVisitor(){ + // 1、查询当前已过期正式用户或试用用户 + List accountList = accountService.getExpiredUserBySystemUser(1); + accountList.addAll(accountService.getExpiredUserBySystemUser(2)); + accountList.addAll(accountService.getExpiredUserBySystemUser(3)); + + // 2、将到期用户置为游客 + for(Account account : accountList){ + log.info("用户有效期到期,置为游客"); + accountService.toVisitor(account); + } + } } diff --git a/src/main/java/com/ai/da/controller/AccountController.java b/src/main/java/com/ai/da/controller/AccountController.java index 4b9087e3..4dadaf3d 100644 --- a/src/main/java/com/ai/da/controller/AccountController.java +++ b/src/main/java/com/ai/da/controller/AccountController.java @@ -2,6 +2,7 @@ package com.ai.da.controller; import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; +import com.ai.da.mapper.primary.entity.Account; import com.ai.da.mapper.primary.entity.TrialOrder; import com.ai.da.model.dto.*; import com.ai.da.model.vo.AccountLoginVO; @@ -177,4 +178,20 @@ public class AccountController { public Response questionnaire(@Valid @RequestBody String questionnaireInfo){ return Response.success(accountService.collectQuestionnaires(questionnaireInfo)); } + + /** + * 参与活动 获取福利 + * @return + */ + @ApiOperation(value = "参与活动 获取福利") + @GetMapping("/activity") + public Response getActivityBenefits(){ + return Response.success(accountService.getActivityBenefits()); + } + + @ApiOperation(value = "将用户账号过期时间设置为过期当天的23:59:59") + @GetMapping("/setUserValidToDayEnd") + public Response> setUserValidToDayEnd(){ + return Response.success(accountService.setUserValidToDayEnd()); + } } diff --git a/src/main/java/com/ai/da/mapper/primary/AccountMapper.java b/src/main/java/com/ai/da/mapper/primary/AccountMapper.java index 05fb735f..d8422ece 100644 --- a/src/main/java/com/ai/da/mapper/primary/AccountMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/AccountMapper.java @@ -3,6 +3,7 @@ package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; import com.ai.da.mapper.primary.entity.Account; +import java.util.Date; import java.util.List; /** @@ -29,4 +30,6 @@ public interface AccountMapper extends CommonMapper { */ // Account findById(String id); + void toVisitor(Long id, Date date); + } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Account.java b/src/main/java/com/ai/da/mapper/primary/entity/Account.java index f9f37fd9..ac09310e 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/Account.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Account.java @@ -93,6 +93,7 @@ public class Account implements Serializable { * 1 : 年付用户 * 2 : 月付用户 * 3 : 试用用户 + * 4 : 参加活动获取30天有效期和6000个积分的用户 */ private Integer systemUser; } diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index 68c169e0..14ba9d77 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -141,4 +141,12 @@ public interface AccountService extends IService { Boolean collectQuestionnaires(String questionnaireInfo); void refreshCreditsWeekly(); + + List getExpiredUserBySystemUser(Integer systemUserNum); + + String getActivityBenefits(); + + void toVisitor(Account account); + + List setUserValidToDayEnd(); } diff --git a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java index b3ded85a..ceb7fe6b 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -44,12 +44,10 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.text.SimpleDateFormat; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.ZonedDateTime; +import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; @@ -392,7 +390,7 @@ public class AccountServiceImpl extends ServiceImpl impl // account.setUserName(accountAddDTO.getUserName()); // account.setIsTrial(accountAddDTO.getIsTrial()); account.setValidStartTime(Long.valueOf(accountAddDTO.getValidStartTime())); - account.setValidEndTime(Long.valueOf(accountAddDTO.getValidEndTime())); + account.setValidEndTime(toDayEnd(Long.parseLong(accountAddDTO.getValidEndTime()))); account.setUserPassword("Third-000000"); account.setLanguage(Language.ENGLISH.name()); account.setCreateDate(new Date()); @@ -439,7 +437,7 @@ public class AccountServiceImpl extends ServiceImpl impl Account accountSelect = accountMapper.selectOne(queryTotal); Assert.notNull(accountSelect, "oldUserName does not exist!"); - account.setValidEndTime(Long.valueOf(accountEditDTO.getNewValidEndTime())); + account.setValidEndTime(toDayEnd(Long.parseLong(accountEditDTO.getNewValidEndTime()))); } Account accountSelect = accountMapper.selectOne(queryTotal); Assert.notNull(accountSelect, "oldAccount does not exist!"); @@ -541,9 +539,9 @@ public class AccountServiceImpl extends ServiceImpl impl account.setSystemUser(3); account.setValidStartTime(System.currentTimeMillis()); if (link) { - account.setValidEndTime(Instant.now().plus(14, ChronoUnit.DAYS).toEpochMilli()); + account.setValidEndTime(toDayEnd(Instant.now().plus(14, ChronoUnit.DAYS).toEpochMilli())); } else { - account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); + account.setValidEndTime(toDayEnd(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli())); } accountMapper.updateById(account); } else { @@ -553,9 +551,9 @@ public class AccountServiceImpl extends ServiceImpl impl account.setLanguage(Language.ENGLISH.name()); account.setValidStartTime(System.currentTimeMillis()); if (link) { - account.setValidEndTime(Instant.now().plus(14, ChronoUnit.DAYS).toEpochMilli()); + account.setValidEndTime(toDayEnd(Instant.now().plus(14, ChronoUnit.DAYS).toEpochMilli())); } else { - account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); + account.setValidEndTime(toDayEnd(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli())); } account.setCreateDate(new Date()); account.setIsTrial(1); @@ -602,7 +600,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setIsTrial(1); account.setIsBeginner(1); account.setValidStartTime(System.currentTimeMillis()); - account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); + account.setValidEndTime(toDayEnd(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli())); accountMapper.updateById(account); } else { account.setUserName(trialOrder.getUserName()); @@ -610,7 +608,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setUserEmail(trialOrder.getEmail()); account.setLanguage(Language.ENGLISH.name()); account.setValidStartTime(System.currentTimeMillis()); - account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); + account.setValidEndTime(toDayEnd(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli())); account.setCreateDate(new Date()); account.setIsTrial(1); account.setIsBeginner(1); @@ -975,7 +973,7 @@ public class AccountServiceImpl extends ServiceImpl impl Account account = new Account(); account.setId(accountId); account.setCredits(new BigDecimal(value)); - account.setValidEndTime(endTime); + account.setValidEndTime(toDayEnd(endTime)); accountMapper.updateById(account); } @@ -1133,11 +1131,11 @@ public class AccountServiceImpl extends ServiceImpl impl country, account.getValidStartTime().toString(), account.getValidEndTime().toString(), 0,new BigDecimal(credits),systemUserType)); - if (b) log.info("付费新用户新增成功!"); + if (b) log.info("付费新用户 {} 新增成功!", email); } else { - userInfo.setValidEndTime(account.getValidEndTime()); + userInfo.setValidEndTime(toDayEnd(account.getValidEndTime())); baseMapper.updateById(userInfo); - log.info("付费用户续订成功"); + log.info("付费用户 {} 续订成功", email); } SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @@ -1197,7 +1195,7 @@ public class AccountServiceImpl extends ServiceImpl impl validityExtension = specifiedDateTime.plusDays(1); } // 获取一个月之后的时间的 Unix 毫秒级时间戳 - account.setValidEndTime(validityExtension.toInstant().toEpochMilli()); + account.setValidEndTime(toDayEnd(validityExtension.toInstant().toEpochMilli())); return account; } @@ -1266,4 +1264,89 @@ public class AccountServiceImpl extends ServiceImpl impl baseMapper.update(null,accountUpdateWrapper); } + @Override + public String getActivityBenefits(){ + Long id = UserContext.getUserHolder().getId(); + // 1、 判断用户的身份 正式用户 无福利 + Account account = baseMapper.selectById(id); + Integer systemUser = account.getSystemUser(); + Instant now = Instant.now(); + ZoneId zoneId = ZoneId.of("Asia/Shanghai"); + ZonedDateTime specifiedDateTime; + if (systemUser.equals(1)){ + long validEndTime = Objects.isNull(account.getValidEndTime()) ? now.toEpochMilli() : account.getValidEndTime(); + specifiedDateTime = ZonedDateTime.ofInstant(Instant.ofEpochMilli(validEndTime), zoneId); + account.setValidEndTime(toDayEnd(specifiedDateTime.plusDays(30).toInstant().toEpochMilli())); + + }else if (systemUser.equals(4)){ + throw new BusinessException("You have participated in the event", 1); + }else if (systemUser.equals(0) || systemUser.equals(3)){ + // 2、赋予游客或试用用户 以正式用户的权限 即 积分置为6000,有效期30天 + // 将 Instant 转换为 ZonedDateTime,使用指定时区 + specifiedDateTime = ZonedDateTime.ofInstant(now, zoneId); + account.setIsTrial(0); + account.setSystemUser(4); + account.setCredits(BigDecimal.valueOf(6000)); + account.setValidStartTime(now.toEpochMilli()); + account.setValidEndTime(toDayEnd(specifiedDateTime.plusDays(30).toInstant().toEpochMilli())); + } + + account.setUpdateDate(new Date()); + baseMapper.updateById(account); + + return "参与成功"; + + } + // 将指定unix时间置为当天的23:59:59 + public long toDayEnd(long unixTimestampMillis){ + // 将UNIX时间戳转换为LocalDateTime对象 + LocalDateTime dateTime = Instant.ofEpochMilli(unixTimestampMillis) + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + + // 获取日期部分并设置时间为23:59:59 + LocalDate date = dateTime.toLocalDate(); + LocalDateTime endOfDay = date.atTime(LocalTime.of(23, 59, 59)); + + // 将LocalDateTime对象转换为UNIX时间戳(以毫秒为单位) 北京时间 + return endOfDay.toInstant(ZoneOffset.ofHours(8)).toEpochMilli(); + } + + /** + * 获取指定身份过期用户 + * @param systemUserNum + * @return + */ + public List getExpiredUserBySystemUser(Integer systemUserNum){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + long now = Instant.now().toEpochMilli(); + queryWrapper.eq("system_user", systemUserNum) + .isNotNull("valid_end_time") + .lt("valid_end_time", now); + + return baseMapper.selectList(queryWrapper); + } + + public void toVisitor(Account account){ + accountMapper.toVisitor(account.getId(), new Date()); + } + + public List setUserValidToDayEnd(){ + // 获取当前未过期的用户,并将其有效期设置为过期当日的23:59:59 + QueryWrapper queryWrapper = new QueryWrapper<>(); + long now = Instant.now().toEpochMilli(); + queryWrapper.isNotNull("valid_end_time").gt("valid_end_time", now); + List accounts = baseMapper.selectList(queryWrapper); + ArrayList ids = new ArrayList<>(); + + for (Account account: accounts) { + account.setValidEndTime(toDayEnd(account.getValidEndTime())); + ids.add(account.getId()); + updateById(account); + } + + return ids; + } + + } diff --git a/src/main/resources/mapper/primary/AccountMapper.xml b/src/main/resources/mapper/primary/AccountMapper.xml index d38f734a..643624d5 100644 --- a/src/main/resources/mapper/primary/AccountMapper.xml +++ b/src/main/resources/mapper/primary/AccountMapper.xml @@ -23,5 +23,11 @@ user_password AS userPassword from t_account where id = #{id} + + update t_account + set valid_end_time = null, is_trial = 0, credits = 0, system_user = 0, update_date = #{date} + where id = #{id} + +