aldehyde 0.2.229 → 0.2.231

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 (52) hide show
  1. package/lib/controls/entity-select/popover-entity-select.d.ts.map +1 -1
  2. package/lib/controls/entity-select/popover-entity-select.js +12 -11
  3. package/lib/controls/entity-select/popover-entity-select.js.map +1 -1
  4. package/lib/controls/entry-control.d.ts.map +1 -1
  5. package/lib/controls/entry-control.js +8 -0
  6. package/lib/controls/entry-control.js.map +1 -1
  7. package/lib/controls/tree-select/tree-entity-select.d.ts +12 -0
  8. package/lib/controls/tree-select/tree-entity-select.d.ts.map +1 -0
  9. package/lib/controls/tree-select/tree-entity-select.js +86 -0
  10. package/lib/controls/tree-select/tree-entity-select.js.map +1 -0
  11. package/lib/module/dtmpl-edit-page.d.ts +1 -0
  12. package/lib/module/dtmpl-edit-page.d.ts.map +1 -1
  13. package/lib/module/dtmpl-edit-page.js.map +1 -1
  14. package/lib/table/act-table.d.ts.map +1 -1
  15. package/lib/table/act-table.js +37 -24
  16. package/lib/table/act-table.js.map +1 -1
  17. package/lib/table/column/summary-builder.d.ts +39 -0
  18. package/lib/table/column/summary-builder.d.ts.map +1 -0
  19. package/lib/table/column/summary-builder.js +508 -0
  20. package/lib/table/column/summary-builder.js.map +1 -0
  21. package/lib/table/query-table.d.ts +0 -20
  22. package/lib/table/query-table.d.ts.map +1 -1
  23. package/lib/table/query-table.js +14 -598
  24. package/lib/table/query-table.js.map +1 -1
  25. package/lib/tmpl/control-type-supportor.d.ts.map +1 -1
  26. package/lib/tmpl/control-type-supportor.js +6 -1
  27. package/lib/tmpl/control-type-supportor.js.map +1 -1
  28. package/lib/tmpl/interface.d.ts +0 -6
  29. package/lib/tmpl/interface.d.ts.map +1 -1
  30. package/lib/tmpl/interface.js.map +1 -1
  31. package/lib/tree/tmpl-tree.d.ts +9 -4
  32. package/lib/tree/tmpl-tree.d.ts.map +1 -1
  33. package/lib/tree/tmpl-tree.js +70 -94
  34. package/lib/tree/tmpl-tree.js.map +1 -1
  35. package/lib/tree/tree-node.js +1 -1
  36. package/lib/tree/tree-utils.d.ts +19 -0
  37. package/lib/tree/tree-utils.d.ts.map +1 -1
  38. package/lib/tree/tree-utils.js +128 -0
  39. package/lib/tree/tree-utils.js.map +1 -1
  40. package/package.json +1 -1
  41. package/src/aldehyde/controls/entity-select/popover-entity-select.tsx +9 -12
  42. package/src/aldehyde/controls/entry-control.tsx +20 -0
  43. package/src/aldehyde/controls/tree-select/tree-entity-select.tsx +113 -0
  44. package/src/aldehyde/module/dtmpl-edit-page.tsx +1 -0
  45. package/src/aldehyde/table/act-table.tsx +102 -84
  46. package/src/aldehyde/table/column/summary-builder.tsx +713 -0
  47. package/src/aldehyde/table/query-table.tsx +15 -835
  48. package/src/aldehyde/tmpl/control-type-supportor.tsx +8 -1
  49. package/src/aldehyde/tmpl/interface.tsx +0 -2
  50. package/src/aldehyde/tree/tmpl-tree.tsx +72 -89
  51. package/src/aldehyde/tree/tree-node.tsx +1 -1
  52. package/src/aldehyde/tree/tree-utils.tsx +138 -0
