3.0 KiB
3.0 KiB
MODIFIED Requirements
Requirement: Budget statistics API response includes complete data
预算统计 API (GET /api/budget/stats/{category}) SHALL 返回完整的统计数据,包括用于前端图表渲染的 Trend 数组和用于明细弹窗的 Description HTML 内容。
响应结构中的 Month 和 Year 对象 MUST 包含以下字段:
Limit: 预算限额Current: 当前实际金额Remaining: 剩余金额UsagePercentage: 使用百分比Trend: 每日/每月累计金额数组 (List<decimal?>)Description: HTML 格式的详细说明,包含计算公式和数据表格 (string)
Scenario: Monthly stats with trend data
- WHEN 客户端请求月度预算统计
GET /api/budget/stats/food?date=2026-02 - THEN 响应的
month对象包含trend数组,长度等于该月天数(如28/29/30/31) - AND
trend数组每个元素表示截至该天的累计金额(支出类为递减,收入类为递增) - AND
trend数组中未到达的日期对应的元素为null
Scenario: Monthly stats with description
- WHEN 客户端请求月度预算统计
GET /api/budget/stats/food?date=2026-02 - THEN 响应的
month对象包含description字段 - AND
description是 HTML 格式字符串,包含<table>标签展示明细数据 - AND
description包含计算公式说明(如"剩余 = 限额 - 已用")
Scenario: Yearly stats with trend data
- WHEN 客户端请求年度预算统计
GET /api/budget/stats/salary?date=2026 - THEN 响应的
year对象包含trend数组,长度为12(代表12个月) - AND
trend数组每个元素表示截至该月的累计金额 - AND
trend数组中未到达的月份对应的元素为null
Scenario: Yearly stats with description
- WHEN 客户端请求年度预算统计
GET /api/budget/stats/salary?date=2026 - THEN 响应的
year对象包含description字段 - AND
description是 HTML 格式字符串,包含年度统计明细
Requirement: DTO mapping preserves all Service layer data
Application 层的 BudgetApplication.GetCategoryStatsAsync 方法在将 Service 层的 BudgetStatsDto 映射到 API 响应 DTO 时,MUST 保留所有数据字段,不得丢失 Trend 和 Description。
Scenario: Mapping from Service DTO to API DTO
- WHEN
BudgetApplication.GetCategoryStatsAsync接收到 Service 层返回的BudgetStatsDto - THEN 映射后的
BudgetStatsDetail对象包含Trend字段,其值等于BudgetStatsDto.Month.Trend或BudgetStatsDto.Year.Trend - AND 映射后的
BudgetStatsDetail对象包含Description字段,其值等于BudgetStatsDto.Month.Description或BudgetStatsDto.Year.Description
Scenario: API response schema validation
- WHEN 前端调用
/api/budget/stats/{category}并解析 JSON 响应 - THEN TypeScript 类型检查不报错,响应对象符合
BudgetStatsResponse接口定义 - AND
month.trend和month.description字段存在且非undefined