diff --git a/backend/src/main/java/ru/micord/ervu_dashboard/service/ExportGridV2Service.java b/backend/src/main/java/ru/micord/ervu_dashboard/service/ExportGridV2Service.java index 5665bdd9..3c8405e9 100644 --- a/backend/src/main/java/ru/micord/ervu_dashboard/service/ExportGridV2Service.java +++ b/backend/src/main/java/ru/micord/ervu_dashboard/service/ExportGridV2Service.java @@ -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 getValueEntry(GridColumn column, Map columnToDataMap) { + if (column.isMultiColumn()) { + return getEntryFromMultiColumn(column, columnToDataMap); + } + else return super.getValueEntry(column, columnToDataMap); + + } + + private Map.Entry getEntryFromMultiColumn(final GridColumn column, + final Map columnToDataMap) { + String multiColumnName = evaluateMultiColumnName(column); + String multiColumnValue = evaluateMultiColumnValue(column, columnToDataMap); + return new AbstractMap.SimpleEntry<>(multiColumnName, multiColumnValue); + } + + private String evaluateMultiColumnName(final GridColumn column) { + List 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 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 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()); + } + }