fix:数据存储预警通知

This commit is contained in:
2025-12-30 19:56:17 +08:00
parent 75aca76150
commit 70693ae821
19 changed files with 116 additions and 14 deletions

View File

@@ -0,0 +1,13 @@
package com.sdm.common.entity.constants;
public class CommonConstants {
/**
* 系统管理员角色编码
*/
public static final String ROLE_CODE_ADMIN = "ROLE_ADMIN";
/**
* 普通用户角色编码
*/
public static final String ROLE_CODE_GENERAL = "GENERAL_USER";
}

View File

@@ -7,6 +7,7 @@ public enum MessageTemplateEnum {
TASK_ISSUE("任务通知", "接收到下发的仿真任务:%s请前往仿真数据管理平台查看"),
DATA_ALERT("数据通知", "您的数据存储空间已达阈值,请前往仿真数据管理平台查看"),
DATA_ALERT_MANAGER("数据通知", "%s的数据存储空间已达阈值请前往仿真数据管理平台查看"),
APPROVE_ALERT("审批通知", "收到一条%s消息请前往仿真数据管理平台查看"),
HPC_START("作业通知", "作业已发起"),
HPC_END("作业通知", "作业已结束")

View File

@@ -83,4 +83,19 @@ public class SysUserFeignClientImpl implements ISysUserFeignClient {
return SdmResponse.failed("查询用户组信息失败");
}
}
@Override
public SdmResponse<List<Long>> getUserByRoleCode(String roleCode, Long tenantId) {
SdmResponse<List<Long>> sdmResponse;
try {
sdmResponse = sysUserClient.getUserByRoleCode(roleCode, tenantId);
if (!sdmResponse.isSuccess() || sdmResponse.getData() == null){
return SdmResponse.failed("根据角色编码查询用户失败");
}
return sdmResponse;
} catch (Exception e) {
log.error("根据角色编码查询用户失败", e);
return SdmResponse.failed("根据角色编码查询用户失败");
}
}
}

View File

@@ -12,9 +12,7 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@@ -35,4 +33,7 @@ public interface ISysUserFeignClient {
*/
@PostMapping("/user/queryGroupDetail")
SdmResponse<SysUserGroupDetailResp> queryGroupDetail(@RequestBody @Validated QueryGroupDetailReq req);
@GetMapping("/user/getUserByRoleCode")
SdmResponse<List<Long>> getUserByRoleCode(@RequestParam("roleCode") String roleCode, @RequestParam("tenantId") Long tenantId);
}

View File

