diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceImpl.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceImpl.java index 480b468..7005393 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceImpl.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceImpl.java @@ -45,6 +45,7 @@ public class JobLogServiceImpl implements JobLogService { .result(result).build(); jobLogMapper.updateById(updateObj); } catch (Exception ex) { + log.error("更新 Job 日志失败", ex); log.error("[updateJobLogResultAsync][logId({}) endTime({}) duration({}) success({}) result({})]", logId, endTime, duration, success, result); } diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/TenantMapper.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/TenantMapper.java index 38e0f04..6cf149d 100755 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/TenantMapper.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/TenantMapper.java @@ -1,4 +1,9 @@ package cn.iocoder.yudao.module.system.dal.mysql.tenant; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.ibatis.annotations.Param; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; @@ -51,4 +56,11 @@ public interface TenantMapper extends BaseMapperX { return selectList(TenantDO::getStatus, status); } + default List selectByAiExpireTime() { + LambdaQueryWrapper myQuery = Wrappers.lambdaQuery(TenantDO.class); + myQuery.isNull(TenantDO::getAiExpireTime); + return selectList(myQuery); + } + + } diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/job/DisableAIExpiredAccount.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/job/DisableAIExpiredAccount.java index 2efde53..8731738 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/job/DisableAIExpiredAccount.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/job/DisableAIExpiredAccount.java @@ -69,26 +69,25 @@ public class DisableAIExpiredAccount implements JobHandler{ public String execute(String param) throws Exception { Long tenantId = TenantContextHolder.getTenantId(); TenantDO tenant = tenantMapper.selectById(tenantId); - if (tenant.getAiExpireTime()==null) { - return "租户未配置AI过期时间"; - } - Duration brotherDuration = LocalDateTimeUtil.between(tenant.getAiExpireTime(), LocalDateTime.now()); - long minutes = brotherDuration.toMinutes(); - LambdaQueryWrapper aiUserQueryWrapper = new LambdaQueryWrapper<>(); - aiUserQueryWrapper.eq(AdminUserDO::getTenantId, tenantId); - aiUserQueryWrapper.eq(AdminUserDO::getAiChat, 1); - List aiUserList = userMapper.selectList(aiUserQueryWrapper); - int aiAccountNum = 0 ; - if (minutes >= 0) { - for (AdminUserDO adminUserDO : aiUserList) { - adminUserDO.setAiChat((byte) 0); - userMapper.updateById(adminUserDO); - aiAccountNum++; - log.info("禁用过期AI账号,账号ID:{}", adminUserDO.getId()); + if (tenant.getAiExpireTime()!=null) { + Duration brotherDuration = LocalDateTimeUtil.between(tenant.getAiExpireTime(), LocalDateTime.now()); + long minutes = brotherDuration.toMinutes(); + LambdaQueryWrapper aiUserQueryWrapper = new LambdaQueryWrapper<>(); + aiUserQueryWrapper.eq(AdminUserDO::getTenantId, tenantId); + aiUserQueryWrapper.eq(AdminUserDO::getAiChat, 1); + List aiUserList = userMapper.selectList(aiUserQueryWrapper); + int aiAccountNum = 0 ; + if (minutes >= 0) { + for (AdminUserDO adminUserDO : aiUserList) { + adminUserDO.setAiChat((byte) 0); + userMapper.updateById(adminUserDO); + aiAccountNum++; + log.info("禁用过期AI账号,账号ID:{}", adminUserDO.getId()); + } } + // 返回操作结果:包含禁用的AI账号和大哥账号数量统计 + return "禁用过期账号成功,禁用了 " + aiAccountNum + " 个 AI 账号。"; } - - // 返回操作结果:包含禁用的AI账号和大哥账号数量统计 - return "禁用过期账号成功,禁用了 " + aiAccountNum + " 个 AI 账号。"; + return "租户未配置过期时间"; } } \ No newline at end of file diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/job/DisableCrawlExpiredAccount.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/job/DisableCrawlExpiredAccount.java new file mode 100644 index 0000000..45f60a5 --- /dev/null +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/job/DisableCrawlExpiredAccount.java @@ -0,0 +1,88 @@ +package cn.iocoder.yudao.module.system.job; + +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; +import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; +import cn.iocoder.yudao.framework.tenant.core.job.TenantJob; +import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantMapper; +import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 禁用过期账号定时任务处理器 + *

+ * 该类用于定时检查并禁用已过期的AI账号和大哥账号。 + * 通过查询租户表中已过期的账号,然后将对应用户的权限状态更新为禁用。 + *

+ * + * @author ziin + * @date 2025/9/16 14:35 + */ +@Slf4j +@Component +public class DisableCrawlExpiredAccount implements JobHandler{ + + /** + * 租户数据访问对象 + * 用于查询租户信息和过期时间 + */ + @Resource + TenantMapper tenantMapper; + + /** + * 管理员用户数据访问对象 + * 用于查询和更新用户权限状态 + */ + @Resource + private AdminUserMapper userMapper; + + /** + * 执行禁用过期账号的定时任务 + *

+ * 该方法会执行以下操作: + * 1. 查询所有AI账号已过期的租户 + * 2. 查询所有大哥账号已过期的租户 + * 3. 分别禁用这些租户下的用户对应权限 + * 4. 返回操作结果统计信息 + *

+ * + * @param param 任务参数(当前未使用) + * @return 操作结果字符串,包含禁用的AI账号和大哥账号数量 + * @throws Exception 执行过程中可能抛出的异常 + */ + @Override + @TenantJob + public String execute(String param) throws Exception { + Long tenantId = TenantContextHolder.getTenantId(); + TenantDO tenant = tenantMapper.selectById(tenantId); + if (tenant.getExpireTime()!=null) { + Duration brotherDuration = LocalDateTimeUtil.between(tenant.getExpireTime(), LocalDateTime.now()); + long minutes = brotherDuration.toMinutes(); + LambdaQueryWrapper aiUserQueryWrapper = new LambdaQueryWrapper<>(); + aiUserQueryWrapper.eq(AdminUserDO::getTenantId, tenantId); + aiUserQueryWrapper.eq(AdminUserDO::getCrawl, 1); + List aiUserList = userMapper.selectList(aiUserQueryWrapper); + int aiAccountNum = 0 ; + if (minutes >= 0) { + for (AdminUserDO adminUserDO : aiUserList) { + adminUserDO.setCrawl((byte) 0); + userMapper.updateById(adminUserDO); + aiAccountNum++; + log.info("禁用过期爬虫账号,账号ID:{}", adminUserDO.getId()); + } + } + // 返回操作结果:包含禁用的AI账号和大哥账号数量统计 + return "禁用过期账号成功,禁用了 " + aiAccountNum + " 个 爬虫 账号。"; + } + return "租户未配置过期时间"; + } +} \ No newline at end of file