namespace Service.Budget; public interface IBudgetSavingsService { Task GetSavingsDtoAsync( BudgetPeriodType periodType, DateTime? referenceDate = null, IEnumerable? existingBudgets = null); } public class BudgetSavingsService( IBudgetRepository budgetRepository, IBudgetArchiveRepository budgetArchiveRepository ) : IBudgetSavingsService { public async Task GetSavingsDtoAsync( BudgetPeriodType periodType, DateTime? referenceDate = null, IEnumerable? existingBudgets = null) { var budgets = existingBudgets; if (existingBudgets == null) { budgets = await budgetRepository.GetAllAsync(); } if (budgets == null) { throw new InvalidOperationException("No budgets found."); } budgets = budgets // 排序顺序 1.硬性预算 2.月度->年度 3.实际金额倒叙 .OrderBy(b => b.IsMandatoryExpense) .ThenBy(b => b.Type) .ThenByDescending(b => b.Limit); var year = referenceDate?.Year ?? DateTime.Now.Year; var month = referenceDate?.Month ?? DateTime.Now.Month; if(periodType == BudgetPeriodType.Month) { return await GetForMonthAsync(budgets, year, month); } else if(periodType == BudgetPeriodType.Year) { return await GetForYearAsync(budgets, year); } throw new NotSupportedException($"Period type {periodType} is not supported."); } private async Task GetForMonthAsync( IEnumerable budgets, int year, int month) { var result = new BudgetResult { }; var monthlyBudgets = budgets .Where(b => b.Type == BudgetPeriodType.Month); var yearlyBudgets = budgets .Where(b => b.Type == BudgetPeriodType.Year); // var actualAmount = await budgetRepository.GetCurrentAmountAsync(budget, startDate, endDate); throw new NotImplementedException(); } private async Task GetForYearAsync( IEnumerable budgets, int year) { throw new NotImplementedException(); } }