diff --git a/internal/dao/bundleExtend.go b/internal/dao/bundleExtend.go index 98758ff..3db056e 100644 --- a/internal/dao/bundleExtend.go +++ b/internal/dao/bundleExtend.go @@ -695,6 +695,31 @@ inner join ( return min(limit, remaining) } + //计算每个季度发放的数目 + qua := func(total, limit int) int { + var released int // 已释放的次数 + if v.StartAt.Month() == now.Month() && v.StartAt.Year() == now.Year() { + } else if v.StartAt.Day() >= 16 { //第一个月释放的 + released += (limit + 1) / 2 + } else { + released += limit + } + interval := max((now.Year()*12+int(now.Month())-(v.StartAt.Year()*12+int(v.StartAt.Month())))/3, 1) // 释放了多少个季度 + released += max(interval-1, 0) * limit // 已经释放的数量 + remaining := max(total-released, 0) // 还剩余多少次没有发放 + if v.StartAt.Month() == now.Month() && v.StartAt.Year() == now.Year() && v.StartAt.Day() >= 16 { // 本月为第一个月并且16号后购买只给一半(向上取整) + return min((limit+1)/2, remaining) + } + if v.ExpiredAt.Month() == now.Month() && v.ExpiredAt.Year() == now.Year() && v.ExpiredAt.Day() < 16 { // 本月为最后一个季度第一个月并且16号前到期只给一半(向下取整) + return min(limit/2, remaining) + } + monthDiff := now.Year()*12 + int(now.Month()) - (v.StartAt.Year()*12 + int(v.StartAt.Month())) + if monthDiff%3 == 0 && v.ExpiredAt.Month() != now.Month() { + return min(limit, remaining) + } + return 0 + } + // 当月过期的视频数 v.MonthlyInvalidBundleVideoNumber = v.MonthlyBundleLimitExpiredVideoNumber - v.MonthlyBundleLimitExpiredVideoConsumptionNumber // 历史失效的套餐权益视频总数 @@ -757,13 +782,13 @@ inner join ( v.MonthlyIncreaseLimitDataAnalysisNumber = v.MonthlyIncreaseLimitDataAnalysisNumber - v.MonthlyIncreaseLimitDataAnalysisConsumptionNumber + cal(v.IncreaseLimitDataAnalysisNumber, v.MonthlyLimitDataAnalysisQuotaNumber) // 当月套餐限制类会过期型竞品数可使用额度 - v.MonthlyBundleLimitExpiredCompetitiveNumber = cal(v.BundleLimitCompetitiveExpiredNumber, v.MonthlyLimitCompetitiveQuotaNumber) + v.MonthlyBundleLimitExpiredCompetitiveNumber = qua(v.BundleLimitCompetitiveExpiredNumber, v.MonthlyLimitCompetitiveQuotaNumber) // 当月增值限制类会过期型竞品数可使用额度 - v.MonthlyIncreaseLimitExpiredCompetitiveNumber = cal(v.IncreaseLimitCompetitiveExpiredNumber, v.MonthlyLimitCompetitiveQuotaNumber) + v.MonthlyIncreaseLimitExpiredCompetitiveNumber = qua(v.IncreaseLimitCompetitiveExpiredNumber, v.MonthlyLimitCompetitiveQuotaNumber) // 当月套餐限制类型竞品数可使用额度 - v.MonthlyBundleLimitCompetitiveNumber = v.MonthlyBundleLimitCompetitiveNumber - v.MonthlyBundleLimitCompetitiveConsumptionNumber + cal(v.BundleLimitCompetitiveNumber, v.MonthlyLimitCompetitiveQuotaNumber) + v.MonthlyBundleLimitCompetitiveNumber = v.MonthlyBundleLimitCompetitiveNumber - v.MonthlyBundleLimitCompetitiveConsumptionNumber + qua(v.BundleLimitCompetitiveNumber, v.MonthlyLimitCompetitiveQuotaNumber) // 当月增值限制类型竞品数可使用额度 - v.MonthlyIncreaseLimitCompetitiveNumber = v.MonthlyIncreaseLimitCompetitiveNumber - v.MonthlyIncreaseLimitCompetitiveConsumptionNumber + cal(v.IncreaseLimitCompetitiveNumber, v.MonthlyLimitCompetitiveQuotaNumber) + v.MonthlyIncreaseLimitCompetitiveNumber = v.MonthlyIncreaseLimitCompetitiveNumber - v.MonthlyIncreaseLimitCompetitiveConsumptionNumber + qua(v.IncreaseLimitCompetitiveNumber, v.MonthlyLimitCompetitiveQuotaNumber) // 重置单月消耗数量 //视频 @@ -805,6 +830,8 @@ inner join ( v.Month = month v.ID = 0 + v.CreatedAt = time.Time{} + v.UpdatedAt = time.Time{} app.ModuleClients.BundleDB.Create(&v) } return nil