From 40c24fbc85078e5644d186c512a294bbaa75897e Mon Sep 17 00:00:00 2001 From: Chang lue Tsen Date: Tue, 15 Jul 2025 12:03:16 -0400 Subject: [PATCH] fix(purchase): update gift amount deduction logic and handle zero-amount order status --- .../logic/public/order/closeOrderLogic.go | 2 +- .../public/portal/purchaseCheckoutLogic.go | 22 ++++++++++++++++--- internal/logic/subscribe/subscribeLogic.go | 1 - 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/internal/logic/public/order/closeOrderLogic.go b/internal/logic/public/order/closeOrderLogic.go index 95de100..fc22eec 100644 --- a/internal/logic/public/order/closeOrderLogic.go +++ b/internal/logic/public/order/closeOrderLogic.go @@ -82,7 +82,7 @@ func (l *CloseOrderLogic) CloseOrder(req *types.CloseOrderRequest) error { return err } deduction := userInfo.GiftAmount + orderInfo.GiftAmount - err = tx.Model(&user.User{}).Where("id = ?", orderInfo.UserId).Update("deduction", deduction).Error + err = tx.Model(&user.User{}).Where("id = ?", orderInfo.UserId).Update("gift_amount", deduction).Error if err != nil { l.Errorw("[CloseOrder] Refund deduction amount failed", logger.Field("error", err.Error()), diff --git a/internal/logic/public/portal/purchaseCheckoutLogic.go b/internal/logic/public/portal/purchaseCheckoutLogic.go index 7ce1f9e..1b71b08 100644 --- a/internal/logic/public/portal/purchaseCheckoutLogic.go +++ b/internal/logic/public/portal/purchaseCheckoutLogic.go @@ -122,6 +122,7 @@ func (l *PurchaseCheckoutLogic) PurchaseCheckout(req *types.CheckoutOrderRequest if err = l.balancePayment(userInfo, orderInfo); err != nil { return nil, err } + resp = &types.CheckoutOrderResponse{ Type: "balance", // Payment completed immediately } @@ -325,13 +326,27 @@ func (l *PurchaseCheckoutLogic) queryExchangeRate(to string, src int64) (amount // balancePayment processes balance payment with gift amount priority logic // It prioritizes using gift amount first, then regular balance, and creates proper audit logs func (l *PurchaseCheckoutLogic) balancePayment(u *user.User, o *order.Order) error { + var userInfo user.User + var err error if o.Amount == 0 { // No payment required for zero-amount orders - return nil + l.Logger.Info( + "[PurchaseCheckout] No payment required for zero-amount order", + logger.Field("orderNo", o.OrderNo), + logger.Field("userId", u.Id), + ) + err := l.svcCtx.OrderModel.UpdateOrderStatus(l.ctx, o.OrderNo, 2) + if err != nil { + l.Errorw("[PurchaseCheckout] Update order status error", + logger.Field("error", err.Error()), + logger.Field("orderNo", o.OrderNo), + logger.Field("userId", u.Id)) + return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "Update order status error: %s", err.Error()) + } + goto activation } - var userInfo user.User - err := l.svcCtx.UserModel.Transaction(l.ctx, func(db *gorm.DB) error { + err = l.svcCtx.UserModel.Transaction(l.ctx, func(db *gorm.DB) error { // Retrieve latest user information with row-level locking err := db.Model(&user.User{}).Where("id = ?", u.Id).First(&userInfo).Error if err != nil { @@ -420,6 +435,7 @@ func (l *PurchaseCheckoutLogic) balancePayment(u *user.User, o *order.Order) err return err } +activation: // Enqueue order activation task for immediate processing payload := queueType.ForthwithActivateOrderPayload{ OrderNo: o.OrderNo, diff --git a/internal/logic/subscribe/subscribeLogic.go b/internal/logic/subscribe/subscribeLogic.go index f0a3f1d..d2beeed 100644 --- a/internal/logic/subscribe/subscribeLogic.go +++ b/internal/logic/subscribe/subscribeLogic.go @@ -248,7 +248,6 @@ func (l *SubscribeLogic) buildClientConfig(req *types.SubscribeRequest, userSub l.setSurfboardHeaders() case "v2rayn": resp = proxyManager.BuildV2rayN(userSub.UUID) - default: resp = proxyManager.BuildGeneral(userSub.UUID) }