From 9a8ae8b6fd7c2953b87fb65cc49eef41a43c5a6b Mon Sep 17 00:00:00 2001 From: shanshanzhong Date: Mon, 20 Apr 2026 20:58:01 -0700 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=9D=9E=E5=8D=95?= =?UTF-8?q?=E8=AE=A2=E9=98=85=E6=A8=A1=E5=BC=8F=E4=B8=8B=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E9=87=8D=E5=A4=8D=E8=B4=AD=E4=B9=B0=E4=BA=A7?= =?UTF-8?q?=E7=94=9F=E5=8F=8C=E8=AE=A2=E9=98=85=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. purchaseLogic: 非单订阅模式下购买前查询已有订阅,路由为续费(type=2) 2. activateOrderLogic: 续费激活时触发节点分组重算,确保过期续费后权限生效 Co-Authored-By: claude-flow --- internal/logic/public/order/purchaseLogic.go | 20 ++++++++++++++++++++ queue/logic/order/activateOrderLogic.go | 3 +++ 2 files changed, 23 insertions(+) diff --git a/internal/logic/public/order/purchaseLogic.go b/internal/logic/public/order/purchaseLogic.go index 9a6402a..a220e18 100644 --- a/internal/logic/public/order/purchaseLogic.go +++ b/internal/logic/public/order/purchaseLogic.go @@ -111,6 +111,26 @@ func (l *PurchaseLogic) Purchase(req *types.PurchaseOrderRequest) (resp *types.P } } + // 非单订阅模式下,若用户已有同套餐订阅(含过期),提前路由为续费,防止创建重复订阅 + if !l.svcCtx.Config.Subscribe.SingleModel && orderType == 1 { + var existSub user.Subscribe + if e := l.svcCtx.DB.WithContext(l.ctx). + Model(&user.Subscribe{}). + Where("user_id = ? AND subscribe_id = ?", entitlement.EffectiveUserID, targetSubscribeID). + Order("expire_time DESC"). + First(&existSub).Error; e == nil && existSub.Id > 0 && existSub.Token != "" { + orderType = 2 + parentOrderID = existSub.OrderId + subscribeToken = existSub.Token + l.Infow("[Purchase] non-single mode purchase routed to renewal (existing subscription found)", + logger.Field("existing_subscribe_id", existSub.Id), + logger.Field("existing_status", existSub.Status), + logger.Field("user_id", u.Id), + logger.Field("subscribe_id", targetSubscribeID), + ) + } + } + // 单订阅模式下,若已有同套餐 pending 订单,关闭旧单后继续创建新单(确保新单参数生效) if l.svcCtx.Config.Subscribe.SingleModel && orderType == 1 { var existPending order.Order diff --git a/queue/logic/order/activateOrderLogic.go b/queue/logic/order/activateOrderLogic.go index ca6ff56..00fb4d5 100644 --- a/queue/logic/order/activateOrderLogic.go +++ b/queue/logic/order/activateOrderLogic.go @@ -895,6 +895,9 @@ func (l *ActivateOrderLogic) Renewal(ctx context.Context, orderInfo *order.Order } } + // Trigger user group recalculation (needed when renewing an expired subscription) + l.triggerUserGroupRecalculation(ctx, userInfo.Id) + // Clear user subscription cache err = l.svc.UserModel.ClearSubscribeCache(ctx, userSub) if err != nil {