From 9ad09332cb48ca000dc9a7e424cc0402c80ec91c Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 2 Jan 2026 13:51:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E7=B3=BB=E7=BB=9F=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=B7=BB=E5=8A=A0=E5=90=8C=E6=AD=A5=E9=92=89?= =?UTF-8?q?=E9=92=89=E9=83=A8=E9=97=A8=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/api/dingtalk.ts | 8 ++++++++ frontend/src/views/Settings.vue | 34 ++++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/frontend/src/api/dingtalk.ts b/frontend/src/api/dingtalk.ts index 4bd53a7..7d5ff5c 100644 --- a/frontend/src/api/dingtalk.ts +++ b/frontend/src/api/dingtalk.ts @@ -65,6 +65,14 @@ export function getDingTalkDepartments(): Promise { .then(res => res.data) } +/** + * 同步钉钉部门 + */ +export function syncDingTalkDepartments(): Promise { + return request.post>('/dingtalk/sync-departments') + .then(res => res.data) +} + /** * 同步钉钉用户 */ diff --git a/frontend/src/views/Settings.vue b/frontend/src/views/Settings.vue index c170e6f..2f93357 100644 --- a/frontend/src/views/Settings.vue +++ b/frontend/src/views/Settings.vue @@ -671,6 +671,21 @@ + + 部门同步 + + + + + 同步钉钉部门 + + @@ -2281,7 +2296,7 @@ const goToScorePool = () => { } // =============== 钉钉集成 =============== -import { getDingTalkConfig, saveDingTalkConfig, testDingTalkConnection, sendTestMessage } from '@/api/dingtalk' +import { getDingTalkConfig, saveDingTalkConfig, testDingTalkConnection, sendTestMessage, syncDingTalkDepartments } from '@/api/dingtalk' const dingTalkConfig = reactive({ id: undefined as number | undefined, @@ -2403,6 +2418,23 @@ const handleSendTestMessage = async () => { } } +const handleSyncDepartments = async () => { + if (!dingTalkConfig.appKey || !dingTalkConfig.appSecret) { + message.warning('请先填写AppKey和AppSecret') + return + } + + syncingDepartments.value = true + try { + const count = await syncDingTalkDepartments() + message.success(`同步成功!共处理 ${count} 个部门`) + } catch (error: any) { + message.error(error.message || '同步失败') + } finally { + syncingDepartments.value = false + } +} + // ==================== 导航栏配置 ==================== const navbarConfig = ref({ menuItems: {