diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/vip.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/vip.java new file mode 100644 index 0000000000..a72467c21f --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/vip.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.system.job; + +import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; +import cn.iocoder.yudao.module.system.service.person.PersonService; +import org.springframework.stereotype.Component; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.Resource; + +@Component +public class vip implements JobHandler { + + private static final Logger log = LoggerFactory.getLogger(vip.class); + + @Resource + private PersonService personService; + + @Override + public String execute(String param) { + log.info("开始执行VIP过期检查定时任务"); + try { + // 批量处理过期VIP用户 + personService.processExpiredVipUsers(); + log.info("VIP过期检查定时任务执行成功"); + return "VIP过期检查执行成功"; + } catch (Exception e) { + log.error("VIP过期检查定时任务执行失败", e); + return "VIP过期检查执行失败: " + e.getMessage(); + } + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/person/PersonService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/person/PersonService.java index d5bfc27374..e27f5b2aac 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/person/PersonService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/person/PersonService.java @@ -117,4 +117,10 @@ public interface PersonService { * @param userid 用户编号 */ void cancelVip(Integer userid); + + /** + * 批量处理过期VIP用户 + * 查询所有VIP到期时间已过的用户,并将其isvip字段设置为0 + */ + void processExpiredVipUsers(); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/person/PersonServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/person/PersonServiceImpl.java index 49688a3824..70c034c043 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/person/PersonServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/person/PersonServiceImpl.java @@ -18,6 +18,11 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * 用户基本信息 Service 实现类 * @@ -27,6 +32,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @Validated public class PersonServiceImpl implements PersonService { + private static final Logger log = LoggerFactory.getLogger(PersonServiceImpl.class); + @Resource private PersonMapper personMapper; @@ -184,4 +191,36 @@ public class PersonServiceImpl implements PersonService { .set(PersonDO::getVipstarttime, null) // 清空会员开始时间 .set(PersonDO::getVipendtime, null)); // 清空会员结束时间 } + + @Override + public void processExpiredVipUsers() { + // 获取当前时间 + String currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + log.info("开始检查VIP过期用户,当前时间: {}", currentTime); + + // 查询所有过期的VIP用户 + List expiredVipUsers = personMapper.selectList(new LambdaQueryWrapper() + .eq(PersonDO::getIsvip, 1) // 当前是VIP用户 + .isNotNull(PersonDO::getVipendtime) // VIP结束时间不为空 + .lt(PersonDO::getVipendtime, currentTime)); // VIP结束时间小于当前时间 + + if (expiredVipUsers.isEmpty()) { + log.info("没有发现过期的VIP用户"); + return; // 没有过期用户,直接返回 + } + + log.info("发现 {} 个过期的VIP用户,开始批量处理", expiredVipUsers.size()); + + // 提取所有过期用户的ID + List expiredUserIds = expiredVipUsers.stream() + .map(PersonDO::getId) + .collect(java.util.stream.Collectors.toList()); + + // 批量更新过期VIP用户 + personMapper.update(null, new LambdaUpdateWrapper() + .in(PersonDO::getId, expiredUserIds) + .set(PersonDO::getIsvip, 0));// 设置为非会员状态 + + log.info("成功处理 {} 个过期VIP用户", expiredUserIds.size()); + } } \ No newline at end of file diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 7dab9d2cd4..8b2b4aae7f 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -7,7 +7,7 @@ spring: # noinspection SpringBootApplicationYaml exclude: - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源 - - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置 +# - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置 - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置 - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置 - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置