@@ -0,0 +1,713 @@
1
+ import {BigNumber} from "bignumber.js";
2
+ import Table from "../control-table-x-axis-wrapper";
3
+ import React from "react";
4
+ import "../index.css";
5
+ interface SummaryColProps {
6
+ columns: any[];
7
+ translate: (...strs: string[]) => string;
8
+ summaryConfigs:{
9
+ title?:string,
10
+ id: string;
11
+ aggFunc: "sum" | "avg" | "groupIsum" | "groupIavg";
12
+ }[];
13
+ pageData:any,
14
+ rowSelection,groupIColumns
15
+ }
16
+
17
+ export default {
18
+ summary(summaryColProps:SummaryColProps) {
19
+ const {translate,summaryConfigs,pageData,columns,
20
+ rowSelection,groupIColumns}=summaryColProps;
21
+ if (
22
+ !summaryConfigs ||
23
+ summaryConfigs?.length === 0 ||
24
+ pageData.length === 0
25
+ )
26
+ return <></>;
27
+ // const isProSumarryTable = Boolean(subtotalXColumn);
28
+ // const columns = isProSumarryTable
29
+ // ? proSummaryTableColumns
30
+ // : columns_;
31
+ //const columns= columns_;
32
+ const sumConfigs: {
33
+ sum: { value: string; id: string; columnConfig?: any }[];
34
+ avg: { value: string; id: string; columnConfig?: any }[];
35
+ } = { sum: [], avg: [] };
36
+
37
+ if (rowSelection) {
38
+ sumConfigs["avg"].push({
39
+ value: "",
40
+ id: "",
41
+ columnConfig: { align: "center" },
42
+ });
43
+ sumConfigs["sum"].push({
44
+ value: "",
45
+ id: "",
46
+ columnConfig: { align: "center" },
47
+ });
48
+ }
49
+
50
+ sumConfigs["sum"].push({
51
+ value: translate("${合计}"),
52
+ id: "title",
53
+ columnConfig: { align: "center" },
54
+ });
55
+ sumConfigs["avg"].push({
56
+ value: translate("${均值}"),
57
+ id: "title",
58
+ columnConfig: { align: "center" },
59
+ });
60
+
61
+ let sumLen = 0,
62
+ avgLen = 0;
63
+
64
+ for (let i = 0; i < columns.length; i++) {
65
+ const idx = i,
66
+ dataIndex = columns[i].dataIndex;
67
+ if (idx === 0) continue;
68
+ const sum = { value: "", id: "", columnConfig: columns[i] };
69
+ const sumConfigIdx = summaryConfigs.findIndex(
70
+ ({ id ,title}) => id === dataIndex || title===dataIndex
71
+ );
72
+
73
+ if (sumConfigIdx === -1) {
74
+ sumConfigs["sum"].push(sum);
75
+ sumConfigs["avg"].push(sum);
76
+ continue;
77
+ }
78
+ const argFun = summaryConfigs[sumConfigIdx].aggFunc;
79
+ if (argFun === "sum")
80
+ sum.value = pageData
81
+ .reduce(
82
+ (lastNum, item) =>
83
+
84
+ lastNum.plus(
85
+ new BigNumber(
86
+ this.getTableSummaryNumberValue(item[dataIndex])
87
+ )
88
+ ),
89
+ new BigNumber(0)
90
+ )
91
+ ?.toString();
92
+ if (argFun === "avg")
93
+ sum.value = pageData
94
+ .reduce(
95
+ (lastNum, item) =>
96
+ lastNum.plus(
97
+ new BigNumber(
98
+ this.getTableSummaryNumberValue(item[dataIndex])
99
+ ).div(pageData.length)
100
+ ),
101
+ new BigNumber(0)
102
+ )
103
+ ?.toString();
104
+
105
+ const hash = (...args) => args.join("-");
106
+ const hashKey = (data, keys) =>
107
+ hash(...keys.map((key) => data[key]));
108
+
109
+ if (argFun === "groupIsum") {
110
+ const allKeys = groupIColumns?.map(({ id }) => id);
111
+ const set = new Set();
112
+
113
+ sum.value = pageData
114
+ .reduce((lastNum, item) => {
115
+ if (set.has(hashKey(item, allKeys))) return lastNum;
116
+ set.add(hashKey(item, allKeys));
117
+ return lastNum.plus(
118
+ new BigNumber(
119
+ this.getTableSummaryNumberValue(item[dataIndex])
120
+ )
121
+ );
122
+ }, new BigNumber(0))
123
+ ?.toString();
124
+ }
125
+
126
+ if (argFun === "groupIavg") {
127
+ const set = new Set();
128
+ let nums = 0;
129
+ const allKeys = groupIColumns?.map(({ id }) => id);
130
+
131
+ pageData.forEach((item) => {
132
+ if (set.has(hashKey(item, allKeys))) return;
133
+ set.add(hashKey(item, allKeys));
134
+
135
+ nums++;
136
+ });
137
+
138
+ set.clear();
139
+
140
+ sum.value = pageData
141
+ .reduce((lastNum, item) => {
142
+ if (set.has(hashKey(item, allKeys))) return lastNum;
143
+ set.add(hashKey(item, allKeys));
144
+ return lastNum.plus(
145
+ new BigNumber(
146
+ this.getTableSummaryNumberValue(item[dataIndex])
147
+ ).div(nums)
148
+ );
149
+ }, new BigNumber(0))
150
+ ?.toString();
151
+ }
152
+
153
+ sum.id = dataIndex;
154
+ if (argFun === "avg" || argFun === "groupIavg") {
155
+ sumConfigs["avg"].push(sum);
156
+ avgLen++;
157
+ } else sumConfigs["avg"].push({ value: "", id: "" });
158
+
159
+ if (argFun === "sum" || argFun === "groupIsum") {
160
+ sumConfigs["sum"].push(sum);
161
+ sumLen++;
162
+ } else sumConfigs["sum"].push({ value: "", id: "" });
163
+ }
164
+
165
+ console.log("sumConfigs", sumConfigs, sumLen, avgLen);
166
+
167
+ return (
168
+ <>
169
+ {sumLen === 0 ? (
170
+ <></>
171
+ ) : (
172
+ <Table.Summary.Row>
173
+ {sumConfigs["sum"].map(
174
+ ({ id, value, columnConfig }, idx) => (
175
+ <Table.Summary.Cell
176
+ align={columnConfig?.align}
177
+ index={idx}
178
+ className="heji"
179
+ >
180
+ {value}
181
+ </Table.Summary.Cell>
182
+ )
183
+ )}
184
+ </Table.Summary.Row>
185
+ )}
186
+ {avgLen === 0 ? (
187
+ <></>
188
+ ) : (
189
+ <Table.Summary.Row>
190
+ {sumConfigs["avg"].map(
191
+ ({ id, value, columnConfig }, idx) => (
192
+ <Table.Summary.Cell
193
+ align={columnConfig?.align}
194
+ index={idx}
195
+ className="heji"
196
+ >
197
+ {value}
198
+ </Table.Summary.Cell>
199
+ )
200
+ )}
201
+ </Table.Summary.Row>
202
+ )}
203
+ </>
204
+ );
205
+ },
206
+
207
+ handleProSummaryTable(props: any) {
208
+ const {subtotalXColumn,columns: _columns,data,translate,groupIColumns}=props
209
+ const isProSumarryTable = Boolean(
210
+ subtotalXColumn
211
+ );
212
+ if (!isProSumarryTable)
213
+ return { proSummaryTableColumns: [], proSummaryTableData: [] };
214
+ const columns = _columns;
215
+
216
+ for (const column of columns) {
217
+ delete column["sorter"];
218
+ }
219
+
220
+ for (const d of data) {
221
+ for (const [k, v] of Object.entries(d)) {
222
+ if (v == null || v == "null") {
223
+ d[k] = "";
224
+ } else if (typeof v === "string" && (v as string)?.includes("@R@")) {
225
+ d[k] = (v as string).split("@R@")[1];
226
+ }
227
+ }
228
+ }
229
+
230
+ console.log("data", data);
231
+ console.log("columns", columns);
232
+
233
+ const colMp = {
234
+ dimension: [],
235
+ fact: [],
236
+ others: [
237
+ {
238
+ dataIndex: "orderInGroup",
239
+ title: "orderInGroup",
240
+ },
241
+ ],
242
+ };
243
+ const colIdToNameMp = {};
244
+ const colNameToIdMp = {};
245
+ for (const col of columns) {
246
+ colIdToNameMp[col["dataIndex"]] = col["title"];
247
+ colNameToIdMp[col["title"]] = col["dataIndex"];
248
+ if (col.statColType !== undefined) {
249
+ colMp[col.statColType].push(this.deepClone(col));
250
+ } else {
251
+ if (col.title !== "序号") colMp["others"].push(this.deepClone(col));
252
+ }
253
+ }
254
+ console.log("colIdToNameMp", colIdToNameMp);
255
+ console.log("colNameToIdMp", colNameToIdMp);
256
+ console.log("colMp", colMp);
257
+
258
+ // canReadData
259
+ const canReadData = [];
260
+ let order = 0;
261
+ for (const d of data) {
262
+ const item = {};
263
+ for (const [k, v] of Object.entries(d)) {
264
+ let _v = v;
265
+ if (
266
+ colMp.fact.findIndex(({ dataIndex }) => dataIndex === k) > -1 &&
267
+ v === null
268
+ )
269
+ _v = 0;
270
+ item[colIdToNameMp[k]] = _v;
271
+ }
272
+ canReadData.push({ ...item, orderInGroup: order++ });
273
+ }
274
+ console.log("canReadData", canReadData);
275
+
276
+ let proSummaryTableColumns = [
277
+ ...this.deepClone(colMp.dimension),
278
+ ...this.deepClone(colMp.others),
279
+ ],
280
+ proSummaryTableData = [],
281
+ excludeGroupSumData = [];
282
+ const cal = colMp.fact[0]?.cal;
283
+ const calTxt = cal === "sum" ? translate("${小计}") : translate("${均值}");
284
+ const calMp = {};
285
+ colMp.fact.forEach(({ title, cal }) => (calMp[title] = cal));
286
+
287
+ // 计算列
288
+ proSummaryTableColumns.push(...colMp.fact);
289
+
290
+ // buildData
291
+ this.buildColTag(proSummaryTableColumns);
292
+
293
+ // 处理行
294
+ const rowMp = {};
295
+ const rowKey = [];
296
+ for (const col of proSummaryTableColumns) {
297
+ if (Array.isArray(col.keys) && col.keys.length === 1) rowKey.push(col);
298
+ }
299
+ console.log("rowKey", rowKey);
300
+
301
+ for (const d of canReadData) {
302
+ let t: any = rowMp;
303
+ for (let i = 0; i < rowKey.length; i++) {
304
+ const key = rowKey[i].title;
305
+ if (t[d[key]] === undefined) {
306
+ if (i !== rowKey.length - 1) t[d[key]] = {};
307
+ else t[d[key]] = [];
308
+ }
309
+ t = t[d[key]];
310
+ }
311
+ if (Array.isArray(t)) t.push(d);
312
+ }
313
+
314
+ // 行数据处理完毕
315
+ console.log("rowMp", rowMp);
316
+
317
+ // 处理列
318
+ const colKey = [];
319
+ const colKeyTitle = this.flatSummaryCol(proSummaryTableColumns);
320
+ for (const col of proSummaryTableColumns) {
321
+ if (
322
+ (col.statColType === "fact" || Array.isArray(col.children)) &&
323
+ col.TYPE === undefined
324
+ ) {
325
+ colKey.push(col);
326
+ }
327
+ }
328
+ const flatSummaryColTitle = this.flatSummaryCol(colKey);
329
+ const flatSummaryRowTitle = this.flatSummaryCol(rowKey);
330
+ const flatSummaryCalTitle = this.flatSummaryCol(
331
+ proSummaryTableColumns.filter(({ TYPE }) => TYPE !== undefined)
332
+ );
333
+ console.log("colKey", colKey);
334
+ console.log("colKeyTitle", colKeyTitle);
335
+ console.log("flatSummaryColTitle", flatSummaryColTitle);
336
+ console.log("flatSummaryRowTitle", flatSummaryRowTitle);
337
+ console.log("flatSummaryCalTitle", flatSummaryCalTitle);
338
+
339
+ proSummaryTableData = this.handleColData(
340
+ rowMp,
341
+ flatSummaryRowTitle,
342
+ flatSummaryColTitle,
343
+ flatSummaryCalTitle,
344
+ cal
345
+ );
346
+
347
+ excludeGroupSumData = this.deepClone(proSummaryTableData);
348
+ console.log("excludeGroupSumData", excludeGroupSumData);
349
+
350
+ if (
351
+ subtotalXColumn &&
352
+ Array.isArray(subtotalXColumn) &&
353
+ subtotalXColumn.length
354
+ ) {
355
+ const sortKeys = subtotalXColumn.map(({ id }) => colIdToNameMp[id]);
356
+
357
+ const rowSumMp = this.buildRowMp(proSummaryTableData, sortKeys);
358
+ console.log("rowSumMp", rowSumMp);
359
+
360
+ const calRowKeys = [
361
+ ...flatSummaryCalTitle,
362
+ ...flatSummaryColTitle,
363
+ ].map((i) => this.buildKeys(i));
364
+ console.log("calRowKeys", calRowKeys);
365
+
366
+ proSummaryTableData = this.handleRowData(
367
+ rowSumMp,
368
+ calRowKeys,
369
+ calMp,
370
+ calTxt,
371
+ sortKeys[0],[],groupIColumns
372
+ );
373
+ }
374
+
375
+ // 序号
376
+ if (columns[0].title === "序号") {
377
+ const col: any = {
378
+ dataIndex: "序号",
379
+ title: "序号",
380
+ width: 60,
381
+ order: -1,
382
+ };
383
+ if (columns[0].colWidth) {
384
+ col.width = columns[0].colWidth;
385
+ }
386
+ proSummaryTableColumns.unshift(col);
387
+ proSummaryTableData.forEach((_, idx) => {
388
+ _["序号"] = idx + 1;
389
+ });
390
+ }
391
+
392
+
393
+ // 给小计和总计染色
394
+ this.stain(proSummaryTableColumns);
395
+
396
+ // 删除默认数据在组内顺序字段
397
+ proSummaryTableColumns.splice(
398
+ proSummaryTableColumns.findIndex(
399
+ ({ dataIndex }) => dataIndex === "orderInGroup"
400
+ ),
401
+ 1
402
+ );
403
+
404
+ proSummaryTableData.forEach((item) => delete item.orderInGroup);
405
+
406
+ // 排序
407
+ proSummaryTableColumns = proSummaryTableColumns.sort((a, b) => {
408
+ if (a.order === undefined && b.order === undefined) return 0;
409
+ if (a.order === undefined) return 1;
410
+ if (b.order === undefined) return -1;
411
+ return a.order < b.order ? -1 : 1;
412
+ });
413
+
414
+ console.log("proSummaryTableColumns", proSummaryTableColumns);
415
+ console.log("proSummaryTableData", proSummaryTableData);
416
+
417
+ return { proSummaryTableColumns, proSummaryTableData };
418
+ },
419
+ deepClone(source, hash = new WeakSet()) {
420
+ try {
421
+ if (
422
+ typeof source !== "object" ||
423
+ source === null ||
424
+ React.isValidElement(source)
425
+ ) {
426
+ return source;
427
+ }
428
+ if (hash.has(source)) {
429
+ return source;
430
+ }
431
+
432
+ hash.add(source);
433
+ const target = Array.isArray(source) ? [] : {};
434
+ Reflect.ownKeys(source).forEach((key) => {
435
+ const val = source[key];
436
+ if (typeof val === "object" && val != null) {
437
+ target[key] = this.deepClone(val, hash);
438
+ } else {
439
+ target[key] = val;
440
+ }
441
+ });
442
+ return target;
443
+ } catch (err) {
444
+ console.log("deepclone err", err, source);
445
+ }
446
+ },
447
+ flatSummaryCol(arr, res = []) {
448
+ for (const i of arr) {
449
+ if (!i.children) res.push(i.keys);
450
+ else this.flatSummaryCol(i.children, res);
451
+ }
452
+ return res;
453
+ },
454
+ buildColTag(cols, keys = []) {
455
+ for (const col of cols) {
456
+ if (!col.children) {
457
+ col.dataIndex = this.buildKeys([
458
+ ...keys,
459
+ { dataKey: col._type ? col._type : col.title, title: col.title },
460
+ ]);
461
+ if (col.keys === undefined)
462
+ col.keys = [
463
+ ...keys,
464
+ { dataKey: col._type ? col._type : col.title, title: col.title },
465
+ ];
466
+ } else {
467
+ this.buildColTag(col.children, [
468
+ ...keys,
469
+ { dataKey: col._type ? col._type : col.title, title: col.title },
470
+ ]);
471
+ }
472
+ }
473
+ },
474
+
475
+ getCurCalKeys(cols, keys = []) {
476
+ for (const col of cols) {
477
+ if (Array.isArray(col.children)) {
478
+ this.getCurCalKeys(col.children, keys);
479
+ } else {
480
+ keys.push({
481
+ factIndex: col.keys[col.keys.length - 1],
482
+ dataIndex: col.dataIndex,
483
+ });
484
+ }
485
+ }
486
+
487
+ return keys;
488
+ },
489
+
490
+ setSumColKeys(sumCol, sumKeys) {
491
+ if (sumKeys.length === 0) return;
492
+ if (Array.isArray(sumCol.children)) {
493
+ this.setSumColKeys(sumCol.children, sumKeys);
494
+ } else {
495
+ for (const col of sumCol) {
496
+ const factKey = col.keys[col.keys.length - 1].dataKey;
497
+ col.sumDataIndex = sumKeys.filter(
498
+ ({ factIndex: { dataKey } }) => dataKey === factKey
499
+ );
500
+ col.keys[col.keys.length - 1].sumDataIndex = col.sumDataIndex.map(
501
+ ({ dataIndex }) => dataIndex
502
+ );
503
+ }
504
+ }
505
+ },
506
+ handleColData(
507
+ rowMp,
508
+ flatSummaryRowTitle,
509
+ flatSummaryColTitle,
510
+ flatSummaryCalTitle,
511
+ cal,
512
+ idx = 0,
513
+ data = {},
514
+ list = []
515
+ ) {
516
+ if (Array.isArray(rowMp)) {
517
+ for (const col of flatSummaryColTitle) {
518
+ const key = this.buildKeys(col);
519
+ const colTarget = [];
520
+ const preConditions = col.slice(0, col.length - 1);
521
+ const targetKey = col.slice(col.length - 1)[0].title;
522
+ for (const d of rowMp) {
523
+ if (
524
+ preConditions.every(({ dataKey, title }) => d[dataKey] === title)
525
+ ) {
526
+ colTarget.push(d);
527
+ }
528
+ }
529
+
530
+ if (data[key] === undefined || data[key] == "") {
531
+ data[key] = BigNumber(0);
532
+ }
533
+ if (cal === "sum")
534
+ data[key] = colTarget.reduce(
535
+ (last, d) => last.plus(BigNumber(d[targetKey])),
536
+ BigNumber(0)
537
+ );
538
+ if (cal === "avg")
539
+ data[key] = colTarget.reduce(
540
+ (last, d) =>
541
+ last.plus(BigNumber(d[targetKey]).div(colTarget.length)),
542
+ BigNumber(0)
543
+ );
544
+ data[key] =
545
+ data[key]?.toString() == "NaN" ? "0" : data[key]?.toString();
546
+ }
547
+
548
+ for (const calCol of flatSummaryCalTitle) {
549
+ const key = this.buildKeys(calCol);
550
+ const sumDataIndex = calCol[calCol.length - 1].sumDataIndex;
551
+
552
+ if (data[key] === undefined || data[key] == "")
553
+ data[key] = BigNumber(0);
554
+ if (cal === "sum")
555
+ data[key] = sumDataIndex.reduce(
556
+ (last, dataKey) => last.plus(BigNumber(data[dataKey])),
557
+ BigNumber(0)
558
+ );
559
+ if (cal === "avg")
560
+ data[key] = sumDataIndex.reduce(
561
+ (last, dataKey) =>
562
+ last.plus(BigNumber(data[dataKey]).div(sumDataIndex.length)),
563
+ BigNumber(0)
564
+ );
565
+ data[key] = data[key]?.toString();
566
+ }
567
+ list.push(data);
568
+ } else {
569
+ for (const [k, v] of Object.entries(rowMp)) {
570
+ const dataKey = flatSummaryRowTitle[idx][0].dataKey;
571
+ data[dataKey] = k;
572
+ this.handleColData(
573
+ v,
574
+ flatSummaryRowTitle,
575
+ flatSummaryColTitle,
576
+ flatSummaryCalTitle,
577
+ cal,
578
+ idx + 1,
579
+ this.deepClone(data),
580
+ list
581
+ );
582
+ }
583
+ }
584
+
585
+ return list;
586
+ },
587
+
588
+ buildRowMp(data, sortKeys, idx = 0, mp = {}) {
589
+ if (idx >= sortKeys.length) return data;
590
+
591
+ const dataKey = sortKeys[idx];
592
+
593
+ for (const d of data) {
594
+ if (mp[d[dataKey]] === undefined) mp[d[dataKey]] = [];
595
+ mp[d[dataKey]].push(d);
596
+ }
597
+
598
+ for (const [k, v] of Object.entries(mp)) {
599
+ mp[k] = this.buildRowMp(v, sortKeys, idx + 1);
600
+ }
601
+
602
+ return mp;
603
+ },
604
+
605
+ handleRowData(
606
+ data,
607
+ calKeys,
608
+ calMp: { [key: string]: string },
609
+ calTxt,
610
+ calTxtKey,
611
+ res = [],groupIColumns
612
+ ) {
613
+ for (const [k, v] of Object.entries(data)) {
614
+ if (Array.isArray(v)) {
615
+ const sumData = {
616
+ [calTxtKey]: calTxt,
617
+ _type: calMp,
618
+ _calRange: "small",
619
+ };
620
+
621
+ for (const calKey of calKeys) {
622
+ if (calMp[calKey] === "sum")
623
+ sumData[calKey] = v.reduce(
624
+ (last, d) => last.plus(BigNumber(d[calKey])),
625
+ BigNumber(0)
626
+ );
627
+ if (calMp[calKey] === "avg")
628
+ sumData[calKey] = v.reduce(
629
+ (last, d) => last.plus(BigNumber(d[calKey]).div(v.length)),
630
+ BigNumber(0)
631
+ );
632
+
633
+ const hash = (...args) => args.join("-");
634
+ const hashKey = (data, keys) => hash(...keys.map((key) => data[key]));
635
+ if (calMp[calKey] === "groupIsum") {
636
+ const allKeys = groupIColumns?.map(({ title }) => title);
637
+ const set = new Set();
638
+
639
+ sumData[calKey] = v.reduce((lastNum, item) => {
640
+ if (set.has(hashKey(item, allKeys))) return lastNum;
641
+ set.add(hashKey(item, allKeys));
642
+ return lastNum.plus(
643
+ new BigNumber(this.getTableSummaryNumberValue(item[calKey]))
644
+ );
645
+ }, new BigNumber(0));
646
+ }
647
+
648
+ if (calMp[calKey] === "groupIavg") {
649
+ const set = new Set();
650
+ let nums = 0;
651
+ const allKeys = groupIColumns?.map(({ title }) => title);
652
+
653
+ data.forEach((item) => {
654
+ if (set.has(hashKey(item, allKeys))) return;
655
+ set.add(hashKey(item, allKeys));
656
+
657
+ nums++;
658
+ });
659
+
660
+ set.clear();
661
+
662
+ sumData[calKey] = v.reduce((lastNum, item) => {
663
+ if (set.has(hashKey(item, allKeys))) return lastNum;
664
+ set.add(hashKey(item, allKeys));
665
+ return lastNum.plus(
666
+ new BigNumber(
667
+ this.getTableSummaryNumberValue(item[calKey])
668
+ ).div(nums)
669
+ );
670
+ }, new BigNumber(0));
671
+ }
672
+
673
+ sumData[calKey] = sumData[calKey]?.toString();
674
+ }
675
+
676
+ v.sort((a, b) =>
677
+ Number(a.orderInGroup) < Number(b.orderInGroup) ? -1 : 1
678
+ );
679
+ res.push(...v, sumData);
680
+ } else {
681
+ this.handleRowData(v, calKeys, calMp, calTxt, calTxtKey, res,groupIColumns);
682
+ }
683
+ }
684
+
685
+ return res;
686
+ },
687
+
688
+ stain(cols) {
689
+ for (const col of cols) {
690
+ if (Array.isArray(col.children)) {
691
+ this.stain(col.children);
692
+ } else {
693
+ col.render = function(text, record, index) {
694
+ let className = "";
695
+ if (record._type !== undefined) {
696
+ if (record._calRange === "small") className = "xiaoji";
697
+ else className = "heji";
698
+ }
699
+ return <div className={className}>{text}</div>;
700
+ };
701
+ }
702
+ }
703
+ },
704
+ getTableSummaryNumberValue(value: "" | string[]) {
705
+ if (value === undefined || value === null) return 0;
706
+ if (typeof value === "string") return Number(value);
707
+ return Number(value[0].split("@R@")[1]);
708
+ },
709
+ buildKeys(keys: { title: string; dataKey: string }[]) {
710
+ return keys.map((i) => i.title).join("-");
711
+ }
712
+
713
+ }