fix(order): cover invite gifts and inactive renewals
Build docker and publish / build (20.15.1) (push) Successful in 5m36s

This commit is contained in:
2026-04-29 21:52:28 -07:00
parent 6b64e8c461
commit 32e3dc3c73
3 changed files with 518 additions and 14 deletions
+13 -14
View File
@@ -447,6 +447,13 @@ func orderMergeRemainingTimeStatus(status uint8) bool {
}
}
func subscriptionRenewalBaseTime(now time.Time, userSub *user.Subscribe) time.Time {
if userSub != nil && orderMergeRemainingTimeStatus(userSub.Status) && userSub.ExpireTime.After(now) {
return userSub.ExpireTime
}
return now
}
func pickSubscriptionIdentitySource(candidates []user.Subscribe) *user.Subscribe {
if len(candidates) == 0 {
return nil
@@ -959,10 +966,7 @@ func (l *ActivateOrderLogic) findGiftSubscription(ctx context.Context, userId in
// 若购买套餐与赠送套餐不同,同步更新套餐 ID 和流量配额并重置已用量(套餐变更语义)。
func (l *ActivateOrderLogic) extendGiftSubscription(ctx context.Context, giftSub *user.Subscribe, orderInfo *order.Order, sub *subscribe.Subscribe) (*user.Subscribe, error) {
now := time.Now()
baseTime := giftSub.ExpireTime
if baseTime.Before(now) {
baseTime = now
}
baseTime := subscriptionRenewalBaseTime(now, giftSub)
newExpireTime := tool.AddTime(sub.UnitTime, orderInfo.Quantity, baseTime)
giftSub.OrderId = orderInfo.Id
@@ -1417,10 +1421,7 @@ func (l *ActivateOrderLogic) getUserSubscription(ctx context.Context, token stri
// updateSubscriptionWithIAPExpire 用于 Apple IAP 续费:按累计加时语义更新到期时间。
func (l *ActivateOrderLogic) updateSubscriptionWithIAPExpire(ctx context.Context, userSub *user.Subscribe, sub *subscribe.Subscribe, orderInfo *order.Order, iapExpireAt int64) error {
now := time.Now()
baseTime := userSub.ExpireTime
if baseTime.Before(now) {
baseTime = now
}
baseTime := subscriptionRenewalBaseTime(now, userSub)
newExpire := tool.AddTime(sub.UnitTime, orderInfo.Quantity, baseTime)
if iapExpireAt > 0 {
appleExpire := time.Unix(iapExpireAt, 0)
@@ -1455,11 +1456,9 @@ func (l *ActivateOrderLogic) updateSubscriptionWithIAPExpire(ctx context.Context
// expiration time extension and traffic reset if configured
func (l *ActivateOrderLogic) updateSubscriptionForRenewal(ctx context.Context, userSub *user.Subscribe, sub *subscribe.Subscribe, orderInfo *order.Order) error {
now := time.Now()
if userSub.ExpireTime.Before(now) {
userSub.ExpireTime = now
}
today := time.Now().Day()
resetDay := userSub.ExpireTime.Day()
baseTime := subscriptionRenewalBaseTime(now, userSub)
today := now.Day()
resetDay := baseTime.Day()
// 套餐变更:更新套餐ID和流量配额,并重置已用流量
if userSub.SubscribeId != orderInfo.SubscribeId {
@@ -1486,7 +1485,7 @@ func (l *ActivateOrderLogic) updateSubscriptionForRenewal(ctx context.Context, u
}
userSub.OrderId = orderInfo.Id
userSub.ExpireTime = tool.AddTime(sub.UnitTime, orderInfo.Quantity, userSub.ExpireTime)
userSub.ExpireTime = tool.AddTime(sub.UnitTime, orderInfo.Quantity, baseTime)
userSub.Status = 1
// 续费时重置过期流量字段
userSub.ExpiredDownload = 0