1.优化会员邀请流程;

This commit is contained in:
chenlin 2024-05-20 15:17:50 +08:00
parent 5794d4c69f
commit 7f8d1ba8e7
11 changed files with 176 additions and 148 deletions

View File

@ -79,12 +79,18 @@ func AuthLogin(c *gin.Context) {
fmt.Println("InviteUid:", req.InviteUid) fmt.Println("InviteUid:", req.InviteUid)
nowTime := time.Now() nowTime := time.Now()
// 不存在则创建 新用户
if req.InviteUid != 0 && req.InviteUid != user.Uid { // 入参有邀请人id且非本人 if req.InviteUid != 0 && req.InviteUid != user.Uid && user.Uid != 0 { // 入参有邀请人id且非本人
inviteUser := model.GetUserByUid(req.InviteUid) inviteUser := model.GetUserByUid(req.InviteUid)
user.StoreId = inviteUser.StoreId effectiveStoreInfo, err := model.GetUserEffectiveStore(req.InviteUid)
if user.StoreId == 0 { // 用户所属门店id为空则更新 if err != nil {
_, err = model.NewUserQuerySet(model.DB).UidEq(user.Uid).GetUpdater().SetStoreId(inviteUser.StoreId). RespJson(c, status.InviteUserFail, nil)
return
}
//user.StoreId = uint64(effectiveStoreInfo.StoreID)
if user.StoreId == 0 && user.Uid != 0 { // 用户所属门店id为空则更新
_, err = model.NewUserQuerySet(model.DB).UidEq(user.Uid).GetUpdater().SetStoreId(effectiveStoreInfo.StoreID).
UpdateNum() UpdateNum()
if err != nil { if err != nil {
logger.Error("update err:", err) logger.Error("update err:", err)
@ -104,6 +110,7 @@ func AuthLogin(c *gin.Context) {
firstInviteRecord := &model.UserInviteRecord{ firstInviteRecord := &model.UserInviteRecord{
ToUid: user.Uid, ToUid: user.Uid,
FromUid: req.InviteUid, FromUid: req.InviteUid,
StoreId: effectiveStoreInfo.StoreID,
Action: 2, // 激活邀请 Action: 2, // 激活邀请
SpendType: 1, // 未开通 SpendType: 1, // 未开通
MemberLevel: 0, // 0未开通会员 MemberLevel: 0, // 0未开通会员
@ -120,6 +127,7 @@ func AuthLogin(c *gin.Context) {
inviteRecord := &model.UserInviteRecord{ inviteRecord := &model.UserInviteRecord{
ToUid: user.Uid, ToUid: user.Uid,
FromUid: req.InviteUid, FromUid: req.InviteUid,
StoreId: effectiveStoreInfo.StoreID,
Action: 1, // 未激活 Action: 1, // 未激活
SpendType: 1, // 未开通 SpendType: 1, // 未开通
MemberLevel: 0, MemberLevel: 0,
@ -144,21 +152,21 @@ func AuthLogin(c *gin.Context) {
if inviteErr == model.RecordNotFound { // 邀请表没记录 if inviteErr == model.RecordNotFound { // 邀请表没记录
memberLevel := user.MemberLevel memberLevel := user.MemberLevel
if memberLevel == 0 { if memberLevel == 0 {
memberLevel = model.MemberTypeConsumer // 普通用户 memberLevel = model.MemberLevelUser // 普通会员
} }
invite := &model.UserInvite{ invite := &model.UserInvite{
FromUid: req.InviteUid, // 邀请人用户id FromUid: req.InviteUid, // 邀请人用户id
UserType: inviteUser.UserType, // 邀请人用户类型 UserType: inviteUser.UserType, // 邀请人用户类型
StoreId: inviteUser.StoreId, // 邀请人门店ID StoreId: effectiveStoreInfo.StoreID, // 邀请人门店ID --- 邀请人如果有多家门店优先取有效期短的门店如果有效期相同则取门店id小的门店
MemberOpenTime: time.Time{}, // 开通会员时间 MemberOpenTime: time.Time{}, // 开通会员时间
MemberType: memberLevel, // 被邀请用户类型 MemberType: memberLevel, // 被邀请用户类型
MemberStatus: 1, // 被邀请用户会员状态 1-未开通 MemberStatus: 1, // 被邀请用户会员状态 1-未开通
ToUid: user.Uid, // 被邀请用户id ToUid: user.Uid, // 被邀请用户id
Action: 1, // 未激活 Action: 1, // 未激活
SpendType: 1, // 未开通 SpendType: 1, // 未开通
UserInviteRecordId: inviteRecord.ID, // 邀请记录id UserInviteRecordId: inviteRecord.ID, // 邀请记录id
FirstInvite: 0, // TODO 首次邀请id FirstInvite: 1, // 首次邀请标志1 首次邀请 0 非首次
Scan: 1, // 扫码次数 Scan: 1, // 扫码次数
} }
fmt.Println("创建邀请:", invite) fmt.Println("创建邀请:", invite)
//count, err := model.NewUserInviteQuerySet(model.DB).FromUidEq(req.InviteUid).ToUidEq(user.Uid).Count() //count, err := model.NewUserInviteQuerySet(model.DB).FromUidEq(req.InviteUid).ToUidEq(user.Uid).Count()
@ -187,6 +195,8 @@ func AuthLogin(c *gin.Context) {
} }
} }
} }
// 不存在则创建新用户
if sqlErr == model.RecordNotFound { if sqlErr == model.RecordNotFound {
// 通过手机号判断之前是否有数据 // 通过手机号判断之前是否有数据
sqlErr = model.NewUserQuerySet(model.DB).TelEq(phone.PhoneNumber).One(&user) sqlErr = model.NewUserQuerySet(model.DB).TelEq(phone.PhoneNumber).One(&user)
@ -201,7 +211,7 @@ func AuthLogin(c *gin.Context) {
user.WxOpenID = resp.OpenID user.WxOpenID = resp.OpenID
user.WxUnionID = resp.UnionID user.WxUnionID = resp.UnionID
user.LastLoginAt = nowTime user.LastLoginAt = nowTime
user.MemberLevel = 1 // 普通会员 user.MemberLevel = model.MemberLevelUser // 普通会员
//user.WxName = userInfo.Nickname //user.WxName = userInfo.Nickname
//user.WxAvatar = userInfo.Avatar //user.WxAvatar = userInfo.Avatar
user.CreatedAt = nowTime user.CreatedAt = nowTime
@ -217,18 +227,24 @@ func AuthLogin(c *gin.Context) {
WxOpenID: resp.OpenID, WxOpenID: resp.OpenID,
WxUnionID: resp.UnionID, WxUnionID: resp.UnionID,
LastLoginAt: nowTime, LastLoginAt: nowTime,
MemberLevel: 1, MemberLevel: model.MemberLevelUser, // 普通会员
//Notify: common.Yes, Tel: phone.PhoneNumber,
} }
user.Uid = createUid() // 新建uid user.Uid = createUid() // 新建uid
inviteUser := model.GetUserByUid(req.InviteUid) inviteUser := model.GetUserByUid(req.InviteUid)
effectiveStoreInfo, err := model.GetUserEffectiveStore(req.InviteUid)
if err != nil {
RespJson(c, status.InviteUserFail, nil)
return
}
var eg errgroup.Group var eg errgroup.Group
if req.InviteUid != 0 && inviteUser.UserType == 2 { // 如果入参有邀请人id并且是店员则新增2条邀请记录 if req.InviteUid != 0 && inviteUser.UserType == model.UserTypeShopAssistant { // 如果入参有邀请人id并且是店员则新增2条邀请记录
inviteRecordFirst := &model.UserInviteRecord{ inviteRecordFirst := &model.UserInviteRecord{
ToUid: user.Uid, ToUid: user.Uid,
FromUid: req.InviteUid, FromUid: req.InviteUid,
StoreId: effectiveStoreInfo.StoreID,
Action: 2, // 激活邀请 Action: 2, // 激活邀请
SpendType: 1, // 未开通 SpendType: 1, // 未开通
MemberLevel: 0, // 未开通会员 MemberLevel: 0, // 未开通会员
@ -244,6 +260,7 @@ func AuthLogin(c *gin.Context) {
inviteRecord := &model.UserInviteRecord{ inviteRecord := &model.UserInviteRecord{
ToUid: user.Uid, ToUid: user.Uid,
FromUid: req.InviteUid, FromUid: req.InviteUid,
StoreId: effectiveStoreInfo.StoreID,
Action: 1, // 1-未激活 Action: 1, // 1-未激活
SpendType: 1, // 未开通 SpendType: 1, // 未开通
MemberLevel: 0, // 未开通会员 MemberLevel: 0, // 未开通会员
@ -257,7 +274,7 @@ func AuthLogin(c *gin.Context) {
} }
inviteUser := model.GetUserByUid(req.InviteUid) inviteUser := model.GetUserByUid(req.InviteUid)
user.StoreId = inviteUser.StoreId user.StoreId = effectiveStoreInfo.StoreID
user.UserType = model.UserTypeConsumer user.UserType = model.UserTypeConsumer
user.CooperativeBusinessId = inviteUser.CooperativeBusinessId user.CooperativeBusinessId = inviteUser.CooperativeBusinessId
user.CooperativeName = inviteUser.CooperativeName user.CooperativeName = inviteUser.CooperativeName
@ -265,8 +282,8 @@ func AuthLogin(c *gin.Context) {
invite := &model.UserInvite{ invite := &model.UserInvite{
FromUid: req.InviteUid, FromUid: req.InviteUid,
UserType: inviteUser.UserType, UserType: inviteUser.UserType,
StoreId: inviteUser.StoreId, StoreId: effectiveStoreInfo.StoreID,
MemberType: model.MemberTypeConsumer, MemberType: model.MemberLevelUser,
ToUid: user.Uid, ToUid: user.Uid,
MemberStatus: 1, // 1-未开通 MemberStatus: 1, // 1-未开通
Action: 1, // 1-未激活 Action: 1, // 1-未激活
@ -293,7 +310,7 @@ func AuthLogin(c *gin.Context) {
} }
return nil return nil
}) })
err := eg.Wait() err = eg.Wait()
if err != nil { if err != nil {
logger.Error(err) logger.Error(err)
RespJson(c, status.InternalServerError, nil) RespJson(c, status.InternalServerError, nil)

View File

@ -448,14 +448,14 @@ func PushWXPayNotice(c *gin.Context) {
} }
remark := "" remark := ""
if record.MemberLevel == 2 { if record.MemberLevel == model.MemberLevelGold {
if record.MemberGenre != 201 && record.MemberGenre != 202 { if record.MemberGenre != model.MemberGenreQuarter && record.MemberGenre != model.MemberGenreHalfYear {
record.MemberGenre = 200 // 新增如果是年费黄金会员则member_genre设置为200 record.MemberGenre = model.MemberGenreYear // 新增如果是年费黄金会员则member_genre设置为200
} }
remark = "黄金会员费" remark = "黄金会员费"
} else if record.MemberLevel == 4 { } else if record.MemberLevel == model.MemberLevelPlatinum {
remark = "白金会员费" remark = "白金会员费"
} else if record.MemberLevel == 5 { } else if record.MemberLevel == model.MemberLevelBlackGold {
remark = "黑金会员费" remark = "黑金会员费"
} }
fundRecord.Uid = uint32(record.Uid) fundRecord.Uid = uint32(record.Uid)
@ -480,9 +480,9 @@ func PushWXPayNotice(c *gin.Context) {
isShopAssistantCode := false isShopAssistantCode := false
var expireTime time.Time var expireTime time.Time
if record.MemberGenre == 201 { // 季度黄金 if record.MemberGenre == model.MemberGenreQuarter { // 季度黄金
expireTime = newTime.AddDate(0, 0, 90) expireTime = newTime.AddDate(0, 0, 90)
} else if record.MemberGenre == 202 { // 半年黄金 } else if record.MemberGenre == model.MemberGenreHalfYear { // 半年黄金
expireTime = newTime.AddDate(0, 0, 180) expireTime = newTime.AddDate(0, 0, 180)
} else { } else {
expireTime = newTime.AddDate(1, 0, 0) expireTime = newTime.AddDate(1, 0, 0)
@ -490,14 +490,15 @@ func PushWXPayNotice(c *gin.Context) {
if user.MemberExpire.After(newTime) { if user.MemberExpire.After(newTime) {
//expireTime = user.MemberExpire.AddDate(1, 0, 0) //expireTime = user.MemberExpire.AddDate(1, 0, 0)
if record.MemberGenre == 201 { if record.MemberGenre == model.MemberGenreQuarter {
expireTime = user.MemberExpire.AddDate(0, 0, 90) expireTime = user.MemberExpire.AddDate(0, 0, 90)
} else if record.MemberGenre == 202 { } else if record.MemberGenre == model.MemberGenreHalfYear {
expireTime = user.MemberExpire.AddDate(0, 0, 180) expireTime = user.MemberExpire.AddDate(0, 0, 180)
} else { } else {
expireTime = user.MemberExpire.AddDate(1, 0, 0) expireTime = user.MemberExpire.AddDate(1, 0, 0)
} }
} }
memberRecord.BeforeMemberLevel = user.MemberLevel memberRecord.BeforeMemberLevel = user.MemberLevel
memberRecord.BeforeMemberExpire = user.MemberExpire memberRecord.BeforeMemberExpire = user.MemberExpire
memberRecord.Serial = uint32(user.MemberExpire.Unix()) memberRecord.Serial = uint32(user.MemberExpire.Unix())
@ -520,9 +521,9 @@ func PushWXPayNotice(c *gin.Context) {
if user.OpenMemberTime.IsZero() { if user.OpenMemberTime.IsZero() {
//openMemberTime = user.OpenMemberTime //openMemberTime = user.OpenMemberTime
userUpdateQs = userUpdateQs.SetOpenMemberTime(newTime).SetOpenMemberLevel(record.MemberLevel) userUpdateQs = userUpdateQs.SetOpenMemberTime(newTime).SetOpenMemberLevel(record.MemberLevel)
memberRecord.Type = model.GetUserMemberRecordType(record.MemberLevel, 1) memberRecord.Type = model.GetUserMemberRecordType(record.MemberLevel, 1) // 开通会员类型
} else { } else {
memberRecord.Type = model.GetUserMemberRecordType(record.MemberLevel, 2) memberRecord.Type = model.GetUserMemberRecordType(record.MemberLevel, 2) // 续费会员类型
} }
_, err = userUpdateQs.UpdateNum() _, err = userUpdateQs.UpdateNum()
if err != nil { if err != nil {
@ -561,7 +562,7 @@ func PushWXPayNotice(c *gin.Context) {
} else { } else {
if err == nil { if err == nil {
//qs := model.NewUserInviteQuerySet(model.DB).ToUidEq(record.Uid).GetUpdater() //qs := model.NewUserInviteQuerySet(model.DB).ToUidEq(record.Uid).GetUpdater()
if invite.Action != 2 { if invite.Action != 2 { // 2-激活邀请
qs := model.NewUserInviteQuerySet(model.DB).IDEq(invite.ID).GetUpdater() qs := model.NewUserInviteQuerySet(model.DB).IDEq(invite.ID).GetUpdater()
// SpendType 类型 // SpendType 类型
//if user.MemberLevel != 2 { //if user.MemberLevel != 2 {
@ -699,7 +700,6 @@ func PushWXPayNotice(c *gin.Context) {
} }
fmt.Println("notify.TotalFee:", notifyInfo.TotalFee) fmt.Println("notify.TotalFee:", notifyInfo.TotalFee)
fmt.Println("notify.OutTradeNo:", notifyInfo.OutTradeNo) fmt.Println("notify.OutTradeNo:", notifyInfo.OutTradeNo)
} }
if notifyInfo.Attach == wxpay.WxPayDeposit { if notifyInfo.Attach == wxpay.WxPayDeposit {
@ -1386,14 +1386,14 @@ func HmPushWXPayNotice(c *gin.Context) {
logger.Info("用户uid:", outOrderNo) logger.Info("用户uid:", outOrderNo)
remark := "" remark := ""
if record.MemberLevel == 2 { if record.MemberLevel == model.MemberLevelGold {
if record.MemberGenre != 201 && record.MemberGenre != 202 { if record.MemberGenre != model.MemberGenreQuarter && record.MemberGenre != model.MemberGenreHalfYear {
record.MemberGenre = 200 // 新增如果是年费黄金会员则member_genre设置为200 record.MemberGenre = model.MemberGenreYear // 新增如果是年费黄金会员则member_genre设置为200
} }
remark = "黄金会员费" remark = "黄金会员费"
} else if record.MemberLevel == 4 { } else if record.MemberLevel == model.MemberLevelPlatinum {
remark = "白金会员费" remark = "白金会员费"
} else if record.MemberLevel == 5 { } else if record.MemberLevel == model.MemberLevelBlackGold {
remark = "黑金会员费" remark = "黑金会员费"
} }
fundRecord.Uid = uint32(record.Uid) fundRecord.Uid = uint32(record.Uid)
@ -1416,15 +1416,11 @@ func HmPushWXPayNotice(c *gin.Context) {
spendType = 3 spendType = 3
} }
isShopAssistantCode := false isShopAssistantCode := false
//expireTime := newTime.AddDate(1, 0, 0)
//if user.MemberExpire.After(newTime) {
// expireTime = user.MemberExpire.AddDate(1, 0, 0)
//}
var expireTime time.Time var expireTime time.Time
if record.MemberGenre == 201 { if record.MemberGenre == model.MemberGenreQuarter {
expireTime = newTime.AddDate(0, 0, 90) expireTime = newTime.AddDate(0, 0, 90)
} else if record.MemberGenre == 202 { } else if record.MemberGenre == model.MemberGenreHalfYear {
expireTime = newTime.AddDate(0, 0, 180) expireTime = newTime.AddDate(0, 0, 180)
} else { } else {
expireTime = newTime.AddDate(1, 0, 0) expireTime = newTime.AddDate(1, 0, 0)
@ -1432,9 +1428,9 @@ func HmPushWXPayNotice(c *gin.Context) {
if user.MemberExpire.After(newTime) { if user.MemberExpire.After(newTime) {
//expireTime = user.MemberExpire.AddDate(1, 0, 0) //expireTime = user.MemberExpire.AddDate(1, 0, 0)
if record.MemberGenre == 201 { if record.MemberGenre == model.MemberGenreQuarter {
expireTime = user.MemberExpire.AddDate(0, 0, 90) expireTime = user.MemberExpire.AddDate(0, 0, 90)
} else if record.MemberGenre == 202 { } else if record.MemberGenre == model.MemberGenreHalfYear {
expireTime = user.MemberExpire.AddDate(0, 0, 180) expireTime = user.MemberExpire.AddDate(0, 0, 180)
} else { } else {
expireTime = user.MemberExpire.AddDate(1, 0, 0) expireTime = user.MemberExpire.AddDate(1, 0, 0)
@ -1502,37 +1498,16 @@ func HmPushWXPayNotice(c *gin.Context) {
if err != nil && err != model.RecordNotFound { if err != nil && err != model.RecordNotFound {
logger.Error("err:", err) logger.Error("err:", err)
} else { } 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 { if err == nil {
//qs := model.NewUserInviteQuerySet(model.DB).ToUidEq(record.Uid).GetUpdater() effectiveStoreInfo, err := model.GetUserEffectiveStore(invite.FromUid)
if invite.Action != 2 { if err != nil {
logger.Error("GetUserEffectiveStore err:", err)
effectiveStoreInfo.StoreID = invite.StoreId
}
if invite.Action != 2 { // 首次开通会员
qs := model.NewUserInviteQuerySet(model.DB).IDEq(invite.ID).GetUpdater() qs := model.NewUserInviteQuerySet(model.DB).IDEq(invite.ID).GetUpdater()
// SpendType 类型
//if user.MemberLevel != 2 {
// qs = qs.SetMemberOpenTime(newTime).SetMemberLevel(record.MemberLevel)
//}
if isShopAssistantCode { if isShopAssistantCode {
qs = qs.SetInviteForm(1) qs = qs.SetInviteForm(1)
} }
@ -1552,10 +1527,11 @@ func HmPushWXPayNotice(c *gin.Context) {
} }
}() }()
} }
} else { } else { // 续费会员-用户直接续费
inviteRecordNew := &model.UserInviteRecord{ inviteRecordNew := &model.UserInviteRecord{
ToUid: invite.ToUid, ToUid: invite.ToUid,
FromUid: invite.FromUid, FromUid: invite.FromUid,
StoreId: effectiveStoreInfo.StoreID,
Action: 2, Action: 2,
SpendType: spendType, SpendType: spendType,
MemberLevel: record.MemberLevel, MemberLevel: record.MemberLevel,
@ -1586,8 +1562,9 @@ func HmPushWXPayNotice(c *gin.Context) {
FirstInvite: 0, FirstInvite: 0,
MemberGenre: record.MemberGenre, MemberGenre: record.MemberGenre,
} }
if isShopAssistantCode { if isShopAssistantCode { // 如果使用了优惠券,则是店员邀请续费;否则是用户自己发起续费
userInviteNew.InviteForm = 1 userInviteNew.InviteForm = 1
userInviteNew.StoreId = effectiveStoreInfo.StoreID
} }
err = model.DB.Create(userInviteNew).Error err = model.DB.Create(userInviteNew).Error
if err != nil { if err != nil {
@ -1598,20 +1575,6 @@ func HmPushWXPayNotice(c *gin.Context) {
if invite.FromUid != 0 { if invite.FromUid != 0 {
inviteUser := model.GetUserByUid(invite.FromUid) inviteUser := model.GetUserByUid(invite.FromUid)
if inviteUser != nil { 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 spendType == 2 {
//err = model.SendUserVm(user.Uid, record.MemberLevel, 0)
//if err != nil {
// logger.Error("send user vm err:", err)
//}
}
openMemberChannel := model.OpenMemberChannelUserInvite openMemberChannel := model.OpenMemberChannelUserInvite
userQs := model.NewUserQuerySet(model.DB).UidEq(record.Uid).GetUpdater() userQs := model.NewUserQuerySet(model.DB).UidEq(record.Uid).GetUpdater()
@ -1621,14 +1584,19 @@ func HmPushWXPayNotice(c *gin.Context) {
userQs = userQs.SetCooperativeBusinessId(inviteUser.CooperativeBusinessId). userQs = userQs.SetCooperativeBusinessId(inviteUser.CooperativeBusinessId).
SetCooperativeName(inviteUser.CooperativeName) SetCooperativeName(inviteUser.CooperativeName)
effectiveStoreId := invite.StoreId
if isShopAssistantCode { // 如果使用了优惠券,则是店员邀请续费;否则是用户自己发起续费
effectiveStoreId = effectiveStoreInfo.StoreID
}
fmt.Println("用户续费---") fmt.Println("用户续费---")
model.AddCooperativeMemberRenewal(inviteUser.CooperativeBusinessId, model.AddCooperativeMemberRenewal(inviteUser.CooperativeBusinessId,
uint32(inviteUser.StoreId), inviteUser.Uid, int(record.MemberLevel), int(record.MemberGenre)) uint32(effectiveStoreId), inviteUser.Uid, int(record.MemberLevel), int(record.MemberGenre))
} else { } else {
fmt.Println("用户开通------") fmt.Println("用户开通------")
model.AddCooperativeMemberPromotion(inviteUser.CooperativeBusinessId, model.AddCooperativeMemberPromotion(inviteUser.CooperativeBusinessId,
uint32(inviteUser.StoreId), inviteUser.Uid, int(record.MemberLevel), int(record.MemberGenre)) uint32(effectiveStoreInfo.StoreID), inviteUser.Uid, int(record.MemberLevel), int(record.MemberGenre))
} }
} }

View File

@ -19,7 +19,7 @@ const (
) )
type OpenMemberReq struct { type OpenMemberReq struct {
MemberLevel uint32 `json:"member_level"` // 昵称 MemberLevel uint32 `json:"member_level"` // 会员等级
MemberGenre uint32 `json:"member_genre"` // 会员标记: 黄金会员:90天-201 180天-202 MemberGenre uint32 `json:"member_genre"` // 会员标记: 黄金会员:90天-201 180天-202
UserCouponId uint32 `json:"user_coupon_id"` // 优惠券id UserCouponId uint32 `json:"user_coupon_id"` // 优惠券id
} }
@ -260,7 +260,8 @@ func OpenMember(c *gin.Context) {
return return
} }
if req.UserCouponId != 0 && req.MemberGenre == 0 { //短期会员不可用优惠券 //短期会员不可用优惠券
if req.UserCouponId != 0 && req.MemberGenre != model.MemberGenreQuarter && req.MemberGenre != model.MemberGenreHalfYear {
var coupon model.UserCoupon var coupon model.UserCoupon
err = model.NewUserCouponQuerySet(model.DB).IDEq(req.UserCouponId).One(&coupon) err = model.NewUserCouponQuerySet(model.DB).IDEq(req.UserCouponId).One(&coupon)
if err != nil { if err != nil {

View File

@ -23,6 +23,8 @@ import (
const AppletCodeBaseUrl = "http://switch.deovo.com:8000/img/applet_code/" const AppletCodeBaseUrl = "http://switch.deovo.com:8000/img/applet_code/"
//const AppletCodeBaseUrl = "http://dev.switch.deovo.com:8000/img/applet_code/"
func GetWxAccessToken(appId, secret string) string { func GetWxAccessToken(appId, secret string) string {
//https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET //https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
response := struct { response := struct {
@ -134,6 +136,7 @@ func GenDrawShareCode(Did string, appId, secret string, userID ...uint32) (strin
"width": 430, "width": 430,
"auto_color": false, "auto_color": false,
"is_hyaline": false, "is_hyaline": false,
//"env_version": "trial", // 跳转版本,默认不传为正式版
}, requests.JSON) }, requests.JSON)
if err != nil { if err != nil {
return "", err return "", err

View File

@ -6,8 +6,9 @@ import (
"time" "time"
) )
//go:generate goqueryset -in analyse.go
// gen:qs // gen:qs
//
//go:generate goqueryset -in analyse.go
type Statistic struct { type Statistic struct {
Model Model
@ -80,30 +81,30 @@ type UserMemberRecord struct {
} }
func GetUserMemberRecordType(level uint32, memberType uint32) uint32 { func GetUserMemberRecordType(level uint32, memberType uint32) uint32 {
if memberType == 1 { if memberType == 1 { // 开通会员
switch level { switch level {
case 2: case 2: // 黄金
return 1 return 1 //开通黄金
case 4: case 4: // 白金
return 2 return 2 // 开通白金
case 5: case 5: // 黑金
return 3 return 3 // 开通黑金
} }
} else if memberType == 2 { } else if memberType == 2 { // 续费会员
switch level { switch level {
case 2: case 2: // 黄金
return 4 return 4 //续费黄金
case 4: case 4: // 白金
return 5 return 5 //续费白金
case 5: case 5: // 黑金
return 6 return 6 //续费黑金
} }
} else if memberType == 3 { } else if memberType == 3 { // 升级会员
switch level { switch level {
case 4: case 4: // 白金
return 7 return 7 // 升级白金
case 5: case 5: // 黑金
return 8 return 8 // 升级黑金
} }
} }

View File

@ -86,7 +86,7 @@ func GetMemberConfig(level uint32, genre uint32) (*MemberConfig, error) {
if level == 3 { if level == 3 {
level = 2 level = 2
} }
if level == 2 && genre != 0 { // 判断是否为黄金短期会员 if level == 2 && (genre == 201 || genre == 202) { // 判断是否为黄金短期会员
v, ok := ShortMemberConfigMap[genre] v, ok := ShortMemberConfigMap[genre]
if !ok { if !ok {
logger.Error("genre err") logger.Error("genre err")

View File

@ -24,6 +24,7 @@ type UserInviteRecord struct {
ToUid uint32 `json:"to_uid"` // 用户ID ToUid uint32 `json:"to_uid"` // 用户ID
FromUid uint32 `json:"from_uid"` // 邀请人ID FromUid uint32 `json:"from_uid"` // 邀请人ID
StoreId uint64 `json:"store_id"` // 门店id 邀请用户门店
Action uint32 `json:"action"` // 1-未激活 2-激活邀请 Action uint32 `json:"action"` // 1-未激活 2-激活邀请
SpendType uint32 `json:"spend_type"` // 1-未开通 2-开通会员 3-续费 4-升级 SpendType uint32 `json:"spend_type"` // 1-未开通 2-开通会员 3-续费 4-升级
MemberLevel uint32 `json:"member_level"` // 会员等级 0-未开通 1-普通 2-黄金 3-短期 4-白金 5-黑金 MemberLevel uint32 `json:"member_level"` // 会员等级 0-未开通 1-普通 2-黄金 3-短期 4-白金 5-黑金

View File

@ -1973,7 +1973,7 @@ func TestNameScanInvite(t *testing.T) {
if inviteErr == RecordNotFound { if inviteErr == RecordNotFound {
memberLevel := user.MemberLevel memberLevel := user.MemberLevel
if memberLevel == 0 { if memberLevel == 0 {
memberLevel = MemberTypeConsumer memberLevel = MemberLevelUser
} }
invite := &UserInvite{ invite := &UserInvite{
FromUid: InviteUid, FromUid: InviteUid,
@ -2070,7 +2070,7 @@ func TestNewUser(t *testing.T) {
FromUid: InviteUid, FromUid: InviteUid,
UserType: inviteUser.UserType, UserType: inviteUser.UserType,
StoreId: inviteUser.StoreId, StoreId: inviteUser.StoreId,
MemberType: MemberTypeConsumer, MemberType: MemberLevelUser,
ToUid: user.Uid, ToUid: user.Uid,
MemberStatus: 1, MemberStatus: 1,
Action: 1, Action: 1,

View File

@ -43,7 +43,8 @@ func GetStoreList(cardInfos []CardInfo) ([]GameCardStock, error) {
storesCh := make(chan *[]Store, 0) storesCh := make(chan *[]Store, 0)
eg.Go(func() error { eg.Go(func() error {
gameStore := make([]Store, 0) gameStore := make([]Store, 0)
err := NewStoreQuerySet(DB).IsOnlineEq(1).IsMemberServiceEq(1).OrderDescByCreatedAt().All(&gameStore) err := NewStoreQuerySet(DB).IsMemberServiceEq(1).CooperativeBusinessIdEq(1).
OrderDescByCreatedAt().All(&gameStore)
if err != nil && err != RecordNotFound { if err != nil && err != RecordNotFound {
logger.Errorf("err:%+v", err) logger.Errorf("err:%+v", err)
return err return err

View File

@ -56,7 +56,7 @@ type SysUserB struct {
} }
type StoreInfo struct { type StoreInfo struct {
StoreID int `json:"storeId"` //门店id StoreID uint64 `json:"storeId"` //门店id
StoreName string `json:"storeName"` //门店名称 StoreName string `json:"storeName"` //门店名称
ExpireTime string `json:"expireTime"` //有效期 ExpireTime string `json:"expireTime"` //有效期
} }

View File

@ -8,6 +8,7 @@ import (
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"mh-server/lib/utils" "mh-server/lib/utils"
"mh-server/lib/wxpay" "mh-server/lib/wxpay"
"sort"
"sync" "sync"
"time" "time"
) )
@ -86,16 +87,18 @@ func (o *User) TableName() string {
} }
const ( const (
MemberTypeConsumer = 1 // 普通用户 MemberGenreYear = 200 // 短期会员:黄金年费会员
MemberTypeMember = 2 // 黄金会员 MemberGenreQuarter = 201 // 短期会员:黄金季度会员
MemberGenreHalfYear = 202 // 短期会员:黄金半年会员
) )
const ( const (
MemberLevelConsumer = 1 // 普通用户 MemberLevelConsumer = 10 // 普通用户:有开过零售单,留了手机号,但是小程序端未登陆过的,仍然是普通用户
MemberLevelGold = 2 // 黄金会员 MemberLevelUser = 1 // 普通会员:仅进入了小程序且授权过手机号的为会员用户,未开通租卡会员的为“普通会员”
MemberLevelPeriod = 3 // 短期会员 MemberLevelGold = 2 // 黄金会员
MemberLevelPlatinum = 4 // 白金会员 MemberLevelPeriod = 3 // 短期会员
MemberLevelBlackGold = 5 // 黑金会员 MemberLevelPlatinum = 4 // 白金会员
MemberLevelBlackGold = 5 // 黑金会员
) )
const ( const (
@ -125,7 +128,7 @@ type UserInvite struct {
MemberLevel uint32 `json:"member_level"` // 会员等级 MemberLevel uint32 `json:"member_level"` // 会员等级
MemberGenre uint32 `json:"member_genre"` // 会员类型 MemberGenre uint32 `json:"member_genre"` // 会员类型
UserInviteRecordId uint32 `json:"user_invite_record_id"` // 邀请记录 UserInviteRecordId uint32 `json:"user_invite_record_id"` // 邀请记录
FirstInvite uint32 `json:"first_invite"` // 首次 FirstInvite uint32 `json:"first_invite"` // 首次邀请标志1 首次邀请 0 非首次
Scan uint32 `json:"scan"` // 扫码 Scan uint32 `json:"scan"` // 扫码
InviteForm uint32 `json:"invite_form"` // 邀请方式: 1-店员邀请码续费 InviteForm uint32 `json:"invite_form"` // 邀请方式: 1-店员邀请码续费
RenewHide uint32 `json:"renew_hide"` // 自动续费 RenewHide uint32 `json:"renew_hide"` // 自动续费
@ -255,6 +258,32 @@ func GetUserByUid(uid uint32) *User {
return user return user
} }
// GetUserEffectiveStore 获取店员当前的有效门店(邀请客户时使用)
func GetUserEffectiveStore(uid uint32) (*StoreInfo, error) {
user := new(SysUser)
if err := NewSysUserQuerySet(DB).UidEq(uid).One(user); err != nil {
logger.Error(err, uid)
return nil, err
}
if len(user.StoreList) == 0 {
return nil, errors.New("no stores found")
}
// 解析 StoreList 并找到有效时间最短的门店
sort.Slice(user.StoreList, func(i, j int) bool {
timeI, _ := time.Parse("2006.01.02", user.StoreList[i].ExpireTime)
timeJ, _ := time.Parse("2006.01.02", user.StoreList[j].ExpireTime)
if timeI.Equal(timeJ) {
return user.StoreList[i].StoreID < user.StoreList[j].StoreID
}
return timeI.Before(timeJ)
})
return &user.StoreList[0], nil
}
func GetUserRentCard(uid uint32) *UserRentCard { func GetUserRentCard(uid uint32) *UserRentCard {
userRent := new(UserRentCard) userRent := new(UserRentCard)
if err := NewUserRentCardQuerySet(DB).UidEq(uid).One(userRent); err != nil { if err := NewUserRentCardQuerySet(DB).UidEq(uid).One(userRent); err != nil {
@ -1200,6 +1229,11 @@ func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error {
} }
nowTime := time.Now() nowTime := time.Now()
effectiveStoreInfo, err := GetUserEffectiveStore(inviteUid)
if err != nil {
return err
}
if inviteUser.UserType == 2 && user.Uid != 0 { // 是店员邀请并且用户id不为空 if inviteUser.UserType == 2 && user.Uid != 0 { // 是店员邀请并且用户id不为空
exist, err := QueryRecordExist( exist, err := QueryRecordExist(
fmt.Sprintf("SELECT * FROM user_invite_record WHERE to_uid = %d AND from_uid = %d ", fmt.Sprintf("SELECT * FROM user_invite_record WHERE to_uid = %d AND from_uid = %d ",
@ -1212,6 +1246,7 @@ func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error {
firstInviteRecord := &UserInviteRecord{ firstInviteRecord := &UserInviteRecord{
ToUid: user.Uid, ToUid: user.Uid,
FromUid: inviteUid, FromUid: inviteUid,
StoreId: effectiveStoreInfo.StoreID,
Action: 2, // 激活邀请 Action: 2, // 激活邀请
SpendType: 1, // 未开通 SpendType: 1, // 未开通
MemberLevel: 0, // 未开通会员 MemberLevel: 0, // 未开通会员
@ -1228,6 +1263,7 @@ func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error {
inviteRecord := &UserInviteRecord{ inviteRecord := &UserInviteRecord{
ToUid: user.Uid, ToUid: user.Uid,
FromUid: inviteUid, FromUid: inviteUid,
StoreId: effectiveStoreInfo.StoreID,
Action: 1, // 未激活 Action: 1, // 未激活
SpendType: 1, // 未开通 SpendType: 1, // 未开通
MemberLevel: 0, MemberLevel: 0,
@ -1252,22 +1288,22 @@ func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error {
if inviteErr == RecordNotFound { if inviteErr == RecordNotFound {
memberLevel := user.MemberLevel memberLevel := user.MemberLevel
if memberLevel == 0 { if memberLevel == 0 {
memberLevel = MemberTypeConsumer memberLevel = MemberLevelUser
} }
invite := &UserInvite{ invite := &UserInvite{
FromUid: inviteUid, // 邀请人用户id FromUid: inviteUid, // 邀请人用户id
UserType: inviteUser.UserType, // 邀请人用户类型 UserType: inviteUser.UserType, // 邀请人用户类型
StoreId: inviteUser.StoreId, // 邀请人门店id StoreId: effectiveStoreInfo.StoreID, // 邀请人门店id
MemberOpenTime: nowTime, // 开通会员时间 MemberOpenTime: nowTime, // 开通会员时间
MemberType: memberLevel, // 被邀请用户类型 MemberType: memberLevel, // 被邀请用户类型
MemberStatus: 1, // 被邀请用户会员状态 1-未开通 MemberStatus: 1, // 被邀请用户会员状态 1-未开通
ToUid: user.Uid, // 被邀请用户id ToUid: user.Uid, // 被邀请用户id
Action: 1, // 未激活 Action: 1, // 未激活
SpendType: 1, // 未开通 SpendType: 1, // 未开通
UserInviteRecordId: inviteRecord.ID, // 邀请记录id UserInviteRecordId: inviteRecord.ID, // 邀请记录id
FirstInvite: 0, // TODO 首次邀请id FirstInvite: 0, // TODO 首次邀请id
Scan: 1, // 扫码次数 Scan: 1, // 扫码次数
InviteForm: 1, // 1-店员邀请码续费 InviteForm: 1, // 1-店员邀请码续费
} }
fmt.Println("创建邀请:", invite) fmt.Println("创建邀请:", invite)
if err := invite.Create(DB); err != nil { if err := invite.Create(DB); err != nil {