From dc6b32f93ea2e7fa63c584fb95fc2316de0a0055 Mon Sep 17 00:00:00 2001 From: wisonic-s Date: Thu, 27 Jun 2024 01:08:55 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E5=9B=BE=E8=A1=A8):=20=E6=B7=B7?= =?UTF-8?q?=E5=90=88=E5=9B=BE=E6=95=B0=E6=8D=AE=E8=8E=B7=E5=8F=96=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chart/charts/AbstractChartHandler.java | 1 + .../charts/impl/DefaultChartHandler.java | 63 +++++- .../charts/impl/mix/ChartMixHandler.java | 21 -- .../charts/impl/mix/GroupMixHandler.java | 93 +++++++++ .../chart/charts/impl/mix/MixHandler.java | 179 ++++++++++++++++++ .../charts/impl/mix/StackMixHandler.java | 109 +++++++++++ .../chart/manage/ChartDataManage.java | 80 +------- 7 files changed, 447 insertions(+), 99 deletions(-) delete mode 100644 core/core-backend/src/main/java/io/dataease/chart/charts/impl/mix/ChartMixHandler.java create mode 100644 core/core-backend/src/main/java/io/dataease/chart/charts/impl/mix/GroupMixHandler.java create mode 100644 core/core-backend/src/main/java/io/dataease/chart/charts/impl/mix/MixHandler.java create mode 100644 core/core-backend/src/main/java/io/dataease/chart/charts/impl/mix/StackMixHandler.java diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/AbstractChartHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/AbstractChartHandler.java index c8cac291ab..e877f10436 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/charts/AbstractChartHandler.java +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/AbstractChartHandler.java @@ -11,4 +11,5 @@ public abstract class AbstractChartHandler { public abstract T formatAxis(ChartViewDTO view); public abstract T customFilter(ChartViewDTO view, List filterList, K formatResult); public abstract T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map sqlMap, SQLMeta sqlMeta, CalciteProvider provider); + public abstract ChartViewDTO buildChart(ChartViewDTO view, ChartCalcDataResult calcResult, AxisFormatResult formatResult, CustomFilterResult filterResult); } diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/DefaultChartHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/DefaultChartHandler.java index c6cf543c5c..2fe0da4fc9 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/DefaultChartHandler.java +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/DefaultChartHandler.java @@ -1,5 +1,6 @@ package io.dataease.chart.charts.impl; +import io.dataease.api.chart.dto.ColumnPermissionItem; import io.dataease.chart.charts.AbstractChartHandler; import io.dataease.chart.charts.ChartHandlerManager; import io.dataease.chart.constant.ChartConstants; @@ -24,6 +25,7 @@ import io.dataease.utils.JsonUtil; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import lombok.Getter; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @@ -114,6 +116,65 @@ public class DefaultChartHandler extends AbstractChartHandler { 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 map = new TreeMap<>(); + // 图表组件可再扩展 + Map mapTableNormal = ChartDataBuild.transTableNormal(xAxis, yAxis, view, calcResult.getOriginData(), extStack, desensitizationList); + var drillFilters = filterResult.getFilterList().stream().filter(f -> f.getFilterType() == 1).collect(Collectors.toList()); + var isDrill = CollectionUtils.isNotEmpty(drillFilters); + ChartViewDTO chartViewDTO = uniteViewResult(calcResult.getQuerySql(), calcResult.getData(), mapTableNormal, view, isDrill, drillFilters, calcResult.getDynamicAssistFields(), calcResult.getAssistData()); + return chartViewDTO; + } + + + public ChartViewDTO uniteViewResult(String sql, Map chartData, Map tableData, ChartViewDTO view, Boolean isDrill, List drillFilters, List dynamicAssistFields, List assistData) { + + Map map = new HashMap<>(); + map.putAll(chartData); + map.putAll(tableData); + + // get all fields + List allFields = getAllChartFields(view); + map.put("sourceFields", allFields); + // merge assist result + mergeAssistField(dynamicAssistFields, assistData); + map.put("dynamicAssistLines", dynamicAssistFields); + + ChartViewDTO dto = new ChartViewDTO(); + BeanUtils.copyBean(dto, view); + dto.setData(map); + dto.setSql(java.util.Base64.getEncoder().encodeToString(sql.getBytes())); + dto.setDrill(isDrill); + dto.setDrillFilters(drillFilters); + return dto; + } + + protected void mergeAssistField(List dynamicAssistFields, List assistData) { + if (ObjectUtils.isEmpty(assistData)) { + return; + } + String[] strings = assistData.get(0); + for (int i = 0; i < dynamicAssistFields.size(); i++) { + if (i < strings.length) { + ChartSeniorAssistDTO chartSeniorAssistDTO = dynamicAssistFields.get(i); + chartSeniorAssistDTO.setValue(strings[i]); + } + } + } + protected List getAllChartFields(ChartViewDTO view) { // get all fields Map> stringListMap = chartViewManege.listByDQ(view.getTableId(), view.getId(), view); @@ -125,7 +186,7 @@ public class DefaultChartHandler extends AbstractChartHandler { return allFields.stream().filter(ele -> ele.getId() != -1L).collect(Collectors.toList()); } - protected List getDynamicAssistFields(ChartViewDTO view) throws Exception { + protected List getDynamicAssistFields(ChartViewDTO view) { List list = new ArrayList<>(); Map senior = view.getSenior(); diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/mix/ChartMixHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/mix/ChartMixHandler.java deleted file mode 100644 index 96963add3c..0000000000 --- a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/mix/ChartMixHandler.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.dataease.chart.charts.impl.mix; - -import io.dataease.chart.charts.impl.YoyChartHandler; -import io.dataease.extensions.view.dto.AxisFormatResult; -import io.dataease.chart.charts.impl.DefaultChartHandler; -import io.dataease.extensions.view.dto.ChartViewDTO; -import lombok.Getter; -import org.springframework.stereotype.Component; - -@Component -public class ChartMixHandler extends DefaultChartHandler { - @Getter - private final String type = "chart-mix"; - - @Override - public AxisFormatResult formatAxis(ChartViewDTO view) { - var result = super.formatAxis(view); - return result; - } - -} diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/mix/GroupMixHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/mix/GroupMixHandler.java new file mode 100644 index 0000000000..bda99c3178 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/mix/GroupMixHandler.java @@ -0,0 +1,93 @@ +package io.dataease.chart.charts.impl.mix; + +import io.dataease.api.chart.dto.ColumnPermissionItem; +import io.dataease.chart.utils.ChartDataBuild; +import io.dataease.extensions.view.dto.*; +import lombok.Getter; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.stream.Collectors; + +@Component +public class GroupMixHandler extends MixHandler{ + @Getter + private String type = "chart-mix-group"; + + @Override + public AxisFormatResult formatAxis(ChartViewDTO view) { + var axisMap = new HashMap>(); + var context = new HashMap(); + AxisFormatResult result = new AxisFormatResult(axisMap, context); + //左轴分组子维度,非分组不需要 + axisMap.put(ChartAxis.xAxisExt,view.getXAxisExt()); + //左轴堆叠子维度,非堆叠不需要 + axisMap.put(ChartAxis.extStack, Collections.emptyList()); + //左轴指标 + axisMap.put(ChartAxis.yAxis, view.getYAxis()); + //右轴分组子维度 + axisMap.put(ChartAxis.extBubble, view.getExtBubble()); + //右轴指标 + axisMap.put(ChartAxis.yAxisExt, view.getYAxisExt()); + //去除除了x轴以外的排序 + axisMap.forEach((k, v) -> { + v.forEach(x -> x.setSort("none")); + }); + axisMap.put(ChartAxis.extLabel, view.getExtLabel()); + axisMap.put(ChartAxis.extTooltip, view.getExtTooltip()); + //图表整体主维度 + var xAxis = new ArrayList<>(view.getXAxis()); + var xAxisGroup = new ArrayList<>(view.getXAxis()); + xAxisGroup.addAll(view.getXAxisExt()); + axisMap.put(ChartAxis.xAxis, xAxisGroup); + context.put("xAxisBase", xAxis); + return result; + } + + @Override + public Map buildNormalResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List data) { + return super.buildNormalResult(view, formatResult, filterResult, data); + } + + @Override + public ChartViewDTO buildChart(ChartViewDTO view, ChartCalcDataResult calcResult, AxisFormatResult formatResult, CustomFilterResult filterResult) { + var desensitizationList = (Map) filterResult.getContext().get("desensitizationList"); + var leftCalcResult = (ChartCalcDataResult) calcResult.getData().get("left"); + var leftFields = new ArrayList(); + leftFields.addAll(view.getXAxis()); + leftFields.addAll(view.getXAxisExt()); + leftFields.addAll(view.getYAxis()); + var leftOriginData = leftCalcResult.getOriginData(); + var leftTable = ChartDataBuild.transTableNormal(leftFields, view, leftOriginData, desensitizationList); + mergeAssistField(leftCalcResult.getDynamicAssistFields(), leftCalcResult.getAssistData()); + var leftData = new HashMap(leftTable); + leftData.putAll(leftCalcResult.getData()); + leftData.put("dynamicAssistLines", leftCalcResult.getDynamicAssistFields()); + + var rightCalcResult = (ChartCalcDataResult) calcResult.getData().get("right"); + var rightFields = new ArrayList(); + rightFields.addAll(view.getXAxis()); + rightFields.addAll(view.getExtBubble()); + rightFields.addAll(view.getYAxisExt()); + var rightOriginData = rightCalcResult.getOriginData(); + var rightTable = ChartDataBuild.transTableNormal(rightFields, view, rightOriginData, desensitizationList); + var rightData = new HashMap(leftTable); + rightData.putAll(rightCalcResult.getData()); + rightData.put("dynamicAssistLines", rightCalcResult.getDynamicAssistFields()); + + var allFields = (List) filterResult.getContext().get("allFields"); + // 构建结果 + Map chartData = new TreeMap<>(); + chartData.put("left", leftData); + chartData.put("right", rightData); + + var drillFilters = filterResult.getFilterList().stream().filter(f -> f.getFilterType() == 1).collect(Collectors.toList()); + var isDrill = CollectionUtils.isNotEmpty(drillFilters); + view.setDrillFilters(drillFilters); + view.setDrill(isDrill); + view.setSql(leftCalcResult.getQuerySql()); + view.setData(chartData); + return view; + } +} diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/mix/MixHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/mix/MixHandler.java new file mode 100644 index 0000000000..7cb6271afa --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/mix/MixHandler.java @@ -0,0 +1,179 @@ +package io.dataease.chart.charts.impl.mix; + +import io.dataease.api.chart.dto.ColumnPermissionItem; +import io.dataease.chart.charts.impl.YoyChartHandler; +import io.dataease.chart.utils.ChartDataBuild; +import io.dataease.datasource.provider.CalciteProvider; +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 lombok.Getter; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.stream.Collectors; + +@Component +public class MixHandler extends YoyChartHandler { + @Getter + private final String type = "chart-mix"; + + @Override + public AxisFormatResult formatAxis(ChartViewDTO view) { + var axisMap = new HashMap>(); + var context = new HashMap(); + AxisFormatResult result = new AxisFormatResult(axisMap, context); + //左轴分组子维度,非分组不需要 + axisMap.put(ChartAxis.xAxisExt, Collections.emptyList()); + //左轴堆叠子维度,非堆叠不需要 + axisMap.put(ChartAxis.extStack, Collections.emptyList()); + //左轴指标 + axisMap.put(ChartAxis.yAxis, view.getYAxis()); + //右轴分组子维度 + axisMap.put(ChartAxis.extBubble, view.getExtBubble()); + //右轴指标 + axisMap.put(ChartAxis.yAxisExt, view.getYAxisExt()); + //去除除了x轴以外的排序 + axisMap.forEach((k, v) -> { + v.forEach(x -> x.setSort("none")); + }); + axisMap.put(ChartAxis.extLabel, view.getExtLabel()); + axisMap.put(ChartAxis.extTooltip, view.getExtTooltip()); + //图表整体主维度 + var xAxis = new ArrayList<>(view.getXAxis()); + axisMap.put(ChartAxis.xAxis, xAxis); + context.put("xAxisBase", xAxis); + return result; + } + + @Override + public Map buildNormalResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List data) { + boolean isDrill = filterResult + .getFilterList() + .stream() + .anyMatch(ele -> ele.getFilterType() == 1); + var xAxisBase = (List) formatResult.getContext().get("xAxisBase"); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); + var xAxisExt = formatResult.getAxisMap().get(ChartAxis.xAxisExt); + var result = ChartDataBuild.transMixChartDataAntV(xAxisBase, xAxis, xAxisExt, yAxis, view, data, isDrill); + return result; + } + + @Override + public T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map sqlMap, SQLMeta sqlMeta, CalciteProvider provider) { + //计算左轴, 包含 xAxis, yAxis + 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); + var leftResult = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider); + var dynamicAssistFields = getDynamicAssistFields(view); + try { + //如果有同环比过滤,应该用原始sql + var originSql = leftResult.getQuerySql(); + var leftAssistFields = dynamicAssistFields.stream().filter(x -> StringUtils.equalsAnyIgnoreCase(x.getYAxisType(), "left")).toList(); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + var assistFields = getAssistFields(leftAssistFields, yAxis); + if (CollectionUtils.isNotEmpty(assistFields)) { + var req = new DatasourceRequest(); + req.setDsList(dsMap); + var assistSql = assistSQL(originSql, assistFields); + req.setQuery(assistSql); + var assistData = (List) provider.fetchResultField(req).get("data"); + leftResult.setAssistData(assistData); + leftResult.setDynamicAssistFields(leftAssistFields); + } + } catch (Exception e) { + e.printStackTrace(); + } + // 计算右轴,包含 xAxis,xAxisExt,yAxisExt,需要去掉 group 和 stack + var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); + var extStack = formatResult.getAxisMap().get(ChartAxis.extStack); + var xAxisExt = formatResult.getAxisMap().get(ChartAxis.xAxisExt); + xAxis = xAxis.subList(0, xAxis.size() - extStack.size() - xAxisExt.size()); + var extBubble = formatResult.getAxisMap().get(ChartAxis.extBubble); + xAxis.addAll(extBubble); + formatResult.getAxisMap().put(ChartAxis.xAxis, xAxis); + formatResult.getAxisMap().put(ChartAxis.xAxisExt, extBubble); + var yAxisExt = formatResult.getAxisMap().get(ChartAxis.yAxisExt); + formatResult.getAxisMap().put(ChartAxis.yAxis, yAxisExt); + formatResult.getContext().remove("yoyFiltered"); + // 右轴重新检测同环比过滤 + customFilter(view, filterResult.getFilterList(), formatResult); + var rightResult = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider); + try { + //如果有同环比过滤,应该用原始sql + var originSql = rightResult.getQuerySql(); + var rightAssistFields = dynamicAssistFields.stream().filter(x -> StringUtils.equalsAnyIgnoreCase(x.getYAxisType(), "right")).toList(); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + var assistFields = getAssistFields(rightAssistFields, yAxis); + if (CollectionUtils.isNotEmpty(assistFields)) { + var req = new DatasourceRequest(); + req.setDsList(dsMap); + var assistSql = assistSQL(originSql, assistFields); + req.setQuery(assistSql); + var assistData = (List) provider.fetchResultField(req).get("data"); + rightResult.setAssistData(assistData); + rightResult.setDynamicAssistFields(rightAssistFields); + } + } catch (Exception e) { + e.printStackTrace(); + } + var mixResult = (T) new ChartCalcDataResult(); + var data = new HashMap(); + data.put("left", leftResult); + data.put("right", rightResult); + mixResult.setData(data); + mixResult.setContext(filterResult.getContext()); + return mixResult; + } + + @Override + public ChartViewDTO buildChart(ChartViewDTO view, ChartCalcDataResult calcResult, AxisFormatResult formatResult, CustomFilterResult filterResult) { + var desensitizationList = (Map) filterResult.getContext().get("desensitizationList"); + var leftCalcResult = (ChartCalcDataResult) calcResult.getData().get("left"); + var leftFields = new ArrayList(); + leftFields.addAll(view.getXAxis()); + leftFields.addAll(view.getYAxis()); + mergeAssistField(leftCalcResult.getDynamicAssistFields(), leftCalcResult.getAssistData()); + var leftOriginData = leftCalcResult.getOriginData(); + var leftTable = ChartDataBuild.transTableNormal(leftFields, view, leftOriginData, desensitizationList); + var leftData = new HashMap(leftTable); + leftData.putAll(leftCalcResult.getData()); + leftData.put("dynamicAssistLines", leftCalcResult.getDynamicAssistFields()); + + var rightCalcResult = (ChartCalcDataResult) calcResult.getData().get("right"); + var rightFields = new ArrayList(); + rightFields.addAll(view.getXAxis()); + rightFields.addAll(view.getExtBubble()); + rightFields.addAll(view.getYAxisExt()); + mergeAssistField(rightCalcResult.getDynamicAssistFields(), rightCalcResult.getAssistData()); + var rightOriginData = rightCalcResult.getOriginData(); + var rightTable = ChartDataBuild.transTableNormal(rightFields, view, rightOriginData, desensitizationList); + var rightData = new HashMap(leftTable); + rightData.putAll(rightCalcResult.getData()); + rightData.put("dynamicAssistLines", rightCalcResult.getDynamicAssistFields()); + + var allFields = (List) filterResult.getContext().get("allFields"); + // 构建结果 + Map chartData = new TreeMap<>(); + chartData.put("left", leftData); + chartData.put("right", rightData); + + var drillFilters = filterResult.getFilterList().stream().filter(f -> f.getFilterType() == 1).collect(Collectors.toList()); + var isDrill = CollectionUtils.isNotEmpty(drillFilters); + view.setDrillFilters(drillFilters); + view.setDrill(isDrill); + view.setSql(leftCalcResult.getQuerySql()); + view.setData(chartData); + return view; + } +} diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/mix/StackMixHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/mix/StackMixHandler.java new file mode 100644 index 0000000000..e2331c9216 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/mix/StackMixHandler.java @@ -0,0 +1,109 @@ +package io.dataease.chart.charts.impl.mix; + +import io.dataease.api.chart.dto.ColumnPermissionItem; +import io.dataease.chart.utils.ChartDataBuild; +import io.dataease.extensions.view.dto.*; +import lombok.Getter; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.stream.Collectors; + +@Component +public class StackMixHandler extends MixHandler{ + @Getter + private String type = "chart-mix-stack"; + + @Override + public AxisFormatResult formatAxis(ChartViewDTO view) { + var axisMap = new HashMap>(); + var context = new HashMap(); + AxisFormatResult result = new AxisFormatResult(axisMap, context); + //左轴分组子维度,非分组不需要 + axisMap.put(ChartAxis.xAxisExt, Collections.emptyList()); + //左轴堆叠子维度,非堆叠不需要 + axisMap.put(ChartAxis.extStack, view.getExtStack()); + //左轴指标 + axisMap.put(ChartAxis.yAxis, view.getYAxis()); + //右轴分组子维度 + axisMap.put(ChartAxis.extBubble, view.getExtBubble()); + //右轴指标 + axisMap.put(ChartAxis.yAxisExt, view.getYAxisExt()); + //去除除了x轴以外的排序 + axisMap.forEach((k, v) -> { + v.forEach(x -> x.setSort("none")); + }); + axisMap.put(ChartAxis.extLabel, view.getExtLabel()); + axisMap.put(ChartAxis.extTooltip, view.getExtTooltip()); + //图表整体主维度 + var xAxis = new ArrayList<>(view.getXAxis()); + var xAxisStack = new ArrayList<>(view.getXAxis()); + xAxisStack.addAll(view.getExtStack()); + axisMap.put(ChartAxis.xAxis, xAxisStack); + context.put("xAxisBase", xAxis); + return result; + } + + @Override + public Map buildNormalResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List data) { + boolean isDrill = filterResult + .getFilterList() + .stream() + .anyMatch(ele -> ele.getFilterType() == 1); + var extStack = formatResult.getAxisMap().get(ChartAxis.extStack); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + if (CollectionUtils.isNotEmpty(extStack)) { + // 堆叠左轴 + var xAxisBase = (List) formatResult.getContext().get("xAxisBase"); + return ChartDataBuild.transMixChartStackDataAntV(xAxisBase, xAxisBase, extStack, yAxis, view, data, isDrill); + } else { + //无堆叠左轴和右轴还是走原逻辑 + var xAxisBase = (List) formatResult.getContext().get("xAxisBase"); + var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); + var xAxisExt = formatResult.getAxisMap().get(ChartAxis.xAxisExt); + return ChartDataBuild.transMixChartDataAntV(xAxisBase, xAxis, xAxisExt, yAxis, view, data, isDrill); + } + } + + @Override + public ChartViewDTO buildChart(ChartViewDTO view, ChartCalcDataResult calcResult, AxisFormatResult formatResult, CustomFilterResult filterResult) { + var desensitizationList = (Map) filterResult.getContext().get("desensitizationList"); + var leftCalcResult = (ChartCalcDataResult) calcResult.getData().get("left"); + var leftFields = new ArrayList(); + leftFields.addAll(view.getXAxis()); + leftFields.addAll(view.getExtStack()); + leftFields.addAll(view.getYAxis()); + var leftOriginData = leftCalcResult.getOriginData(); + var leftTable = ChartDataBuild.transTableNormal(leftFields, view, leftOriginData, desensitizationList); + mergeAssistField(leftCalcResult.getDynamicAssistFields(), leftCalcResult.getAssistData()); + var leftData = new HashMap(leftTable); + leftData.putAll(leftCalcResult.getData()); + leftData.put("dynamicAssistLines", leftCalcResult.getDynamicAssistFields()); + + var rightCalcResult = (ChartCalcDataResult) calcResult.getData().get("right"); + var rightFields = new ArrayList(); + rightFields.addAll(view.getXAxis()); + rightFields.addAll(view.getExtBubble()); + rightFields.addAll(view.getYAxisExt()); + var rightOriginData = rightCalcResult.getOriginData(); + var rightTable = ChartDataBuild.transTableNormal(rightFields, view, rightOriginData, desensitizationList); + var rightData = new HashMap(leftTable); + rightData.putAll(rightCalcResult.getData()); + rightData.put("dynamicAssistLines", rightCalcResult.getDynamicAssistFields()); + + var allFields = (List) filterResult.getContext().get("allFields"); + // 构建结果 + Map chartData = new TreeMap<>(); + chartData.put("left", leftData); + chartData.put("right", rightData); + + var drillFilters = filterResult.getFilterList().stream().filter(f -> f.getFilterType() == 1).collect(Collectors.toList()); + var isDrill = CollectionUtils.isNotEmpty(drillFilters); + view.setDrillFilters(drillFilters); + view.setDrill(isDrill); + view.setSql(leftCalcResult.getQuerySql()); + view.setData(chartData); + return view; + } +} diff --git a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java index 30bba810df..e4a6d01fdf 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java +++ b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java @@ -122,66 +122,7 @@ public class ChartDataManage { ChartViewDTO chartViewDTO = null; if (ObjectUtils.isNotEmpty(view.getIsPlugin()) && view.getIsPlugin()) { - return calcData1(view, chartExtRequest, allFields, viewFields); - } - if (StringUtils.containsIgnoreCase(view.getType(), "chart-mix")) { - // 需要排除掉除类别轴以外所有的排序 - view.getXAxisExt().forEach(dto -> dto.setSort("none")); - view.getExtBubble().forEach(dto -> dto.setSort("none")); - view.getExtStack().forEach(dto -> dto.setSort("none")); - view.getYAxis().forEach(dto -> dto.setSort("none")); - view.getYAxisExt().forEach(dto -> dto.setSort("none")); - - //左轴右轴需要分别调用一次查询 - String viewJson = (String) JsonUtil.toJSONString(view); - Map data = new HashMap<>(); - //针对左轴,删除yAxisExt - ChartViewDTO view1 = JsonUtil.parseObject(viewJson, ChartViewDTO.class); - if (!StringUtils.equalsIgnoreCase(view.getType(), "chart-mix-group")) { - view1.setXAxisExt(new ArrayList<>()); - } - if (!StringUtils.equalsIgnoreCase(view.getType(), "chart-mix-stack")) { - view1.setExtStack(new ArrayList<>()); - } - view1.setExtBubble(new ArrayList<>()); - view1.setYAxisExt(new ArrayList<>()); - if (view1.getSenior() != null) { - ChartSeniorAssistCfgDTO assistLineCfg1 = JsonUtil.parseObject((String) JsonUtil.toJSONString(view1.getSenior().get("assistLineCfg")), ChartSeniorAssistCfgDTO.class); - if (assistLineCfg1 != null && assistLineCfg1.isEnable()) { - List assistLines = assistLineCfg1.getAssistLine(); - //去除右轴辅助线 - assistLineCfg1.setAssistLine(assistLines.stream().filter(d -> StringUtils.equalsIgnoreCase(d.getYAxisType(), "left")).collect(Collectors.toList())); - view1.getSenior().put("assistLineCfg", assistLineCfg1); - } - } - ChartViewDTO left = calcData1(view1, chartExtRequest, allFields, viewFields); - data.put("left", left.getData()); - //针对右轴,删除yAxis - ChartViewDTO view2 = JsonUtil.parseObject(viewJson, ChartViewDTO.class); - view2.setYAxis(new ArrayList<>()); - if (view2.getSenior() != null) { - ChartSeniorAssistCfgDTO assistLineCfg2 = JsonUtil.parseObject((String) JsonUtil.toJSONString(view2.getSenior().get("assistLineCfg")), ChartSeniorAssistCfgDTO.class); - if (assistLineCfg2 != null && assistLineCfg2.isEnable()) { - List assistLines = assistLineCfg2.getAssistLine(); - //去除左轴辅助线 - assistLineCfg2.setAssistLine(assistLines.stream().filter(d -> StringUtils.equalsIgnoreCase(d.getYAxisType(), "right")).collect(Collectors.toList())); - view2.getSenior().put("assistLineCfg", assistLineCfg2); - } - } - view2.setXAxisExt(view2.getExtBubble()); - view2.setExtStack(new ArrayList<>()); - view2.setExtBubble(new ArrayList<>()); - ChartViewDTO right = calcData1(view2, chartExtRequest, allFields, viewFields); - data.put("right", right.getData()); - - //重新组装 - chartViewDTO = BeanUtils.copyBean(new ChartViewDTO(), left); - chartViewDTO.setXAxisExt(view.getXAxisExt()); - chartViewDTO.setExtStack(view.getExtStack()); - chartViewDTO.setYAxisExt(view.getYAxisExt()); - chartViewDTO.setExtBubble(view.getExtBubble()); - chartViewDTO.setData(data); - chartViewDTO.setSenior(view.getSenior()); + chartViewDTO = calcData1(view, chartExtRequest, allFields, viewFields); } else { chartViewDTO = calcData(view, chartExtRequest, allFields, viewFields); } @@ -437,23 +378,8 @@ public class ChartDataManage { WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, transFields(allFields), crossDs, dsMap); Map dsTypeMap = dsMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().getType())); ChartCalcDataResult calcResult = chartHandler.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, calciteProvider); - // 如果是表格导出查询 则在此处直接就可以返回 - 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 map = new TreeMap<>(); - // 图表组件可再扩展 - Map mapTableNormal = ChartDataBuild.transTableNormal(xAxis, yAxis, view, calcResult.getOriginData(), extStack, desensitizationList); - var drillFilters = filterResult.getFilterList().stream().filter(f -> f.getFilterType() == 1).collect(Collectors.toList()); - var isDrill = CollectionUtils.isNotEmpty(drillFilters); - ChartViewDTO chartViewDTO = uniteViewResult(calcResult.getQuerySql(), calcResult.getData(), mapTableNormal, view, isDrill, drillFilters, calcResult.getDynamicAssistFields(), calcResult.getAssistData()); - return chartViewDTO; + formatResult.getContext().put("desensitizationList", desensitizationList); + return chartHandler.buildChart(view, calcResult, formatResult, filterResult); } public ChartViewDTO calcData1(ChartViewDTO view, ChartExtRequest chartExtRequest, List allFields, List viewFields) throws Exception {