- 做了什么: 1. 新增数据库迁移 098_worker_level_lock.sql,在 worker_users 表增加 is_level_locked、level_locked_at、level_locked_reason、level_locked_by 字段; 2. 后端自动升级函数 maybeUpgradeWorkerLevelWithClient 和判定函数 shouldApplyAutomaticWorkerLevel 增加 is_level_locked 守卫,被锁定的打手跳过自动升级; 3. 后台打手审核调级服务 reviewAdminWorkerUser 支持等级锁定参数与变更记录,人工调级时自动写入 worker_level_logs 流水,并提供 updateAdminWorkerLevelLock 专用接口; 4. 前端打手列表等级列展示「已锁定」状态及 Tooltip 原因,调级弹窗支持「锁定自动升级」开关与原因输入,操作列提供「解除限制」快捷操作; 5. 打手详情抽屉补充展示等级锁定说明。 - 为什么: 解决打手被人工调整等级(如 VIP5 调至 VIP4)后,因历史累计完成单数满足门槛导致后续结算再次自动升级回高等级的问题,并支持后续随时解除限制恢复自动升级。 - 验证方式: 1. 后端新增 shouldApplyAutomaticWorkerLevel 与 mapWorkerUser 单元测试,运行 npm run check(670 测试全过,类型与 SQL guard 验证通过); 2. 前端新增 worker-level-lock.test.ts 单元测试,运行 npm run check(130 测试全过,typecheck 与 build 验证通过)。
34 lines
980 B
TypeScript
34 lines
980 B
TypeScript
import assert from 'node:assert/strict'
|
|
import test from 'node:test'
|
|
|
|
import type { WorkerUser } from '../src/types/worker-platform.ts'
|
|
|
|
test('WorkerUser 类型支持等级锁定及审计字段', () => {
|
|
const worker: Partial<WorkerUser> = {
|
|
workerId: 101,
|
|
isLevelLocked: true,
|
|
levelLockedReason: '人工调整至VIP4',
|
|
levelLockedAt: '2026-10-10T12:00:00.000Z',
|
|
levelLockedBy: 'admin',
|
|
}
|
|
|
|
assert.equal(worker.isLevelLocked, true)
|
|
assert.equal(worker.levelLockedReason, '人工调整至VIP4')
|
|
assert.equal(worker.levelLockedBy, 'admin')
|
|
})
|
|
|
|
test('WorkerUser 未锁定时锁定字段为 false 或空', () => {
|
|
const worker: Partial<WorkerUser> = {
|
|
workerId: 102,
|
|
isLevelLocked: false,
|
|
levelLockedReason: '',
|
|
levelLockedAt: null,
|
|
levelLockedBy: '',
|
|
}
|
|
|
|
assert.equal(worker.isLevelLocked, false)
|
|
assert.equal(worker.levelLockedReason, '')
|
|
assert.equal(worker.levelLockedAt, null)
|
|
assert.equal(worker.levelLockedBy, '')
|
|
})
|