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: {