移除学科节点,基于学科信息查询优化
This commit is contained in:
@@ -418,6 +418,14 @@ public class DataFileController implements IDataFeignClient {
|
||||
return IDataFileService.getMinioDownloadUrl(fileId);
|
||||
}
|
||||
|
||||
@GetMapping("/getMinioPresignedUrlTest")
|
||||
@Operation(summary = "获取MinIO文件下载的预签名URL", description = "获取MinIO文件的预签名URL")
|
||||
public SdmResponse<MinioDownloadUrlResp> getMinioPresignedUrlTest(@Parameter(description = "文件id") @RequestParam("fileId") Long fileId) {
|
||||
MinioDownloadUrlResp minioDownloadUrlResp = new MinioDownloadUrlResp();
|
||||
minioDownloadUrlResp.setMinioDownloadUrl("https://minio.sdm.com/sdm/file/download/fileId");
|
||||
return SdmResponse.success(minioDownloadUrlResp);
|
||||
}
|
||||
|
||||
@GetMapping("/queryFileMetadataInfo")
|
||||
@Operation(summary = "根据节点uuid获取节点文件夹信息", description = "获取节点文件夹信息")
|
||||
public SdmResponse<FileMetadataInfoResp> queryFileMetadataInfo(@RequestParam(value = "uuid") String uuid, @RequestParam(value = "uuidOwnType") String uuidOwnType, @RequestParam(value = "dirId") Long dirId) {
|
||||
|
||||
@@ -4,15 +4,16 @@ import com.alibaba.fastjson2.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
||||
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
||||
import com.sdm.common.common.SdmResponse;
|
||||
import com.sdm.common.entity.enums.NodeTypeEnum;
|
||||
import com.sdm.common.entity.req.project.GetAllTasksByDisciplineReq;
|
||||
import com.sdm.common.entity.resp.PageDataResp;
|
||||
import com.sdm.common.feign.inter.project.ISimulationTaskFeignClient;
|
||||
import com.sdm.common.log.annotation.SysLog;
|
||||
import com.sdm.data.model.entity.FileMetadataInfo;
|
||||
import com.sdm.data.model.req.AddUserQuotaEntity;
|
||||
import com.sdm.data.model.req.ListUserQuotaReq;
|
||||
import com.sdm.data.model.req.QueryBigFileReq;
|
||||
import com.sdm.data.model.resp.ListBigFileResp;
|
||||
import com.sdm.data.service.DataStorageAnalysis;
|
||||
import com.sdm.data.service.IFileMetadataInfoService;
|
||||
import com.sdm.data.service.IFileStorageService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
@@ -21,8 +22,10 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 数据存储分析管理
|
||||
@@ -38,6 +41,9 @@ public class DataStorageAnalysisController {
|
||||
@Autowired
|
||||
private IFileStorageService fileStorageService;
|
||||
|
||||
@Autowired
|
||||
ISimulationTaskFeignClient simulationTaskFeignClient;
|
||||
|
||||
/**
|
||||
* 根据nodeId(项目nodeId)获取指定查询类型(queryNodeType)文件空间占用(近几个月、增量查询)
|
||||
* 查询项目存储空间占用:项目Uuid+项目queryNodeType
|
||||
@@ -78,6 +84,111 @@ public class DataStorageAnalysisController {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据学科获取存储空间占用
|
||||
* discipline已不是独立节点,而是task节点的属性,需要通过task节点汇总计算
|
||||
*/
|
||||
@GetMapping("/getNodeSizeByDiscipline")
|
||||
@Operation(summary = "根据学科获取存储空间占用")
|
||||
public SdmResponse getNodeSizeByDiscipline(
|
||||
@Parameter(description = "学科名称列表") @RequestParam(value = "disciplines", required = false) List<String> disciplines,
|
||||
@Parameter(description = "查询时间间隔(月)") @RequestParam(value = "intervalMonths", required = false) Integer intervalMonths,
|
||||
@Parameter(description = "增量查询指定的月:2025-06") @RequestParam(value = "targetYm", required = false) String targetYm
|
||||
) {
|
||||
if (CollectionUtils.isEmpty(disciplines)) {
|
||||
return SdmResponse.success(new ArrayList<>());
|
||||
}
|
||||
|
||||
// 1. 调用feign获取每个学科对应的任务名称列表
|
||||
GetAllTasksByDisciplineReq req = new GetAllTasksByDisciplineReq();
|
||||
req.setDisciplines(disciplines);
|
||||
SdmResponse<Map<String, List<String>>> disciplineTasksResponse = simulationTaskFeignClient.getAllTasksByDiscipline(req);
|
||||
|
||||
if (!disciplineTasksResponse.isSuccess() || ObjectUtils.isEmpty(disciplineTasksResponse.getData())) {
|
||||
log.warn("获取学科对应的任务列表失败");
|
||||
return SdmResponse.success(new ArrayList<>());
|
||||
}
|
||||
|
||||
Map<String, List<String>> discipline2TaskNames = disciplineTasksResponse.getData();
|
||||
|
||||
// 2. 对每个学科,汇总其下所有任务的存储空间
|
||||
List<JSONObject> result = new ArrayList<>();
|
||||
for (Map.Entry<String, List<String>> entry : discipline2TaskNames.entrySet()) {
|
||||
String discipline = entry.getKey();
|
||||
List<String> taskNames = entry.getValue();
|
||||
|
||||
if (CollectionUtils.isEmpty(taskNames)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
JSONObject disciplineSize = calculateDisciplineSize(discipline, taskNames, intervalMonths, targetYm);
|
||||
if (disciplineSize != null) {
|
||||
result.add(disciplineSize);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("获取学科[{}]存储空间占用失败", discipline, e);
|
||||
}
|
||||
}
|
||||
|
||||
return SdmResponse.success(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算单个学科的存储空间占用(汇总该学科下所有任务的存储空间)
|
||||
*/
|
||||
private JSONObject calculateDisciplineSize(String discipline, List<String> taskNames,
|
||||
Integer intervalMonths, String targetYm) {
|
||||
BigDecimal totalSize = BigDecimal.ZERO;
|
||||
BigDecimal beforeSize = BigDecimal.ZERO;
|
||||
BigDecimal incrementSize = BigDecimal.ZERO;
|
||||
|
||||
for (String taskName : taskNames) {
|
||||
try {
|
||||
SdmResponse<List<JSONObject>> sdmResponse = dataStorageAnalysis.getNodeSizeByNodeType(
|
||||
NodeTypeEnum.TASK.getValue(), taskName, intervalMonths, targetYm);
|
||||
|
||||
if (!sdmResponse.isSuccess() || CollectionUtils.isEmpty(sdmResponse.getData())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 汇总每个task的存储空间
|
||||
for (JSONObject taskSize : sdmResponse.getData()) {
|
||||
if (ObjectUtils.isNotEmpty(intervalMonths)) {
|
||||
// 近几个月模式:汇总totalSize
|
||||
Object sizeObj = taskSize.get("totalSize");
|
||||
if (sizeObj != null) {
|
||||
totalSize = totalSize.add(new BigDecimal(sizeObj.toString()));
|
||||
}
|
||||
} else if (ObjectUtils.isNotEmpty(targetYm)) {
|
||||
// 增量查询模式:汇总BEFORE和INCREMENT
|
||||
Object beforeObj = taskSize.get("BEFORE");
|
||||
Object incrementObj = taskSize.get("INCREMENT");
|
||||
if (beforeObj != null) {
|
||||
beforeSize = beforeSize.add(new BigDecimal(beforeObj.toString()));
|
||||
}
|
||||
if (incrementObj != null) {
|
||||
incrementSize = incrementSize.add(new BigDecimal(incrementObj.toString()));
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("获取任务[{}]存储空间失败", taskName, e);
|
||||
}
|
||||
}
|
||||
|
||||
// 构建返回结果
|
||||
JSONObject result = new JSONObject();
|
||||
result.put("nodeName", discipline);
|
||||
if (ObjectUtils.isNotEmpty(intervalMonths)) {
|
||||
result.put("totalSize", totalSize);
|
||||
} else if (ObjectUtils.isNotEmpty(targetYm)) {
|
||||
result.put("BEFORE", beforeSize);
|
||||
result.put("INCREMENT", incrementSize);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户组和用户id获取用户的空间占用
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user