Merge remote-tracking branch 'origin/main'

This commit is contained in:
2025-12-17 09:42:04 +08:00
11 changed files with 314 additions and 9 deletions

View File

@@ -0,0 +1,10 @@
package com.sdm.common.entity.req.data;
import lombok.Data;
import java.util.List;
@Data
public class QueryFileReq {
List<Long> fileIdList;
}

View File

@@ -24,4 +24,14 @@ public class TaskTreeExportExcelParam {
*/
private List<String> taskIdList;
/**
* 合并单元格的起始索引
*/
private Integer startIndex;
/**
* 合并单元格的结束索引
*/
private Integer endIndex;
}

View File

@@ -194,4 +194,18 @@ public class DataClientFeignClientImpl implements IDataFeignClient {
return SdmResponse.failed("权限更新失败");
}
}
@Override
public SdmResponse<List<FileMetadataInfoResp>> queryFileListByIdList(QueryFileReq queryFileReq) {
SdmResponse response;
try {
response = dataClient.queryFileListByIdList(queryFileReq);
log.info("查询文件列表成功:"+ response);
return response;
} catch (Exception e) {
log.error("查询文件列表失败:", e);
return SdmResponse.failed("查询文件列表失败");
}
}
}

View File

@@ -73,4 +73,7 @@ public interface IDataFeignClient {
@PostMapping("/data/updatePermission")
SdmResponse updatePermission(@RequestBody UpdatePermissionReq req);
@PostMapping("/data/queryFileListByIdList")
SdmResponse<List<FileMetadataInfoResp>> queryFileListByIdList(@RequestBody QueryFileReq queryFileReq);
}

View File

