diff --git a/internal/dao/bundleExtend.go b/internal/dao/bundleExtend.go index e72171d..282de8e 100644 --- a/internal/dao/bundleExtend.go +++ b/internal/dao/bundleExtend.go @@ -210,38 +210,38 @@ func AddBundleBalanceByUserId(data model.BundleBalanceUsePo) (usedType int, err return errors.New("当前未绑定账号") } if data.VideoNumber > 0 { - if oldData.MonthlyLimitVideoExpireNumber > oldData.MonthlyLimitVideoExpireConsumptionNumber { // 当月可使用的会过期的限制类型充足 - if oldData.BundleLimitVideoExpiredConsumptionNumber < oldData.BundleLimitVideoExpiredNumber { // 套餐内会过期的限制类型视频充足 - oldData.MonthlyLimitVideoExpireConsumptionNumber++ - oldData.BundleLimitVideoExpiredConsumptionNumber++ - oldData.MonthlyBundleVideoConsumptionNumber++ - usedType = 1 - goto Over - } - if oldData.IncreaseLimitVideoExpiredConsumptionNumber < oldData.IncreaseLimitVideoExpiredNumber { // 增值服务会过期的限制类型视频充足 - oldData.MonthlyLimitVideoExpireConsumptionNumber++ - oldData.IncreaseLimitVideoExpiredConsumptionNumber++ - oldData.MonthlyIncreaseVideoConsumptionNumber++ - usedType = 2 - goto Over - } + // 当月可使用的会过期的限制类型充足 + if oldData.BundleLimitVideoExpiredConsumptionNumber < cal(oldData, oldData.BundleLimitVideoExpiredNumber, oldData.MonthlyLimitVideoQuotaNumber, time.Now()) { // 套餐内会过期的限制类型视频充足 + oldData.MonthlyLimitVideoExpireConsumptionNumber++ + oldData.BundleLimitVideoExpiredConsumptionNumber++ + oldData.MonthlyBundleVideoConsumptionNumber++ + usedType = 1 + goto Over } - if oldData.MonthlyLimitVideoNumber > oldData.MonthlyLimitVideoConsumptionNumber { // 当月可使用的不过期的限制类型充足 - if oldData.BundleLimitVideoConsumptionNumber < oldData.BundleLimitVideoNumber { // 套餐内不过期的限制类型视频充足 - oldData.MonthlyLimitVideoConsumptionNumber++ - oldData.BundleLimitVideoConsumptionNumber++ - oldData.MonthlyBundleVideoConsumptionNumber++ - usedType = 1 - goto Over - } - if oldData.IncreaseLimitVideoConsumptionNumber < oldData.IncreaseLimitVideoNumber { // 增值服务不过期的限制类型视频充足 - oldData.MonthlyLimitVideoConsumptionNumber++ - oldData.IncreaseLimitVideoConsumptionNumber++ - oldData.MonthlyIncreaseVideoConsumptionNumber++ - usedType = 2 - goto Over - } + if oldData.IncreaseLimitVideoExpiredConsumptionNumber < cal(oldData, oldData.IncreaseLimitVideoExpiredNumber, oldData.MonthlyLimitVideoQuotaNumber, time.Now()) { // 增值服务会过期的限制类型视频充足 + oldData.MonthlyLimitVideoExpireConsumptionNumber++ + oldData.IncreaseLimitVideoExpiredConsumptionNumber++ + oldData.MonthlyIncreaseVideoConsumptionNumber++ + usedType = 2 + goto Over } + + // 当月可使用的不过期的限制类型充足 + if oldData.BundleLimitVideoConsumptionNumber < cal(oldData, oldData.BundleLimitVideoNumber, oldData.MonthlyLimitVideoQuotaNumber, time.Now()) { // 套餐内不过期的限制类型视频充足 + oldData.MonthlyLimitVideoConsumptionNumber++ + oldData.BundleLimitVideoConsumptionNumber++ + oldData.MonthlyBundleVideoConsumptionNumber++ + usedType = 1 + goto Over + } + if oldData.IncreaseLimitVideoConsumptionNumber < cal(oldData, oldData.IncreaseLimitVideoNumber, oldData.MonthlyLimitVideoQuotaNumber, time.Now()) { // 增值服务不过期的限制类型视频充足 + oldData.MonthlyLimitVideoConsumptionNumber++ + oldData.IncreaseLimitVideoConsumptionNumber++ + oldData.MonthlyIncreaseVideoConsumptionNumber++ + usedType = 2 + goto Over + } + if oldData.BundleVideoConsumptionNumber < oldData.BundleVideoNumber { //套餐内非限制类型的视频充足 oldData.BundleVideoConsumptionNumber++ oldData.MonthlyBundleVideoConsumptionNumber++ @@ -264,34 +264,34 @@ func AddBundleBalanceByUserId(data model.BundleBalanceUsePo) (usedType int, err } if data.ImageNumber > 0 { - if oldData.MonthlyLimitImageExpireNumber > oldData.MonthlyLimitImageExpireConsumptionNumber { // 当月可使用的会过期的限制类型充足 - if oldData.BundleLimitImageExpiredConsumptionNumber < oldData.BundleLimitImageExpiredNumber { // 套餐内会过期的限制类型图文充足 - oldData.MonthlyLimitImageExpireConsumptionNumber++ - oldData.BundleLimitImageExpiredConsumptionNumber++ - oldData.MonthlyBundleImageConsumptionNumber++ - goto Over - } - if oldData.IncreaseLimitImageExpiredConsumptionNumber < oldData.IncreaseLimitImageExpiredNumber { // 增值服务会过期的限制类型图文充足 - oldData.MonthlyLimitImageExpireConsumptionNumber++ - oldData.IncreaseLimitImageExpiredConsumptionNumber++ - oldData.MonthlyIncreaseImageConsumptionNumber++ - goto Over - } + // 当月可使用的会过期的限制类型充足 + if oldData.BundleLimitImageExpiredConsumptionNumber < cal(oldData, oldData.BundleLimitImageExpiredNumber, oldData.MonthlyLimitImageQuotaNumber, time.Now()) { // 套餐内会过期的限制类型图文充足 + oldData.MonthlyLimitImageExpireConsumptionNumber++ + oldData.BundleLimitImageExpiredConsumptionNumber++ + oldData.MonthlyBundleImageConsumptionNumber++ + goto Over } - if oldData.MonthlyLimitImageNumber > oldData.MonthlyLimitImageConsumptionNumber { // 当月可使用的不过期的限制类型充足 - if oldData.BundleLimitImageConsumptionNumber < oldData.BundleLimitImageNumber { // 套餐内不过期的限制类型图文充足 - oldData.MonthlyLimitImageConsumptionNumber++ - oldData.BundleLimitImageConsumptionNumber++ - oldData.MonthlyBundleImageConsumptionNumber++ - goto Over - } - if oldData.IncreaseLimitImageConsumptionNumber < oldData.IncreaseLimitImageNumber { // 增值服务不过期的限制类型图文充足 - oldData.MonthlyLimitImageConsumptionNumber++ - oldData.IncreaseLimitImageConsumptionNumber++ - oldData.MonthlyIncreaseImageConsumptionNumber++ - goto Over - } + if oldData.IncreaseLimitImageExpiredConsumptionNumber < cal(oldData, oldData.IncreaseLimitImageExpiredNumber, oldData.MonthlyLimitImageQuotaNumber, time.Now()) { // 增值服务会过期的限制类型图文充足 + oldData.MonthlyLimitImageExpireConsumptionNumber++ + oldData.IncreaseLimitImageExpiredConsumptionNumber++ + oldData.MonthlyIncreaseImageConsumptionNumber++ + goto Over } + + // 当月可使用的不过期的限制类型充足 + if oldData.BundleLimitImageConsumptionNumber < cal(oldData, oldData.BundleLimitImageNumber, oldData.MonthlyLimitImageQuotaNumber, time.Now()) { // 套餐内不过期的限制类型图文充足 + oldData.MonthlyLimitImageConsumptionNumber++ + oldData.BundleLimitImageConsumptionNumber++ + oldData.MonthlyBundleImageConsumptionNumber++ + goto Over + } + if oldData.IncreaseLimitImageConsumptionNumber < cal(oldData, oldData.IncreaseLimitImageNumber, oldData.MonthlyLimitImageQuotaNumber, time.Now()) { // 增值服务不过期的限制类型图文充足 + oldData.MonthlyLimitImageConsumptionNumber++ + oldData.IncreaseLimitImageConsumptionNumber++ + oldData.MonthlyIncreaseImageConsumptionNumber++ + goto Over + } + if oldData.BundleImageConsumptionNumber < oldData.BundleImageNumber { //套餐内非限制类型的图文充足 oldData.BundleImageConsumptionNumber++ oldData.MonthlyBundleImageConsumptionNumber++ @@ -311,34 +311,33 @@ func AddBundleBalanceByUserId(data model.BundleBalanceUsePo) (usedType int, err } if data.DataAnalysisNumber > 0 { - if oldData.MonthlyLimitDataAnalysisExpireNumber > oldData.MonthlyLimitDataAnalysisExpireConsumptionNumber { // 当月可使用的会过期的限制类型充足 - if oldData.BundleLimitDataAnalysisExpiredConsumptionNumber < oldData.BundleLimitDataAnalysisExpiredNumber { // 套餐内会过期的限制类型数据分析充足 - oldData.MonthlyLimitDataAnalysisExpireConsumptionNumber++ - oldData.BundleLimitDataAnalysisExpiredConsumptionNumber++ - oldData.MonthlyBundleDataAnalysisConsumptionNumber++ - goto Over - } - if oldData.IncreaseLimitDataAnalysisExpiredConsumptionNumber < oldData.IncreaseLimitDataAnalysisExpiredNumber { // 增值服务会过期的限制类型数据分析充足 - oldData.MonthlyLimitDataAnalysisExpireConsumptionNumber++ - oldData.IncreaseLimitDataAnalysisExpiredConsumptionNumber++ - oldData.MonthlyIncreaseDataAnalysisConsumptionNumber++ - goto Over - } + // 当月可使用的会过期的限制类型充足 + if oldData.BundleLimitDataAnalysisExpiredConsumptionNumber < cal(oldData, oldData.BundleLimitDataAnalysisExpiredNumber, oldData.MonthlyLimitDataAnalysisQuotaNumber, time.Now()) { // 套餐内会过期的限制类型数据分析充足 + oldData.MonthlyLimitDataAnalysisExpireConsumptionNumber++ + oldData.BundleLimitDataAnalysisExpiredConsumptionNumber++ + oldData.MonthlyBundleDataAnalysisConsumptionNumber++ + goto Over } - if oldData.MonthlyLimitDataAnalysisNumber > oldData.MonthlyLimitDataAnalysisConsumptionNumber { // 当月可使用的不过期的限制类型充足 - if oldData.BundleLimitDataAnalysisConsumptionNumber < oldData.BundleLimitDataAnalysisNumber { // 套餐内不过期的限制类型数据分析充足 - oldData.MonthlyLimitDataAnalysisConsumptionNumber++ - oldData.BundleLimitDataAnalysisConsumptionNumber++ - oldData.MonthlyBundleDataAnalysisConsumptionNumber++ - goto Over - } - if oldData.IncreaseLimitDataAnalysisConsumptionNumber < oldData.IncreaseLimitDataAnalysisNumber { // 增值服务不过期的限制类型数据分析充足 - oldData.MonthlyLimitDataAnalysisConsumptionNumber++ - oldData.IncreaseLimitDataAnalysisConsumptionNumber++ - oldData.MonthlyIncreaseDataAnalysisConsumptionNumber++ - goto Over - } + if oldData.IncreaseLimitDataAnalysisExpiredConsumptionNumber < cal(oldData, oldData.IncreaseLimitDataAnalysisExpiredNumber, oldData.MonthlyLimitDataAnalysisQuotaNumber, time.Now()) { // 增值服务会过期的限制类型数据分析充足 + oldData.MonthlyLimitDataAnalysisExpireConsumptionNumber++ + oldData.IncreaseLimitDataAnalysisExpiredConsumptionNumber++ + oldData.MonthlyIncreaseDataAnalysisConsumptionNumber++ + goto Over } + // 当月可使用的不过期的限制类型充足 + if oldData.BundleLimitDataAnalysisConsumptionNumber < cal(oldData, oldData.BundleLimitDataAnalysisNumber, oldData.MonthlyLimitDataAnalysisQuotaNumber, time.Now()) { // 套餐内不过期的限制类型数据分析充足 + oldData.MonthlyLimitDataAnalysisConsumptionNumber++ + oldData.BundleLimitDataAnalysisConsumptionNumber++ + oldData.MonthlyBundleDataAnalysisConsumptionNumber++ + goto Over + } + if oldData.IncreaseLimitDataAnalysisConsumptionNumber < cal(oldData, oldData.IncreaseLimitDataAnalysisNumber, oldData.MonthlyLimitDataAnalysisQuotaNumber, time.Now()) { // 增值服务不过期的限制类型数据分析充足 + oldData.MonthlyLimitDataAnalysisConsumptionNumber++ + oldData.IncreaseLimitDataAnalysisConsumptionNumber++ + oldData.MonthlyIncreaseDataAnalysisConsumptionNumber++ + goto Over + } + if oldData.BundleLimitDataAnalysisNumber < oldData.BundleDataAnalysisNumber { //套餐内非限制类型的数据分析充足 oldData.BundleLimitDataAnalysisNumber++ oldData.MonthlyBundleDataAnalysisConsumptionNumber++ @@ -648,3 +647,25 @@ func SetBundleBalanceLayout(req *bundle.SetBundleBalanceLayoutReq) error { DoUpdates: clause.AssignmentColumns([]string{"data"}), }).Create(&model.BundleBalanceLayout{Data: req.Data, UserId: uint64(req.UserId)}).Error } + +// 计算本月发放的限制类型数量 +func cal(data model.BundleBalance, total, limit int, date time.Time) int { + var released int // 已释放的次数 + + if data.StartAt.Month() == date.Month() && data.StartAt.Year() == date.Year() { //第一个月释放的 + } else if data.StartAt.Day() >= 16 { + released += (limit + 1) / 2 + } else { + released += limit + } + interval := date.Year()*12 + int(date.Month()) - (data.StartAt.Year()*12 + int(data.StartAt.Month())) // 后续月份释放的 + released += interval * limit + remaining := max(total-released, 0) // 还剩余多少次没有发放 + if data.StartAt.Month() == date.Month() && data.StartAt.Year() == date.Year() && data.StartAt.Day() >= 16 { // 本月为第一个月并且16号后购买只给一半(向上取整) + return min((limit+1)/2, remaining) + } + if data.ExpiredAt.Month() == date.Month() && data.ExpiredAt.Year() == date.Year() && data.ExpiredAt.Day() < 16 { // 本月为最后一个月并且16号前到期只给一半(向下取整) + return min(limit/2, remaining) + } + return min(limit, remaining) +} diff --git a/internal/logic/bundleExtendLogic.go b/internal/logic/bundleExtendLogic.go index 473ed1c..239a286 100644 --- a/internal/logic/bundleExtendLogic.go +++ b/internal/logic/bundleExtendLogic.go @@ -144,7 +144,9 @@ func GetBundleBalanceList(req *bundle.GetBundleBalanceListReq) (*bundle.GetBundl ManualDataAnalysisNumber: int32(m.ManualDataAnalysisNumber), Activate: int32(m.Activate), } - + if result.Activate != 2 { // 除了等于0的情况 + result.Activate = 1 + } if m.OrderUUID != "" { result.Bought = 2 } else {