修复接单注册审核与拼单状态校验
This commit is contained in:
@@ -7,6 +7,7 @@ export type WorkerSmsCodeRow = {
|
||||
code_hash: string
|
||||
expires_at: string
|
||||
consumed_at: string | null
|
||||
failed_attempt_count: number
|
||||
created_at: string
|
||||
}
|
||||
|
||||
@@ -61,6 +62,29 @@ export async function consumeWorkerSmsCode(
|
||||
return result.rows[0] || null
|
||||
}
|
||||
|
||||
/** 记录错误验证码尝试,达到上限后立即锁定该验证码。 */
|
||||
export async function recordWorkerSmsCodeFailure(
|
||||
codeId: number,
|
||||
now: string,
|
||||
maxAttempts: number,
|
||||
): Promise<WorkerSmsCodeRow | null> {
|
||||
const result = await query<WorkerSmsCodeRow>(
|
||||
`
|
||||
UPDATE worker_sms_codes
|
||||
SET
|
||||
failed_attempt_count = COALESCE(failed_attempt_count, 0) + 1,
|
||||
consumed_at = CASE
|
||||
WHEN COALESCE(failed_attempt_count, 0) + 1 >= $3 THEN $2
|
||||
ELSE consumed_at
|
||||
END
|
||||
WHERE id = $1 AND consumed_at IS NULL
|
||||
RETURNING *
|
||||
`,
|
||||
[codeId, now, Math.max(1, Math.floor(maxAttempts))],
|
||||
)
|
||||
return result.rows[0] || null
|
||||
}
|
||||
|
||||
export async function countWorkerSmsCodesOnDay(
|
||||
phone: string,
|
||||
dayStartIso: string,
|
||||
|
||||
@@ -184,7 +184,7 @@ export async function getWorkOrderShare(
|
||||
): Promise<WorkOrderShareRow | null> {
|
||||
const result = await query<WorkOrderShareRow>(
|
||||
`${WORK_ORDER_SHARE_SELECT}
|
||||
WHERE wos.work_order_id = $1 AND wos.worker_id = $2 LIMIT 1`,
|
||||
WHERE wos.work_order_id = $1 AND wos.worker_id = $2 AND wos.status != 'cancelled' LIMIT 1`,
|
||||
[Number(workOrderId), Number(workerId)],
|
||||
)
|
||||
return result.rows[0] || null
|
||||
@@ -2394,7 +2394,10 @@ export async function acceptWorkOrderShareAndSettle(input: {
|
||||
`UPDATE work_order_shares SET status = 'accepted', accepted_at = $1, updated_at = $1 WHERE id = $2`,
|
||||
[input.now, input.shareId],
|
||||
)
|
||||
const progressResult = await client.query<{ joined_quantity: number; unfinished_count: number }>(
|
||||
const progressResult = await client.query<{
|
||||
joined_quantity: number
|
||||
unfinished_count: number
|
||||
}>(
|
||||
`SELECT COALESCE(SUM(quantity), 0)::int AS joined_quantity,
|
||||
COUNT(*) FILTER (WHERE status != 'accepted' AND status != 'cancelled')::int AS unfinished_count
|
||||
FROM work_order_shares WHERE work_order_id = $1 AND status != 'cancelled'`,
|
||||
@@ -3195,9 +3198,11 @@ function buildWorkOrderWhere({
|
||||
AND wo.acceptance_json->>'evidenceStatus' = 'pending'
|
||||
AND NULLIF(wo.acceptance_json->>'evidenceDueAt', '')::timestamptz > NOW()
|
||||
`
|
||||
if (normalizedStatuses.length > 0) {
|
||||
if (normalizedStatuses.length > 0) {
|
||||
params.push(normalizedStatuses)
|
||||
filters.push(`(${useOperationalStatus ? adminOperationalStatusExpression() : 'wo.status'} = ANY($${params.length}::text[]) OR (${vipEvidencePendingWhere}))`)
|
||||
filters.push(
|
||||
`(${useOperationalStatus ? adminOperationalStatusExpression() : 'wo.status'} = ANY($${params.length}::text[]) OR (${vipEvidencePendingWhere}))`,
|
||||
)
|
||||
} else {
|
||||
filters.push(`(${vipEvidencePendingWhere})`)
|
||||
}
|
||||
@@ -3210,7 +3215,9 @@ function buildWorkOrderWhere({
|
||||
`${workerOrderStatusExpression(`$${params.length}`)} = ANY(${statusesPlaceholder}::text[])`,
|
||||
)
|
||||
} else {
|
||||
filters.push(`${useOperationalStatus ? adminOperationalStatusExpression() : 'wo.status'} = ANY(${statusesPlaceholder}::text[])`)
|
||||
filters.push(
|
||||
`${useOperationalStatus ? adminOperationalStatusExpression() : 'wo.status'} = ANY(${statusesPlaceholder}::text[])`,
|
||||
)
|
||||
}
|
||||
}
|
||||
if (workOrderId) {
|
||||
|
||||
Reference in New Issue
Block a user