fix(purchase): update gift amount deduction logic and handle zero-amount order status
This commit is contained in:
parent
59348c1643
commit
40c24fbc85
@ -82,7 +82,7 @@ func (l *CloseOrderLogic) CloseOrder(req *types.CloseOrderRequest) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
deduction := userInfo.GiftAmount + orderInfo.GiftAmount
|
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 {
|
if err != nil {
|
||||||
l.Errorw("[CloseOrder] Refund deduction amount failed",
|
l.Errorw("[CloseOrder] Refund deduction amount failed",
|
||||||
logger.Field("error", err.Error()),
|
logger.Field("error", err.Error()),
|
||||||
|
|||||||
@ -122,6 +122,7 @@ func (l *PurchaseCheckoutLogic) PurchaseCheckout(req *types.CheckoutOrderRequest
|
|||||||
if err = l.balancePayment(userInfo, orderInfo); err != nil {
|
if err = l.balancePayment(userInfo, orderInfo); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
resp = &types.CheckoutOrderResponse{
|
resp = &types.CheckoutOrderResponse{
|
||||||
Type: "balance", // Payment completed immediately
|
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
|
// balancePayment processes balance payment with gift amount priority logic
|
||||||
// It prioritizes using gift amount first, then regular balance, and creates proper audit logs
|
// 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 {
|
func (l *PurchaseCheckoutLogic) balancePayment(u *user.User, o *order.Order) error {
|
||||||
|
var userInfo user.User
|
||||||
|
var err error
|
||||||
if o.Amount == 0 {
|
if o.Amount == 0 {
|
||||||
// No payment required for zero-amount orders
|
// 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
|
// Retrieve latest user information with row-level locking
|
||||||
err := db.Model(&user.User{}).Where("id = ?", u.Id).First(&userInfo).Error
|
err := db.Model(&user.User{}).Where("id = ?", u.Id).First(&userInfo).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -420,6 +435,7 @@ func (l *PurchaseCheckoutLogic) balancePayment(u *user.User, o *order.Order) err
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
activation:
|
||||||
// Enqueue order activation task for immediate processing
|
// Enqueue order activation task for immediate processing
|
||||||
payload := queueType.ForthwithActivateOrderPayload{
|
payload := queueType.ForthwithActivateOrderPayload{
|
||||||
OrderNo: o.OrderNo,
|
OrderNo: o.OrderNo,
|
||||||
|
|||||||
@ -248,7 +248,6 @@ func (l *SubscribeLogic) buildClientConfig(req *types.SubscribeRequest, userSub
|
|||||||
l.setSurfboardHeaders()
|
l.setSurfboardHeaders()
|
||||||
case "v2rayn":
|
case "v2rayn":
|
||||||
resp = proxyManager.BuildV2rayN(userSub.UUID)
|
resp = proxyManager.BuildV2rayN(userSub.UUID)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
resp = proxyManager.BuildGeneral(userSub.UUID)
|
resp = proxyManager.BuildGeneral(userSub.UUID)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user