feat(图表): 组合图副值轴支持设置同环比

This commit is contained in:
wisonic
2025-10-13 17:11:36 +08:00
committed by wisonic-s
parent 2c76369e31
commit 928adccff6
4 changed files with 23 additions and 30 deletions

View File

@@ -3,7 +3,6 @@ package io.dataease.chart.charts.impl.mix;
import io.dataease.api.dataset.union.DatasetGroupInfoDTO;
import io.dataease.chart.charts.impl.YoyChartHandler;
import io.dataease.chart.utils.ChartDataBuild;
import io.dataease.engine.utils.Utils;
import io.dataease.extensions.datasource.dto.DatasourceRequest;
import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO;
import io.dataease.extensions.datasource.model.SQLMeta;
@@ -81,7 +80,6 @@ public class MixHandler extends YoyChartHandler {
for (Map.Entry<Long, DatasourceSchemaDTO> next : dsMap.entrySet()) {
dsList.add(next.getValue().getType());
}
boolean needOrder = Utils.isNeedOrder(dsList);
boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
var leftResult = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
var dynamicAssistFields = getDynamicAssistFields(view);
@@ -120,43 +118,43 @@ public class MixHandler extends YoyChartHandler {
e.printStackTrace();
}
AxisFormatResult formatResult2 = new AxisFormatResult();
AxisFormatResult rightFormatResult = new AxisFormatResult();
var axisMap = new HashMap<ChartAxis, List<ChartViewFieldDTO>>();
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());
rightFormatResult.setAxisMap(axisMap);
rightFormatResult.setContext(formatResult.getContext());
// 计算右轴,包含 xAxis,xAxisExt,yAxisExt,需要去掉 group 和 stack
var xAxis = new ArrayList<>(view.getXAxis());
var extBubble = new ArrayList<>(formatResult.getAxisMap().get(ChartAxis.extBubble));
xAxis.addAll(extBubble);
var dillAxis = (ArrayList<ChartViewFieldDTO>) formatResult.getContext().get("dillAxis");
var drillAxis = (ArrayList<ChartViewFieldDTO>) formatResult.getContext().get("drillAxis");
var fields = xAxis.stream().map(ChartViewFieldDTO::getId).collect(Collectors.toSet());
for (ChartViewFieldDTO dillAxi : dillAxis) {
if (!fields.contains(dillAxi.getId())) {
xAxis.add(dillAxi);
for (ChartViewFieldDTO axis : drillAxis) {
if (!fields.contains(axis.getId())) {
xAxis.add(axis);
}
}
formatResult2.getAxisMap().put(ChartAxis.xAxis, xAxis);
formatResult2.getAxisMap().put(ChartAxis.xAxisExt, extBubble);
rightFormatResult.getAxisMap().put(ChartAxis.xAxis, xAxis);
rightFormatResult.getAxisMap().put(ChartAxis.xAxisExt, extBubble);
var yAxisExt = new ArrayList<>(formatResult.getAxisMap().get(ChartAxis.yAxisExt));
formatResult2.getAxisMap().put(ChartAxis.yAxis, yAxisExt);
formatResult2.getContext().remove("yoyFiltered");
formatResult2.getContext().put("isRight", "isRight");
rightFormatResult.getAxisMap().put(ChartAxis.yAxis, yAxisExt);
rightFormatResult.getContext().remove("yoyFiltered");
rightFormatResult.getContext().put("isRight", "isRight");
formatResult.getContext().put("subAxisMap", axisMap);
// 右轴重新检测同环比过滤
customFilter(view, filterResult.getFilterList(), formatResult2);
var rightResult = (T) super.calcChartResult(view, formatResult2, filterResult, sqlMap, sqlMeta, provider);
customFilter(view, filterResult.getFilterList(), rightFormatResult);
var rightResult = (T) super.calcChartResult(view, rightFormatResult, filterResult, sqlMap, sqlMeta, provider);
try {
//如果有同环比过滤,应该用原始sql
var originSql = rightResult.getQuerySql();
var rightAssistFields = dynamicAssistFields.stream().filter(x -> StringUtils.equalsAnyIgnoreCase(x.getYAxisType(), "right")).toList();
var yAxis = formatResult2.getAxisMap().get(ChartAxis.yAxis);
var yAxis = rightFormatResult.getAxisMap().get(ChartAxis.yAxis);
var assistFields = getAssistFields(rightAssistFields, yAxis);
if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest();

View File

@@ -110,7 +110,7 @@ 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>();
var drillAxis = 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"));
@@ -141,9 +141,7 @@ public class ChartDataManage {
var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis);
formatResult.getContext().put("allFields", allFields);
var axisMap = formatResult.getAxisMap();
axisMap.forEach((axis, fields) -> {
fields.removeIf(fieldDTO -> !dataeaseNames.contains(fieldDTO.getDataeaseName()));
});
axisMap.forEach((axis, fields) -> fields.removeIf(fieldDTO -> !dataeaseNames.contains(fieldDTO.getDataeaseName())));
// 过滤来自仪表板的条件
List<ChartExtFilterDTO> extFilterList = new ArrayList<>();
@@ -319,7 +317,7 @@ public class ChartDataManage {
if (!fields.contains(dim.getId())) {
viewField.setSource(FieldSource.DRILL);
xAxis.add(viewField);
dillAxis.add(viewField);
drillAxis.add(viewField);
fields.add(dim.getId());
}
if (i == drillRequestList.size() - 1) {
@@ -327,7 +325,7 @@ public class ChartDataManage {
if (!fields.contains(nextDrillField.getId())) {
nextDrillField.setSource(FieldSource.DRILL);
xAxis.add(nextDrillField);
dillAxis.add(nextDrillField);
drillAxis.add(nextDrillField);
fields.add(nextDrillField.getId());
} else {
Optional<ChartViewFieldDTO> axis = xAxis.stream().filter(x -> Objects.equals(x.getId(), nextDrillField.getId())).findFirst();
@@ -335,7 +333,7 @@ public class ChartDataManage {
field.setSort(nextDrillField.getSort());
field.setCustomSort(nextDrillField.getCustomSort());
});
dillAxis.add(nextDrillField);
drillAxis.add(nextDrillField);
}
}
}
@@ -343,10 +341,10 @@ public class ChartDataManage {
}
}
formatResult.getContext().put("dillAxis", dillAxis);
formatResult.getContext().put("drillAxis", drillAxis);
//转义特殊字符
extFilterList = extFilterList.stream().peek(ele -> {
extFilterList.forEach(ele -> {
if (ObjectUtils.isNotEmpty(ele.getValue())) {
List<String> collect = ele.getValue().stream().map(SQLUtils::transKeyword).collect(Collectors.toList());
if (CollectionUtils.isEmpty(ele.getOriginValue())) {
@@ -354,7 +352,7 @@ public class ChartDataManage {
}
ele.setValue(collect);
}
}).collect(Collectors.toList());
});
// 视图自定义过滤逻辑
CustomFilterResult filterResult = chartHandler.customFilter(view, extFilterList, formatResult);
@@ -642,7 +640,6 @@ public class ChartDataManage {
view.setXAxisExt(new ArrayList<>());
}
List<ChartViewFieldDTO> xAxisBase = new ArrayList<>(view.getXAxis());
List<ChartViewFieldDTO> xAxis = new ArrayList<>(view.getXAxis());
List<ChartViewFieldDTO> xAxisExt = new ArrayList<>(view.getXAxisExt());
if (StringUtils.equalsIgnoreCase(view.getType(), "table-pivot")

View File

@@ -661,7 +661,6 @@ onMounted(() => {
class="menu-item-padding"
:disabled="state.disableEditCompare"
:command="beforeQuickCalc('setting')"
v-if="!(chart.type.includes('chart-mix') && type === 'quotaExt')"
>
<div
class="sub-menu-content"

View File

@@ -212,7 +212,6 @@ export class ColumnLineMix extends G2PlotChartView<DualAxesOptions, DualAxes> {
const label = {
fields: [],
...tempLabel,
offsetY: -8,
formatter: (data: Datum) => {
if (!labelAttr.seriesLabelFormatter?.length) {
return data.value