增加每日接单排行榜

This commit is contained in:
yml2213
2026-08-19 18:55:04 +08:00
parent ca34187b0b
commit 7b92d6b219
8 changed files with 65 additions and 15 deletions
@@ -960,6 +960,7 @@ export async function countWorkerAcceptedOrders(workerId: number | string): Prom
export async function listWorkerCompletionLeaderboard(input: {
limit: number
currentWorkerId: number
period?: 'all' | 'daily'
}): Promise<
Array<{
rank: number
@@ -970,6 +971,7 @@ export async function listWorkerCompletionLeaderboard(input: {
}>
> {
const limit = Math.min(50, Math.max(1, Math.floor(Number(input.limit || 10))))
const dailyOnly = input.period === 'daily'
const result = await query<{
rank: number
worker_id: number
@@ -978,7 +980,12 @@ export async function listWorkerCompletionLeaderboard(input: {
accepted_order_count: number
}>(
`
WITH accepted_totals AS (
WITH leaderboard_day AS (
SELECT
date_trunc('day', CURRENT_TIMESTAMP AT TIME ZONE 'Asia/Shanghai')
AT TIME ZONE 'Asia/Shanghai' AS starts_at
),
accepted_totals AS (
SELECT
worker_id,
SUM(accepted_order_count)::int AS accepted_order_count,
@@ -989,7 +996,13 @@ export async function listWorkerCompletionLeaderboard(input: {
COUNT(*)::int AS accepted_order_count,
MAX(accepted_at) AS last_accepted_at
FROM work_orders
WHERE assigned_worker_id IS NOT NULL AND status = 'accepted'
CROSS JOIN leaderboard_day
WHERE assigned_worker_id IS NOT NULL
AND status = 'accepted'
AND (
$3::boolean = false
OR (accepted_at >= leaderboard_day.starts_at AND accepted_at < leaderboard_day.starts_at + INTERVAL '1 day')
)
GROUP BY assigned_worker_id
UNION ALL
@@ -999,7 +1012,12 @@ export async function listWorkerCompletionLeaderboard(input: {
COALESCE(SUM(quantity), 0)::int AS accepted_order_count,
MAX(accepted_at) AS last_accepted_at
FROM work_order_shares
CROSS JOIN leaderboard_day
WHERE status = 'accepted'
AND (
$3::boolean = false
OR (accepted_at >= leaderboard_day.starts_at AND accepted_at < leaderboard_day.starts_at + INTERVAL '1 day')
)
GROUP BY worker_id
) AS accepted_records
GROUP BY worker_id
@@ -1023,7 +1041,7 @@ export async function listWorkerCompletionLeaderboard(input: {
WHERE rank <= $1 OR worker_id = $2
ORDER BY rank ASC
`,
[limit, Number(input.currentWorkerId)],
[limit, Number(input.currentWorkerId), dailyOnly],
)
return result.rows.map((row) => ({
rank: Number(row.rank || 0),