From eb838f5a7ee8aff16a95dca4e759a04f5347c049 Mon Sep 17 00:00:00 2001 From: Codex Date: Wed, 8 Jul 2026 10:19:23 +0800 Subject: [PATCH] =?UTF-8?q?feat(M08-B):=20=E8=A1=A5=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=85=8D=E6=B8=85=E6=B4=81=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/src/App.vue | 10 ++++++++ admin/src/components/CleaningTasksPanel.vue | 26 ++++++++++++++++++++- scripts/check-admin-m08-b.mjs | 5 ++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/admin/src/App.vue b/admin/src/App.vue index 9ad6de5..6baff72 100644 --- a/admin/src/App.vue +++ b/admin/src/App.vue @@ -138,6 +138,7 @@ @reject="handleReject" @reject-many="handleRejectMany" @exempt="handleExempt" + @exempt-many="handleExemptMany" @reclaim="handleReclaim" /> @@ -542,6 +543,15 @@ async function handleExempt(input: { taskId: string; note?: string }) { }, '宸叉爣璁板厤娓呮磥'); } +async function handleExemptMany(input: { taskIds: string[]; note?: string }) { + await runAction(async () => { + for (const taskId of input.taskIds) { + await exemptCleaningTask(session.value, taskId, input.note); + } + await Promise.all([loadTasks(), loadStatistics()]); + }, `\u5df2\u6279\u91cf\u6807\u8bb0\u514d\u6e05\u6d01 ${input.taskIds.length} \u4e2a\u4efb\u52a1`); +} + async function handleReclaim(input: { olderThanMinutes: number; limit: number }) { await runAction(async () => { await reclaimCleaningTimeouts(session.value, input); diff --git a/admin/src/components/CleaningTasksPanel.vue b/admin/src/components/CleaningTasksPanel.vue index e48c7cd..d2a1799 100644 --- a/admin/src/components/CleaningTasksPanel.vue +++ b/admin/src/components/CleaningTasksPanel.vue @@ -53,6 +53,14 @@ > 批量驳回 + + {{ '\u6279\u91cf\u514d\u6e05\u6d01' }} +