From 2d727a679786ccb3b1b03ae13c4d9cd4c74ec403 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Sat, 10 Oct 2026 13:51:58 +0800 Subject: [PATCH] =?UTF-8?q?fix(worker-platform):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=AF=B9=E5=B7=B2=E5=86=BB=E7=BB=93=E6=89=93=E6=89=8B=E8=B0=83?= =?UTF-8?q?=E7=BA=A7=E6=97=B6=E8=AF=AF=E6=8A=A5=E5=86=BB=E7=BB=93=E5=8E=9F?= =?UTF-8?q?=E5=9B=A0=E5=BF=85=E5=A1=AB=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 做了什么: 1. 后端 reviewAdminWorkerUser 中优化 freezeReason 校验条件:区分是否为新变为 rejected 状态,若账号原本已处于冻结态且本次仅调整等级未变动状态,直接沿用已有冻结原因,不再强制要求传 freezeReason; 2. 前端 submitLevel 在提交调级时补充传递打手既有的 freezeReason; 3. 后端新增对应测试用例确保后续回归。 - 为什么: 当打手处于冻结状态(rejected)时,管理员对其执行调级操作因未携带 freezeReason 触发了冻结原因校验错误,导致调级失败。 - 验证方式: 运行 npm run check(671 项测试全绿,类型与构建检查通过)。 --- .../worker-platform/admin-worker-user-service.ts | 11 +++++++++-- .../worker-platform/worker-platform-service.test.ts | 9 +++++++++ apps/frontend/src/pages/admin/panels/WorkersPanel.tsx | 1 + 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/apps/backend/src/services/worker-platform/admin-worker-user-service.ts b/apps/backend/src/services/worker-platform/admin-worker-user-service.ts index 40436a95..6f72a268 100644 --- a/apps/backend/src/services/worker-platform/admin-worker-user-service.ts +++ b/apps/backend/src/services/worker-platform/admin-worker-user-service.ts @@ -77,10 +77,17 @@ export async function reviewAdminWorkerUser( operatorUsername: string = '', ) { const worker = await getRequiredWorker(workerId) - const status = normalizeReviewStatus(payload.status) + const status = + payload.status !== undefined && payload.status !== null + ? normalizeReviewStatus(payload.status) + : worker.status + const isNewlyRejected = status === 'rejected' && worker.status !== 'rejected' + const rawFreezeReason = payload.freezeReason ?? payload.freeze_reason const freezeReason = status === 'rejected' - ? normalizeWorkerFreezeReason(payload.freezeReason ?? payload.freeze_reason) + ? isNewlyRejected || rawFreezeReason !== undefined + ? normalizeWorkerFreezeReason(rawFreezeReason ?? worker.frozen_reason) + : worker.frozen_reason || '' : worker.frozen_reason || '' const workerType = normalizeWorkerType(payload.workerType ?? payload.worker_type) const requestedLevelId = normalizeOptionalId(payload.levelId) diff --git a/apps/backend/src/services/worker-platform/worker-platform-service.test.ts b/apps/backend/src/services/worker-platform/worker-platform-service.test.ts index 5fbe6543..428f1e23 100644 --- a/apps/backend/src/services/worker-platform/worker-platform-service.test.ts +++ b/apps/backend/src/services/worker-platform/worker-platform-service.test.ts @@ -3050,3 +3050,12 @@ test('接单排行榜必须有短缓存(单次全表聚合 277MB/742ms,独 '排行榜缓存键必须包含 workerId 与 period', ) }) + +test('已冻结打手调级或变更资料不应因未传 freezeReason 报错', async () => { + const { readFile } = await import('node:fs/promises') + const src = await readFile(new URL('./admin-worker-user-service.ts', import.meta.url), 'utf8') + assert.ok( + src.includes('isNewlyRejected'), + '必须区分是否为新冻结,防止已冻结账号调级时抛出 freeze_reason 必填错误', + ) +}) diff --git a/apps/frontend/src/pages/admin/panels/WorkersPanel.tsx b/apps/frontend/src/pages/admin/panels/WorkersPanel.tsx index 9d245f67..1c46aea6 100644 --- a/apps/frontend/src/pages/admin/panels/WorkersPanel.tsx +++ b/apps/frontend/src/pages/admin/panels/WorkersPanel.tsx @@ -405,6 +405,7 @@ export default function WorkersPanel() { status: levelWorker.status, levelId: Number(values.levelId || 0), reviewNote: levelWorker.reviewNote, + freezeReason: levelWorker.freezeReason, isLevelLocked: Boolean(values.isLevelLocked), levelLockedReason: values.levelLockedReason?.trim() || undefined, })