@@ -5,6 +5,7 @@ import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.sdm.common.entity.ExportExcelFormat;
import com.sdm.common.entity.req.task.TaskTreeExportExcelParam;
import io.micrometer.common.util.StringUtils;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
@@ -12,7 +13,6 @@ import org.apache.commons.lang3.ObjectUtils;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;
@@ -214,6 +214,10 @@ public class ExcelUtil {
style.setBorderTop(borderStyle);
style.setBorderRight(borderStyle);
style.setFont(font);
// 水平居中
style.setAlignment(HorizontalAlignment.CENTER);
// 垂直居中
style.setVerticalAlignment(VerticalAlignment.CENTER);
return style;
}
/**
@@ -584,4 +588,172 @@ public class ExcelUtil {
exportExcel(excelSheets,response);
}
/**
* 导出excel按任务维度进行合并单元格
* @param dataArray
* @param exportExcelFormats
*/
public static void exportExcelOneDimensional(JSONArray dataArray,List<ExportExcelFormat> exportExcelFormats,HttpServletResponse response,List<TaskTreeExportExcelParam> paramList)
{
ExcelSheet excelSheet = new ExcelSheet();
excelSheet.setSheetName("export sheet1");
//获取excel表头
List<HeadVO> excelHeader = getExcelHeader(exportExcelFormats,null);
excelSheet.setHeads(excelHeader);
//获取excel表行数据
for(int index=0;index<dataArray.size();index++)
{
JSONObject rowObj = dataArray.getJSONObject(index);
RowValue rowValue = new RowValue();
for (ExportExcelFormat exportExcelFormat : exportExcelFormats)
{
ExcelCellValue cellValue = new ExcelCellValue();
String value = rowObj.getString(exportExcelFormat.getKey());
if(value != null && !"null".equalsIgnoreCase(value)) {
JSONObject dictData = exportExcelFormat.getDictData();
if(ObjectUtils.isNotEmpty(dictData))
{
if (StringUtils.isNotBlank(dictData.getString(value))) {
value = dictData.getString(value);
}
}
cellValue.setValue(value);
}
rowValue.getCells().add(cellValue);
}
excelSheet.getRowValues().add(rowValue);
}
List<ExcelSheet> excelSheets = new ArrayList<>();
excelSheets.add(excelSheet);
exportExcelOneDimensional(excelSheets,response,paramList);
}
/**
* 导出excel
* @param sheets
* @param response
*/
public static void exportExcelOneDimensional(List<ExcelSheet> sheets, HttpServletResponse response,List<TaskTreeExportExcelParam> paramList) {
try {
Workbook workBook = new XSSFWorkbook();
for (ExcelSheet sheetData : sheets) {
Sheet sheet = workBook.createSheet(sheetData.getSheetName());
List<ColumnMergeInfo> columnMergeInfos = writeSheetHeader(workBook,sheet, sheetData.getHeads());
writeSheetRowsOneDimensional(workBook,sheet, sheetData.getRowValues(), columnMergeInfos,sheetData.getHeads(),paramList);
autoSizeColumnWidth(sheet);
}
workBook.write(response.getOutputStream());
workBook.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* 写入excel行数据
* @param sheet
* @param rowValues
*/
private static void writeSheetRowsOneDimensional(Workbook workbook,Sheet sheet,List<RowValue> rowValues,List<ColumnMergeInfo> columnMergeInfos,List<HeadVO> headers,List<TaskTreeExportExcelParam> paramList)
{
int rowIndex = 1;
Font cellFont = makeFont(workbook,"宋体",false,(short) 11,IndexedColors.BLACK.getIndex());
CellStyle cellStyle = makeStyle(workbook,cellFont,BorderStyle.THIN);
for(RowValue rowValue : rowValues)
{
Row row = sheet.createRow(rowIndex);
int columnIndex = 0;
for(ExcelCellValue cellValue : rowValue.getCells())
{
HeadVO headVO = headers.get(columnIndex);
if(!headVO.getExcelHeaderInfo().isBShow()) {
columnIndex++;
continue;
}
Cell cell = row.createCell(columnIndex);
cell.setCellStyle(cellStyle);
cell.setCellValue(String.valueOf(cellValue.getValue()));
columnIndex++;
}
rowIndex++;
}
Integer startIndex;
Integer endIndex;
for (TaskTreeExportExcelParam taskTreeExportExcelParam : paramList) {
startIndex = taskTreeExportExcelParam.getStartIndex();
endIndex = taskTreeExportExcelParam.getEndIndex();
if (!Objects.equals(startIndex, endIndex)) {
for (int i = 0; i < 8; i++) {
sheet.addMergedRegion(new CellRangeAddress(startIndex, endIndex, i, i));
}
}
}
}
/**
* 自动设置列宽为当前列最长文本宽度
* @param sheet Excel工作表
*/
public static void autoSizeColumnWidth(Sheet sheet) {
// 存储每列的最大字符数
Map<Integer, Integer> columnMaxLength = new HashMap<>();
// 1. 遍历所有行,统计每列最大字符数
for (Row row : sheet) {
for (Cell cell : row) {
int columnIndex = cell.getColumnIndex();
String cellValue = getCellStringValue(cell);
int currentLength = cellValue.length();
// 更新当前列的最大长度
columnMaxLength.put(columnIndex,
Math.max(columnMaxLength.getOrDefault(columnIndex, 0), currentLength));
}
}
// 2. 遍历列,设置适配宽度
for (Map.Entry<Integer, Integer> entry : columnMaxLength.entrySet()) {
int columnIndex = entry.getKey();
int maxLength = entry.getValue();
// 计算列宽:字符数 × 256POI列宽单位 + 边距2000
// 256 = 1个字符宽度2000 = 边距(可根据需求调整)
int columnWidth = Math.min(maxLength * 256 + 2000, 65535); // 最大列宽不超过65535
sheet.setColumnWidth(columnIndex, columnWidth);
}
}
/**
* 获取单元格的字符串值(兼容不同单元格类型)
* @param cell 单元格
* @return 字符串值
*/
private static String getCellStringValue(Cell cell) {
if (cell == null) {
return "";
}
switch (cell.getCellType()) {
case STRING:
return cell.getStringCellValue().trim();
case NUMERIC:
// 处理数字(避免科学计数法)
return String.valueOf((long) cell.getNumericCellValue()).trim();
case BOOLEAN:
return String.valueOf(cell.getBooleanCellValue()).trim();
case FORMULA:
// 计算公式结果
try {
return String.valueOf(cell.getNumericCellValue()).trim();
} catch (Exception e) {
return cell.getStringCellValue().trim();
}
default:
return "";
}
}
}

View File

@@ -554,4 +554,9 @@ public class DataFileController implements IDataFeignClient {
}
}
}
@PostMapping ("/queryFileListByIdList")
public SdmResponse<List<FileMetadataInfoResp>> queryFileListByIdList(QueryFileReq queryFileReq) {
return IDataFileService.queryFileListByIdList(queryFileReq);
}
}

View File

@@ -357,4 +357,6 @@ public interface IDataFileService {
SdmResponse downloadFileForEdit(Long fileId);
default SdmResponse<List<FileMetadataInfoResp>> queryFileListByIdList(QueryFileReq queryFileReq){return null;}
}

View File

