aegon-gen 1.0.0

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 (86) hide show
  1. package/package.json +12 -0
  2. package/src/App.vue +3 -0
  3. package/src/api/index.ts +19 -0
  4. package/src/api/modules/gen-ai/gen-entry/index.ts +30 -0
  5. package/src/api/modules/gen-ai/model-manager/index.ts +42 -0
  6. package/src/api/modules/gen-ai/model-manager/mockApi.ts +33 -0
  7. package/src/api/modules/index.ts +98 -0
  8. package/src/api/modules/user/index.ts +4 -0
  9. package/src/api/request.ts +102 -0
  10. package/src/assets/sample-access-icon.png +0 -0
  11. package/src/assets/sample-pie-chart.png +0 -0
  12. package/src/assets/vue.svg +1 -0
  13. package/src/components/CapsuleScrollbar.vue +93 -0
  14. package/src/components/Export/ExcelExport.vue +592 -0
  15. package/src/components/Export/ExcelExport2.vue +494 -0
  16. package/src/components/Export/ExcelExport3.vue +342 -0
  17. package/src/components/Export/ExcelExport4.vue +665 -0
  18. package/src/components/Export/excelExport.js +547 -0
  19. package/src/components/Export/excelExport.ts +551 -0
  20. package/src/components/GEN-AI/index.vue +142 -0
  21. package/src/components/GEN-AI/index1.vue +456 -0
  22. package/src/components/GEN-AI/index10.vue +5 -0
  23. package/src/components/GEN-AI/index2.vue +568 -0
  24. package/src/components/GEN-AI/index3.vue +623 -0
  25. package/src/components/GEN-AI/index4.vue +629 -0
  26. package/src/components/GEN-AI/index5.vue +578 -0
  27. package/src/components/GEN-AI/index6.vue +656 -0
  28. package/src/components/GEN-AI/index7.vue +717 -0
  29. package/src/components/GEN-AI/index8.vue +405 -0
  30. package/src/components/GEN-AI/index9.vue +1065 -0
  31. package/src/components/GEN-AI/types.ts +12 -0
  32. package/src/components/GEN-AI/utils.ts +42 -0
  33. package/src/components/HelloWorld.vue +41 -0
  34. package/src/components/PageCard.vue +7 -0
  35. package/src/components/PageHeader.vue +32 -0
  36. package/src/components/backup/index5 copy.vue +556 -0
  37. package/src/components/backup/index5.vue +620 -0
  38. package/src/components/backup/index9 copy.vue +1029 -0
  39. package/src/components/backup/index9-pro.vue +1065 -0
  40. package/src/components/backup/index9.vue +1057 -0
  41. package/src/components/el-date-picker.vue +64 -0
  42. package/src/directives/btnLoading.ts +427 -0
  43. package/src/directives/debounce copy.ts +670 -0
  44. package/src/directives/debounce.ts +98 -0
  45. package/src/directives/index.ts +25 -0
  46. package/src/layouts/MainLayout.vue +101 -0
  47. package/src/main.ts +85 -0
  48. package/src/router/index.ts +76 -0
  49. package/src/router/menus.ts +28 -0
  50. package/src/style.css +79 -0
  51. package/src/styles/_variables.scss +24 -0
  52. package/src/styles/app-button.css +26 -0
  53. package/src/styles/element-overrides.css +23 -0
  54. package/src/styles/global.css +44 -0
  55. package/src/styles/index.scss +1 -0
  56. package/src/styles/page-card.css +21 -0
  57. package/src/styles/variables.css +26 -0
  58. package/src/test/mock.ts +101 -0
  59. package/src/test/test1.vue +402 -0
  60. package/src/test/test2.vue +1689 -0
  61. package/src/types/gen-ai/gen-entry/index.ts +17 -0
  62. package/src/types/gen-ai/model-manager/index.ts +19 -0
  63. package/src/utils/docxExport.ts +1610 -0
  64. package/src/utils/gen-ai-navigation.ts +37 -0
  65. package/src/utils/gen-ai-scroll.ts +455 -0
  66. package/src/utils/openDataLoaderWordExport.ts +33 -0
  67. package/src/utils/pageScrollbar.ts +115 -0
  68. package/src/utils/randomTranscode.ts +87 -0
  69. package/src/utils/reportPdfExport.ts +44 -0
  70. package/src/views/AdminCenter/index.vue +817 -0
  71. package/src/views/Blank.vue +68 -0
  72. package/src/views/Home.vue +29 -0
  73. package/src/views/ReportCenter/index.vue +1380 -0
  74. package/src/views/TemplateCenter/Knowledge.ts +83 -0
  75. package/src/views/TemplateCenter/data.d.ts +10 -0
  76. package/src/views/TemplateCenter/index.vue +1205 -0
  77. package/src/views/TemplateCenter/service.ts +69 -0
  78. package/src/views/gen-ai/components/RecentReportsTable.vue +193 -0
  79. package/src/views/gen-ai/gen-entry/index.vue +309 -0
  80. package/src/views/gen-ai/gen-entry/mockData.ts +160 -0
  81. package/src/views/gen-ai/management-center/index.vue +53 -0
  82. package/src/views/gen-ai/model-manager/ChapterTitleScroll.vue +275 -0
  83. package/src/views/gen-ai/model-manager/index.vue +1205 -0
  84. package/src/views/gen-ai/model-manager/mockData.ts +122 -0
  85. package/src/views/gen-ai/report-center/index.vue +158 -0
  86. package/src/vite-env.d.ts +38 -0
