forked from github/dataease
refactor(图表): 混合图数据获取插件化
This commit is contained in:
parent
5d9373d533
commit
dc6b32f93e
@ -11,4 +11,5 @@ public abstract class AbstractChartHandler {
|
||||
public abstract <T> T formatAxis(ChartViewDTO view);
|
||||
public abstract <T extends CustomFilterResult, K extends AxisFormatResult> T customFilter(ChartViewDTO view, List<ChartExtFilterDTO> filterList, K formatResult);
|
||||
public abstract <T extends ChartCalcDataResult> T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map<String, Object> sqlMap, SQLMeta sqlMeta, CalciteProvider provider);
|
||||
public abstract ChartViewDTO buildChart(ChartViewDTO view, ChartCalcDataResult calcResult, AxisFormatResult formatResult, CustomFilterResult filterResult);
|
||||
}
|
||||
|
@ -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<String, ColumnPermissionItem>) 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<String, Object> sourceInfo = ChartDataBuild.transTableNormal(xAxis, yAxis, view, calcResult.getOriginData(), extStack, desensitizationList);
|
||||
sourceInfo.put("sourceData", calcResult.getOriginData());
|
||||
view.setData(sourceInfo);
|
||||
return view;
|
||||
}
|
||||
// 构建结果
|
||||
Map<String, Object> map = new TreeMap<>();
|
||||
// 图表组件可再扩展
|
||||
Map<String, Object> 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<String, Object> chartData, Map<String, Object> tableData, ChartViewDTO view, Boolean isDrill, List<ChartExtFilterDTO> drillFilters, List<ChartSeniorAssistDTO> dynamicAssistFields, List<String[]> assistData) {
|
||||
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
map.putAll(chartData);
|
||||
map.putAll(tableData);
|
||||
|
||||
// get all fields
|
||||
List<ChartViewFieldDTO> 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<ChartSeniorAssistDTO> dynamicAssistFields, List<String[]> 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<ChartViewFieldDTO> getAllChartFields(ChartViewDTO view) {
|
||||
// get all fields
|
||||
Map<String, List<ChartViewFieldDTO>> 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<ChartSeniorAssistDTO> getDynamicAssistFields(ChartViewDTO view) throws Exception {
|
||||
protected List<ChartSeniorAssistDTO> getDynamicAssistFields(ChartViewDTO view) {
|
||||
List<ChartSeniorAssistDTO> list = new ArrayList<>();
|
||||
|
||||
Map<String, Object> senior = view.getSenior();
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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<ChartAxis, List<ChartViewFieldDTO>>();
|
||||
var context = new HashMap<String, Object>();
|
||||
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<String, Object> buildNormalResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List<String[]> data) {
|
||||
return super.buildNormalResult(view, formatResult, filterResult, data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChartViewDTO buildChart(ChartViewDTO view, ChartCalcDataResult calcResult, AxisFormatResult formatResult, CustomFilterResult filterResult) {
|
||||
var desensitizationList = (Map<String, ColumnPermissionItem>) filterResult.getContext().get("desensitizationList");
|
||||
var leftCalcResult = (ChartCalcDataResult) calcResult.getData().get("left");
|
||||
var leftFields = new ArrayList<ChartViewFieldDTO>();
|
||||
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<String, Object>(leftTable);
|
||||
leftData.putAll(leftCalcResult.getData());
|
||||
leftData.put("dynamicAssistLines", leftCalcResult.getDynamicAssistFields());
|
||||
|
||||
var rightCalcResult = (ChartCalcDataResult) calcResult.getData().get("right");
|
||||
var rightFields = new ArrayList<ChartViewFieldDTO>();
|
||||
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<String, Object>(leftTable);
|
||||
rightData.putAll(rightCalcResult.getData());
|
||||
rightData.put("dynamicAssistLines", rightCalcResult.getDynamicAssistFields());
|
||||
|
||||
var allFields = (List<ChartViewFieldDTO>) filterResult.getContext().get("allFields");
|
||||
// 构建结果
|
||||
Map<String, Object> 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;
|
||||
}
|
||||
}
|
@ -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<ChartAxis, List<ChartViewFieldDTO>>();
|
||||
var context = new HashMap<String, Object>();
|
||||
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<String, Object> buildNormalResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List<String[]> data) {
|
||||
boolean isDrill = filterResult
|
||||
.getFilterList()
|
||||
.stream()
|
||||
.anyMatch(ele -> ele.getFilterType() == 1);
|
||||
var xAxisBase = (List<ChartViewFieldDTO>) 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 extends ChartCalcDataResult> T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map<String, Object> sqlMap, SQLMeta sqlMeta, CalciteProvider provider) {
|
||||
//计算左轴, 包含 xAxis, yAxis
|
||||
var dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap");
|
||||
List<String> dsList = new ArrayList<>();
|
||||
for (Map.Entry<Long, DatasourceSchemaDTO> 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<String[]>) 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<String[]>) 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<String, Object>();
|
||||
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<String, ColumnPermissionItem>) filterResult.getContext().get("desensitizationList");
|
||||
var leftCalcResult = (ChartCalcDataResult) calcResult.getData().get("left");
|
||||
var leftFields = new ArrayList<ChartViewFieldDTO>();
|
||||
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<String, Object>(leftTable);
|
||||
leftData.putAll(leftCalcResult.getData());
|
||||
leftData.put("dynamicAssistLines", leftCalcResult.getDynamicAssistFields());
|
||||
|
||||
var rightCalcResult = (ChartCalcDataResult) calcResult.getData().get("right");
|
||||
var rightFields = new ArrayList<ChartViewFieldDTO>();
|
||||
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<String, Object>(leftTable);
|
||||
rightData.putAll(rightCalcResult.getData());
|
||||
rightData.put("dynamicAssistLines", rightCalcResult.getDynamicAssistFields());
|
||||
|
||||
var allFields = (List<ChartViewFieldDTO>) filterResult.getContext().get("allFields");
|
||||
// 构建结果
|
||||
Map<String, Object> 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;
|
||||
}
|
||||
}
|
@ -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<ChartAxis, List<ChartViewFieldDTO>>();
|
||||
var context = new HashMap<String, Object>();
|
||||
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<String, Object> buildNormalResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List<String[]> 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<ChartViewFieldDTO>) formatResult.getContext().get("xAxisBase");
|
||||
return ChartDataBuild.transMixChartStackDataAntV(xAxisBase, xAxisBase, extStack, yAxis, view, data, isDrill);
|
||||
} else {
|
||||
//无堆叠左轴和右轴还是走原逻辑
|
||||
var xAxisBase = (List<ChartViewFieldDTO>) 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<String, ColumnPermissionItem>) filterResult.getContext().get("desensitizationList");
|
||||
var leftCalcResult = (ChartCalcDataResult) calcResult.getData().get("left");
|
||||
var leftFields = new ArrayList<ChartViewFieldDTO>();
|
||||
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<String, Object>(leftTable);
|
||||
leftData.putAll(leftCalcResult.getData());
|
||||
leftData.put("dynamicAssistLines", leftCalcResult.getDynamicAssistFields());
|
||||
|
||||
var rightCalcResult = (ChartCalcDataResult) calcResult.getData().get("right");
|
||||
var rightFields = new ArrayList<ChartViewFieldDTO>();
|
||||
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<String, Object>(leftTable);
|
||||
rightData.putAll(rightCalcResult.getData());
|
||||
rightData.put("dynamicAssistLines", rightCalcResult.getDynamicAssistFields());
|
||||
|
||||
var allFields = (List<ChartViewFieldDTO>) filterResult.getContext().get("allFields");
|
||||
// 构建结果
|
||||
Map<String, Object> 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;
|
||||
}
|
||||
}
|
@ -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<String, Object> 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<ChartSeniorAssistDTO> 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<ChartSeniorAssistDTO> 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<Long, String> 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<String, Object> sourceInfo = ChartDataBuild.transTableNormal(xAxis, yAxis, view, calcResult.getOriginData(), extStack, desensitizationList);
|
||||
sourceInfo.put("sourceData", calcResult.getOriginData());
|
||||
view.setData(sourceInfo);
|
||||
return view;
|
||||
}
|
||||
|
||||
// 构建结果
|
||||
Map<String, Object> map = new TreeMap<>();
|
||||
// 图表组件可再扩展
|
||||
Map<String, Object> 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<ChartViewFieldDTO> allFields, List<ChartViewFieldDTO> viewFields) throws Exception {
|
||||
|
Loading…
Reference in New Issue
Block a user