feat(图表): 明细表支持自定义汇总 #17539

This commit is contained in:
wisonic
2026-02-05 17:19:16 +08:00
committed by wisonic-s
parent 5f796b661a
commit 7fcc1937c0
2 changed files with 76 additions and 1 deletions

View File

@@ -1,11 +1,16 @@
package io.dataease.chart.charts.impl.table;
import com.fasterxml.jackson.core.type.TypeReference;
import io.dataease.api.chart.dto.PageInfo;
import io.dataease.api.dataset.union.DatasetGroupInfoDTO;
import io.dataease.chart.charts.impl.DefaultChartHandler;
import io.dataease.constant.DeTypeConstants;
import io.dataease.engine.constant.ExtFieldConstant;
import io.dataease.engine.sql.SQLProvider;
import io.dataease.engine.trans.Dimension2SQLObj;
import io.dataease.engine.trans.Quota2SQLObj;
import io.dataease.engine.utils.Utils;
import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO;
import io.dataease.extensions.datasource.dto.DatasourceRequest;
import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO;
import io.dataease.extensions.datasource.model.SQLMeta;
@@ -14,12 +19,16 @@ import io.dataease.extensions.view.dto.*;
import io.dataease.extensions.view.util.ChartDataUtil;
import io.dataease.extensions.view.util.FieldUtil;
import io.dataease.utils.BeanUtils;
import io.dataease.utils.IDUtils;
import io.dataease.utils.JsonUtil;
import lombok.Getter;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@@ -183,6 +192,67 @@ public class TableInfoHandler extends DefaultChartHandler {
} catch (Exception e) {
e.printStackTrace();
}
// 自定义汇总
var basicStyle = (Map<String, Object>) view.getCustomAttr().get("basicStyle");
var showSummary = BooleanUtils.isTrue((Boolean) basicStyle.get("showSummary"));
if (showSummary) {
var fieldList = (List) basicStyle.get("seriesSummary");
if (CollectionUtils.isNotEmpty(fieldList)) {
var customCalcFields = new ArrayList<ChartViewFieldDTO>();
var seriesList = JsonUtil.parseList(JsonUtil.toJSONString(fieldList).toString(), new TypeReference<List<ChartViewFieldDTO>>(){});
var quotaIds = allFields.stream().map(DatasetTableFieldDTO::getDataeaseName).collect(Collectors.toSet());
seriesList.forEach(field -> {
if (!BooleanUtils.isTrue(field.getShow()) || !"custom".equalsIgnoreCase(field.getSummary())) {
return;
}
if (StringUtils.isBlank(field.getOriginName())) {
return;
}
if (!quotaIds.contains(field.getField())) {
return;
}
field.setSummary("");
field.setDeType(DeTypeConstants.DE_FLOAT);
field.setId(IDUtils.snowID());
field.setExtField(ExtFieldConstant.EXT_CALC);
customCalcFields.add(field);
});
if (!customCalcFields.isEmpty()) {
var xFields = sqlMeta.getXFields();
var xOrder = sqlMeta.getXOrders();
// 清空维度值,获取完结果再设置回去
sqlMeta.setXFields(Collections.emptyList());
sqlMeta.setXOrders(Collections.emptyList());
List<DatasetTableFieldDTO> tmpList = FieldUtil.transFields(allFields);
tmpList.addAll(customCalcFields);
Quota2SQLObj.quota2sqlObj(sqlMeta, customCalcFields, tmpList, crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage);
String customSumSql = SQLProvider.createQuerySQL(sqlMeta, false, !StringUtils.equalsIgnoreCase(dsMap.values().iterator().next().getType(), "es"), view);
customSumSql = provider.rebuildSQL(customSumSql, sqlMeta, crossDs, dsMap);
var customSumReq = new DatasourceRequest();
customSumReq.setIsCross(crossDs);
customSumReq.setDsList(dsMap);
customSumReq.setQuery(customSumSql);
var customSumData = (List<String[]>) provider.fetchResultField(customSumReq).get("data");
if (CollectionUtils.isNotEmpty(customSumData)) {
var customSumResult = new HashMap<String, BigDecimal>();
// 只取第一行结果
var customSumArr = customSumData.get(0);
for (int i = 0; i < customSumArr.length; i++) {
if (customCalcFields.get(i) != null && customSumArr[i] != null) {
try {
customSumResult.put(customCalcFields.get(i).getField(), new BigDecimal(customSumArr[i]));
} catch (Exception e) {
customSumResult.put(customCalcFields.get(i).getField(), new BigDecimal(0));
}
}
}
result.put("customSumResult", customSumResult);
}
sqlMeta.setXFields(xFields);
sqlMeta.setXOrders(xOrder);
}
}
}
return calcResult;
}
}

View File

@@ -522,7 +522,12 @@ export class TableInfo extends S2ChartView<TableSheet> {
// 计算汇总加入到数据里,冻结最后一行
s2Options.frozenTrailingRowCount = 1
const axis = filter(xAxis, axis => [2, 3, 4].includes(axis.deType))
const summaryObj = getSummaryRow(data, axis, basicStyle.seriesSummary) as any
const summaryObj = getSummaryRow(
data,
axis,
basicStyle.seriesSummary,
chart.data.customSumResult
) as any
data.push(summaryObj)
}
const { mergeCells } = tableCell