fix: 修复移动端我的订单卡片与搜索栏Flex样式异常
This commit is contained in:
@@ -680,6 +680,83 @@ export async function countWorkerAcceptedOrders(workerId: number | string): Prom
|
||||
return Number(result.rows[0]?.total || 0)
|
||||
}
|
||||
|
||||
export async function listWorkerCompletionLeaderboard(input: {
|
||||
limit: number
|
||||
currentWorkerId: number
|
||||
}): Promise<
|
||||
Array<{
|
||||
rank: number
|
||||
workerId: number
|
||||
displayName: string
|
||||
levelName: string
|
||||
acceptedOrderCount: number
|
||||
}>
|
||||
> {
|
||||
const limit = Math.min(50, Math.max(1, Math.floor(Number(input.limit || 10))))
|
||||
const result = await query<{
|
||||
rank: number
|
||||
worker_id: number
|
||||
display_name: string
|
||||
level_name: string | null
|
||||
accepted_order_count: number
|
||||
}>(
|
||||
`
|
||||
WITH accepted_totals AS (
|
||||
SELECT
|
||||
worker_id,
|
||||
SUM(accepted_order_count)::int AS accepted_order_count,
|
||||
MAX(last_accepted_at) AS last_accepted_at
|
||||
FROM (
|
||||
SELECT
|
||||
assigned_worker_id AS worker_id,
|
||||
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'
|
||||
GROUP BY assigned_worker_id
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
worker_id,
|
||||
COALESCE(SUM(quantity), 0)::int AS accepted_order_count,
|
||||
MAX(accepted_at) AS last_accepted_at
|
||||
FROM work_order_shares
|
||||
WHERE status = 'accepted'
|
||||
GROUP BY worker_id
|
||||
) AS accepted_records
|
||||
GROUP BY worker_id
|
||||
),
|
||||
ranked_workers AS (
|
||||
SELECT
|
||||
ROW_NUMBER() OVER (
|
||||
ORDER BY totals.accepted_order_count DESC, totals.last_accepted_at DESC NULLS LAST, wu.id ASC
|
||||
)::int AS rank,
|
||||
wu.id AS worker_id,
|
||||
COALESCE(NULLIF(wu.display_name, ''), wu.username) AS display_name,
|
||||
wl.name AS level_name,
|
||||
totals.accepted_order_count
|
||||
FROM worker_users wu
|
||||
INNER JOIN accepted_totals totals ON totals.worker_id = wu.id
|
||||
LEFT JOIN worker_levels wl ON wl.id = wu.level_id
|
||||
WHERE wu.status = 'active'
|
||||
)
|
||||
SELECT rank, worker_id, display_name, level_name, accepted_order_count
|
||||
FROM ranked_workers
|
||||
WHERE rank <= $1 OR worker_id = $2
|
||||
ORDER BY rank ASC
|
||||
`,
|
||||
[limit, Number(input.currentWorkerId)],
|
||||
)
|
||||
return result.rows.map((row) => ({
|
||||
rank: Number(row.rank || 0),
|
||||
workerId: Number(row.worker_id || 0),
|
||||
displayName: String(row.display_name || '').trim(),
|
||||
levelName: String(row.level_name || '').trim(),
|
||||
acceptedOrderCount: Number(row.accepted_order_count || 0),
|
||||
}))
|
||||
}
|
||||
|
||||
export async function maybeUpgradeWorkerLevelWithClient(
|
||||
client: PoolClient,
|
||||
workerId: number,
|
||||
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
createWorkerWithdrawRequest,
|
||||
getWorkerProfile,
|
||||
getWorkerSessionSummary,
|
||||
getWorkerHallLeaderboard,
|
||||
grabWorkerHallOrder,
|
||||
joinWorkerSharingOrder,
|
||||
listWorkerProfileFinanceRequests,
|
||||
@@ -187,6 +188,16 @@ router.get(
|
||||
}),
|
||||
)
|
||||
|
||||
router.get(
|
||||
'/hall/leaderboard',
|
||||
requireActiveWorker,
|
||||
createRouteHandler((req) => getWorkerHallLeaderboard(getRequiredWorkerSession(req)), {
|
||||
successMessage: 'ok',
|
||||
errorMessage: '读取接单排行榜失败',
|
||||
scope: '[worker/hall/leaderboard]',
|
||||
}),
|
||||
)
|
||||
|
||||
router.post(
|
||||
'/hall/orders/:workOrderId/grab',
|
||||
requireActiveWorker,
|
||||
|
||||
@@ -44,6 +44,7 @@ import {
|
||||
listAllWorkCategories,
|
||||
listPendingMaterialWorkOrdersByPlatformOrderId,
|
||||
listWorkerFinanceRequests,
|
||||
listWorkerCompletionLeaderboard,
|
||||
listWorkerSharesByWorker,
|
||||
listWorkerWalletLedgers,
|
||||
listWorkerWorkOrderNotes,
|
||||
@@ -841,6 +842,22 @@ export async function listWorkerHallOrders(query: JsonObject = {}, session: Work
|
||||
}
|
||||
}
|
||||
|
||||
export async function getWorkerHallLeaderboard(session: WorkerSession) {
|
||||
requireActiveWorkerSession(session)
|
||||
const entries = await listWorkerCompletionLeaderboard({
|
||||
limit: 10,
|
||||
currentWorkerId: session.workerId,
|
||||
})
|
||||
const current = entries.find((entry) => entry.workerId === session.workerId)
|
||||
return {
|
||||
items: entries.filter((entry) => entry.rank <= 10),
|
||||
current: {
|
||||
rank: current?.rank || null,
|
||||
acceptedOrderCount: current?.acceptedOrderCount || 0,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
export async function grabWorkerHallOrder(workOrderId: number | string, session: WorkerSession) {
|
||||
requireActiveWorkerSession(session)
|
||||
const worker = await getRequiredWorker(session.workerId)
|
||||
|
||||
Reference in New Issue
Block a user