@@ -4,9 +4,12 @@ package com.sdm.data.job;
import com.alibaba.fastjson2.JSON;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.common.ThreadLocalContext;
import com.sdm.common.entity.constants.CommonConstants;
import com.sdm.common.entity.enums.MessageTemplateEnum;
import com.sdm.common.entity.req.system.SendMsgReq;
import com.sdm.common.feign.impl.system.MessageFeignClientImpl;
import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
import com.sdm.common.service.UserNameCacheService;
import com.sdm.data.model.entity.FileStorageQuota;
import com.sdm.data.service.DataStorageAnalysis;
import lombok.RequiredArgsConstructor;
@@ -15,7 +18,10 @@ import org.apache.commons.collections4.CollectionUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Component
@Slf4j
@@ -24,25 +30,47 @@ public class DataStorageMonitorJob {
private final DataStorageAnalysis dataStorageAnalysis;
private final MessageFeignClientImpl messageFeignClient;
private final SysUserFeignClientImpl sysUserFeignClient;
private final UserNameCacheService userNameCacheService;
/**
* 定时筛选存储空间达到阈值的用户 发送告警消息
*/
@Scheduled(cron = "${data.storage-monitor.cron:0 */1 * * * ?}")
@Scheduled(cron = "${data.storage-monitor.cron:0 */10 * * * ?}")
public void checkDataStorageSpaceAndSendAlert() {
log.info("开始执行定时筛选存储空间达到阈值的用户任务");
try {
SdmResponse<List<FileStorageQuota>> sdmResponse = dataStorageAnalysis.listAllUserQuotaForJob();
if (CollectionUtils.isNotEmpty(sdmResponse.getData())) {
List<FileStorageQuota> fileStorageQuotaList = sdmResponse.getData();
log.info("[DataStorageMonitorJob] checkDataStorageSpaceAndSendAlert fileStorageQuotaList:{}", JSON.toJSONString(fileStorageQuotaList));
ThreadLocalContext.setTenantId(fileStorageQuotaList.get(0).getTenantId());
ThreadLocalContext.setUserId(fileStorageQuotaList.get(0).getUserId());
Set<Long> userIdsSet = new HashSet<>(fileStorageQuotaList.stream().map(FileStorageQuota::getUserId).toList());
Map<Long, String> longStringMap = userNameCacheService.batchGetUserNames(userIdsSet);
fileStorageQuotaList.forEach(quota -> {
SendMsgReq req = new SendMsgReq();
req.setTitle(MessageTemplateEnum.DATA_ALERT.getTitle());
req.setContent(MessageTemplateEnum.DATA_ALERT.getContent());
req.setTenantId(String.valueOf(quota.getTenantId()));
req.setUserId(String.valueOf(quota.getUserId()));
log.info("[DataStorageMonitorJob] checkDataStorageSpaceAndSendAlert param:{}", JSON.toJSONString(req));
log.info("[DataStorageMonitorJob] checkDataStorageSpaceAndSendAlert user param:{}", JSON.toJSONString(req));
messageFeignClient.sendMessage(req);
// 系统管理员
SdmResponse<List<Long>> response = sysUserFeignClient.getUserByRoleCode(CommonConstants.ROLE_CODE_ADMIN, quota.getTenantId());
if (response.getData() != null) {
List<Long> managerUserIds = response.getData();
managerUserIds.removeIf(managerUserId -> managerUserId.equals(quota.getUserId()));
if (CollectionUtils.isNotEmpty(managerUserIds)) {
for (Long managerUserId : managerUserIds) {
req.setContent(MessageTemplateEnum.DATA_ALERT_MANAGER.getContent(longStringMap.get(quota.getUserId())));
req.setUserId(String.valueOf(managerUserId));
log.info("[DataStorageMonitorJob] checkDataStorageSpaceAndSendAlert manager param:{}", JSON.toJSONString(req));
messageFeignClient.sendMessage(req);
}
}
}
});
}
log.info("定时筛选存储空间达到阈值的用户任务执行完成");

View File

@@ -131,4 +131,4 @@ security:
data:
storage-monitor:
cron: 0 0 9 * * ?
cron: 0 0 0/1 * * ?

View File

@@ -131,4 +131,4 @@ security:
data:
storage-monitor:
cron: 0 0 9 * * ?
cron: 0 0 0/1 * * ?

View File

@@ -136,7 +136,7 @@ security:
data:
storage-monitor:
cron: 0 0 9 * * ?
cron: 0 0 0/1 * * ?
# 0单机处理可以指向本地1负载均衡轮询
serverType: 0

View File

@@ -131,4 +131,4 @@ security:
data:
storage-monitor:
cron: 0 0 9 * * ?
cron: 0 0 0/1 * * ?

View File

@@ -130,4 +130,4 @@ security:
data:
storage-monitor:
cron: 0 0 9 * * ?
cron: 0 0 0/1 * * ?

View File

@@ -229,5 +229,11 @@ public class SysUserController implements ISysUserFeignClient {
return ISysUserService.getUserToken(userId);
}
@Operation(summary = "根据角色编码获取所属用户", description = "根据角色编码获取所属用户")
@GetMapping("/getUserByRoleCode")
public SdmResponse<List<Long>> getUserByRoleCode(@Parameter(description = "根据角色编码获取所属用户请求参数") @RequestParam("roleCode") String roleCode, @RequestParam("tenantId") Long tenantId) {
return ISysUserService.getUserByRoleCode(roleCode, tenantId);
}
}

View File

@@ -50,4 +50,7 @@ public interface ISysUserService extends IService<SysUser> {
SdmResponse<CIDUserResp> queryGroupMember(GroupMemberQueryReq req);
SdmResponse<UserTokenResp> getUserToken(Long userId);
SdmResponse<List<Long>> getUserByRoleCode(String roleCode, Long tenantId);
}

View File

@@ -58,6 +58,9 @@ public class CIDISysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser>
@Value("${cid.user.getUserToken}")
private String getUserToken;
@Value("${cid.role.getUserByRoleCode}")
private String getUserByRoleCode;
@Override
public String getType() {
return type;
@@ -276,4 +279,21 @@ public class CIDISysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser>
return SdmResponse.failed("获取用户token失败: ");
}
}
@Override
public SdmResponse<List<Long>> getUserByRoleCode(String roleCode, Long tenantId) {
try {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("roleCode", roleCode);
paramMap.put("tenantId", tenantId);
log.info("正在向CID根据角色编码获取用户API发送请求: {},参数: {}", cidUrl + getUserByRoleCode, paramMap);
String resultJson = HttpUtil.get(cidUrl + getUserByRoleCode, paramMap);
log.info("收到CID根据角色编码获取用户API的响应: {}", resultJson);
SdmResponse<List<Long>> respSdmResponse = JSON.parseObject(resultJson, SdmResponse.class);
return respSdmResponse;
} catch (Exception e) {
log.error("根据角色编码查询用户失败", e);
return SdmResponse.failed("根据角色编码查询用户失败: ");
}
}
}

