Skip to content

feat: 标签详情页支持按月/年/全部时间维度筛选统计 (#461) - #463

Open
TNT-Likely wants to merge 1 commit into
mainfrom
claude/github-issue-461-fcac93
Open

feat: 标签详情页支持按月/年/全部时间维度筛选统计 (#461)#463
TNT-Likely wants to merge 1 commit into
mainfrom
claude/github-issue-461-fcac93

Conversation

@TNT-Likely

Copy link
Copy Markdown
Owner

Closes #461

需求

标签详情页目前只能看到该标签下所有历史数据的总和(会统计到 20 年前),无法像「洞察」页那样按时间维度分析近期开销。本 PR 为标签详情页增加 月 / 年 / 全部 三档时间筛选,统计卡片与关联交易列表共用同一范围。

方案

Repository 层

  • getTagStats / watchTransactionsByTag 增加可选 start/end 参数,半开区间 [start, end),不传 = 全部历史(现有调用方零改动)
  • 共享账本 synthetic tag(负 id)分支同步支持范围过滤

页面层

  • Header 底部新增 CapsuleSwitcher(月/年/全部,复用洞察页 l10n,零新增 key);月/年视角显示可点的周期标签,弹与洞察页一致的轮盘选择器
  • 周期口径与洞察页对齐:periodForLabel / yearRangeFor,支持自定义每月起始日
  • 页面统计/交易 provider 改 autoDispose:family 参数含时间范围,切换周期后旧范围的 drift watch 订阅及时释放

设计决策(可讨论)

  1. 默认「全部」:保持旧行为零回归,从标签管理列表(显示总笔数)点进来数字对得上;issue 的核心诉求是「能切换」
  2. 月/年取完整周期(不像洞察页截断到「今天」):洞察截断是为图表不画空白天;这里是统计+列表,完整周期让周期内的预记账可见,「全部」视角也不会切掉未来交易
  3. 顺手修复:旧 watchTransactionsByTag 手写 SQL 映射漏掉 currencyCode/nativeAmount/categorySyncIdOverride 等列,外币交易在标签详情列表会显示原币金额而非折算金额;改为 drift join + readTable 全字段映射,并补了回归测试

测试

  • 新增 test/repositories/tag_stats_range_test.dart(7 测):范围边界(含 start 不含 end)、无范围回归、excludeFromStats 口径、ledgerId 组合、字段映射回归、共享 synthetic tag 范围过滤
  • 新增 test/widgets/tag_detail_scope_filter_test.dart:默认全部 → 切月 → 切年 → 切回全部,统计与列表笔数逐一断言
  • 全量 flutter test:647 passed;flutter analyze 改动文件零告警

真机验证(iOS 模拟器 iPhone 16 Pro Max,真实字体渲染)

造数:本月 2 支出 1 收入 + 今年 3 月 1 笔 + 2006 年 1 笔,全部挂「旅行」标签

视角 预期 实测
全部 5 笔 / 支出 493.4 / 收入 500 ✅ 一致
月(2026-08) 3 笔 / 398.4 / 500,label「2026-08▾」 ✅ 一致
年(2026) 4 笔 / 486.4 / 500,label「2026▾」 ✅ 一致
轮盘选 2026-03 1 笔 / 88 / 0,列表仅剩 3 月交易 ✅ 一致

胶囊 + 周期标签一行排布无溢出;「全部」视角不显示周期标签。Android 端未实测(同一套 Flutter 布局,组件均为现有组件)。

- getTagStats / watchTransactionsByTag 增加可选 [start, end) 半开区间过滤,
  共享账本 synthetic tag 分支同步支持
- 标签详情页 header 底部新增 月/年/全部 胶囊切换 + 周期选择器(轮盘),
  周期口径与洞察页一致(periodForLabel/yearRangeFor,支持自定义每月起始日);
  默认「全部」保持旧行为,统计卡片与交易列表共用同一范围
- watchTransactionsByTag 改用 drift join 全字段映射,修复旧手写映射漏掉
  currencyCode/nativeAmount/categorySyncIdOverride 导致外币交易显示错误的隐患
- 页面统计/交易 provider 改 autoDispose,切换周期后旧范围的 watch 订阅及时释放
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

建议标签详情页支持按“月/年/全部”等时间维度筛选统计数据

1 participant