feat:优化项目信息

This commit is contained in:
henry
2022-02-15 17:19:23 +08:00
parent cbc0ad1a41
commit dcb5948e91
45 changed files with 852 additions and 100 deletions

View File

@ -0,0 +1,46 @@
package payment
import (
"SciencesServer/app/api/website/model"
model2 "SciencesServer/app/common/model"
"gorm.io/gorm"
)
type Activity struct {
uid, activityID uint64
identity int
}
type ActivityCallback func(uid, activityID uint64, identity int) *Activity
func (c *Activity) grant(tx *gorm.DB) error {
var count int64
mActivityJoin := model.NewActivityJoin()
err := model2.Count(mActivityJoin.ActivityJoin, &count, model2.NewWhere("uid", c.uid),
model2.NewWhere("activity_id", c.activityID),
model2.NewWhere("identity", c.identity),
model2.NewWhere("status", model2.ActivityJoinStatusForSuccess))
if err != nil {
return err
} else if count > 0 {
return nil
}
mActivityJoin.UID = c.uid
mActivityJoin.ActivityID = c.activityID
mActivityJoin.Identity = c.identity
mActivityJoin.Status = model2.ActivityJoinStatusForSuccess
return model2.Create(mActivityJoin.ActivityJoin, tx)
}
func NewActivity() ActivityCallback {
return func(uid, activityID uint64, identity int) *Activity {
return &Activity{
uid: uid,
activityID: activityID,
identity: identity,
}
}
}

View File

@ -0,0 +1,115 @@
package payment
import (
"SciencesServer/app/api/website/model"
model2 "SciencesServer/app/common/model"
"SciencesServer/app/session"
"SciencesServer/serve/orm"
"errors"
"gorm.io/gorm"
"time"
)
// Instance 支付管理
type Instance struct {
*session.Enterprise
}
type IInstance interface {
grant(tx *gorm.DB) error
}
type InstanceHandle func(session *session.Enterprise) *Instance
type InstanceGrant struct {
tx *gorm.DB
uid uint64
params *model2.OrderInstanceParams
}
// handle 发放操作
func (c *InstanceGrant) handle() error {
var _handle IInstance
if c.params.Kind == model2.OrderInstanceParamsKindForActivity {
data := c.params.Data.(*model2.OrderInstanceParamsForActivity)
_handle = NewActivity()(c.uid, data.ID, data.Identity)
} else if c.params.Kind == model2.OrderInstanceParamsKindForVIP {
data := c.params.Data.(*model2.OrderInstanceParamsForVip)
_handle = NewVip()(c.uid, data.ID, data.EffectTime)
}
if _handle != nil {
return _handle.grant(c.tx)
}
return nil
}
// Launch 支付发起
func (c *Instance) Launch(id uint64) (interface{}, error) {
mOrderInstance := model.NewOrderInstance()
mOrderInstance.ID = id
isExist, err := model2.FirstField(mOrderInstance.OrderInstance, []string{"id", "order_no", "amount", "status"})
if err != nil {
return nil, err
} else if !isExist {
return nil, errors.New("操作错误,订单信息不存在或已被删除")
} else if mOrderInstance.Status != model2.OrderInstanceStatusForInit {
return nil, errors.New("操作错误,当前订单状态不允许支付")
}
// 保存日志
mOrderLog := model.NewOrderLog()
mOrderLog.UID = c.UID
mOrderLog.OrderID = id
if err = model2.Create(mOrderLog.OrderLog); err != nil {
return nil, err
}
// 返回第三方支付接口参数
return nil, nil
}
// Callback 支付回调
func (c *Instance) Callback(orderNo string) error {
mOrderInstance := model.NewOrderInstance()
isExist, err := model2.FirstField(mOrderInstance.OrderInstance, []string{"id", "uid", "amount", "params", "status"},
model2.NewWhere("order_no", orderNo))
if err != nil {
return err
} else if !isExist {
return errors.New("订单信息不存在或已被删除")
} else if mOrderInstance.OrderInstance.Status != model2.OrderInstanceStatusForInit {
// 状态异常
return errors.New("状态异常,不允许支付")
}
now := time.Now()
// 更改订单状态为已支付
if err = model2.Updates(mOrderInstance.OrderInstance, map[string]interface{}{
"status": model2.OrderInstanceStatusForPaid, "updated_at": now,
}); err != nil {
return nil
}
return orm.GetDB().Transaction(func(tx *gorm.DB) error {
// 发放操作
if err = (&InstanceGrant{
tx: tx, uid: mOrderInstance.UID, params: mOrderInstance.GetParamsAttribute(),
}).handle(); err != nil {
return err
}
if err = model2.Updates(mOrderInstance.OrderInstance, map[string]interface{}{
"status": model2.OrderInstanceStatusForComplete, "updated_at": now,
}, tx); err != nil {
return err
}
return nil
})
}
func NewInstance() InstanceHandle {
return func(session *session.Enterprise) *Instance {
return &Instance{session}
}
}

View File

@ -0,0 +1,49 @@
package payment
import (
"SciencesServer/app/api/website/model"
model2 "SciencesServer/app/common/model"
"gorm.io/gorm"
"time"
)
// Vip 会员信息
type Vip struct {
uid, vipID uint64
effectTime int
}
type VipCallback func(uid, vipID uint64, effectTime int) *Vip
func (c *Vip) grant(tx *gorm.DB) error {
mUserInstance := model.NewUserInstance()
isExist, err := model2.FirstField(mUserInstance.UserInstance, []string{"id", "vip", "vip_deadline"},
model2.NewWhere("uuid", c.uid))
if err != nil {
return err
} else if isExist {
if mUserInstance.VipStatus() {
mUserInstance.Vip = c.vipID
mUserInstance.VipDeadline = mUserInstance.VipDeadline.AddDate(0, c.effectTime, 0)
} else {
mUserInstance.Vip = c.vipID
mUserInstance.VipDeadline = time.Now().AddDate(0, c.effectTime, 0)
}
if err = model2.Updates(mUserInstance.UserInstance, map[string]interface{}{
"vip": mUserInstance.Vip, "vip_deadline": mUserInstance.VipDeadline, "updated_at": time.Now(),
}, tx); err != nil {
return err
}
}
return nil
}
func NewVip() VipCallback {
return func(uid, vipID uint64, effectTime int) *Vip {
return &Vip{
uid: uid, vipID: vipID, effectTime: effectTime,
}
}
}