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