From 246c641bc6eff0a8f9c810ee173189dfc68a8c30 Mon Sep 17 00:00:00 2001 From: chenlin Date: Wed, 31 Jan 2024 18:02:20 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=A0=B9=E6=8D=AEV1.2.0=E7=9A=84=E9=9C=80?= =?UTF-8?q?=E6=B1=82=E8=BF=9B=E8=A1=8C=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E8=B0=83=E6=95=B4=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 4 +- controller/account.go | 114 +++++---- controller/game_card.go | 258 +++++++++++++++++--- controller/user.go | 61 ++--- lib/wxpay/wx_pay.go | 10 +- model/cooperative_business.go | 426 +++++++++++++++++++++++++++++++--- model/coupon.go | 17 +- model/user.go | 366 +++++++++++++++++++++++++---- model/user_vm.go | 15 +- router/router_app.go | 5 +- 10 files changed, 1068 insertions(+), 208 deletions(-) diff --git a/Makefile b/Makefile index 6853e57..2db5658 100644 --- a/Makefile +++ b/Makefile @@ -14,8 +14,8 @@ build-sqlite: # docker build . -t go-admin:latest dev: - GOOS=linux GOARCH=amd64 go build -o dev_hm_server main.go + GOOS=linux GOARCH=amd64 go build -o dev_app_server main.go pro: - GOOS=linux GOARCH=amd64 go build -o hm_server main.go + GOOS=linux GOARCH=amd64 go build -o app_server main.go diff --git a/controller/account.go b/controller/account.go index 7d1a27f..25e62f3 100644 --- a/controller/account.go +++ b/controller/account.go @@ -20,14 +20,11 @@ import ( // @Tags 用户鉴权 // @Produce json // @Accept json -// @Param request body models.ErpOrderCreateReq true "用户登陆模型" -// @Success 200 {object} app.Response +// @Param request body model.AuthLoginReq true "用户登陆模型" +// @Success 200 {object} model.AuthLoginResp // @Router /api/v1/auth/login [post] func AuthLogin(c *gin.Context) { - req := struct { - Code string `json:"code" binding:"required"` - InviteUid uint32 `json:"invite_uid"` - }{} + req := new(model.AuthLoginReq) if err := c.ShouldBindJSON(&req); err != nil { logger.Error(err) @@ -87,7 +84,7 @@ func AuthLogin(c *gin.Context) { RespJson(c, status.InternalServerError, nil) return } - if !exist { // 未邀请过,则添加邀请记录 + if !exist { // 未邀请过,则添加邀请记录:首次邀请记录 firstInviteRecord := &model.UserInviteRecord{ ToUid: user.Uid, FromUid: req.InviteUid, @@ -121,7 +118,7 @@ func AuthLogin(c *gin.Context) { // UserInvite 邀请主要 var inviteNew model.UserInvite inviteErr := model.NewUserInviteQuerySet(model.DB).ToUidEq(user.Uid).FromUidEq(req.InviteUid).ActionEq(1). - SpendTypeEq(1).One(&inviteNew) + SpendTypeEq(1).One(&inviteNew) // action:1-未激活 spend_type:1-未开通 if inviteErr != nil && inviteErr != model.RecordNotFound { // 是否存在未开通 logger.Error("user invite err:", err) @@ -134,18 +131,18 @@ func AuthLogin(c *gin.Context) { memberLevel = model.MemberTypeConsumer // 普通用户 } invite := &model.UserInvite{ - FromUid: req.InviteUid, + FromUid: req.InviteUid, // 邀请人用户id UserType: inviteUser.UserType, // 邀请人用户类型 StoreId: inviteUser.StoreId, // 邀请人门店ID MemberOpenTime: time.Time{}, // 开通会员时间 MemberType: memberLevel, // 被邀请用户类型 - MemberStatus: 1, // 被邀请用户会员类型 - ToUid: user.Uid, - Action: 1, // 未激活 - SpendType: 1, // 未开通 - UserInviteRecordId: inviteRecord.ID, // 邀请记录id - FirstInvite: 0, // TODO 首次邀请id - Scan: 1, // 扫码次数 + MemberStatus: 1, // 被邀请用户会员状态 1-未开通 + ToUid: user.Uid, // 被邀请用户id + Action: 1, // 未激活 + SpendType: 1, // 未开通 + UserInviteRecordId: inviteRecord.ID, // 邀请记录id + FirstInvite: 0, // TODO 首次邀请id + Scan: 1, // 扫码次数 } fmt.Println("创建邀请:", invite) //count, err := model.NewUserInviteQuerySet(model.DB).FromUidEq(req.InviteUid).ToUidEq(user.Uid).Count() @@ -172,7 +169,6 @@ func AuthLogin(c *gin.Context) { logger.Error("from uid update user invite err:", err, req.InviteUid) } } - } } if sqlErr == model.RecordNotFound { @@ -185,14 +181,16 @@ func AuthLogin(c *gin.Context) { } user.Uid = createUid() // 新建uid + inviteUser := model.GetUserByUid(req.InviteUid) + var eg errgroup.Group - if req.InviteUid != 0 { // 如果入参有邀请人id,则新增2条邀请记录? + if req.InviteUid != 0 && inviteUser.UserType == 2 { // 如果入参有邀请人id,并且是店员,则新增2条邀请记录 inviteRecordFirst := &model.UserInviteRecord{ ToUid: user.Uid, FromUid: req.InviteUid, Action: 2, // 激活邀请 - SpendType: 1, - MemberLevel: 0, + SpendType: 1, // 未开通 + MemberLevel: 0, // 未开通会员 First: 1, // 首次邀请 Scan: 1, ActionTime: nowTime, @@ -205,9 +203,9 @@ func AuthLogin(c *gin.Context) { inviteRecord := &model.UserInviteRecord{ ToUid: user.Uid, FromUid: req.InviteUid, - Action: 1, - SpendType: 1, - MemberLevel: 0, + Action: 1, // 1-未激活 + SpendType: 1, // 未开通 + MemberLevel: 0, // 未开通会员 First: 0, Scan: 1, ActionTime: nowTime, @@ -229,9 +227,9 @@ func AuthLogin(c *gin.Context) { StoreId: inviteUser.StoreId, MemberType: model.MemberTypeConsumer, ToUid: user.Uid, - MemberStatus: 1, - Action: 1, - SpendType: 1, + MemberStatus: 1, // 1-未开通 + Action: 1, // 1-未激活 + SpendType: 1, // 未开通 UserInviteRecordId: inviteRecord.ID, Scan: 1, } @@ -287,14 +285,16 @@ func AuthLogin(c *gin.Context) { return } - RespJson(c, status.OK, map[string]interface{}{ - "access_token": newAccessToken, - "access_expire": config.AppConfig.JwtUserAccessExpire, - "refresh_token": refreshToken.Token, - "refresh_expire": config.AppConfig.JwtUserRefreshExpire, - "uid": user.Uid, - "access_created_at": nowTime, - }) + ret := model.AuthLoginResp{ + AccessToken: newAccessToken, + AccessExpire: config.AppConfig.JwtUserAccessExpire, + RefreshToken: refreshToken.Token, + RefreshExpire: config.AppConfig.JwtUserRefreshExpire, + Uid: user.Uid, + AccessCreatedAt: nowTime, + } + + RespJson(c, status.OK, ret) return } @@ -325,16 +325,16 @@ func AuthLogin(c *gin.Context) { logger.Error(err) } - RespJson(c, status.OK, map[string]interface{}{ - "access_token": newAccessToken, - "access_expire": config.AppConfig.JwtUserAccessExpire, - "refresh_token": refreshToken.Token, - "refresh_expire": config.AppConfig.JwtUserRefreshExpire, - "uid": user.Uid, - "access_created_at": nowTime, - //"is_new": isNew, - //"invite_from_code": inviteCode, - }) + ret := model.AuthLoginResp{ + AccessToken: newAccessToken, + AccessExpire: config.AppConfig.JwtUserAccessExpire, + RefreshToken: refreshToken.Token, + RefreshExpire: config.AppConfig.JwtUserRefreshExpire, + Uid: user.Uid, + AccessCreatedAt: nowTime, + } + + RespJson(c, status.OK, ret) return } @@ -632,6 +632,32 @@ func UserInviteList(c *gin.Context) { RespOK(c, resp) } +// NewUserInviteRecordList 会员推广记录 +// @Summary 会员推广记录 +// @Tags 会员推广, V1.2.0 +// @Produce json +// @Accept json +// @Param request body model.NewUserInviteRecordReq true "会员推广记录模型" +// @Success 200 {object} model.UserInviteRecordListResp +// @Router /api/v1/user/new_invite_list [post] +func NewUserInviteRecordList(c *gin.Context) { + req := new(model.NewUserInviteRecordReq) + if c.ShouldBindJSON(req) != nil { + logger.Errorf("para err") + RespJson(c, status.BadRequest, nil) + return + } + + resp, err := req.NewList() + if err != nil { + logger.Errorf("err:", err) + RespJson(c, status.InternalServerError, "查询失败") + return + } + + RespOK(c, resp) +} + func UserCodeToCoupon(c *gin.Context) { req := &struct { Code string `json:"code"` diff --git a/controller/game_card.go b/controller/game_card.go index 524e253..caec030 100644 --- a/controller/game_card.go +++ b/controller/game_card.go @@ -263,7 +263,7 @@ type ( } ) -// TODO两边都改 +// PushWXPayNotice TODO两边都改 // // 微信推送支付通知 func PushWXPayNotice(c *gin.Context) { @@ -449,6 +449,9 @@ func PushWXPayNotice(c *gin.Context) { remark := "" if record.MemberLevel == 2 { + if record.MemberGenre != 201 && record.MemberGenre != 202 { + record.MemberGenre = 200 // 新增:如果是年费黄金会员则member_genre设置为200 + } remark = "黄金会员费" } else if record.MemberLevel == 4 { remark = "白金会员费" @@ -470,16 +473,16 @@ func PushWXPayNotice(c *gin.Context) { logger.Error("err:", err) return } else { - spendType = uint32(2) + spendType = uint32(2) // 2-开通会员 if !user.OpenMemberTime.IsZero() { - spendType = 3 + spendType = 3 // 3-续费 } isShopAssistantCode := false var expireTime time.Time - if record.MemberGenre == 201 { + if record.MemberGenre == 201 { // 季度黄金 expireTime = newTime.AddDate(0, 0, 90) - } else if record.MemberGenre == 202 { + } else if record.MemberGenre == 202 { // 半年黄金 expireTime = newTime.AddDate(0, 0, 180) } else { expireTime = newTime.AddDate(1, 0, 0) @@ -527,7 +530,7 @@ func PushWXPayNotice(c *gin.Context) { return } - if record.UserCouponId > 0 { + if record.UserCouponId > 0 { // 如果使用了会员优惠券,更新优惠券状态为2-已使用 err = model.NewUserCouponQuerySet(model.DB).IDEq(record.UserCouponId).GetUpdater(). SetState(2).SetUseTime(utils.Now()).Update() if err != nil { @@ -539,7 +542,7 @@ func PushWXPayNotice(c *gin.Context) { if err != nil { logger.Error("user coupon err:", err) } else { - if userCoupon.Approach == 1 { + if userCoupon.Approach == 1 { // 当优惠券是通过店员兑换码获取,则创建邀请记录;此类用户是会员续费用户 isShopAssistantCode = true err = model.StorePromotion(userCoupon.PromotionalSales, userCoupon.Uid, nil, &user) if err != nil { @@ -556,29 +559,6 @@ func PushWXPayNotice(c *gin.Context) { if err != nil && err != model.RecordNotFound { logger.Error("err:", err) } else { - //if err == model.RecordNotFound { - // userInvite := &model.UserInvite{ - // FromUid: 0, - // UserType: 0, - // StoreId: 0, - // MemberOpenTime: newTime, - // MemberType: 2, - // ToUid: record.Uid, - // MemberStatus: 2, - // MemberLevel: record.MemberLevel, - // Action: 1, - // SpendType: 1, - // } - // err := userInvite.Create(model.DB) - // if err != nil { - // logger.Error("err:", err) - // } - // err = model.SendUserVm(record.Uid, record.MemberLevel, 100) - // if err != nil { - // logger.Error("send user vm err:", err) - // } - //} - if err == nil { //qs := model.NewUserInviteQuerySet(model.DB).ToUidEq(record.Uid).GetUpdater() if invite.Action != 2 { @@ -653,12 +633,12 @@ func PushWXPayNotice(c *gin.Context) { if invite.FromUid != 0 { inviteUser := model.GetUserByUid(invite.FromUid) if inviteUser != nil { - if inviteUser.UserType != 2 /*不是店员*/ && user.MemberLevel != 2 { // 邀请 新用户推送一次 - err = model.SendUserVm(inviteUser.Uid, record.MemberLevel, 1) - if err != nil { - logger.Error("send user vm err:", err) - } - } + //if inviteUser.UserType != 2 /*不是店员*/ && user.MemberLevel != 2 { // 邀请 新用户推送一次 + // err = model.SendUserVm(inviteUser.Uid, record.MemberLevel, 1) + // if err != nil { + // logger.Error("send user vm err:", err) + // } + //} if spendType == 2 { err = model.SendUserVm(user.Uid, record.MemberLevel, 0) @@ -820,6 +800,7 @@ func PushWXPayNotice(c *gin.Context) { RespBodyXML(c, ret) return } + isShopAssistantCode := false fmt.Println("UpgradeMember:", record.Uid) var user model.User @@ -896,7 +877,109 @@ func PushWXPayNotice(c *gin.Context) { if err != nil { logger.Error("update user coupon state err:", err) } + + var userCoupon model.UserCoupon + err = model.NewUserCouponQuerySet(model.DB).IDEq(record.UserCouponId).One(&userCoupon) + if err != nil { + logger.Error("user coupon err:", err) + } else { + if userCoupon.Approach == 1 { // 当优惠券是通过店员兑换码获取,则创建邀请记录;此类用户是会员续费用户 + isShopAssistantCode = true + err = model.StorePromotion(userCoupon.PromotionalSales, userCoupon.Uid, nil, &user) + if err != nil { + logger.Error("store promotion err:", err) + } + } + } } + + // 邀请记录 + newTime := time.Now() + var invite model.UserInvite + err = model.NewUserInviteQuerySet(model.DB).ToUidEq(record.Uid).OrderDescByCreatedAt().Limit(1).One(&invite) + if err != nil && err != model.RecordNotFound { + logger.Error("err:", err) + } else { + if err == nil { + if invite.Action != 2 { + qs := model.NewUserInviteQuerySet(model.DB).IDEq(invite.ID).GetUpdater() + if isShopAssistantCode { + qs = qs.SetInviteForm(1) + } + qs = qs.SetMemberOpenTime(newTime).SetMemberLevel(record.MemberLevel) + _, err = qs.SetMemberType(record.MemberLevel).SetMemberStatus(2). + SetAction(2).SetSpendType(4).SetMemberGenre(record.MemberGenre).UpdateNum() + if err != nil { + logger.Error("update user invite action spend type err:", err) + } + if invite.UserInviteRecordId != 0 { + go func() { + err = model.NewUserInviteRecordQuerySet(model.DB).IDEq(invite.UserInviteRecordId).GetUpdater(). + SetAction(2).SetSpendType(4).SetMemberLevel(record.MemberLevel). + SetActionTime(newTime).SetMemberGenre(record.MemberGenre).Update() + if err != nil { + logger.Error("update user invite record err:", err) + } + }() + } + } else { + inviteRecordNew := &model.UserInviteRecord{ + ToUid: invite.ToUid, + FromUid: invite.FromUid, + Action: 2, + SpendType: 4, + MemberLevel: record.MemberLevel, + First: 0, + Scan: 0, // 自动生成 + ActionTime: newTime, + MemberGenre: record.MemberGenre, + } + err = model.DB.Create(inviteRecordNew).Error + if err != nil { + logger.Error("create invite record err:", err) + } + + userInviteNew := &model.UserInvite{ + FromUid: invite.FromUid, + UserType: invite.UserType, + StoreId: invite.StoreId, + //MemberOpenTime: invite.MemberOpenTime, + MemberOpenTime: time.Now(), + MemberType: 2, + MemberStatus: 2, + ToUid: invite.ToUid, + StoreType: invite.StoreType, + Action: 2, + SpendType: 4, + MemberLevel: record.MemberLevel, + UserInviteRecordId: inviteRecordNew.ID, + FirstInvite: 0, + Scan: 0, + MemberGenre: record.MemberGenre, + } + if isShopAssistantCode { + userInviteNew.InviteForm = 1 + } + err = model.DB.Create(userInviteNew).Error + if err != nil { + logger.Error("create invite record err:", err) + } + } + } + } + + fmt.Println("用户升级---") + // 统计用户升级的数量,方便前端展示 + // 分3种情况:1-店员干预(使用了店员兑换码兑换的优惠券)、2-自动续费(开通会员时有店员邀请,原价or优惠券续费) + // 3-自动续费(自己开通会员,原价or优惠券续费) 目前只有1算店员提成,正常1和2都会算;3不算提成 + if isShopAssistantCode { // 1-店员干预(使用了店员兑换码兑换的优惠券) + model.AddCooperativeMemberUpgrade(user.CooperativeBusinessId, + uint32(invite.StoreId), invite.FromUid, user.MemberLevel, int(record.MemberLevel), false) + } else if !isShopAssistantCode && err != model.RecordNotFound { // 2-自动续费(开通会员时有店员邀请,原价or优惠券续费) + model.AddCooperativeMemberUpgrade(user.CooperativeBusinessId, + uint32(invite.StoreId), invite.FromUid, user.MemberLevel, int(record.MemberLevel), true) + } + _, err = model.NewUserOpenMemberRecordQuerySet(model.DB).IDEq(record.ID).GetUpdater().SetState(2).UpdateNum() if err != nil { logger.Error("update user open member record state:err", err) @@ -1675,6 +1758,7 @@ func HmPushWXPayNotice(c *gin.Context) { logger.Error("user err:", err) return } + isShopAssistantCode := false memberRecord := &model.UserMemberRecord{ Uid: record.Uid, @@ -1743,7 +1827,109 @@ func HmPushWXPayNotice(c *gin.Context) { if err != nil { logger.Error("update user coupon state err:", err) } + + var userCoupon model.UserCoupon + err = model.NewUserCouponQuerySet(model.DB).IDEq(record.UserCouponId).One(&userCoupon) + if err != nil { + logger.Error("user coupon err:", err) + } else { + if userCoupon.Approach == 1 { // 当优惠券是通过店员兑换码获取,则创建邀请记录;此类用户是会员续费用户 + isShopAssistantCode = true + err = model.StorePromotion(userCoupon.PromotionalSales, userCoupon.Uid, nil, &user) + if err != nil { + logger.Error("store promotion err:", err) + } + } + } } + + // 邀请记录 + newTime := time.Now() + var invite model.UserInvite + err = model.NewUserInviteQuerySet(model.DB).ToUidEq(record.Uid).OrderDescByCreatedAt().Limit(1).One(&invite) + if err != nil && err != model.RecordNotFound { + logger.Error("err:", err) + } else { + if err == nil { + if invite.Action != 2 { + qs := model.NewUserInviteQuerySet(model.DB).IDEq(invite.ID).GetUpdater() + if isShopAssistantCode { + qs = qs.SetInviteForm(1) + } + qs = qs.SetMemberOpenTime(newTime).SetMemberLevel(record.MemberLevel) + _, err = qs.SetMemberType(record.MemberLevel).SetMemberStatus(2). + SetAction(2).SetSpendType(4).SetMemberGenre(record.MemberGenre).UpdateNum() + if err != nil { + logger.Error("update user invite action spend type err:", err) + } + if invite.UserInviteRecordId != 0 { + go func() { + err = model.NewUserInviteRecordQuerySet(model.DB).IDEq(invite.UserInviteRecordId).GetUpdater(). + SetAction(2).SetSpendType(4).SetMemberLevel(record.MemberLevel). + SetActionTime(newTime).SetMemberGenre(record.MemberGenre).Update() + if err != nil { + logger.Error("update user invite record err:", err) + } + }() + } + } else { + inviteRecordNew := &model.UserInviteRecord{ + ToUid: invite.ToUid, + FromUid: invite.FromUid, + Action: 2, + SpendType: 4, + MemberLevel: record.MemberLevel, + First: 0, + Scan: 0, // 自动生成 + ActionTime: newTime, + MemberGenre: record.MemberGenre, + } + err = model.DB.Create(inviteRecordNew).Error + if err != nil { + logger.Error("create invite record err:", err) + } + + userInviteNew := &model.UserInvite{ + FromUid: invite.FromUid, + UserType: invite.UserType, + StoreId: invite.StoreId, + //MemberOpenTime: invite.MemberOpenTime, + MemberOpenTime: time.Now(), + MemberType: 2, + MemberStatus: 2, + ToUid: invite.ToUid, + StoreType: invite.StoreType, + Action: 2, + SpendType: 4, + MemberLevel: record.MemberLevel, + UserInviteRecordId: inviteRecordNew.ID, + FirstInvite: 0, + Scan: 0, + MemberGenre: record.MemberGenre, + } + if isShopAssistantCode { + userInviteNew.InviteForm = 1 + } + err = model.DB.Create(userInviteNew).Error + if err != nil { + logger.Error("create invite record err:", err) + } + } + } + } + + fmt.Println("用户升级---") + // 统计用户升级的数量,方便前端展示 + // 分3种情况:1-店员干预(使用了店员兑换码兑换的优惠券)、2-自动续费(开通会员时有店员邀请,原价or优惠券续费) + // 3-自动续费(自己开通会员,原价or优惠券续费) 目前只有1算店员提成,正常1和2都会算;3不算提成 + if isShopAssistantCode { // 1-店员干预(使用了店员兑换码兑换的优惠券) + model.AddCooperativeMemberUpgrade(user.CooperativeBusinessId, + uint32(invite.StoreId), invite.FromUid, user.MemberLevel, int(record.MemberLevel), false) + } else if !isShopAssistantCode && err != model.RecordNotFound { // 2-自动续费(开通会员时有店员邀请,原价or优惠券续费) + model.AddCooperativeMemberUpgrade(user.CooperativeBusinessId, + uint32(invite.StoreId), invite.FromUid, user.MemberLevel, int(record.MemberLevel), true) + } + _, err = model.NewUserOpenMemberRecordQuerySet(model.DB).IDEq(record.ID).GetUpdater().SetState(2).UpdateNum() if err != nil { logger.Error("update user open member record state:err", err) diff --git a/controller/user.go b/controller/user.go index 4a3aa1c..34b6bec 100644 --- a/controller/user.go +++ b/controller/user.go @@ -18,6 +18,12 @@ const ( DepositFee = 300 * 100 // 押金费 ) +type OpenMemberReq struct { + MemberLevel uint32 `json:"member_level"` // 昵称 + MemberGenre uint32 `json:"member_genre"` // 会员标记: 黄金会员:90天-201 180天-202 + UserCouponId uint32 `json:"user_coupon_id"` // 优惠券id +} + func HistoryBrowsingList(c *gin.Context) { req := struct { Page int `json:"page"` @@ -205,12 +211,16 @@ func UserInfoUpdate(c *gin.Context) { return } +// OpenMember 开通会员 +// @Summary 开通会员 +// @Tags 零售订单 +// @Produce json +// @Accept json +// @Param request body OpenMemberReq true "开通会员模型" +// @Success 200 {object} RespRet +// @Router /api/v1/user/open_member [post] func OpenMember(c *gin.Context) { - req := struct { - MemberLevel uint32 `json:"member_level"` // 昵称 - MemberGenre uint32 `json:"member_genre"` // 会员标记: 黄金会员:90天-201 180天-202 - UserCouponId uint32 `json:"user_coupon_id"` // 优惠券id - }{} + req := new(OpenMemberReq) if c.ShouldBindJSON(&req) != nil { logger.Error("parameter err") RespJson(c, status.BadRequest, nil) @@ -224,12 +234,6 @@ func OpenMember(c *gin.Context) { fmt.Println("req:", req) user := model.GetUserByUid(uc.Uid) - //configInfo, err := model.PayConfigInfo() - //if err != nil { - // logger.Error("err:", err) - // RespJson(c, status.InternalServerError, nil) - // return - //} memberConfig, err := model.GetMemberConfig(req.MemberLevel, req.MemberGenre) if err != nil { logger.Error("err:", err) @@ -265,11 +269,12 @@ func OpenMember(c *gin.Context) { return } + // 用户已开通会员且优惠券可用 if user.IsMember() && coupon.Uid == uc.Uid && coupon.MemberLevel == req.MemberLevel && coupon.ActivityId == 1 && coupon.State == 1 { totalFee -= coupon.Value - if coupon.RedeemCode == "" { + if coupon.RedeemCode == "" { // 优惠券兑换码为空,则记录用户续费日志 go func() { action := 0 if coupon.MemberLevel == 2 { @@ -291,22 +296,15 @@ func OpenMember(c *gin.Context) { _ = userLog.Add() }() } - - } else if coupon.State == 1 && coupon.ActivityType == 2 { + } else if coupon.State == 1 && coupon.ActivityType == 2 { // 关注公众号领取的优惠券 totalFee -= coupon.Value - } else { + } else { // 不符合优惠条件 req.UserCouponId = 0 } } - //webPay, err := wxpay.WebPay(uid, totalFee, user.WxOpenID, "N", wxpay.WxPayMember) - //if err != nil { - // logger.Error(errors.New("WebPay err")) - // RespJson(c, status.InternalServerError, nil) - // return - //} - //orderSn := utils.GetSerialNo32HEXString() orderSn := model.GetOrderSn() + // 备注:只有会员续费使用优惠券才会记录优惠券id:req.UserCouponId err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: orderSn, MemberLevel: req.MemberLevel, UserCouponId: req.UserCouponId, Attach: wxpay.WxPayMember, MemberGenre: req.MemberGenre}.Insert() if err != nil { @@ -326,7 +324,7 @@ func OpenMember(c *gin.Context) { genre = 2 logger.Error("payment method", err) } - // + //选择支付渠道,15号之前走微信,15号之后走河马付 if genre == model.PaymentGenreWx { webPay, err := wxpay.WebPay(orderSn, totalFee, user.WxOpenID, "N", wxpay.WxPayMember, configInfo.NotifyUrl) if err != nil { @@ -1176,6 +1174,14 @@ func UserAttendanceDetail(c *gin.Context) { return } +// InviteMemberReportList 店员邀请会员业绩报表 +// @Summary 店员邀请会员业绩报表 +// @Tags 会员推广, V1.2.0 +// @Produce json +// @Accept json +// @Param request body model.InviteMemberReportListReq true "店员邀请会员业绩报表模型" +// @Success 200 {object} model.InviteMemberReportListResp +// @Router /api/v1/cooperative_business/invite_report [post] func InviteMemberReportList(c *gin.Context) { req := model.InviteMemberReportListReq{} if c.ShouldBindJSON(&req) != nil { @@ -1202,11 +1208,12 @@ func InviteMemberReportList(c *gin.Context) { return } - ret := map[string]interface{}{ - "list": list, - "cur_page": req.PageNum, - "total_page": totalPage, + ret := model.InviteMemberReportListResp{ + List: list, + CurPage: req.PageNum, + TotalPage: totalPage, } + RespOK(c, ret) return } diff --git a/lib/wxpay/wx_pay.go b/lib/wxpay/wx_pay.go index 0374d34..077eecf 100644 --- a/lib/wxpay/wx_pay.go +++ b/lib/wxpay/wx_pay.go @@ -46,7 +46,7 @@ const ( WxPayRentCard = "rent_card_pay" // 租卡 WxPayDeposit = "deposit_pay" // 押金 WxPayBuyGoods = "buy_goods" // 购买商品 - WxPayUpgradeMember = "upgrade_member" // 多级会员 + WxPayUpgradeMember = "upgrade_member" // 升级会员 WxPayMemberExpireDelay = "member_expire_delay" // 会员过期滞纳金 WxPayShareCardRetrieve = "share_card_retrieve" // 收回卡 WxPayPostagePackage = "postage_package" // 运费包 @@ -63,7 +63,7 @@ const ( HmPayApiUrl = "https://hmpay.sandpay.com.cn/gateway/api" ) -//web 微信支付 +// web 微信支付 func WebPay(orderId string, totalFee uint32, openId, profitSharing, attach, notifyUrl string) (*Sextuple, error) { now := time.Now().Local() strTime := fmt.Sprintf("%04d%02d%02d%02d%02d%02d", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second()) @@ -903,7 +903,7 @@ const ( WxRootCaFile = "./configs/merchant/apiclient_cert.pem" ) -//https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2 +// https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2 type WxTransferReq struct { XMLName xml.Name `xml:"xml"` //xml标签 MchAppid string `xml:"mch_appid" json:"mch_appid"` //微信分配的小程序ID,必须 @@ -930,7 +930,7 @@ type WxTransferResp struct { PaymentNo string `xml:"payment_no,CDATA"` } -//给用户打款 +// 给用户打款 func Transfer(amount uint32, openId, desc string) (*WxTransferResp, error) { tradeNO := GenTradeNo() nonce := GenRandStr(NonceStringLength) @@ -1122,7 +1122,7 @@ type HmPayUnifiedOrderRsp struct { Sign string `json:"sign"` } -//hm 微信支付 +// hm 微信支付 func HmJsPayUnifiedOrder(orderId string, totalFee uint32, openId, notifyUrl string) (*HmPayUnifiedOrderPayData, error) { now := time.Now().Local() strTime := fmt.Sprintf("%04d%02d%02d%02d%02d%02d", now.Year(), now.Month(), now.Day(), now.Hour(), diff --git a/model/cooperative_business.go b/model/cooperative_business.go index 01826d7..b1eb4eb 100644 --- a/model/cooperative_business.go +++ b/model/cooperative_business.go @@ -9,8 +9,9 @@ import ( "time" ) -//go:generate goqueryset -in cooperative_business.go // gen:qs +// +//go:generate goqueryset -in cooperative_business.go type CooperativeBusiness struct { Model Name string `json:"name" binding:"required"` // @@ -81,9 +82,12 @@ type CooperativeMemberPromotion struct { Date string `json:"date" gorm:"index"` // State string `json:"state"` // 待发起结算 待财务打款 已结算 - RenewalGoldCount uint32 `json:"renewal_gold_count" gorm:"default:0"` // 续费黄金会员数量 - RenewalPlatinumCount uint32 `json:"renewal_platinum_count" gorm:"default:0"` // 续费白金会员数量 - RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count" gorm:"default:0"` // 续费黑金会员数量 + RenewalGoldCount uint32 `json:"renewal_gold_count" gorm:"default:0"` // 续费黄金会员数量 + RenewalPlatinumCount uint32 `json:"renewal_platinum_count" gorm:"default:0"` // 续费白金会员数量 + RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count" gorm:"default:0"` // 续费黑金会员数量 + UpgradeGoldToPlatinumCount uint32 `json:"upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量 + UpgradeGoldToBlackCount uint32 `json:"upgrade_gold_to_black_count" gorm:"default:0"` // 升级:黄金->黑金数量 + UpgradePlatinumToBlackCount uint32 `json:"upgrade_platinum_to_black_count" gorm:"default:0"` // 升级:白金->黑金数量 // cooperative_member_promotion } @@ -92,16 +96,19 @@ type CooperativeMemberPromotion struct { // gen:qs type CooperativeMemberPromotionStore struct { Model - CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` - CooperativeName string `json:"cooperative_name"` // 合作商名称 - StoreId uint32 `json:"store_id" gorm:"index"` // 门店id - GoldCount uint32 `json:"gold_count" gorm:"default:0"` // 黄金会员数量 - PlatinumCount uint32 `json:"platinum_count" gorm:"default:0"` // 白金会员数量 - BlackGoldCount uint32 `json:"black_gold_count" gorm:"default:0"` // 黑金会员数量 - Date string `json:"date" gorm:"index"` // - RenewalGoldCount uint32 `json:"renewal_gold_count" gorm:"default:0"` // 续费黄金会员数量 - RenewalPlatinumCount uint32 `json:"renewal_platinum_count" gorm:"default:0"` // 续费白金会员数量 - RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count" gorm:"default:0"` // 续费黑金会员数量 + CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` + CooperativeName string `json:"cooperative_name"` // 合作商名称 + StoreId uint32 `json:"store_id" gorm:"index"` // 门店id + GoldCount uint32 `json:"gold_count" gorm:"default:0"` // 黄金会员数量 + PlatinumCount uint32 `json:"platinum_count" gorm:"default:0"` // 白金会员数量 + BlackGoldCount uint32 `json:"black_gold_count" gorm:"default:0"` // 黑金会员数量 + Date string `json:"date" gorm:"index"` // + RenewalGoldCount uint32 `json:"renewal_gold_count" gorm:"default:0"` // 续费黄金会员数量 + RenewalPlatinumCount uint32 `json:"renewal_platinum_count" gorm:"default:0"` // 续费白金会员数量 + RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count" gorm:"default:0"` // 续费黑金会员数量 + UpgradeGoldToPlatinumCount uint32 `json:"upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量 + UpgradeGoldToBlackCount uint32 `json:"upgrade_gold_to_black_count" gorm:"default:0"` // 升级:黄金->黑金数量 + UpgradePlatinumToBlackCount uint32 `json:"upgrade_platinum_to_black_count" gorm:"default:0"` // 升级:白金->黑金数量 // cooperative_member_promotion_store } @@ -109,15 +116,18 @@ type CooperativeMemberPromotionStore struct { // gen:qs type CooperativeMemberPromotionDay struct { Model - CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` - CooperativeName string `json:"cooperative_name"` // 合作商名称 - GoldCount uint32 `json:"gold_count" gorm:"default:0"` // 黄金会员数量 - PlatinumCount uint32 `json:"platinum_count" gorm:"default:0"` // 白金会员数量 - BlackGoldCount uint32 `json:"black_gold_count" gorm:"default:0"` // 黑金会员数量 - DayTime string `json:"day_time" gorm:"index"` // - RenewalGoldCount uint32 `json:"renewal_gold_count" gorm:"default:0"` // 续费黄金会员数量 - RenewalPlatinumCount uint32 `json:"renewal_platinum_count" gorm:"default:0"` // 续费白金会员数量 - RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count" gorm:"default:0"` // 续费黑金会员数量 + CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` + CooperativeName string `json:"cooperative_name"` // 合作商名称 + GoldCount uint32 `json:"gold_count" gorm:"default:0"` // 黄金会员数量 + PlatinumCount uint32 `json:"platinum_count" gorm:"default:0"` // 白金会员数量 + BlackGoldCount uint32 `json:"black_gold_count" gorm:"default:0"` // 黑金会员数量 + DayTime string `json:"day_time" gorm:"index"` // + RenewalGoldCount uint32 `json:"renewal_gold_count" gorm:"default:0"` // 续费黄金会员数量 + RenewalPlatinumCount uint32 `json:"renewal_platinum_count" gorm:"default:0"` // 续费白金会员数量 + RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count" gorm:"default:0"` // 续费黑金会员数量 + UpgradeGoldToPlatinumCount uint32 `json:"upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量 + UpgradeGoldToBlackCount uint32 `json:"upgrade_gold_to_black_count" gorm:"default:0"` // 升级:黄金->黑金数量 + UpgradePlatinumToBlackCount uint32 `json:"upgrade_platinum_to_black_count" gorm:"default:0"` // 升级:白金->黑金数量 // cooperative_member_promotion_day } @@ -125,16 +135,19 @@ type CooperativeMemberPromotionDay struct { // gen:qs type CooperativeMemberPromotionStoreDay struct { Model - CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` - CooperativeName string `json:"cooperative_name"` // 合作商名称 - StoreId uint32 `json:"store_id" gorm:"index"` // 门店id - GoldCount uint32 `json:"gold_count" gorm:"default:0"` // 黄金会员数量 - PlatinumCount uint32 `json:"platinum_count" gorm:"default:0"` // 白金会员数量 - BlackGoldCount uint32 `json:"black_gold_count" gorm:"default:0"` // 黑金会员数量 - DayTime string `json:"day_time" gorm:"index"` // - RenewalGoldCount uint32 `json:"renewal_gold_count" gorm:"default:0"` // 续费黄金会员数量 - RenewalPlatinumCount uint32 `json:"renewal_platinum_count" gorm:"default:0"` // 续费白金会员数量 - RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count" gorm:"default:0"` // 续费黑金会员数量 + CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` + CooperativeName string `json:"cooperative_name"` // 合作商名称 + StoreId uint32 `json:"store_id" gorm:"index"` // 门店id + GoldCount uint32 `json:"gold_count" gorm:"default:0"` // 黄金会员数量 + PlatinumCount uint32 `json:"platinum_count" gorm:"default:0"` // 白金会员数量 + BlackGoldCount uint32 `json:"black_gold_count" gorm:"default:0"` // 黑金会员数量 + DayTime string `json:"day_time" gorm:"index"` // + RenewalGoldCount uint32 `json:"renewal_gold_count" gorm:"default:0"` // 续费黄金会员数量 + RenewalPlatinumCount uint32 `json:"renewal_platinum_count" gorm:"default:0"` // 续费白金会员数量 + RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count" gorm:"default:0"` // 续费黑金会员数量 + UpgradeGoldToPlatinumCount uint32 `json:"upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量 + UpgradeGoldToBlackCount uint32 `json:"upgrade_gold_to_black_count" gorm:"default:0"` // 升级:黄金->黑金数量 + UpgradePlatinumToBlackCount uint32 `json:"upgrade_platinum_to_black_count" gorm:"default:0"` // 升级:白金->黑金数量 // cooperative_member_promotion_store_day } @@ -813,3 +826,350 @@ func (m *InviteMemberReport) AddRenewal(gdb *gorm.DB, memberLevel int) error { } return nil } + +// AddCooperativeMemberUpgrade 同步记录会员升级数量 +func AddCooperativeMemberUpgrade(cooperativeId, storeId, assistantUid, beforeMemberLevel uint32, memberLevel int, autoFlag bool) { + defer func() { + if err := recover(); err != nil { + logger.Error("err:", err) + } + }() + var cooperativeBusiness CooperativeBusiness + err := NewCooperativeBusinessQuerySet(DB).IDEq(cooperativeId).One(&cooperativeBusiness) + if err != nil { + logger.Error("cooperative business err:", err) + return + } + + go func() { + promotion := &CooperativeMemberPromotion{CooperativeBusinessId: cooperativeId, CooperativeName: cooperativeBusiness.Name} + promotionStore := &CooperativeMemberPromotionStore{CooperativeBusinessId: cooperativeId, CooperativeName: cooperativeBusiness.Name} + promotionDay := &CooperativeMemberPromotionDay{CooperativeBusinessId: cooperativeId, CooperativeName: cooperativeBusiness.Name} + promotionStoreDay := &CooperativeMemberPromotionStoreDay{CooperativeBusinessId: cooperativeId, CooperativeName: cooperativeBusiness.Name} + inviteReport := &InviteMemberReport{CooperativeBusinessId: cooperativeId, CooperativeName: cooperativeBusiness.Name, + Uid: assistantUid, StoreId: storeId, + } + begin := DB.Begin() + err = promotion.AddUpgrade(begin, beforeMemberLevel, memberLevel) + if err != nil { + begin.Rollback() + logger.Error("promotion add promotion err:", err) + return + } + + err = promotionStore.AddUpgrade(begin, beforeMemberLevel, memberLevel, storeId) + if err != nil { + begin.Rollback() + logger.Error("promotion add promotion err:", err) + return + } + + err = promotionDay.AddUpgrade(begin, beforeMemberLevel, memberLevel) + if err != nil { + begin.Rollback() + logger.Error("promotion add promotion err:", err) + return + } + + err = promotionStoreDay.AddUpgrade(begin, beforeMemberLevel, memberLevel, storeId) + if err != nil { + begin.Rollback() + logger.Error("promotion add promotion err:", err) + return + } + + err = inviteReport.AddUpgrade(begin, beforeMemberLevel, memberLevel, autoFlag) + if err != nil { + begin.Rollback() + logger.Error("promotion add promotion err:", err) + return + } + err = begin.Commit().Error + if err != nil { + begin.Rollback() + logger.Error("commit err:", err) + return + } + }() +} + +func (m *CooperativeMemberPromotion) AddUpgrade(gdb *gorm.DB, beforeMemberLevel uint32, memberLevel int) error { + dateString := utils.MonthDate() + if memberLevel < 0 { + return errors.New("member level err") + } + m.Date = dateString + sql := "" + switch memberLevel { + case 4: // 白金:黄金->白金 + sql = "UPDATE cooperative_member_promotion SET upgrade_gold_to_platinum_count=upgrade_gold_to_platinum_count+1 " + + fmt.Sprintf("WHERE date='%s' AND cooperative_business_id=%d", dateString, m.CooperativeBusinessId) + m.UpgradeGoldToPlatinumCount = 1 + case 5: + if beforeMemberLevel == 2 { // 黄金->黑金 + sql = "UPDATE cooperative_member_promotion SET upgrade_gold_to_black_count=upgrade_gold_to_black_count+1 " + + fmt.Sprintf("WHERE date='%s' AND cooperative_business_id=%d", dateString, m.CooperativeBusinessId) + m.UpgradeGoldToBlackCount = 1 + } else { // 白金-->黑金 + sql = "UPDATE cooperative_member_promotion SET upgrade_platinum_to_black_count=upgrade_platinum_to_black_count+1 " + + fmt.Sprintf("WHERE date='%s' AND cooperative_business_id=%d", dateString, m.CooperativeBusinessId) + m.UpgradePlatinumToBlackCount = 1 + } + } + fmt.Println("邀请会员sql:", sql) + exist, err := QueryRecordExist(fmt.Sprintf( + "SELECT * FROM cooperative_member_promotion WHERE cooperative_business_id=%d AND date='%s' ", + m.CooperativeBusinessId, dateString)) + if err != nil { + logger.Error("cooperative member promotion record exist err:", err) + return err + } + + if exist { + err = gdb.Exec(sql).Error + if err != nil { + logger.Error("update cooperative member promotion err:", err) + return err + } + } else { + + m.State = PromotionStateUnSettlement + err = gdb.Create(m).Error + if err != nil { + logger.Error("create cooperative member promotion err:", err) + return err + } + } + return nil +} + +func (m *CooperativeMemberPromotionStore) AddUpgrade(gdb *gorm.DB, beforeMemberLevel uint32, memberLevel int, storeId uint32) error { + dateString := utils.MonthDate() + if memberLevel < 0 { + return errors.New("member level err") + } + m.Date = dateString + m.StoreId = storeId + sql := "" + switch memberLevel { + case 4: // 白金:黄金->白金 + sql = "UPDATE cooperative_member_promotion_store SET upgrade_gold_to_platinum_count=upgrade_gold_to_platinum_count+1 " + + fmt.Sprintf("WHERE date='%s' AND cooperative_business_id=%d AND store_id=%d", + dateString, m.CooperativeBusinessId, storeId) + m.UpgradeGoldToPlatinumCount = 1 + case 5: + if beforeMemberLevel == 2 { // 黄金->黑金 + sql = "UPDATE cooperative_member_promotion_store SET upgrade_gold_to_black_count=upgrade_gold_to_black_count+1 " + + fmt.Sprintf("WHERE date='%s' AND cooperative_business_id=%d AND store_id=%d", + dateString, m.CooperativeBusinessId, storeId) + m.UpgradeGoldToBlackCount = 1 + } else { // 白金->黑金 + sql = "UPDATE cooperative_member_promotion_store SET upgrade_platinum_to_black_count=upgrade_platinum_to_black_count+1 " + + fmt.Sprintf("WHERE date='%s' AND cooperative_business_id=%d AND store_id=%d", + dateString, m.CooperativeBusinessId, storeId) + m.UpgradePlatinumToBlackCount = 1 + } + } + exist, err := QueryRecordExist(fmt.Sprintf( + "SELECT * FROM cooperative_member_promotion_store WHERE cooperative_business_id=%d AND date='%s' AND store_id=%d", + m.CooperativeBusinessId, dateString, storeId)) + if err != nil { + logger.Error("cooperative member promotion record exist err:", err) + return err + } + if exist { + err = gdb.Exec(sql).Error + if err != nil { + logger.Error("update cooperative member promotion err:", err) + return err + } + } else { + + err = gdb.Create(m).Error + if err != nil { + logger.Error("create cooperative member promotion err:", err) + return err + } + } + return nil +} + +func (m *CooperativeMemberPromotionDay) AddUpgrade(gdb *gorm.DB, beforeMemberLevel uint32, memberLevel int) error { + dayString := utils.TodayZeroDateFormat() + if memberLevel < 0 { + return errors.New("member level err") + } + m.DayTime = dayString + sql := "" + switch memberLevel { + case 4: // 黄金->白金 + sql = "UPDATE cooperative_member_promotion_day SET upgrade_gold_to_platinum_count=upgrade_gold_to_platinum_count+1 " + + fmt.Sprintf("WHERE day_time='%s' AND cooperative_business_id=%d", dayString, m.CooperativeBusinessId) + m.UpgradeGoldToPlatinumCount = 1 + case 5: + if beforeMemberLevel == 2 { // 黄金->黑金 + sql = "UPDATE cooperative_member_promotion_day SET upgrade_gold_to_black_count=upgrade_gold_to_black_count+1 " + + fmt.Sprintf("WHERE day_time='%s' AND cooperative_business_id=%d", dayString, m.CooperativeBusinessId) + m.UpgradeGoldToBlackCount = 1 + } else { // 白金->黑金 + sql = "UPDATE cooperative_member_promotion_day SET upgrade_platinum_to_black_count=upgrade_platinum_to_black_count+1 " + + fmt.Sprintf("WHERE day_time='%s' AND cooperative_business_id=%d", dayString, m.CooperativeBusinessId) + m.UpgradePlatinumToBlackCount = 1 + } + } + exist, err := QueryRecordExist(fmt.Sprintf( + "SELECT * FROM cooperative_member_promotion_day WHERE cooperative_business_id=%d AND day_time='%s'", + m.CooperativeBusinessId, dayString)) + if err != nil { + logger.Error("cooperative member promotion record exist err:", err) + return err + } + if exist { + err = gdb.Exec(sql).Error + if err != nil { + logger.Error("update cooperative member promotion day err:", err) + return err + } + } else { + + err = gdb.Create(m).Error + if err != nil { + logger.Error("create cooperative member promotion day err:", err) + return err + } + } + return nil +} + +func (m *CooperativeMemberPromotionStoreDay) AddUpgrade(gdb *gorm.DB, beforeMemberLevel uint32, memberLevel int, storeId uint32) error { + dateString := utils.TodayZeroDateFormat() + if memberLevel < 0 { + return errors.New("member level err") + } + m.DayTime = dateString + m.StoreId = storeId + sql := "" + switch memberLevel { + case 4: // 白金:黄金->白金 + sql = "UPDATE cooperative_member_promotion_store_day SET upgrade_gold_to_platinum_count=upgrade_gold_to_platinum_count+1 " + + fmt.Sprintf("WHERE day_time='%s' AND cooperative_business_id=%d AND store_id=%d", + dateString, m.CooperativeBusinessId, storeId) + m.UpgradeGoldToPlatinumCount = 1 + case 5: + if beforeMemberLevel == 2 { // 黄金->黑金 + sql = "UPDATE cooperative_member_promotion_store_day SET upgrade_gold_to_black_count=upgrade_gold_to_black_count+1 " + + fmt.Sprintf("WHERE day_time='%s' AND cooperative_business_id=%d AND store_id=%d", + dateString, m.CooperativeBusinessId, storeId) + m.UpgradeGoldToBlackCount = 1 + } else { + sql = "UPDATE cooperative_member_promotion_store_day SET upgrade_platinum_to_black_count=upgrade_platinum_to_black_count+1 " + + fmt.Sprintf("WHERE day_time='%s' AND cooperative_business_id=%d AND store_id=%d", + dateString, m.CooperativeBusinessId, storeId) + m.UpgradePlatinumToBlackCount = 1 + } + } + exist, err := QueryRecordExist("SELECT * FROM cooperative_member_promotion_store_day " + + fmt.Sprintf("WHERE cooperative_business_id=%d AND day_time='%s' AND store_id=%d", + m.CooperativeBusinessId, dateString, storeId)) + if err != nil { + logger.Error("cooperative member promotion store day record exist err:", err) + return err + } + if exist { + err = gdb.Exec(sql).Error + if err != nil { + logger.Error("update cooperative member promotion store day err:", err) + return err + } + } else { + + err = gdb.Create(m).Error + if err != nil { + logger.Error("create cooperative member promotion store day err:", err) + return err + } + } + return nil +} + +func (m *InviteMemberReport) AddUpgrade(gdb *gorm.DB, beforeMemberLevel uint32, memberLevel int, autoFlag bool) error { + dateString := utils.MonthDate() + if memberLevel < 0 { + return errors.New("member level err") + } + if gdb == nil { + gdb = DB + } + if m.StoreId == 0 { + return errors.New("store id is null") + } + if m.Uid == 0 { + return errors.New("uid is null") + } + m.Date = dateString + + sql := "" + if autoFlag { // 自动 + switch memberLevel { + case 4: // 白金:黄金->白金 + sql = "UPDATE invite_member_report SET upgrade_gold_to_platinum_count=upgrade_gold_to_platinum_count+1 " + + fmt.Sprintf("WHERE date='%s' AND cooperative_business_id=%d AND store_id=%d AND uid=%d", + dateString, m.CooperativeBusinessId, m.StoreId, m.Uid) + m.UpgradeGoldToPlatinumCount = 1 + case 5: // 黑金 + if beforeMemberLevel == 2 { // 黄金->黑金 + sql = "UPDATE invite_member_report SET upgrade_gold_to_black_count=upgrade_gold_to_black_count+1 " + + fmt.Sprintf("WHERE date='%s' AND cooperative_business_id=%d AND store_id=%d AND uid=%d", + dateString, m.CooperativeBusinessId, m.StoreId, m.Uid) + m.UpgradeGoldToBlackCount = 1 + } else { // 白金->黑金 + sql = "UPDATE invite_member_report SET upgrade_platinum_to_black_count=upgrade_platinum_to_black_count+1 " + + fmt.Sprintf("WHERE date='%s' AND cooperative_business_id=%d AND store_id=%d AND uid=%d", + dateString, m.CooperativeBusinessId, m.StoreId, m.Uid) + m.UpgradePlatinumToBlackCount = 1 + } + } + } else { // 干预 + switch memberLevel { + case 4: // 白金:黄金->白金 + sql = "UPDATE invite_member_report SET invite_upgrade_gold_to_platinum_count=invite_upgrade_gold_to_platinum_count+1 " + + fmt.Sprintf("WHERE date='%s' AND cooperative_business_id=%d AND store_id=%d AND uid=%d", + dateString, m.CooperativeBusinessId, m.StoreId, m.Uid) + m.InviteUpgradeGoldToPlatinumCount = 1 + case 5: // 黑金 + if beforeMemberLevel == 2 { // 黄金->黑金 + sql = "UPDATE invite_member_report SET invite_upgrade_gold_to_black_count=invite_upgrade_gold_to_black_count+1 " + + fmt.Sprintf("WHERE date='%s' AND cooperative_business_id=%d AND store_id=%d AND uid=%d", + dateString, m.CooperativeBusinessId, m.StoreId, m.Uid) + m.InviteUpgradeGoldToBlackCount = 1 + } else { // 白金->黑金 + sql = "UPDATE invite_member_report SET invite_upgrade_platinum_to_black_count=invite_upgrade_platinum_to_black_count+1 " + + fmt.Sprintf("WHERE date='%s' AND cooperative_business_id=%d AND store_id=%d AND uid=%d", + dateString, m.CooperativeBusinessId, m.StoreId, m.Uid) + m.InviteUpgradePlatinumToBlackCount = 1 + } + } + } + + exist, err := QueryRecordExist(fmt.Sprintf( + "SELECT * FROM invite_member_report WHERE cooperative_business_id=%d AND date='%s' AND store_id=%d AND uid=%d", + m.CooperativeBusinessId, dateString, m.StoreId, m.Uid)) + if err != nil { + logger.Error("cooperative member promotion record exist err:", err) + return err + } + if exist { + err = gdb.Exec(sql).Error + if err != nil { + logger.Error("update cooperative member promotion err:", err) + return err + } + } else { + err = gdb.Create(m).Error + if err != nil { + logger.Error("create cooperative member promotion err:", err) + return err + } + } + return nil +} diff --git a/model/coupon.go b/model/coupon.go index fee5b5d..ba38244 100644 --- a/model/coupon.go +++ b/model/coupon.go @@ -17,8 +17,9 @@ const ( // CouponValidity = renewalConfig.CouponValidity //} -//go:generate goqueryset -in coupon.go // gen:qs +// +//go:generate goqueryset -in coupon.go type Coupon struct { Model @@ -46,13 +47,13 @@ type UserCoupon struct { ActivityType uint32 `json:"activity_type"` // 活动类型 1-会员续费 2-关注公众号 3-运费包 ActivityId uint32 `json:"activity_id" gorm:"index"` Value uint32 `json:"value"` - State uint32 `json:"state"` // 1-未使用 2-已使用 3-已过期 - ActiveStart time.Time `json:"active_start"` // 有效期开始 - ActiveEnd time.Time `json:"active_end"` // 有效期结束 零值永不结束 - UseTime time.Time `json:"use_time"` // - MemberLevel uint32 `json:"member_level"` // 会员等级 1-用户 2-会员 - Approach uint32 `json:"approach"` // 获取途径: - PromotionalSales uint32 `json:"promotional_sales"` + State uint32 `json:"state"` // 1-未使用 2-已使用 3-已过期 + ActiveStart time.Time `json:"active_start"` // 有效期开始 + ActiveEnd time.Time `json:"active_end"` // 有效期结束 零值永不结束 + UseTime time.Time `json:"use_time"` // + MemberLevel uint32 `json:"member_level"` // 会员等级 1-用户 2-会员 + Approach uint32 `json:"approach"` // 获取途径:1-通过店员兑换码获取 + PromotionalSales uint32 `json:"promotional_sales"` // 推广人员用户id RedeemCode string `json:"redeem_code"` Availability uint32 `json:"availability" gorm:"-"` // 1-不可用 2-可用 Coupon *Coupon `json:"coupon" gorm:"-"` diff --git a/model/user.go b/model/user.go index ff11f1f..a0abbaf 100644 --- a/model/user.go +++ b/model/user.go @@ -60,6 +60,20 @@ type User struct { } +type AuthLoginReq struct { + Code string `json:"code" binding:"required"` // 小程序code码 + InviteUid uint32 `json:"invite_uid"` // 邀请人用户ID +} + +type AuthLoginResp struct { + AccessToken string `json:"access_token"` + AccessExpire int64 `json:"access_expire"` + RefreshToken string `json:"refresh_token"` + RefreshExpire int64 `json:"refresh_expire"` + Uid uint32 `json:"uid"` + AccessCreatedAt time.Time `json:"access_created_at"` +} + func (o *User) TableName() string { return "user" } @@ -399,16 +413,26 @@ type InviteMemberReport struct { PlatinumCount uint32 `json:"platinum_count"` // 白金数量 BlackGoldCount uint32 `json:"black_gold_count"` // 黑金数量 //ReportTime string `json:"report_time" gorm:"index"` // 业绩时间 - Date string `json:"date" gorm:"index"` // 业绩时间 - DeductAmount uint32 `json:"deduct_amount"` // 店员提成 - CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id - CooperativeName string `json:"cooperative_name"` // 合作商名称 - GoldDeduct uint32 `json:"gold_deduct"` // 黄金会员提成 - PlatinumDeduct uint32 `json:"platinum_deduct"` // 白金会员提成 - BlackGoldDeduct uint32 `json:"black_gold_deduct"` // 黑金会员提成 - RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费黄金会员数量 - RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量 - RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count"` // 续费黑金会员数量 + Date string `json:"date" gorm:"index"` // 业绩时间 + DeductAmount uint32 `json:"deduct_amount"` // 店员提成 + CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id + CooperativeName string `json:"cooperative_name"` // 合作商名称 + GoldDeduct uint32 `json:"gold_deduct"` // 黄金会员提成 + PlatinumDeduct uint32 `json:"platinum_deduct"` // 白金会员提成 + BlackGoldDeduct uint32 `json:"black_gold_deduct"` // 黑金会员提成 + RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费黄金会员数量(自动) + RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量(自动) + RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count"` // 续费黑金会员数量(自动) + UpgradeGoldToPlatinumCount uint32 `json:"upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量(自动) + UpgradeGoldToBlackCount uint32 `json:"upgrade_gold_to_black_count" gorm:"default:0"` // 升级:黄金->黑金数量(自动) + UpgradePlatinumToBlackCount uint32 `json:"upgrade_platinum_to_black_count" gorm:"default:0"` // 升级:白金->黑金数量(自动) + InviteRenewalGoldCount uint32 `json:"invite_renewal_gold_count"` // 续费黄金会员数量(干预) + InviteRenewalPlatinumCount uint32 `json:"invite_renewal_platinum_count"` // 续费白金会员数量(干预) + InviteRenewalBlackGoldCount uint32 `json:"invite_renewal_black_gold_count"` // 续费黑金会员数量(干预) + InviteUpgradeGoldToPlatinumCount uint32 `json:"invite_upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量(干预) + InviteUpgradeGoldToBlackCount uint32 `json:"invite_upgrade_gold_to_black_count" gorm:"default:0"` // 升级:黄金->黑金数量(干预) + InviteUpgradePlatinumToBlackCount uint32 `json:"invite_upgrade_platinum_to_black_count" gorm:"default:0"` // 升级:白金->黑金数量(干预) + // invite_member_report User *User `json:"user" gorm:"-"` } @@ -552,11 +576,11 @@ func (m *User) AppletQRCodeUpdate() error { } type UserInviteListReq struct { - Page int `json:"page"` - PageSize int `json:"page_size"` - Uid uint32 `json:"uid"` - MemberType int `json:"member_type"` // 0-全部 1-普通用户 2-会员 - SpendType uint32 `json:"spend_type"` // 2-开通会员 3-续费 + Page int `json:"page"` // 页码 + PageSize int `json:"page_size"` // 每页条数 + Uid uint32 `json:"uid"` // 当前用户ID + MemberType int `json:"member_type"` // 会员类型:0-全部 1-普通用户 2-会员 + SpendType uint32 `json:"spend_type"` // 操作类型:2-开通会员 3-续费 4-升级 StartTime string `json:"start_time"` // 开始时间 EndTime string `json:"end_time"` // 结束时间 } @@ -589,31 +613,31 @@ func (m *UserInviteListReq) InviteUserList() (*UserInviteListResp, error) { m.PageSize = 10 } - qs := NewUserInviteQuerySet(DB).FromUidEq(m.Uid).ActionEq(2) + qs := NewUserInviteQuerySet(DB).FromUidEq(m.Uid).ActionEq(2) // action=2,激活邀请 if m.MemberType != 0 { qs = qs.MemberTypeEq(uint32(m.MemberType)) - if m.MemberType == 2 { + if m.MemberType == 2 { // 查询会员数据 user := GetUserByUid(m.Uid) //qs = qs.FirstInviteNe(1).SpendTypeEq(2) //qs = qs.SpendTypeEq(2) //qs = qs.SpendTypeNotIn([]uint32{3, 4}...) - if user.CooperativeBusinessId == 1 { + if user.CooperativeBusinessId == 1 { // 合作商为迪为 if m.SpendType != 0 { qs = qs.SpendTypeEq(m.SpendType) - if m.SpendType == 3 { + if m.SpendType == 3 { // 如果是3-续费,则查询是否为店员推广续费,即:invite_form = 1 qs = qs.InviteFormEq(1) } - } else { + } else { // 如果没有指定spend_type,则默认查询2-开通会员,3-续费 qs = qs.SpendTypeIn([]uint32{2, 3}...) } - } else { + } else { // 如果不是迪为合作商,则查询非3-续费,4-升级的数据 qs = qs.SpendTypeNotIn([]uint32{3, 4}...) } } } - if m.MemberType == 0 && m.SpendType != 0 { + if m.MemberType == 0 && m.SpendType != 0 { // 被邀请用户为0-未注册用户,操作类型不为0 qs = qs.SpendTypeEq(m.SpendType) - if m.SpendType == 3 { + if m.SpendType == 3 { // 如果是3-续费,则查询是否为店员推广续费,即:invite_form = 1 qs = qs.InviteFormEq(1) } } @@ -623,7 +647,7 @@ func (m *UserInviteListReq) InviteUserList() (*UserInviteListResp, error) { logger.Errorf("err:%#v", err) return resp, err } - if m.MemberType == 2 { + if m.MemberType == 2 { // 如果被邀请用户是2-会员,则比较会员注册时间,否则比较记录时间 qs = qs.MemberOpenTimeGte(parse) } else { qs = qs.CreatedAtGte(parse) @@ -1017,6 +1041,12 @@ type InviteMemberReportListReq struct { Uid uint32 `json:"uid"` } +type InviteMemberReportListResp struct { + CurPage int `json:"cur_page"` + TotalPage int `json:"total_page"` + List []InviteMemberReport `json:"list"` +} + func (m *InviteMemberReportListReq) List() ([]InviteMemberReport, int, error) { var memberReport []InviteMemberReport qs := NewInviteMemberReportQuerySet(DB).UidEq(m.Uid) @@ -1127,6 +1157,7 @@ type MemberStatisticDaily struct { Accumulative uint32 `json:"accumulative"` } +// StorePromotion 记录促销情况 func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error { //inviteUid := uint32(0) //uid := uint32(0) @@ -1143,7 +1174,7 @@ func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error { } nowTime := time.Now() - if inviteUser.UserType == 2 && user.Uid != 0 { + if inviteUser.UserType == 2 && user.Uid != 0 { // 是店员邀请并且用户id不为空 exist, err := QueryRecordExist( fmt.Sprintf("SELECT * FROM user_invite_record WHERE to_uid = %d AND from_uid = %d ", user.Uid, inviteUid)) @@ -1155,10 +1186,10 @@ func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error { firstInviteRecord := &UserInviteRecord{ ToUid: user.Uid, FromUid: inviteUid, - Action: 2, - SpendType: 1, - MemberLevel: 0, - First: 1, + Action: 2, // 激活邀请 + SpendType: 1, // 未开通 + MemberLevel: 0, // 未开通会员 + First: 1, // 首次邀请 Scan: 1, ActionTime: nowTime, } @@ -1166,14 +1197,13 @@ func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error { if err != nil { logger.Error("create user invite record err:", err) } - // 添加首次扫码 } // 扫码记录 inviteRecord := &UserInviteRecord{ ToUid: user.Uid, FromUid: inviteUid, - Action: 1, - SpendType: 1, + Action: 1, // 未激活 + SpendType: 1, // 未开通 MemberLevel: 0, First: 0, Scan: 1, @@ -1199,19 +1229,19 @@ func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error { memberLevel = MemberTypeConsumer } invite := &UserInvite{ - FromUid: inviteUid, - UserType: inviteUser.UserType, - StoreId: inviteUser.StoreId, - MemberOpenTime: nowTime, - MemberType: memberLevel, - MemberStatus: 1, - ToUid: user.Uid, - Action: 1, - SpendType: 1, - UserInviteRecordId: inviteRecord.ID, - FirstInvite: 0, // TODO - Scan: 1, - InviteForm: 1, + FromUid: inviteUid, // 邀请人用户id + UserType: inviteUser.UserType, // 邀请人用户类型 + StoreId: inviteUser.StoreId, // 邀请人门店id + MemberOpenTime: nowTime, // 开通会员时间 + MemberType: memberLevel, // 被邀请用户类型 + MemberStatus: 1, // 被邀请用户会员状态 1-未开通 + ToUid: user.Uid, // 被邀请用户id + Action: 1, // 未激活 + SpendType: 1, // 未开通 + UserInviteRecordId: inviteRecord.ID, // 邀请记录id + FirstInvite: 0, // TODO 首次邀请id + Scan: 1, // 扫码次数 + InviteForm: 1, // 1-店员邀请码续费 } fmt.Println("创建邀请:", invite) if err := invite.Create(DB); err != nil { @@ -1277,3 +1307,249 @@ func GetMemberGenreFromLevel(level uint32) uint32 { // } // } // } + +type MemberType int + +const ( + Unknown MemberType = iota + FirstInvite // 1-首次邀请 + OpenAnnualGold // 2-开通年费黄金 + OpenQuarterGold // 3-开通季度黄金 + OpenHalfYearGold // 4-开通半年黄金 + OpenAnnualPlatinum // 5-开通年费白金 + OpenAnnualBlack // 6-开通年费黑金 + RenewAnnualGoldIntervene // 7-续费年费黄金(干预) + RenewAnnualPlatinumIntervene // 8-续费年费白金(干预) + RenewAnnualBlackIntervene // 9-续费年费黑金(干预) + RenewAnnualGoldAuto // 10-续费年费黄金(自动) + RenewQuarterGoldAuto // 11-续费季度黄金(自动) + RenewHalfYearGoldAuto // 12-续费半年黄金(自动) + RenewAnnualPlatinumAuto // 13-续费年费白金(自动) + RenewAnnualBlackAuto // 14-续费年费黑金(自动) + UpgradeGoldToPlatinumIntervene // 15-黄金→白金(干预) + UpgradeGoldToBlackIntervene // 16-黄金→黑金(干预) + UpgradePlatinumToBlackIntervene // 17-白金→黑金(干预) + UpgradeGoldToPlatinumAuto // 18-黄金→白金(自动) + UpgradeGoldToBlackAuto // 19-黄金→黑金(自动) + UpgradePlatinumToBlackAuto // 20-白金→黑金(自动) +) + +type NewUserInviteRecordReq struct { + PageNum int `json:"pageIndex"` + PageSize int `json:"pageSize"` + FromUid uint32 `json:"from_uid"` // 邀请人ID + ToUid uint32 `json:"to_uid"` // 用户ID + RecordType uint32 `json:"record_type"` // 记录类型 1-首次邀请,2-开通年费黄金,3-开通季度黄金,4-开通半年黄金, 5-开通年费白金,6-开通年费黑金,7-续费年费黄金(干预),8-续费年费白金(干预),9-续费年费黑金(干预),10-续费年费黄金(自动), 11-续费季度黄金(自动),12-续费半年黄金(自动),13-续费年费白金(自动),14-续费年费黑金(自动),15-黄金→白金(干预), 16-黄金→黑金(干预),17-白金→黑金(干预),18-黄金→白金(自动),19-黄金→黑金(自动),20-白金→黑金(自动) + RecordStartTime time.Time `json:"record_start_time"` // 记录时间-开始时间 + RecordEndTime time.Time `json:"record_end_time"` // 记录时间-结束时间 +} + +type UserInviteRecordListResp struct { + Count int `json:"count"` // 总记录数 + PageIndex int `json:"pageIndex"` // 页码 + List []UserInviteRecordListData `json:"list"` +} + +type UserInviteRecordListData struct { + InviteUid uint32 `json:"invite_uid"` // 邀请人ID + UserUid uint32 `json:"user_uid"` // 用户ID + RecordType uint32 `json:"record_type"` // 记录类型 + RecordTime time.Time `json:"record_time"` // 记录时间 + MemberLevel uint32 `json:"member_level"` // 会员等级:1-普通 2-黄金 4-白金 5-黑金 +} + +func UpdateUserInviteRecordRenewHide() error { + err := NewUserInviteRecordQuerySet(DB).SpendTypeEq(3).ScanEq(0).RenewHideNe(1). + GetUpdater().SetRenewHide(1).Update() + if err != nil { + logger.Errorf("update renew_hide err:", err) + return err + } + + return nil +} + +func (m *NewUserInviteRecordReq) NewList() (*UserInviteRecordListResp, error) { + var records []UserInviteRecord + + err := UpdateUserInviteRecordRenewHide() + if err != nil { + logger.Errorf("err:", err) + return nil, err + } + + page := m.PageNum - 1 + pageSize := m.PageSize + + if page < 0 { + page = 0 + } + if pageSize == 0 { + pageSize = 10 + } + qs := NewUserInviteRecordQuerySet(DB).ActionEq(2) + + if m.FromUid != 0 { + qs = qs.FromUidEq(m.FromUid) + } + if m.ToUid != 0 { + qs = qs.ToUidEq(m.ToUid) + } + if m.RecordType != 0 { + switch m.RecordType { + case 1: // 首次邀请 + qs = qs.FirstEq(1).SpendTypeEq(1) + case 2: // 开通年费黄金 + qs = qs.MemberLevelEq(2).SpendTypeEq(2) + case 3: // 开通季度黄金 + qs = qs.MemberLevelEq(2).SpendTypeEq(2).MemberGenreEq(201) + case 4: // 开通半年黄金 + qs = qs.MemberLevelEq(2).SpendTypeEq(2).MemberGenreEq(202) + case 5: // 开通年费白金 + qs = qs.MemberLevelEq(4).SpendTypeEq(2) + case 6: // 开通年费黑金 + qs = qs.MemberLevelEq(5).SpendTypeEq(2) + + case 7: // 续费年费黄金(干预) + qs = qs.MemberLevelEq(2).SpendTypeEq(3).RenewHideEq(0) + case 8: // 续费年费白金(干预) + qs = qs.MemberLevelEq(4).SpendTypeEq(3).RenewHideEq(0) + case 9: // 续费年费黑金(干预) + qs = qs.MemberLevelEq(5).SpendTypeEq(3).RenewHideEq(0) + + case 10: // 续费年费黄金(自动) + qs = qs.MemberLevelEq(2).SpendTypeEq(3).RenewHideEq(1) + case 11: // 续费季度黄金(自动) + qs = qs.MemberLevelEq(2).SpendTypeEq(3).RenewHideEq(1). + MemberGenreEq(201) + case 12: // 续费半年黄金(自动) + qs = qs.MemberLevelEq(2).SpendTypeEq(3).RenewHideEq(1). + MemberGenreEq(202) + case 13: // 续费年费白金(自动) + qs = qs.MemberLevelEq(4).SpendTypeEq(3).RenewHideEq(1) + case 14: // 续费年费黑金(自动) + qs = qs.MemberLevelEq(5).SpendTypeEq(3).RenewHideEq(1) + + case 15: //黄金→白金(干预) + qs = qs.MemberLevelEq(4).SpendTypeEq(4).RenewHideEq(0) + case 16: //黄金→黑金(干预) + qs = qs.MemberLevelEq(5).SpendTypeEq(4).RenewHideEq(0). + MemberGenreIn(200, 201, 202) + case 17: //白金→黑金(干预) + qs = qs.MemberLevelEq(5).SpendTypeEq(4).RenewHideEq(0). + MemberGenreNotIn(200, 201, 202) + + case 18: //黄金→白金(自动) + qs = qs.MemberLevelEq(4).SpendTypeEq(4).RenewHideEq(1) + case 19: //黄金→黑金(自动) + qs = qs.MemberLevelEq(5).SpendTypeEq(4).RenewHideEq(1). + MemberGenreIn(200, 201, 202) + case 20: //白金→黑金(自动) + qs = qs.MemberLevelEq(5).SpendTypeEq(4).RenewHideEq(1). + MemberGenreNotIn(200, 201, 202) + } + } + if !m.RecordStartTime.IsZero() { + qs = qs.ActionTimeGte(m.RecordStartTime) + } + if !m.RecordEndTime.IsZero() { + qs = qs.ActionTimeLte(m.RecordStartTime) + } + + err = qs.Select("user_invite_record.*").OrderDescByActionTime().Offset(page * pageSize). + Limit(pageSize).All(&records) + if err != nil && err != RecordNotFound { + logger.Errorf("err:", err) + return nil, err + } + + var count int + count, err = qs.Count() + if err != nil { + logger.Errorf("err:", err) + return nil, err + } + + resp := new(UserInviteRecordListResp) + var listData []UserInviteRecordListData + + for _, item := range records { + data := UserInviteRecordListData{ + InviteUid: item.FromUid, + UserUid: item.ToUid, + RecordType: uint32(CalculateMemberType(item.SpendType, item.RenewHide, item.MemberGenre, item.MemberLevel)), + RecordTime: item.ActionTime, + MemberLevel: item.MemberLevel, + } + listData = append(listData, data) + } + resp.List = listData + resp.PageIndex = m.PageNum + resp.Count = count + + return resp, nil +} + +// CalculateMemberType 匹配记录类型 +func CalculateMemberType(spendType, renewHide, memberGenre, memberLevel uint32) MemberType { + switch { + case spendType == 1: + return FirstInvite + case spendType == 2: + switch memberLevel { + case 2: + return OpenAnnualGold + case 4: + return OpenAnnualPlatinum + case 5: + return OpenAnnualBlack + } + case spendType == 3 && renewHide == 0: + switch memberLevel { + case 2: + return RenewAnnualGoldIntervene + case 4: + return RenewAnnualPlatinumIntervene + case 5: + return RenewAnnualBlackIntervene + } + case spendType == 3 && renewHide == 1: + switch memberLevel { + case 2: + return RenewAnnualGoldAuto + case 4: + return RenewAnnualPlatinumAuto + case 5: + return RenewAnnualBlackAuto + } + case spendType == 4 && renewHide == 0: + switch memberLevel { + case 4: + return UpgradeGoldToPlatinumIntervene + case 5: + if memberGenre == 200 || memberGenre == 201 || memberGenre == 202 { + return UpgradeGoldToBlackIntervene + } + return UpgradePlatinumToBlackIntervene + } + case spendType == 4 && renewHide == 1: + switch memberLevel { + case 4: + return UpgradeGoldToPlatinumAuto + case 5: + if memberGenre == 200 { + return UpgradeGoldToBlackAuto + } + return UpgradePlatinumToBlackAuto + } + case spendType == 2 && memberLevel == 2 && memberGenre == 201: + return OpenQuarterGold + case spendType == 2 && memberLevel == 2 && memberGenre == 202: + return OpenHalfYearGold + case spendType == 3 && renewHide == 1 && memberLevel == 2 && memberGenre == 201: + return RenewQuarterGoldAuto + case spendType == 3 && renewHide == 1 && memberLevel == 2 && memberGenre == 202: + return RenewHalfYearGoldAuto + } + return Unknown +} diff --git a/model/user_vm.go b/model/user_vm.go index 6ee7477..ab563a3 100644 --- a/model/user_vm.go +++ b/model/user_vm.go @@ -8,16 +8,19 @@ import ( const ( //VmEventExchangeGoods = "exchange_goods" - VmEventBuyGoods = "buy_goods" - VmEventOpenMember = "open_member" - VmEventInvite1Member = "invite_1_member" - VmEventInvite2Member = "invite_2_member" - VmEventAttendance = "attendance" + VmEventBuyGoods = "buy_goods" // 购买商品积分抵扣 + VmEventOpenMember = "open_member" // 开通会员奖励 + VmEventInvite1Member = "invite_1_member" // 邀请会员奖励 + VmEventInvite2Member = "invite_2_member" // 邀请会员奖励 + VmEventAttendance = "attendance" // 连续签到获取积分 + VmEventErpOrderSale = "erp_order_sale" // 零售销售获得积分 + VmEventErpOrderReject = "erp_order_reject" // 零售退货扣除积分 ) // 用户积分 -//go:generate goqueryset -in user_vm.go // gen:qs +// +//go:generate goqueryset -in user_vm.go type UserVm struct { Model diff --git a/router/router_app.go b/router/router_app.go index 7c7cbca..a14296e 100644 --- a/router/router_app.go +++ b/router/router_app.go @@ -75,7 +75,7 @@ func ConfigAppRouter(r gin.IRouter) { user := api.Group("user") { - user.Use(auth.UserAccessAuth) // + user.Use(auth.UserAccessAuth) user.POST("data", controller.UserData) // 用户数据 user.POST("user_info/upload", controller.UserInfoUpload) // 上传用户信息 user.POST("user_info/tel", controller.UserTel) // 获取用户手机号 @@ -97,6 +97,7 @@ func ConfigAppRouter(r gin.IRouter) { //user.POST("service/wechat_id", controller.GetCustomerServiceWechatId) // 获取客服微信号 user.POST("invite_applet_code", controller.UserInviteAppletQRCode) // 小程序分享二维码 user.POST("invite_list", controller.UserInviteList) // 小程序推广记录 + user.POST("new_invite_list", controller.NewUserInviteRecordList) // 小程序推广记录 user.POST("use_code_to_coupon", controller.UserCodeToCoupon) // 兑换码兑换优惠券 } @@ -248,7 +249,7 @@ func ConfigAppRouter(r gin.IRouter) { cooperative.POST("member_promotion/assistant_detail", controller.AssistantMemberPromotionDetail) // 店员推广 TODO cooperative.POST("display_list", controller.DisplayStoreList) // 用户门店列表 - cooperative.POST("invite_report", controller.InviteMemberReportList) // 用户邀请会员业绩报表 + cooperative.POST("invite_report", controller.InviteMemberReportList) // 店员邀请会员业绩报表 cooperative.POST("/cannibalize_task/create", controller.CooperativeCannibalizeTaskCreate) // 创建调拨 cooperative.POST("/cannibalize_task/import_goods", controller.CooperativeCannibalizeTaskImportGoods) //