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