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.
@@ -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)) {
@@ -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
- summaryRow[summaryKey] = items
867
- .filter(function (item) { return !isSummaryRow(item); }) // 排除已有的合计行
868
- .reduce(function (sum, item) {
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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zmdms-webui",
3
- "version": "3.4.7",
3
+ "version": "3.4.8",
4
4
  "private": false,
5
5
  "main": "dist/index.es.js",
6
6
  "module": "dist/index.es.js",