zmdms-webui 1.9.7 → 1.9.9

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.
Files changed (57) hide show
  1. package/dist/es/applayoutheader/tabs/index.js +3 -2
  2. package/dist/es/button/buttonDownload.js +4 -4
  3. package/dist/es/button/buttonExport.js +7 -7
  4. package/dist/es/button/buttonPreview.js +2 -2
  5. package/dist/es/dynamicsetting/dynamicDrawer.js +4 -3
  6. package/dist/es/dynamicsetting/index.css +1 -1
  7. package/dist/es/electronsignatures/dgcomponents/useDg.js +7 -7
  8. package/dist/es/electronsignatures/electroncomponents/electron-seal-batch-download.js +7 -6
  9. package/dist/es/electronsignatures/electroncomponents/useCheckedSealInfoList.js +3 -3
  10. package/dist/es/electronsignatures/electroncomponents/useFetchElectronData.js +3 -3
  11. package/dist/es/electronsignatures/electroncomponents/utils.js +9 -9
  12. package/dist/es/electronsignatures/filecomponents/file-upload.js +8 -7
  13. package/dist/es/electronsignatures/hooks/useParseElectronSetting.js +9 -9
  14. package/dist/es/electronsignatures/hooks/useParseQunjListData.js +4 -4
  15. package/dist/es/electronsignatures/index.js +20 -19
  16. package/dist/es/electronsignatures/qunjcomponents/code-modal.js +5 -5
  17. package/dist/es/electronsignatures/qunjcomponents/useFetchQunjData.js +4 -4
  18. package/dist/es/login/forget-password.js +10 -10
  19. package/dist/es/message/index.d.ts +5 -0
  20. package/dist/es/message/index.js +70 -0
  21. package/dist/es/modal/modal.js +4 -3
  22. package/dist/es/table/components/FilterDropdown.js +3 -2
  23. package/dist/es/table/components/table-header-operation/FillDown.js +3 -2
  24. package/dist/es/table/excel.js +173 -56
  25. package/dist/es/table/hooks.js +10 -1
  26. package/dist/es/table/interface.d.ts +16 -1
  27. package/dist/es/table/table.js +6 -2
  28. package/dist/es/table/useColumns.js +11 -1
  29. package/dist/es/table/useDynamicListByColumns.js +6 -4
  30. package/dist/es/table/utils.js +5 -5
  31. package/dist/es/uploadlist/hooks.js +10 -10
  32. package/dist/es/uploadlist/uploadList.js +4 -3
  33. package/dist/es/uploadlist/uploadListDetail.js +3 -2
  34. package/dist/es/uploadlist/uploadTable.js +3 -2
  35. package/dist/es/uploadlist/utils.js +2 -2
  36. package/dist/index.build.d.ts +2 -1
  37. package/dist/index.dark.css +1 -1
  38. package/dist/index.default.css +1 -1
  39. package/dist/index.es.js +2 -1
  40. package/package.json +1 -1
  41. package/dist/es/microloading/index.css +0 -1
  42. package/dist/es/modal/index.css +0 -1
  43. package/dist/es/notauthpage/index.css +0 -0
  44. package/dist/es/notroutepage/index.css +0 -0
  45. package/dist/es/pagination/index.css +0 -1
  46. package/dist/es/placeholder/index.css +0 -1
  47. package/dist/es/print/index.css +0 -1
  48. package/dist/es/select/index.css +0 -1
  49. package/dist/es/table/index.css +0 -1
  50. package/dist/es/tabs/index.css +0 -1
  51. package/dist/es/tag/index.css +0 -1
  52. package/dist/es/title/index.css +0 -1
  53. package/dist/es/tree/index.css +0 -1
  54. package/dist/es/treeselect/index.css +0 -1
  55. package/dist/es/uploadlist/index.css +0 -1
  56. package/dist/es/watermark/index.css +0 -1
  57. package/dist/es/zttransfer/index.css +0 -1
@@ -1,15 +1,16 @@
1
1
  import { __spreadArray, __assign, __awaiter, __generator } from '../_virtual/_tslib.js';
2
2
  import ExcelJS from '../node_modules/exceljs/dist/exceljs.min.js';
3
- import { useMergeKeys } from './hooks.js';
4
- import { useMemo } from 'react';
3
+ import { useMergeKeys, useNumKeys } from './hooks.js';
5
4
  import { useMemoizedFn } from 'ahooks';
6
5
  import { IS_SUMMARY, MERGE_ROW_SPANS } from './constant.js';
6
+ import { exactRound } from 'zmdms-utils';
7
+ import dayjs from 'dayjs';
7
8
 
8
9
  /**
9
10
  * 使用 ExcelJS + 后处理添加批注
10
11
  * 导出Excel,支持维度合并和小计,以及批注功能
11
12
  */
