Files
datahub/frontend/src/stores/dashboard.ts
T

126 lines
3.5 KiB
TypeScript
Raw Normal View History

2026-03-20 14:19:32 +08:00
import { api } from '@/utils/request'
import type {
DashboardOverview,
DashboardTrendPoint,
DashboardTrendParams,
DashboardBreakdownItem,
DashboardBreakdownParams,
} from '@/types/api'
export const useDashboardStore = defineStore('dashboard', () => {
// ─── Overview ───
const overview = ref<DashboardOverview | null>(null)
const overviewLoading = ref(false)
const overviewError = ref('')
// ─── Trend ───
const trendData = ref<DashboardTrendPoint[]>([])
const trendLoading = ref(false)
const trendError = ref('')
const trendGroupBy = ref<'day' | 'week' | 'month'>('day')
const trendDataType = ref<string | undefined>(undefined)
const trendFrom = ref<string | undefined>(undefined)
const trendTo = ref<string | undefined>(undefined)
// ─── Breakdown ───
const breakdownData = ref<DashboardBreakdownItem[]>([])
const breakdownLoading = ref(false)
const breakdownError = ref('')
const breakdownDimension = ref<'company' | 'platform' | 'store'>('company')
const breakdownDataType = ref<string | undefined>(undefined)
const breakdownFrom = ref<string | undefined>(undefined)
const breakdownTo = ref<string | undefined>(undefined)
async function fetchOverview() {
overviewLoading.value = true
overviewError.value = ''
try {
overview.value = await api.get<DashboardOverview>('/api/v1/dashboard/overview')
} catch (err: unknown) {
const msg = err instanceof Error ? err.message : '获取概览数据失败'
overviewError.value = msg
message.error(msg)
} finally {
overviewLoading.value = false
}
}
async function fetchTrend() {
trendLoading.value = true
trendError.value = ''
try {
const params: DashboardTrendParams = {
group_by: trendGroupBy.value,
data_type: trendDataType.value,
from: trendFrom.value,
to: trendTo.value,
}
trendData.value = await api.get<DashboardTrendPoint[]>(
'/api/v1/dashboard/trend',
params as unknown as Record<string, unknown>,
)
} catch (err: unknown) {
const msg = err instanceof Error ? err.message : '获取趋势数据失败'
trendError.value = msg
message.error(msg)
} finally {
trendLoading.value = false
}
}
async function fetchBreakdown() {
breakdownLoading.value = true
breakdownError.value = ''
try {
const params: DashboardBreakdownParams = {
dimension: breakdownDimension.value,
data_type: breakdownDataType.value,
from: breakdownFrom.value,
to: breakdownTo.value,
}
breakdownData.value = await api.get<DashboardBreakdownItem[]>(
'/api/v1/dashboard/breakdown',
params as unknown as Record<string, unknown>,
)
} catch (err: unknown) {
const msg = err instanceof Error ? err.message : '获取分维度数据失败'
breakdownError.value = msg
message.error(msg)
} finally {
breakdownLoading.value = false
}
}
async function fetchAll() {
await Promise.allSettled([fetchOverview(), fetchTrend(), fetchBreakdown()])
}
return {
// Overview
overview,
overviewLoading,
overviewError,
// Trend
trendData,
trendLoading,
trendError,
trendGroupBy,
trendDataType,
trendFrom,
trendTo,
// Breakdown
breakdownData,
breakdownLoading,
breakdownError,
breakdownDimension,
breakdownDataType,
breakdownFrom,
breakdownTo,
// Actions
fetchOverview,
fetchTrend,
fetchBreakdown,
fetchAll,
}
})