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());
axisMap.put(ChartAxis.xAxis, xAxisGroup);
context.put("xAxisBase", xAxis);
axisMap.put(ChartAxis.drill, new ArrayList<>(view.getDrillFields()));
return result;
}
@ -49,45 +50,4 @@ public class GroupMixHandler extends MixHandler {
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()));
context.put("xAxisBase", new ArrayList<>(view.getXAxis()));
axisMap.put(ChartAxis.drill, new ArrayList<>(view.getDrillFields()));
return result;
}
@ -93,26 +94,46 @@ public class MixHandler extends YoyChartHandler {
} catch (Exception e) {
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
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);
var xAxis = new ArrayList<>(view.getXAxis());
var extStack = formatResult2.getAxisMap().get(ChartAxis.extStack);
var xAxisExt = formatResult2.getAxisMap().get(ChartAxis.xAxisExt);
//xAxis = xAxis.subList(0, xAxis.size() - extStack.size() - xAxisExt.size());
var extBubble = formatResult2.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");
var dillAxis = (ArrayList<ChartViewFieldDTO>) formatResult.getContext().get("dillAxis");
xAxis.addAll(dillAxis);
formatResult2.getAxisMap().put(ChartAxis.xAxis, xAxis);
formatResult2.getAxisMap().put(ChartAxis.xAxisExt, extBubble);
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);
var rightResult = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
customFilter(view, filterResult.getFilterList(), formatResult2);
var rightResult = (T) super.calcChartResult(view, formatResult2, 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 yAxis = formatResult2.getAxisMap().get(ChartAxis.yAxis);
var assistFields = getAssistFields(rightAssistFields, yAxis);
if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest();
@ -140,8 +161,8 @@ public class MixHandler extends YoyChartHandler {
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());
leftFields.addAll(formatResult.getAxisMap().get(ChartAxis.xAxis));
leftFields.addAll(formatResult.getAxisMap().get(ChartAxis.yAxis));
mergeAssistField(leftCalcResult.getDynamicAssistFields(), leftCalcResult.getAssistData());
var leftOriginData = leftCalcResult.getOriginData();
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 rightFields = new ArrayList<ChartViewFieldDTO>();
rightFields.addAll(view.getXAxis());
rightFields.addAll(view.getExtBubble());
rightFields.addAll(view.getYAxisExt());
var subAxisMap = (HashMap<ChartAxis, List<ChartViewFieldDTO>>) formatResult.getContext().get("subAxisMap");
rightFields.addAll(subAxisMap.get(ChartAxis.xAxis));
rightFields.addAll(subAxisMap.get(ChartAxis.yAxis));
mergeAssistField(rightCalcResult.getDynamicAssistFields(), rightCalcResult.getAssistData());
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());

View File

@ -41,6 +41,7 @@ public class StackMixHandler extends MixHandler {
xAxisStack.addAll(view.getExtStack());
axisMap.put(ChartAxis.xAxis, xAxisStack);
context.put("xAxisBase", xAxis);
axisMap.put(ChartAxis.drill, new ArrayList<>(view.getDrillFields()));
return result;
}
@ -61,49 +62,7 @@ public class StackMixHandler extends MixHandler {
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);
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());
}
var dillAxis = new ArrayList<ChartViewFieldDTO>();
DatasetGroupInfoDTO table = datasetGroupManage.getDatasetGroupInfoDTO(view.getTableId(), null);
if (table == null) {
DEException.throwException(ResultCode.DATA_IS_WRONG.code(), Translator.get("i18n_no_ds"));
@ -290,6 +292,7 @@ public class ChartDataManage {
if (!fields.contains(dim.getId())) {
viewField.setSource(FieldSource.DRILL);
xAxis.add(viewField);
dillAxis.add(viewField);
fields.add(dim.getId());
}
if (i == drillRequestList.size() - 1) {
@ -298,13 +301,19 @@ public class ChartDataManage {
viewField.setSource(FieldSource.DRILL);
nextDrillField.setSort(getDrillSort(xAxis, drill.get(0)));
xAxis.add(nextDrillField);
dillAxis.add(nextDrillField);
fields.add(nextDrillField.getId());
} else {
dillAxis.add(nextDrillField);
}
}
}
}
}
}
formatResult.getContext().put("dillAxis", dillAxis);
//转义特殊字符
extFilterList = extFilterList.stream().peek(ele -> {
if (ObjectUtils.isNotEmpty(ele.getValue())) {

View File

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