From fe47e25c76124ede2ef97d08514009ffe6e14a84 Mon Sep 17 00:00:00 2001 From: "lixuefei.1313" Date: Mon, 13 Oct 2025 16:26:19 +0800 Subject: [PATCH] feat: support waterfallType in waterfall chart --- .../chart/waterfall/waterfall-transformer.ts | 1 + .../vchart/src/data/transforms/waterfall.ts | 18 ++++++++++++++---- .../vchart/src/series/waterfall/interface.ts | 7 +++++++ .../vchart/src/series/waterfall/waterfall.ts | 11 +++++++---- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/packages/vchart/src/chart/waterfall/waterfall-transformer.ts b/packages/vchart/src/chart/waterfall/waterfall-transformer.ts index 96dfcdf376..ee68100a55 100644 --- a/packages/vchart/src/chart/waterfall/waterfall-transformer.ts +++ b/packages/vchart/src/chart/waterfall/waterfall-transformer.ts @@ -26,6 +26,7 @@ export class WaterfallChartSpecTransformer< series.stackLabel = spec.stackLabel; series.leaderLine = spec.leaderLine; series.total = spec.total; + series.calculationMode = spec.calculationMode; return series; } diff --git a/packages/vchart/src/data/transforms/waterfall.ts b/packages/vchart/src/data/transforms/waterfall.ts index 29c0586b29..dd68b8ddef 100644 --- a/packages/vchart/src/data/transforms/waterfall.ts +++ b/packages/vchart/src/data/transforms/waterfall.ts @@ -29,6 +29,8 @@ export interface IWaterfallOpt { startAs: string; endAs: string; total: IWaterfallSeriesSpec['total']; + calculationMode: 'increase' | 'decrease'; + seriesFieldName: { total: string; increase: string; @@ -42,7 +44,7 @@ export const waterfall = (lastData: Array, op: IWaterfallOpt) => { if (!lastData || lastData.length === 0) { return lastData; } - const { indexField, total: totalSpec, groupData } = op; + const { indexField, total: totalSpec, groupData, calculationMode } = op; const totalData: { start: number; end: number; @@ -57,7 +59,10 @@ export const waterfall = (lastData: Array, op: IWaterfallOpt) => { dimensionValues: { [key in string]: Set }; dimensionData: { [key in string]: Datum[] }; }; - const indexValues = Array.from(dimensionValues[indexField]); + let indexValues = Array.from(dimensionValues[indexField]); + if (calculationMode === 'decrease') { + indexValues = indexValues.reverse(); + } // 上一次的计算结果 let temp: { start: number; end: number; lastIndex: string; positive: number; negative: number } = { start: 0, @@ -320,13 +325,14 @@ export interface IWaterfallFillEndOpt { valueField: string; seriesField?: string; total: IWaterfallSeriesSpec['total']; + calculationMode: IWaterfallSeriesSpec['calculationMode']; } export const waterfallFillTotal = (data: Array, op: IWaterfallFillEndOpt) => { if (!data) { return data; } - const { indexField, valueField, total, seriesField } = op; + const { indexField, valueField, total, seriesField, calculationMode } = op; const totalData = { [indexField]: total?.text || 'total', [valueField]: data.reduce((pre, cur) => precisionAdd(pre, +cur[valueField]), 0) @@ -334,6 +340,10 @@ export const waterfallFillTotal = (data: Array, op: IWaterfallFillEndOpt) if (seriesField) { totalData[seriesField] = 'total'; } - data.push(totalData); + if (calculationMode === 'decrease') { + data.unshift(totalData); + } else { + data.push(totalData); + } return data; }; diff --git a/packages/vchart/src/series/waterfall/interface.ts b/packages/vchart/src/series/waterfall/interface.ts index f5b316e05e..eec6615c05 100644 --- a/packages/vchart/src/series/waterfall/interface.ts +++ b/packages/vchart/src/series/waterfall/interface.ts @@ -89,6 +89,13 @@ export interface IWaterfallSeriesSpec /** 标签偏移量 */ offset?: number; }; + + /** + * 瀑布图类型 + * 默认为 increase 增长瀑布图 + * @since 2.0.6 + */ + calculationMode?: 'increase' | 'decrease'; } export interface IWaterfallSeriesTheme extends IBarSeriesTheme { diff --git a/packages/vchart/src/series/waterfall/waterfall.ts b/packages/vchart/src/series/waterfall/waterfall.ts index f2f0ed3178..cd17cc5a9d 100644 --- a/packages/vchart/src/series/waterfall/waterfall.ts +++ b/packages/vchart/src/series/waterfall/waterfall.ts @@ -103,6 +103,7 @@ export class WaterfallSeries this.getGroups().groupData, stackInverse: this.getRegion().getStackInverse() } @@ -301,6 +303,7 @@ export class WaterfallSeries this.totalPositionY(datum, 'index', 0) + y1: (datum: Datum) => this.totalPositionY(datum, 'index', isDecrease ? 1 : 0) }, 'normal', AttributeLevel.Series @@ -329,9 +332,9 @@ export class WaterfallSeries this.totalPositionX(datum, 'index', 0), + x1: (datum: Datum) => this.totalPositionX(datum, 'index', isDecrease ? 1 : 0), y: (datum: Datum) => this.totalPositionY(datum, 'lastEnd', 0), y1: (datum: Datum) => this.totalPositionY(datum, datum.isTotal ? 'end' : 'start', 0) },