feat(subscribe): add inventory check and update logic for subscription plans
This commit is contained in:
parent
7a2000f696
commit
fb6adc9ae3
@ -51,6 +51,16 @@ func (l *CloseOrderLogic) CloseOrder(req *types.CloseOrderRequest) error {
|
|||||||
)
|
)
|
||||||
return nil
|
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 {
|
err = l.svcCtx.DB.Transaction(func(tx *gorm.DB) error {
|
||||||
// update order status
|
// update order status
|
||||||
err := tx.Model(&order.Order{}).Where("order_no = ?", req.OrderNo).Update("status", 3).Error
|
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
|
// update user cache
|
||||||
return l.svcCtx.UserModel.UpdateUserCache(l.ctx, userInfo)
|
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
|
return nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
logger.Errorf("[CloseOrder] Transaction failed: %v", err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@ -81,6 +81,12 @@ func (l *PurchaseLogic) Purchase(req *types.PurchaseOrderRequest) (resp *types.P
|
|||||||
if !*sub.Sell {
|
if !*sub.Sell {
|
||||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "subscribe not 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
|
// check subscribe plan limit
|
||||||
if sub.Quota > 0 {
|
if sub.Quota > 0 {
|
||||||
var count int64
|
var count int64
|
||||||
@ -221,10 +227,23 @@ func (l *PurchaseLogic) Purchase(req *types.PurchaseOrderRequest) (resp *types.P
|
|||||||
return e
|
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
|
// insert order
|
||||||
return db.WithContext(l.ctx).Model(&order.Order{}).Create(&orderInfo).Error
|
return db.WithContext(l.ctx).Model(&order.Order{}).Create(&orderInfo).Error
|
||||||
})
|
})
|
||||||
if err != nil {
|
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())
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseInsertError), "insert order error: %v", err.Error())
|
||||||
}
|
}
|
||||||
// Deferred task
|
// Deferred task
|
||||||
|
|||||||
@ -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))
|
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())
|
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
|
// check subscribe plan status
|
||||||
if !*sub.Sell {
|
if !*sub.Sell {
|
||||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "subscribe not 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
|
return err
|
||||||
}
|
}
|
||||||
l.Infow("[Purchase] Guest order", logger.Field("order_no", orderInfo.OrderNo), logger.Field("identifier", req.Identifier))
|
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
|
// save guest order
|
||||||
if err = l.svcCtx.OrderModel.Insert(l.ctx, orderInfo, tx); err != nil {
|
if err = l.svcCtx.OrderModel.Insert(l.ctx, orderInfo, tx); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@ -70,6 +70,7 @@ const (
|
|||||||
SubscribeIsUsedError uint32 = 60004
|
SubscribeIsUsedError uint32 = 60004
|
||||||
SingleSubscribeModeExceedsLimit uint32 = 60005
|
SingleSubscribeModeExceedsLimit uint32 = 60005
|
||||||
SubscribeQuotaLimit uint32 = 60006
|
SubscribeQuotaLimit uint32 = 60006
|
||||||
|
SubscribeOutOfStock uint32 = 60007
|
||||||
)
|
)
|
||||||
|
|
||||||
// Auth error
|
// Auth error
|
||||||
|
|||||||
@ -55,6 +55,7 @@ func init() {
|
|||||||
SubscribeIsUsedError: "Subscribe is used",
|
SubscribeIsUsedError: "Subscribe is used",
|
||||||
SingleSubscribeModeExceedsLimit: "Single subscribe mode exceeds limit",
|
SingleSubscribeModeExceedsLimit: "Single subscribe mode exceeds limit",
|
||||||
SubscribeQuotaLimit: "Subscribe quota limit",
|
SubscribeQuotaLimit: "Subscribe quota limit",
|
||||||
|
SubscribeOutOfStock: "Subscribe out of stock",
|
||||||
|
|
||||||
// auth error
|
// auth error
|
||||||
VerifyCodeError: "Verify code error",
|
VerifyCodeError: "Verify code error",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user