From 24e29b42d72469359539b394c8b9dbfd699e8489 Mon Sep 17 00:00:00 2001 From: jianneng-fit2cloud Date: Thu, 27 Jun 2024 15:23:46 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E5=9B=BE=E8=A1=A8-=E7=AC=A6=E5=8F=B7?= =?UTF-8?q?=E5=9C=B0=E5=9B=BE):=20=E4=BF=AE=E5=A4=8D=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=98=BE=E7=A4=BAtooltip=E5=92=8C=E6=A0=87=E7=AD=BE=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../charts/impl/map/SymbolicMapHandler.java | 110 +++++++++++++++++- .../dataease/chart/utils/ChartDataBuild.java | 40 +++++++ 2 files changed, 147 insertions(+), 3 deletions(-) diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/map/SymbolicMapHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/map/SymbolicMapHandler.java index 47cc138fbe..c18b893ab8 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/map/SymbolicMapHandler.java +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/map/SymbolicMapHandler.java @@ -1,12 +1,33 @@ package io.dataease.chart.charts.impl.map; +import io.dataease.api.chart.dto.ColumnPermissionItem; import io.dataease.chart.charts.impl.GroupChartHandler; -import io.dataease.extensions.view.dto.AxisFormatResult; -import io.dataease.extensions.view.dto.ChartAxis; -import io.dataease.extensions.view.dto.ChartViewDTO; +import io.dataease.chart.utils.ChartDataBuild; +import io.dataease.dataset.utils.SqlUtils; +import io.dataease.datasource.provider.CalciteProvider; +import io.dataease.engine.sql.SQLProvider; +import io.dataease.engine.trans.Dimension2SQLObj; +import io.dataease.engine.trans.Quota2SQLObj; +import io.dataease.engine.utils.Utils; +import io.dataease.extensions.datasource.dto.DatasourceRequest; +import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; +import io.dataease.extensions.view.dto.*; +import io.dataease.extensions.view.model.SQLMeta; +import io.dataease.extensions.view.util.ChartDataUtil; +import io.dataease.extensions.view.util.FieldUtil; +import io.dataease.utils.BeanUtils; import lombok.Getter; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Component; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + @Component public class SymbolicMapHandler extends GroupChartHandler { @Getter @@ -19,4 +40,87 @@ public class SymbolicMapHandler extends GroupChartHandler { yAxis.addAll(view.getExtBubble()); return result; } + + + private Map customBuildResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List data, List detailFields, List detailData) { + boolean isDrill = filterResult + .getFilterList() + .stream() + .anyMatch(ele -> ele.getFilterType() == 1); + var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + Map result = ChartDataBuild.transSymbolicMapNormalWithDetail(xAxis, yAxis, data, detailFields, detailData); + return result; + } + + @Override + public T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map sqlMap, SQLMeta sqlMeta, CalciteProvider provider) { + var dsMap = (Map) sqlMap.get("dsMap"); + List dsList = new ArrayList<>(); + for (Map.Entry next : dsMap.entrySet()) { + dsList.add(next.getValue().getType()); + } + boolean needOrder = Utils.isNeedOrder(dsList); + boolean crossDs = Utils.isCrossDs(dsMap); + DatasourceRequest datasourceRequest = new DatasourceRequest(); + datasourceRequest.setDsList(dsMap); + var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + var allFields = getAllChartFields(view); + filterResult.getContext().put("allFields", allFields); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap); + Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap); + String querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); + querySql = SqlUtils.rebuildSQL(querySql, sqlMeta, crossDs, dsMap); + datasourceRequest.setQuery(querySql); + List data = (List) provider.fetchResultField(datasourceRequest).get("data"); + // 获取所有字段数据作为数据详情返回 + List detailData = new ArrayList<>(); + List xAxisIds = xAxis.stream().map(ChartViewFieldDTO::getId).toList(); + List detailFields = new ArrayList<>(); + detailFields.addAll(xAxis); + detailFields.addAll(allFields.stream().filter(field -> !xAxisIds.contains(field.getId())).toList()); + if (ObjectUtils.isNotEmpty(detailFields)) { + SQLMeta sqlMeta1 = new SQLMeta(); + BeanUtils.copyBean(sqlMeta1, sqlMeta); + sqlMeta1.setYFields(new ArrayList<>()); + Dimension2SQLObj.dimension2sqlObj(sqlMeta1, detailFields, FieldUtil.transFields(allFields), crossDs, dsMap); + String originSql = SQLProvider.createQuerySQL(sqlMeta1, false, needOrder, view); + originSql = SqlUtils.rebuildSQL(originSql, sqlMeta, crossDs, dsMap); + datasourceRequest.setQuery(originSql); + detailData = (List) provider.fetchResultField(datasourceRequest).get("data"); + } + //自定义排序 + data = ChartDataUtil.resultCustomSort(xAxis, data); + //快速计算 + quickCalc(xAxis, yAxis, data); + //数据重组逻辑可重载 + var result = customBuildResult(view, formatResult, filterResult, data, detailFields, detailData); + T calcResult = (T) new ChartCalcDataResult(); + calcResult.setData(result); + calcResult.setContext(filterResult.getContext()); + calcResult.setQuerySql(querySql); + calcResult.setOriginData(data); + return calcResult; + } + + @Override + public ChartViewDTO buildChart(ChartViewDTO view, ChartCalcDataResult calcResult, AxisFormatResult formatResult, CustomFilterResult filterResult) { + var desensitizationList = (Map) filterResult.getContext().get("desensitizationList"); + var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + // 如果是表格导出查询 则在此处直接就可以返回 + var extStack = formatResult.getAxisMap().get(ChartAxis.extStack); + if (view.getIsExcelExport()) { + Map sourceInfo = ChartDataBuild.transTableNormal(xAxis, yAxis, view, calcResult.getOriginData(), extStack, desensitizationList); + sourceInfo.put("sourceData", calcResult.getOriginData()); + view.setData(sourceInfo); + return view; + } + // 图表组件可再扩展 + Map mapTableNormal = calcResult.getData(); + var drillFilters = filterResult.getFilterList().stream().filter(f -> f.getFilterType() == 1).collect(Collectors.toList()); + var isDrill = CollectionUtils.isNotEmpty(drillFilters); + return uniteViewResult(calcResult.getQuerySql(), calcResult.getData(), mapTableNormal, view, isDrill, drillFilters, calcResult.getDynamicAssistFields(), calcResult.getAssistData()); + } } diff --git a/core/core-backend/src/main/java/io/dataease/chart/utils/ChartDataBuild.java b/core/core-backend/src/main/java/io/dataease/chart/utils/ChartDataBuild.java index 69eb672e74..1a234691eb 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/utils/ChartDataBuild.java +++ b/core/core-backend/src/main/java/io/dataease/chart/utils/ChartDataBuild.java @@ -1774,4 +1774,44 @@ public class ChartDataBuild { } } + public static Map transSymbolicMapNormalWithDetail(List xAxis, List yAxis, List data, List detailFields, List detailData) { + int detailIndex = xAxis.size(); + + List realDetailFields = detailFields.subList(detailIndex, detailFields.size()); + + List fields = new ArrayList<>(); + if (ObjectUtils.isNotEmpty(xAxis)) + fields.addAll(xAxis); + if (ObjectUtils.isNotEmpty(yAxis)) + fields.addAll(yAxis); + Map map = transTableNormal(fields, null, data, new HashMap<>()); + List> tableRow = (List>) map.get("tableRow"); + final int xEndIndex = detailIndex; + Map> groupDataList = detailData.stream().collect(Collectors.groupingBy(item -> "(" + StringUtils.join(ArrayUtils.subarray(item, 0, xEndIndex), ")-de-(") + ")")); + + tableRow.forEach(row -> { + String key = xAxis.stream().map(x -> String.format(format, row.get(x.getDataeaseName()).toString())).collect(Collectors.joining("-de-")); + List detailFieldValueList = groupDataList.get(key); + List> detailValueMapList = Optional.ofNullable(detailFieldValueList).orElse(new ArrayList<>()).stream().map((detailArr -> { + Map temp = new HashMap<>(); + for (int i = 0; i < realDetailFields.size(); i++) { + ChartViewFieldDTO realDetailField = realDetailFields.get(i); + temp.put(realDetailField.getDataeaseName(), detailArr[detailIndex + i]); + } + return temp; + })).collect(Collectors.toList()); + row.put("details", detailValueMapList); + }); + + ChartViewFieldDTO detailFieldDTO = new ChartViewFieldDTO(); + detailFieldDTO.setId(IDUtils.snowID()); + detailFieldDTO.setName("detail"); + detailFieldDTO.setDataeaseName("detail"); + fields.add(detailFieldDTO); + map.put("fields", fields); + map.put("detailFields", realDetailFields); + map.put("tableRow", tableRow); + return map; + } + }