优化交易状态检查逻辑
This commit is contained in:
@@ -90,20 +90,15 @@ func (s *resourceService) CreateResource(uid int32, now time.Time, ser *CreateRe
|
||||
|
||||
func (s *resourceService) PrepareResource(uid int32, now time.Time, ser *PrepareResourceData) (*TradeCreateResult, error) {
|
||||
|
||||
data, err := ser.ToData()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
name := data.GetName()
|
||||
amount := data.GetPrice()
|
||||
name := ser.GetName()
|
||||
amount := ser.GetPrice()
|
||||
|
||||
method := ser.PaymentMethod
|
||||
platform := ser.PaymentPlatform
|
||||
|
||||
// 保存到数据库
|
||||
var result *TradeCreateResult
|
||||
err = q.Q.Transaction(func(q *q.Query) error {
|
||||
err := q.Q.Transaction(func(q *q.Query) error {
|
||||
var err error
|
||||
|
||||
// 生成交易订单
|
||||
@@ -120,16 +115,11 @@ func (s *resourceService) PrepareResource(uid int32, now time.Time, ser *Prepare
|
||||
}
|
||||
|
||||
// 保存请求缓存
|
||||
resourceSerializer := new(PrepareResourceData)
|
||||
if err := resourceSerializer.ByData(data); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = g.Redis.Set(context.Background(), resPrepareKey(result.TradeNo), &PrepareResourceCache{
|
||||
Uid: uid,
|
||||
TradeId: result.Trade.ID,
|
||||
BillId: result.Bill.ID,
|
||||
PrepareResourceData: resourceSerializer,
|
||||
PrepareResourceData: ser,
|
||||
}, 30*time.Minute).Err()
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -162,7 +152,7 @@ func (s *resourceService) CompleteResource(tradeNo string, now time.Time, opResu
|
||||
rs = opResult[0]
|
||||
} else {
|
||||
var err error
|
||||
rs, err = Trade.VerifyTrade(&TradeVerifyData{
|
||||
rs, err = Trade.CheckTradeIfCreated(&CheckTradeData{
|
||||
TradeNo: tradeNo,
|
||||
Method: cache.PaymentMethod,
|
||||
})
|
||||
@@ -196,9 +186,8 @@ func (s *resourceService) CompleteResource(tradeNo string, now time.Time, opResu
|
||||
|
||||
// 更新账单
|
||||
_, err = q.Bill.Debug().
|
||||
Select(q.Bill.ResourceID).
|
||||
Where(q.Bill.ID.Eq(cache.BillId)).
|
||||
Updates(&m.Bill{
|
||||
ID: cache.BillId,
|
||||
ResourceID: &resource.ID,
|
||||
})
|
||||
if err != nil {
|
||||
@@ -416,6 +405,28 @@ type CreateResourceData struct {
|
||||
Long *CreateLongResourceData `json:"long,omitempty"`
|
||||
}
|
||||
|
||||
func (data *CreateResourceData) GetName() string {
|
||||
switch data.Type {
|
||||
case resource2.TypeShort:
|
||||
return data.Short.GetName()
|
||||
case resource2.TypeLong:
|
||||
return data.Long.GetName()
|
||||
default:
|
||||
panic("未处理的 resource type 枚举值")
|
||||
}
|
||||
}
|
||||
|
||||
func (data *CreateResourceData) GetPrice() decimal.Decimal {
|
||||
switch data.Type {
|
||||
case resource2.TypeShort:
|
||||
return data.Short.GetPrice()
|
||||
case resource2.TypeLong:
|
||||
return data.Long.GetPrice()
|
||||
default:
|
||||
panic("未处理的 resource type 枚举值")
|
||||
}
|
||||
}
|
||||
|
||||
func (s *CreateResourceData) ToData() (CreateTypeResourceDataInter, error) {
|
||||
switch s.Type {
|
||||
case resource2.TypeShort:
|
||||
@@ -423,21 +434,8 @@ func (s *CreateResourceData) ToData() (CreateTypeResourceDataInter, error) {
|
||||
case resource2.TypeLong:
|
||||
return s.Long, nil
|
||||
}
|
||||
return nil, fmt.Errorf("不支持的套餐类型")
|
||||
}
|
||||
|
||||
func (s *CreateResourceData) ByData(data CreateTypeResourceDataInter) error {
|
||||
switch data := data.(type) {
|
||||
case *CreateShortResourceData:
|
||||
s.Type = resource2.TypeShort
|
||||
s.Short = data
|
||||
case *CreateLongResourceData:
|
||||
s.Type = resource2.TypeLong
|
||||
s.Long = data
|
||||
default:
|
||||
return fmt.Errorf("不支持的套餐类型")
|
||||
}
|
||||
return nil
|
||||
return nil, fmt.Errorf("不支持的套餐类型")
|
||||
}
|
||||
|
||||
type PrepareResourceData struct {
|
||||
|
||||
Reference in New Issue
Block a user