feat: 优化预算管理界面,增强预算编辑功能,添加预算删除接口
All checks were successful
Docker Build & Deploy / Build Docker Image (push) Successful in 24s
Docker Build & Deploy / Deploy to Production (push) Successful in 7s
Docker Build & Deploy / Cleanup Dangling Images (push) Successful in 1s
Docker Build & Deploy / WeChat Notification (push) Successful in 1s

This commit is contained in:
孙诚
2026-01-07 19:19:53 +08:00
parent 851886a601
commit 35a856c6e3
5 changed files with 267 additions and 134 deletions

View File

@@ -16,7 +16,7 @@ public class BudgetController(
{
var budgets = await budgetService.GetAllAsync();
var dtos = new List<BudgetDto>();
foreach (var budget in budgets)
{
var currentAmount = await budgetService.CalculateCurrentAmountAsync(budget, referenceDate);
@@ -53,6 +53,24 @@ public class BudgetController(
}
}
/// <summary>
/// 删除预算
/// </summary>
[HttpDelete("{id}")]
public async Task<BaseResponse> 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();
}
}
/// <summary>
/// 创建预算
/// </summary>
@@ -71,6 +89,12 @@ public class BudgetController(
StartDate = dto.StartDate ?? DateTime.Now
};
var varidationError = await ValidateBudgetSelectedCategoriesAsync(budget);
if (!string.IsNullOrEmpty(varidationError))
{
return varidationError.Fail<long>();
}
var success = await budgetService.AddAsync(budget);
if (success)
{
@@ -85,24 +109,6 @@ public class BudgetController(
}
}
/// <summary>
/// 删除预算
/// </summary>
[HttpDelete("{id}")]
public async Task<BaseResponse> 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();
}
}
/// <summary>
/// 更新预算
/// </summary>
@@ -125,6 +131,12 @@ public class BudgetController(
budget.StartDate = dto.StartDate.Value;
}
var varidationError = await ValidateBudgetSelectedCategoriesAsync(budget);
if (!string.IsNullOrEmpty(varidationError))
{
return varidationError.Fail();
}
var success = await budgetService.UpdateAsync(budget);
return success ? BaseResponse.Done() : "更新预算失败".Fail();
}
@@ -135,6 +147,27 @@ public class BudgetController(
}
}
private async Task<string> ValidateBudgetSelectedCategoriesAsync(BudgetRecord record)
{
var allBudgets = await budgetService.GetAllAsync();
var recordSelectedCategories = record.SelectedCategories.Split(',', StringSplitOptions.RemoveEmptyEntries);
foreach (var budget in allBudgets)
{
var selectedCategories = budget.SelectedCategories.Split(',', StringSplitOptions.RemoveEmptyEntries);
if (budget.Id != record.Id)
{
if (budget.Category == record.Category &&
recordSelectedCategories.Intersect(selectedCategories).Any())
{
return $"和 {budget.Name} 存在分类冲突,请调整相关分类。";
}
}
}
return string.Empty;
}
/// <summary>
/// 切换预算暂停状态
/// </summary>

View File

@@ -12,6 +12,8 @@ public class BudgetDto
public bool IsStopped { get; set; }
public string StartDate { get; set; } = string.Empty;
public string Period { get; set; } = string.Empty;
public DateTime? PeriodStart { get; set; }
public DateTime? PeriodEnd { get; set; }
public static BudgetDto FromEntity(BudgetRecord entity, decimal currentAmount = 0, DateTime? referenceDate = null)
{
@@ -38,7 +40,9 @@ public class BudgetDto
BudgetPeriodType.Month => $"{start:yy}年第{start.Month}月",
BudgetPeriodType.Week => $"{start:yy}年第{System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(start, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday)}周",
_ => $"{start:yyyy-MM-dd} ~ {end:yyyy-MM-dd}"
}
},
PeriodStart = start,
PeriodEnd = end
};
}
}