移除学科节点,基于学科信息查询优化

This commit is contained in:
2026-01-20 16:20:55 +08:00
parent 73abfce1ce
commit 7c5567ccf7
14 changed files with 439 additions and 146 deletions

View File

@@ -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) {

View File

@@ -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获取用户的空间占用
*