namespace WebApi.Controllers; [ApiController] [Route("api/[controller]/[action]")] public class BudgetController( IBudgetService budgetService, ILogger logger) : ControllerBase { /// /// 获取预算列表 /// [HttpGet] public async Task>> GetListAsync([FromQuery] DateTime? referenceDate = null) { try { var budgets = await budgetService.GetAllAsync(); var dtos = new List(); foreach (var budget in budgets) { var currentAmount = await budgetService.CalculateCurrentAmountAsync(budget, referenceDate); dtos.Add(BudgetDto.FromEntity(budget, currentAmount, referenceDate)); } return dtos.Ok(); } catch (Exception ex) { logger.LogError(ex, "获取预算列表失败"); return $"获取预算列表失败: {ex.Message}".Fail>(); } } /// /// 获取单个预算统计信息 /// [HttpGet] public async Task> GetStatisticsAsync([FromQuery] long id, [FromQuery] DateTime? referenceDate = null) { try { var budget = await budgetService.GetByIdAsync(id); if (budget == null) return "预算不存在".Fail(); var currentAmount = await budgetService.CalculateCurrentAmountAsync(budget, referenceDate); return BudgetDto.FromEntity(budget, currentAmount, referenceDate).Ok(); } catch (Exception ex) { logger.LogError(ex, "获取预算统计失败, Id: {Id}", id); return $"获取预算统计失败: {ex.Message}".Fail(); } } /// /// 创建预算 /// [HttpPost] public async Task> CreateAsync([FromBody] CreateBudgetDto dto) { try { var budget = new BudgetRecord { Name = dto.Name, Type = dto.Type, Limit = dto.Limit, Category = dto.Category, SelectedCategories = dto.SelectedCategories != null ? string.Join(",", dto.SelectedCategories) : string.Empty, StartDate = dto.StartDate ?? DateTime.Now, LastSync = DateTime.Now }; var success = await budgetService.AddAsync(budget); if (success) { return budget.Id.Ok(); } return "创建预算失败".Fail(); } catch (Exception ex) { logger.LogError(ex, "创建预算失败"); return $"创建预算失败: {ex.Message}".Fail(); } } /// /// 删除预算 /// [HttpDelete("{id}")] public async Task DeleteByIdAsync(long id) { try { var success = await budgetService.DeleteAsync(id); return success ? BaseResponse.Done() : "删除预算失败".Fail(); } catch (Exception ex) { logger.LogError(ex, "删除预算失败, Id: {Id}", id); return $"删除预算失败: {ex.Message}".Fail(); } } /// /// 切换预算暂停状态 /// [HttpPost] public async Task ToggleStopAsync([FromQuery] long id) { try { var success = await budgetService.ToggleStopAsync(id); return success ? BaseResponse.Done() : "操作失败".Fail(); } catch (Exception ex) { logger.LogError(ex, "切换预算状态失败, Id: {Id}", id); return $"操作失败: {ex.Message}".Fail(); } } /// /// 同步预算数据 /// [HttpPost] public async Task> SyncAsync([FromQuery] long id, [FromQuery] DateTime? referenceDate = null) { try { var budget = await budgetService.GetByIdAsync(id); if (budget == null) { return "预算不存在".Fail(); } budget.LastSync = DateTime.Now; await budgetService.UpdateAsync(budget); var currentAmount = await budgetService.CalculateCurrentAmountAsync(budget, referenceDate); return BudgetDto.FromEntity(budget, currentAmount, referenceDate).Ok(); } catch (Exception ex) { logger.LogError(ex, "同步预算失败, Id: {Id}", id); return $"同步失败: {ex.Message}".Fail(); } } }