add custom multicolumn processing

This commit is contained in:
Александр Савельев 2025-11-26 15:09:01 +03:00
parent e138171039
commit cf983c57d6

View file

@ -1,6 +1,7 @@
package ru.micord.ervu_dashboard.service;
import model.FileModel;
import model.column.GridDisplayColumn;
import model.grid.GridColumnAggregationValues;
import model.grid.GridDataExportFormat;
import model.grid.GridRow;
@ -8,18 +9,25 @@ import model.grid.GridRows;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.web.util.HtmlUtils;
import property.enums.GridDisplayType;
import property.grid.Formatter;
import property.grid.GridColumn;
import ru.cg.webbpm.modules.database.bean.entity_graph.EntityColumn;
import service.GridV2ServiceImpl;
import utils.ComplexColumnUtils;
import utils.GridUtils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
//todo: Убрать этот костыльный сервис, обсудить и реализовать аналогичную логику в платформе
public class ExportGridV2Service extends GridV2ServiceImpl {
protected FileModel getFileModelWithContent(String[] columnIdsToExport,
@ -173,4 +181,50 @@ public class ExportGridV2Service extends GridV2ServiceImpl {
boldStyle.setAlignment(HorizontalAlignment.CENTER);
return boldStyle;
}
@Override
protected Map.Entry<String, Object> getValueEntry(GridColumn column, Map<EntityColumn, Object> columnToDataMap) {
if (column.isMultiColumn()) {
return getEntryFromMultiColumn(column, columnToDataMap);
}
else return super.getValueEntry(column, columnToDataMap);
}
private Map.Entry<String, Object> getEntryFromMultiColumn(final GridColumn column,
final Map<EntityColumn, Object> columnToDataMap) {
String multiColumnName = evaluateMultiColumnName(column);
String multiColumnValue = evaluateMultiColumnValue(column, columnToDataMap);
return new AbstractMap.SimpleEntry<>(multiColumnName, multiColumnValue);
}
private String evaluateMultiColumnName(final GridColumn column) {
List<EntityColumn> entityColumns = Arrays.stream(column.displayColumns)
.map(GridDisplayColumn::getEntityColumn)
.collect(Collectors.toList());
return GridUtils.toGridColumnName(entityColumns, GridDisplayType.MULTI_COLUMN);
}
private String evaluateMultiColumnValue(final GridColumn column,
final Map<EntityColumn, Object> columnToDataMap) {
GridDisplayColumn[] displayColumns = column.displayColumns;
return Arrays.stream(displayColumns)
.map(displayColumn -> getMultiColFormattedValue(displayColumn, columnToDataMap))
.filter(value -> !value.equals(""))
.findFirst()
.orElse(null);
}
private String getMultiColFormattedValue(final GridDisplayColumn column,
final Map<EntityColumn, Object> columnToDataMap) {
EntityColumn entityColumn = column.getEntityColumn();
Object formattedValue = GridUtils.getFormattedValue(
columnToDataMap.get(entityColumn), entityColumn.getType(), column.getFormatter()
);
String formattedResult = formattedValue == null || formattedValue.equals("")
? column.getEmptyValue()
: column.getPrefix() + formattedValue + column.getPostfix();
return HtmlUtils.htmlEscape(formattedResult, StandardCharsets.UTF_8.name());
}
}