@@ -2933,4 +2933,18 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
return SdmResponse.failed("onlyoffice编辑文件失败");
}
public SdmResponse<List<FileMetadataInfoResp>> queryFileListByIdList(QueryFileReq queryFileReq) {
List<FileMetadataInfo> fileMetadataInfos = fileMetadataInfoService.lambdaQuery().in(FileMetadataInfo::getId, queryFileReq.getFileIdList()).list();
if (CollectionUtils.isEmpty(fileMetadataInfos)) {
return SdmResponse.failed("未查询到文件信息");
}
List<FileMetadataInfoResp> fileMetadataInfoResps = new ArrayList<>();
fileMetadataInfos.forEach(fileMetadataInfo -> {
FileMetadataInfoResp fileMetadataInfoResp = new FileMetadataInfoResp();
BeanUtils.copyProperties(fileMetadataInfo, fileMetadataInfoResp);
fileMetadataInfoResps.add(fileMetadataInfoResp);
});
return SdmResponse.success(fileMetadataInfoResps);
}
}

View File

@@ -35,7 +35,6 @@ public class PerformanceNodePo extends NodeAllBase {
private String performanceType;
private String standard;
private String standardName;
private String highValue;
private String lowValue;
private String englishName;

View File

@@ -11,14 +11,12 @@ import com.sdm.common.entity.enums.DirTypeEnum;
import com.sdm.common.entity.enums.FilePermissionEnum;
import com.sdm.common.entity.enums.NodeTypeEnum;
import com.sdm.common.entity.enums.ValueTypeEnum;
import com.sdm.common.entity.req.data.CreateDirReq;
import com.sdm.common.entity.req.data.DelDirReq;
import com.sdm.common.entity.req.data.RenameDirReq;
import com.sdm.common.entity.req.data.UpdatePermissionReq;
import com.sdm.common.entity.req.data.*;
import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.req.task.TaskExportExcelParam;
import com.sdm.common.entity.req.task.TaskTreeExportExcelFormat;
import com.sdm.common.entity.req.task.TaskTreeExportExcelParam;
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.feign.impl.data.DataClientFeignClientImpl;
import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
@@ -432,6 +430,37 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
}).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(currentNodeAssociatedTaskList)) {
// 转换执行规范的文件id为文件名称
List<String> standardList = currentNodeAssociatedTaskList.stream().map(TaskNodePo::getStandard).toList();
Map<Long, String> dataMap = Map.of();
if (CollectionUtils.isNotEmpty(standardList)) {
List<Long> fileIdList = new ArrayList<>();
standardList = standardList.stream().filter(StringUtils::isNotBlank).toList();
if (CollectionUtils.isNotEmpty(standardList)) {
for (String standard : standardList) {
fileIdList.addAll(Arrays.stream(standard.split(",")).toList().stream().map(Long::valueOf).toList());
}
QueryFileReq queryFileReq = new QueryFileReq();
queryFileReq.setFileIdList(fileIdList);
SdmResponse<List<FileMetadataInfoResp>> listSdmResponse = dataClientFeignClient.queryFileListByIdList(queryFileReq);
if (listSdmResponse.isSuccess()) {
List<FileMetadataInfoResp> dataList = listSdmResponse.getData();
dataMap = dataList.stream().collect(Collectors.toMap(FileMetadataInfoResp::getId, FileMetadataInfoResp::getOriginalName));
}
}
}
List<Long> fileIdList;
for (TaskNodePo taskNodePo : currentNodeAssociatedTaskList) {
List<String> fileNameList = new ArrayList<>();
if (StringUtils.isNotBlank(taskNodePo.getStandard())) {
fileIdList = Arrays.stream(taskNodePo.getStandard().split(",")).toList().stream().map(Long::valueOf).toList();
for (Long fileId : fileIdList) {
fileNameList.add(dataMap.get(fileId));
}
taskNodePo.setStandard(String.join(",", fileNameList));
}
}
// 查询当前任务下指标
Map<String, TaskNodePo> taskMap = currentNodeAssociatedTaskList.stream().collect(Collectors.groupingBy(
TaskNodePo::getUuid,

View File

@@ -11,6 +11,7 @@ import com.sdm.common.entity.enums.DirTypeEnum;
import com.sdm.common.entity.enums.FilePermissionEnum;
import com.sdm.common.entity.enums.NodeTypeEnum;
import com.sdm.common.entity.req.data.CreateDirReq;
import com.sdm.common.entity.req.data.QueryFileReq;
import com.sdm.common.entity.req.data.UpdatePermissionReq;
import com.sdm.common.entity.req.project.SimulationPerformance;
import com.sdm.common.entity.req.system.UserQueryReq;
@@ -18,6 +19,7 @@ import com.sdm.common.entity.req.task.TaskExportExcelFormat;
import com.sdm.common.entity.req.task.TaskExportExcelParam;
import com.sdm.common.entity.req.task.TaskTreeExportExcelFormat;
import com.sdm.common.entity.req.task.TaskTreeExportExcelParam;
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.feign.impl.data.DataClientFeignClientImpl;
import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
@@ -2226,6 +2228,7 @@ public class TaskServiceImpl implements ITaskService {
for (PerformanceNodePo performanceNodePo : performanceNodePoList) {
SpdmExportNewTaskVo exportNewTaskVo = new SpdmExportNewTaskVo();
BeanUtils.copyProperties(performanceNodePo, exportNewTaskVo);
BeanUtils.copyProperties(spdmExportNewTaskVo,exportNewTaskVo);
exportNewTaskVo.setMachineName(spdmExportNewTaskVo.getMachineName());
exportNewTaskVo.setMachineCode(spdmExportNewTaskVo.getMachineCode());
exportNewTaskVo.setWorkspaceName(spdmExportNewTaskVo.getWorkspaceName());
@@ -2238,14 +2241,58 @@ public class TaskServiceImpl implements ITaskService {
spdmExportNewTaskVoList.add(exportNewTaskVo);
}
}
allExportNewTaskVoList.add(spdmExportNewTaskVo);
if (CollectionUtils.isNotEmpty(spdmExportNewTaskVoList)) {
allExportNewTaskVoList.addAll(spdmExportNewTaskVoList);
}
}
}
}
ExcelUtil.exportExcelNoMerge(JSONArray.from(allExportNewTaskVoList), exportExcelFormats, httpServletResponse);
List<TaskTreeExportExcelParam> paramList = new ArrayList<>();
String currentTaskName = "";
long total;
for (int i = 0; i < allExportNewTaskVoList.size() ; i++) {
SpdmExportNewTaskVo spdmExportNewTaskVo = allExportNewTaskVoList.get(i);
if (!currentTaskName.equals(spdmExportNewTaskVo.getTaskName())) {
total = allExportNewTaskVoList.stream().filter(task -> task.getTaskName().equals(spdmExportNewTaskVo.getTaskName())).count();
TaskTreeExportExcelParam taskTreeExportExcelParam = new TaskTreeExportExcelParam();
taskTreeExportExcelParam.setStartIndex(i + 1);
taskTreeExportExcelParam.setEndIndex(i + (int) total);
paramList.add(taskTreeExportExcelParam);
}
currentTaskName = spdmExportNewTaskVo.getTaskName();
}
// 转换执行规范的文件id为文件名称
List<String> standardList = allExportNewTaskVoList.stream().map(SpdmExportNewTaskVo::getStandard).toList();
Map<Long, String> dataMap = Map.of();
if (CollectionUtils.isNotEmpty(standardList)) {
List<Long> fileIdList = new ArrayList<>();
standardList = standardList.stream().filter(StringUtils::isNotBlank).toList();
if (CollectionUtils.isNotEmpty(standardList)) {
for (String standard : standardList) {
fileIdList.addAll(Arrays.stream(standard.split(",")).toList().stream().map(Long::valueOf).toList());
}
QueryFileReq queryFileReq = new QueryFileReq();
queryFileReq.setFileIdList(fileIdList);
SdmResponse<List<FileMetadataInfoResp>> listSdmResponse = dataClientFeignClient.queryFileListByIdList(queryFileReq);
if (listSdmResponse.isSuccess()) {
List<FileMetadataInfoResp> dataList = listSdmResponse.getData();
dataMap = dataList.stream().collect(Collectors.toMap(FileMetadataInfoResp::getId, FileMetadataInfoResp::getOriginalName));
}
}
}
List<Long> fileIdList;
for (SpdmExportNewTaskVo spdmExportNewTaskVo : allExportNewTaskVoList) {
List<String> fileNameList = new ArrayList<>();
if (StringUtils.isNotBlank(spdmExportNewTaskVo.getStandard())) {
fileIdList = Arrays.stream(spdmExportNewTaskVo.getStandard().split(",")).toList().stream().map(Long::valueOf).toList();
for (Long fileId : fileIdList) {
fileNameList.add(dataMap.get(fileId));
}
spdmExportNewTaskVo.setStandard(String.join(",", fileNameList));
}
}
ExcelUtil.exportExcelOneDimensional(JSONArray.from(allExportNewTaskVoList), exportExcelFormats, httpServletResponse,paramList);
} else {
response = SdmResponse.failed(taskRespond.getMessage());
}