diff --git a/internal/logic/public/iap/apple/singleModeHelper.go b/internal/logic/public/iap/apple/singleModeHelper.go index 4cbfe38..58c162e 100644 --- a/internal/logic/public/iap/apple/singleModeHelper.go +++ b/internal/logic/public/iap/apple/singleModeHelper.go @@ -22,7 +22,7 @@ func findSingleModeMergeTarget(ctx context.Context, svcCtx *svc.ServiceContext, return nil, err } - userSubs, queryErr := svcCtx.UserModel.QueryUserSubscribe(ctx, userId, 0, 1, 2, 3, 5) + userSubs, queryErr := svcCtx.UserModel.QueryUserSubscribe(ctx, userId, 0, 1, 2, 3, 4, 5) if queryErr != nil { return nil, queryErr } diff --git a/internal/model/user/subscribe.go b/internal/model/user/subscribe.go index 854e9ea..61613a5 100644 --- a/internal/model/user/subscribe.go +++ b/internal/model/user/subscribe.go @@ -67,7 +67,7 @@ func (m *defaultUserModel) FindSingleModeAnchorSubscribe(ctx context.Context, us var data Subscribe err := m.QueryNoCacheCtx(ctx, &data, func(conn *gorm.DB, _ interface{}) error { return conn.Model(&Subscribe{}). - Where("user_id = ? AND token != '' AND (order_id > 0 OR token LIKE 'iap:%') AND `status` IN ?", userId, []int64{0, 1, 2, 3, 5}). + Where("user_id = ? AND token != '' AND (order_id > 0 OR token LIKE 'iap:%') AND `status` IN ?", userId, []int64{0, 1, 2, 3, 4, 5}). Order("expire_time DESC"). Order("updated_at DESC"). Order("id DESC"). diff --git a/queue/logic/order/activateOrderLogic.go b/queue/logic/order/activateOrderLogic.go index 582f595..ebbbafb 100644 --- a/queue/logic/order/activateOrderLogic.go +++ b/queue/logic/order/activateOrderLogic.go @@ -234,38 +234,31 @@ func (l *ActivateOrderLogic) NewPurchase(ctx context.Context, orderInfo *order.O anchorSub, anchorErr := l.svc.UserModel.FindSingleModeAnchorSubscribe(ctx, orderInfo.UserId) switch { case anchorErr == nil && anchorSub != nil: - if anchorSub.SubscribeId == orderInfo.SubscribeId { - if orderInfo.ParentId == 0 && anchorSub.OrderId > 0 && anchorSub.OrderId != orderInfo.Id { - if patchErr := l.patchOrderParentID(ctx, orderInfo.Id, anchorSub.OrderId); patchErr != nil { - logger.WithContext(ctx).Error("Patch order parent_id failed", - logger.Field("error", patchErr.Error()), - logger.Field("order_no", orderInfo.OrderNo), - ) - } else { - orderInfo.ParentId = anchorSub.OrderId - } - } - - if renewErr := l.updateSubscriptionForRenewal(ctx, anchorSub, sub, orderInfo); renewErr != nil { - logger.WithContext(ctx).Error("Single mode renewal fallback failed", - logger.Field("error", renewErr.Error()), - logger.Field("anchor_user_subscribe_id", anchorSub.Id), + if orderInfo.ParentId == 0 && anchorSub.OrderId > 0 && anchorSub.OrderId != orderInfo.Id { + if patchErr := l.patchOrderParentID(ctx, orderInfo.Id, anchorSub.OrderId); patchErr != nil { + logger.WithContext(ctx).Error("Patch order parent_id failed", + logger.Field("error", patchErr.Error()), logger.Field("order_no", orderInfo.OrderNo), ) } else { - userSub = anchorSub - logger.WithContext(ctx).Infow("Single mode purchase routed to renewal in activation", - logger.Field("mode", "single"), - logger.Field("route", "purchase_to_renewal"), - logger.Field("anchor_user_subscribe_id", anchorSub.Id), - logger.Field("order_no", orderInfo.OrderNo), - ) + orderInfo.ParentId = anchorSub.OrderId } - } else { - logger.WithContext(ctx).Errorw("Single mode anchor subscribe mismatch in activation", + } + + if renewErr := l.updateSubscriptionForRenewal(ctx, anchorSub, sub, orderInfo); renewErr != nil { + logger.WithContext(ctx).Error("Single mode renewal fallback failed", + logger.Field("error", renewErr.Error()), + logger.Field("anchor_user_subscribe_id", anchorSub.Id), + logger.Field("order_no", orderInfo.OrderNo), + ) + } else { + userSub = anchorSub + logger.WithContext(ctx).Infow("Single mode purchase routed to renewal in activation", + logger.Field("mode", "single"), + logger.Field("route", "purchase_to_renewal"), + logger.Field("plan_changed", anchorSub.SubscribeId != orderInfo.SubscribeId), + logger.Field("anchor_user_subscribe_id", anchorSub.Id), logger.Field("order_no", orderInfo.OrderNo), - logger.Field("order_subscribe_id", orderInfo.SubscribeId), - logger.Field("anchor_subscribe_id", anchorSub.SubscribeId), ) } case errors.Is(anchorErr, gorm.ErrRecordNotFound): @@ -926,10 +919,18 @@ func (l *ActivateOrderLogic) updateSubscriptionForRenewal(ctx context.Context, u today := time.Now().Day() resetDay := userSub.ExpireTime.Day() - // Reset traffic if enabled - if (sub.RenewalReset != nil && *sub.RenewalReset) || today == resetDay { + // 套餐变更:更新套餐ID和流量配额,并重置已用流量 + if userSub.SubscribeId != orderInfo.SubscribeId { + userSub.SubscribeId = orderInfo.SubscribeId + userSub.Traffic = sub.Traffic userSub.Download = 0 userSub.Upload = 0 + } else { + // Reset traffic if enabled + if (sub.RenewalReset != nil && *sub.RenewalReset) || today == resetDay { + userSub.Download = 0 + userSub.Upload = 0 + } } if userSub.FinishedAt != nil { @@ -942,6 +943,7 @@ func (l *ActivateOrderLogic) updateSubscriptionForRenewal(ctx context.Context, u userSub.FinishedAt = nil } + userSub.OrderId = orderInfo.Id userSub.ExpireTime = tool.AddTime(sub.UnitTime, orderInfo.Quantity, userSub.ExpireTime) userSub.Status = 1 // 续费时重置过期流量字段