添加权益卡

master
kanade 3 years ago
parent f2d70bea2f
commit f9d569078a

@ -8,6 +8,7 @@ import (
"recook/internal/model/user"
"recook/internal/v2/lib/common"
"recook/internal/v2/model/recook/goods"
"recook/tools"
"time"
"git.oa00.com/go/mysql"
@ -142,3 +143,122 @@ func (o Proxy) VipIsUsed(c *gin.Context) {
res := dbc.Rds.SIsMember(key2, id)
back.Suc(c, "操作成功", gin.H{"is_used": res.Val()})
}
// InviteCheck @Title 邀请码验证
func (o *Proxy) InviteCheck(c *gin.Context) {
args := argsGoodsInvite{}
err := tools.Params(&args, c)
if err != nil {
back.Fail(c, err.Error())
return
}
if args.InviteNo == "" {
back.Fail(c, "二维码不存在或已失效")
return
}
recookGoodsInvite := goods.RecookGoodsInvite{}
if mysql.Db.Where("inviter_code = ? and status = ?", args.InviteNo, goods.RecookGoodsInviteStatusNone).First(&recookGoodsInvite).Error != nil {
back.Fail(c, "二维码已使用")
return
}
userId, _ := common.GetAppUserId(c)
var u1 user.Information
if err := mysql.Db.First(&u1, "id = ?", userId).Error; err != nil {
back.Fail(c, "二维码不存在或已失效")
return
}
if u1.Level == 10 {
// 合伙人或者真实vip店铺无需操作
back.Suc(c, "操作成功", gin.H{"isVip": true})
return
} else {
back.Suc(c, "操作成功", gin.H{"isVip": false})
return
}
}
type argsGoodsInvite struct {
InviteNo string
}
// Invite @Title 邀请码
func (o *Proxy) Invite(c *gin.Context) {
args := argsGoodsInvite{}
err := tools.Params(&args, c)
if err != nil {
back.Fail(c, err.Error())
return
}
if args.InviteNo == "" {
back.Fail(c, "二维码不存在或已失效")
return
}
recookGoodsInvite := goods.RecookGoodsInvite{}
if mysql.Db.Where("inviter_code = ? and status = ?", args.InviteNo, goods.RecookGoodsInviteStatusNone).First(&recookGoodsInvite).Error != nil {
back.Fail(c, "二维码已使用")
return
}
userId, _ := common.GetAppUserId(c)
var u1 user.Information
if err := mysql.Db.First(&u1, "id = ?", userId).Error; err != nil {
back.Fail(c, "二维码不存在或已失效")
return
}
if u1.Level == 10 {
// 合伙人或者真实vip店铺无需操作
back.Fail(c, "合伙人无需领取权益卡")
return
}
patch := make(map[string]interface{})
patch["level"] = 2
patch["parent_id"] = 0
patch["is_offline"] = true
now := time.Now()
end := now
level := u1.Level
if u1.VipUpgradeEnd.Valid && time.Now().Before(u1.VipUpgradeEnd.Time) {
// 续约
level = u1.OldLevel
now = u1.VipUpgradeStart.Time
end = u1.VipUpgradeEnd.Time
} else {
// 没有升级过 || 升级过已经过了上一次的时间重新计算
patch["old_level"] = u1.Level
patch["old_parent_id"] = u1.ParentID
patch["old_root_id"] = u1.RootID
}
end = end.AddDate(1, 0, 0)
patch["vip_upgrade_start"] = formatime.NewSecondFrom(now)
patch["vip_upgrade_end"] = formatime.NewSecondFrom(end)
if err := mysql.Db.Transaction(func(tx *gorm.DB) error {
if tx.Model(&recookGoodsInvite).Where(&recookGoodsInvite).Updates(map[string]interface{}{
"status": goods.RecookGoodsInviteStatusUsed,
"use_user_id": userId,
}).RowsAffected != 1 {
return errors.New("领取失败")
}
if err := tx.Table((&user.Information{}).TableName()).Where("id = ?", u1.ID).Updates(patch).Error; err != nil {
return errors.New("领取失败")
}
kind := user.Year
if tx.Create(&user.VipHistory{
UserID: int(userId),
Name: kind.Str(),
Start: &now,
End: &end,
Amount: decimal.Zero,
Level: level,
Nickname: u1.Nickname,
Mobile: u1.Mobile,
Kind: kind,
}).Error != nil {
return errors.New("领取失败")
}
return nil
}); err != nil {
back.Fail(c, err.Error())
return
}
back.Suc(c, "操作成功", gin.H{"endTime": end.Unix()})
return
}

@ -0,0 +1,17 @@
package goods
import "time"
const (
RecookGoodsInviteStatusNone = 1 // 未使用
RecookGoodsInviteStatusUsed = 2 // 已使用
)
type RecookGoodsInvite struct {
Id uint `gorm:"primaryKey"`
InviterCode string // 邀请的code
Status uint // 验证码状态 1=未使用 2=已使用
UseUserId uint // 使用用户id
CreatedAt time.Time
UpdatedAt time.Time
}

@ -273,6 +273,8 @@ func routerApp(appRouter *gin.RouterGroup) {
vipController.POST("goods", proxy.VipGoods)
vipController.POST("active", proxy.VipActive)
vipController.POST("is_used", proxy.VipIsUsed)
vipController.POST("invite_check", proxy.InviteCheck)
vipController.POST("invite", proxy.Invite)
}
}
pushController := appRouter.Group("push", authorize)

Loading…
Cancel
Save