From 452e5c5e9a340367c8fdb14b0bdecc96dcb29491 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 19 八月 2026 11:01:28 +0800
Subject: [PATCH] fix(router): 更新一袋一码首页路由标题

---
 src/views/hrm/employee/index.vue |   92 ++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 89 insertions(+), 3 deletions(-)

diff --git a/src/views/hrm/employee/index.vue b/src/views/hrm/employee/index.vue
index 3cc7d6b..639122d 100644
--- a/src/views/hrm/employee/index.vue
+++ b/src/views/hrm/employee/index.vue
@@ -5,7 +5,12 @@
 import { Page, useVbenModal } from '#/packages/effects/common-ui/src';
 import { downloadFileFromBlobPart } from '#/packages/utils/src';
 
-import { Button, message } 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';
 
 import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
 import { deleteEmployee, exportEmployee, getEmployeePage } from '#/api/hrm/employee';
@@ -13,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,
 });
 
@@ -54,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({
@@ -92,6 +148,7 @@
 
 <template>
   <Page auto-content-height>
+    <ImportModal @success="handleRefresh" />
     <FormModal @success="handleRefresh" />
     <Grid table-title="鍛樺伐鍒楄〃">
       <template #toolbar-tools>
@@ -105,6 +162,13 @@
               onClick: handleCreate,
             },
             {
+              label: '瀵煎叆',
+              type: 'primary',
+              icon: ACTION_ICON.UPLOAD,
+              auth: ['hrm:employee:import'],
+              onClick: handleImport,
+            },
+            {
               label: $t('ui.actionTitle.export'),
               type: 'primary',
               icon: ACTION_ICON.DOWNLOAD,
@@ -116,6 +180,16 @@
       </template>
       <template #employeeNo="{ row }">
         <Button type="link" @click="handleDetail(row)">{{ row.employeeNo }}</Button>
+      </template>
+      <template #gender="{ row }">
+        <Tag :color="row.gender === 1 ? 'blue' : 'pink'">
+          {{ getDictLabel(DICT_TYPE.HRM_GENDER, row.gender) }}
+        </Tag>
+      </template>
+      <template #employeeStatus="{ row }">
+        <Tag :color="row.employeeStatus === 1 ? 'success' : row.employeeStatus === 2 ? 'processing' : 'default'">
+          {{ getDictLabel(DICT_TYPE.HRM_EMPLOYEE_STATUS, row.employeeStatus) }}
+        </Tag>
       </template>
       <template #actions="{ row }">
         <TableAction
@@ -143,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