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:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user