refactor(图表): 混合图数据获取插件化

This commit is contained in:
wisonic-s 2024-06-27 01:08:55 +08:00
parent 5d9373d533
commit dc6b32f93e
7 changed files with 447 additions and 99 deletions

View File

@ -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);
}

View File

@ -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();

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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 {