fix
All checks were successful
Docker Build & Deploy / Build Docker Image (push) Successful in 39s
Docker Build & Deploy / Deploy to Production (push) Successful in 12s
Docker Build & Deploy / Cleanup Dangling Images (push) Successful in 1s
Docker Build & Deploy / WeChat Notification (push) Successful in 2s

This commit is contained in:
孙诚
2026-01-16 23:18:04 +08:00
parent 14bbd62262
commit c74ce24727
8 changed files with 207 additions and 74 deletions

View File

@@ -58,6 +58,7 @@ public class BudgetService(
Category = c.Category,
SelectedCategories = c.SelectedCategories,
NoLimit = c.NoLimit,
IsMandatoryExpense = c.IsMandatoryExpense,
Description = c.Description,
PeriodStart = periodRange.start,
PeriodEnd = periodRange.end,
@@ -206,7 +207,8 @@ public class BudgetService(
Limit = budget.Limit,
Category = budget.Category,
SelectedCategories = selectedCategories,
StartDate = new DateTime(referenceDate.Year, referenceDate.Month, 1)
StartDate = new DateTime(referenceDate.Year, referenceDate.Month, 1),
IsMandatoryExpense = budget.IsMandatoryExpense
}, referenceDate);
if (budget.Type == statType)
{
@@ -254,6 +256,7 @@ public class BudgetService(
Category = b.Category,
SelectedCategories = b.SelectedCategories,
NoLimit = b.NoLimit,
IsMandatoryExpense = b.IsMandatoryExpense,
Description = b.Description
}).ToArray();
@@ -437,7 +440,40 @@ public class BudgetService(
var referenceDate = now ?? DateTime.Now;
var (startDate, endDate) = GetPeriodRange(budget.StartDate, budget.Type, referenceDate);
return await budgetRepository.GetCurrentAmountAsync(budget, startDate, endDate);
var actualAmount = await budgetRepository.GetCurrentAmountAsync(budget, startDate, endDate);
// 如果是硬性消费,且是当前年当前月,则根据经过的天数累加
if (actualAmount == 0
&& budget.IsMandatoryExpense
&& referenceDate.Year == startDate.Year
&& referenceDate.Month == startDate.Month)
{
if (budget.Type == BudgetPeriodType.Month)
{
// 计算本月的天数
var daysInMonth = DateTime.DaysInMonth(referenceDate.Year, referenceDate.Month);
// 计算当前已经过的天数(包括今天)
var daysElapsed = referenceDate.Day;
// 根据预算金额和经过天数计算应累加的金额
var mandatoryAccumulation = budget.Limit * daysElapsed / daysInMonth;
// 返回实际消费和硬性消费累加中的较大值
return mandatoryAccumulation;
}
else if (budget.Type == BudgetPeriodType.Year)
{
// 计算本年的天数(考虑闰年)
var daysInYear = DateTime.IsLeapYear(referenceDate.Year) ? 366 : 365;
// 计算当前已经过的天数(包括今天)
var daysElapsed = referenceDate.DayOfYear;
// 根据预算金额和经过天数计算应累加的金额
var mandatoryAccumulation = budget.Limit * daysElapsed / daysInYear;
// 返回实际消费和硬性消费累加中的较大值
return mandatoryAccumulation;
}
}
return actualAmount;
}
internal static (DateTime start, DateTime end) GetPeriodRange(DateTime startDate, BudgetPeriodType type, DateTime referenceDate)
@@ -793,6 +829,7 @@ public record BudgetResult
public DateTime? PeriodStart { get; set; }
public DateTime? PeriodEnd { get; set; }
public bool NoLimit { get; set; } = false;
public bool IsMandatoryExpense { get; set; } = false;
public string Description { get; set; } = string.Empty;
public static BudgetResult FromEntity(
@@ -825,6 +862,7 @@ public record BudgetResult
PeriodStart = start,
PeriodEnd = end,
NoLimit = entity.NoLimit,
IsMandatoryExpense = entity.IsMandatoryExpense,
Description = description
};
}