using Application.Dto.Statistics; using Service.Transaction; namespace Application; /// /// 交易统计应用服务接口 /// public interface ITransactionStatisticsApplication { // === 新统一接口(推荐使用) === /// /// 按日期范围获取每日统计(新统一接口) /// Task> GetDailyStatisticsByRangeAsync(DateTime startDate, DateTime endDate, string? savingClassify = null); /// /// 按日期范围获取汇总统计(新统一接口) /// Task GetSummaryByRangeAsync(DateTime startDate, DateTime endDate); /// /// 按日期范围获取分类统计(新统一接口) /// Task> GetCategoryStatisticsByRangeAsync(DateTime startDate, DateTime endDate, TransactionType type); /// /// 获取趋势统计数据 /// Task> GetTrendStatisticsAsync(int startYear, int startMonth, int monthCount); // === 旧接口(保留用于向后兼容,建议迁移到新接口) === [Obsolete("请使用 GetDailyStatisticsByRangeAsync")] Task> GetDailyStatisticsAsync(int year, int month); [Obsolete("请使用 GetDailyStatisticsByRangeAsync")] Task> GetWeeklyStatisticsAsync(DateTime startDate, DateTime endDate); [Obsolete("请使用 GetSummaryByRangeAsync")] Task GetRangeStatisticsAsync(DateTime startDate, DateTime endDate); [Obsolete("请使用 GetSummaryByRangeAsync")] Task GetMonthlyStatisticsAsync(int year, int month); [Obsolete("请使用 GetCategoryStatisticsByRangeAsync")] Task> GetCategoryStatisticsAsync(int year, int month, TransactionType type); [Obsolete("请使用 GetCategoryStatisticsByRangeAsync")] Task> GetCategoryStatisticsByDateRangeAsync(string startDate, string endDate, TransactionType type); Task<(List list, int total)> GetReasonGroupsAsync(int pageIndex, int pageSize); } /// /// 交易统计应用服务实现 /// public class TransactionStatisticsApplication( ITransactionStatisticsService statisticsService, IConfigService configService ) : ITransactionStatisticsApplication { // === 新统一接口实现 === /// /// 按日期范围获取每日统计(新统一接口) /// public async Task> GetDailyStatisticsByRangeAsync(DateTime startDate, DateTime endDate, string? savingClassify = null) { // 如果未指定 savingClassify,从配置读取 savingClassify ??= await configService.GetConfigByKeyAsync("SavingsCategories"); var statistics = await statisticsService.GetDailyStatisticsByRangeAsync(startDate, endDate, savingClassify); return statistics.Select(s => new DailyStatisticsDto( DateTime.Parse(s.Key).Day, s.Value.count, s.Value.expense, s.Value.income, s.Value.saving )).ToList(); } /// /// 按日期范围获取汇总统计(新统一接口) /// public async Task GetSummaryByRangeAsync(DateTime startDate, DateTime endDate) { return await statisticsService.GetSummaryByRangeAsync(startDate, endDate); } /// /// 按日期范围获取分类统计(新统一接口) /// public async Task> GetCategoryStatisticsByRangeAsync(DateTime startDate, DateTime endDate, TransactionType type) { return await statisticsService.GetCategoryStatisticsByDateRangeAsync(startDate, endDate, type); } // === 旧接口实现(保留用于向后兼容) === public async Task> GetDailyStatisticsAsync(int year, int month) { var savingClassify = await configService.GetConfigByKeyAsync("SavingsCategories"); var statistics = await statisticsService.GetDailyStatisticsAsync(year, month, savingClassify); return statistics.Select(s => new DailyStatisticsDto( DateTime.Parse(s.Key).Day, // 从完整日期字符串 "yyyy-MM-dd" 中提取 day s.Value.count, s.Value.expense, s.Value.income, s.Value.saving )).ToList(); } public async Task> GetWeeklyStatisticsAsync(DateTime startDate, DateTime endDate) { var savingClassify = await configService.GetConfigByKeyAsync("SavingsCategories"); var statistics = await statisticsService.GetDailyStatisticsByRangeAsync(startDate, endDate, savingClassify); return statistics.Select(s => new DailyStatisticsDto( DateTime.Parse(s.Key).Day, // 从完整日期字符串 "yyyy-MM-dd" 中提取 day s.Value.count, s.Value.expense, s.Value.income, s.Value.saving )).ToList(); } public async Task GetRangeStatisticsAsync(DateTime startDate, DateTime endDate) { var records = await statisticsService.GetDailyStatisticsByRangeAsync(startDate, endDate, null); var totalExpense = records.Sum(r => r.Value.expense); var totalIncome = records.Sum(r => r.Value.income); var totalCount = records.Sum(r => r.Value.count); var expenseCount = records.Count(r => r.Value.expense > 0); var incomeCount = records.Count(r => r.Value.income > 0); return new MonthlyStatistics { Year = startDate.Year, Month = startDate.Month, TotalExpense = totalExpense, TotalIncome = totalIncome, Balance = totalIncome - totalExpense, ExpenseCount = expenseCount, IncomeCount = incomeCount, TotalCount = totalCount }; } public async Task GetMonthlyStatisticsAsync(int year, int month) { return await statisticsService.GetMonthlyStatisticsAsync(year, month); } public async Task> GetCategoryStatisticsAsync(int year, int month, TransactionType type) { return await statisticsService.GetCategoryStatisticsAsync(year, month, type); } public async Task> GetCategoryStatisticsByDateRangeAsync(string startDate, string endDate, TransactionType type) { var start = DateTime.Parse(startDate); var end = DateTime.Parse(endDate); return await statisticsService.GetCategoryStatisticsByDateRangeAsync(start, end, type); } public async Task> GetTrendStatisticsAsync(int startYear, int startMonth, int monthCount) { return await statisticsService.GetTrendStatisticsAsync(startYear, startMonth, monthCount); } public async Task<(List list, int total)> GetReasonGroupsAsync(int pageIndex, int pageSize) { return await statisticsService.GetReasonGroupsAsync(pageIndex, pageSize); } }