diff --git a/controller/account.go b/controller/account.go index 63fa83d..b748e99 100644 --- a/controller/account.go +++ b/controller/account.go @@ -79,12 +79,18 @@ func AuthLogin(c *gin.Context) { fmt.Println("InviteUid:", req.InviteUid) 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) - user.StoreId = inviteUser.StoreId - if user.StoreId == 0 { // 用户所属门店id为空则更新 - _, err = model.NewUserQuerySet(model.DB).UidEq(user.Uid).GetUpdater().SetStoreId(inviteUser.StoreId). + effectiveStoreInfo, err := model.GetUserEffectiveStore(req.InviteUid) + if err != nil { + 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() if err != nil { logger.Error("update err:", err) @@ -104,6 +110,7 @@ func AuthLogin(c *gin.Context) { firstInviteRecord := &model.UserInviteRecord{ ToUid: user.Uid, FromUid: req.InviteUid, + StoreId: effectiveStoreInfo.StoreID, Action: 2, // 激活邀请 SpendType: 1, // 未开通 MemberLevel: 0, // 0,未开通会员 @@ -120,6 +127,7 @@ func AuthLogin(c *gin.Context) { inviteRecord := &model.UserInviteRecord{ ToUid: user.Uid, FromUid: req.InviteUid, + StoreId: effectiveStoreInfo.StoreID, Action: 1, // 未激活 SpendType: 1, // 未开通 MemberLevel: 0, @@ -144,21 +152,21 @@ func AuthLogin(c *gin.Context) { if inviteErr == model.RecordNotFound { // 邀请表没记录 memberLevel := user.MemberLevel if memberLevel == 0 { - memberLevel = model.MemberTypeConsumer // 普通用户 + memberLevel = model.MemberLevelUser // 普通会员 } invite := &model.UserInvite{ - FromUid: req.InviteUid, // 邀请人用户id - UserType: inviteUser.UserType, // 邀请人用户类型 - StoreId: inviteUser.StoreId, // 邀请人门店ID - MemberOpenTime: time.Time{}, // 开通会员时间 - MemberType: memberLevel, // 被邀请用户类型 - MemberStatus: 1, // 被邀请用户会员状态 1-未开通 - ToUid: user.Uid, // 被邀请用户id - Action: 1, // 未激活 - SpendType: 1, // 未开通 - UserInviteRecordId: inviteRecord.ID, // 邀请记录id - FirstInvite: 0, // TODO 首次邀请id - Scan: 1, // 扫码次数 + FromUid: req.InviteUid, // 邀请人用户id + UserType: inviteUser.UserType, // 邀请人用户类型 + StoreId: effectiveStoreInfo.StoreID, // 邀请人门店ID --- 邀请人如果有多家门店:优先取有效期短的门店,如果有效期相同则取门店id小的门店 + MemberOpenTime: time.Time{}, // 开通会员时间 + MemberType: memberLevel, // 被邀请用户类型 + MemberStatus: 1, // 被邀请用户会员状态 1-未开通 + ToUid: user.Uid, // 被邀请用户id + Action: 1, // 未激活 + SpendType: 1, // 未开通 + UserInviteRecordId: inviteRecord.ID, // 邀请记录id + FirstInvite: 1, // 首次邀请标志:1 首次邀请 0 非首次 + Scan: 1, // 扫码次数 } fmt.Println("创建邀请:", invite) //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 { // 通过手机号判断之前是否有数据 sqlErr = model.NewUserQuerySet(model.DB).TelEq(phone.PhoneNumber).One(&user) @@ -201,7 +211,7 @@ func AuthLogin(c *gin.Context) { user.WxOpenID = resp.OpenID user.WxUnionID = resp.UnionID user.LastLoginAt = nowTime - user.MemberLevel = 1 // 普通会员 + user.MemberLevel = model.MemberLevelUser // 普通会员 //user.WxName = userInfo.Nickname //user.WxAvatar = userInfo.Avatar user.CreatedAt = nowTime @@ -217,18 +227,24 @@ func AuthLogin(c *gin.Context) { WxOpenID: resp.OpenID, WxUnionID: resp.UnionID, LastLoginAt: nowTime, - MemberLevel: 1, - //Notify: common.Yes, + MemberLevel: model.MemberLevelUser, // 普通会员 + Tel: phone.PhoneNumber, } user.Uid = createUid() // 新建uid inviteUser := model.GetUserByUid(req.InviteUid) + effectiveStoreInfo, err := model.GetUserEffectiveStore(req.InviteUid) + if err != nil { + RespJson(c, status.InviteUserFail, nil) + return + } 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{ ToUid: user.Uid, FromUid: req.InviteUid, + StoreId: effectiveStoreInfo.StoreID, Action: 2, // 激活邀请 SpendType: 1, // 未开通 MemberLevel: 0, // 未开通会员 @@ -244,6 +260,7 @@ func AuthLogin(c *gin.Context) { inviteRecord := &model.UserInviteRecord{ ToUid: user.Uid, FromUid: req.InviteUid, + StoreId: effectiveStoreInfo.StoreID, Action: 1, // 1-未激活 SpendType: 1, // 未开通 MemberLevel: 0, // 未开通会员 @@ -257,7 +274,7 @@ func AuthLogin(c *gin.Context) { } inviteUser := model.GetUserByUid(req.InviteUid) - user.StoreId = inviteUser.StoreId + user.StoreId = effectiveStoreInfo.StoreID user.UserType = model.UserTypeConsumer user.CooperativeBusinessId = inviteUser.CooperativeBusinessId user.CooperativeName = inviteUser.CooperativeName @@ -265,8 +282,8 @@ func AuthLogin(c *gin.Context) { invite := &model.UserInvite{ FromUid: req.InviteUid, UserType: inviteUser.UserType, - StoreId: inviteUser.StoreId, - MemberType: model.MemberTypeConsumer, + StoreId: effectiveStoreInfo.StoreID, + MemberType: model.MemberLevelUser, ToUid: user.Uid, MemberStatus: 1, // 1-未开通 Action: 1, // 1-未激活 @@ -293,7 +310,7 @@ func AuthLogin(c *gin.Context) { } return nil }) - err := eg.Wait() + err = eg.Wait() if err != nil { logger.Error(err) RespJson(c, status.InternalServerError, nil) diff --git a/controller/game_card.go b/controller/game_card.go index ee52cb3..9543147 100644 --- a/controller/game_card.go +++ b/controller/game_card.go @@ -448,14 +448,14 @@ func PushWXPayNotice(c *gin.Context) { } remark := "" - if record.MemberLevel == 2 { - if record.MemberGenre != 201 && record.MemberGenre != 202 { - record.MemberGenre = 200 // 新增:如果是年费黄金会员则member_genre设置为200 + if record.MemberLevel == model.MemberLevelGold { + if record.MemberGenre != model.MemberGenreQuarter && record.MemberGenre != model.MemberGenreHalfYear { + record.MemberGenre = model.MemberGenreYear // 新增:如果是年费黄金会员则member_genre设置为200 } remark = "黄金会员费" - } else if record.MemberLevel == 4 { + } else if record.MemberLevel == model.MemberLevelPlatinum { remark = "白金会员费" - } else if record.MemberLevel == 5 { + } else if record.MemberLevel == model.MemberLevelBlackGold { remark = "黑金会员费" } fundRecord.Uid = uint32(record.Uid) @@ -480,9 +480,9 @@ func PushWXPayNotice(c *gin.Context) { isShopAssistantCode := false var expireTime time.Time - if record.MemberGenre == 201 { // 季度黄金 + if record.MemberGenre == model.MemberGenreQuarter { // 季度黄金 expireTime = newTime.AddDate(0, 0, 90) - } else if record.MemberGenre == 202 { // 半年黄金 + } else if record.MemberGenre == model.MemberGenreHalfYear { // 半年黄金 expireTime = newTime.AddDate(0, 0, 180) } else { expireTime = newTime.AddDate(1, 0, 0) @@ -490,14 +490,15 @@ func PushWXPayNotice(c *gin.Context) { if user.MemberExpire.After(newTime) { //expireTime = user.MemberExpire.AddDate(1, 0, 0) - if record.MemberGenre == 201 { + if record.MemberGenre == model.MemberGenreQuarter { 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) } else { expireTime = user.MemberExpire.AddDate(1, 0, 0) } } + memberRecord.BeforeMemberLevel = user.MemberLevel memberRecord.BeforeMemberExpire = user.MemberExpire memberRecord.Serial = uint32(user.MemberExpire.Unix()) @@ -520,9 +521,9 @@ func PushWXPayNotice(c *gin.Context) { if user.OpenMemberTime.IsZero() { //openMemberTime = user.OpenMemberTime userUpdateQs = userUpdateQs.SetOpenMemberTime(newTime).SetOpenMemberLevel(record.MemberLevel) - memberRecord.Type = model.GetUserMemberRecordType(record.MemberLevel, 1) + memberRecord.Type = model.GetUserMemberRecordType(record.MemberLevel, 1) // 开通会员类型 } else { - memberRecord.Type = model.GetUserMemberRecordType(record.MemberLevel, 2) + memberRecord.Type = model.GetUserMemberRecordType(record.MemberLevel, 2) // 续费会员类型 } _, err = userUpdateQs.UpdateNum() if err != nil { @@ -561,7 +562,7 @@ func PushWXPayNotice(c *gin.Context) { } else { if err == nil { //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() // SpendType 类型 //if user.MemberLevel != 2 { @@ -699,7 +700,6 @@ func PushWXPayNotice(c *gin.Context) { } fmt.Println("notify.TotalFee:", notifyInfo.TotalFee) fmt.Println("notify.OutTradeNo:", notifyInfo.OutTradeNo) - } if notifyInfo.Attach == wxpay.WxPayDeposit { @@ -1386,14 +1386,14 @@ func HmPushWXPayNotice(c *gin.Context) { logger.Info("用户uid:", outOrderNo) remark := "" - if record.MemberLevel == 2 { - if record.MemberGenre != 201 && record.MemberGenre != 202 { - record.MemberGenre = 200 // 新增:如果是年费黄金会员则member_genre设置为200 + if record.MemberLevel == model.MemberLevelGold { + if record.MemberGenre != model.MemberGenreQuarter && record.MemberGenre != model.MemberGenreHalfYear { + record.MemberGenre = model.MemberGenreYear // 新增:如果是年费黄金会员则member_genre设置为200 } remark = "黄金会员费" - } else if record.MemberLevel == 4 { + } else if record.MemberLevel == model.MemberLevelPlatinum { remark = "白金会员费" - } else if record.MemberLevel == 5 { + } else if record.MemberLevel == model.MemberLevelBlackGold { remark = "黑金会员费" } fundRecord.Uid = uint32(record.Uid) @@ -1416,15 +1416,11 @@ func HmPushWXPayNotice(c *gin.Context) { spendType = 3 } isShopAssistantCode := false - //expireTime := newTime.AddDate(1, 0, 0) - //if user.MemberExpire.After(newTime) { - // expireTime = user.MemberExpire.AddDate(1, 0, 0) - //} var expireTime time.Time - if record.MemberGenre == 201 { + if record.MemberGenre == model.MemberGenreQuarter { expireTime = newTime.AddDate(0, 0, 90) - } else if record.MemberGenre == 202 { + } else if record.MemberGenre == model.MemberGenreHalfYear { expireTime = newTime.AddDate(0, 0, 180) } else { expireTime = newTime.AddDate(1, 0, 0) @@ -1432,9 +1428,9 @@ func HmPushWXPayNotice(c *gin.Context) { if user.MemberExpire.After(newTime) { //expireTime = user.MemberExpire.AddDate(1, 0, 0) - if record.MemberGenre == 201 { + if record.MemberGenre == model.MemberGenreQuarter { 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) } else { expireTime = user.MemberExpire.AddDate(1, 0, 0) @@ -1502,37 +1498,16 @@ func HmPushWXPayNotice(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 { + effectiveStoreInfo, err := model.GetUserEffectiveStore(invite.FromUid) + 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() - // SpendType 类型 - //if user.MemberLevel != 2 { - // qs = qs.SetMemberOpenTime(newTime).SetMemberLevel(record.MemberLevel) - //} + if isShopAssistantCode { qs = qs.SetInviteForm(1) } @@ -1552,10 +1527,11 @@ func HmPushWXPayNotice(c *gin.Context) { } }() } - } else { + } else { // 续费会员-用户直接续费 inviteRecordNew := &model.UserInviteRecord{ ToUid: invite.ToUid, FromUid: invite.FromUid, + StoreId: effectiveStoreInfo.StoreID, Action: 2, SpendType: spendType, MemberLevel: record.MemberLevel, @@ -1586,8 +1562,9 @@ func HmPushWXPayNotice(c *gin.Context) { FirstInvite: 0, MemberGenre: record.MemberGenre, } - if isShopAssistantCode { + if isShopAssistantCode { // 如果使用了优惠券,则是店员邀请续费;否则是用户自己发起续费 userInviteNew.InviteForm = 1 + userInviteNew.StoreId = effectiveStoreInfo.StoreID } err = model.DB.Create(userInviteNew).Error if err != nil { @@ -1598,20 +1575,6 @@ func HmPushWXPayNotice(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 spendType == 2 { - //err = model.SendUserVm(user.Uid, record.MemberLevel, 0) - //if err != nil { - // logger.Error("send user vm err:", err) - //} - } - openMemberChannel := model.OpenMemberChannelUserInvite userQs := model.NewUserQuerySet(model.DB).UidEq(record.Uid).GetUpdater() @@ -1621,14 +1584,19 @@ func HmPushWXPayNotice(c *gin.Context) { userQs = userQs.SetCooperativeBusinessId(inviteUser.CooperativeBusinessId). SetCooperativeName(inviteUser.CooperativeName) + effectiveStoreId := invite.StoreId + if isShopAssistantCode { // 如果使用了优惠券,则是店员邀请续费;否则是用户自己发起续费 + effectiveStoreId = effectiveStoreInfo.StoreID + } + fmt.Println("用户续费---") 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 { fmt.Println("用户开通------") 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)) } } diff --git a/controller/user.go b/controller/user.go index c06983b..bd3b949 100644 --- a/controller/user.go +++ b/controller/user.go @@ -19,7 +19,7 @@ const ( ) type OpenMemberReq struct { - MemberLevel uint32 `json:"member_level"` // 昵称 + MemberLevel uint32 `json:"member_level"` // 会员等级 MemberGenre uint32 `json:"member_genre"` // 会员标记: 黄金会员:90天-201 180天-202 UserCouponId uint32 `json:"user_coupon_id"` // 优惠券id } @@ -260,7 +260,8 @@ func OpenMember(c *gin.Context) { return } - if req.UserCouponId != 0 && req.MemberGenre == 0 { //短期会员不可用优惠券 + //短期会员不可用优惠券 + if req.UserCouponId != 0 && req.MemberGenre != model.MemberGenreQuarter && req.MemberGenre != model.MemberGenreHalfYear { var coupon model.UserCoupon err = model.NewUserCouponQuerySet(model.DB).IDEq(req.UserCouponId).One(&coupon) if err != nil { diff --git a/lib/utils/crypt/crypt.go b/lib/utils/crypt/crypt.go index fb5b995..0523bd2 100644 --- a/lib/utils/crypt/crypt.go +++ b/lib/utils/crypt/crypt.go @@ -23,6 +23,8 @@ import ( 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 { //https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET response := struct { @@ -134,6 +136,7 @@ func GenDrawShareCode(Did string, appId, secret string, userID ...uint32) (strin "width": 430, "auto_color": false, "is_hyaline": false, + //"env_version": "trial", // 跳转版本,默认不传为正式版 }, requests.JSON) if err != nil { return "", err diff --git a/model/analyse.go b/model/analyse.go index 374b619..afe6276 100644 --- a/model/analyse.go +++ b/model/analyse.go @@ -6,8 +6,9 @@ import ( "time" ) -//go:generate goqueryset -in analyse.go // gen:qs +// +//go:generate goqueryset -in analyse.go type Statistic struct { Model @@ -80,30 +81,30 @@ type UserMemberRecord struct { } func GetUserMemberRecordType(level uint32, memberType uint32) uint32 { - if memberType == 1 { + if memberType == 1 { // 开通会员 switch level { - case 2: - return 1 - case 4: - return 2 - case 5: - return 3 + case 2: // 黄金 + return 1 //开通黄金 + case 4: // 白金 + return 2 // 开通白金 + case 5: // 黑金 + return 3 // 开通黑金 } - } else if memberType == 2 { + } else if memberType == 2 { // 续费会员 switch level { - case 2: - return 4 - case 4: - return 5 - case 5: - return 6 + case 2: // 黄金 + return 4 //续费黄金 + case 4: // 白金 + return 5 //续费白金 + case 5: // 黑金 + return 6 //续费黑金 } - } else if memberType == 3 { + } else if memberType == 3 { // 升级会员 switch level { - case 4: - return 7 - case 5: - return 8 + case 4: // 白金 + return 7 // 升级白金 + case 5: // 黑金 + return 8 // 升级黑金 } } diff --git a/model/config.go b/model/config.go index 66be1b2..d6de01e 100644 --- a/model/config.go +++ b/model/config.go @@ -86,7 +86,7 @@ func GetMemberConfig(level uint32, genre uint32) (*MemberConfig, error) { if level == 3 { level = 2 } - if level == 2 && genre != 0 { // 判断是否为黄金短期会员 + if level == 2 && (genre == 201 || genre == 202) { // 判断是否为黄金短期会员 v, ok := ShortMemberConfigMap[genre] if !ok { logger.Error("genre err") diff --git a/model/invite.go b/model/invite.go index 0b03073..c2bd01b 100644 --- a/model/invite.go +++ b/model/invite.go @@ -24,6 +24,7 @@ type UserInviteRecord struct { ToUid uint32 `json:"to_uid"` // 用户ID FromUid uint32 `json:"from_uid"` // 邀请人ID + StoreId uint64 `json:"store_id"` // 门店id 邀请用户门店 Action uint32 `json:"action"` // 1-未激活 2-激活邀请 SpendType uint32 `json:"spend_type"` // 1-未开通 2-开通会员 3-续费 4-升级 MemberLevel uint32 `json:"member_level"` // 会员等级 0-未开通 1-普通 2-黄金 3-短期 4-白金 5-黑金 diff --git a/model/model_test.go b/model/model_test.go index be56b11..6909b6f 100644 --- a/model/model_test.go +++ b/model/model_test.go @@ -1973,7 +1973,7 @@ func TestNameScanInvite(t *testing.T) { if inviteErr == RecordNotFound { memberLevel := user.MemberLevel if memberLevel == 0 { - memberLevel = MemberTypeConsumer + memberLevel = MemberLevelUser } invite := &UserInvite{ FromUid: InviteUid, @@ -2070,7 +2070,7 @@ func TestNewUser(t *testing.T) { FromUid: InviteUid, UserType: inviteUser.UserType, StoreId: inviteUser.StoreId, - MemberType: MemberTypeConsumer, + MemberType: MemberLevelUser, ToUid: user.Uid, MemberStatus: 1, Action: 1, diff --git a/model/store.go b/model/store.go index e7efa6e..6105456 100644 --- a/model/store.go +++ b/model/store.go @@ -43,7 +43,8 @@ func GetStoreList(cardInfos []CardInfo) ([]GameCardStock, error) { storesCh := make(chan *[]Store, 0) eg.Go(func() error { 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 { logger.Errorf("err:%+v", err) return err diff --git a/model/sys_user.go b/model/sys_user.go index 87c256f..978496b 100644 --- a/model/sys_user.go +++ b/model/sys_user.go @@ -56,7 +56,7 @@ type SysUserB struct { } type StoreInfo struct { - StoreID int `json:"storeId"` //门店id + StoreID uint64 `json:"storeId"` //门店id StoreName string `json:"storeName"` //门店名称 ExpireTime string `json:"expireTime"` //有效期 } diff --git a/model/user.go b/model/user.go index cb4f566..47a84d3 100644 --- a/model/user.go +++ b/model/user.go @@ -8,6 +8,7 @@ import ( "github.com/rs/zerolog/log" "mh-server/lib/utils" "mh-server/lib/wxpay" + "sort" "sync" "time" ) @@ -86,16 +87,18 @@ func (o *User) TableName() string { } const ( - MemberTypeConsumer = 1 // 普通用户 - MemberTypeMember = 2 // 黄金会员 + MemberGenreYear = 200 // 短期会员:黄金年费会员 + MemberGenreQuarter = 201 // 短期会员:黄金季度会员 + MemberGenreHalfYear = 202 // 短期会员:黄金半年会员 ) const ( - MemberLevelConsumer = 1 // 普通用户 - MemberLevelGold = 2 // 黄金会员 - MemberLevelPeriod = 3 // 短期会员 - MemberLevelPlatinum = 4 // 白金会员 - MemberLevelBlackGold = 5 // 黑金会员 + MemberLevelConsumer = 10 // 普通用户:有开过零售单,留了手机号,但是小程序端未登陆过的,仍然是普通用户 + MemberLevelUser = 1 // 普通会员:仅进入了小程序且授权过手机号的为会员用户,未开通租卡会员的为“普通会员” + MemberLevelGold = 2 // 黄金会员 + MemberLevelPeriod = 3 // 短期会员 + MemberLevelPlatinum = 4 // 白金会员 + MemberLevelBlackGold = 5 // 黑金会员 ) const ( @@ -125,7 +128,7 @@ type UserInvite struct { MemberLevel uint32 `json:"member_level"` // 会员等级 MemberGenre uint32 `json:"member_genre"` // 会员类型 UserInviteRecordId uint32 `json:"user_invite_record_id"` // 邀请记录 - FirstInvite uint32 `json:"first_invite"` // 首次 + FirstInvite uint32 `json:"first_invite"` // 首次邀请标志:1 首次邀请 0 非首次 Scan uint32 `json:"scan"` // 扫码 InviteForm uint32 `json:"invite_form"` // 邀请方式: 1-店员邀请码续费 RenewHide uint32 `json:"renew_hide"` // 自动续费 @@ -255,6 +258,32 @@ func GetUserByUid(uid uint32) *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 { userRent := new(UserRentCard) 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() + effectiveStoreInfo, err := GetUserEffectiveStore(inviteUid) + if err != nil { + return err + } + 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 ", @@ -1212,6 +1246,7 @@ func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error { firstInviteRecord := &UserInviteRecord{ ToUid: user.Uid, FromUid: inviteUid, + StoreId: effectiveStoreInfo.StoreID, Action: 2, // 激活邀请 SpendType: 1, // 未开通 MemberLevel: 0, // 未开通会员 @@ -1228,6 +1263,7 @@ func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error { inviteRecord := &UserInviteRecord{ ToUid: user.Uid, FromUid: inviteUid, + StoreId: effectiveStoreInfo.StoreID, Action: 1, // 未激活 SpendType: 1, // 未开通 MemberLevel: 0, @@ -1252,22 +1288,22 @@ func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error { if inviteErr == RecordNotFound { memberLevel := user.MemberLevel if memberLevel == 0 { - memberLevel = MemberTypeConsumer + memberLevel = MemberLevelUser } invite := &UserInvite{ - 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-店员邀请码续费 + FromUid: inviteUid, // 邀请人用户id + UserType: inviteUser.UserType, // 邀请人用户类型 + StoreId: effectiveStoreInfo.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 {