From f9d569078ac650e9ea6f0fb41bf9f489310ba571 Mon Sep 17 00:00:00 2001 From: kanade Date: Mon, 21 Nov 2022 11:03:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9D=83=E7=9B=8A=E5=8D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/v2/controller/app/vip/vip.go | 120 ++++++++++++++++++ .../model/recook/goods/recookGoodsInvite.go | 17 +++ internal/v2/router/app.go | 2 + 3 files changed, 139 insertions(+) create mode 100644 internal/v2/model/recook/goods/recookGoodsInvite.go diff --git a/internal/v2/controller/app/vip/vip.go b/internal/v2/controller/app/vip/vip.go index 104f420..a3ce006 100644 --- a/internal/v2/controller/app/vip/vip.go +++ b/internal/v2/controller/app/vip/vip.go @@ -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 +} diff --git a/internal/v2/model/recook/goods/recookGoodsInvite.go b/internal/v2/model/recook/goods/recookGoodsInvite.go new file mode 100644 index 0000000..a01ef6f --- /dev/null +++ b/internal/v2/model/recook/goods/recookGoodsInvite.go @@ -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 +} diff --git a/internal/v2/router/app.go b/internal/v2/router/app.go index 4230e54..9abf1c2 100644 --- a/internal/v2/router/app.go +++ b/internal/v2/router/app.go @@ -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)