From 302e8457c8d34a35d7eabbd474d98ebc16120ed2 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 12 八月 2026 17:23:07 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/fix/hsy/20260812' into dev_pro2.0
---
src/views/hrm/employee/index.vue | 79 ++++++++++++++++++++++++++++++++++++++-
1 files changed, 76 insertions(+), 3 deletions(-)
diff --git a/src/views/hrm/employee/index.vue b/src/views/hrm/employee/index.vue
index 98a6237..639122d 100644
--- a/src/views/hrm/employee/index.vue
+++ b/src/views/hrm/employee/index.vue
@@ -5,7 +5,9 @@
import { Page, useVbenModal } from '#/packages/effects/common-ui/src';
import { downloadFileFromBlobPart } from '#/packages/utils/src';
-import { Button, message, Tag } from 'ant-design-vue';
+import { Button, message, Progress, Tag } from 'ant-design-vue';
+
+import { ref } from 'vue';
import { DICT_TYPE } from '#/packages/constants/src';
import { getDictLabel } from '#/packages/effects/hooks/src';
@@ -16,9 +18,15 @@
import { useGridColumns, useGridFormSchema } from './data';
import Form from './modules/form.vue';
+import ImportForm from './modules/import-form.vue';
const [FormModal, formModalApi] = useVbenModal({
connectedComponent: Form,
+ destroyOnClose: true,
+});
+
+const [ImportModal, importModalApi] = useVbenModal({
+ connectedComponent: ImportForm,
destroyOnClose: true,
});
@@ -57,10 +65,55 @@
}
}
+const exporting = ref(false);
+const exportPercent = ref(0);
+let exportTimer: ReturnType<typeof setInterval> | undefined;
+
+/** 妯℃嫙杩涘害鏉★細璇锋眰鏈熼棿浠� 0 璧板埌 90% */
+function startExportProgress() {
+ exportPercent.value = 0;
+ exportTimer = setInterval(() => {
+ if (exportPercent.value < 90) {
+ exportPercent.value = Math.min(
+ 90,
+ exportPercent.value + Math.random() * 12,
+ );
+ }
+ }, 300);
+}
+
+function stopExportProgress() {
+ if (exportTimer) {
+ clearInterval(exportTimer);
+ exportTimer = undefined;
+ }
+}
+
+function delay(ms: number) {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+}
+
/** 瀵煎嚭鍛樺伐 */
async function handleExport() {
- const data = await exportEmployee(await gridApi.formApi.getValues());
- downloadFileFromBlobPart({ fileName: '鍛樺伐鍒楄〃.xls', source: data });
+ if (exporting.value) return;
+ exporting.value = true;
+ startExportProgress();
+ try {
+ const data = await exportEmployee(await gridApi.formApi.getValues());
+ // 瀹屾垚锛氳繘搴︽潯璧版弧鍚庤Е鍙戜笅杞�
+ stopExportProgress();
+ exportPercent.value = 100;
+ await delay(500);
+ downloadFileFromBlobPart({ fileName: '鍛樺伐鍒楄〃.xls', source: data });
+ } finally {
+ stopExportProgress();
+ exporting.value = false;
+ }
+}
+
+/** 瀵煎叆鍛樺伐 */
+function handleImport() {
+ importModalApi.open();
}
const [Grid, gridApi] = useVbenVxeGrid({
@@ -95,6 +148,7 @@
<template>
<Page auto-content-height>
+ <ImportModal @success="handleRefresh" />
<FormModal @success="handleRefresh" />
<Grid table-title="鍛樺伐鍒楄〃">
<template #toolbar-tools>
@@ -106,6 +160,13 @@
icon: ACTION_ICON.ADD,
auth: ['hrm:employee:create'],
onClick: handleCreate,
+ },
+ {
+ label: '瀵煎叆',
+ type: 'primary',
+ icon: ACTION_ICON.UPLOAD,
+ auth: ['hrm:employee:import'],
+ onClick: handleImport,
},
{
label: $t('ui.actionTitle.export'),
@@ -156,4 +217,16 @@
</template>
</Grid>
</Page>
+ <!-- 瀵煎嚭杩涘害鏉¢伄缃� -->
+ <div
+ v-if="exporting"
+ class="fixed inset-0 z-[9999] flex items-center justify-center bg-black/40"
+ >
+ <div class="w-80 rounded-lg bg-white p-6 shadow-lg">
+ <div class="mb-3 text-center text-sm text-gray-600">
+ 姝e湪瀵煎嚭鍛樺伐鍒楄〃...
+ </div>
+ <Progress :percent="exportPercent" status="active" />
+ </div>
+ </div>
</template>
--
Gitblit v1.9.3