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 }; 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 UpdateAsync([FromBody] UpdateBudgetDto dto) { try { var budget = await budgetService.GetByIdAsync(dto.Id); if (budget == null) return "预算不存在".Fail(); budget.Name = dto.Name; budget.Type = dto.Type; budget.Limit = dto.Limit; budget.Category = dto.Category; budget.SelectedCategories = dto.SelectedCategories != null ? string.Join(",", dto.SelectedCategories) : string.Empty; budget.IsStopped = dto.IsStopped; if (dto.StartDate.HasValue) { budget.StartDate = dto.StartDate.Value; } var success = await budgetService.UpdateAsync(budget); return success ? BaseResponse.Done() : "更新预算失败".Fail(); } catch (Exception ex) { logger.LogError(ex, "更新预算失败, Id: {Id}", dto.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(); } } }