Files
hfb_sys/frontend/src/features/admin/api/adminDashboard.ts
T
yml2213 87d252bbee feat(dashboard): 增加极品专区与保险成交统计
- 仪表盘新增今日极品专区、保险8%、保险4%成交数量
- 展示近7日每日成交趋势和明细
- 按已支付订单口径统计,补充回归测试
2026-11-06 19:09:35 +08:00

148 lines
3.7 KiB
TypeScript

import { apiClient } from '@/shared/api/client'
import type { ApiResponse } from '@/shared/types/types'
import type { DisputeStatus, OrderStatus } from '@/shared/types/status'
export interface DashboardMetrics {
total_users: number
verified_users: number
total_listings: number
published_listings: number
total_orders: number
renting_orders: number
today_orders: number
today_ledger_amount_cent: number
}
export interface DashboardPending {
listing_reviews: number
disputes: number
pending_handoffs: number
pending_return_confirms: number
}
export interface ListingDayStats {
date: string
published_count: number
active_offline_count: number
trade_leave_count: number
}
export interface ListingChannelDayStats extends ListingDayStats {
source_channel: string
}
export interface ListingDailyOverview {
today: ListingDayStats
trend: ListingDayStats[]
today_channels: ListingChannelDayStats[]
channel_trend: ListingChannelDayStats[]
today_uploaders: ListingUploaderDayStats[]
uploader_trend: ListingUploaderDayStats[]
days: number
timezone: string
}
export interface TradingDayStats {
date: string
premium_order_count: number
insurance_8_order_count: number
insurance_4_order_count: number
}
export interface TradingDailyOverview {
today: TradingDayStats
trend: TradingDayStats[]
days: number
timezone: string
}
export interface ListingUploaderDayStats {
date: string
uploader_id: number
uploader_name: string
upload_count: number
}
export interface DashboardRecentOrder {
id: number
order_no: string
title: string
renter_id: number
owner_id: number
status: OrderStatus
rent_amount_cent: number
deposit_amount_cent: number
created_at: string
}
export interface DashboardRecentDispute {
id: number
order_id: number
order_no: string
title: string
type: string
status: DisputeStatus
initiator_id: number
created_at: string
}
export interface ManualEntryTodayStats {
admin_id: number
admin_name: string
count: number
}
export interface AdminDashboard {
metrics: DashboardMetrics
pending: DashboardPending
listing_daily: ListingDailyOverview
trading_daily: TradingDailyOverview
manual_entry_today: ManualEntryTodayStats[]
recent_orders: DashboardRecentOrder[]
recent_disputes: DashboardRecentDispute[]
generated_at: string
}
const emptyDayStats = (): ListingDayStats => ({
date: '',
published_count: 0,
active_offline_count: 0,
trade_leave_count: 0,
})
const emptyTradingDayStats = (): TradingDayStats => ({
date: '',
premium_order_count: 0,
insurance_8_order_count: 0,
insurance_4_order_count: 0,
})
export async function fetchAdminDashboard() {
const { data } = await apiClient.get<ApiResponse<AdminDashboard>>('/admin/dashboard')
const payload = data.data
const listingDaily = payload.listing_daily
const tradingDaily = payload.trading_daily
return {
...payload,
listing_daily: {
today: listingDaily?.today ?? emptyDayStats(),
trend: listingDaily?.trend ?? [],
today_channels: listingDaily?.today_channels ?? [],
channel_trend: listingDaily?.channel_trend ?? [],
today_uploaders: listingDaily?.today_uploaders ?? [],
uploader_trend: listingDaily?.uploader_trend ?? [],
days: listingDaily?.days ?? 7,
timezone: listingDaily?.timezone ?? 'Asia/Shanghai',
},
trading_daily: {
today: tradingDaily?.today ?? emptyTradingDayStats(),
trend: tradingDaily?.trend ?? [],
days: tradingDaily?.days ?? 7,
timezone: tradingDaily?.timezone ?? 'Asia/Shanghai',
},
manual_entry_today: payload.manual_entry_today ?? [],
recent_orders: payload.recent_orders ?? [],
recent_disputes: payload.recent_disputes ?? [],
}
}