fix: quota display shows stale cumulative usage after daily/weekly reset
The quota reset mechanism is lazy — quota_daily_used/quota_weekly_used in the database are only reset on the next IncrementQuotaUsed call. The scheduling layer (IsQuotaExceeded) correctly checks period expiry before enforcing limits, so the account remains usable. However, the API response mapper reads the raw DB value without checking expiry, causing the frontend to display cumulative usage (e.g. 110%) even after the reset period has passed. Add IsDailyQuotaPeriodExpired/IsWeeklyQuotaPeriodExpired methods and use them in the mapper to return used=0 when the period has expired.
This commit is contained in:
@@ -276,11 +276,17 @@ func AccountFromServiceShallow(a *service.Account) *Account {
|
||||
if limit := a.GetQuotaDailyLimit(); limit > 0 {
|
||||
out.QuotaDailyLimit = &limit
|
||||
used := a.GetQuotaDailyUsed()
|
||||
if a.IsDailyQuotaPeriodExpired() {
|
||||
used = 0
|
||||
}
|
||||
out.QuotaDailyUsed = &used
|
||||
}
|
||||
if limit := a.GetQuotaWeeklyLimit(); limit > 0 {
|
||||
out.QuotaWeeklyLimit = &limit
|
||||
used := a.GetQuotaWeeklyUsed()
|
||||
if a.IsWeeklyQuotaPeriodExpired() {
|
||||
used = 0
|
||||
}
|
||||
out.QuotaWeeklyUsed = &used
|
||||
}
|
||||
// 固定时间重置配置
|
||||
|
||||
@@ -1543,6 +1543,24 @@ func isPeriodExpired(periodStart time.Time, dur time.Duration) bool {
|
||||
return time.Since(periodStart) >= dur
|
||||
}
|
||||
|
||||
// IsDailyQuotaPeriodExpired 检查日配额周期是否已过期(用于显示层判断是否需要将 used 归零)
|
||||
func (a *Account) IsDailyQuotaPeriodExpired() bool {
|
||||
start := a.getExtraTime("quota_daily_start")
|
||||
if a.GetQuotaDailyResetMode() == "fixed" {
|
||||
return a.isFixedDailyPeriodExpired(start)
|
||||
}
|
||||
return isPeriodExpired(start, 24*time.Hour)
|
||||
}
|
||||
|
||||
// IsWeeklyQuotaPeriodExpired 检查周配额周期是否已过期(用于显示层判断是否需要将 used 归零)
|
||||
func (a *Account) IsWeeklyQuotaPeriodExpired() bool {
|
||||
start := a.getExtraTime("quota_weekly_start")
|
||||
if a.GetQuotaWeeklyResetMode() == "fixed" {
|
||||
return a.isFixedWeeklyPeriodExpired(start)
|
||||
}
|
||||
return isPeriodExpired(start, 7*24*time.Hour)
|
||||
}
|
||||
|
||||
// IsQuotaExceeded 检查 API Key 账号配额是否已超限(任一维度超限即返回 true)
|
||||
func (a *Account) IsQuotaExceeded() bool {
|
||||
// 总额度
|
||||
|
||||
Reference in New Issue
Block a user