- ChartWrapper: 添加 type 属性修复 uCharts 不渲染 - ChartWrapper: 使用 pixelRatio=1 避免双重缩放导致字体线条过大 - ChartWrapper: 统一 fontSize/fontColor/padding 配置 - ChartWrapper: 挂载时保存实例引用避免异步回调中 getCurrentInstance 返回 undefined - stats: Number() 强制类型转换避免字符串导致 Infinity - stats: !prev 宽松判断覆盖 null/undefined/0 除零情况 - stores: fetchOverview/fetchCategoryStats/fetchTrend 确保数据字段为数字
60 lines
1.9 KiB
TypeScript
60 lines
1.9 KiB
TypeScript
import { defineStore } from 'pinia'
|
|
import { ref } from 'vue'
|
|
import * as api from '@/api/stats'
|
|
import { getCurrentMonth } from '@/utils/format'
|
|
|
|
// 重新导出类型以保持向后兼容
|
|
export type Overview = api.Overview
|
|
export type CategoryStat = api.CategoryStat
|
|
export type TrendPoint = api.TrendPoint
|
|
|
|
export const useStatsStore = defineStore('stats', () => {
|
|
const overview = ref<api.Overview>({ expense: 0, income: 0, count: 0, daily: 0 })
|
|
const categoryStats = ref<api.CategoryStat[]>([])
|
|
const trendData = ref<api.TrendPoint[]>([])
|
|
|
|
async function fetchOverview(month?: string) {
|
|
try {
|
|
const data = await api.getOverview({ month: month || getCurrentMonth() })
|
|
// 确保数据字段是数字类型
|
|
overview.value = {
|
|
expense: Number(data?.expense) || 0,
|
|
income: Number(data?.income) || 0,
|
|
count: Number(data?.count) || 0,
|
|
daily: Number(data?.daily) || 0
|
|
}
|
|
} catch {
|
|
overview.value = { expense: 0, income: 0, count: 0, daily: 0 }
|
|
}
|
|
}
|
|
|
|
async function fetchCategoryStats(month?: string, type: string = 'expense') {
|
|
try {
|
|
const data = await api.getCategoryStats(month || getCurrentMonth(), type)
|
|
// 确保返回的是数组,且金额是数字
|
|
categoryStats.value = Array.isArray(data) ? data.map(item => ({
|
|
...item,
|
|
amount: Number(item.amount) || 0,
|
|
count: Number(item.count) || 0
|
|
})) : []
|
|
} catch {
|
|
categoryStats.value = []
|
|
}
|
|
}
|
|
|
|
async function fetchTrend(month?: string, type: string = 'expense') {
|
|
try {
|
|
const data = await api.getTrend(month || getCurrentMonth(), type)
|
|
// 确保返回的是数组,且金额是数字
|
|
trendData.value = Array.isArray(data) ? data.map(item => ({
|
|
...item,
|
|
amount: Number(item.amount) || 0
|
|
})) : []
|
|
} catch {
|
|
trendData.value = []
|
|
}
|
|
}
|
|
|
|
return { overview, categoryStats, trendData, fetchOverview, fetchCategoryStats, fetchTrend }
|
|
})
|