Files
EmailBill/openspec/changes/fix-deposit-detail-empty/tasks.md
SunCheng 4cc205fc25 feat(budget): 实现存款明细计算核心逻辑
- 添加 BudgetItemCalculator 辅助类,实现明细项计算规则
  - 收入:实际>0取实际,否则取预算
  - 支出:取MAX(预算, 实际)
  - 硬性支出未发生:按天数折算
  - 归档数据:直接使用实际值

- 实现月度和年度存款核心公式
  - 月度:收入预算 + 本月年度收入 - 支出预算 - 本月年度支出
  - 年度:归档已实收 + 未来收入预算 - 归档已实支 - 未来支出预算

- 定义存款明细数据结构
  - SavingsDetail: 包含收入/支出明细列表和汇总
  - BudgetDetailItem: 预算明细项(含计算用金额、计算说明等)
  - SavingsCalculationSummary: 计算汇总信息

- 新增单元测试
  - BudgetItemCalculatorTest: 11个测试覆盖所有计算规则
  - BudgetSavingsCalculationTest: 6个测试验证核心公式

测试结果:所有测试通过 (366 passed, 0 failed)
2026-02-20 16:26:04 +08:00

1.3 KiB

1. 修改父组件传递数据

  • 1.1 在 Index.vue 中修改 SavingsBudgetContent 组件调用,添加 income-budgets 和 expense-budgets props
  • 1.2 验证数据传递正确(通过 Vue DevTools 检查 props)

2. 修改 SavingsBudgetContent 组件

  • 2.1 在 props 定义中添加 incomeBudgets 和 expenseBudgets 数组
  • 2.2 添加 matchedIncomeBudget 计算属性(根据 periodStart 和 type 匹配)
  • 2.3 添加 matchedExpenseBudget 计算属性(根据 periodStart 和 type 匹配)
  • 2.4 添加 incomeLimit 计算属性(从 matchedIncomeBudget 获取或默认 0)
  • 2.5 添加 incomeCurrent 计算属性(从 matchedIncomeBudget 获取或默认 0)
  • 2.6 添加 expenseLimit 计算属性(从 matchedExpenseBudget 获取或默认 0)
  • 2.7 添加 expenseCurrent 计算属性(从 matchedExpenseBudget 获取或默认 0)

3. 测试验证

  • 3.1 测试有对应收入和支出预算的存款计划,打开明细弹窗验证数据显示正确
  • 3.2 测试没有对应收入或支出预算的存款计划,验证弹窗显示 0 且不报错
  • 3.3 验证计划存款公式计算正确(收入预算 - 支出预算 = 计划存款)
  • 3.4 测试月度和年度两种类型的存款计划明细
  • 3.5 使用不同月份的存款计划测试,验证匹配逻辑正确