fix(worker-platform): 修复对已冻结打手调级时误报冻结原因必填的问题

- 做了什么:
  1. 后端 reviewAdminWorkerUser 中优化 freezeReason 校验条件:区分是否为新变为 rejected 状态,若账号原本已处于冻结态且本次仅调整等级未变动状态,直接沿用已有冻结原因,不再强制要求传 freezeReason;
  2. 前端 submitLevel 在提交调级时补充传递打手既有的 freezeReason;
  3. 后端新增对应测试用例确保后续回归。
- 为什么:
  当打手处于冻结状态(rejected)时,管理员对其执行调级操作因未携带 freezeReason 触发了冻结原因校验错误,导致调级失败。
- 验证方式:
  运行 npm run check(671 项测试全绿,类型与构建检查通过)。
This commit is contained in:
yml2213
2026-10-10 13:51:58 +08:00
parent 85fc2eaa7c
commit 2d727a6797
3 changed files with 19 additions and 2 deletions
@@ -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)
@@ -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 必填错误',
)
})