From 6b7b828854b46186aba302516363aecb85f33975 Mon Sep 17 00:00:00 2001 From: yuliang_guo Date: Sat, 31 Jan 2026 17:51:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=91=98=E5=B7=A5?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E7=AB=8B=E5=8D=B3=E6=89=A7=E8=A1=8C=E6=8C=89?= =?UTF-8?q?=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在系统设置页面的员工同步配置中增加"立即同步"按钮, 允许管理员手动触发钉钉员工数据同步 --- frontend/src/views/admin/system-settings.vue | 34 ++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/frontend/src/views/admin/system-settings.vue b/frontend/src/views/admin/system-settings.vue index 6f7f595..04d7976 100644 --- a/frontend/src/views/admin/system-settings.vue +++ b/frontend/src/views/admin/system-settings.vue @@ -140,6 +140,14 @@ 测试连接 + + 立即同步 + @@ -164,6 +172,7 @@ const dingtalkFormRef = ref() const syncLoading = ref(false) const syncSaving = ref(false) const syncTesting = ref(false) +const syncing = ref(false) const syncFormRef = ref() // 钉钉配置表单 @@ -327,6 +336,31 @@ const testSyncConnection = async () => { } } +/** + * 立即执行员工同步 + */ +const triggerSync = async () => { + syncing.value = true + try { + const response = await request.post('/api/v1/employee-sync/sync') + if (response.success) { + const data = response.data + ElMessage.success( + `同步完成!共处理 ${data.total_employees || 0} 名员工,` + + `创建 ${data.users_created || 0} 个账号,` + + `跳过 ${data.users_skipped || 0} 个` + ) + } else { + ElMessage.error(response.message || '同步失败') + } + } catch (error: any) { + console.error('员工同步失败:', error) + ElMessage.error(error?.response?.data?.detail || '员工同步失败') + } finally { + syncing.value = false + } +} + // 页面加载时获取配置 onMounted(() => { loadDingtalkConfig()