zmdms-webui 3.4.7 → 3.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/table/useSummary.js +1 -29
- package/dist/es/table/utils.js +92 -9
- package/package.json +1 -1
|
@@ -4,6 +4,7 @@ import { useCallback } from 'react';
|
|
|
4
4
|
import { Table } from 'antd';
|
|
5
5
|
import { plus, addThousedSeparator } from 'zmdms-utils';
|
|
6
6
|
import { IS_SUMMARY, MERGE_ROW_SPANS } from './constant.js';
|
|
7
|
+
import { getFieldMergeKey } from './utils.js';
|
|
7
8
|
|
|
8
9
|
function useSummary(summaryConfig, columns, options) {
|
|
9
10
|
var summaryFixed = options.summaryFixed, rowSelection = options.rowSelection, expandable = options.expandable, isAdd = options.isAdd, isDel = options.isDel, isTableSummaryCollapse = options.isTableSummaryCollapse, showSummary = options.showSummary, renderTableSummaryCollapse = options.renderTableSummaryCollapse;
|
|
@@ -135,35 +136,6 @@ function getSummaryData(summaryConfig, dataSource, options) {
|
|
|
135
136
|
}
|
|
136
137
|
return _summaryData;
|
|
137
138
|
}
|
|
138
|
-
/**
|
|
139
|
-
* 从 columns 中查找字段的 mergeKey 配置
|
|
140
|
-
* @param fieldName 字段名
|
|
141
|
-
* @param columns 列配置
|
|
142
|
-
* @returns 合并字段名(如果有 mergeKey 则返回 mergeKey,否则返回字段名本身)
|
|
143
|
-
*/
|
|
144
|
-
function getFieldMergeKey(fieldName, columns) {
|
|
145
|
-
// 递归查找字段配置
|
|
146
|
-
function findFieldMergeKey(cols, targetField) {
|
|
147
|
-
if (!Array.isArray(cols))
|
|
148
|
-
return null;
|
|
149
|
-
for (var _i = 0, cols_1 = cols; _i < cols_1.length; _i++) {
|
|
150
|
-
var col = cols_1[_i];
|
|
151
|
-
// 检查当前列
|
|
152
|
-
if (col.key === targetField || col.dataIndex === targetField) {
|
|
153
|
-
return col.mergeKey || null;
|
|
154
|
-
}
|
|
155
|
-
// 如果有子列,递归查找
|
|
156
|
-
if (col.children && Array.isArray(col.children)) {
|
|
157
|
-
var result = findFieldMergeKey(col.children, targetField);
|
|
158
|
-
if (result !== null)
|
|
159
|
-
return result;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return null;
|
|
163
|
-
}
|
|
164
|
-
var mergeKey = findFieldMergeKey(columns, fieldName);
|
|
165
|
-
return mergeKey || fieldName; // 如果有 mergeKey 返回 mergeKey,否则返回字段名本身
|
|
166
|
-
}
|
|
167
139
|
// 为 getSubtotalObj 编写测试用例 TODO:
|
|
168
140
|
function getSubtotalObj(fields, dataSource, columns) {
|
|
169
141
|
if (!Array.isArray(dataSource)) {
|
package/dist/es/table/utils.js
CHANGED
|
@@ -491,7 +491,8 @@ function flattenRecordsOptimized(records, mergeKeys, dimensionSummaryKeys, summa
|
|
|
491
491
|
summaryKeys &&
|
|
492
492
|
summaryKeys.length > 0) {
|
|
493
493
|
result = insertDimensionSummaryRows(result, mergeKeys, // 传入完整的维度字段列表
|
|
494
|
-
dimensionSummaryKeys, summaryKeys, order, dimensionCustomSumKeys // 传入自定义合计配置
|
|
494
|
+
dimensionSummaryKeys, summaryKeys, order, dimensionCustomSumKeys, // 传入自定义合计配置
|
|
495
|
+
columns // 传入列配置,用于查找字段的 mergeKey
|
|
495
496
|
);
|
|
496
497
|
}
|
|
497
498
|
// 3. 为每行初始化合并信息
|
|
@@ -781,7 +782,8 @@ function sortByDimensions(records, dimensionKeys, order, columns) {
|
|
|
781
782
|
function insertDimensionSummaryRows(records, allDimensionKeys, // 完整的维度字段列表
|
|
782
783
|
dimensionSummaryKeys, // 需要合计的维度字段
|
|
783
784
|
summaryKeys, order, // 排序配置
|
|
784
|
-
dimensionCustomSumKeys // 自定义合计配置
|
|
785
|
+
dimensionCustomSumKeys, // 自定义合计配置
|
|
786
|
+
columns // 列配置,透传给 createSummaryRow 用于查找 mergeKey
|
|
785
787
|
) {
|
|
786
788
|
var result = __spreadArray([], records, true);
|
|
787
789
|
// 按维度层级从深到浅处理
|
|
@@ -804,7 +806,8 @@ dimensionCustomSumKeys // 自定义合计配置
|
|
|
804
806
|
newResult.push.apply(newResult, group.items);
|
|
805
807
|
// 创建合计行
|
|
806
808
|
var summaryRow = createSummaryRow(group.items, group.key, groupingKeys, allDimensionKeys, // 传入完整的维度字段列表
|
|
807
|
-
summaryKeys, currentDimensionIndex, dimensionCustomSumKeys // 传入自定义合计配置
|
|
809
|
+
summaryKeys, currentDimensionIndex, dimensionCustomSumKeys, // 传入自定义合计配置
|
|
810
|
+
columns // 传入列配置,用于查找字段的 mergeKey
|
|
808
811
|
);
|
|
809
812
|
newResult.push(summaryRow);
|
|
810
813
|
}
|
|
@@ -843,7 +846,8 @@ function groupByDimensions(records, dimensionKeys) {
|
|
|
843
846
|
function createSummaryRow(items, groupKey, groupingKeys, // 当前分组使用的维度字段
|
|
844
847
|
allDimensionKeys, // 完整的维度字段列表
|
|
845
848
|
summaryKeys, summaryLevelIndex, // 在完整维度列表中的索引
|
|
846
|
-
dimensionCustomSumKeys // 自定义合计配置
|
|
849
|
+
dimensionCustomSumKeys, // 自定义合计配置
|
|
850
|
+
columns // 列配置,用于查找字段的 mergeKey
|
|
847
851
|
) {
|
|
848
852
|
var summaryRow = {};
|
|
849
853
|
// 设置所有维度字段
|
|
@@ -862,15 +866,20 @@ dimensionCustomSumKeys // 自定义合计配置
|
|
|
862
866
|
summaryRow[dimensionKey] = "";
|
|
863
867
|
}
|
|
864
868
|
}
|
|
869
|
+
// 计算合计值
|
|
870
|
+
var filteredSummaryItems = items.filter(function (item) { return !isSummaryRow(item); }); // 排除已有的合计行
|
|
871
|
+
// 预计算分组内各字段的合并状态,与底部小计逻辑保持一致:跳过 rowSpan===0 的字段行
|
|
872
|
+
var summaryRowSpans = computeRowSpans(filteredSummaryItems, allDimensionKeys);
|
|
865
873
|
var _loop_5 = function (summaryKey) {
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
874
|
+
var mergeKey = getFieldMergeKey(summaryKey, columns);
|
|
875
|
+
summaryRow[summaryKey] = filteredSummaryItems.reduce(function (sum, item, idx) {
|
|
876
|
+
var _a;
|
|
877
|
+
if (((_a = summaryRowSpans[idx]) === null || _a === void 0 ? void 0 : _a[mergeKey]) === 0)
|
|
878
|
+
return sum; // 该字段被合并到上一行,跳过统计
|
|
869
879
|
var value = parseFloat(item[summaryKey]) || 0;
|
|
870
880
|
return plus(sum, value);
|
|
871
881
|
}, 0);
|
|
872
882
|
};
|
|
873
|
-
// 计算合计值
|
|
874
883
|
for (var _i = 0, summaryKeys_1 = summaryKeys; _i < summaryKeys_1.length; _i++) {
|
|
875
884
|
var summaryKey = summaryKeys_1[_i];
|
|
876
885
|
_loop_5(summaryKey);
|
|
@@ -984,6 +993,80 @@ function hasParentGroupChanged(records, currentIndex, mergeKeys, currentKeyIndex
|
|
|
984
993
|
}
|
|
985
994
|
return false;
|
|
986
995
|
}
|
|
996
|
+
/**
|
|
997
|
+
* 从 columns 中查找字段的 mergeKey 配置
|
|
998
|
+
* 与 useSummary 的合并判断保持一致:若列配置了 mergeKey 则用 mergeKey,否则用字段名本身
|
|
999
|
+
*/
|
|
1000
|
+
function getFieldMergeKey(fieldName, columns) {
|
|
1001
|
+
if (!Array.isArray(columns))
|
|
1002
|
+
return fieldName;
|
|
1003
|
+
function findFieldMergeKey(cols, targetField) {
|
|
1004
|
+
if (!Array.isArray(cols))
|
|
1005
|
+
return null;
|
|
1006
|
+
for (var _i = 0, cols_2 = cols; _i < cols_2.length; _i++) {
|
|
1007
|
+
var col = cols_2[_i];
|
|
1008
|
+
if (col.key === targetField || col.dataIndex === targetField) {
|
|
1009
|
+
return col.mergeKey || null;
|
|
1010
|
+
}
|
|
1011
|
+
if (col.children && Array.isArray(col.children)) {
|
|
1012
|
+
var result = findFieldMergeKey(col.children, targetField);
|
|
1013
|
+
if (result !== null)
|
|
1014
|
+
return result;
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
return null;
|
|
1018
|
+
}
|
|
1019
|
+
var mergeKey = findFieldMergeKey(columns, fieldName);
|
|
1020
|
+
return mergeKey || fieldName;
|
|
1021
|
+
}
|
|
1022
|
+
/**
|
|
1023
|
+
* 在给定数据范围内计算各合并字段的 rowSpan
|
|
1024
|
+
* 与主流程 flattenRecordsOptimized 的合并算法保持一致
|
|
1025
|
+
* rowSpan===0 表示该字段被合并到上一行,统计时应跳过
|
|
1026
|
+
*/
|
|
1027
|
+
function computeRowSpans(records, mergeKeys) {
|
|
1028
|
+
var spansList = records.map(function () { return ({}); });
|
|
1029
|
+
if (!mergeKeys.length)
|
|
1030
|
+
return spansList;
|
|
1031
|
+
for (var keyIndex = 0; keyIndex < mergeKeys.length; keyIndex++) {
|
|
1032
|
+
var currentKey = mergeKeys[keyIndex];
|
|
1033
|
+
// 找出所有分组的起始点(父级字段组合发生变化即为新分组)
|
|
1034
|
+
var groupStarts = [];
|
|
1035
|
+
for (var i = 0; i < records.length; i++) {
|
|
1036
|
+
if (i === 0 || hasParentGroupChanged(records, i, mergeKeys, keyIndex)) {
|
|
1037
|
+
groupStarts.push(i);
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
// 在每个分组内查找连续相同值的行
|
|
1041
|
+
for (var g = 0; g < groupStarts.length; g++) {
|
|
1042
|
+
var groupStart = groupStarts[g];
|
|
1043
|
+
var groupEnd = g < groupStarts.length - 1 ? groupStarts[g + 1] : records.length;
|
|
1044
|
+
for (var i = groupStart; i < groupEnd; i++) {
|
|
1045
|
+
if (spansList[i][currentKey] === 0)
|
|
1046
|
+
continue;
|
|
1047
|
+
var currentValue = records[i][currentKey];
|
|
1048
|
+
var spanCount = 1;
|
|
1049
|
+
for (var j = i + 1; j < groupEnd; j++) {
|
|
1050
|
+
if (records[j][currentKey] === currentValue)
|
|
1051
|
+
spanCount++;
|
|
1052
|
+
else
|
|
1053
|
+
break;
|
|
1054
|
+
}
|
|
1055
|
+
if (spanCount > 1) {
|
|
1056
|
+
spansList[i][currentKey] = spanCount;
|
|
1057
|
+
for (var k = 1; k < spanCount; k++) {
|
|
1058
|
+
spansList[i + k][currentKey] = 0;
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
else {
|
|
1062
|
+
spansList[i][currentKey] = 1;
|
|
1063
|
+
}
|
|
1064
|
+
i += spanCount - 1;
|
|
1065
|
+
}
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
return spansList;
|
|
1069
|
+
}
|
|
987
1070
|
/**
|
|
988
1071
|
* 按所有合并键的组合进行分组并计算合计值
|
|
989
1072
|
* 确保相同维度组合的记录被正确分组
|
|
@@ -1122,4 +1205,4 @@ summaryKeys, dimensionCustomSumKeys) {
|
|
|
1122
1205
|
return result;
|
|
1123
1206
|
}
|
|
1124
1207
|
|
|
1125
|
-
export { copyColData, flattenRecordsOptimized, getFilterRecords, getNextColumn, getTableColumns, parsePasteData, startColumnInsertTableData };
|
|
1208
|
+
export { copyColData, flattenRecordsOptimized, getFieldMergeKey, getFilterRecords, getNextColumn, getTableColumns, parsePasteData, startColumnInsertTableData };
|