fix: 修复移动端我的订单卡片与搜索栏Flex样式异常

This commit is contained in:
yml2213
2026-08-16 11:14:33 +08:00
parent 0270657f2b
commit 27bcb7dd68
7 changed files with 430 additions and 77 deletions
@@ -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,
+11
View File
@@ -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)