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,592 @@
1
+ <template>
2
+ <div class="export-container">
3
+ <!-- 导出按钮 -->
4
+ <el-button type="primary" @click="exportExcel"
5
+ >导出Excel(Vue3+TS)----- 1</el-button
6
+ >
7
+ <!-- 导出状态提示 -->
8
+ <p v-if="isExporting">正在导出...</p>
9
+ <p v-if="exportSuccess" style="color: green">导出成功!</p>
10
+ <p v-if="exportError" style="color: red">导出失败!</p>
11
+ </div>
12
+ </template>
13
+
14
+ <script setup lang="ts">
15
+ import { ref } from "vue";
16
+ import ExcelJS from "exceljs";
17
+ import type { CellValue, Worksheet, Row, Cell } from "exceljs";
18
+ import { ElMessage } from "element-plus";
19
+
20
+ // 导出状态
21
+ const isExporting = ref(false);
22
+ const exportSuccess = ref(false);
23
+ const exportError = ref(false);
24
+
25
+ /**
26
+ * Mock数据(与落库字段匹配)
27
+ */
28
+ // 表头数据
29
+ const tableHeaders = [
30
+ "档案编号",
31
+ "档案日期",
32
+ "会计日",
33
+ "控制行号",
34
+ "客户CIN",
35
+ "客户经理号",
36
+ "客户英文名称",
37
+ "客户中文名称",
38
+ "账号",
39
+ "产品(大项)",
40
+ "产品(细项)",
41
+ "余额(HKD)",
42
+ "额度(HKD)",
43
+ "授信资产风险评级 YBD",
44
+ "逾期天数",
45
+ "逾期原因",
46
+ "补充说明",
47
+ "催理情况",
48
+ "补充说明",
49
+ "Status",
50
+ ];
51
+
52
+ // 表格数据(已简化为示例数据)
53
+ const tableData = [
54
+ [
55
+ "012-C3-20250226-106",
56
+ "11/19/2025",
57
+ "11/20/2025",
58
+ "307",
59
+ "72050XXXXXX",
60
+ "8880169",
61
+ "FXXXX LIMITED",
62
+ "一XXXXXX集团有限公司",
63
+ "1288740XXXXXXX",
64
+ "特定放款计划",
65
+ "HKMC中小企融资担保计划 (SPGS)-定放/定押放/循环贷款/租购放款",
66
+ "1481082.78",
67
+ "4000000.00",
68
+ "S2M",
69
+ "10",
70
+ "",
71
+ "",
72
+ "",
73
+ "",
74
+ "",
75
+ ],
76
+ [
77
+ "012-C3-20250226-106",
78
+ "11/19/2025",
79
+ "11/20/2025",
80
+ "307",
81
+ "72050XXXXXX",
82
+ "8880169",
83
+ "FXXXX LIMITED",
84
+ "一XXXXXX集团有限公司",
85
+ "1288740XXXXXXX",
86
+ "特定放款计划",
87
+ "HKMC中小企融资担保计划 (SPGS)-定放/定押放/循环贷款/租购放款",
88
+ "265501.56",
89
+ "4000000.00",
90
+ "S2M",
91
+ "21",
92
+ "已联络客户",
93
+ "",
94
+ "客户已平帐",
95
+ "",
96
+ "已完成催收流程",
97
+ ],
98
+ [
99
+ "012-C3-20250226-106",
100
+ "11/19/2025",
101
+ "11/20/2025",
102
+ "307",
103
+ "72050XXXXXX",
104
+ "8880169",
105
+ "FXXXX LIMITED",
106
+ "一XXXXXX集团有限公司",
107
+ "1288740XXXXXXX",
108
+ "特定放款计划",
109
+ "HKMC中小企融资担保计划 (SPGS)-定放/定押放/循环贷款/租购放款",
110
+ "265501.56",
111
+ "1000000.00",
112
+ "P3M",
113
+ "",
114
+ "21",
115
+ "已联络客户",
116
+ "客户已平帐",
117
+ "",
118
+ "已完成催收流程",
119
+ ],
120
+ [
121
+ "012-C3-20250226-107",
122
+ "12/10/2025",
123
+ "12/9/2025",
124
+ "307",
125
+ "72050XXXXXX",
126
+ "8880169",
127
+ "FXXXX LIMITED",
128
+ "一XXXXXX集团有限公司",
129
+ "1288740XXXXXXX",
130
+ "特定放款计划",
131
+ "HKMC中小企融资担保计划 (SPGS)-定放/定押放/循环贷款/租购放款",
132
+ "265501.56",
133
+ "4000000.00",
134
+ "S2M",
135
+ "7",
136
+ "已联络客户",
137
+ "",
138
+ "客户已平帐",
139
+ "",
140
+ "已完成催收流程",
141
+ ],
142
+ [
143
+ "012-C3-20250226-107",
144
+ "12/10/2025",
145
+ "12/9/2025",
146
+ "307",
147
+ "72050XXXXXX",
148
+ "8880169",
149
+ "FXXXX LIMITED",
150
+ "一XXXXXX集团有限公司",
151
+ "1288740XXXXXXX",
152
+ "特定放款计划",
153
+ "HKMC中小企融资担保计划 (SPGS)-定放/定押放/循环贷款/租购放款",
154
+ "265501.56",
155
+ "4000000.00",
156
+ "S2M",
157
+ "7",
158
+ "已联络客户",
159
+ "",
160
+ "客户已平帐",
161
+ "",
162
+ "已完成催收流程",
163
+ ],
164
+ ];
165
+
166
+ /**
167
+ * 工具函数:安全获取单元格值的长度
168
+ * @param cellValue Excel单元格值
169
+ * @returns 单元格值的字符长度(数字转字符串,空值返回0)
170
+ */
171
+ const getCellValueLength = (
172
+ cellValue: CellValue | undefined | null
173
+ ): number => {
174
+ if (cellValue === null || cellValue === undefined) return 0;
175
+ // 处理不同类型的CellValue,统一转为字符串后计算长度
176
+ let strValue = "";
177
+ if (typeof cellValue === "string") {
178
+ strValue = cellValue;
179
+ } else if (typeof cellValue === "number" || typeof cellValue === "boolean") {
180
+ strValue = cellValue.toString();
181
+ } else if (cellValue instanceof Date) {
182
+ strValue = cellValue.toISOString();
183
+ } else {
184
+ // 处理富文本、公式等特殊类型,转为字符串
185
+ strValue = String(cellValue);
186
+ }
187
+ return strValue.length;
188
+ };
189
+
190
+ /**
191
+ * 判断是否为数字的辅助函数
192
+ * @param value 单元格值
193
+ * @returns 是否为数字(包括带小数点的数字字符串)
194
+ */
195
+ const isNumberValue = (value: any): boolean => {
196
+ if (value === null || value === undefined) return false;
197
+ if (typeof value === "number") return true;
198
+ if (typeof value !== "string") return false;
199
+
200
+ // 移除千分位逗号
201
+ const cleanedValue = value.replace(/,/g, "");
202
+
203
+ // 检查是否为数字(包括负数、小数)
204
+ return /^-?\d+(\.\d+)?$/.test(cleanedValue);
205
+ };
206
+
207
+ /**
208
+ * 数据分组函数:根据档案编号分组数据
209
+ * @param data 原始数据数组(不包含表头)
210
+ * @returns 分组后的数据,包含每个组的起始行和结束行索引
211
+ */
212
+ const groupDataByFileNumber = (data: any[][]) => {
213
+ const groups: Array<{
214
+ fileNumber: string;
215
+ startRow: number; // 起始行索引(基于0,不包含表头)
216
+ endRow: number; // 结束行索引(基于0,不包含表头)
217
+ rows: any[][]; // 该组的所有行数据
218
+ }> = [];
219
+
220
+ let currentGroup: {
221
+ fileNumber: string;
222
+ startRow: number;
223
+ endRow: number;
224
+ rows: any[][];
225
+ } | null = null;
226
+
227
+ data.forEach((row, index) => {
228
+ const fileNumber = row[0]; // 档案编号在第一列
229
+
230
+ if (!currentGroup || currentGroup.fileNumber !== fileNumber) {
231
+ // 开始新的分组
232
+ if (currentGroup) {
233
+ currentGroup.endRow = index - 1;
234
+ groups.push(currentGroup);
235
+ }
236
+ currentGroup = {
237
+ fileNumber,
238
+ startRow: index,
239
+ endRow: index,
240
+ rows: [row],
241
+ };
242
+ } else {
243
+ // 继续当前分组
244
+ currentGroup.endRow = index;
245
+ currentGroup.rows.push(row);
246
+ }
247
+ });
248
+
249
+ // 添加最后一个分组
250
+ if (currentGroup) {
251
+ groups.push(currentGroup);
252
+ }
253
+
254
+ return groups;
255
+ };
256
+
257
+ /**
258
+ * 获取指定列的所有索引(用于处理重复列名)
259
+ * @param columnName 列名
260
+ * @returns 列索引数组(从0开始)
261
+ */
262
+ const getColumnIndexes = (columnName: string): number[] => {
263
+ const indexes: number[] = [];
264
+ tableHeaders.forEach((header, index) => {
265
+ if (header === columnName) {
266
+ indexes.push(index);
267
+ }
268
+ });
269
+ return indexes;
270
+ };
271
+
272
+ /**
273
+ * 需要特殊处理对齐方式的列(垂直水平居中)
274
+ */
275
+ const getCenterAlignedColumns = () => [
276
+ "逾期原因",
277
+ "补充说明",
278
+ "催理情况",
279
+ "Status",
280
+ ];
281
+
282
+ /**
283
+ * 获取需要右对齐的列(主要是数字列)
284
+ */
285
+ const getRightAlignedColumns = () => ["余额(HKD)", "额度(HKD)", "逾期天数"];
286
+
287
+ /**
288
+ * 合并相同档案编号的数据
289
+ * @param worksheet Excel工作表对象
290
+ * @param data 原始数据(不包含表头)
291
+ */
292
+ const mergeCellsForSameFileNumber = (worksheet: Worksheet, data: any[][]) => {
293
+ const groups = groupDataByFileNumber(data);
294
+
295
+ // 需要合并的列名(注意:有两个"补充说明"列)
296
+ const columnsToMerge = [
297
+ "逾期原因",
298
+ "补充说明", // 第一个补充说明(第17列)
299
+ "催理情况",
300
+ "补充说明", // 第二个补充说明(第19列)
301
+ "Status",
302
+ ];
303
+
304
+ // 存储已经合并过的单元格范围,避免重复合并
305
+ const mergedRanges = new Set<string>();
306
+
307
+ groups.forEach((group) => {
308
+ // 如果组内只有一行数据,不需要合并
309
+ if (group.startRow === group.endRow) {
310
+ return;
311
+ }
312
+
313
+ // 处理所有需要合并的列
314
+ columnsToMerge.forEach((columnName) => {
315
+ // 获取该列名的所有索引(处理重复列名)
316
+ const columnIndexes = getColumnIndexes(columnName);
317
+
318
+ columnIndexes.forEach((columnIndex) => {
319
+ if (columnIndex === -1) return;
320
+
321
+ // Excel行号从1开始,加上表头行
322
+ const startRow = group.startRow + 2; // +2是因为Excel行从1开始,表头占第1行
323
+ const endRow = group.endRow + 2;
324
+
325
+ // 创建唯一标识符来避免重复合并
326
+ const rangeKey = `${startRow}-${endRow}-${columnIndex + 1}`;
327
+
328
+ // 检查是否已经合并过这个范围
329
+ if (mergedRanges.has(rangeKey)) {
330
+ return;
331
+ }
332
+
333
+ try {
334
+ // 合并单元格
335
+ worksheet.mergeCells(
336
+ startRow,
337
+ columnIndex + 1,
338
+ endRow,
339
+ columnIndex + 1
340
+ );
341
+ mergedRanges.add(rangeKey);
342
+
343
+ // 获取合并后的单元格值(取第一个非空值)
344
+ let mergedValue = "";
345
+
346
+ // 修复:确保rows存在且非空
347
+ if (group.rows && group.rows.length > 0) {
348
+ for (let i = 0; i < group.rows.length; i++) {
349
+ const rowData = group.rows[i];
350
+ if (rowData && rowData[columnIndex] !== undefined) {
351
+ const value = rowData[columnIndex];
352
+ if (
353
+ value !== null &&
354
+ value !== undefined &&
355
+ String(value).trim() !== ""
356
+ ) {
357
+ mergedValue = String(value);
358
+ break;
359
+ }
360
+ }
361
+ }
362
+ }
363
+
364
+ // 设置合并后单元格的值
365
+ const cell = worksheet.getCell(startRow, columnIndex + 1);
366
+ cell.value = mergedValue;
367
+ } catch (error: any) {
368
+ console.warn(`合并单元格失败: ${error.message}`, {
369
+ startRow,
370
+ columnIndex: columnIndex + 1,
371
+ endRow,
372
+ columnName,
373
+ fileNumber: group.fileNumber,
374
+ });
375
+ }
376
+ });
377
+ });
378
+ });
379
+ };
380
+
381
+ /**
382
+ * 行业数据Excel导出函数(TS严格模式适配版)
383
+ * @param worksheetData Excel工作表数据(二维数组)
384
+ * @param sheetName 工作表名称
385
+ * @param excelName 导出文件名(不含.xlsx后缀)
386
+ */
387
+ async function industryExportToExcel(
388
+ worksheetData: any[][],
389
+ sheetName: string,
390
+ excelName: string
391
+ ): Promise<void> {
392
+ const workbook = new ExcelJS.Workbook();
393
+ const worksheet = workbook.addWorksheet(sheetName);
394
+
395
+ // 1. 写入数据(保留原始文本格式)
396
+ worksheet.addRows(worksheetData);
397
+
398
+ // 2. 合并相同档案编号的单元格
399
+ const dataWithoutHeader = worksheetData.slice(1); // 去掉表头
400
+ mergeCellsForSameFileNumber(worksheet, dataWithoutHeader);
401
+
402
+ // 3. 配置表头样式(无特殊颜色和背景,仅加粗)
403
+ const headerRow = worksheet.getRow(1);
404
+ if (headerRow) {
405
+ headerRow.eachCell((cell: Cell) => {
406
+ // 表头字体:仅加粗,无特殊颜色
407
+ cell.font = {
408
+ name: "Calibri",
409
+ size: 11,
410
+ bold: true,
411
+ color: { argb: "FF000000" }, // 黑色文本
412
+ };
413
+ // 表头无特殊背景
414
+ cell.fill = {
415
+ type: "pattern",
416
+ pattern: "solid",
417
+ fgColor: { argb: "FFFFFFFF" }, // 白色背景
418
+ };
419
+ // 表头文本左对齐(垂直居中)
420
+ cell.alignment = {
421
+ vertical: "middle",
422
+ horizontal: "left", // 左对齐
423
+ wrapText: true, // 自动换行
424
+ };
425
+ // 表头黑色边框
426
+ cell.border = {
427
+ top: { style: "thin", color: { argb: "FF000000" } },
428
+ left: { style: "thin", color: { argb: "FF000000" } },
429
+ bottom: { style: "thin", color: { argb: "FF000000" } },
430
+ right: { style: "thin", color: { argb: "FF000000" } },
431
+ };
432
+ });
433
+ }
434
+
435
+ // 4. 配置数据行样式
436
+ worksheet.eachRow((row: Row, rowIndex: number) => {
437
+ // 显式指定类型
438
+ if (rowIndex === 1) return; // 跳过表头行
439
+
440
+ row.eachCell((cell: Cell, cellNumber: number) => {
441
+ // 基础字体设置
442
+ cell.font = {
443
+ name: "Calibri",
444
+ size: 11,
445
+ color: { argb: "FF000000" }, // 黑色文本
446
+ };
447
+
448
+ // 获取列名
449
+ const columnIndex = cellNumber - 1;
450
+ const columnName: any = tableHeaders[columnIndex];
451
+
452
+ // 特殊列处理:垂直水平居中(包括所有补充说明列)
453
+ const centerAlignedColumns = getCenterAlignedColumns();
454
+ if (centerAlignedColumns.includes(columnName)) {
455
+ cell.alignment = {
456
+ vertical: "middle",
457
+ horizontal: "center", // 水平居中
458
+ wrapText: true,
459
+ };
460
+ }
461
+ // 数字列处理:右对齐
462
+ else if (
463
+ getRightAlignedColumns().includes(columnName) ||
464
+ isNumberValue(cell.value)
465
+ ) {
466
+ cell.alignment = {
467
+ vertical: "middle",
468
+ horizontal: "right", // 右对齐
469
+ wrapText: true,
470
+ };
471
+ }
472
+ // 其他列:左对齐
473
+ else {
474
+ cell.alignment = {
475
+ vertical: "middle",
476
+ horizontal: "left", // 左对齐
477
+ wrapText: true,
478
+ };
479
+ }
480
+
481
+ // 数据行黑色边框
482
+ cell.border = {
483
+ top: { style: "thin", color: { argb: "FF000000" } },
484
+ left: { style: "thin", color: { argb: "FF000000" } },
485
+ bottom: { style: "thin", color: { argb: "FF000000" } },
486
+ right: { style: "thin", color: { argb: "FF000000" } },
487
+ };
488
+ });
489
+ });
490
+
491
+ // 5. 列宽自适应
492
+ worksheet.columns?.forEach((column, _index) => {
493
+ // 初始化默认宽度
494
+ let maxWidth = 10;
495
+
496
+ // 安全处理column.values(空值判断)
497
+ if (column.values && column.values.length > 0) {
498
+ // 明确指定reduce的返回类型为number
499
+ maxWidth = column.values.reduce<number>(
500
+ (w: number, cellValue: CellValue) => {
501
+ // 安全获取单元格值长度(处理所有CellValue类型)
502
+ const cellLength = getCellValueLength(cellValue);
503
+ return Math.max(w, cellLength);
504
+ },
505
+ 10
506
+ ); // 初始值设为数字10
507
+ }
508
+
509
+ // 确保maxWidth是数字后再计算
510
+ column.width = Math.min(maxWidth + 2, 50); // 限制最大宽度为50
511
+ });
512
+
513
+ // 6. 导出 Excel
514
+ try {
515
+ const buffer = await workbook.xlsx.writeBuffer();
516
+ const blob = new Blob([buffer], {
517
+ type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
518
+ });
519
+ const url = URL.createObjectURL(blob);
520
+ const a = document.createElement("a");
521
+ a.href = url;
522
+ a.download = `${excelName}.xlsx`;
523
+ document.body.appendChild(a);
524
+ a.click();
525
+ document.body.removeChild(a);
526
+ URL.revokeObjectURL(url);
527
+ return Promise.resolve();
528
+ } catch (error) {
529
+ return Promise.reject(error);
530
+ }
531
+ }
532
+
533
+ /**
534
+ * 导出Excel主函数
535
+ */
536
+ const exportExcel = async () => {
537
+ // 重置状态
538
+ exportSuccess.value = false;
539
+ exportError.value = false;
540
+ isExporting.value = true;
541
+
542
+ try {
543
+ // 准备导出数据:表头 + 数据行
544
+ const exportData = [tableHeaders, ...tableData];
545
+
546
+ // 调用导出函数
547
+ await industryExportToExcel(exportData, "档案数据", "档案数据导出");
548
+
549
+ // 导出成功
550
+ exportSuccess.value = true;
551
+ isExporting.value = false;
552
+
553
+ // 显示成功提示
554
+ ElMessage.success("Excel导出成功!");
555
+
556
+ // 3秒后自动清除成功提示
557
+ setTimeout(() => {
558
+ exportSuccess.value = false;
559
+ }, 3000);
560
+ } catch (error) {
561
+ console.error("导出失败:", error);
562
+
563
+ // 导出失败
564
+ exportError.value = true;
565
+ isExporting.value = false;
566
+
567
+ // 显示错误提示
568
+ ElMessage.error("Excel导出失败,请重试!");
569
+
570
+ // 3秒后自动清除错误提示
571
+ setTimeout(() => {
572
+ exportError.value = false;
573
+ }, 3000);
574
+ }
575
+ };
576
+ </script>
577
+
578
+ <style scoped>
579
+ .export-container {
580
+ padding: 20px;
581
+ text-align: center;
582
+ margin-top: 50px;
583
+ }
584
+ .el-button {
585
+ font-size: 16px;
586
+ padding: 10px 20px;
587
+ }
588
+ p {
589
+ margin-top: 20px;
590
+ font-size: 14px;
591
+ }
592
+ </style>