fix
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 预算实际金额正确查询交易记录
|
||||
预算统计系统 SHALL 准确查询并汇总数据库中的交易记录,以计算预算的实际金额。
|
||||
|
||||
#### Scenario: 查询收入预算的交易记录
|
||||
- **WHEN** 系统计算收入类型预算的实际金额
|
||||
- **THEN** 系统 SHALL 查询 `TransactionRecord` 表
|
||||
- **AND** 查询条件 SHALL 包含:
|
||||
- 交易类型为 `Income`
|
||||
- 交易发生时间在预算的统计时间段内(`OccurredAt >= startDate AND OccurredAt <= endDate`)
|
||||
- 交易分类在预算的 `SelectedCategories` 列表中
|
||||
- **AND** 系统 SHALL 对符合条件的交易金额求和
|
||||
|
||||
#### Scenario: 查询支出预算的交易记录
|
||||
- **WHEN** 系统计算支出类型预算的实际金额
|
||||
- **THEN** 系统 SHALL 查询 `TransactionRecord` 表
|
||||
- **AND** 查询条件 SHALL 包含:
|
||||
- 交易类型为 `Expense`
|
||||
- 交易发生时间在预算的统计时间段内
|
||||
- 交易分类在预算的 `SelectedCategories` 列表中
|
||||
- **AND** 系统 SHALL 对符合条件的交易金额求和
|
||||
|
||||
### Requirement: 分类匹配逻辑正确
|
||||
系统 SHALL 正确匹配交易记录的分类字段与预算的 SelectedCategories。
|
||||
|
||||
#### Scenario: 分类字段完全匹配
|
||||
- **WHEN** 交易记录的 `Classify` 字段为 "家庭年终奖金"
|
||||
- **AND** 预算的 `SelectedCategories` 包含 "家庭年终奖金"
|
||||
- **THEN** 该交易记录 SHALL 被包含在实际金额计算中
|
||||
|
||||
#### Scenario: 分类字段不匹配
|
||||
- **WHEN** 交易记录的 `Classify` 字段为 "工资"
|
||||
- **AND** 预算的 `SelectedCategories` 不包含 "工资"
|
||||
- **THEN** 该交易记录 SHALL NOT 被包含在实际金额计算中
|
||||
|
||||
#### Scenario: SelectedCategories 为空字符串
|
||||
- **WHEN** 预算的 `SelectedCategories` 为空字符串或 null
|
||||
- **THEN** 系统 SHALL 不应用分类过滤
|
||||
- **AND** 所有符合时间和类型条件的交易记录 SHALL 被包含在计算中
|
||||
|
||||
### Requirement: 日期范围过滤正确
|
||||
系统 SHALL 使用正确的日期范围边界条件过滤交易记录。
|
||||
|
||||
#### Scenario: 交易在统计期间内
|
||||
- **WHEN** 交易的 `OccurredAt` 为 2026-02-10
|
||||
- **AND** 统计的 `startDate` 为 2026-02-01,`endDate` 为 2026-02-28
|
||||
- **THEN** 该交易记录 SHALL 被包含在实际金额计算中
|
||||
|
||||
#### Scenario: 交易在统计期间开始日
|
||||
- **WHEN** 交易的 `OccurredAt` 等于 `startDate`
|
||||
- **THEN** 该交易记录 SHALL 被包含在实际金额计算中(包含边界)
|
||||
|
||||
#### Scenario: 交易在统计期间结束日
|
||||
- **WHEN** 交易的 `OccurredAt` 等于 `endDate`
|
||||
- **THEN** 该交易记录 SHALL 被包含在实际金额计算中(包含边界)
|
||||
|
||||
#### Scenario: 交易在统计期间之前
|
||||
- **WHEN** 交易的 `OccurredAt` 早于 `startDate`
|
||||
- **THEN** 该交易记录 SHALL NOT 被包含在实际金额计算中
|
||||
|
||||
#### Scenario: 交易在统计期间之后
|
||||
- **WHEN** 交易的 `OccurredAt` 晚于 `endDate`
|
||||
- **THEN** 该交易记录 SHALL NOT 被包含在实际金额计算中
|
||||
|
||||
### Requirement: 年度统计汇总所有月份数据
|
||||
当计算年度预算统计时,系统 SHALL 正确汇总整年的交易数据。
|
||||
|
||||
#### Scenario: 计算年度收入实际金额
|
||||
- **WHEN** 系统计算某个收入预算的年度实际金额
|
||||
- **AND** 该预算的 `Type` 为 `Year`
|
||||
- **THEN** 系统 SHALL 汇总从当年 1 月 1 日到 12 月 31 日的所有符合条件的交易记录
|
||||
- **AND** 如果当前时间在年度中间,系统 SHALL 汇总从 1 月 1 日到当前日期的交易记录
|
||||
|
||||
#### Scenario: 月度预算在年度统计中的处理
|
||||
- **WHEN** 系统计算年度统计
|
||||
- **AND** 某个月度预算(`Type` 为 `Month`)存在归档数据
|
||||
- **THEN** 系统 SHALL 包含该月度预算在各个历史月份的归档实际金额
|
||||
- **AND** 系统 SHALL 累加所有历史月份的归档金额
|
||||
|
||||
### Requirement: 测试覆盖关键场景
|
||||
系统 SHALL 包含单元测试覆盖预算实际金额计算的关键场景。
|
||||
|
||||
#### Scenario: 测试覆盖收入预算计算
|
||||
- **WHEN** 运行单元测试套件
|
||||
- **THEN** SHALL 存在测试用例验证收入预算的实际金额计算
|
||||
- **AND** 测试用例 SHALL 包含多个交易记录,验证汇总逻辑
|
||||
|
||||
#### Scenario: 测试覆盖分类匹配
|
||||
- **WHEN** 运行单元测试套件
|
||||
- **THEN** SHALL 存在测试用例验证分类匹配逻辑
|
||||
- **AND** 测试用例 SHALL 包含匹配和不匹配的场景
|
||||
|
||||
#### Scenario: 测试覆盖日期范围
|
||||
- **WHEN** 运行单元测试套件
|
||||
- **THEN** SHALL 存在测试用例验证日期范围过滤
|
||||
- **AND** 测试用例 SHALL 包含边界条件(startDate, endDate, 期间内外)
|
||||
@@ -0,0 +1,67 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 存款计划明细按钮可见
|
||||
存款计划卡片 SHALL 在卡片头部的操作区域显示一个明细按钮,使用信息图标(info)表示。
|
||||
|
||||
#### Scenario: 用户查看存款计划卡片
|
||||
- **WHEN** 用户打开预算页面的"计划"标签
|
||||
- **THEN** 每个存款计划卡片的头部 SHALL 显示一个信息图标按钮
|
||||
- **AND** 该按钮 SHALL 位于"查询关联账单"按钮之后
|
||||
|
||||
### Requirement: 明细弹窗展示计划存款计算逻辑
|
||||
当用户点击明细按钮时,系统 SHALL 展示一个弹窗,清晰地说明计划存款金额的计算方式和数据来源。
|
||||
|
||||
#### Scenario: 用户点击明细按钮
|
||||
- **WHEN** 用户点击存款计划卡片上的明细按钮
|
||||
- **THEN** 系统 SHALL 打开一个全屏弹窗
|
||||
- **AND** 弹窗标题 SHALL 显示"计划存款明细"
|
||||
|
||||
### Requirement: 明细弹窗展示收入预算信息
|
||||
明细弹窗 SHALL 展示收入预算的汇总信息,包括总预算限额和实际收入金额。
|
||||
|
||||
#### Scenario: 查看收入预算信息
|
||||
- **WHEN** 明细弹窗打开
|
||||
- **THEN** 系统 SHALL 显示"收入预算"分组
|
||||
- **AND** 该分组 SHALL 包含以下信息:
|
||||
- 预算限额(所有收入预算的总和)
|
||||
- 实际收入(当前已实现的收入总额)
|
||||
|
||||
### Requirement: 明细弹窗展示支出预算信息
|
||||
明细弹窗 SHALL 展示支出预算的汇总信息,包括总预算限额和实际支出金额。
|
||||
|
||||
#### Scenario: 查看支出预算信息
|
||||
- **WHEN** 明细弹窗打开
|
||||
- **THEN** 系统 SHALL 显示"支出预算"分组
|
||||
- **AND** 该分组 SHALL 包含以下信息:
|
||||
- 预算限额(所有支出预算的总和)
|
||||
- 实际支出(当前已发生的支出总额)
|
||||
|
||||
### Requirement: 明细弹窗展示计划存款公式
|
||||
明细弹窗 SHALL 清晰展示计划存款的计算公式,帮助用户理解金额来源。
|
||||
|
||||
#### Scenario: 查看计划存款公式
|
||||
- **WHEN** 明细弹窗打开
|
||||
- **THEN** 系统 SHALL 显示计算公式:"计划存款 = 收入预算 - 支出预算"
|
||||
- **AND** 公式中的各项数值 SHALL 与上方展示的收入和支出预算数据一致
|
||||
|
||||
### Requirement: 明细弹窗展示实际存款和差额
|
||||
明细弹窗 SHALL 展示实际存款金额和与计划存款的差额。
|
||||
|
||||
#### Scenario: 查看实际存款信息
|
||||
- **WHEN** 明细弹窗打开
|
||||
- **THEN** 系统 SHALL 显示"实际存款"金额(从当前 budget 对象获取)
|
||||
- **AND** 系统 SHALL 显示"还差"金额,计算方式为:计划存款 - 实际存款
|
||||
- **AND** 如果实际存款超过计划,差额 SHALL 显示为 0
|
||||
|
||||
#### Scenario: 差额为负数时
|
||||
- **WHEN** 实际存款超过计划存款
|
||||
- **THEN** 系统 SHALL 将"还差"显示为 0
|
||||
- **AND** 系统 SHALL 使用成功色(绿色)高亮实际存款金额
|
||||
|
||||
### Requirement: 明细弹窗支持关闭
|
||||
用户 SHALL 能够随时关闭明细弹窗。
|
||||
|
||||
#### Scenario: 用户关闭弹窗
|
||||
- **WHEN** 用户点击弹窗外部区域或返回按钮
|
||||
- **THEN** 系统 SHALL 关闭明细弹窗
|
||||
- **AND** 用户 SHALL 返回到存款计划卡片视图
|
||||
Reference in New Issue
Block a user