namespace Repository; public interface IBudgetRepository : IBaseRepository { Task GetCurrentAmountAsync(BudgetRecord budget, DateTime startDate, DateTime endDate); Task UpdateBudgetCategoryNameAsync(string oldName, string newName, TransactionType type); } public class BudgetRepository(IFreeSql freeSql) : BaseRepository(freeSql), IBudgetRepository { public async Task GetCurrentAmountAsync(BudgetRecord budget, DateTime startDate, DateTime endDate) { var query = FreeSql.Select() .Where(t => t.OccurredAt >= startDate && t.OccurredAt <= endDate); if (!string.IsNullOrEmpty(budget.SelectedCategories)) { var categoryList = budget.SelectedCategories.Split(','); query = query.Where(t => categoryList.Contains(t.Classify)); } if (budget.Category == BudgetCategory.Expense) { query = query.Where(t => t.Type == TransactionType.Expense); } else if (budget.Category == BudgetCategory.Income) { query = query.Where(t => t.Type == TransactionType.Income); } return await query.SumAsync(t => t.Amount); } public async Task UpdateBudgetCategoryNameAsync(string oldName, string newName, TransactionType type) { var records = await FreeSql.Select() .Where(b => b.SelectedCategories.Contains(oldName) && ((type == TransactionType.Expense && b.Category == BudgetCategory.Expense) || (type == TransactionType.Income && b.Category == BudgetCategory.Income))) .ToListAsync(); foreach (var record in records) { var categories = record.SelectedCategories.Split(',').ToList(); for (int i = 0; i < categories.Count; i++) { if (categories[i] == oldName) { categories[i] = newName; } } record.SelectedCategories = string.Join(',', categories); } await FreeSql.Update() .SetSource(records) .ExecuteAffrowsAsync(); } }