fix: 修复统计图表不显示与对比上月Infinity问题

- 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 确保数据字段为数字
This commit is contained in:
2026-06-03 11:30:41 +08:00
parent db81ad8eb2
commit 9162b2c87c
3 changed files with 117 additions and 41 deletions

View File

@@ -57,7 +57,7 @@
canvasId="categoryChart"
type="pie"
:chartData="categoryChartData"
:width="600"
:width="650"
:height="400"
/>
<view class="chart-legend">
@@ -90,7 +90,7 @@
canvasId="trendChart"
type="line"
:chartData="trendChartData"
:width="600"
:width="650"
:height="400"
/>
<view class="trend-list">
@@ -149,9 +149,9 @@ const categoryChartData = computed(() => {
series: [{
data: categoryStats.value.map(item => ({
name: item.name,
value: item.amount / 100,
color: item.color
}))
value: item.amount / 100
})),
color: categoryStats.value.map(item => item.color)
}],
extra: {
pie: {
@@ -174,9 +174,9 @@ const trendChartData = computed(() => {
categories: trendData.value.map(p => p.date.slice(8) + '日'),
series: [{
name: tabType.value === 'expense' ? '支出' : '收入',
data: trendData.value.map(p => p.amount / 100),
color: '#FF8C69'
data: trendData.value.map(p => p.amount / 100)
}],
color: ['#FF8C69'],
extra: {
line: {
type: 'curve',
@@ -187,6 +187,15 @@ const trendChartData = computed(() => {
opacity: 0.2,
gradient: true
}
},
xAxis: {
disableGrid: true,
rotateLabel: true,
rotateAngle: -45
},
yAxis: {
gridColor: '#F0E0D6',
data: [{ min: 0 }]
}
}
})
@@ -204,7 +213,8 @@ const monthCompareText = computed(() => {
if (!prevMonthData.value) return ''
const current = tabType.value === 'expense' ? overview.value.expense : overview.value.income
const prev = tabType.value === 'expense' ? prevMonthData.value.expense : prevMonthData.value.income
if (prev === 0) return '无上月数据'
// 处理 prev 为 0、null、undefined 的情况,避免除零产生 Infinity
if (!prev) return '无上月数据'
const pct = Math.round(((current - prev) / prev) * 100)
if (pct > 0) return `+${pct}%`
if (pct < 0) return `${pct}%`
@@ -275,7 +285,13 @@ async function fetchPrevMonthData() {
const [y, m] = currentMonth.value.split('-').map(Number)
const prevMonth = m === 1 ? `${y - 1}-12` : `${y}-${String(m - 1).padStart(2, '0')}`
const data = await getOverview({ month: prevMonth })
prevMonthData.value = data
// 确保数据字段是数字类型,避免 null/undefined 导致 Infinity
prevMonthData.value = {
expense: Number(data?.expense) || 0,
income: Number(data?.income) || 0,
count: Number(data?.count) || 0,
daily: Number(data?.daily) || 0
}
} catch {
prevMonthData.value = null
}