= [
+ {
+ title: '排名',
+ dataIndex: 'rank',
+ width: 90,
+ render: (_, row) => (
+
+ {row.rank <= 3 ? `🏅 ${row.rank}` : row.rank}
+
+ ),
+ },
+ {
+ title: '打手',
+ dataIndex: 'displayName',
+ minWidth: 200,
+ render: (_, row) => (
+
+ {row.displayName || row.username}
+ {row.username}
+
+ ),
+ },
+ { title: '等级', dataIndex: 'levelName', width: 120, render: (value) => value || '-' },
+ {
+ title: '状态',
+ dataIndex: 'workerStatus',
+ width: 100,
+ render: (value: string) => (
+
+ {WORKER_STATUS_LABELS[value] || value}
+
+ ),
+ },
+ {
+ title: '完成单数',
+ dataIndex: 'acceptedOrderCount',
+ width: 110,
+ align: 'right',
+ sorter: (a, b) => a.acceptedOrderCount - b.acceptedOrderCount,
+ render: (value) => {value},
+ },
+ {
+ title: '奖励总额',
+ dataIndex: 'rewardAmount',
+ width: 120,
+ align: 'right',
+ render: (value: number) => formatMoney(value),
+ },
+ {
+ title: '最近完成',
+ dataIndex: 'lastAcceptedAt',
+ width: 170,
+ render: (value: string | null) => formatAdminDateTime(value),
+ },
+ ]
+
+ return (
+
+
+
+ setPeriod(value as AdminLeaderboardPeriod | 'custom')}
+ />
+ {period === 'custom' ? (
+ {
+ const [start, end] = dates || []
+ setRange(
+ start && end
+ ? [start.format(ADMIN_DATE_FORMAT), end.format(ADMIN_DATE_FORMAT)]
+ : null,
+ )
+ }}
+ disabledDate={(current) => current && current.isAfter(dayjs(), 'day')}
+ />
+ ) : null}
+
+
+ 按验收完成单数排名,同一订单的拼单份数只计入一单;奖励为所选时间段内验收奖励合计。
+ {period === 'custom'
+ ? range
+ ? ` 当前区间:${range[0]} 至 ${range[1]}(含起止日)。`
+ : ' 请选择统计区间。'
+ : ''}
+
+
+
+ rowKey="workerId"
+ columns={columns}
+ dataSource={items}
+ loading={leaderboardQuery.isLoading}
+ pagination={false}
+ scroll={{ x: 820 }}
+ />
+
+ )
+}
diff --git a/apps/frontend/src/services/admin/worker-platform.ts b/apps/frontend/src/services/admin/worker-platform.ts
index 75a3087b..0265a316 100644
--- a/apps/frontend/src/services/admin/worker-platform.ts
+++ b/apps/frontend/src/services/admin/worker-platform.ts
@@ -36,6 +36,37 @@ type WorkOrderVoucherConsumeResult = {
errorMessage: string
}
+export type AdminLeaderboardPeriod = 'all' | 'daily' | 'weekly' | 'monthly'
+
+export type AdminWorkerLeaderboardEntry = {
+ rank: number
+ workerId: number
+ username: string
+ displayName: string
+ levelName: string
+ workerStatus: string
+ acceptedOrderCount: number
+ rewardAmount: number
+ lastAcceptedAt: string | null
+}
+
+export function fetchAdminWorkerLeaderboard(
+ period: AdminLeaderboardPeriod,
+ limit = 50,
+ range?: { from: string; to: string },
+) {
+ return apiGet<{
+ period: AdminLeaderboardPeriod | 'custom'
+ from: string | null
+ to: string | null
+ items: AdminWorkerLeaderboardEntry[]
+ }>('/api/v1/admin/worker-platform/leaderboard', {
+ period,
+ limit,
+ ...(range ? { from: range.from, to: range.to } : {}),
+ })
+}
+
export function fetchAdminWorkerPlatformSummary() {
return apiGet<{
pendingWorkerCount: number