fix(图表): 修复柱线组合图不能钻取的问题

This commit is contained in:
ulleo 2024-07-02 10:56:43 +08:00
parent 49ecc44f46
commit da310e2f01
5 changed files with 55 additions and 103 deletions

View File

@ -41,6 +41,7 @@ public class GroupMixHandler extends MixHandler {
xAxisGroup.addAll(view.getXAxisExt()); xAxisGroup.addAll(view.getXAxisExt());
axisMap.put(ChartAxis.xAxis, xAxisGroup); axisMap.put(ChartAxis.xAxis, xAxisGroup);
context.put("xAxisBase", xAxis); context.put("xAxisBase", xAxis);
axisMap.put(ChartAxis.drill, new ArrayList<>(view.getDrillFields()));
return result; return result;
} }
@ -49,45 +50,4 @@ public class GroupMixHandler extends MixHandler {
return super.buildNormalResult(view, formatResult, filterResult, 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);
mergeAssistField(rightCalcResult.getDynamicAssistFields(), rightCalcResult.getAssistData());
var rightData = new HashMap<String, Object>(rightTable);
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

@ -45,6 +45,7 @@ public class MixHandler extends YoyChartHandler {
//图表整体主维度 //图表整体主维度
axisMap.put(ChartAxis.xAxis, new ArrayList<>(view.getXAxis())); axisMap.put(ChartAxis.xAxis, new ArrayList<>(view.getXAxis()));
context.put("xAxisBase", new ArrayList<>(view.getXAxis())); context.put("xAxisBase", new ArrayList<>(view.getXAxis()));
axisMap.put(ChartAxis.drill, new ArrayList<>(view.getDrillFields()));
return result; return result;
} }
@ -93,26 +94,46 @@ public class MixHandler extends YoyChartHandler {
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
AxisFormatResult formatResult2 = new AxisFormatResult();
var axisMap = new HashMap<ChartAxis, List<ChartViewFieldDTO>>();
axisMap.put(ChartAxis.xAxis, new ArrayList<>(formatResult.getAxisMap().get(ChartAxis.xAxis)));
axisMap.put(ChartAxis.extStack, new ArrayList<>());
axisMap.put(ChartAxis.xAxisExt, new ArrayList<>());
axisMap.put(ChartAxis.extBubble, new ArrayList<>(formatResult.getAxisMap().get(ChartAxis.extBubble)));
axisMap.put(ChartAxis.yAxisExt, new ArrayList<>(formatResult.getAxisMap().get(ChartAxis.yAxisExt)));
axisMap.put(ChartAxis.extLabel, new ArrayList<>(formatResult.getAxisMap().get(ChartAxis.extLabel)));
axisMap.put(ChartAxis.extTooltip, new ArrayList<>(formatResult.getAxisMap().get(ChartAxis.extTooltip)));
axisMap.put(ChartAxis.drill, new ArrayList<>(formatResult.getAxisMap().get(ChartAxis.drill)));
formatResult2.setAxisMap(axisMap);
formatResult2.setContext(formatResult.getContext());
// 计算右轴包含 xAxis,xAxisExt,yAxisExt,需要去掉 group stack // 计算右轴包含 xAxis,xAxisExt,yAxisExt,需要去掉 group stack
var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); var xAxis = new ArrayList<>(view.getXAxis());
var extStack = formatResult.getAxisMap().get(ChartAxis.extStack); var extStack = formatResult2.getAxisMap().get(ChartAxis.extStack);
var xAxisExt = formatResult.getAxisMap().get(ChartAxis.xAxisExt); var xAxisExt = formatResult2.getAxisMap().get(ChartAxis.xAxisExt);
xAxis = xAxis.subList(0, xAxis.size() - extStack.size() - xAxisExt.size()); //xAxis = xAxis.subList(0, xAxis.size() - extStack.size() - xAxisExt.size());
var extBubble = formatResult.getAxisMap().get(ChartAxis.extBubble); var extBubble = formatResult2.getAxisMap().get(ChartAxis.extBubble);
xAxis.addAll(extBubble); xAxis.addAll(extBubble);
formatResult.getAxisMap().put(ChartAxis.xAxis, xAxis); var dillAxis = (ArrayList<ChartViewFieldDTO>) formatResult.getContext().get("dillAxis");
formatResult.getAxisMap().put(ChartAxis.xAxisExt, extBubble); xAxis.addAll(dillAxis);
var yAxisExt = formatResult.getAxisMap().get(ChartAxis.yAxisExt); formatResult2.getAxisMap().put(ChartAxis.xAxis, xAxis);
formatResult.getAxisMap().put(ChartAxis.yAxis, yAxisExt); formatResult2.getAxisMap().put(ChartAxis.xAxisExt, extBubble);
formatResult.getContext().remove("yoyFiltered"); var yAxisExt = formatResult2.getAxisMap().get(ChartAxis.yAxisExt);
formatResult2.getAxisMap().put(ChartAxis.yAxis, yAxisExt);
formatResult2.getContext().remove("yoyFiltered");
formatResult.getContext().put("subAxisMap", axisMap);
// 右轴重新检测同环比过滤 // 右轴重新检测同环比过滤
customFilter(view, filterResult.getFilterList(), formatResult); customFilter(view, filterResult.getFilterList(), formatResult2);
var rightResult = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider); var rightResult = (T) super.calcChartResult(view, formatResult2, filterResult, sqlMap, sqlMeta, provider);
try { try {
//如果有同环比过滤,应该用原始sql //如果有同环比过滤,应该用原始sql
var originSql = rightResult.getQuerySql(); var originSql = rightResult.getQuerySql();
var rightAssistFields = dynamicAssistFields.stream().filter(x -> StringUtils.equalsAnyIgnoreCase(x.getYAxisType(), "right")).toList(); var rightAssistFields = dynamicAssistFields.stream().filter(x -> StringUtils.equalsAnyIgnoreCase(x.getYAxisType(), "right")).toList();
var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); var yAxis = formatResult2.getAxisMap().get(ChartAxis.yAxis);
var assistFields = getAssistFields(rightAssistFields, yAxis); var assistFields = getAssistFields(rightAssistFields, yAxis);
if (CollectionUtils.isNotEmpty(assistFields)) { if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest(); var req = new DatasourceRequest();
@ -140,8 +161,8 @@ public class MixHandler extends YoyChartHandler {
var desensitizationList = (Map<String, ColumnPermissionItem>) filterResult.getContext().get("desensitizationList"); var desensitizationList = (Map<String, ColumnPermissionItem>) filterResult.getContext().get("desensitizationList");
var leftCalcResult = (ChartCalcDataResult) calcResult.getData().get("left"); var leftCalcResult = (ChartCalcDataResult) calcResult.getData().get("left");
var leftFields = new ArrayList<ChartViewFieldDTO>(); var leftFields = new ArrayList<ChartViewFieldDTO>();
leftFields.addAll(view.getXAxis()); leftFields.addAll(formatResult.getAxisMap().get(ChartAxis.xAxis));
leftFields.addAll(view.getYAxis()); leftFields.addAll(formatResult.getAxisMap().get(ChartAxis.yAxis));
mergeAssistField(leftCalcResult.getDynamicAssistFields(), leftCalcResult.getAssistData()); mergeAssistField(leftCalcResult.getDynamicAssistFields(), leftCalcResult.getAssistData());
var leftOriginData = leftCalcResult.getOriginData(); var leftOriginData = leftCalcResult.getOriginData();
var leftTable = ChartDataBuild.transTableNormal(leftFields, view, leftOriginData, desensitizationList); var leftTable = ChartDataBuild.transTableNormal(leftFields, view, leftOriginData, desensitizationList);
@ -151,13 +172,14 @@ public class MixHandler extends YoyChartHandler {
var rightCalcResult = (ChartCalcDataResult) calcResult.getData().get("right"); var rightCalcResult = (ChartCalcDataResult) calcResult.getData().get("right");
var rightFields = new ArrayList<ChartViewFieldDTO>(); var rightFields = new ArrayList<ChartViewFieldDTO>();
rightFields.addAll(view.getXAxis());
rightFields.addAll(view.getExtBubble()); var subAxisMap = (HashMap<ChartAxis, List<ChartViewFieldDTO>>) formatResult.getContext().get("subAxisMap");
rightFields.addAll(view.getYAxisExt()); rightFields.addAll(subAxisMap.get(ChartAxis.xAxis));
rightFields.addAll(subAxisMap.get(ChartAxis.yAxis));
mergeAssistField(rightCalcResult.getDynamicAssistFields(), rightCalcResult.getAssistData()); mergeAssistField(rightCalcResult.getDynamicAssistFields(), rightCalcResult.getAssistData());
var rightOriginData = rightCalcResult.getOriginData(); var rightOriginData = rightCalcResult.getOriginData();
var rightTable = ChartDataBuild.transTableNormal(rightFields, view, rightOriginData, desensitizationList); var rightTable = ChartDataBuild.transTableNormal(rightFields, view, rightOriginData, desensitizationList);
mergeAssistField(rightCalcResult.getDynamicAssistFields(), rightCalcResult.getAssistData());
var rightData = new HashMap<String, Object>(rightTable); var rightData = new HashMap<String, Object>(rightTable);
rightData.putAll(rightCalcResult.getData()); rightData.putAll(rightCalcResult.getData());
rightData.put("dynamicAssistLines", rightCalcResult.getDynamicAssistFields()); rightData.put("dynamicAssistLines", rightCalcResult.getDynamicAssistFields());

View File

@ -41,6 +41,7 @@ public class StackMixHandler extends MixHandler {
xAxisStack.addAll(view.getExtStack()); xAxisStack.addAll(view.getExtStack());
axisMap.put(ChartAxis.xAxis, xAxisStack); axisMap.put(ChartAxis.xAxis, xAxisStack);
context.put("xAxisBase", xAxis); context.put("xAxisBase", xAxis);
axisMap.put(ChartAxis.drill, new ArrayList<>(view.getDrillFields()));
return result; return result;
} }
@ -61,49 +62,7 @@ public class StackMixHandler extends MixHandler {
var xAxisBase = (List<ChartViewFieldDTO>) formatResult.getContext().get("xAxisBase"); var xAxisBase = (List<ChartViewFieldDTO>) formatResult.getContext().get("xAxisBase");
var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis);
var xAxisExt = formatResult.getAxisMap().get(ChartAxis.xAxisExt); var xAxisExt = formatResult.getAxisMap().get(ChartAxis.xAxisExt);
return ChartDataBuild.transMixChartDataAntV(xAxisBase, xAxis, xAxisExt, yAxis, view, data, isDrill); 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.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);
mergeAssistField(rightCalcResult.getDynamicAssistFields(), rightCalcResult.getAssistData());
var rightData = new HashMap<String, Object>(rightTable);
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

@ -104,6 +104,8 @@ public class ChartDataManage {
DEException.throwException(ResultCode.DATA_IS_WRONG.code(), Translator.get("i18n_chart_not_handler") + ": " + view.getRender() + "," + view.getType()); DEException.throwException(ResultCode.DATA_IS_WRONG.code(), Translator.get("i18n_chart_not_handler") + ": " + view.getRender() + "," + view.getType());
} }
var dillAxis = new ArrayList<ChartViewFieldDTO>();
DatasetGroupInfoDTO table = datasetGroupManage.getDatasetGroupInfoDTO(view.getTableId(), null); DatasetGroupInfoDTO table = datasetGroupManage.getDatasetGroupInfoDTO(view.getTableId(), null);
if (table == null) { if (table == null) {
DEException.throwException(ResultCode.DATA_IS_WRONG.code(), Translator.get("i18n_no_ds")); DEException.throwException(ResultCode.DATA_IS_WRONG.code(), Translator.get("i18n_no_ds"));
@ -290,6 +292,7 @@ public class ChartDataManage {
if (!fields.contains(dim.getId())) { if (!fields.contains(dim.getId())) {
viewField.setSource(FieldSource.DRILL); viewField.setSource(FieldSource.DRILL);
xAxis.add(viewField); xAxis.add(viewField);
dillAxis.add(viewField);
fields.add(dim.getId()); fields.add(dim.getId());
} }
if (i == drillRequestList.size() - 1) { if (i == drillRequestList.size() - 1) {
@ -298,13 +301,19 @@ public class ChartDataManage {
viewField.setSource(FieldSource.DRILL); viewField.setSource(FieldSource.DRILL);
nextDrillField.setSort(getDrillSort(xAxis, drill.get(0))); nextDrillField.setSort(getDrillSort(xAxis, drill.get(0)));
xAxis.add(nextDrillField); xAxis.add(nextDrillField);
dillAxis.add(nextDrillField);
fields.add(nextDrillField.getId()); fields.add(nextDrillField.getId());
} else {
dillAxis.add(nextDrillField);
} }
} }
} }
} }
} }
} }
formatResult.getContext().put("dillAxis", dillAxis);
//转义特殊字符 //转义特殊字符
extFilterList = extFilterList.stream().peek(ele -> { extFilterList = extFilterList.stream().peek(ele -> {
if (ObjectUtils.isNotEmpty(ele.getValue())) { if (ObjectUtils.isNotEmpty(ele.getValue())) {

View File

@ -2,12 +2,14 @@ package io.dataease.extensions.view.dto;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@Data @Data
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor
public class AxisFormatResult { public class AxisFormatResult {
private Map<ChartAxis, List<ChartViewFieldDTO>> axisMap; private Map<ChartAxis, List<ChartViewFieldDTO>> axisMap;
private Map<String, Object> context; private Map<String, Object> context;