diff --git a/CHANGELOG.md b/CHANGELOG.md index f5fe496..e918dc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ 格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/), 版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。 +## [1.0.6] - 2026-01-08 + +### 修复 +- **数据分析页面总支出和大盘数据错误** - 修复数据分析页面与账单管理页面总支出不一致的问题 + - 原因:后端限制 `page_size` 最大为 100,但前端请求了 10000,导致只获取到部分数据 + - 解决:数据分析页面改为使用后端返回的聚合统计(`total_expense`),而不是前端计算,且关闭后端最大100的限制 + - 现在两个页面都使用相同的后端数据库聚合统计,确保数据一致性 + ## [1.0.5] - 2026-01-08 ### 优化 diff --git a/README.md b/README.md index 028b59d..ea6afde 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ 一个基于微服务架构的个人账单分析工具,支持微信和支付宝账单的自动解析、智能分类和可视化分析。 -![版本](https://img.shields.io/badge/版本-1.0.5-green) +![版本](https://img.shields.io/badge/版本-1.0.6-green) ![架构](https://img.shields.io/badge/架构-微服务-blue) ![Go](https://img.shields.io/badge/Go-1.21-00ADD8) ![Python](https://img.shields.io/badge/Python-3.12-3776AB) @@ -273,6 +273,7 @@ python server.py | 版本 | 日期 | 主要更新 | |------|------|----------| +| **v1.0.6** | 2026-01-08 | 🐛 修复数据分析页面总支出和大盘数据错误 | | **v1.0.5** | 2026-01-08 | 🐛 修复支付宝时间格式解析错误,修复WebHook编译错误 | | **v1.0.4** | 2026-01-13 | 🚀 Gitea Webhook 自动部署、零停机热更新 | | **v1.0.3** | 2026-01-13 | ✨ DateTimePicker 组件、收支分类动态切换 | diff --git a/server/config.yaml b/server/config.yaml index f3ff218..7512181 100644 --- a/server/config.yaml +++ b/server/config.yaml @@ -1,7 +1,7 @@ # BillAI 服务器配置文件 # 应用版本 -version: "1.0.5" +version: "1.0.6" # 服务配置 server: diff --git a/server/handler/bills.go b/server/handler/bills.go index 23eaedc..401e82e 100644 --- a/server/handler/bills.go +++ b/server/handler/bills.go @@ -58,9 +58,9 @@ func ListBills(c *gin.Context) { if req.PageSize < 1 { req.PageSize = 20 } - if req.PageSize > 100 { - req.PageSize = 100 // 限制最大每页数量 - } + // if req.PageSize > 100 { + // req.PageSize = 100 // 限制最大每页数量 + // } // 构建筛选条件 filter := make(map[string]interface{}) diff --git a/web/src/routes/analysis/+page.svelte b/web/src/routes/analysis/+page.svelte index 717ba1e..1fb324f 100644 --- a/web/src/routes/analysis/+page.svelte +++ b/web/src/routes/analysis/+page.svelte @@ -10,7 +10,6 @@ import AlertCircle from '@lucide/svelte/icons/alert-circle'; import Activity from '@lucide/svelte/icons/activity'; import RefreshCw from '@lucide/svelte/icons/refresh-cw'; - import Calendar from '@lucide/svelte/icons/calendar'; // 分析组件 import { @@ -58,6 +57,10 @@ let isDemo = $state(false); let serverAvailable = $state(true); + // 后端返回的聚合统计(准确的总支出/收入) + let backendTotalExpense = $state(0); + let backendTotalIncome = $state(0); + // 日期范围筛选 - 初始化为默认值 let startYear = $state(defaultDates.startYear); let startMonth = $state(defaultDates.startMonth); @@ -92,7 +95,14 @@ let allAnalysisRecords = $derived(isDemo ? demoRecords : toAnalysisRecords(allRecords)); // 全部数据用于每日趋势图 let categoryStats = $derived(calculateCategoryStats(analysisRecords)); let dailyExpenseData = $derived(calculateDailyExpenseData(analysisRecords)); - let totalStats = $derived(calculateTotalStats(analysisRecords)); + + // 使用后端返回的聚合统计(准确),如果没有则使用前端计算(作为后备) + let totalStats = $derived({ + expense: backendTotalExpense > 0 ? backendTotalExpense : calculateTotalStats(analysisRecords).expense, + income: backendTotalIncome > 0 ? backendTotalIncome : calculateTotalStats(analysisRecords).income, + count: analysisRecords.length, + }); + let pieChartData = $derived(calculatePieChartData(categoryStats, totalStats.expense)); let topExpenses = $derived(getTopExpenses(analysisRecords, 10)); @@ -138,6 +148,9 @@ // 处理账单数据 if (billsResponse.result && billsResponse.data) { records = billsResponse.data.bills || []; + // 使用后端返回的聚合统计(准确的总支出/收入) + backendTotalExpense = billsResponse.data.total_expense || 0; + backendTotalIncome = billsResponse.data.total_income || 0; if (records.length === 0) { errorMessage = '暂无账单数据'; }