@@ -0,0 +1,665 @@
1
+ <template>
2
+ <div class="export-container">
3
+ <!-- 导出按钮1:多工作表模式 -->
4
+ <el-button
5
+ type="primary"
6
+ @click="exportComplexData"
7
+ style="margin-right: 10px"
8
+ >
9
+ 导出贷款数据(多工作表)
10
+ </el-button>
11
+
12
+ <!-- 导出按钮2:单工作表模式 -->
13
+ <el-button type="primary" @click="exportArchiveData">
14
+ 导出档案数据(单工作表)
15
+ </el-button>
16
+
17
+ <!-- 导出状态提示 -->
18
+ <p v-if="isExporting">正在导出...</p>
19
+ <p v-if="exportSuccess" style="color: green">导出成功!</p>
20
+ <p v-if="exportError" style="color: red">导出失败!</p>
21
+
22
+ <el-button @click="handleSort">sort</el-button>
23
+ </div>
24
+ </template>
25
+
26
+ <script setup lang="ts">
27
+ import { ref } from "vue";
28
+ import { guiExportToExcel } from "./excelExport";
29
+ import { ElMessage } from "element-plus";
30
+
31
+ const isExporting = ref(false);
32
+ const exportSuccess = ref(false);
33
+ const exportError = ref(false);
34
+
35
+ const complexLoanData = [
36
+ [
37
+ "會計日",
38
+ "控制行號",
39
+ "客戶CIN",
40
+ "客戶經理號",
41
+ "客戶經理名稱",
42
+ "客戶英文名",
43
+ "客戶中文名",
44
+ "帳號",
45
+ "產品(大項)",
46
+ "產品(細項)",
47
+ "餘額(HKD)",
48
+ "額度(HKD)",
49
+ "授信資產風險評級YBD",
50
+ "逾期天數",
51
+ ],
52
+ [
53
+ "2025-12-12",
54
+ "307",
55
+ "72050XXXXXX",
56
+ "8812345",
57
+ "陳XX",
58
+ "FXXXX LIMITED",
59
+ "朝XXXXXX有限公司",
60
+ "1288740XXXXXX",
61
+ "特定放款計劃",
62
+ "HKMC中小企融資擔保計劃(SFGS)-定放/定押放/循環貸款/租購放款",
63
+ "1,481,082.78",
64
+ "4,000,000.00 S2M",
65
+ "",
66
+ "11",
67
+ ],
68
+ [
69
+ "2025-12-11",
70
+ "307",
71
+ "72050XXXXXX",
72
+ "8812345",
73
+ "陳XX",
74
+ "FXXXX LIMITED",
75
+ "朝XXXXXX有限公司",
76
+ "1288741XXXXXX",
77
+ "特定放款計劃",
78
+ "HKMC中小企融資擔保計劃(SFGS)-定放/定押放/循環貸款/租購放款",
79
+ "3,481,082.78",
80
+ "6,000,000.00 S2M",
81
+ "",
82
+ "1",
83
+ ],
84
+ [
85
+ "2025-12-12",
86
+ "308",
87
+ "72051XXXXXX",
88
+ "8812346",
89
+ "李XX",
90
+ "GXXXX LIMITED",
91
+ "廣XXXXXX有限公司",
92
+ "1288742XXXXXX",
93
+ "特定放款計劃",
94
+ "HKMC中小企融資擔保計劃(SFGS)-定放/定押放/循環貸款/租購放款",
95
+ "2,481,082.78",
96
+ "5000000009999999999999999999999999",
97
+ "S2M",
98
+ "",
99
+ "5",
100
+ ],
101
+ [
102
+ "2025-12-10",
103
+ "309",
104
+ "72052XXXXXX",
105
+ "8812347",
106
+ "王XX",
107
+ "HXXXX LIMITED",
108
+ "華XXXXXX有限公司",
109
+ "1288743XXXXXX",
110
+ "特定放款計劃",
111
+ "HKMC中小企融資擔保計劃(SFGS)-定放/定押放/循環貸款/租購放款",
112
+ "4,481,082.78",
113
+ "5000000009999999999999999999999999",
114
+ "7,000,000.00 S2M",
115
+ "",
116
+ "15",
117
+ ],
118
+ ];
119
+
120
+ const tableHeaders = [
121
+ "档案编号",
122
+ "档案日期",
123
+ "会计日",
124
+ "控制行号",
125
+ "客户CIN",
126
+ "客户经理号",
127
+ "客户英文名称",
128
+ "客户中文名称",
129
+ "账号",
130
+ "产品(大项)",
131
+ "产品(细项)",
132
+ "余额(HKD)",
133
+ "额度(HKD)",
134
+ "授信资产风险评级 YBD",
135
+ "逾期天数",
136
+ "逾期原因",
137
+ "补充说明",
138
+ "催理情况",
139
+ "补充说明",
140
+ "Status",
141
+ ];
142
+
143
+ const tableData = [
144
+ [
145
+ "012-C3-20250226-106",
146
+ "11/19/2025",
147
+ "11/20/2025",
148
+ "307",
149
+ "72050XXXXXX",
150
+ "8880169",
151
+ "FXXXX LIMITED",
152
+ "一XXXXXX集团有限公司",
153
+ "1288740XXXXXXX",
154
+ "特定放款计划",
155
+ "HKMC中小企融资担保计划 (SPGS)-定放/定押放/循环贷款/租购放款",
156
+ "1481082.78",
157
+ "4000000.00",
158
+ "S2M",
159
+ "10",
160
+ "",
161
+ "",
162
+ "",
163
+ "",
164
+ "",
165
+ ],
166
+ [
167
+ "012-C3-20250226-106",
168
+ "11/19/2025",
169
+ "11/20/2025",
170
+ "307",
171
+ "72050XXXXXX",
172
+ "8880169",
173
+ "FXXXX LIMITED",
174
+ "一XXXXXX集团有限公司",
175
+ "1288740XXXXXXX",
176
+ "特定放款计划",
177
+ "HKMC中小企融资担保计划 (SPGS)-定放/定押放/循环贷款/租购放款",
178
+ "265501.56",
179
+ "4000000.00",
180
+ "S2M",
181
+ "21",
182
+ "已联络客户",
183
+ "",
184
+ "客户已平帐",
185
+ "",
186
+ "已完成催收流程",
187
+ ],
188
+ [
189
+ "012-C3-20250226-106",
190
+ "11/19/2025",
191
+ "11/20/2025",
192
+ "307",
193
+ "72050XXXXXX",
194
+ "8880169",
195
+ "FXXXX LIMITED",
196
+ "一XXXXXX集团有限公司",
197
+ "1288740XXXXXXX",
198
+ "特定放款计划",
199
+ "HKMC中小企融资担保计划 (SPGS)-定放/定押放/循环贷款/租购放款",
200
+ "265501.56",
201
+ "1000000.00",
202
+ "P3M",
203
+ "",
204
+ "21",
205
+ "已联络客户",
206
+ "客户已平帐",
207
+ "",
208
+ "已完成催收流程",
209
+ ],
210
+ [
211
+ "012-C3-20250226-107",
212
+ "12/10/2025",
213
+ "12/9/2025",
214
+ "307",
215
+ "72050XXXXXX",
216
+ "8880169",
217
+ "FXXXX LIMITED",
218
+ "一XXXXXX集团有限公司",
219
+ "1288740XXXXXXX",
220
+ "特定放款计划",
221
+ "HKMC中小企融资担保计划 (SPGS)-定放/定押放/循环贷款/租购放款",
222
+ "265501.56",
223
+ "4000000.00",
224
+ "S2M",
225
+ "7",
226
+ "已联络客户",
227
+ "",
228
+ "客户已平帐",
229
+ "",
230
+ "已完成催收流程",
231
+ ],
232
+ [
233
+ "012-C3-20250226-107",
234
+ "12/10/2025",
235
+ "12/9/2025",
236
+ "307",
237
+ "72050XXXXXX",
238
+ "8880169",
239
+ "FXXXX LIMITED",
240
+ "一XXXXXX集团有限公司",
241
+ "1288740XXXXXXX",
242
+ "特定放款计划",
243
+ "HKMC中小企融资担保计划 (SPGS)-定放/定押放/循环贷款/租购放款",
244
+ "265501.56",
245
+ "4000000.00",
246
+ "S2M",
247
+ "7",
248
+ "已联络客户",
249
+ "",
250
+ "客户已平帐",
251
+ "",
252
+ "已完成催收流程",
253
+ ],
254
+ ];
255
+
256
+ const exportComplexData = async () => {
257
+ await handleExport(complexLoanData, {
258
+ excelName: "贷款数据报表",
259
+ exportType: "multi-sheet",
260
+ dateColumnName: "會計日", // 明确传递日期列名
261
+ rightAlignedColumns: ["餘額(HKD)", "額度(HKD)", "逾期天數"],
262
+ leftAlignedColumns: ["控制行號", "客戶CIN", "客戶經理號", "帳號"], // 指定编号类列左对齐
263
+ columnWidthLimit: 60,
264
+ });
265
+ };
266
+
267
+ const exportArchiveData = async () => {
268
+ const exportData = [tableHeaders, ...tableData];
269
+
270
+ await handleExport(exportData, {
271
+ excelName: "档案数据导出",
272
+ sheetName: "档案数据",
273
+ exportType: "single",
274
+ groupColumnName: "档案编号",
275
+ columnsToMerge: ["逾期原因", "补充说明", "催理情况", "补充说明", "Status"],
276
+ rightAlignedColumns: ["余额(HKD)", "额度(HKD)", "逾期天数"],
277
+ centerAlignedColumns: ["逾期原因", "补充说明", "催理情况", "Status"],
278
+ leftAlignedColumns: [
279
+ "档案编号",
280
+ "档案日期",
281
+ "会计日",
282
+ "控制行号",
283
+ "客户CIN",
284
+ "客户经理号",
285
+ "账号",
286
+ ], // 指定编号类列左对齐
287
+ columnWidthLimit: 50,
288
+ });
289
+ };
290
+
291
+ const handleExport = async (data: string[][], options: any) => {
292
+ exportSuccess.value = false;
293
+ exportError.value = false;
294
+ isExporting.value = true;
295
+
296
+ try {
297
+ await guiExportToExcel(data, options);
298
+ exportSuccess.value = true;
299
+ isExporting.value = false;
300
+ ElMessage.success("Excel导出成功!");
301
+ setTimeout(() => {
302
+ exportSuccess.value = false;
303
+ }, 3000);
304
+ } catch (error) {
305
+ console.error("导出失败:", error);
306
+ exportError.value = true;
307
+ isExporting.value = false;
308
+ ElMessage.error("Excel导出失败,请重试!");
309
+ setTimeout(() => {
310
+ exportError.value = false;
311
+ }, 3000);
312
+ }
313
+ };
314
+ interface CaseItem {
315
+ caseId: string;
316
+ alertCreationDatetime: string;
317
+ alertAcdate: string;
318
+ accountNo: string;
319
+ caseStatus: string;
320
+ cstCin: string;
321
+ cstControllingBranch: string;
322
+ CstNameChi: string;
323
+ CstNameEng: string;
324
+ cststaffId: string;
325
+ cstStaffName: string;
326
+ currentStatus: string;
327
+ overdueExp1anation: string;
328
+ overdueReason: string;
329
+ excessAmount: number;
330
+ existingLimit: number;
331
+ facilityId: string;
332
+ frozenLimitAmount: number;
333
+ overdraftLimit: number;
334
+ overdueDays: number;
335
+ pid: string;
336
+ product: null;
337
+ reminderExp1anation: string;
338
+ reminderSituation: string;
339
+ staffContro11ingBranch: null;
340
+ subProduct: null;
341
+ totallimit: null;
342
+ ybdRatingGrade: string;
343
+ }
344
+
345
+ // 修正类型并拓展后的多份案件数据(含重复caseId,不同alertAcdate/CstNameEng)
346
+ const extendedCaseData: CaseItem[] = [
347
+ // 省略原始数据(和你提供的一致),完整数据见下方测试部分
348
+ {
349
+ caseId: "012-CPD1-20260123-001",
350
+ alertCreationDatetime: "2026-01-23",
351
+ alertAcdate: "2026-01-23",
352
+ accountNo: "1234567890",
353
+ caseStatus: "已完成匯報流程",
354
+ cstCin: "7204820040",
355
+ cstControllingBranch: "202",
356
+ CstNameChi: "测试客户",
357
+ CstNameEng: "AB0000007204820040",
358
+ cststaffId: "88s0928",
359
+ cstStaffName: "前综-客户經理 [IR101-201行]",
360
+ currentStatus: "已完成匯報流程",
361
+ overdueExp1anation:
362
+ "kkk1111111111111111111111111111111111111111111111111111112",
363
+ overdueReason: "其他",
364
+ excessAmount: 1,
365
+ existingLimit: 2121210,
366
+ facilityId: "FACILITY_0001",
367
+ frozenLimitAmount: 61000000,
368
+ overdraftLimit: 12121000,
369
+ overdueDays: 1,
370
+ pid: "20260123000000000000",
371
+ product: null,
372
+ reminderExp1anation: "sss111111111111111111111111111111111111111111111111",
373
+ reminderSituation: "前線會继續聯絡客",
374
+ staffContro11ingBranch: null,
375
+ subProduct: null,
376
+ totallimit: null,
377
+ ybdRatingGrade: "4C",
378
+ },
379
+ {
380
+ caseId: "012-CPD1-20260123-001",
381
+ alertCreationDatetime: "2026-01-23",
382
+ alertAcdate: "2026-01-24",
383
+ accountNo: "1234567890",
384
+ caseStatus: "已完成匯報流程",
385
+ cstCin: "7204820040",
386
+ cstControllingBranch: "202",
387
+ CstNameChi: "测试客户",
388
+ CstNameEng: "AB0000007204820041",
389
+ cststaffId: "88s0928",
390
+ cstStaffName: "前综-客户經理 [IR101-201行]",
391
+ currentStatus: "已完成匯報流程",
392
+ overdueExp1anation:
393
+ "kkk1111111111111111111111111111111111111111111111111111112",
394
+ overdueReason: "其他",
395
+ excessAmount: 1,
396
+ existingLimit: 2121210,
397
+ facilityId: "FACILITY_0001",
398
+ frozenLimitAmount: 61000000,
399
+ overdraftLimit: 12121000,
400
+ overdueDays: 1,
401
+ pid: "20260123000000000000",
402
+ product: null,
403
+ reminderExp1anation: "sss111111111111111111111111111111111111111111111111",
404
+ reminderSituation: "前線會继續聯絡客",
405
+ staffContro11ingBranch: null,
406
+ subProduct: null,
407
+ totallimit: null,
408
+ ybdRatingGrade: "4C",
409
+ },
410
+ {
411
+ caseId: "012-CPD1-20260123-002",
412
+ alertCreationDatetime: "2026-01-23",
413
+ alertAcdate: "2026-01-25",
414
+ accountNo: "1234567891",
415
+ caseStatus: "已完成匯報流程",
416
+ cstCin: "7204820041",
417
+ cstControllingBranch: "203",
418
+ CstNameChi: "测试客户2",
419
+ CstNameEng: "AB0000007204820042",
420
+ cststaffId: "88s0929",
421
+ cstStaffName: "前综-客户經理 [IR101-202行]",
422
+ currentStatus: "已完成匯報流程",
423
+ overdueExp1anation:
424
+ "kkk2222222222222222222222222222222222222222222222222222222",
425
+ overdueReason: "系统延迟",
426
+ excessAmount: 2,
427
+ existingLimit: 2121211,
428
+ facilityId: "FACILITY_0002",
429
+ frozenLimitAmount: 61000001,
430
+ overdraftLimit: 12121001,
431
+ overdueDays: 2,
432
+ pid: "20260123000000000001",
433
+ product: null,
434
+ reminderExp1anation: "sss222222222222222222222222222222222222222222222222",
435
+ reminderSituation: "已联系客户,客户承诺次日还款",
436
+ staffContro11ingBranch: null,
437
+ subProduct: null,
438
+ totallimit: null,
439
+ ybdRatingGrade: "4B",
440
+ },
441
+ {
442
+ caseId: "012-CPD1-20260123-002",
443
+ alertCreationDatetime: "2026-01-23",
444
+ alertAcdate: "2026-01-26",
445
+ accountNo: "1234567891",
446
+ caseStatus: "已完成匯報流程",
447
+ cstCin: "7204820041",
448
+ cstControllingBranch: "203",
449
+ CstNameChi: "测试客户2",
450
+ CstNameEng: "AB0000007204820043",
451
+ cststaffId: "88s0929",
452
+ cstStaffName: "前综-客户經理 [IR101-202行]",
453
+ currentStatus: "已完成匯報流程",
454
+ overdueExp1anation:
455
+ "kkk2222222222222222222222222222222222222222222222222222222",
456
+ overdueReason: "系统延迟",
457
+ excessAmount: 2,
458
+ existingLimit: 2121211,
459
+ facilityId: "FACILITY_0002",
460
+ frozenLimitAmount: 61000001,
461
+ overdraftLimit: 12121001,
462
+ overdueDays: 2,
463
+ pid: "20260123000000000001",
464
+ product: null,
465
+ reminderExp1anation: "sss222222222222222222222222222222222222222222222222",
466
+ reminderSituation: "已联系客户,客户承诺次日还款",
467
+ staffContro11ingBranch: null,
468
+ subProduct: null,
469
+ totallimit: null,
470
+ ybdRatingGrade: "4B",
471
+ },
472
+ {
473
+ caseId: "012-CPD1-20260123-003",
474
+ alertCreationDatetime: "2026-01-23",
475
+ alertAcdate: "2026-01-27",
476
+ accountNo: "1234567892",
477
+ caseStatus: "处理中",
478
+ cstCin: "7204820042",
479
+ cstControllingBranch: "204",
480
+ CstNameChi: "测试客户3",
481
+ CstNameEng: "AB0000007204820044",
482
+ cststaffId: "88s0930",
483
+ cstStaffName: "前综-客户經理 [IR101-203行]",
484
+ currentStatus: "处理中",
485
+ overdueExp1anation:
486
+ "kkk3333333333333333333333333333333333333333333333333333333",
487
+ overdueReason: "客户资金周转困难",
488
+ excessAmount: 3,
489
+ existingLimit: 2121212,
490
+ facilityId: "FACILITY_0003",
491
+ frozenLimitAmount: 61000002,
492
+ overdraftLimit: 12121002,
493
+ overdueDays: 3,
494
+ pid: "20260123000000000002",
495
+ product: null,
496
+ reminderExp1anation: "sss333333333333333333333333333333333333333333333333",
497
+ reminderSituation: "已上报风控部门,等待审批",
498
+ staffContro11ingBranch: null,
499
+ subProduct: null,
500
+ totallimit: null,
501
+ ybdRatingGrade: "4A",
502
+ },
503
+ {
504
+ caseId: "012-CPD1-20260123-003",
505
+ alertCreationDatetime: "2026-01-23",
506
+ alertAcdate: "2026-01-28",
507
+ accountNo: "1234567892",
508
+ caseStatus: "处理中",
509
+ cstCin: "7204820042",
510
+ cstControllingBranch: "204",
511
+ CstNameChi: "测试客户3",
512
+ CstNameEng: "AB0000007204820045",
513
+ cststaffId: "88s0930",
514
+ cstStaffName: "前综-客户經理 [IR101-203行]",
515
+ currentStatus: "处理中",
516
+ overdueExp1anation:
517
+ "kkk3333333333333333333333333333333333333333333333333333333",
518
+ overdueReason: "客户资金周转困难",
519
+ excessAmount: 3,
520
+ existingLimit: 2121212,
521
+ facilityId: "FACILITY_0003",
522
+ frozenLimitAmount: 61000002,
523
+ overdraftLimit: 12121002,
524
+ overdueDays: 3,
525
+ pid: "20260123000000000002",
526
+ product: null,
527
+ reminderExp1anation: "sss333333333333333333333333333333333333333333333333",
528
+ reminderSituation: "已上报风控部门,等待审批",
529
+ staffContro11ingBranch: null,
530
+ subProduct: null,
531
+ totallimit: null,
532
+ ybdRatingGrade: "4A",
533
+ },
534
+ ];
535
+ // const mergeCaseDataByCaseId = (data: CaseItem[]): CaseItem[] => {
536
+ // // 1. 用Map存储每个caseId的合并后数据
537
+ // const caseMap = new Map<string, CaseItem>();
538
+
539
+ // data.forEach((item) => {
540
+ // const { caseId } = item;
541
+ // // 如果该caseId已存在,进行字段合并;否则直接存入
542
+ // if (caseMap.has(caseId)) {
543
+ // const existingItem = caseMap.get(caseId)!;
544
+ // // 合并规则:
545
+ // // - alertAcdate:取日期更大的(最新)
546
+ // const newAlertAcdate = item.alertAcdate;
547
+ // const oldAlertAcdate = existingItem.alertAcdate;
548
+ // const finalAlertAcdate =
549
+ // newAlertAcdate > oldAlertAcdate ? newAlertAcdate : oldAlertAcdate;
550
+
551
+ // // - CstNameEng:取当前item的值(最后出现的)
552
+ // const finalCstNameEng = item.CstNameEng;
553
+
554
+ // // - 其他字段:保留原有完整值(和existingItem一致)
555
+ // const mergedItem: CaseItem = {
556
+ // ...existingItem,
557
+ // alertAcdate: finalAlertAcdate,
558
+ // CstNameEng: finalCstNameEng,
559
+ // };
560
+
561
+ // // 更新Map中的数据
562
+ // caseMap.set(caseId, mergedItem);
563
+ // } else {
564
+ // // 首次出现的caseId,直接存入
565
+ // caseMap.set(caseId, { ...item });
566
+ // }
567
+ // });
568
+
569
+ // // 2. 转换为数组,并按caseId后缀数字排序(001→002→003)
570
+ // const mergedData = Array.from(caseMap.values()).sort((a, b) => {
571
+ // // 提取caseId最后一段的数字
572
+ // const getCaseNumber = (id: string) => {
573
+ // const parts: any = id.split("-");
574
+ // return parseInt(parts[parts.length - 1], 10) || 0;
575
+ // };
576
+ // return getCaseNumber(a.caseId) - getCaseNumber(b.caseId);
577
+ // });
578
+
579
+ // return mergedData;
580
+ // };
581
+
582
+ const processCaseData = (data: CaseItem[]): CaseItem[] => {
583
+ // ========== 步骤1:按caseId合并去重 ==========
584
+ const caseMap = new Map<string, CaseItem>();
585
+
586
+ data.forEach((item) => {
587
+ const { caseId } = item;
588
+ if (caseMap.has(caseId)) {
589
+ // 已存在该caseId,合并字段:alertAcdate取最早值(贴合远→近排序),CstNameEng取最后值
590
+ const existingItem = caseMap.get(caseId)!;
591
+ // alertAcdate取最早值(远的日期)
592
+ const finalAlertAcdate =
593
+ item.alertAcdate < existingItem.alertAcdate
594
+ ? item.alertAcdate
595
+ : existingItem.alertAcdate;
596
+ // CstNameEng取当前item的值(最后出现的)
597
+ const finalCstNameEng = item.CstNameEng;
598
+
599
+ const mergedItem: CaseItem = {
600
+ ...existingItem,
601
+ alertAcdate: finalAlertAcdate,
602
+ CstNameEng: finalCstNameEng,
603
+ };
604
+ caseMap.set(caseId, mergedItem);
605
+ } else {
606
+ // 首次出现的caseId,直接存入
607
+ caseMap.set(caseId, { ...item });
608
+ }
609
+ });
610
+
611
+ // 转换为数组(去重后的基础数据)
612
+ const deduplicatedData = Array.from(caseMap.values());
613
+
614
+ // ========== 步骤2:双层排序 ==========
615
+ const sortedData = deduplicatedData.sort((a, b) => {
616
+ // 一级排序:alertAcdate 从远到近(升序)
617
+ if (a.alertAcdate !== b.alertAcdate) {
618
+ return a.alertAcdate.localeCompare(b.alertAcdate); // 字符串升序 = 日期从早到晚
619
+ }
620
+ // 二级排序:相同alertAcdate时,CstNameEng 从a-z(升序)
621
+ return a.CstNameEng.localeCompare(b.CstNameEng, "en", {
622
+ sensitivity: "base",
623
+ });
624
+ });
625
+
626
+ return sortedData;
627
+ };
628
+
629
+ const handleSort = () => {
630
+ // const mergedResult = mergeCaseDataByCaseId(extendedCaseData);
631
+ // console.log("=== 合并去重后的结果 ===");
632
+ // // 打印核心字段验证
633
+ // mergedResult.forEach((item) => {
634
+ // console.log(`caseId: ${item.caseId}`);
635
+ // console.log(` alertAcdate: ${item.alertAcdate}(最新日期)`);
636
+ // console.log(` CstNameEng: ${item.CstNameEng}(最后更新值)`);
637
+ // console.log("------------------------");
638
+ // });
639
+ const finalResult = processCaseData(extendedCaseData);
640
+ console.log("=== 最终处理结果(去重 + 排序)===");
641
+ finalResult.forEach((item, index) => {
642
+ console.log(`[${index + 1}]`);
643
+ console.log(` caseId: ${item.caseId}`);
644
+ console.log(` alertAcdate: ${item.alertAcdate}(远→近排序)`);
645
+ console.log(` CstNameEng: ${item.CstNameEng}(a→z排序)`);
646
+ console.log("----------------------------------");
647
+ });
648
+ };
649
+ </script>
650
+
651
+ <style scoped>
652
+ .export-container {
653
+ padding: 20px;
654
+ text-align: center;
655
+ margin-top: 50px;
656
+ }
657
+ .el-button {
658
+ font-size: 16px;
659
+ padding: 10px 20px;
660
+ }
661
+ p {
662
+ margin-top: 20px;
663
+ font-size: 14px;
664
+ }
665
+ </style>