diff --git a/internal/logic/public/order/closeOrderLogic.go b/internal/logic/public/order/closeOrderLogic.go index ced53b8..dd7ea13 100644 --- a/internal/logic/public/order/closeOrderLogic.go +++ b/internal/logic/public/order/closeOrderLogic.go @@ -51,6 +51,16 @@ func (l *CloseOrderLogic) CloseOrder(req *types.CloseOrderRequest) error { ) return nil } + + sub, err := l.svcCtx.SubscribeModel.FindOne(l.ctx, orderInfo.SubscribeId) + if err != nil { + l.Errorw("[CloseOrder] Find subscribe info failed", + logger.Field("error", err.Error()), + logger.Field("subscribeId", orderInfo.SubscribeId), + ) + return nil + } + err = l.svcCtx.DB.Transaction(func(tx *gorm.DB) error { // update order status err := tx.Model(&order.Order{}).Where("order_no = ?", req.OrderNo).Update("status", 3).Error @@ -124,9 +134,21 @@ func (l *CloseOrderLogic) CloseOrder(req *types.CloseOrderRequest) error { // update user cache return l.svcCtx.UserModel.UpdateUserCache(l.ctx, userInfo) } + if sub.Inventory != -1 { + sub.Inventory++ + if e := l.svcCtx.SubscribeModel.Update(l.ctx, sub, tx); e != nil { + l.Errorw("[CloseOrder] Restore subscribe inventory failed", + logger.Field("error", e.Error()), + logger.Field("subscribeId", sub.Id), + ) + return e + } + } + return nil }) if err != nil { + logger.Errorf("[CloseOrder] Transaction failed: %v", err.Error()) return err } return nil diff --git a/internal/logic/public/order/purchaseLogic.go b/internal/logic/public/order/purchaseLogic.go index 519a80a..cbc960f 100644 --- a/internal/logic/public/order/purchaseLogic.go +++ b/internal/logic/public/order/purchaseLogic.go @@ -81,6 +81,12 @@ func (l *PurchaseLogic) Purchase(req *types.PurchaseOrderRequest) (resp *types.P if !*sub.Sell { return nil, errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "subscribe not sell") } + + // check subscribe plan inventory + if sub.Inventory == 0 { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SubscribeOutOfStock), "subscribe out of stock") + } + // check subscribe plan limit if sub.Quota > 0 { var count int64 @@ -221,10 +227,23 @@ func (l *PurchaseLogic) Purchase(req *types.PurchaseOrderRequest) (resp *types.P return e } } + + if sub.Inventory != -1 { + // decrease subscribe plan stock + sub.Inventory -= 1 + // update subscribe plan stock + if err = l.svcCtx.SubscribeModel.Update(l.ctx, sub, db); err != nil { + l.Errorw("[Purchase] Database update error", logger.Field("error", err.Error()), logger.Field("subscribe", sub)) + return err + } + } + // insert order return db.WithContext(l.ctx).Model(&order.Order{}).Create(&orderInfo).Error }) if err != nil { + l.Errorw("[Purchase] Database insert error", logger.Field("error", err.Error()), logger.Field("orderInfo", orderInfo)) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseInsertError), "insert order error: %v", err.Error()) } // Deferred task diff --git a/internal/logic/public/portal/purchaseLogic.go b/internal/logic/public/portal/purchaseLogic.go index 322f94c..c21cb69 100644 --- a/internal/logic/public/portal/purchaseLogic.go +++ b/internal/logic/public/portal/purchaseLogic.go @@ -55,6 +55,12 @@ func (l *PurchaseLogic) Purchase(req *types.PortalPurchaseRequest) (resp *types. l.Errorw("[Purchase] Database query error", logger.Field("error", err.Error()), logger.Field("subscribe_id", req.SubscribeId)) return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "find subscribe error: %v", err.Error()) } + + // check subscribe plan stock + if sub.Inventory == 0 { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SubscribeOutOfStock), "subscribe out of stock") + } + // check subscribe plan status if !*sub.Sell { return nil, errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "subscribe not sell") @@ -149,6 +155,16 @@ func (l *PurchaseLogic) Purchase(req *types.PortalPurchaseRequest) (resp *types. return err } l.Infow("[Purchase] Guest order", logger.Field("order_no", orderInfo.OrderNo), logger.Field("identifier", req.Identifier)) + + // Decrease subscribe plan stock + if sub.Inventory != -1 { + sub.Inventory-- + if e := l.svcCtx.SubscribeModel.Update(l.ctx, sub, tx); e != nil { + l.Errorw("[Purchase] Database update error", logger.Field("error", e.Error()), logger.Field("subscribe_id", sub.Id)) + return e + } + } + // save guest order if err = l.svcCtx.OrderModel.Insert(l.ctx, orderInfo, tx); err != nil { return err diff --git a/pkg/xerr/errCode.go b/pkg/xerr/errCode.go index 7e1bfd3..fd9d098 100644 --- a/pkg/xerr/errCode.go +++ b/pkg/xerr/errCode.go @@ -70,6 +70,7 @@ const ( SubscribeIsUsedError uint32 = 60004 SingleSubscribeModeExceedsLimit uint32 = 60005 SubscribeQuotaLimit uint32 = 60006 + SubscribeOutOfStock uint32 = 60007 ) // Auth error diff --git a/pkg/xerr/errMsg.go b/pkg/xerr/errMsg.go index f688854..1814720 100644 --- a/pkg/xerr/errMsg.go +++ b/pkg/xerr/errMsg.go @@ -55,6 +55,7 @@ func init() { SubscribeIsUsedError: "Subscribe is used", SingleSubscribeModeExceedsLimit: "Single subscribe mode exceeds limit", SubscribeQuotaLimit: "Subscribe quota limit", + SubscribeOutOfStock: "Subscribe out of stock", // auth error VerifyCodeError: "Verify code error",