View File

@@ -306,4 +306,9 @@ public class LocalUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> im
return null;
}
@Override
public SdmResponse<List<Long>> getUserByRoleCode(String roleCode, Long tenantId) {
return null;
}
}

View File

@@ -155,6 +155,7 @@ cid:
getRoleByRoleCode: /spdm-role/getRoleByRoleCode
getRoleById: /spdm-role/getRoleById
listRoles: /spdm-role/listRoles
getUserByRoleCode: /spdm-role/getUserByRoleCode
tenant:
getTenantDetailById: /spdm-tenant/getTenantDetailById
listTenant: /spdm-tenant/listTenant
@@ -186,4 +187,5 @@ security:
- /systemMsg/sendMessage
- /systemLog/saveLog
- /tenant/list
- /tenant/initNewTenant
- /tenant/initNewTenant
- /user/getUserByRoleCode

View File

@@ -155,6 +155,7 @@ cid:
getRoleByRoleCode: /spdm-role/getRoleByRoleCode
getRoleById: /spdm-role/getRoleById
listRoles: /spdm-role/listRoles
getUserByRoleCode: /spdm-role/getUserByRoleCode
tenant:
getTenantDetailById: /spdm-tenant/getTenantDetailById
listTenant: /spdm-tenant/listTenant
@@ -186,4 +187,5 @@ security:
- /systemMsg/sendMessage
- /systemLog/saveLog
- /tenant/list
- /tenant/initNewTenant
- /tenant/initNewTenant
- /user/getUserByRoleCode

View File

@@ -155,6 +155,7 @@ cid:
getRoleByRoleCode: /spdm-role/getRoleByRoleCode
getRoleById: /spdm-role/getRoleById
listRoles: /spdm-role/listRoles
getUserByRoleCode: /spdm-role/getUserByRoleCode
tenant:
getTenantDetailById: /spdm-tenant/getTenantDetailById
listTenant: /spdm-tenant/listTenant
@@ -187,6 +188,7 @@ security:
- /systemLog/saveLog
- /tenant/list
- /tenant/initNewTenant
- /user/getUserByRoleCode
# 0单机处理可以指向本地1负载均衡轮询
serverType: 0

View File

@@ -155,6 +155,7 @@ cid:
getRoleByRoleCode: /spdm-role/getRoleByRoleCode
getRoleById: /spdm-role/getRoleById
listRoles: /spdm-role/listRoles
getUserByRoleCode: /spdm-role/getUserByRoleCode
tenant:
getTenantDetailById: /spdm-tenant/getTenantDetailById
listTenant: /spdm-tenant/listTenant
@@ -186,4 +187,5 @@ security:
- /systemMsg/sendMessage
- /tenant/list
- /systemLog/saveLog
- /tenant/initNewTenant
- /tenant/initNewTenant
- /user/getUserByRoleCode

View File

@@ -155,6 +155,7 @@ cid:
getRoleByRoleCode: /spdm-role/getRoleByRoleCode
getRoleById: /spdm-role/getRoleById
listRoles: /spdm-role/listRoles
getUserByRoleCode: /spdm-role/getUserByRoleCode
tenant:
getTenantDetailById: /spdm-tenant/getTenantDetailById
listTenant: /spdm-tenant/listTenant
@@ -186,4 +187,5 @@ security:
- /systemMsg/sendMessage
- /systemLog/saveLog
- /tenant/list
- /tenant/initNewTenant
- /tenant/initNewTenant
- /user/getUserByRoleCode