diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableInfoHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableInfoHandler.java index 42572dfa06..027b69c995 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableInfoHandler.java +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableInfoHandler.java @@ -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) 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(); + var seriesList = JsonUtil.parseList(JsonUtil.toJSONString(fieldList).toString(), new TypeReference>(){}); + 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 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) provider.fetchResultField(customSumReq).get("data"); + if (CollectionUtils.isNotEmpty(customSumData)) { + var customSumResult = new HashMap(); + // 只取第一行结果 + 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; } } diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-info.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-info.ts index 026206408f..647ee2648a 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-info.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-info.ts @@ -522,7 +522,12 @@ export class TableInfo extends S2ChartView { // 计算汇总加入到数据里,冻结最后一行 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