12
- function exportToExcelWithMergeAndComments(records, columns, mergeKeys, summaryKeys, fileName, sheetName, columnHeaders, summaryConfig) {
13
+ function exportToExcelWithMergeAndComments(records, columns, mergeKeys, numKeys, fileName, sheetName, columnHeaders, summaryConfig, topDescription, topDescriptionRowHeight) {
13
14
  var _a;
14
15
  var _this = this;
15
16
  if (fileName === void 0) { fileName = "export.xlsx"; }
@@ -17,9 +18,9 @@ function exportToExcelWithMergeAndComments(records, columns, mergeKeys, summaryK
17
18
  if (!records || records.length === 0) {
18
19
  throw new Error("没有数据可导出");
19
20
  }
20
- var processedData = records;
21
+ var processedData = applyPrecisionToRecords(records, columns);
21
22
  // 准备Excel数据
22
- var excelData = prepareExcelData(processedData, columns, columnHeaders);
23
+ var excelData = prepareExcelData(processedData, columns, columnHeaders, topDescription);
23
24
  // 创建工作簿
24
25
  var workbook = new ExcelJS.Workbook();
25
26
  // 计算末尾合计行
@@ -62,7 +63,7 @@ function exportToExcelWithMergeAndComments(records, columns, mergeKeys, summaryK
62
63
  // 设置冻结窗格
63
64
  setWorksheetFreeze(worksheet, excelData.leafColumns, excelData.headerRowCount);
64
65
  // 添加样式
65
- applyExcelStyles(worksheet, dataForStyles, mergeKeys, summaryKeys, excelData.leafColumns, excelData.headerRowCount);
66
+ applyExcelStyles(worksheet, dataForStyles, numKeys, excelData.leafColumns, excelData.headerRowCount, !!excelData.topDescription, topDescriptionRowHeight);
66
67
  // 添加批注 - 使用改进的方法
67
68
  addCommentsToWorksheet(worksheet, dataForStyles, excelData.leafColumns, excelData.headerRowCount);
68
69
  // 导出文件
@@ -101,6 +102,36 @@ function exportToExcelWithMergeAndComments(records, columns, mergeKeys, summaryK
101
102
  fileName: fileName,
102
103
  };
103
104
  }
105
+ /**
106
+ * 根据列上的 precision 配置,格式化记录中的数值字段
107
+ */
108
+ function applyPrecisionToRecords(records, columns) {
109
+ if (!Array.isArray(records) || !Array.isArray(columns))
110
+ return records || [];
111
+ var precisionMap = {};
112
+ columns.forEach(function (col) {
113
+ if (col && typeof col.dataIndex === "string") {
114
+ var precision = col.precision;
115
+ if (typeof precision === "number") {
116
+ precisionMap[col.dataIndex] = { precision: precision };
117
+ }
118
+ }
119
+ });
120
+ if (Object.keys(precisionMap).length === 0)
121
+ return records;
122
+ return records.map(function (record) {
123
+ if (record == null || typeof record !== "object")
124
+ return record;
125
+ var next = __assign({}, record);
126
+ for (var key in precisionMap) {
127
+ if (!Object.prototype.hasOwnProperty.call(next, key))
128
+ continue;
129
+ var precision = precisionMap[key].precision;
130
+ next[key] = exactRound(next[key], precision);
131
+ }
132
+ return next;
133
+ });
134
+ }
104
135
  /**
105
136
  * 改进的批注添加函数 - 使用 ExcelJS 的正确方法
106
137
  */
@@ -196,7 +227,7 @@ function setWorksheetFreeze(worksheet, leafColumns, headerRowCount) {
196
227
  console.error("设置冻结窗格失败:", e);
197
228
  }
198
229
  }
199
- function prepareExcelData(processedData, columns, columnHeaders) {
230
+ function prepareExcelData(processedData, columns, columnHeaders, topDescription) {
200
231
  var getMaxDepth = function (cols) {
201
232
  var max = 0;
202
233
  var dfs = function (nodes, depth) {
@@ -220,10 +251,6 @@ function prepareExcelData(processedData, columns, columnHeaders) {
220
251
  }
221
252
  return 1;
222
253
  };
223
- var maxDepth = getMaxDepth(columns);
224
- var headerRows = Array.from({ length: maxDepth }, function () { return []; });
225
- var headerMerges = [];
226
- var leafColumns = [];
227
254
  var walkHeader = function (nodes, depth, startColIndexRef) {
228
255
  nodes.forEach(function (node) {
229
256
  var text = node.dynamicTitle || node.title;
@@ -265,13 +292,38 @@ function prepareExcelData(processedData, columns, columnHeaders) {
265
292
  }
266
293
  });
267
294
  };
295
+ var maxDepth = getMaxDepth(columns);
296
+ var headerRows = Array.from({ length: maxDepth }, function () { return []; });
297
+ var headerMerges = [];
298
+ var leafColumns = [];
268
299
  walkHeader(columns, 1, { value: 0 });
300
+ // 顶部说明行:插入到表头之前,并横向合并至所有叶子列
301
+ if (topDescription) {
302
+ var totalLeafCols = Math.max(1, leafColumns.length);
303
+ var topRow = Array.from({ length: totalLeafCols }, function () { return ""; });
304
+ topRow[0] = topDescription;
305
+ // 现有表头合并坐标整体下移一行
306
+ headerMerges.forEach(function (m) {
307
+ m.s.r += 1;
308
+ m.e.r += 1;
309
+ });
310
+ // 插入到最前面
311
+ headerRows.unshift(topRow);
312
+ // 新增顶行的横向合并(从第1列到最后一列)
313
+ if (totalLeafCols > 1) {
314
+ headerMerges.push({
315
+ s: { r: 0, c: 0 },
316
+ e: { r: 0, c: totalLeafCols - 1 },
317
+ });
318
+ }
319
+ }
269
320
  return {
270
321
  headerRows: headerRows,
271
322
  headerMerges: headerMerges,
272
323
  headerRowCount: headerRows.length,
273
324
  data: processedData,
274
325
  leafColumns: leafColumns,
326
+ topDescription: topDescription,
275
327
  };
276
328
  }
277
329
  function createWorksheetWithMerge(workbook, excelData, mergeKeys, sheetName) {
@@ -324,66 +376,126 @@ function createWorksheetWithMerge(workbook, excelData, mergeKeys, sheetName) {
324
376
  }
325
377
  return worksheet;
326
378
  }
327
- function applyExcelStyles(worksheet, data, mergeKeys, summaryKeys, columns, headerRowCount) {
328
- var _a, _b;
379
+ function applyExcelStyles(worksheet, data, numKeys, columns, headerRowCount, hasTopDescription, topDescriptionRowHeight) {
380
+ var _a, _b, _c;
329
381
  if (headerRowCount === void 0) { headerRowCount = 1; }
382
+ if (hasTopDescription === void 0) { hasTopDescription = false; }
330
383
  var headerStyle = {
331
- font: { bold: true, color: { argb: "FFFFFFFF" } },
384
+ font: {
385
+ bold: true,
386
+ color: { argb: "FFFFFFFF" },
387
+ size: 11,
388
+ name: "微软雅黑",
389
+ },
332
390
  fill: {
333
391
  type: "pattern",
334
392
  pattern: "solid",
335
- fgColor: { argb: "FF4F81BD" },
393
+ fgColor: { argb: "FF2E5BBA" },
336
394
  },
337
395
  alignment: { horizontal: "center", vertical: "middle" },
338
396
  border: {
339
- top: { style: "thin", color: { argb: "FF000000" } },
340
- bottom: { style: "thin", color: { argb: "FF000000" } },
341
- left: { style: "thin", color: { argb: "FF000000" } },
342
- right: { style: "thin", color: { argb: "FF000000" } },
397
+ top: { style: "thin", color: { argb: "FF1E3A8A" } },
398
+ bottom: { style: "thin", color: { argb: "FF1E3A8A" } },
399
+ left: { style: "thin", color: { argb: "FF1E3A8A" } },
400
+ right: { style: "thin", color: { argb: "FF1E3A8A" } },
343
401
  },
344
402
  };
345
403
  var summaryStyle = {
346
- font: { bold: true, color: { argb: "FF000000" } },
404
+ font: {
405
+ bold: true,
406
+ color: { argb: "FF1E3A8A" },
407
+ size: 11,
408
+ name: "微软雅黑",
409
+ },
347
410
  fill: {
348
411
  type: "pattern",
349
412
  pattern: "solid",
350
- fgColor: { argb: "FFE6F3FF" },
413
+ fgColor: { argb: "FFE8F2FF" },
351
414
  },
352
- alignment: { horizontal: "center", vertical: "middle" },
415
+ alignment: { horizontal: "left", vertical: "middle" },
353
416
  border: {
354
- top: { style: "thin", color: { argb: "FF000000" } },
355
- bottom: { style: "thin", color: { argb: "FF000000" } },
356
- left: { style: "thin", color: { argb: "FF000000" } },
357
- right: { style: "thin", color: { argb: "FF000000" } },
417
+ top: { style: "thin", color: { argb: "FFD1D5DB" } },
418
+ bottom: { style: "thin", color: { argb: "FFD1D5DB" } },
419
+ left: { style: "thin", color: { argb: "FFD1D5DB" } },
420
+ right: { style: "thin", color: { argb: "FFD1D5DB" } },
358
421
  },
359
422
  };
360
423
  var normalStyle = {
361
- font: { color: { argb: "FF000000" } },
424
+ font: {
425
+ color: { argb: "FF374151" },
426
+ size: 10,
427
+ name: "微软雅黑",
428
+ },
362
429
  fill: {
363
430
  type: "pattern",
364
431
  pattern: "solid",
365
432
  fgColor: { argb: "FFFFFFFF" },
366
433
  },
367
- alignment: { horizontal: "center", vertical: "middle" },
434
+ alignment: { horizontal: "left", vertical: "middle" },
435
+ border: {
436
+ top: { style: "thin", color: { argb: "FFE5E7EB" } },
437
+ bottom: { style: "thin", color: { argb: "FFE5E7EB" } },
438
+ left: { style: "thin", color: { argb: "FFE5E7EB" } },
439
+ right: { style: "thin", color: { argb: "FFE5E7EB" } },
440
+ },
441
+ };
442
+ var descriptionStyle = {
443
+ font: {
444
+ bold: true,
445
+ size: 11,
446
+ color: { argb: "FF2E5BBA" },
447
+ name: "微软雅黑",
448
+ },
449
+ alignment: {
450
+ horizontal: "left",
451
+ vertical: "middle",
452
+ wrapText: true,
453
+ indent: 1,
454
+ },
368
455
  border: {
369
- top: { style: "thin", color: { argb: "FF000000" } },
370
- bottom: { style: "thin", color: { argb: "FF000000" } },
371
- left: { style: "thin", color: { argb: "FF000000" } },
372
- right: { style: "thin", color: { argb: "FF000000" } },
456
+ top: { style: "thin", color: { argb: "FFE6E6E6" } },
457
+ bottom: { style: "thin", color: { argb: "FFE6E6E6" } },
458
+ left: { style: "thin", color: { argb: "FFE6E6E6" } },
459
+ right: { style: "thin", color: { argb: "FFE6E6E6" } },
460
+ },
461
+ fill: {
462
+ type: "pattern",
463
+ pattern: "solid",
464
+ fgColor: { argb: "FFF8F9FA" },
373
465
  },
374
466
  };
375
467
  var totalCols = Math.max(1, (columns === null || columns === void 0 ? void 0 : columns.length) || 1);
376
- // 表头样式
377
468
  for (var r = 1; r <= headerRowCount; r++) {
378
469
  for (var c = 1; c <= totalCols; c++) {
379
470
  var cell = worksheet.getCell(r, c);
380
471
  var currentColumn = columns && Array.isArray(columns) ? columns[c - 1] : undefined;
381
- var customHeaderBgColor = (_a = currentColumn === null || currentColumn === void 0 ? void 0 : currentColumn.excelConfig) === null || _a === void 0 ? void 0 : _a.headerBgColor;
382
- cell.font = headerStyle.font;
383
- cell.alignment = headerStyle.alignment;
384
- cell.fill = __assign(__assign({}, headerStyle.fill), { fgColor: { argb: customHeaderBgColor || "FF4F81BD" } });
385
- cell.border = headerStyle.border;
472
+ var isDescriptionRow = hasTopDescription && r === 1;
473
+ if (isDescriptionRow) {
474
+ cell.font = descriptionStyle.font;
475
+ cell.alignment = descriptionStyle.alignment;
476
+ cell.fill = descriptionStyle.fill;
477
+ cell.border = descriptionStyle.border;
478
+ }
479
+ else {
480
+ var customHeaderBgColor = (_a = currentColumn === null || currentColumn === void 0 ? void 0 : currentColumn.excelConfig) === null || _a === void 0 ? void 0 : _a.headerBgColor;
481
+ var customHeaderFontColor = (_b = currentColumn === null || currentColumn === void 0 ? void 0 : currentColumn.excelConfig) === null || _b === void 0 ? void 0 : _b.headerFontColor;
482
+ cell.font = __assign(__assign({}, headerStyle.font), { color: { argb: customHeaderFontColor || headerStyle.font.color.argb } });
483
+ cell.alignment = headerStyle.alignment;
484
+ cell.fill = __assign(__assign({}, headerStyle.fill), { fgColor: {
485
+ argb: customHeaderBgColor || headerStyle.fill.fgColor.argb,
486
+ } });
487
+ cell.border = headerStyle.border;
488
+ }
489
+ }
490
+ }
491
+ // 如果外部传入了顶端描述行高度,则强制设置第1行高度
492
+ if (hasTopDescription &&
493
+ typeof topDescriptionRowHeight === "number" &&
494
+ topDescriptionRowHeight > 0) {
495
+ try {
496
+ worksheet.getRow(1).height = topDescriptionRowHeight;
386
497
  }
498
+ catch (_d) { }
387
499
  }
388
500
  // 数据行样式
389
501
  for (var rowIndex = 0; rowIndex < data.length; rowIndex++) {
@@ -394,7 +506,7 @@ function applyExcelStyles(worksheet, data, mergeKeys, summaryKeys, columns, head
394
506
  var currentColumn = columns && Array.isArray(columns) ? columns[c - 1] : undefined;
395
507
  var base = isSubtotal ? summaryStyle : normalStyle;
396
508
  var columnAlign = columns && Array.isArray(columns)
397
- ? (_b = columns[c - 1]) === null || _b === void 0 ? void 0 : _b.align
509
+ ? (_c = columns[c - 1]) === null || _c === void 0 ? void 0 : _c.align
398
510
  : undefined;
399
511
  var alignment = __assign({}, base.alignment);
400
512
  if (columnAlign === "left" ||
@@ -409,23 +521,23 @@ function applyExcelStyles(worksheet, data, mergeKeys, summaryKeys, columns, head
409
521
  }
410
522
  }
411
523
  // 数值列格式
412
- if (summaryKeys && summaryKeys.length > 0 && columns) {
524
+ if (numKeys && numKeys.length > 0 && columns) {
413
525
  for (var rowIndex = 0; rowIndex < data.length; rowIndex++) {
414
526
  var rowData = data[rowIndex];
415
- var _loop_2 = function (summaryKey) {
416
- var colIndex = columns.findIndex(function (col) { return col.dataIndex === summaryKey; });
527
+ var _loop_2 = function (numKey) {
528
+ var colIndex = columns.findIndex(function (col) { return col.dataIndex === numKey; });
417
529
  if (colIndex === -1)
418
530
  return "continue";
419
531
  var cell = worksheet.getCell(headerRowCount + rowIndex + 1, colIndex + 1);
420
- var cellValue = rowData[summaryKey];
532
+ var cellValue = rowData[numKey];
421
533
  if (typeof cellValue === "number" || !isNaN(Number(cellValue))) {
422
534
  cell.value = Number(cellValue);
423
535
  cell.numFmt = "#,##0.00";
424
536
  }
425
537
  };
426
- for (var _i = 0, summaryKeys_1 = summaryKeys; _i < summaryKeys_1.length; _i++) {
427
- var summaryKey = summaryKeys_1[_i];
428
- _loop_2(summaryKey);
538
+ for (var _i = 0, numKeys_1 = numKeys; _i < numKeys_1.length; _i++) {
539
+ var numKey = numKeys_1[_i];
540
+ _loop_2(numKey);
429
541
  }
430
542
  }
431
543
  }
@@ -433,16 +545,16 @@ function applyExcelStyles(worksheet, data, mergeKeys, summaryKeys, columns, head
433
545
  /**
434
546
  * 主要的导出函数,使用改进的批注功能
435
547
  */
436
- function exportToExcelWithMerge(records, columns, mergeKeys, summaryKeys, fileName, sheetName, columnHeaders, summaryConfig) {
548
+ function exportToExcelWithMerge(records, columns, mergeKeys, numKeys, fileName, sheetName, columnHeaders, summaryConfig, topDescription, topDescriptionRowHeight) {
437
549
  if (fileName === void 0) { fileName = "export.xlsx"; }
438
550
  if (sheetName === void 0) { sheetName = "Sheet1"; }
439
- return exportToExcelWithMergeAndComments(records, columns, mergeKeys, summaryKeys, fileName, sheetName, columnHeaders, summaryConfig);
551
+ return exportToExcelWithMergeAndComments(records, columns, mergeKeys, numKeys, fileName, sheetName, columnHeaders, summaryConfig, topDescription, topDescriptionRowHeight);
440
552
  }
441
553
  /**
442
554
  * 简化版本的导出函数
443
555
  */
444
556
  function exportToExcelSimple(records, config) {
445
- return exportToExcelWithMerge(records, config.columns || [], config.mergeKeys, config.summaryKeys || [], config.fileName || "export.xlsx", config.sheetName || "Sheet1", config.columnHeaders, config.summaryConfig);
557
+ return exportToExcelWithMerge(records, config.columns || [], config.mergeKeys, config.numKeys || [], config.fileName || "export.xlsx", config.sheetName || "Sheet1", config.columnHeaders, config.summaryConfig, config.topDescription, config.topDescriptionRowHeight);
446
558
  }
447
559
  /**
448
560
  * Hook 版本,支持选择导出方式
@@ -450,19 +562,24 @@ function exportToExcelSimple(records, config) {
450
562
  function useExcelExport(records, config) {
451
563
  var columns = config.columns, isAutoMerge = config.isAutoMerge, columnHeaders = config.columnHeaders, summaryConfig = config.summaryConfig;
452
564
  var mergeKeys = useMergeKeys(columns, isAutoMerge);
453
- var summaryKeys = useMemo(function () {
454
- return columns
455
- .filter(function (item) { return item.isSummary; })
456
- .map(function (item) { return item.dataIndex; });
457
- }, [columns]);
458
- var exportFunction = useMemoizedFn(function (fileName) {
565
+ var numKeys = useNumKeys(columns);
566
+ var exportFunction = useMemoizedFn(function (fileName, _a) {
567
+ var topDescription = _a.topDescription, topDescriptionRowHeight = _a.topDescriptionRowHeight, time = _a.time;
568
+ if (!fileName.includes(".xlsx")) {
569
+ fileName = fileName + ".xlsx";
570
+ }
571
+ if (time) {
572
+ fileName = dayjs(time).format("YYYYMMDD") + "-" + fileName;
573
+ }
459
574
  exportToExcelSimple(records, {
460
575
  columns: columns,
461
576
  mergeKeys: mergeKeys,
462
- summaryKeys: summaryKeys,
577
+ numKeys: numKeys,
463
578
  fileName: fileName,
464
579
  columnHeaders: columnHeaders,
465
580
  summaryConfig: summaryConfig,
581
+ topDescription: topDescription,
582
+ topDescriptionRowHeight: topDescriptionRowHeight,
466
583
  });
467
584
  });
468
585
  return exportFunction;
@@ -385,6 +385,15 @@ var useMergeKeys = function (columns, isAutoMerge) {
385
385
  }, [isAutoMerge, columns]);
386
386
  return mergeKeys;
387
387
  };
388
+ var useNumKeys = function (columns) {
389
+ var numKeys = useMemo(function () {
390
+ var leafColumns = getLeafColumns(columns);
391
+ return Array.from(new Set(leafColumns
392
+ .filter(function (item) { return item.precision !== undefined; })
393
+ .map(function (item) { return item.key; })));
394
+ }, [columns]);
395
+ return numKeys;
396
+ };
388
397
  /**
389
398
  * 自动合并的一些处理
390
399
  */
@@ -510,4 +519,4 @@ function useMergeAddAndDel(_a) {
510
519
  return [newRowSelection, newAddAndDelProps];
511
520
  }
512
521
 
513
- export { useAddAndDelChange, useAutoMerge, useCalcScrollY, useCustomSort, useEditChange, useMergeAddAndDel, useMergeKeys, useMoveRowChange, useScuRfresh };
522
+ export { useAddAndDelChange, useAutoMerge, useCalcScrollY, useCustomSort, useEditChange, useMergeAddAndDel, useMergeKeys, useMoveRowChange, useNumKeys, useScuRfresh };
@@ -237,7 +237,14 @@ interface IColumnType<RecordType> extends Omit<ColumnType<RecordType>, "render">
237
237
  * 表头背景色
238
238
  */
239
239
  headerBgColor?: string;
240
+ /**
241
+ * 表头字体颜色
242
+ */
243
+ headerFontColor?: string;
240
244
  };
245
+ dateFormat?: string;
246
+ precision?: number;
247
+ thousand?: boolean;
241
248
  }
242
249
  interface IRenderOptions {
243
250
  insertTableFromClipboard: IFuncInsertTableFromClipboard;
@@ -296,7 +303,11 @@ interface ITableRefHandel {
296
303
  /**
297
304
  * 导出excel
298
305
  */
299
- exportExcel?: (fileName: string) => void;
306
+ exportExcel?: (fileName: string, config?: {
307
+ topDescription?: string;
308
+ time?: string;
309
+ topDescriptionRowHeight?: number;
310
+ }) => void;
300
311
  }
301
312
  interface ITableProps<RecordType> extends Omit<TableProps<RecordType>, "columns"> {
302
313
  /**
@@ -317,6 +328,10 @@ interface ITableProps<RecordType> extends Omit<TableProps<RecordType>, "columns"
317
328
  * 就按数字往上递增的规则就行 1 2 3 4 5这种
318
329
  */
319
330
  dynamicVersion?: number;
331
+ /**
332
+ * 自定义动态列配置后的回调
333
+ */
334
+ customDynamicListHandle?: (dynamicList: any) => void;
320
335
  /**
321
336
  * 增加了column的表头过滤功能;如果想要过滤功能持久化,可以配置这个属性
322
337
  * 同时也需要配置dynamicKey配置。
@@ -41,7 +41,7 @@ import { DndProvider } from '../node_modules/react-dnd/dist/core/DndProvider.js'
41
41
  // completed: 实现从execl复制到表格中的功能
42
42
  var Table = function (props) {
43
43
  // console.log("表格渲染");
44
- var className = props.className, _a = props.bordered, bordered = _a === void 0 ? true : _a, _b = props.pagination, pagination = _b === void 0 ? false : _b, isFlex = props.isFlex; props.tablePreferences; var dynamicKey = props.dynamicKey, dynamicVersion = props.dynamicVersion, isRemeberFilter = props.isRemeberFilter, _c = props.isOrderUpdateData, isOrderUpdateData = _c === void 0 ? true : _c, hiddenDynamicIcon = props.hiddenDynamicIcon, _columns = props.columns, dataSource = props.dataSource, onTableChange = props.onTableChange, isEdit = props.isEdit, isMove = props.isMove, isAdd = props.isAdd, hiddenAddBtnHandle = props.hiddenAddBtnHandle, _d = props.isTheadTitleAdd, isTheadTitleAdd = _d === void 0 ? true : _d, addMode = props.addMode, addCallback = props.addCallback, isDel = props.isDel, delPopTitle = props.delPopTitle, hiddenDelBtnHandle = props.hiddenDelBtnHandle, _e = props.isDelAll, isDelAll = _e === void 0 ? true : _e, isAddAndDelAuto = props.isAddAndDelAuto, summaryConfig = props.summaryConfig, _f = props.summaryFixed, summaryFixed = _f === void 0 ? true : _f, isInnerPagination = props.isInnerPagination, _g = props.innerPaginationPageSize, innerPaginationPageSize = _g === void 0 ? 30 : _g, _h = props.innerPaginationPosition, innerPaginationPosition = _h === void 0 ? INNER_TABLE_PAGINATION_POSITION : _h, _j = props.innerPaginationPageSizeOptions, innerPaginationPageSizeOptions = _j === void 0 ? INNER_TABLE_PAGINATION_PAGESIZEOPTIONS : _j, innerPaginationConfig = props.innerPaginationConfig, tableRefHandle = props.tableRefHandle, tableName = props.tableName, serviceOrder = props.serviceOrder, differences = props.differences, virtualKey = props.virtualKey, _k = props.isResizableColumn, isResizableColumn = _k === void 0 ? true : _k, _l = props.isResizableTitleEllipsis, isResizableTitleEllipsis = _l === void 0 ? true : _l, _m = props.isRealTimeValidate, isRealTimeValidate = _m === void 0 ? true : _m, isMarginTop = props.isMarginTop, isMarginBottom = props.isMarginBottom, scroll = props.scroll, addAndDelProps = props.addAndDelProps, _o = props.autoScrollYMarginBottom, autoScrollYMarginBottom = _o === void 0 ? 65 : _o, _p = props.isAutoScrollY, isAutoScrollY = _p === void 0 ? false : _p, tableId = props.tableId, extraOnRow = props.onRow, fixedRowsCount = props.fixedRowsCount, fixedRowsConfig = props.fixedRowsConfig, headerAlign = props.headerAlign, isDimensionDynamic = props.isDimensionDynamic, isAutoMerge = props.isAutoMerge, mode = props.mode, rowSelection = props.rowSelection, isContextMenu = props.isContextMenu, isFullscreenHandle = props.isFullscreenHandle, resetProps = __rest(props, ["className", "bordered", "pagination", "isFlex", "tablePreferences", "dynamicKey", "dynamicVersion", "isRemeberFilter", "isOrderUpdateData", "hiddenDynamicIcon", "columns", "dataSource", "onTableChange", "isEdit", "isMove", "isAdd", "hiddenAddBtnHandle", "isTheadTitleAdd", "addMode", "addCallback", "isDel", "delPopTitle", "hiddenDelBtnHandle", "isDelAll", "isAddAndDelAuto", "summaryConfig", "summaryFixed", "isInnerPagination", "innerPaginationPageSize", "innerPaginationPosition", "innerPaginationPageSizeOptions", "innerPaginationConfig", "tableRefHandle", "tableName", "serviceOrder", "differences", "virtualKey", "isResizableColumn", "isResizableTitleEllipsis", "isRealTimeValidate", "isMarginTop", "isMarginBottom", "scroll", "addAndDelProps", "autoScrollYMarginBottom", "isAutoScrollY", "tableId", "onRow", "fixedRowsCount", "fixedRowsConfig", "headerAlign", "isDimensionDynamic", "isAutoMerge", "mode", "rowSelection", "isContextMenu", "isFullscreenHandle"]);
44
+ var className = props.className, _a = props.bordered, bordered = _a === void 0 ? true : _a, _b = props.pagination, pagination = _b === void 0 ? false : _b, isFlex = props.isFlex; props.tablePreferences; var dynamicKey = props.dynamicKey, dynamicVersion = props.dynamicVersion, customDynamicListHandle = props.customDynamicListHandle, isRemeberFilter = props.isRemeberFilter, _c = props.isOrderUpdateData, isOrderUpdateData = _c === void 0 ? true : _c, hiddenDynamicIcon = props.hiddenDynamicIcon, _columns = props.columns, dataSource = props.dataSource, onTableChange = props.onTableChange, isEdit = props.isEdit, isMove = props.isMove, isAdd = props.isAdd, hiddenAddBtnHandle = props.hiddenAddBtnHandle, _d = props.isTheadTitleAdd, isTheadTitleAdd = _d === void 0 ? true : _d, addMode = props.addMode, addCallback = props.addCallback, isDel = props.isDel, delPopTitle = props.delPopTitle, hiddenDelBtnHandle = props.hiddenDelBtnHandle, _e = props.isDelAll, isDelAll = _e === void 0 ? true : _e, isAddAndDelAuto = props.isAddAndDelAuto, summaryConfig = props.summaryConfig, _f = props.summaryFixed, summaryFixed = _f === void 0 ? true : _f, isInnerPagination = props.isInnerPagination, _g = props.innerPaginationPageSize, innerPaginationPageSize = _g === void 0 ? 30 : _g, _h = props.innerPaginationPosition, innerPaginationPosition = _h === void 0 ? INNER_TABLE_PAGINATION_POSITION : _h, _j = props.innerPaginationPageSizeOptions, innerPaginationPageSizeOptions = _j === void 0 ? INNER_TABLE_PAGINATION_PAGESIZEOPTIONS : _j, innerPaginationConfig = props.innerPaginationConfig, tableRefHandle = props.tableRefHandle, tableName = props.tableName, serviceOrder = props.serviceOrder, differences = props.differences, virtualKey = props.virtualKey, _k = props.isResizableColumn, isResizableColumn = _k === void 0 ? true : _k, _l = props.isResizableTitleEllipsis, isResizableTitleEllipsis = _l === void 0 ? true : _l, _m = props.isRealTimeValidate, isRealTimeValidate = _m === void 0 ? true : _m, isMarginTop = props.isMarginTop, isMarginBottom = props.isMarginBottom, scroll = props.scroll, addAndDelProps = props.addAndDelProps, _o = props.autoScrollYMarginBottom, autoScrollYMarginBottom = _o === void 0 ? 65 : _o, _p = props.isAutoScrollY, isAutoScrollY = _p === void 0 ? false : _p, tableId = props.tableId, extraOnRow = props.onRow, fixedRowsCount = props.fixedRowsCount, fixedRowsConfig = props.fixedRowsConfig, headerAlign = props.headerAlign, isDimensionDynamic = props.isDimensionDynamic, isAutoMerge = props.isAutoMerge, mode = props.mode, rowSelection = props.rowSelection, isContextMenu = props.isContextMenu, isFullscreenHandle = props.isFullscreenHandle, resetProps = __rest(props, ["className", "bordered", "pagination", "isFlex", "tablePreferences", "dynamicKey", "dynamicVersion", "customDynamicListHandle", "isRemeberFilter", "isOrderUpdateData", "hiddenDynamicIcon", "columns", "dataSource", "onTableChange", "isEdit", "isMove", "isAdd", "hiddenAddBtnHandle", "isTheadTitleAdd", "addMode", "addCallback", "isDel", "delPopTitle", "hiddenDelBtnHandle", "isDelAll", "isAddAndDelAuto", "summaryConfig", "summaryFixed", "isInnerPagination", "innerPaginationPageSize", "innerPaginationPosition", "innerPaginationPageSizeOptions", "innerPaginationConfig", "tableRefHandle", "tableName", "serviceOrder", "differences", "virtualKey", "isResizableColumn", "isResizableTitleEllipsis", "isRealTimeValidate", "isMarginTop", "isMarginBottom", "scroll", "addAndDelProps", "autoScrollYMarginBottom", "isAutoScrollY", "tableId", "onRow", "fixedRowsCount", "fixedRowsConfig", "headerAlign", "isDimensionDynamic", "isAutoMerge", "mode", "rowSelection", "isContextMenu", "isFullscreenHandle"]);
45
45
  var classes = classNames("ztxk-table", className, {
46
46
  "ztxk-table--flex": isFlex,
47
47
  });
@@ -58,7 +58,11 @@ var Table = function (props) {
58
58
  // 比如过滤某些列 不做展示
59
59
  var columns = useParseColumns(_columns);
60
60
  // 得到动态列配置信息
61
- var _r = useDynamicListByColumns(columns, { dynamicKey: dynamicKey, dynamicVersion: dynamicVersion }), defaultDynamicList = _r.defaultDynamicList, onCurrentListChange = _r.onCurrentListChange, currentDynamicList = _r.currentDynamicList, dynamicSettingRef = _r.dynamicSettingRef;
61
+ var _r = useDynamicListByColumns(columns, {
62
+ dynamicKey: dynamicKey,
63
+ dynamicVersion: dynamicVersion,
64
+ customDynamicListHandle: customDynamicListHandle,
65
+ }), defaultDynamicList = _r.defaultDynamicList, onCurrentListChange = _r.onCurrentListChange, currentDynamicList = _r.currentDynamicList, dynamicSettingRef = _r.dynamicSettingRef;
62
66
  // 因为内部分页需要知晓当前页面的数据展示,要不然数据排序就跟内部分页没关系了
63
67
  // 自定义排序方法
64
68
  var _s = useCustomSort(dataSource, onTableChange, {
@@ -15,6 +15,8 @@ import FilterDropdown, { createFilterValue, filterHandle } from './components/Fi
15
15
  import Badge from './components/Badge.js';
16
16
  import { PLACEHOLDER_NULL } from '../config/constant.js';
17
17
  import { useMergeAddAndDel } from './hooks.js';
18
+ import dayjs from 'dayjs';
19
+ import { exactRound, addThousedSeparator } from 'zmdms-utils';
18
20
  import SearchOutlined from '../node_modules/@ant-design/icons/es/icons/SearchOutlined.js';
19
21
  import ModalComponent from '../modal/modal.js';
20
22
 
@@ -317,7 +319,15 @@ function useColumns(columns, options) {
317
319
  if (typeof text === "object") {
318
320
  return PLACEHOLDER_NULL;
319
321
  }
320
- return text == null || text === "" ? PLACEHOLDER_NULL : text;
322
+ if (text == null || text === "")
323
+ return PLACEHOLDER_NULL;
324
+ if (_column.dateFormat)
325
+ return dayjs(text).format(_column.dateFormat);
326
+ if (_column.precision)
327
+ text = exactRound(text, _column.precision);
328
+ if (_column.thousand)
329
+ text = addThousedSeparator(text);
330
+ return text;
321
331
  };
322
332
  }
323
333
  if (_column.render) {
@@ -1,7 +1,8 @@
1
- import { useRef, useMemo, useState, useEffect, useCallback } from 'react';
1
+ import { useRef, useMemo, useState, useEffect } from 'react';
2
2
  import { getCurrentDynamicItems, getDynamicVersionByKey, setDynamicVersionByKey } from '../dynamicsetting/useDynamic.js';
3
3
  import { TABLE_DYNAMIC_KEY } from './constant.js';
4
4
  import isEqual from 'lodash/isEqual';
5
+ import { useMemoizedFn } from 'ahooks';
5
6
 
6
7
  // 处理列信息
7
8
  function parseColumn(column, index, indexs) {
@@ -66,7 +67,7 @@ function getDynamicList(dynamicKey, columns) {
66
67
  return result;
67
68
  }
68
69
  function useDynamicListByColumns(columns, options) {
69
- var dynamicKey = options.dynamicKey, dynamicVersion = options.dynamicVersion;
70
+ var dynamicKey = options.dynamicKey, dynamicVersion = options.dynamicVersion, customDynamicListHandle = options.customDynamicListHandle;
70
71
  // 动态列配置手动刷新基础配置
71
72
  var dynamicSettingRef = useRef(null);
72
73
  // 初始化list
@@ -116,10 +117,11 @@ function useDynamicListByColumns(columns, options) {
116
117
  setDynamicVersionByKey(TABLE_DYNAMIC_KEY, dynamicKey, dynamicVersion);
117
118
  }
118
119
  }, [dynamicKey, dynamicVersion]);
119
- var onCurrentListChange = useCallback(function (newDynamicList) {
120
+ var onCurrentListChange = useMemoizedFn(function (newDynamicList) {
120
121
  // console.log(newDynamicList);
121
122
  setCurrentDynamicList(newDynamicList);
122
- }, []);
123
+ customDynamicListHandle === null || customDynamicListHandle === void 0 ? void 0 : customDynamicListHandle(newDynamicList);
124
+ });
123
125
  return {
124
126
  defaultDynamicList: defaultDynamicList,
125
127
  currentDynamicList: currentDynamicList,
@@ -2,7 +2,7 @@ import { __spreadArray, __assign, __awaiter, __generator } from '../_virtual/_ts
2
2
  import { filterHandle } from './components/FilterDropdown.js';
3
3
  import { MERGE_ROW_SPANS, MERGE_KEY, MERGE_INDEX, IS_SUMMARY } from './constant.js';
4
4
  import { plus } from 'zmdms-utils';
5
- import { message } from 'antd';
5
+ import myMessage from '../message/index.js';
6
6
 
7
7
  // 递归处理columns
8
8
  function recursionColumns(columns, currentDynamicList, newColumns, columnsIndexs) {
@@ -138,7 +138,7 @@ function copyColData(key, options) {
138
138
  try {
139
139
  if ((navigator === null || navigator === void 0 ? void 0 : navigator.clipboard) && window.isSecureContext) {
140
140
  (_b = (_a = navigator.clipboard) === null || _a === void 0 ? void 0 : _a.writeText(str)) === null || _b === void 0 ? void 0 : _b.then(function () {
141
- message.success("复制成功!");
141
+ myMessage.success("复制成功!");
142
142
  });
143
143
  }
144
144
  else {
@@ -147,17 +147,17 @@ function copyColData(key, options) {
147
147
  document.body.appendChild(textarea);
148
148
  textarea.select();
149
149
  if (document.execCommand) {
150
- message.success("复制成功!");
150
+ myMessage.success("复制成功!");
151
151
  document.execCommand("copy");
152
152
  }
153
153
  else {
154
- message.info("\u590D\u5236\u5931\u8D25\uFF01\u8BF7\u624B\u5DE5\u590D\u5236\n ".concat(str));
154
+ myMessage.info("\u590D\u5236\u5931\u8D25\uFF01\u8BF7\u624B\u5DE5\u590D\u5236\n ".concat(str));
155
155
  }
156
156
  document.body.removeChild(textarea);
157
157
  }
158
158
  }
159
159
  catch (err) {
160
- message.info("\u590D\u5236\u5931\u8D25\uFF01\u8BF7\u624B\u5DE5\u590D\u5236\n ".concat(str));
160
+ myMessage.info("\u590D\u5236\u5931\u8D25\uFF01\u8BF7\u624B\u5DE5\u590D\u5236\n ".concat(str));
161
161
  }
162
162
  }
163
163
  }
@@ -4,7 +4,7 @@ import { flushSync } from 'react-dom';
4
4
  import { getFileExtension, isImageExtension, createDownloadLink, createUploadFileLink, TOKEN_KEY, getToken, exactRound, times, divide } from 'zmdms-utils';
5
5
  import MemoUploadList from './uploadList.js';
6
6
  import { useLatest } from 'ahooks';
7
- import { message } from 'antd';
7
+ import myMessage from '../message/index.js';
8
8
 
9
9
  // 默认限制的文件类型
10
10
  var NO_ACCEPT = ["exe"];
@@ -27,16 +27,16 @@ function useBeforeUpload(props) {
27
27
  }
28
28
  if (disAllowDuplicateFile &&
29
29
  ((_b = (_a = fileListRef.current) === null || _a === void 0 ? void 0 : _a.find) === null || _b === void 0 ? void 0 : _b.call(_a, function (item) { return item.name === fileName || item.attachName === fileName; }))) {
30
- message.warning("不能上传同名附件!");
30
+ myMessage.warning("不能上传同名附件!");
31
31
  return MemoUploadList.LIST_IGNORE;
32
32
  }
33
33
  // 文件大小
34
34
  if (fileSize === 0) {
35
- message.warning("不能上传空文件!");
35
+ myMessage.warning("不能上传空文件!");
36
36
  return MemoUploadList.LIST_IGNORE;
37
37
  }
38
38
  if (isImage && !isImageExtension(fileExtension)) {
39
- message.warning("不能上传非图片格式的文件!");
39
+ myMessage.warning("不能上传非图片格式的文件!");
40
40
  return MemoUploadList.LIST_IGNORE;
41
41
  }
42
42
  // 获取支持的附件类型
@@ -44,16 +44,16 @@ function useBeforeUpload(props) {
44
44
  ACCEPT = ACCEPT.map(function (a) { return a.toLowerCase(); });
45
45
  // 默认支持任何格式的文件,但是不支持exe
46
46
  if (ACCEPT.length > 0 && !ACCEPT.includes(fileExtension)) {
47
- message.warning("\u4E0D\u652F\u6301 ".concat(fileExtension, " \u6587\u4EF6\u683C\u5F0F"));
47
+ myMessage.warning("\u4E0D\u652F\u6301 ".concat(fileExtension, " \u6587\u4EF6\u683C\u5F0F"));
48
48
  return MemoUploadList.LIST_IGNORE;
49
49
  }
50
50
  if (ACCEPT.length === 0 && NO_ACCEPT.includes(fileExtension)) {
51
- message.warning("\u4E0D\u652F\u6301 ".concat(fileExtension, " \u6587\u4EF6\u683C\u5F0F"));
51
+ myMessage.warning("\u4E0D\u652F\u6301 ".concat(fileExtension, " \u6587\u4EF6\u683C\u5F0F"));
52
52
  return MemoUploadList.LIST_IGNORE;
53
53
  }
54
54
  // 文件大小限制
55
55
  if (maxSize && fileSize > maxSize) {
56
- message.warning("\u6587\u4EF6\u8D85\u51FA ".concat(maxSizeStr, "\uFF01"));
56
+ myMessage.warning("\u6587\u4EF6\u8D85\u51FA ".concat(maxSizeStr, "\uFF01"));
57
57
  return MemoUploadList.LIST_IGNORE;
58
58
  }
59
59
  return Promise.resolve(file);
@@ -343,7 +343,7 @@ function uploadFile(props) {
343
343
  if (xhr.status === 200) {
344
344
  var response = JSON.parse(xhr.responseText);
345
345
  if (!response) {
346
- message.warning("文件上传失败!");
346
+ myMessage.warning("文件上传失败!");
347
347
  }
348
348
  var code = response.code, data_1 = response.data, msg = response.msg;
349
349
  if (code === 200) {
@@ -351,7 +351,7 @@ function uploadFile(props) {
351
351
  }
352
352
  else {
353
353
  reject();
354
- message.warning(msg || "文件上传失败!");
354
+ myMessage.warning(msg || "文件上传失败!");
355
355
  }
356
356
  }
357
357
  else {
@@ -360,7 +360,7 @@ function uploadFile(props) {
360
360
  ? JSON.parse(xhr.response)
361
361
  : { msg: "文件上传失败,请检查网络!" };
362
362
  reject();
363
- message.warning(result.msg || "文件上传失败!");
363
+ myMessage.warning(result.msg || "文件上传失败!");
364
364
  }
365
365
  catch (err) {
366
366
  reject();