From ba86ac45f4c225710094d8e7d01d07eda0516690 Mon Sep 17 00:00:00 2001 From: ziin Date: Thu, 9 Apr 2026 14:22:14 +0800 Subject: [PATCH] =?UTF-8?q?feat(core):=20=E6=96=B0=E5=A2=9EVIP=E5=88=B0?= =?UTF-8?q?=E6=9C=9F=E5=AE=9A=E6=97=B6=E6=A3=80=E6=9F=A5=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yolo/keyboard/job/VipExpiryCheckJob.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 keyboard-server/src/main/java/com/yolo/keyboard/job/VipExpiryCheckJob.java diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/job/VipExpiryCheckJob.java b/keyboard-server/src/main/java/com/yolo/keyboard/job/VipExpiryCheckJob.java new file mode 100644 index 0000000..d614ed4 --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/job/VipExpiryCheckJob.java @@ -0,0 +1,63 @@ +package com.yolo.keyboard.job; + +import cn.hutool.core.collection.CollUtil; +import com.yolo.keyboard.dal.dataobject.user.KeyboardUserDO; +import com.yolo.keyboard.dal.mysql.user.KeyboardUserMapper; +import com.yolo.keyboard.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.yolo.keyboard.framework.quartz.core.handler.JobHandler; +import com.yolo.keyboard.framework.tenant.core.aop.TenantIgnore; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * VIP 到期检查定时任务 + * 定期执行,将 VIP 已过期的用户关闭 VIP 权限 + * + * @author ziin + */ +@Component +@Slf4j +public class VipExpiryCheckJob implements JobHandler { + + @Resource + private KeyboardUserMapper userMapper; + + @Override + @TenantIgnore + public String execute(String param) { + log.info("[VipExpiryCheckJob] 开始执行 VIP 到期检查任务"); + + LocalDateTime now = LocalDateTime.now(); + + // 查询 VIP 已过期且仍处于 VIP 状态的用户 + List expiredUsers = userMapper.selectList( + new LambdaQueryWrapperX() + .eq(KeyboardUserDO::getIsVip, true) + .le(KeyboardUserDO::getVipExpiry, now) + ); + + if (CollUtil.isEmpty(expiredUsers)) { + log.info("[VipExpiryCheckJob] 没有需要处理的过期 VIP 用户"); + return "没有需要处理的过期 VIP 用户"; + } + + int count = 0; + for (KeyboardUserDO user : expiredUsers) { + user.setIsVip(false); + user.setUpdatedAt(now); + userMapper.updateById(user); + count++; + + log.info("[VipExpiryCheckJob] 用户 {} VIP 已过期,已关闭 VIP 权限,过期时间: {}", + user.getUid(), user.getVipExpiry()); + } + + String result = String.format("共处理 %d 个过期 VIP 用户", count); + log.info("[VipExpiryCheckJob] 任务执行完成: {}", result); + return result; + } +}