From e6844cc7007365bd555bc0f1e7899772412959e8 Mon Sep 17 00:00:00 2001 From: wisonic-s <51065359+wisonic-s@users.noreply.github.com> Date: Fri, 21 Mar 2025 11:51:19 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=9B=BE=E8=A1=A8):=20=E6=B1=87=E6=80=BB?= =?UTF-8?q?=E8=A1=A8=E6=94=AF=E6=8C=81=E5=88=86=E9=A1=B5=20#11689=20#12662?= =?UTF-8?q?=20(#15443)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../charts/impl/table/TableNormalHandler.java | 115 ++++++++++++++++-- .../io/dataease/engine/sql/SQLProvider.java | 2 +- .../js/panel/charts/table/table-normal.ts | 11 +- .../views/components/ChartComponentS2.vue | 8 +- 4 files changed, 118 insertions(+), 18 deletions(-) diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableNormalHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableNormalHandler.java index 27f79136c8..aa7c5be27c 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableNormalHandler.java +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableNormalHandler.java @@ -1,15 +1,25 @@ package io.dataease.chart.charts.impl.table; -import io.dataease.chart.charts.impl.YoyChartHandler; +import io.dataease.api.chart.dto.PageInfo; +import io.dataease.chart.charts.impl.DefaultChartHandler; +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.DatasourceRequest; import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; import io.dataease.extensions.datasource.model.SQLMeta; import io.dataease.extensions.datasource.provider.Provider; import io.dataease.extensions.view.dto.*; +import io.dataease.extensions.view.util.ChartDataUtil; +import io.dataease.extensions.view.util.FieldUtil; import lombok.Getter; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -18,32 +28,115 @@ import java.util.Map; * @date 2024/9/11 11:37 **/ @Component -public class TableNormalHandler extends YoyChartHandler { +public class TableNormalHandler extends DefaultChartHandler { @Getter - private String type = "table-normal"; + private final String type = "table-normal"; + + @Override + public T customFilter(ChartViewDTO view, List filterList, AxisFormatResult formatResult) { + var chartExtRequest = view.getChartExtRequest(); + Map mapAttr = view.getCustomAttr(); + Map mapSize = (Map) mapAttr.get("basicStyle"); + var tablePageMode = (String) mapSize.get("tablePageMode"); + formatResult.getContext().put("tablePageMode", tablePageMode); + if (StringUtils.equalsIgnoreCase(tablePageMode, "page")) { + if (chartExtRequest.getGoPage() == null) { + chartExtRequest.setGoPage(1L); + } + if (chartExtRequest.getPageSize() == null) { + int pageSize = (int) mapSize.get("tablePageSize"); + if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) { + chartExtRequest.setPageSize(Math.min(pageSize, view.getResultCount().longValue())); + } else { + chartExtRequest.setPageSize((long) pageSize); + } + } + } else { + if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) { + chartExtRequest.setGoPage(1L); + chartExtRequest.setPageSize(view.getResultCount().longValue()); + } else if (!view.getIsExcelExport()) { + chartExtRequest.setGoPage(null); + chartExtRequest.setPageSize(null); + } + } + return (T) new CustomFilterResult(filterList, formatResult.getContext()); + } @Override public T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map sqlMap, SQLMeta sqlMeta, Provider provider) { + var chartExtRequest = view.getChartExtRequest(); var dsMap = (Map) sqlMap.get("dsMap"); - var result = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider); + List dsList = new ArrayList<>(); + for (Map.Entry next : dsMap.entrySet()) { + dsList.add(next.getValue().getType()); + } + boolean crossDs = Utils.isCrossDs(dsMap); + DatasourceRequest datasourceRequest = new DatasourceRequest(); + datasourceRequest.setDsList(dsMap); + var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + + var allFields = (List) filterResult.getContext().get("allFields"); + PageInfo pageInfo = new PageInfo(); + pageInfo.setGoPage(chartExtRequest.getGoPage()); + if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) { + pageInfo.setPageSize(Math.min(view.getResultCount() - (chartExtRequest.getGoPage() - 1) * chartExtRequest.getPageSize(), chartExtRequest.getPageSize())); + } else { + pageInfo.setPageSize(chartExtRequest.getPageSize()); + } + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage); + Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage); + String originSql = SQLProvider.createQuerySQL(sqlMeta, true, !StringUtils.equalsIgnoreCase(dsMap.entrySet().iterator().next().getValue().getType(), "es"), view);// 分页强制加排序 + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + pageInfo.getPageSize() + " OFFSET " + (pageInfo.getGoPage() - 1) * chartExtRequest.getPageSize() : ""); + var querySql = originSql + limit; + + var tablePageMode = (String) filterResult.getContext().get("tablePageMode"); + var totalPageSql = "SELECT COUNT(*) FROM (" + SQLProvider.createQuerySQLNoSort(sqlMeta, true, view) + ") COUNT_TEMP"; + if (StringUtils.isNotEmpty(totalPageSql) && StringUtils.equalsIgnoreCase(tablePageMode, "page")) { + totalPageSql = provider.rebuildSQL(totalPageSql, sqlMeta, crossDs, dsMap); + datasourceRequest.setQuery(totalPageSql); + datasourceRequest.setTotalPageFlag(true); + logger.debug("calcite total sql: " + totalPageSql); + List tmpData = (List) provider.fetchResultField(datasourceRequest).get("data"); + var totalItems = ObjectUtils.isEmpty(tmpData) ? 0 : Long.valueOf(tmpData.get(0)[0]); + if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) { + totalItems = totalItems <= view.getResultCount() ? totalItems : view.getResultCount(); + } + var totalPage = (totalItems / pageInfo.getPageSize()) + (totalItems % pageInfo.getPageSize() > 0 ? 1 : 0); + view.setTotalItems(totalItems); + view.setTotalPage(totalPage); + } + + querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap); + datasourceRequest.setQuery(querySql); + logger.debug("calcite chart sql: " + querySql); + List data = (List) provider.fetchResultField(datasourceRequest).get("data"); + //自定义排序 + data = ChartDataUtil.resultCustomSort(xAxis, yAxis, view.getSortPriority(), data); + //数据重组逻辑可重载 + var result = this.buildResult(view, formatResult, filterResult, data); + T calcResult = (T) new ChartCalcDataResult(); + calcResult.setData(result); + calcResult.setContext(filterResult.getContext()); + calcResult.setQuerySql(querySql); + calcResult.setOriginData(data); try { - var originSql = result.getQuerySql(); var dynamicAssistFields = getDynamicThresholdFields(view); - var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); - var assistFields = getAssistFields(dynamicAssistFields, yAxis); + var assistFields = getAssistFields(dynamicAssistFields, yAxis, xAxis); if (CollectionUtils.isNotEmpty(assistFields)) { var req = new DatasourceRequest(); req.setDsList(dsMap); - var assistSql = assistSQL(originSql, assistFields, dsMap); + var assistSql = assistSQL(querySql, assistFields, dsMap); req.setQuery(assistSql); logger.debug("calcite assistSql sql: " + assistSql); var assistData = (List) provider.fetchResultField(req).get("data"); - result.setAssistData(assistData); - result.setDynamicAssistFields(dynamicAssistFields); + calcResult.setAssistData(assistData); + calcResult.setDynamicAssistFields(dynamicAssistFields); } } catch (Exception e) { e.printStackTrace(); } - return result; + return calcResult; } } diff --git a/core/core-backend/src/main/java/io/dataease/engine/sql/SQLProvider.java b/core/core-backend/src/main/java/io/dataease/engine/sql/SQLProvider.java index 77c5b2f897..d62fd168cc 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/sql/SQLProvider.java +++ b/core/core-backend/src/main/java/io/dataease/engine/sql/SQLProvider.java @@ -197,7 +197,7 @@ public class SQLProvider { } public static String sqlLimit(String sql, ChartViewDTO view) { - if (StringUtils.equalsIgnoreCase(view.getType(), "table-info")) { + if (StringUtils.equalsAnyIgnoreCase(view.getType(), "table-info", "table-normal")) { return sql; } if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) { diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-normal.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-normal.ts index d7c5ff2138..a3aaaee0b7 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-normal.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-normal.ts @@ -38,6 +38,7 @@ export class TableNormal extends S2ChartView { ], 'basic-style-selector': [ ...TABLE_EDITOR_PROPERTY_INNER['basic-style-selector'], + 'tablePageMode', 'showSummary', 'summaryLabel', 'showHoverStyle' @@ -67,7 +68,7 @@ export class TableNormal extends S2ChartView { } drawChart(drawOption: S2DrawOptions): TableSheet { - const { container, chart, action, resizeAction } = drawOption + const { container, chart, action, pageInfo, resizeAction } = drawOption const containerDom = document.getElementById(container) if (!containerDom) return @@ -173,8 +174,12 @@ export class TableNormal extends S2ChartView { col.value = indexLabel } } - s2Options.dataCell = meta => { - return new TableDataCell(meta, meta.spreadsheet) + s2Options.dataCell = viewMeta => { + if (viewMeta.colIndex === 0 && s2Options.showSeriesNumber) { + viewMeta.fieldValue = + pageInfo.pageSize * (pageInfo.currentPage - 1) + viewMeta.rowIndex + 1 + } + return new TableDataCell(viewMeta, viewMeta.spreadsheet) } } // tooltip diff --git a/core/core-frontend/src/views/chart/components/views/components/ChartComponentS2.vue b/core/core-frontend/src/views/chart/components/views/components/ChartComponentS2.vue index 5dc387925c..a5fb145885 100644 --- a/core/core-frontend/src/views/chart/components/views/components/ChartComponentS2.vue +++ b/core/core-frontend/src/views/chart/components/views/components/ChartComponentS2.vue @@ -125,6 +125,7 @@ const state = reactive({ imgEnlarge: false, imgSrc: '' }) +const PAGE_CHARTS = ['table-info', 'table-normal'] // 图表数据不用全响应式 let chartData = shallowRef>({ fields: [] @@ -248,7 +249,7 @@ const debounceRender = debounce(resetPageInfo => { const setupPage = (chart: ChartObj, resetPageInfo?: boolean) => { const customAttr = chart.customAttr - if (chart.type !== 'table-info' || customAttr.basicStyle.tablePageMode !== 'page') { + if (!PAGE_CHARTS.includes(chart.type) || customAttr.basicStyle.tablePageMode !== 'page') { state.showPage = false return } @@ -293,7 +294,8 @@ const initScroll = () => { myChart && senior?.scrollCfg?.open && chartData.value.tableRow?.length && - (view.value.type === 'table-normal' || (view.value.type === 'table-info' && !state.showPage)) + PAGE_CHARTS.includes(chart.type) && + !state.showPage ) { // 防止多次渲染 myChart.facet.timer?.stop() @@ -337,7 +339,7 @@ const initScroll = () => { } const showPage = computed(() => { - if (view.value.type !== 'table-info') { + if (!PAGE_CHARTS.includes(view.value.type)) { return false } return state.showPage