1.根据V1.2.0的需求进行代码逻辑调整;
This commit is contained in:
parent
e989b1f59a
commit
246c641bc6
4
Makefile
4
Makefile
|
@ -14,8 +14,8 @@ build-sqlite:
|
||||||
# docker build . -t go-admin:latest
|
# docker build . -t go-admin:latest
|
||||||
|
|
||||||
dev:
|
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:
|
pro:
|
||||||
GOOS=linux GOARCH=amd64 go build -o hm_server main.go
|
GOOS=linux GOARCH=amd64 go build -o app_server main.go
|
||||||
|
|
||||||
|
|
|
@ -20,14 +20,11 @@ import (
|
||||||
// @Tags 用户鉴权
|
// @Tags 用户鉴权
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body models.ErpOrderCreateReq true "用户登陆模型"
|
// @Param request body model.AuthLoginReq true "用户登陆模型"
|
||||||
// @Success 200 {object} app.Response
|
// @Success 200 {object} model.AuthLoginResp
|
||||||
// @Router /api/v1/auth/login [post]
|
// @Router /api/v1/auth/login [post]
|
||||||
func AuthLogin(c *gin.Context) {
|
func AuthLogin(c *gin.Context) {
|
||||||
req := struct {
|
req := new(model.AuthLoginReq)
|
||||||
Code string `json:"code" binding:"required"`
|
|
||||||
InviteUid uint32 `json:"invite_uid"`
|
|
||||||
}{}
|
|
||||||
|
|
||||||
if err := c.ShouldBindJSON(&req); err != nil {
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||||||
logger.Error(err)
|
logger.Error(err)
|
||||||
|
@ -87,7 +84,7 @@ func AuthLogin(c *gin.Context) {
|
||||||
RespJson(c, status.InternalServerError, nil)
|
RespJson(c, status.InternalServerError, nil)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !exist { // 未邀请过,则添加邀请记录
|
if !exist { // 未邀请过,则添加邀请记录:首次邀请记录
|
||||||
firstInviteRecord := &model.UserInviteRecord{
|
firstInviteRecord := &model.UserInviteRecord{
|
||||||
ToUid: user.Uid,
|
ToUid: user.Uid,
|
||||||
FromUid: req.InviteUid,
|
FromUid: req.InviteUid,
|
||||||
|
@ -121,7 +118,7 @@ func AuthLogin(c *gin.Context) {
|
||||||
// UserInvite 邀请主要
|
// UserInvite 邀请主要
|
||||||
var inviteNew model.UserInvite
|
var inviteNew model.UserInvite
|
||||||
inviteErr := model.NewUserInviteQuerySet(model.DB).ToUidEq(user.Uid).FromUidEq(req.InviteUid).ActionEq(1).
|
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 {
|
if inviteErr != nil && inviteErr != model.RecordNotFound {
|
||||||
// 是否存在未开通
|
// 是否存在未开通
|
||||||
logger.Error("user invite err:", err)
|
logger.Error("user invite err:", err)
|
||||||
|
@ -134,18 +131,18 @@ func AuthLogin(c *gin.Context) {
|
||||||
memberLevel = model.MemberTypeConsumer // 普通用户
|
memberLevel = model.MemberTypeConsumer // 普通用户
|
||||||
}
|
}
|
||||||
invite := &model.UserInvite{
|
invite := &model.UserInvite{
|
||||||
FromUid: req.InviteUid,
|
FromUid: req.InviteUid, // 邀请人用户id
|
||||||
UserType: inviteUser.UserType, // 邀请人用户类型
|
UserType: inviteUser.UserType, // 邀请人用户类型
|
||||||
StoreId: inviteUser.StoreId, // 邀请人门店ID
|
StoreId: inviteUser.StoreId, // 邀请人门店ID
|
||||||
MemberOpenTime: time.Time{}, // 开通会员时间
|
MemberOpenTime: time.Time{}, // 开通会员时间
|
||||||
MemberType: memberLevel, // 被邀请用户类型
|
MemberType: memberLevel, // 被邀请用户类型
|
||||||
MemberStatus: 1, // 被邀请用户会员类型
|
MemberStatus: 1, // 被邀请用户会员状态 1-未开通
|
||||||
ToUid: user.Uid,
|
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, // 扫码次数
|
||||||
}
|
}
|
||||||
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()
|
||||||
|
@ -172,7 +169,6 @@ func AuthLogin(c *gin.Context) {
|
||||||
logger.Error("from uid update user invite err:", err, req.InviteUid)
|
logger.Error("from uid update user invite err:", err, req.InviteUid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if sqlErr == model.RecordNotFound {
|
if sqlErr == model.RecordNotFound {
|
||||||
|
@ -185,14 +181,16 @@ func AuthLogin(c *gin.Context) {
|
||||||
}
|
}
|
||||||
user.Uid = createUid() // 新建uid
|
user.Uid = createUid() // 新建uid
|
||||||
|
|
||||||
|
inviteUser := model.GetUserByUid(req.InviteUid)
|
||||||
|
|
||||||
var eg errgroup.Group
|
var eg errgroup.Group
|
||||||
if req.InviteUid != 0 { // 如果入参有邀请人id,则新增2条邀请记录?
|
if req.InviteUid != 0 && inviteUser.UserType == 2 { // 如果入参有邀请人id,并且是店员,则新增2条邀请记录
|
||||||
inviteRecordFirst := &model.UserInviteRecord{
|
inviteRecordFirst := &model.UserInviteRecord{
|
||||||
ToUid: user.Uid,
|
ToUid: user.Uid,
|
||||||
FromUid: req.InviteUid,
|
FromUid: req.InviteUid,
|
||||||
Action: 2, // 激活邀请
|
Action: 2, // 激活邀请
|
||||||
SpendType: 1,
|
SpendType: 1, // 未开通
|
||||||
MemberLevel: 0,
|
MemberLevel: 0, // 未开通会员
|
||||||
First: 1, // 首次邀请
|
First: 1, // 首次邀请
|
||||||
Scan: 1,
|
Scan: 1,
|
||||||
ActionTime: nowTime,
|
ActionTime: nowTime,
|
||||||
|
@ -205,9 +203,9 @@ func AuthLogin(c *gin.Context) {
|
||||||
inviteRecord := &model.UserInviteRecord{
|
inviteRecord := &model.UserInviteRecord{
|
||||||
ToUid: user.Uid,
|
ToUid: user.Uid,
|
||||||
FromUid: req.InviteUid,
|
FromUid: req.InviteUid,
|
||||||
Action: 1,
|
Action: 1, // 1-未激活
|
||||||
SpendType: 1,
|
SpendType: 1, // 未开通
|
||||||
MemberLevel: 0,
|
MemberLevel: 0, // 未开通会员
|
||||||
First: 0,
|
First: 0,
|
||||||
Scan: 1,
|
Scan: 1,
|
||||||
ActionTime: nowTime,
|
ActionTime: nowTime,
|
||||||
|
@ -229,9 +227,9 @@ func AuthLogin(c *gin.Context) {
|
||||||
StoreId: inviteUser.StoreId,
|
StoreId: inviteUser.StoreId,
|
||||||
MemberType: model.MemberTypeConsumer,
|
MemberType: model.MemberTypeConsumer,
|
||||||
ToUid: user.Uid,
|
ToUid: user.Uid,
|
||||||
MemberStatus: 1,
|
MemberStatus: 1, // 1-未开通
|
||||||
Action: 1,
|
Action: 1, // 1-未激活
|
||||||
SpendType: 1,
|
SpendType: 1, // 未开通
|
||||||
UserInviteRecordId: inviteRecord.ID,
|
UserInviteRecordId: inviteRecord.ID,
|
||||||
Scan: 1,
|
Scan: 1,
|
||||||
}
|
}
|
||||||
|
@ -287,14 +285,16 @@ func AuthLogin(c *gin.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
RespJson(c, status.OK, map[string]interface{}{
|
ret := model.AuthLoginResp{
|
||||||
"access_token": newAccessToken,
|
AccessToken: newAccessToken,
|
||||||
"access_expire": config.AppConfig.JwtUserAccessExpire,
|
AccessExpire: config.AppConfig.JwtUserAccessExpire,
|
||||||
"refresh_token": refreshToken.Token,
|
RefreshToken: refreshToken.Token,
|
||||||
"refresh_expire": config.AppConfig.JwtUserRefreshExpire,
|
RefreshExpire: config.AppConfig.JwtUserRefreshExpire,
|
||||||
"uid": user.Uid,
|
Uid: user.Uid,
|
||||||
"access_created_at": nowTime,
|
AccessCreatedAt: nowTime,
|
||||||
})
|
}
|
||||||
|
|
||||||
|
RespJson(c, status.OK, ret)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -325,16 +325,16 @@ func AuthLogin(c *gin.Context) {
|
||||||
logger.Error(err)
|
logger.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
RespJson(c, status.OK, map[string]interface{}{
|
ret := model.AuthLoginResp{
|
||||||
"access_token": newAccessToken,
|
AccessToken: newAccessToken,
|
||||||
"access_expire": config.AppConfig.JwtUserAccessExpire,
|
AccessExpire: config.AppConfig.JwtUserAccessExpire,
|
||||||
"refresh_token": refreshToken.Token,
|
RefreshToken: refreshToken.Token,
|
||||||
"refresh_expire": config.AppConfig.JwtUserRefreshExpire,
|
RefreshExpire: config.AppConfig.JwtUserRefreshExpire,
|
||||||
"uid": user.Uid,
|
Uid: user.Uid,
|
||||||
"access_created_at": nowTime,
|
AccessCreatedAt: nowTime,
|
||||||
//"is_new": isNew,
|
}
|
||||||
//"invite_from_code": inviteCode,
|
|
||||||
})
|
RespJson(c, status.OK, ret)
|
||||||
return
|
return
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -632,6 +632,32 @@ func UserInviteList(c *gin.Context) {
|
||||||
RespOK(c, resp)
|
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) {
|
func UserCodeToCoupon(c *gin.Context) {
|
||||||
req := &struct {
|
req := &struct {
|
||||||
Code string `json:"code"`
|
Code string `json:"code"`
|
||||||
|
|
|
@ -263,7 +263,7 @@ type (
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO两边都改
|
// PushWXPayNotice TODO两边都改
|
||||||
//
|
//
|
||||||
// 微信推送支付通知
|
// 微信推送支付通知
|
||||||
func PushWXPayNotice(c *gin.Context) {
|
func PushWXPayNotice(c *gin.Context) {
|
||||||
|
@ -449,6 +449,9 @@ func PushWXPayNotice(c *gin.Context) {
|
||||||
|
|
||||||
remark := ""
|
remark := ""
|
||||||
if record.MemberLevel == 2 {
|
if record.MemberLevel == 2 {
|
||||||
|
if record.MemberGenre != 201 && record.MemberGenre != 202 {
|
||||||
|
record.MemberGenre = 200 // 新增:如果是年费黄金会员则member_genre设置为200
|
||||||
|
}
|
||||||
remark = "黄金会员费"
|
remark = "黄金会员费"
|
||||||
} else if record.MemberLevel == 4 {
|
} else if record.MemberLevel == 4 {
|
||||||
remark = "白金会员费"
|
remark = "白金会员费"
|
||||||
|
@ -470,16 +473,16 @@ func PushWXPayNotice(c *gin.Context) {
|
||||||
logger.Error("err:", err)
|
logger.Error("err:", err)
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
spendType = uint32(2)
|
spendType = uint32(2) // 2-开通会员
|
||||||
if !user.OpenMemberTime.IsZero() {
|
if !user.OpenMemberTime.IsZero() {
|
||||||
spendType = 3
|
spendType = 3 // 3-续费
|
||||||
}
|
}
|
||||||
isShopAssistantCode := false
|
isShopAssistantCode := false
|
||||||
|
|
||||||
var expireTime time.Time
|
var expireTime time.Time
|
||||||
if record.MemberGenre == 201 {
|
if record.MemberGenre == 201 { // 季度黄金
|
||||||
expireTime = newTime.AddDate(0, 0, 90)
|
expireTime = newTime.AddDate(0, 0, 90)
|
||||||
} else if record.MemberGenre == 202 {
|
} else if record.MemberGenre == 202 { // 半年黄金
|
||||||
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)
|
||||||
|
@ -527,7 +530,7 @@ func PushWXPayNotice(c *gin.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if record.UserCouponId > 0 {
|
if record.UserCouponId > 0 { // 如果使用了会员优惠券,更新优惠券状态为2-已使用
|
||||||
err = model.NewUserCouponQuerySet(model.DB).IDEq(record.UserCouponId).GetUpdater().
|
err = model.NewUserCouponQuerySet(model.DB).IDEq(record.UserCouponId).GetUpdater().
|
||||||
SetState(2).SetUseTime(utils.Now()).Update()
|
SetState(2).SetUseTime(utils.Now()).Update()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -539,7 +542,7 @@ func PushWXPayNotice(c *gin.Context) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("user coupon err:", err)
|
logger.Error("user coupon err:", err)
|
||||||
} else {
|
} else {
|
||||||
if userCoupon.Approach == 1 {
|
if userCoupon.Approach == 1 { // 当优惠券是通过店员兑换码获取,则创建邀请记录;此类用户是会员续费用户
|
||||||
isShopAssistantCode = true
|
isShopAssistantCode = true
|
||||||
err = model.StorePromotion(userCoupon.PromotionalSales, userCoupon.Uid, nil, &user)
|
err = model.StorePromotion(userCoupon.PromotionalSales, userCoupon.Uid, nil, &user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -556,29 +559,6 @@ func PushWXPayNotice(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()
|
//qs := model.NewUserInviteQuerySet(model.DB).ToUidEq(record.Uid).GetUpdater()
|
||||||
if invite.Action != 2 {
|
if invite.Action != 2 {
|
||||||
|
@ -653,12 +633,12 @@ func PushWXPayNotice(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 { // 邀请 新用户推送一次
|
//if inviteUser.UserType != 2 /*不是店员*/ && user.MemberLevel != 2 { // 邀请 新用户推送一次
|
||||||
err = model.SendUserVm(inviteUser.Uid, record.MemberLevel, 1)
|
// err = model.SendUserVm(inviteUser.Uid, record.MemberLevel, 1)
|
||||||
if err != nil {
|
// if err != nil {
|
||||||
logger.Error("send user vm err:", err)
|
// logger.Error("send user vm err:", err)
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
if spendType == 2 {
|
if spendType == 2 {
|
||||||
err = model.SendUserVm(user.Uid, record.MemberLevel, 0)
|
err = model.SendUserVm(user.Uid, record.MemberLevel, 0)
|
||||||
|
@ -820,6 +800,7 @@ func PushWXPayNotice(c *gin.Context) {
|
||||||
RespBodyXML(c, ret)
|
RespBodyXML(c, ret)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
isShopAssistantCode := false
|
||||||
|
|
||||||
fmt.Println("UpgradeMember:", record.Uid)
|
fmt.Println("UpgradeMember:", record.Uid)
|
||||||
var user model.User
|
var user model.User
|
||||||
|
@ -896,7 +877,109 @@ func PushWXPayNotice(c *gin.Context) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("update user coupon state err:", err)
|
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()
|
_, err = model.NewUserOpenMemberRecordQuerySet(model.DB).IDEq(record.ID).GetUpdater().SetState(2).UpdateNum()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("update user open member record state:err", err)
|
logger.Error("update user open member record state:err", err)
|
||||||
|
@ -1675,6 +1758,7 @@ func HmPushWXPayNotice(c *gin.Context) {
|
||||||
logger.Error("user err:", err)
|
logger.Error("user err:", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
isShopAssistantCode := false
|
||||||
|
|
||||||
memberRecord := &model.UserMemberRecord{
|
memberRecord := &model.UserMemberRecord{
|
||||||
Uid: record.Uid,
|
Uid: record.Uid,
|
||||||
|
@ -1743,7 +1827,109 @@ func HmPushWXPayNotice(c *gin.Context) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("update user coupon state err:", err)
|
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()
|
_, err = model.NewUserOpenMemberRecordQuerySet(model.DB).IDEq(record.ID).GetUpdater().SetState(2).UpdateNum()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("update user open member record state:err", err)
|
logger.Error("update user open member record state:err", err)
|
||||||
|
|
|
@ -18,6 +18,12 @@ const (
|
||||||
DepositFee = 300 * 100 // 押金费
|
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) {
|
func HistoryBrowsingList(c *gin.Context) {
|
||||||
req := struct {
|
req := struct {
|
||||||
Page int `json:"page"`
|
Page int `json:"page"`
|
||||||
|
@ -205,12 +211,16 @@ func UserInfoUpdate(c *gin.Context) {
|
||||||
return
|
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) {
|
func OpenMember(c *gin.Context) {
|
||||||
req := struct {
|
req := new(OpenMemberReq)
|
||||||
MemberLevel uint32 `json:"member_level"` // 昵称
|
|
||||||
MemberGenre uint32 `json:"member_genre"` // 会员标记: 黄金会员:90天-201 180天-202
|
|
||||||
UserCouponId uint32 `json:"user_coupon_id"` // 优惠券id
|
|
||||||
}{}
|
|
||||||
if c.ShouldBindJSON(&req) != nil {
|
if c.ShouldBindJSON(&req) != nil {
|
||||||
logger.Error("parameter err")
|
logger.Error("parameter err")
|
||||||
RespJson(c, status.BadRequest, nil)
|
RespJson(c, status.BadRequest, nil)
|
||||||
|
@ -224,12 +234,6 @@ func OpenMember(c *gin.Context) {
|
||||||
fmt.Println("req:", req)
|
fmt.Println("req:", req)
|
||||||
user := model.GetUserByUid(uc.Uid)
|
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)
|
memberConfig, err := model.GetMemberConfig(req.MemberLevel, req.MemberGenre)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("err:", err)
|
logger.Error("err:", err)
|
||||||
|
@ -265,11 +269,12 @@ func OpenMember(c *gin.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 用户已开通会员且优惠券可用
|
||||||
if user.IsMember() && coupon.Uid == uc.Uid && coupon.MemberLevel == req.MemberLevel &&
|
if user.IsMember() && coupon.Uid == uc.Uid && coupon.MemberLevel == req.MemberLevel &&
|
||||||
coupon.ActivityId == 1 && coupon.State == 1 {
|
coupon.ActivityId == 1 && coupon.State == 1 {
|
||||||
totalFee -= coupon.Value
|
totalFee -= coupon.Value
|
||||||
|
|
||||||
if coupon.RedeemCode == "" {
|
if coupon.RedeemCode == "" { // 优惠券兑换码为空,则记录用户续费日志
|
||||||
go func() {
|
go func() {
|
||||||
action := 0
|
action := 0
|
||||||
if coupon.MemberLevel == 2 {
|
if coupon.MemberLevel == 2 {
|
||||||
|
@ -291,22 +296,15 @@ func OpenMember(c *gin.Context) {
|
||||||
_ = userLog.Add()
|
_ = userLog.Add()
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
} else if coupon.State == 1 && coupon.ActivityType == 2 { // 关注公众号领取的优惠券
|
||||||
} else if coupon.State == 1 && coupon.ActivityType == 2 {
|
|
||||||
totalFee -= coupon.Value
|
totalFee -= coupon.Value
|
||||||
} else {
|
} else { // 不符合优惠条件
|
||||||
req.UserCouponId = 0
|
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()
|
orderSn := model.GetOrderSn()
|
||||||
|
// 备注:只有会员续费使用优惠券才会记录优惠券id:req.UserCouponId
|
||||||
err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: orderSn, MemberLevel: req.MemberLevel,
|
err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: orderSn, MemberLevel: req.MemberLevel,
|
||||||
UserCouponId: req.UserCouponId, Attach: wxpay.WxPayMember, MemberGenre: req.MemberGenre}.Insert()
|
UserCouponId: req.UserCouponId, Attach: wxpay.WxPayMember, MemberGenre: req.MemberGenre}.Insert()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -326,7 +324,7 @@ func OpenMember(c *gin.Context) {
|
||||||
genre = 2
|
genre = 2
|
||||||
logger.Error("payment method", err)
|
logger.Error("payment method", err)
|
||||||
}
|
}
|
||||||
//
|
//选择支付渠道,15号之前走微信,15号之后走河马付
|
||||||
if genre == model.PaymentGenreWx {
|
if genre == model.PaymentGenreWx {
|
||||||
webPay, err := wxpay.WebPay(orderSn, totalFee, user.WxOpenID, "N", wxpay.WxPayMember, configInfo.NotifyUrl)
|
webPay, err := wxpay.WebPay(orderSn, totalFee, user.WxOpenID, "N", wxpay.WxPayMember, configInfo.NotifyUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1176,6 +1174,14 @@ func UserAttendanceDetail(c *gin.Context) {
|
||||||
return
|
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) {
|
func InviteMemberReportList(c *gin.Context) {
|
||||||
req := model.InviteMemberReportListReq{}
|
req := model.InviteMemberReportListReq{}
|
||||||
if c.ShouldBindJSON(&req) != nil {
|
if c.ShouldBindJSON(&req) != nil {
|
||||||
|
@ -1202,11 +1208,12 @@ func InviteMemberReportList(c *gin.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
ret := map[string]interface{}{
|
ret := model.InviteMemberReportListResp{
|
||||||
"list": list,
|
List: list,
|
||||||
"cur_page": req.PageNum,
|
CurPage: req.PageNum,
|
||||||
"total_page": totalPage,
|
TotalPage: totalPage,
|
||||||
}
|
}
|
||||||
|
|
||||||
RespOK(c, ret)
|
RespOK(c, ret)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,7 +46,7 @@ const (
|
||||||
WxPayRentCard = "rent_card_pay" // 租卡
|
WxPayRentCard = "rent_card_pay" // 租卡
|
||||||
WxPayDeposit = "deposit_pay" // 押金
|
WxPayDeposit = "deposit_pay" // 押金
|
||||||
WxPayBuyGoods = "buy_goods" // 购买商品
|
WxPayBuyGoods = "buy_goods" // 购买商品
|
||||||
WxPayUpgradeMember = "upgrade_member" // 多级会员
|
WxPayUpgradeMember = "upgrade_member" // 升级会员
|
||||||
WxPayMemberExpireDelay = "member_expire_delay" // 会员过期滞纳金
|
WxPayMemberExpireDelay = "member_expire_delay" // 会员过期滞纳金
|
||||||
WxPayShareCardRetrieve = "share_card_retrieve" // 收回卡
|
WxPayShareCardRetrieve = "share_card_retrieve" // 收回卡
|
||||||
WxPayPostagePackage = "postage_package" // 运费包
|
WxPayPostagePackage = "postage_package" // 运费包
|
||||||
|
@ -63,7 +63,7 @@ const (
|
||||||
HmPayApiUrl = "https://hmpay.sandpay.com.cn/gateway/api"
|
HmPayApiUrl = "https://hmpay.sandpay.com.cn/gateway/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
//web 微信支付
|
// web 微信支付
|
||||||
func WebPay(orderId string, totalFee uint32, openId, profitSharing, attach, notifyUrl string) (*Sextuple, error) {
|
func WebPay(orderId string, totalFee uint32, openId, profitSharing, attach, notifyUrl string) (*Sextuple, error) {
|
||||||
now := time.Now().Local()
|
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())
|
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"
|
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 {
|
type WxTransferReq struct {
|
||||||
XMLName xml.Name `xml:"xml"` //xml标签
|
XMLName xml.Name `xml:"xml"` //xml标签
|
||||||
MchAppid string `xml:"mch_appid" json:"mch_appid"` //微信分配的小程序ID,必须
|
MchAppid string `xml:"mch_appid" json:"mch_appid"` //微信分配的小程序ID,必须
|
||||||
|
@ -930,7 +930,7 @@ type WxTransferResp struct {
|
||||||
PaymentNo string `xml:"payment_no,CDATA"`
|
PaymentNo string `xml:"payment_no,CDATA"`
|
||||||
}
|
}
|
||||||
|
|
||||||
//给用户打款
|
// 给用户打款
|
||||||
func Transfer(amount uint32, openId, desc string) (*WxTransferResp, error) {
|
func Transfer(amount uint32, openId, desc string) (*WxTransferResp, error) {
|
||||||
tradeNO := GenTradeNo()
|
tradeNO := GenTradeNo()
|
||||||
nonce := GenRandStr(NonceStringLength)
|
nonce := GenRandStr(NonceStringLength)
|
||||||
|
@ -1122,7 +1122,7 @@ type HmPayUnifiedOrderRsp struct {
|
||||||
Sign string `json:"sign"`
|
Sign string `json:"sign"`
|
||||||
}
|
}
|
||||||
|
|
||||||
//hm 微信支付
|
// hm 微信支付
|
||||||
func HmJsPayUnifiedOrder(orderId string, totalFee uint32, openId, notifyUrl string) (*HmPayUnifiedOrderPayData, error) {
|
func HmJsPayUnifiedOrder(orderId string, totalFee uint32, openId, notifyUrl string) (*HmPayUnifiedOrderPayData, error) {
|
||||||
now := time.Now().Local()
|
now := time.Now().Local()
|
||||||
strTime := fmt.Sprintf("%04d%02d%02d%02d%02d%02d", now.Year(), now.Month(), now.Day(), now.Hour(),
|
strTime := fmt.Sprintf("%04d%02d%02d%02d%02d%02d", now.Year(), now.Month(), now.Day(), now.Hour(),
|
||||||
|
|
|
@ -9,8 +9,9 @@ import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:generate goqueryset -in cooperative_business.go
|
|
||||||
// gen:qs
|
// gen:qs
|
||||||
|
//
|
||||||
|
//go:generate goqueryset -in cooperative_business.go
|
||||||
type CooperativeBusiness struct {
|
type CooperativeBusiness struct {
|
||||||
Model
|
Model
|
||||||
Name string `json:"name" binding:"required"` //
|
Name string `json:"name" binding:"required"` //
|
||||||
|
@ -81,9 +82,12 @@ type CooperativeMemberPromotion struct {
|
||||||
Date string `json:"date" gorm:"index"` //
|
Date string `json:"date" gorm:"index"` //
|
||||||
State string `json:"state"` // 待发起结算 待财务打款 已结算
|
State string `json:"state"` // 待发起结算 待财务打款 已结算
|
||||||
|
|
||||||
RenewalGoldCount uint32 `json:"renewal_gold_count" gorm:"default:0"` // 续费黄金会员数量
|
RenewalGoldCount uint32 `json:"renewal_gold_count" gorm:"default:0"` // 续费黄金会员数量
|
||||||
RenewalPlatinumCount uint32 `json:"renewal_platinum_count" gorm:"default:0"` // 续费白金会员数量
|
RenewalPlatinumCount uint32 `json:"renewal_platinum_count" gorm:"default:0"` // 续费白金会员数量
|
||||||
RenewalBlackGoldCount uint32 `json:"renewal_black_gold_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
|
// cooperative_member_promotion
|
||||||
}
|
}
|
||||||
|
@ -92,16 +96,19 @@ type CooperativeMemberPromotion struct {
|
||||||
// gen:qs
|
// gen:qs
|
||||||
type CooperativeMemberPromotionStore struct {
|
type CooperativeMemberPromotionStore struct {
|
||||||
Model
|
Model
|
||||||
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"`
|
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"`
|
||||||
CooperativeName string `json:"cooperative_name"` // 合作商名称
|
CooperativeName string `json:"cooperative_name"` // 合作商名称
|
||||||
StoreId uint32 `json:"store_id" gorm:"index"` // 门店id
|
StoreId uint32 `json:"store_id" gorm:"index"` // 门店id
|
||||||
GoldCount uint32 `json:"gold_count" gorm:"default:0"` // 黄金会员数量
|
GoldCount uint32 `json:"gold_count" gorm:"default:0"` // 黄金会员数量
|
||||||
PlatinumCount uint32 `json:"platinum_count" gorm:"default:0"` // 白金会员数量
|
PlatinumCount uint32 `json:"platinum_count" gorm:"default:0"` // 白金会员数量
|
||||||
BlackGoldCount uint32 `json:"black_gold_count" gorm:"default:0"` // 黑金会员数量
|
BlackGoldCount uint32 `json:"black_gold_count" gorm:"default:0"` // 黑金会员数量
|
||||||
Date string `json:"date" gorm:"index"` //
|
Date string `json:"date" gorm:"index"` //
|
||||||
RenewalGoldCount uint32 `json:"renewal_gold_count" gorm:"default:0"` // 续费黄金会员数量
|
RenewalGoldCount uint32 `json:"renewal_gold_count" gorm:"default:0"` // 续费黄金会员数量
|
||||||
RenewalPlatinumCount uint32 `json:"renewal_platinum_count" gorm:"default:0"` // 续费白金会员数量
|
RenewalPlatinumCount uint32 `json:"renewal_platinum_count" gorm:"default:0"` // 续费白金会员数量
|
||||||
RenewalBlackGoldCount uint32 `json:"renewal_black_gold_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
|
// cooperative_member_promotion_store
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,15 +116,18 @@ type CooperativeMemberPromotionStore struct {
|
||||||
// gen:qs
|
// gen:qs
|
||||||
type CooperativeMemberPromotionDay struct {
|
type CooperativeMemberPromotionDay struct {
|
||||||
Model
|
Model
|
||||||
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"`
|
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"`
|
||||||
CooperativeName string `json:"cooperative_name"` // 合作商名称
|
CooperativeName string `json:"cooperative_name"` // 合作商名称
|
||||||
GoldCount uint32 `json:"gold_count" gorm:"default:0"` // 黄金会员数量
|
GoldCount uint32 `json:"gold_count" gorm:"default:0"` // 黄金会员数量
|
||||||
PlatinumCount uint32 `json:"platinum_count" gorm:"default:0"` // 白金会员数量
|
PlatinumCount uint32 `json:"platinum_count" gorm:"default:0"` // 白金会员数量
|
||||||
BlackGoldCount uint32 `json:"black_gold_count" gorm:"default:0"` // 黑金会员数量
|
BlackGoldCount uint32 `json:"black_gold_count" gorm:"default:0"` // 黑金会员数量
|
||||||
DayTime string `json:"day_time" gorm:"index"` //
|
DayTime string `json:"day_time" gorm:"index"` //
|
||||||
RenewalGoldCount uint32 `json:"renewal_gold_count" gorm:"default:0"` // 续费黄金会员数量
|
RenewalGoldCount uint32 `json:"renewal_gold_count" gorm:"default:0"` // 续费黄金会员数量
|
||||||
RenewalPlatinumCount uint32 `json:"renewal_platinum_count" gorm:"default:0"` // 续费白金会员数量
|
RenewalPlatinumCount uint32 `json:"renewal_platinum_count" gorm:"default:0"` // 续费白金会员数量
|
||||||
RenewalBlackGoldCount uint32 `json:"renewal_black_gold_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
|
// cooperative_member_promotion_day
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,16 +135,19 @@ type CooperativeMemberPromotionDay struct {
|
||||||
// gen:qs
|
// gen:qs
|
||||||
type CooperativeMemberPromotionStoreDay struct {
|
type CooperativeMemberPromotionStoreDay struct {
|
||||||
Model
|
Model
|
||||||
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"`
|
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"`
|
||||||
CooperativeName string `json:"cooperative_name"` // 合作商名称
|
CooperativeName string `json:"cooperative_name"` // 合作商名称
|
||||||
StoreId uint32 `json:"store_id" gorm:"index"` // 门店id
|
StoreId uint32 `json:"store_id" gorm:"index"` // 门店id
|
||||||
GoldCount uint32 `json:"gold_count" gorm:"default:0"` // 黄金会员数量
|
GoldCount uint32 `json:"gold_count" gorm:"default:0"` // 黄金会员数量
|
||||||
PlatinumCount uint32 `json:"platinum_count" gorm:"default:0"` // 白金会员数量
|
PlatinumCount uint32 `json:"platinum_count" gorm:"default:0"` // 白金会员数量
|
||||||
BlackGoldCount uint32 `json:"black_gold_count" gorm:"default:0"` // 黑金会员数量
|
BlackGoldCount uint32 `json:"black_gold_count" gorm:"default:0"` // 黑金会员数量
|
||||||
DayTime string `json:"day_time" gorm:"index"` //
|
DayTime string `json:"day_time" gorm:"index"` //
|
||||||
RenewalGoldCount uint32 `json:"renewal_gold_count" gorm:"default:0"` // 续费黄金会员数量
|
RenewalGoldCount uint32 `json:"renewal_gold_count" gorm:"default:0"` // 续费黄金会员数量
|
||||||
RenewalPlatinumCount uint32 `json:"renewal_platinum_count" gorm:"default:0"` // 续费白金会员数量
|
RenewalPlatinumCount uint32 `json:"renewal_platinum_count" gorm:"default:0"` // 续费白金会员数量
|
||||||
RenewalBlackGoldCount uint32 `json:"renewal_black_gold_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
|
// cooperative_member_promotion_store_day
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -813,3 +826,350 @@ func (m *InviteMemberReport) AddRenewal(gdb *gorm.DB, memberLevel int) error {
|
||||||
}
|
}
|
||||||
return nil
|
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
|
||||||
|
}
|
||||||
|
|
|
@ -17,8 +17,9 @@ const (
|
||||||
// CouponValidity = renewalConfig.CouponValidity
|
// CouponValidity = renewalConfig.CouponValidity
|
||||||
//}
|
//}
|
||||||
|
|
||||||
//go:generate goqueryset -in coupon.go
|
|
||||||
// gen:qs
|
// gen:qs
|
||||||
|
//
|
||||||
|
//go:generate goqueryset -in coupon.go
|
||||||
type Coupon struct {
|
type Coupon struct {
|
||||||
Model
|
Model
|
||||||
|
|
||||||
|
@ -46,13 +47,13 @@ type UserCoupon struct {
|
||||||
ActivityType uint32 `json:"activity_type"` // 活动类型 1-会员续费 2-关注公众号 3-运费包
|
ActivityType uint32 `json:"activity_type"` // 活动类型 1-会员续费 2-关注公众号 3-运费包
|
||||||
ActivityId uint32 `json:"activity_id" gorm:"index"`
|
ActivityId uint32 `json:"activity_id" gorm:"index"`
|
||||||
Value uint32 `json:"value"`
|
Value uint32 `json:"value"`
|
||||||
State uint32 `json:"state"` // 1-未使用 2-已使用 3-已过期
|
State uint32 `json:"state"` // 1-未使用 2-已使用 3-已过期
|
||||||
ActiveStart time.Time `json:"active_start"` // 有效期开始
|
ActiveStart time.Time `json:"active_start"` // 有效期开始
|
||||||
ActiveEnd time.Time `json:"active_end"` // 有效期结束 零值永不结束
|
ActiveEnd time.Time `json:"active_end"` // 有效期结束 零值永不结束
|
||||||
UseTime time.Time `json:"use_time"` //
|
UseTime time.Time `json:"use_time"` //
|
||||||
MemberLevel uint32 `json:"member_level"` // 会员等级 1-用户 2-会员
|
MemberLevel uint32 `json:"member_level"` // 会员等级 1-用户 2-会员
|
||||||
Approach uint32 `json:"approach"` // 获取途径:
|
Approach uint32 `json:"approach"` // 获取途径:1-通过店员兑换码获取
|
||||||
PromotionalSales uint32 `json:"promotional_sales"`
|
PromotionalSales uint32 `json:"promotional_sales"` // 推广人员用户id
|
||||||
RedeemCode string `json:"redeem_code"`
|
RedeemCode string `json:"redeem_code"`
|
||||||
Availability uint32 `json:"availability" gorm:"-"` // 1-不可用 2-可用
|
Availability uint32 `json:"availability" gorm:"-"` // 1-不可用 2-可用
|
||||||
Coupon *Coupon `json:"coupon" gorm:"-"`
|
Coupon *Coupon `json:"coupon" gorm:"-"`
|
||||||
|
|
366
model/user.go
366
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 {
|
func (o *User) TableName() string {
|
||||||
return "user"
|
return "user"
|
||||||
}
|
}
|
||||||
|
@ -399,16 +413,26 @@ type InviteMemberReport struct {
|
||||||
PlatinumCount uint32 `json:"platinum_count"` // 白金数量
|
PlatinumCount uint32 `json:"platinum_count"` // 白金数量
|
||||||
BlackGoldCount uint32 `json:"black_gold_count"` // 黑金数量
|
BlackGoldCount uint32 `json:"black_gold_count"` // 黑金数量
|
||||||
//ReportTime string `json:"report_time" gorm:"index"` // 业绩时间
|
//ReportTime string `json:"report_time" gorm:"index"` // 业绩时间
|
||||||
Date string `json:"date" gorm:"index"` // 业绩时间
|
Date string `json:"date" gorm:"index"` // 业绩时间
|
||||||
DeductAmount uint32 `json:"deduct_amount"` // 店员提成
|
DeductAmount uint32 `json:"deduct_amount"` // 店员提成
|
||||||
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id
|
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id
|
||||||
CooperativeName string `json:"cooperative_name"` // 合作商名称
|
CooperativeName string `json:"cooperative_name"` // 合作商名称
|
||||||
GoldDeduct uint32 `json:"gold_deduct"` // 黄金会员提成
|
GoldDeduct uint32 `json:"gold_deduct"` // 黄金会员提成
|
||||||
PlatinumDeduct uint32 `json:"platinum_deduct"` // 白金会员提成
|
PlatinumDeduct uint32 `json:"platinum_deduct"` // 白金会员提成
|
||||||
BlackGoldDeduct uint32 `json:"black_gold_deduct"` // 黑金会员提成
|
BlackGoldDeduct uint32 `json:"black_gold_deduct"` // 黑金会员提成
|
||||||
RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费黄金会员数量
|
RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费黄金会员数量(自动)
|
||||||
RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量
|
RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量(自动)
|
||||||
RenewalBlackGoldCount uint32 `json:"renewal_black_gold_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
|
// invite_member_report
|
||||||
User *User `json:"user" gorm:"-"`
|
User *User `json:"user" gorm:"-"`
|
||||||
}
|
}
|
||||||
|
@ -552,11 +576,11 @@ func (m *User) AppletQRCodeUpdate() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
type UserInviteListReq struct {
|
type UserInviteListReq struct {
|
||||||
Page int `json:"page"`
|
Page int `json:"page"` // 页码
|
||||||
PageSize int `json:"page_size"`
|
PageSize int `json:"page_size"` // 每页条数
|
||||||
Uid uint32 `json:"uid"`
|
Uid uint32 `json:"uid"` // 当前用户ID
|
||||||
MemberType int `json:"member_type"` // 0-全部 1-普通用户 2-会员
|
MemberType int `json:"member_type"` // 会员类型:0-全部 1-普通用户 2-会员
|
||||||
SpendType uint32 `json:"spend_type"` // 2-开通会员 3-续费
|
SpendType uint32 `json:"spend_type"` // 操作类型:2-开通会员 3-续费 4-升级
|
||||||
StartTime string `json:"start_time"` // 开始时间
|
StartTime string `json:"start_time"` // 开始时间
|
||||||
EndTime string `json:"end_time"` // 结束时间
|
EndTime string `json:"end_time"` // 结束时间
|
||||||
}
|
}
|
||||||
|
@ -589,31 +613,31 @@ func (m *UserInviteListReq) InviteUserList() (*UserInviteListResp, error) {
|
||||||
m.PageSize = 10
|
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 {
|
if m.MemberType != 0 {
|
||||||
qs = qs.MemberTypeEq(uint32(m.MemberType))
|
qs = qs.MemberTypeEq(uint32(m.MemberType))
|
||||||
if m.MemberType == 2 {
|
if m.MemberType == 2 { // 查询会员数据
|
||||||
user := GetUserByUid(m.Uid)
|
user := GetUserByUid(m.Uid)
|
||||||
//qs = qs.FirstInviteNe(1).SpendTypeEq(2)
|
//qs = qs.FirstInviteNe(1).SpendTypeEq(2)
|
||||||
//qs = qs.SpendTypeEq(2)
|
//qs = qs.SpendTypeEq(2)
|
||||||
//qs = qs.SpendTypeNotIn([]uint32{3, 4}...)
|
//qs = qs.SpendTypeNotIn([]uint32{3, 4}...)
|
||||||
if user.CooperativeBusinessId == 1 {
|
if user.CooperativeBusinessId == 1 { // 合作商为迪为
|
||||||
if m.SpendType != 0 {
|
if m.SpendType != 0 {
|
||||||
qs = qs.SpendTypeEq(m.SpendType)
|
qs = qs.SpendTypeEq(m.SpendType)
|
||||||
if m.SpendType == 3 {
|
if m.SpendType == 3 { // 如果是3-续费,则查询是否为店员推广续费,即:invite_form = 1
|
||||||
qs = qs.InviteFormEq(1)
|
qs = qs.InviteFormEq(1)
|
||||||
}
|
}
|
||||||
} else {
|
} else { // 如果没有指定spend_type,则默认查询2-开通会员,3-续费
|
||||||
qs = qs.SpendTypeIn([]uint32{2, 3}...)
|
qs = qs.SpendTypeIn([]uint32{2, 3}...)
|
||||||
}
|
}
|
||||||
} else {
|
} else { // 如果不是迪为合作商,则查询非3-续费,4-升级的数据
|
||||||
qs = qs.SpendTypeNotIn([]uint32{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)
|
qs = qs.SpendTypeEq(m.SpendType)
|
||||||
if m.SpendType == 3 {
|
if m.SpendType == 3 { // 如果是3-续费,则查询是否为店员推广续费,即:invite_form = 1
|
||||||
qs = qs.InviteFormEq(1)
|
qs = qs.InviteFormEq(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -623,7 +647,7 @@ func (m *UserInviteListReq) InviteUserList() (*UserInviteListResp, error) {
|
||||||
logger.Errorf("err:%#v", err)
|
logger.Errorf("err:%#v", err)
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
if m.MemberType == 2 {
|
if m.MemberType == 2 { // 如果被邀请用户是2-会员,则比较会员注册时间,否则比较记录时间
|
||||||
qs = qs.MemberOpenTimeGte(parse)
|
qs = qs.MemberOpenTimeGte(parse)
|
||||||
} else {
|
} else {
|
||||||
qs = qs.CreatedAtGte(parse)
|
qs = qs.CreatedAtGte(parse)
|
||||||
|
@ -1017,6 +1041,12 @@ type InviteMemberReportListReq struct {
|
||||||
Uid uint32 `json:"uid"`
|
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) {
|
func (m *InviteMemberReportListReq) List() ([]InviteMemberReport, int, error) {
|
||||||
var memberReport []InviteMemberReport
|
var memberReport []InviteMemberReport
|
||||||
qs := NewInviteMemberReportQuerySet(DB).UidEq(m.Uid)
|
qs := NewInviteMemberReportQuerySet(DB).UidEq(m.Uid)
|
||||||
|
@ -1127,6 +1157,7 @@ type MemberStatisticDaily struct {
|
||||||
Accumulative uint32 `json:"accumulative"`
|
Accumulative uint32 `json:"accumulative"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StorePromotion 记录促销情况
|
||||||
func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error {
|
func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error {
|
||||||
//inviteUid := uint32(0)
|
//inviteUid := uint32(0)
|
||||||
//uid := uint32(0)
|
//uid := uint32(0)
|
||||||
|
@ -1143,7 +1174,7 @@ func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error {
|
||||||
}
|
}
|
||||||
nowTime := time.Now()
|
nowTime := time.Now()
|
||||||
|
|
||||||
if inviteUser.UserType == 2 && user.Uid != 0 {
|
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 ",
|
||||||
user.Uid, inviteUid))
|
user.Uid, inviteUid))
|
||||||
|
@ -1155,10 +1186,10 @@ func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error {
|
||||||
firstInviteRecord := &UserInviteRecord{
|
firstInviteRecord := &UserInviteRecord{
|
||||||
ToUid: user.Uid,
|
ToUid: user.Uid,
|
||||||
FromUid: inviteUid,
|
FromUid: inviteUid,
|
||||||
Action: 2,
|
Action: 2, // 激活邀请
|
||||||
SpendType: 1,
|
SpendType: 1, // 未开通
|
||||||
MemberLevel: 0,
|
MemberLevel: 0, // 未开通会员
|
||||||
First: 1,
|
First: 1, // 首次邀请
|
||||||
Scan: 1,
|
Scan: 1,
|
||||||
ActionTime: nowTime,
|
ActionTime: nowTime,
|
||||||
}
|
}
|
||||||
|
@ -1166,14 +1197,13 @@ func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("create user invite record err:", err)
|
logger.Error("create user invite record err:", err)
|
||||||
}
|
}
|
||||||
// 添加首次扫码
|
|
||||||
}
|
}
|
||||||
// 扫码记录
|
// 扫码记录
|
||||||
inviteRecord := &UserInviteRecord{
|
inviteRecord := &UserInviteRecord{
|
||||||
ToUid: user.Uid,
|
ToUid: user.Uid,
|
||||||
FromUid: inviteUid,
|
FromUid: inviteUid,
|
||||||
Action: 1,
|
Action: 1, // 未激活
|
||||||
SpendType: 1,
|
SpendType: 1, // 未开通
|
||||||
MemberLevel: 0,
|
MemberLevel: 0,
|
||||||
First: 0,
|
First: 0,
|
||||||
Scan: 1,
|
Scan: 1,
|
||||||
|
@ -1199,19 +1229,19 @@ func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error {
|
||||||
memberLevel = MemberTypeConsumer
|
memberLevel = MemberTypeConsumer
|
||||||
}
|
}
|
||||||
invite := &UserInvite{
|
invite := &UserInvite{
|
||||||
FromUid: inviteUid,
|
FromUid: inviteUid, // 邀请人用户id
|
||||||
UserType: inviteUser.UserType,
|
UserType: inviteUser.UserType, // 邀请人用户类型
|
||||||
StoreId: inviteUser.StoreId,
|
StoreId: inviteUser.StoreId, // 邀请人门店id
|
||||||
MemberOpenTime: nowTime,
|
MemberOpenTime: nowTime, // 开通会员时间
|
||||||
MemberType: memberLevel,
|
MemberType: memberLevel, // 被邀请用户类型
|
||||||
MemberStatus: 1,
|
MemberStatus: 1, // 被邀请用户会员状态 1-未开通
|
||||||
ToUid: user.Uid,
|
ToUid: user.Uid, // 被邀请用户id
|
||||||
Action: 1,
|
Action: 1, // 未激活
|
||||||
SpendType: 1,
|
SpendType: 1, // 未开通
|
||||||
UserInviteRecordId: inviteRecord.ID,
|
UserInviteRecordId: inviteRecord.ID, // 邀请记录id
|
||||||
FirstInvite: 0, // TODO
|
FirstInvite: 0, // TODO 首次邀请id
|
||||||
Scan: 1,
|
Scan: 1, // 扫码次数
|
||||||
InviteForm: 1,
|
InviteForm: 1, // 1-店员邀请码续费
|
||||||
}
|
}
|
||||||
fmt.Println("创建邀请:", invite)
|
fmt.Println("创建邀请:", invite)
|
||||||
if err := invite.Create(DB); err != nil {
|
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
|
||||||
|
}
|
||||||
|
|
|
@ -8,16 +8,19 @@ import (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
//VmEventExchangeGoods = "exchange_goods"
|
//VmEventExchangeGoods = "exchange_goods"
|
||||||
VmEventBuyGoods = "buy_goods"
|
VmEventBuyGoods = "buy_goods" // 购买商品积分抵扣
|
||||||
VmEventOpenMember = "open_member"
|
VmEventOpenMember = "open_member" // 开通会员奖励
|
||||||
VmEventInvite1Member = "invite_1_member"
|
VmEventInvite1Member = "invite_1_member" // 邀请会员奖励
|
||||||
VmEventInvite2Member = "invite_2_member"
|
VmEventInvite2Member = "invite_2_member" // 邀请会员奖励
|
||||||
VmEventAttendance = "attendance"
|
VmEventAttendance = "attendance" // 连续签到获取积分
|
||||||
|
VmEventErpOrderSale = "erp_order_sale" // 零售销售获得积分
|
||||||
|
VmEventErpOrderReject = "erp_order_reject" // 零售退货扣除积分
|
||||||
)
|
)
|
||||||
|
|
||||||
// 用户积分
|
// 用户积分
|
||||||
//go:generate goqueryset -in user_vm.go
|
|
||||||
// gen:qs
|
// gen:qs
|
||||||
|
//
|
||||||
|
//go:generate goqueryset -in user_vm.go
|
||||||
type UserVm struct {
|
type UserVm struct {
|
||||||
Model
|
Model
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,7 @@ func ConfigAppRouter(r gin.IRouter) {
|
||||||
|
|
||||||
user := api.Group("user")
|
user := api.Group("user")
|
||||||
{
|
{
|
||||||
user.Use(auth.UserAccessAuth) //
|
user.Use(auth.UserAccessAuth)
|
||||||
user.POST("data", controller.UserData) // 用户数据
|
user.POST("data", controller.UserData) // 用户数据
|
||||||
user.POST("user_info/upload", controller.UserInfoUpload) // 上传用户信息
|
user.POST("user_info/upload", controller.UserInfoUpload) // 上传用户信息
|
||||||
user.POST("user_info/tel", controller.UserTel) // 获取用户手机号
|
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("service/wechat_id", controller.GetCustomerServiceWechatId) // 获取客服微信号
|
||||||
user.POST("invite_applet_code", controller.UserInviteAppletQRCode) // 小程序分享二维码
|
user.POST("invite_applet_code", controller.UserInviteAppletQRCode) // 小程序分享二维码
|
||||||
user.POST("invite_list", controller.UserInviteList) // 小程序推广记录
|
user.POST("invite_list", controller.UserInviteList) // 小程序推广记录
|
||||||
|
user.POST("new_invite_list", controller.NewUserInviteRecordList) // 小程序推广记录
|
||||||
user.POST("use_code_to_coupon", controller.UserCodeToCoupon) // 兑换码兑换优惠券
|
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("member_promotion/assistant_detail", controller.AssistantMemberPromotionDetail) // 店员推广 TODO
|
||||||
|
|
||||||
cooperative.POST("display_list", controller.DisplayStoreList) // 用户门店列表
|
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/create", controller.CooperativeCannibalizeTaskCreate) // 创建调拨
|
||||||
cooperative.POST("/cannibalize_task/import_goods", controller.CooperativeCannibalizeTaskImportGoods) //
|
cooperative.POST("/cannibalize_task/import_goods", controller.CooperativeCannibalizeTaskImportGoods) //
|
||||||
|
|
Loading…
Reference in New Issue
Block a user