feat(system): 新增爬虫过期账号禁用任务并重构AI过期逻辑
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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<TenantDO> {
|
||||
return selectList(TenantDO::getStatus, status);
|
||||
}
|
||||
|
||||
default List<TenantDO> selectByAiExpireTime() {
|
||||
LambdaQueryWrapper<TenantDO> myQuery = Wrappers.lambdaQuery(TenantDO.class);
|
||||
myQuery.isNull(TenantDO::getAiExpireTime);
|
||||
return selectList(myQuery);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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<AdminUserDO> aiUserQueryWrapper = new LambdaQueryWrapper<>();
|
||||
aiUserQueryWrapper.eq(AdminUserDO::getTenantId, tenantId);
|
||||
aiUserQueryWrapper.eq(AdminUserDO::getAiChat, 1);
|
||||
List<AdminUserDO> 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<AdminUserDO> aiUserQueryWrapper = new LambdaQueryWrapper<>();
|
||||
aiUserQueryWrapper.eq(AdminUserDO::getTenantId, tenantId);
|
||||
aiUserQueryWrapper.eq(AdminUserDO::getAiChat, 1);
|
||||
List<AdminUserDO> 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 "租户未配置过期时间";
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
* 禁用过期账号定时任务处理器
|
||||
* <p>
|
||||
* 该类用于定时检查并禁用已过期的AI账号和大哥账号。
|
||||
* 通过查询租户表中已过期的账号,然后将对应用户的权限状态更新为禁用。
|
||||
* </p>
|
||||
*
|
||||
* @author ziin
|
||||
* @date 2025/9/16 14:35
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class DisableCrawlExpiredAccount implements JobHandler{
|
||||
|
||||
/**
|
||||
* 租户数据访问对象
|
||||
* 用于查询租户信息和过期时间
|
||||
*/
|
||||
@Resource
|
||||
TenantMapper tenantMapper;
|
||||
|
||||
/**
|
||||
* 管理员用户数据访问对象
|
||||
* 用于查询和更新用户权限状态
|
||||
*/
|
||||
@Resource
|
||||
private AdminUserMapper userMapper;
|
||||
|
||||
/**
|
||||
* 执行禁用过期账号的定时任务
|
||||
* <p>
|
||||
* 该方法会执行以下操作:
|
||||
* 1. 查询所有AI账号已过期的租户
|
||||
* 2. 查询所有大哥账号已过期的租户
|
||||
* 3. 分别禁用这些租户下的用户对应权限
|
||||
* 4. 返回操作结果统计信息
|
||||
* </p>
|
||||
*
|
||||
* @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<AdminUserDO> aiUserQueryWrapper = new LambdaQueryWrapper<>();
|
||||
aiUserQueryWrapper.eq(AdminUserDO::getTenantId, tenantId);
|
||||
aiUserQueryWrapper.eq(AdminUserDO::getCrawl, 1);
|
||||
List<AdminUserDO> 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 "租户未配置过期时间";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user