diff --git a/controller/game_card.go b/controller/game_card.go index 65cb0f4..92e5170 100644 --- a/controller/game_card.go +++ b/controller/game_card.go @@ -411,6 +411,10 @@ func PushWXPayNotice(c *gin.Context) { 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) + } } else { qs := model.NewUserInviteQuerySet(model.DB).ToUidEq(record.Uid).GetUpdater() if user.MemberLevel != 2 { @@ -426,11 +430,20 @@ func PushWXPayNotice(c *gin.Context) { if invite.FromUid != 0 { inviteUser := model.GetUserByUid(invite.FromUid) - if inviteUser.UserType != 2 && user.MemberLevel != 2 { // 邀请 新用户推送一次 + if inviteUser.UserType != 2 /*不是店员*/ && user.MemberLevel != 2 { // 邀请 新用户推送一次 err := model.CodeSendToUser(invite.FromUid, model.CodeTypeMemberCard30, model.RedeemCodeActivityTypeUserInvite) if err != nil { logger.Error("err:", err) } + + err = model.SendUserVm(inviteUser.Uid, record.MemberLevel, 1) + if err != nil { + logger.Error("send user vm err:", err) + } + } + err = model.SendUserVm(user.Uid, record.MemberLevel, 0) + if err != nil { + logger.Error("send user vm err:", err) } } } @@ -439,11 +452,11 @@ func PushWXPayNotice(c *gin.Context) { if user.MemberLevel != 2 { err = model.CodeSendToUser(user.Uid, model.CodeTypeMemberCard30, model.RedeemCodeActivityTypeStore) if err != nil { - logger.Error("err:", err) + logger.Error("code send to user err:", err) } } - model.CreateUserRentCardByMemberLevel(record.Uid,record.MemberLevel,memberConfig.CardMax) + model.CreateUserRentCardByMemberLevel(record.Uid, record.MemberLevel, memberConfig.CardMax) } @@ -494,7 +507,16 @@ func PushWXPayNotice(c *gin.Context) { if err != nil { logger.Error("err:", err) } + err = model.OrderUpdateGoodsStock(goodsOrder.GoodsId, goodsOrder.Quantity, model.DB) + if err != nil { + logger.Error("err:", err) + } + + err = model.UserVmUpdate(goodsOrder.Uid, int(goodsOrder.Amount)*-1, model.VmEventExchangeGoods, "兑换奖品") + if err != nil { + logger.Error("err:", err) + } } else if notify.Attach == wxpay.WxPayUpgradeMember { record := &model.UserOpenMemberRecord{OpenNo: notify.OutTradeNo} @@ -537,8 +559,7 @@ func PushWXPayNotice(c *gin.Context) { return } - - model.CreateUserRentCardByMemberLevel(record.Uid,record.MemberLevel,memberConfig.CardMax) + model.CreateUserRentCardByMemberLevel(record.Uid, record.MemberLevel, memberConfig.CardMax) } logger.Debug("微信推动支付通知") diff --git a/controller/mall.go b/controller/mall.go index 51f130f..01f36ab 100644 --- a/controller/mall.go +++ b/controller/mall.go @@ -156,13 +156,13 @@ func MallOrderCreate(c *gin.Context) { RespJson(c, status.UserVmNotEnough, nil) return } - err := model.OrderDeductionUserVm(uc.Uid, int(userVm.Vm), int(amount)*-1, tx) - if err != nil { - tx.Rollback() - logger.Error("err:", err) - RespJson(c, status.InternalServerError, nil) - return - } + //err := model.OrderDeductionUserVm(uc.Uid, int(userVm.Vm), int(amount)*-1, tx) + //if err != nil { + // tx.Rollback() + // logger.Error("err:", err) + // RespJson(c, status.InternalServerError, nil) + // return + //} } err = tx.Commit().Error diff --git a/model/config.go b/model/config.go index bf7e34a..5639a8c 100644 --- a/model/config.go +++ b/model/config.go @@ -26,8 +26,9 @@ type PayConfig struct { } const ( - ConfigNamePay = "pay_config" // 支付配置 - ConfigNameMember = "member_config" // 会员配置 + ConfigNamePay = "pay_config" // 支付配置 + ConfigNameMember = "member_config" // 会员配置 + ConfigNameMemberVm = "member_vm_config" // 会员积分配置 ) func PayConfigInfo() (*PayConfig, error) { @@ -90,6 +91,49 @@ func GetMemberConfig(level uint32) (*MemberConfig, error) { return nil, errors.New("level err") } +type MemberVmConfig struct { + MemberLever uint32 `json:"member_lever"` // 会员等级 + MemberVm uint32 `json:"member_vm"` + Invite1Vm uint32 `json:"invite_1_vm"` + Invite2Vm uint32 `json:"invite_2_vm"` + AutomationMemberVm uint32 `json:"automation_member_vm"` +} + +func memberVmConfigInfo() ([]MemberVmConfig, error) { + var memberVmConfigs []MemberVmConfig + var configAllocation Config + err := NewConfigQuerySet(DB).NameEq(ConfigNameMemberVm).One(&configAllocation) + if err != nil { + logger.Error("err:", err) + return memberVmConfigs, err + } + + err = json.Unmarshal([]byte(configAllocation.Value), &memberVmConfigs) + if err != nil { + logger.Error("err:", err) + return memberVmConfigs, err + } + + return memberVmConfigs, nil +} + +func GetMemberVmConfig(level uint32) (*MemberVmConfig, error) { + if level == 3 { + return nil, errors.New("level is 3") + } + info, err := memberVmConfigInfo() + if err != nil { + return nil, err + } + for _, config := range info { + if config.MemberLever == level { + return &config, nil + } + } + + return nil, errors.New("level err") +} + //type ConfigInterface interface { // Encode() string //} diff --git a/model/config_test.go b/model/config_test.go index 2dc19ab..0e45170 100644 --- a/model/config_test.go +++ b/model/config_test.go @@ -36,3 +36,40 @@ func TestMemberConfigInfo(t *testing.T) { fmt.Println("list:", string(bytes)) } + +func TestMemberVmConfig(t *testing.T) { + list := []MemberVmConfig{ + { + MemberLever: 2, + MemberVm: 1500, + Invite1Vm: 3000, + Invite2Vm: 500, + AutomationMemberVm: 1500, + }, + { + MemberLever: 4, + MemberVm: 2000, + Invite1Vm: 5000, + Invite2Vm: 1000, + AutomationMemberVm: 2000, + }, + { + MemberLever: 5, + MemberVm: 3000, + Invite1Vm: 10000, + Invite2Vm: 2000, + AutomationMemberVm: 3000, + }, + } + + bytes, err := json.Marshal(&list) + if err != nil { + fmt.Println("err:", err.Error()) + } + + fmt.Println("list:", string(bytes)) +} + +//黄金会员 1500(开通)、3000(邀新) +//白金会员 2000(开通)、4000(邀新) +//黑金会员 3000(开通)、6000(邀新) diff --git a/model/mall.go b/model/mall.go index 289f577..5cb8b13 100644 --- a/model/mall.go +++ b/model/mall.go @@ -259,7 +259,7 @@ func (m *GoodsOrderDetailReq) OrderDetail(uid uint32) (*GoodsOrder, error) { order.Goods = orders[0].Goods } var userAddress UserAddress - err = NewUserAddressQuerySet(DB).IDEq(order.AddressId).One(&userAddress) + err = NewUserAddressQuerySet(DB.Unscoped()).IDEq(order.AddressId).One(&userAddress) if err != nil && err != RecordNotFound { logger.Error("err:", err) return nil, err diff --git a/model/redeem_code.go b/model/redeem_code.go index ccb5ac6..1d7d4de 100644 --- a/model/redeem_code.go +++ b/model/redeem_code.go @@ -215,3 +215,42 @@ func CodeSendToUser(uid uint32, codeType string, activityType uint32) error { } return nil } + +func SendUserVm(uid, memberLevel, inviteLevel uint32) error { + if memberLevel == 3 { + return nil + } + config, err := GetMemberVmConfig(memberLevel) + if err != nil { + logger.Error("err:", err) + return err + } + + amount := 0 + describe := "" + event := "" + if inviteLevel == 0 { + amount = int(config.MemberVm) + describe = "开通会员奖励" + event = VmEventOpenMember + } else if inviteLevel == 1 { + amount = int(config.Invite1Vm) + describe = "邀请会员奖励" + event = VmEventInvite1Member + } else if inviteLevel == 2 { + amount = int(config.Invite2Vm) + describe = "邀请会员奖励" + event = VmEventInvite2Member + } else if inviteLevel == 100 { + amount = int(config.AutomationMemberVm) + describe = "开通会员奖励" + event = VmEventOpenMember + } + + err = UserVmUpdate(uid, amount, event, describe) + if err != nil { + logger.Error("err:", err) + return err + } + return nil +} diff --git a/model/user_vm.go b/model/user_vm.go index e013745..56111f8 100644 --- a/model/user_vm.go +++ b/model/user_vm.go @@ -1,5 +1,18 @@ package model +import ( + "errors" + "fmt" + "github.com/codinl/go-logger" +) + +const ( + VmEventExchangeGoods = "exchange_goods" + VmEventOpenMember = "open_member" + VmEventInvite1Member = "invite_1_member" + VmEventInvite2Member = "invite_2_member" +) + // 用户积分 //go:generate goqueryset -in user_vm.go // gen:qs @@ -23,3 +36,61 @@ type UserVmRecord struct { Describe string `json:"describe" gorm:"type:text"` // 描述 } + +func UserVmUpdate(uid uint32, amount int, event, describe string) error { + var userVm UserVm + err := NewUserVmQuerySet(DB).UidEq(uid).One(&userVm) + if err != nil && err != RecordNotFound { + logger.Error("err:", err) + return err + } + begin := DB.Begin() + if err == RecordNotFound { + if amount < 0 { + begin.Rollback() + logger.Error("amount lt 0") + return errors.New("amount lt 0") + } + userVm = UserVm{ + Uid: uid, + Vm: uint32(amount), + } + err = begin.Create(&userVm).Error + if err != nil { + begin.Rollback() + logger.Error("err:", err) + return err + } + } else { + sql := fmt.Sprintf("UPDATE user_vm SET vm = vm+? WHERE uid=?;") + err = begin.Exec(sql, amount, uid).Error + if err != nil { + begin.Rollback() + logger.Error("err:", err) + return err + } + } + + vmRecord := &UserVmRecord{ + Uid: uid, + BeforeVm: uint32(userVm.Vm), + AfterVm: uint32(int(userVm.Vm) + amount), + Alter: amount, + Event: event, + Describe: describe, + } + err = begin.Create(vmRecord).Error + if err != nil { + begin.Rollback() + logger.Error("err:", err) + return err + } + + err = begin.Commit().Error + if err != nil { + begin.Rollback() + logger.Error("err:", err) + return err + } + return nil +}