优化打手注册和列表筛选

This commit is contained in:
yml2213
2026-08-20 09:52:51 +08:00
parent f1575aec85
commit 12ca943170
14 changed files with 99 additions and 35 deletions
@@ -0,0 +1,12 @@
-- 短信验证码注册已完成手机号校验,历史遗留的待审核账号统一自动启用。
UPDATE worker_users
SET status = 'active',
review_note = CASE
WHEN BTRIM(review_note) = '' THEN '短信验证码注册自动启用'
ELSE review_note
END,
reviewed_at = COALESCE(reviewed_at, updated_at, NOW()),
updated_at = NOW()
WHERE status = 'pending_review';
COMMENT ON TABLE worker_users IS '打手账号,手机号验证码注册后自动启用;后台可冻结或调整状态';
@@ -284,6 +284,8 @@ export type ListInput = {
/** 后台待办跳转时按工单主键精确定位 */
workOrderId?: number
keyword?: string
/** 打手类型筛选:internal 内部打手 / external 外部打手 */
workerType?: string
workerId?: number
categoryId?: number
workerSharingId?: number
@@ -462,8 +462,9 @@ export async function listWorkerUsers({
pageSize = 20,
status = '',
keyword = '',
workerType = '',
}: ListInput = {}): Promise<{ items: WorkerUserRow[]; total: number }> {
const { whereClause, params } = buildWorkerUserWhere({ status, keyword })
const { whereClause, params } = buildWorkerUserWhere({ status, keyword, workerType })
const totalResult = await query<{ total: number }>(
`SELECT COUNT(*)::int AS total FROM worker_users wu ${whereClause}`,
params,
@@ -1174,7 +1175,8 @@ async function getWorkerFinanceRequestByIdWithClient(
function buildWorkerUserWhere({
status = '',
keyword = '',
}: Pick<ListInput, 'status' | 'keyword'>) {
workerType = '',
}: Pick<ListInput, 'status' | 'keyword' | 'workerType'>) {
const filters: string[] = []
const params: unknown[] = []
if (status) {
@@ -1187,6 +1189,10 @@ function buildWorkerUserWhere({
`(wu.username ILIKE $${params.length} OR wu.display_name ILIKE $${params.length} OR wu.phone ILIKE $${params.length})`,
)
}
if (workerType) {
params.push(workerType)
filters.push(`wu.worker_type = $${params.length}`)
}
return {
whereClause: filters.length > 0 ? `WHERE ${filters.join(' AND ')}` : '',
params,
@@ -305,8 +305,8 @@ router.post(
createJsonHandler(
(req) => reviewAdminWorkerUser(String(req.params.workerId || ''), req.body || {}),
{
successMessage: '打手审核状态已更新',
errorMessage: '审核打手失败',
successMessage: '打手账号状态已更新',
errorMessage: '更新打手账号状态失败',
scope: '[admin/worker-platform/workers/:workerId/review]',
audit: (req, data) => ({
action: 'worker_reviewed',
+1 -1
View File
@@ -70,7 +70,7 @@ router.post(
key: getBodyFieldRateLimitKey('phone'),
}),
createRouteHandler((req) => registerWorker(req.body || {}), {
successMessage: '注册成功,请等待后台审核',
successMessage: '注册成功,请使用手机号登录',
errorMessage: '接单账号注册失败',
scope: '[worker/auth/register]',
}),
@@ -893,6 +893,7 @@ export async function listAdminWorkerUsers(query: JsonObject = {}) {
pageSize,
status: String(query.status || '').trim(),
keyword: String(query.keyword || '').trim(),
workerType: String(query.workerType || query.worker_type || '').trim(),
})
const timeoutCounts = await countTimeoutEventsByWorkerIds(items.map((item) => Number(item.id)))
return {
@@ -328,7 +328,8 @@ export async function registerWorker(payload: JsonObject = {}) {
displayName,
phone,
levelId: defaults.level?.id || null,
status: 'pending_review',
// 手机号验证码已完成注册身份校验,账号直接启用,无需人工审核。
status: 'active',
inviterId: inviter ? Number(inviter.id) : null,
inviteCode: await generateInviteCode(now),
smsCodeId: latest!.id,
@@ -344,7 +345,8 @@ export async function registerWorker(payload: JsonObject = {}) {
return {
worker: mapWorkerUser(created),
reviewRequired: true,
// 保留字段兼容旧版客户端,但注册流程不再需要后台审核。
reviewRequired: false,
}
}
@@ -510,7 +512,7 @@ export function assertWorkerLoginAllowed(worker: WorkerUserRow) {
}
if (worker.status === 'pending_review') {
throw createHttpError('接单账号待审核,暂无法登录', {
throw createHttpError('接单账号待处理,暂无法登录', {
statusCode: 403,
errorCode: 'worker_pending_review',
})