From eb936ce6772cdc31e5f5d5ad4364036b4ae7fadf Mon Sep 17 00:00:00 2001 From: ziin Date: Wed, 4 Feb 2026 15:32:18 +0800 Subject: [PATCH] =?UTF-8?q?fix(tenant):=20=E6=96=B0=E5=A2=9E=E7=88=AC?= =?UTF-8?q?=E8=99=AB=E8=BF=87=E6=9C=9F=E6=97=B6=E9=97=B4=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=B9=B6=E9=87=8D=E6=9E=84=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TenantDO、Req/Resp VO 增加 crawlExpireTime 字段 - 禁用任务改为仅依据 crawlExpireTime 判断过期 - 支持批量更新租户下所有爬虫用户状态 --- .../tenant/vo/tenant/TenantPageReqVO.java | 4 ++ .../admin/tenant/vo/tenant/TenantRespVO.java | 5 ++ .../tenant/vo/tenant/TenantSaveReqVO.java | 5 ++ .../dal/dataobject/tenant/TenantDO.java | 6 +++ .../job/DisableCrawlExpiredAccount.java | 54 +++++++++++-------- .../job/DisableWebAIExpiredAccount.java | 54 +++++++++++-------- .../service/tenant/TenantServiceImpl.java | 6 +-- 7 files changed, 89 insertions(+), 45 deletions(-) diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantPageReqVO.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantPageReqVO.java index dbd8875..7b9c3f5 100755 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantPageReqVO.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantPageReqVO.java @@ -45,6 +45,10 @@ public class TenantPageReqVO extends PageParam { @Schema(description = "爬大哥到期时间") private LocalDateTime[] brotherExpireTime; + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "爬主播到期时间") + private LocalDateTime[] crawlExpireTime; + @Schema private String remark; diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.java index def5d13..5fa8df8 100755 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.java @@ -7,10 +7,13 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.NotNull; import java.time.LocalDateTime; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + @Schema(description = "管理后台 - 租户 Response VO") @Data @ExcelIgnoreUnannotated @@ -53,6 +56,8 @@ public class TenantRespVO { @Schema(description = "大哥过期时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime brotherExpireTime; + @Schema(description = "爬主播到期时间") + private LocalDateTime crawlExpireTime; @Schema(description = "账号数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Integer accountCount; diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantSaveReqVO.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantSaveReqVO.java index a1bce11..073268d 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantSaveReqVO.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantSaveReqVO.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.AssertTrue; import javax.validation.constraints.NotNull; @@ -12,6 +13,8 @@ import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; import java.time.LocalDateTime; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + @Schema(description = "管理后台 - 租户创建/修改 Request VO") @Data public class TenantSaveReqVO { @@ -51,6 +54,8 @@ public class TenantSaveReqVO { @Schema(description = "大哥过期时间") private LocalDateTime brotherExpireTime; + @Schema(description = "爬主播到期时间") + private LocalDateTime crawlExpireTime; @Schema(description = "账号数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotNull(message = "账号数量不能为空") diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenant/TenantDO.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenant/TenantDO.java index 9400f03..995bd3b 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenant/TenantDO.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/tenant/TenantDO.java @@ -84,6 +84,12 @@ public class TenantDO extends BaseDO { * 大哥过期时间 */ private LocalDateTime brotherExpireTime; + + /** + * 爬虫到期时间 + */ + private LocalDateTime crawlExpireTime; + /** * 账号数量 */ 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 index 45f60a5..e9c39b1 100644 --- 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 @@ -1,6 +1,5 @@ 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; @@ -13,7 +12,6 @@ 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; @@ -64,25 +62,39 @@ public class DisableCrawlExpiredAccount implements JobHandler{ 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 + " 个 爬虫 账号。"; + + // 检查租户是否配置了爬虫过期时间 + if (tenant.getCrawlExpireTime() == null) { + return "租户未配置爬虫过期时间"; } - return "租户未配置过期时间"; + + // 判断是否已过期(当前时间 >= 过期时间) + if (LocalDateTime.now().isBefore(tenant.getCrawlExpireTime())) { + return "爬虫权限未过期,无需处理"; + } + + // 查询当前租户下所有启用爬虫权限的用户ID + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AdminUserDO::getTenantId, tenantId) + .eq(AdminUserDO::getCrawl, 1) + .select(AdminUserDO::getId); + List crawlUserList = userMapper.selectList(queryWrapper); + + if (crawlUserList.isEmpty()) { + return "无需禁用的爬虫账号"; + } + + // 批量更新:禁用爬虫权限 + AdminUserDO updateEntity = new AdminUserDO(); + updateEntity.setCrawl((byte) 0); + LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); + updateWrapper.eq(AdminUserDO::getTenantId, tenantId) + .eq(AdminUserDO::getCrawl, 1); + int updatedCount = userMapper.update(updateEntity, updateWrapper); + + // 记录被禁用的账号ID + crawlUserList.forEach(user -> log.info("禁用过期爬虫账号,账号ID:{}", user.getId())); + + return "禁用过期爬虫账号成功,共禁用 " + updatedCount + " 个账号"; } } \ No newline at end of file diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/job/DisableWebAIExpiredAccount.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/job/DisableWebAIExpiredAccount.java index 7f396fa..9dc45ce 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/job/DisableWebAIExpiredAccount.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/job/DisableWebAIExpiredAccount.java @@ -1,6 +1,5 @@ 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; @@ -13,7 +12,6 @@ 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;/* * @author: ziin @@ -43,26 +41,40 @@ public class DisableWebAIExpiredAccount implements JobHandler{ public String execute(String param) throws Exception { Long tenantId = TenantContextHolder.getTenantId(); TenantDO tenant = tenantMapper.selectById(tenantId); - 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::getWebAi, 1); - List aiUserList = userMapper.selectList(aiUserQueryWrapper); - int aiAccountNum = 0 ; - if (minutes >= 0) { - for (AdminUserDO adminUserDO : aiUserList) { - adminUserDO.setWebAi((byte) 0); - userMapper.updateById(adminUserDO); - aiAccountNum++; - log.info("禁用过期WebAI账号,账号ID:{}", adminUserDO.getId()); - } - } - // 返回操作结果:包含禁用的AI账号和大哥账号数量统计 - return "禁用过期账号成功,禁用了 " + aiAccountNum + " 个 WebAI 账号。"; + + // 检查租户是否配置了AI过期时间 + if (tenant.getAiExpireTime() == null) { + return "租户未配置AI过期时间"; } - return "租户未配置过期时间"; + + // 判断是否已过期(当前时间 >= 过期时间) + if (LocalDateTime.now().isBefore(tenant.getAiExpireTime())) { + return "WebAI权限未过期,无需处理"; + } + + // 查询当前租户下所有启用WebAI权限的用户ID + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AdminUserDO::getTenantId, tenantId) + .eq(AdminUserDO::getWebAi, 1) + .select(AdminUserDO::getId); + List webAiUserList = userMapper.selectList(queryWrapper); + + if (webAiUserList.isEmpty()) { + return "无需禁用的WebAI账号"; + } + + // 批量更新:禁用WebAI权限 + AdminUserDO updateEntity = new AdminUserDO(); + updateEntity.setWebAi((byte) 0); + LambdaQueryWrapper updateWrapper = new LambdaQueryWrapper<>(); + updateWrapper.eq(AdminUserDO::getTenantId, tenantId) + .eq(AdminUserDO::getWebAi, 1); + int updatedCount = userMapper.update(updateEntity, updateWrapper); + + // 记录被禁用的账号ID + webAiUserList.forEach(user -> log.info("禁用过期WebAI账号,账号ID:{}", user.getId())); + + return "禁用过期WebAI账号成功,共禁用 " + updatedCount + " 个账号"; } } diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java index 8307461..c29bd2a 100755 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java @@ -170,12 +170,12 @@ public class TenantServiceImpl implements TenantService { log.info("代理: {} 续费租户:{} 成功,套餐 Id:{}", currentTenantId,targetTenant.getId(),updateReqVO.getPackageId()); } - if (targetTenant.getExpireTime().isBefore(LocalDateTime.now())){ - targetTenant.setExpireTime(LocalDateTime.now().plusDays(tenantAgencyPackage.getDays())); + if (targetTenant.getCrawlExpireTime().isBefore(LocalDateTime.now())){ + targetTenant.setCrawlExpireTime(LocalDateTime.now().plusDays(tenantAgencyPackage.getDays())); targetTenant.setStatus(CommonStatusEnum.ENABLE.getStatus()); targetTenantUser.setCrawl((byte) 1); }else { - targetTenant.setExpireTime(targetTenant.getExpireTime().plusDays(tenantAgencyPackage.getDays())); + targetTenant.setCrawlExpireTime(targetTenant.getCrawlExpireTime().plusDays(tenantAgencyPackage.getDays())); } if (tenantAgencyPackage.getAiClient()==1){