zmdms-webui 1.8.4 → 1.8.6

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.
@@ -61,6 +61,12 @@ var DynamicDrawer = function (props, ref) {
61
61
  var endIndex = isUp ? hoverIndex : dragIndex;
62
62
  var oldItem = tempDynamicList[startIndex];
63
63
  var dragItem = tempDynamicList[endIndex];
64
+ // 仅当同组且存在优先级时校验;不同组直接通过
65
+ var oldGroup = oldItem === null || oldItem === void 0 ? void 0 : oldItem.dimensionGroup;
66
+ var dragGroup = dragItem === null || dragItem === void 0 ? void 0 : dragItem.dimensionGroup;
67
+ if (oldGroup !== dragGroup) {
68
+ return true;
69
+ }
64
70
  if ((oldItem === null || oldItem === void 0 ? void 0 : oldItem.dimensionPriority) !== undefined) {
65
71
  if ((dragItem === null || dragItem === void 0 ? void 0 : dragItem.dimensionPriority) === undefined ||
66
72
  (oldItem === null || oldItem === void 0 ? void 0 : oldItem.dimensionPriority) < (dragItem === null || dragItem === void 0 ? void 0 : dragItem.dimensionPriority)) {
@@ -10,6 +10,8 @@ interface IDynamicItem {
10
10
  filter?: IFilter;
11
11
  isDimension?: boolean;
12
12
  dimensionPriority?: number;
13
+ /** 维度优先级分组,同组内遵循 dimensionPriority,跨组不比较 */
14
+ dimensionGroup?: string;
13
15
  dimensionExclusive?: string;
14
16
  isDimensionSum?: boolean;
15
17
  [props: string]: any;
@@ -17,6 +17,7 @@ function recursionDynamicItems(list, currentDynamicList) {
17
17
  currentData.disabled = result.disabled;
18
18
  currentData.isDimension = result.isDimension;
19
19
  currentData.dimensionPriority = result.dimensionPriority;
20
+ currentData.dimensionGroup = result.dimensionGroup;
20
21
  currentData.dimensionExclusive = result.dimensionExclusive;
21
22
  // 判断是否是多级表头,这里的逻辑处理是为了兼容
22
23
  // 后面改造成多级表头的情况
@@ -0,0 +1,3 @@
1
+ declare const IS_SUMMARY = "__is_summary__";
2
+
3
+ export { IS_SUMMARY };
@@ -8,6 +8,8 @@ var DESCEND = "descend"; // 降序
8
8
  // 合并后数据标识
9
9
  var MERGE_KEY = "__row_id";
10
10
  var MERGE_ROW_SPANS = "__row_spans";
11
- var MERGE_INDEX = "__row_index";
11
+ var MERGE_INDEX = "__row_index";
12
+ // 合计行标识
13
+ var IS_SUMMARY = "__is_summary__";
12
14
 
13
- export { ASCEND, DESCEND, ERROR_TD_CLASSNAME, INNER_TABLE_PAGINATION_PAGESIZEOPTIONS, INNER_TABLE_PAGINATION_POSITION, MERGE_INDEX, MERGE_KEY, MERGE_ROW_SPANS, TABLE_DRAG_ROW_TYPE, TABLE_DYNAMIC_KEY };
15
+ export { ASCEND, DESCEND, ERROR_TD_CLASSNAME, INNER_TABLE_PAGINATION_PAGESIZEOPTIONS, INNER_TABLE_PAGINATION_POSITION, IS_SUMMARY, MERGE_INDEX, MERGE_KEY, MERGE_ROW_SPANS, TABLE_DRAG_ROW_TYPE, TABLE_DYNAMIC_KEY };
@@ -8,24 +8,59 @@ import { MERGE_ROW_SPANS } from './constant.js';
8
8
  /**
9
9
  * 导出Excel,支持维度合并和小计
10
10
  */
11
- function exportToExcelWithMerge(records, columns, mergeKeys, summaryKeys, fileName, sheetName, columnHeaders) {
11
+ function exportToExcelWithMerge(records, columns, mergeKeys, summaryKeys, fileName, sheetName, columnHeaders, summaryConfig) {
12
12
  if (fileName === void 0) { fileName = "export.xlsx"; }
13
13
  if (sheetName === void 0) { sheetName = "Sheet1"; }
14
14
  if (!records || records.length === 0) {
15
15
  throw new Error("没有数据可导出");
16
16
  }
17
17
  var processedData = records;
18
- // 2. 准备Excel数据
18
+ // 2. 准备Excel数据(支持分组表头与合并)
19
19
  var excelData = prepareExcelData(processedData, columns, columnHeaders);
20
20
  // 3. 创建工作簿
21
21
  var workbook = xlsx_minExports.utils.book_new();
22
- // 4. 创建工作表
23
- var worksheet = createWorksheetWithMerge(excelData, mergeKeys);
24
- // 5. 添加样式(合计行高亮)
25
- applyExcelStyles(worksheet, excelData.data, mergeKeys, summaryKeys, excelData.columns);
26
- // 6. 添加工作表到工作簿
22
+ // 4. 计算末尾合计行(当提供了 summaryConfig 时)
23
+ var summaryRow;
24
+ var dataForStyles = processedData;
25
+ if (summaryConfig !== undefined) {
26
+ var sumsByKey_1 = {};
27
+ excelData.leafColumns.forEach(function (col, colIndex) {
28
+ var key = col.dataIndex;
29
+ if (col.isSummary) {
30
+ var total = 0;
31
+ for (var i = 0; i < processedData.length; i++) {
32
+ var v = processedData[i][key];
33
+ var n = typeof v === "number" ? v : Number(v);
34
+ if (!isNaN(n))
35
+ total += n;
36
+ }
37
+ sumsByKey_1[key] = total;
38
+ }
39
+ });
40
+ // 生成用于写入Excel的末尾合计行
41
+ summaryRow = excelData.leafColumns.map(function (col, index) {
42
+ if (index === 0)
43
+ return "合计";
44
+ var key = col.dataIndex;
45
+ if (col.isSummary && sumsByKey_1[key] !== undefined) {
46
+ return sumsByKey_1[key];
47
+ }
48
+ return "";
49
+ });
50
+ // 生成用于样式应用的数据(追加一条 __is_summary__ 行)
51
+ var summaryDataObj_1 = { __is_summary__: true };
52
+ Object.keys(sumsByKey_1).forEach(function (k) {
53
+ summaryDataObj_1[k] = sumsByKey_1[k];
54
+ });
55
+ dataForStyles = __spreadArray(__spreadArray([], processedData, true), [summaryDataObj_1], false);
56
+ }
57
+ // 5. 创建工作表(带末尾合计行)
58
+ var worksheet = createWorksheetWithMerge(__assign(__assign({}, excelData), { summaryRow: summaryRow }), mergeKeys);
59
+ // 6. 添加样式(合计行高亮)
60
+ applyExcelStyles(worksheet, dataForStyles, mergeKeys, summaryKeys, excelData.leafColumns, excelData.headerRowCount);
61
+ // 7. 添加工作表到工作簿
27
62
  xlsx_minExports.utils.book_append_sheet(workbook, worksheet, sheetName);
28
- // 7. 导出文件
63
+ // 8. 导出文件
29
64
  xlsx_minExports.writeFile(workbook, fileName, { bookType: "xlsx" });
30
65
  return {
31
66
  totalRows: excelData.data.length,
@@ -34,27 +69,94 @@ function exportToExcelWithMerge(records, columns, mergeKeys, summaryKeys, fileNa
34
69
  };
35
70
  }
36
71
  /**
37
- * 准备Excel数据
72
+ * 准备Excel数据(支持分组表头,构建多行表头与合并范围)
38
73
  */
39
74
  function prepareExcelData(processedData, columns, columnHeaders) {
40
- // 过滤有效的列配置
41
- var validColumns = columns.filter(function (item) {
42
- return typeof item.dataIndex === "string" &&
43
- typeof (item.dynamicTitle || item.title) === "string";
44
- });
45
- // 准备表头
46
- var headers = validColumns.map(function (item) {
47
- if (typeof item.dataIndex === "string") {
48
- if (columnHeaders === null || columnHeaders === void 0 ? void 0 : columnHeaders[item.dataIndex]) {
49
- return columnHeaders[item.dataIndex];
50
- }
75
+ // 计算最大深度
76
+ var getMaxDepth = function (cols) {
77
+ var max = 0;
78
+ var dfs = function (nodes, depth) {
79
+ nodes.forEach(function (n) {
80
+ var hasChildren = Array.isArray(n.children) && n.children.length > 0;
81
+ if (hasChildren) {
82
+ dfs(n.children, depth + 1);
83
+ }
84
+ else {
85
+ if (depth > max)
86
+ max = depth;
87
+ }
88
+ });
89
+ };
90
+ dfs(cols, 1);
91
+ return max || 1;
92
+ };
93
+ // 计算每个节点的 colSpan
94
+ var computeColSpan = function (node) {
95
+ if (Array.isArray(node.children) && node.children.length > 0) {
96
+ return node.children.reduce(function (sum, c) { return sum + computeColSpan(c); }, 0);
51
97
  }
52
- return (item.dynamicTitle || item.title);
53
- });
98
+ return 1;
99
+ };
100
+ var maxDepth = getMaxDepth(columns);
101
+ // 生成表头矩阵与merge区域,同时收集叶子列
102
+ var headerRows = Array.from({ length: maxDepth }, function () { return []; });
103
+ var headerMerges = [];
104
+ var leafColumns = [];
105
+ var walkHeader = function (nodes, depth, startColIndexRef) {
106
+ nodes.forEach(function (node) {
107
+ var text = node.dynamicTitle || node.title;
108
+ if (typeof text === "string") {
109
+ var hasChildren = Array.isArray(node.children) && node.children.length > 0;
110
+ var colSpan = computeColSpan(node);
111
+ var rowSpan = hasChildren ? 1 : maxDepth - depth + 1;
112
+ // 确保本行已经有足够的列位(填充空字符串到当前列索引)
113
+ while (headerRows[depth - 1].length < startColIndexRef.value) {
114
+ headerRows[depth - 1].push("");
115
+ }
116
+ // 放置当前单元格文本
117
+ headerRows[depth - 1].push(text);
118
+ // 合并头:行合并或列合并
119
+ var currentCol = startColIndexRef.value;
120
+ var start = { r: depth - 1, c: currentCol };
121
+ var end = {
122
+ r: depth - 1 + (rowSpan - 1),
123
+ c: currentCol + (colSpan - 1),
124
+ };
125
+ if (rowSpan > 1 || colSpan > 1) {
126
+ headerMerges.push({ s: start, e: end });
127
+ }
128
+ // 占位填充剩余列(如果是列合并,需要占满 colSpan 列位;如果是行合并仅占1列)
129
+ var occupyCols = colSpan;
130
+ for (var i = 1; i < occupyCols; i++) {
131
+ headerRows[depth - 1].push("");
132
+ }
133
+ // 递归子节点或记录叶子列
134
+ if (hasChildren) {
135
+ var childStartRef = { value: currentCol };
136
+ walkHeader(node.children, depth + 1, childStartRef);
137
+ // 子节点会推进 childStartRef.value 到当前块的末尾
138
+ startColIndexRef.value = currentCol + colSpan;
139
+ }
140
+ else {
141
+ // 叶子列用于数据映射;允许 columnHeaders 覆盖标题(仅叶子层)
142
+ if (typeof node.dataIndex === "string" &&
143
+ (columnHeaders === null || columnHeaders === void 0 ? void 0 : columnHeaders[node.dataIndex])) {
144
+ headerRows[depth - 1][headerRows[depth - 1].length - occupyCols] =
145
+ columnHeaders[node.dataIndex];
146
+ }
147
+ leafColumns.push(node);
148
+ startColIndexRef.value = currentCol + 1;
149
+ }
150
+ }
151
+ });
152
+ };
153
+ walkHeader(columns, 1, { value: 0 });
54
154
  return {
55
- headers: headers,
155
+ headerRows: headerRows,
156
+ headerMerges: headerMerges,
157
+ headerRowCount: headerRows.length,
56
158
  data: processedData,
57
- columns: validColumns,
159
+ leafColumns: leafColumns,
58
160
  };
59
161
  }
60
162
  /**
@@ -62,54 +164,49 @@ function prepareExcelData(processedData, columns, columnHeaders) {
62
164
  */
63
165
  function createWorksheetWithMerge(excelData, mergeKeys) {
64
166
  var _a;
65
- var headers = excelData.headers, data = excelData.data, columns = excelData.columns;
66
- // 创建工作表数据(包含表头)
67
- var worksheetData = __spreadArray([
68
- headers
69
- ], data.map(function (row) {
70
- return columns.map(function (item) {
167
+ var headerRows = excelData.headerRows, headerMerges = excelData.headerMerges, headerRowCount = excelData.headerRowCount, data = excelData.data, leafColumns = excelData.leafColumns, summaryRow = excelData.summaryRow;
168
+ // 创建工作表数据(包含多行表头)
169
+ var dataRows = data.map(function (row) {
170
+ return leafColumns.map(function (item) {
71
171
  var value = row[item.dataIndex];
72
- // 处理数值类型
73
- if (typeof value === "number") {
172
+ if (typeof value === "number")
74
173
  return value;
75
- }
76
- // 处理字符串类型,避免空值
77
174
  return value != null ? String(value) : "";
78
175
  });
79
- }), true);
176
+ });
177
+ var worksheetData = __spreadArray(__spreadArray(__spreadArray([], headerRows, true), dataRows, true), (summaryRow ? [summaryRow] : []), true);
80
178
  // 创建工作表
81
179
  var worksheet = xlsx_minExports.utils.aoa_to_sheet(worksheetData);
82
- // 设置列宽
83
- var columnWidths = columns.map(function (col) {
180
+ // 设置列宽(按叶子列)
181
+ var columnWidths = leafColumns.map(function (col) {
84
182
  var _a;
85
183
  return ({
86
184
  wch: Math.max(15, ((_a = ((col.dynamicTitle || col.title))) === null || _a === void 0 ? void 0 : _a.length) * 2),
87
185
  });
88
186
  });
89
187
  worksheet["!cols"] = columnWidths;
90
- // 添加合并单元格
91
- var merges = [];
188
+ // 添加合并单元格:表头合并 + 数据区合并(带偏移)
189
+ var merges = __spreadArray([], headerMerges, true);
92
190
  if (mergeKeys && mergeKeys.length > 0) {
93
191
  var _loop_1 = function (colIndex) {
94
192
  var mergeKey = mergeKeys[colIndex];
95
- var excelColIndex = columns.findIndex(function (item) { return item.dataIndex === mergeKey; });
96
- if (excelColIndex === -1) {
193
+ var excelColIndex = leafColumns.findIndex(function (item) { return item.dataIndex === mergeKey; });
194
+ if (excelColIndex === -1)
97
195
  return "continue";
98
- }
99
196
  for (var rowIndex = 0; rowIndex < data.length; rowIndex++) {
100
197
  var rowData = data[rowIndex];
101
198
  var spanCount = (_a = rowData[MERGE_ROW_SPANS]) === null || _a === void 0 ? void 0 : _a[mergeKey];
102
- // 如果合并数量大于1,添加合并单元格
103
199
  if (spanCount && spanCount > 1) {
104
- var mergeRange = {
105
- s: { r: rowIndex + 1, c: excelColIndex },
106
- e: { r: rowIndex + spanCount, c: excelColIndex }, // 修复合并范围
107
- };
108
- merges.push(mergeRange);
200
+ merges.push({
201
+ s: { r: headerRowCount + rowIndex, c: excelColIndex },
202
+ e: {
203
+ r: headerRowCount + rowIndex + spanCount - 1,
204
+ c: excelColIndex,
205
+ },
206
+ });
109
207
  }
110
208
  }
111
209
  };
112
- // 处理每个合并字段
113
210
  for (var colIndex = 0; colIndex < mergeKeys.length; colIndex++) {
114
211
  _loop_1(colIndex);
115
212
  }
@@ -120,8 +217,9 @@ function createWorksheetWithMerge(excelData, mergeKeys) {
120
217
  /**
121
218
  * 应用Excel样式 - 修复版本
122
219
  */
123
- function applyExcelStyles(worksheet, data, mergeKeys, summaryKeys, columns) {
220
+ function applyExcelStyles(worksheet, data, mergeKeys, summaryKeys, columns, headerRowCount) {
124
221
  var _a;
222
+ if (headerRowCount === void 0) { headerRowCount = 1; }
125
223
  // 修复1:定义样式对象,确保格式正确
126
224
  var headerStyle = {
127
225
  font: { bold: true, color: { rgb: "FFFFFF" } },
@@ -165,22 +263,25 @@ function applyExcelStyles(worksheet, data, mergeKeys, summaryKeys, columns) {
165
263
  var maxRow = data.length; // +1 for header, but 0-indexed
166
264
  range = { s: { r: 0, c: 0 }, e: { r: maxRow, c: maxCol } };
167
265
  }
168
- // 修复3:应用表头样式,确保单元格存在
169
- for (var col = range.s.c; col <= range.e.c; col++) {
170
- var cellAddress = xlsx_minExports.utils.encode_cell({ r: 0, c: col });
171
- // 确保单元格存在
172
- if (!worksheet[cellAddress]) {
173
- worksheet[cellAddress] = { v: "", t: "s" };
266
+ // 修复3:应用表头样式(支持多行表头),确保单元格存在
267
+ for (var row = 0; row < headerRowCount; row++) {
268
+ for (var col = range.s.c; col <= range.e.c; col++) {
269
+ var cellAddress = xlsx_minExports.utils.encode_cell({ r: row, c: col });
270
+ if (!worksheet[cellAddress]) {
271
+ worksheet[cellAddress] = { v: "", t: "s" };
272
+ }
273
+ worksheet[cellAddress].s = headerStyle;
174
274
  }
175
- // 应用样式
176
- worksheet[cellAddress].s = headerStyle;
177
275
  }
178
276
  // 修复4:应用数据行样式
179
277
  for (var rowIndex = 0; rowIndex < data.length; rowIndex++) {
180
278
  var rowData = data[rowIndex];
181
279
  var isSubtotal = rowData.__is_summary__;
182
280
  for (var col = range.s.c; col <= range.e.c; col++) {
183
- var cellAddress = xlsx_minExports.utils.encode_cell({ r: rowIndex + 1, c: col });
281
+ var cellAddress = xlsx_minExports.utils.encode_cell({
282
+ r: headerRowCount + rowIndex,
283
+ c: col,
284
+ });
184
285
  // 确保单元格存在
185
286
  if (!worksheet[cellAddress]) {
186
287
  worksheet[cellAddress] = { v: "", t: "s" };
@@ -209,7 +310,7 @@ function applyExcelStyles(worksheet, data, mergeKeys, summaryKeys, columns) {
209
310
  if (colIndex === -1)
210
311
  return "continue";
211
312
  var cellAddress = xlsx_minExports.utils.encode_cell({
212
- r: rowIndex + 1,
313
+ r: headerRowCount + rowIndex,
213
314
  c: colIndex,
214
315
  });
215
316
  var cellValue = rowData[summaryKey];
@@ -232,7 +333,7 @@ function applyExcelStyles(worksheet, data, mergeKeys, summaryKeys, columns) {
232
333
  // 修复6:确保工作表引用正确
233
334
  if (!worksheet["!ref"]) {
234
335
  var lastCol = Math.max(0, ((columns === null || columns === void 0 ? void 0 : columns.length) || 1) - 1);
235
- var lastRow = data.length; // header + data rows
336
+ var lastRow = headerRowCount + data.length - 1; // header + data rows (0-indexed end)
236
337
  worksheet["!ref"] = xlsx_minExports.utils.encode_range({
237
338
  s: { r: 0, c: 0 },
238
339
  e: { r: lastRow, c: lastCol },
@@ -243,13 +344,13 @@ function applyExcelStyles(worksheet, data, mergeKeys, summaryKeys, columns) {
243
344
  * 导出Excel的简化版本(只提供必要参数)
244
345
  */
245
346
  function exportToExcelSimple(records, config) {
246
- return exportToExcelWithMerge(records, config.columns || [], config.mergeKeys, config.summaryKeys || [], config.fileName || "export.xlsx", config.sheetName || "Sheet1", config.columnHeaders);
347
+ return exportToExcelWithMerge(records, config.columns || [], config.mergeKeys, config.summaryKeys || [], config.fileName || "export.xlsx", config.sheetName || "Sheet1", config.columnHeaders, config.summaryConfig);
247
348
  }
248
349
  /**
249
350
  * excel导出
250
351
  */
251
352
  function useExcelExport(records, config) {
252
- var columns = config.columns, fileName = config.fileName, isAutoMerge = config.isAutoMerge, columnHeaders = config.columnHeaders;
353
+ var columns = config.columns, isAutoMerge = config.isAutoMerge, columnHeaders = config.columnHeaders, summaryConfig = config.summaryConfig;
253
354
  // 计算需要合并的字段key集合
254
355
  var mergeKeys = useMergeKeys(columns, isAutoMerge);
255
356
  // 需要合计的字段
@@ -258,13 +359,14 @@ function useExcelExport(records, config) {
258
359
  .filter(function (item) { return item.isSummary; })
259
360
  .map(function (item) { return item.dataIndex; });
260
361
  }, [columns]);
261
- var exportFunction = useMemoizedFn(function () {
362
+ var exportFunction = useMemoizedFn(function (fileName) {
262
363
  exportToExcelSimple(records, {
263
364
  columns: columns,
264
365
  mergeKeys: mergeKeys,
265
366
  summaryKeys: summaryKeys,
266
367
  fileName: fileName,
267
368
  columnHeaders: columnHeaders,
369
+ summaryConfig: summaryConfig,
268
370
  });
269
371
  });
270
372
  return exportFunction;
@@ -3,7 +3,8 @@ import { useCallback, useRef, useState, useEffect, useMemo } from 'react';
3
3
  import update from '../node_modules/immutability-helper/index.js';
4
4
  import { getInnerIndex } from './useInnerPagination.js';
5
5
  import { flattenRecordsOptimized } from './utils.js';
6
- import { MERGE_INDEX, MERGE_ROW_SPANS } from './constant.js';
6
+ import { IS_SUMMARY, MERGE_INDEX, MERGE_ROW_SPANS } from './constant.js';
7
+ import { useMemoizedFn } from 'ahooks';
7
8
 
8
9
  /**
9
10
  * @param dataSourceRef 数据引用
@@ -57,7 +58,7 @@ function useMoveRowChange(dataSourceRef, onTableChange, options) {
57
58
  hoverIndex: hoverIndex,
58
59
  });
59
60
  }, [dataSourceRef, onTableChange, refreshScuCell, currentPage]);
60
- var onRow = useCallback(function (_, index) {
61
+ var onRow = useCallback(function (record, index) {
61
62
  var baseProps = {
62
63
  index: index,
63
64
  moveRow: moveRow,
@@ -80,8 +81,16 @@ function useMoveRowChange(dataSourceRef, onTableChange, options) {
80
81
  }
81
82
  return baseProps;
82
83
  }, [moveRow, fixedRowsCount, fixedRowsConfig]);
84
+ var defaultOnRow = useMemoizedFn(function (record) {
85
+ var extra = extraOnRow === null || extraOnRow === void 0 ? void 0 : extraOnRow(record);
86
+ var summaryStyle = __assign({ background: "#ebf3fe", fontWeight: "bold" }, extra === null || extra === void 0 ? void 0 : extra.style);
87
+ if (record[IS_SUMMARY]) {
88
+ return __assign(__assign({}, extra), { style: summaryStyle });
89
+ }
90
+ return {};
91
+ });
83
92
  return {
84
- onRow: isMove || fixedRowsCount || fixedRowsConfig ? onRow : extraOnRow,
93
+ onRow: isMove || fixedRowsCount || fixedRowsConfig ? onRow : defaultOnRow,
85
94
  };
86
95
  }
87
96
  /**
@@ -347,7 +356,7 @@ var useMergeKeys = function (columns, isAutoMerge) {
347
356
  * 自动合并的一些处理
348
357
  */
349
358
  function useAutoMerge(dataSource, columns, _a) {
350
- var mode = _a.mode, isAutoMerge = _a.isAutoMerge;
359
+ var isAutoMerge = _a.isAutoMerge, isDimensionDynamic = _a.isDimensionDynamic;
351
360
  // 计算需要合并的字段key集合
352
361
  var mergeKeys = useMergeKeys(columns, isAutoMerge);
353
362
  var firstMergeKey = mergeKeys === null || mergeKeys === void 0 ? void 0 : mergeKeys[0];
@@ -369,33 +378,20 @@ function useAutoMerge(dataSource, columns, _a) {
369
378
  if (!mergeKeys)
370
379
  return dataSource;
371
380
  else {
372
- var newDataSource_2 = flattenRecordsOptimized(__spreadArray([], (dataSource || []), true), mergeKeys, dimensionSummaryKeys, summaryKeys);
381
+ var newDataSource_2 = flattenRecordsOptimized(__spreadArray([], (dataSource || []), true), mergeKeys, dimensionSummaryKeys, summaryKeys, isDimensionDynamic);
373
382
  return newDataSource_2;
374
383
  }
375
384
  }
376
- }, [dataSource, isAutoMerge, mergeKeys, dimensionSummaryKeys, summaryKeys]);
385
+ }, [
386
+ dataSource,
387
+ isAutoMerge,
388
+ mergeKeys,
389
+ dimensionSummaryKeys,
390
+ summaryKeys,
391
+ isDimensionDynamic,
392
+ ]);
377
393
  var newColumns = useMemo(function () {
378
394
  var _columns = columns;
379
- if (mode === "index") {
380
- // 自动添加序号列,支持合并不参与自定义配置
381
- _columns = __spreadArray([
382
- {
383
- title: "序号",
384
- width: 60,
385
- key: "index",
386
- fixed: "left",
387
- align: "center",
388
- isMerge: isAutoMerge,
389
- isFilter: false,
390
- render: function (value, record, index) {
391
- if (isAutoMerge) {
392
- return record[MERGE_INDEX] + 1;
393
- }
394
- return "".concat(index + 1);
395
- },
396
- }
397
- ], _columns, true);
398
- }
399
395
  // 递归处理多级表头,自动补充render/合并/编辑等逻辑
400
396
  var newColumns = _columns.map(function (item) {
401
397
  return getColumnItem(item);
@@ -429,7 +425,7 @@ function useAutoMerge(dataSource, columns, _a) {
429
425
  return getItem(item);
430
426
  }
431
427
  }
432
- }, [columns, mode, isAutoMerge, firstMergeKey]);
428
+ }, [columns, isAutoMerge, firstMergeKey]);
433
429
  return [newDataSource, newColumns];
434
430
  }
435
431
  /**
@@ -5,6 +5,7 @@ import { IInputProps } from '../input/input.js';
5
5
  import { IInputNumberProps } from '../inputnumber/inputNumber.js';
6
6
  import { IDynamicItem } from '../dynamicsetting/interface.js';
7
7
  import _default from './components/TitleDirectionColumn.js';
8
+ import { IS_SUMMARY } from './constant.js';
8
9
 
9
10
  type IEditableConfigOtherProps = IInputProps & IInputNumberProps & TextAreaProps;
10
11
  interface IEditableConfig extends Partial<IEditableConfigOtherProps> {
@@ -199,6 +200,10 @@ interface IColumnType<RecordType> extends Omit<ColumnType<RecordType>, "render">
199
200
  * 自定义排序的优先级,数字越小,优先级越高,比如2的不能排序到1的前面
200
201
  */
201
202
  dimensionPriority?: number;
203
+ /**
204
+ * 维度优先级分组,同组内遵循 dimensionPriority,跨组自由排序
205
+ */
206
+ dimensionGroup?: string;
202
207
  /**
203
208
  * 自定义维度互斥的字段,多个需要逗号分隔,比如:name,age
204
209
  */
@@ -277,7 +282,7 @@ interface ITableRefHandel {
277
282
  /**
278
283
  * 导出excel
279
284
  */
280
- exportExcel?: () => void;
285
+ exportExcel?: (fileName: string) => void;
281
286
  }
282
287
  interface ITableProps<RecordType> extends Omit<TableProps<RecordType>, "columns"> {
283
288
  /**
@@ -536,6 +541,7 @@ interface TableComponent<T> extends React.FC<ITableProps<T>> {
536
541
  Summary: typeof Table.Summary;
537
542
  TitleDirectionColumn: typeof _default;
538
543
  DifferencesClassName: string;
544
+ IS_SUMMARY: typeof IS_SUMMARY;
539
545
  }
540
546
  /**
541
547
  * 排序相关类型
@@ -9,7 +9,7 @@ import EnhanceHeaderCellMemo from './components/EnhanceHeaderCell.js';
9
9
  import './components/ColumnDynamic.js';
10
10
  import './components/ColumnAddDel.js';
11
11
  import './components/TitleOperation.js';
12
- import { TABLE_DYNAMIC_KEY, INNER_TABLE_PAGINATION_POSITION, INNER_TABLE_PAGINATION_PAGESIZEOPTIONS } from './constant.js';
12
+ import { IS_SUMMARY, TABLE_DYNAMIC_KEY, INNER_TABLE_PAGINATION_POSITION, INNER_TABLE_PAGINATION_PAGESIZEOPTIONS } from './constant.js';
13
13
  import './components/PopoverIcon.js';
14
14
  import { useLatest } from 'ahooks';
15
15
  import { useParseColumns } from './useParseColumns.js';
@@ -161,6 +161,7 @@ var Table = function (props) {
161
161
  // 处理表格合并和维度
162
162
  var _v = useAutoMerge(currentTableDataSource, _newColumns, {
163
163
  isAutoMerge: isAutoMerge,
164
+ isDimensionDynamic: isDimensionDynamic,
164
165
  }), newDataSource = _v[0], newColumns = _v[1];
165
166
  // 内部表格总结栏
166
167
  var getSummaryHandle = useSummary(summaryConfig, newColumns, {
@@ -246,7 +247,7 @@ var Table = function (props) {
246
247
  var exportExcel = useExcelExport(newDataSource, {
247
248
  columns: newColumns,
248
249
  isAutoMerge: isAutoMerge,
249
- fileName: "导出.xlsx",
250
+ summaryConfig: summaryConfig,
250
251
  });
251
252
  // 暴露给外部一些方法
252
253
  useImperativeHandle(tableRefHandle, function () {
@@ -337,6 +338,7 @@ MemoTable.Column = Table$1.Column;
337
338
  MemoTable.ColumnGroup = Table$1.ColumnGroup;
338
339
  MemoTable.Summary = Table$1.Summary;
339
340
  MemoTable.TitleDirectionColumn = TitleDirectionColumn;
340
- MemoTable.DifferencesClassName = "ztxk-table--differences";
341
+ MemoTable.DifferencesClassName = "ztxk-table--differences";
342
+ MemoTable.IS_SUMMARY = IS_SUMMARY;
341
343
 
342
344
  export { MemoTable as default };
@@ -40,11 +40,11 @@ function useColumns(columns, options) {
40
40
  var myNewColumns = [];
41
41
  var enhanceColumnHandle = function (_column, options) {
42
42
  var _a;
43
- var _b, _c, _d, _e, _f;
43
+ var _b, _c, _d, _e, _f, _g;
44
44
  var isCopy = _column.isCopy, editable = _column.editable, editableConfig = _column.editableConfig, title = _column.title, key = _column.key, validate = _column.validate, isRequire = _column.isRequire, isFillDown = _column.isFillDown, isOrder = _column.isOrder, isStress = _column.isStress, popoverText = _column.popoverText, showType = _column.showType, isFilter = _column.isFilter, __dynamicItem__ = _column.__dynamicItem__;
45
45
  // 表格列,唯一key
46
46
  var _key = key ? key : _column === null || _column === void 0 ? void 0 : _column.dataIndex;
47
- var _g = options || {}, _h = _g.keyIndex, keyIndex = _h === void 0 ? [] : _h, headerAlign = _g.headerAlign;
47
+ var _h = options || {}, _j = _h.keyIndex, keyIndex = _j === void 0 ? [] : _j, headerAlign = _h.headerAlign;
48
48
  var align = headerAlign || _column.align;
49
49
  var isRequireNode = isRequire ? (jsx("i", __assign({ className: "ztxk-column--required" }, { children: "*" }))) : null;
50
50
  if (showType) {
@@ -315,10 +315,8 @@ function useColumns(columns, options) {
315
315
  }
316
316
  // 如果配置了伸缩列
317
317
  if (isResizableColumn) {
318
- _column.onHeaderCell = function (column) { return ({
319
- width: column.width,
320
- isResizableTitleEllipsis: isResizableTitleEllipsis,
321
- onResize: (function (e, _a) {
318
+ var extraOnHeaderCell_1 = (_g = _column.onHeaderCell) === null || _g === void 0 ? void 0 : _g.call(_column, _column);
319
+ _column.onHeaderCell = function (column) { return (__assign({ width: column.width, isResizableTitleEllipsis: isResizableTitleEllipsis, onResize: (function (e, _a) {
322
320
  var _b;
323
321
  var size = _a.size;
324
322
  // 获取当前列配置项
@@ -337,11 +335,9 @@ function useColumns(columns, options) {
337
335
  else {
338
336
  onCurrentListChange === null || onCurrentListChange === void 0 ? void 0 : onCurrentListChange(newList);
339
337
  }
340
- }),
341
- style: {
338
+ }), style: {
342
339
  textAlign: align,
343
- },
344
- }); };
340
+ } }, extraOnHeaderCell_1)); };
345
341
  }
346
342
  // 如果有子元素 递归执行逻辑
347
343
  // 支持多级表头控制
@@ -5,7 +5,7 @@ import isEqual from 'lodash/isEqual';
5
5
 
6
6
  // 处理列信息
7
7
  function parseColumn(column, index, indexs) {
8
- var _a = column, key = _a.key, dataIndex = _a.dataIndex, title = _a.title, dynamicTitle = _a.dynamicTitle, dynamicDisabled = _a.dynamicDisabled, defaultUnChecked = _a.defaultUnChecked, width = _a.width, fixed = _a.fixed, isDimension = _a.isDimension, dimensionPriority = _a.dimensionPriority, dimensionExclusive = _a.dimensionExclusive, isDimensionSum = _a.isDimensionSum;
8
+ var _a = column, key = _a.key, dataIndex = _a.dataIndex, title = _a.title, dynamicTitle = _a.dynamicTitle, dynamicDisabled = _a.dynamicDisabled, defaultUnChecked = _a.defaultUnChecked, width = _a.width, fixed = _a.fixed, isDimension = _a.isDimension, dimensionPriority = _a.dimensionPriority, dimensionGroup = _a.dimensionGroup, dimensionExclusive = _a.dimensionExclusive, isDimensionSum = _a.isDimensionSum;
9
9
  // 动态列配置 title必须为一个字符串
10
10
  if (title && !dynamicTitle && typeof title !== "string") {
11
11
  console.error("\u4F60\u4F20\u5165\u7684title\u4E0D\u662F\u4E00\u4E2A\u5B57\u7B26\u4E32,\u5E76\u4E14\u4F60\u6CA1\u6709\u4F20\u5165dynamicTitle\u7684\u914D\u7F6E\u3002\n \u95EE\u9898\u53EF\u80FD\u51FA\u73B0\u518D:".concat(key || dataIndex, " \u5217\u3002\u8BF7\u4F20\u5165\u4E00\u4E2AdynamicTitle \u4F5C\u4E3A\u52A8\u6001\u5217\u914D\u7F6E\u7684title\u503C"));
@@ -30,6 +30,7 @@ function parseColumn(column, index, indexs) {
30
30
  fixed: fixed,
31
31
  isDimension: isDimension,
32
32
  dimensionPriority: dimensionPriority,
33
+ dimensionGroup: dimensionGroup,
33
34
  dimensionExclusive: dimensionExclusive,
34
35
  isDimensionSum: isDimensionSum,
35
36
  };
@@ -3,6 +3,7 @@ import { jsx } from 'react/jsx-runtime';
3
3
  import { useCallback } from 'react';
4
4
  import { Table } from 'antd';
5
5
  import { plus } from 'zmdms-utils';
6
+ import { IS_SUMMARY } from './constant.js';
6
7
 
7
8
  function useSummary(summaryConfig, columns, options) {
8
9
  var summaryFixed = options.summaryFixed, rowSelection = options.rowSelection, expandable = options.expandable, isAdd = options.isAdd, isDel = options.isDel;
@@ -131,7 +132,10 @@ function getSubtotalObj(fields, dataSource) {
131
132
  }
132
133
  var summaryTotalObj = {};
133
134
  var summaryTotalConfigObj = {};
134
- dataSource.forEach(function (item, index) {
135
+ // 过滤掉按维度合计行
136
+ dataSource
137
+ .filter(function (item) { return !item[IS_SUMMARY]; })
138
+ .forEach(function (item, index) {
135
139
  fields.forEach(function (field) {
136
140
  if (typeof field === "string") {
137
141
  var dataItem = Number(item === null || item === void 0 ? void 0 : item[field]);
@@ -1,6 +1,6 @@
1
1
  import { __spreadArray, __assign, __awaiter, __generator } from '../_virtual/_tslib.js';
2
2
  import { filterHandle } from './components/FilterDropdown.js';
3
- import { MERGE_ROW_SPANS, MERGE_KEY, MERGE_INDEX } from './constant.js';
3
+ import { MERGE_ROW_SPANS, MERGE_KEY, MERGE_INDEX, IS_SUMMARY } from './constant.js';
4
4
  import { message } from 'antd';
5
5
 
6
6
  // 递归处理columns
@@ -447,7 +447,7 @@ function startColumnInsertTableData(options) {
447
447
  * @param dimensionSummaryKeys 维度合计字段
448
448
  * @param summaryKeys 合计字段
449
449
  */
450
- function flattenRecordsOptimized(records, mergeKeys, dimensionSummaryKeys, summaryKeys) {
450
+ function flattenRecordsOptimized(records, mergeKeys, dimensionSummaryKeys, summaryKeys, isDimensionDynamic) {
451
451
  var _a;
452
452
  if (!records ||
453
453
  records.length === 0 ||
@@ -456,7 +456,7 @@ function flattenRecordsOptimized(records, mergeKeys, dimensionSummaryKeys, summa
456
456
  return records;
457
457
  }
458
458
  // 0. 首先根据维度字段对数据进行排序
459
- var result = (dimensionSummaryKeys === null || dimensionSummaryKeys === void 0 ? void 0 : dimensionSummaryKeys.length) > 0
459
+ var result = isDimensionDynamic
460
460
  ? sortByDimensions(__spreadArray([], records, true), mergeKeys)
461
461
  : __spreadArray([], records, true);
462
462
  // 1. 首先插入维度合计行
@@ -677,14 +677,14 @@ summaryKeys, summaryLevelIndex // 在完整维度列表中的索引
677
677
  _loop_5(summaryKey);
678
678
  }
679
679
  // 标记为合计行
680
- summaryRow.__is_summary__ = true;
680
+ summaryRow[IS_SUMMARY] = true;
681
681
  return summaryRow;
682
682
  }
683
683
  /**
684
684
  * 判断是否为合计行
685
685
  */
686
686
  function isSummaryRow(row) {
687
- return row.__is_summary__ === true;
687
+ return row[IS_SUMMARY] === true;
688
688
  }
689
689
  /**
690
690
  * 检查父级分组是否发生变化
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zmdms-webui",
3
- "version": "1.8.4",
3
+ "version": "1.8.6",
4
4
  "private": false,
5
5
  "main": "dist/index.es.js",
6
6
  "module": "dist/index.es.js",