package model import ( "errors" "fmt" "github.com/codinl/go-logger" ) const ( //VmEventExchangeGoods = "exchange_goods" VmEventBuyGoods = "buy_goods" // 购买商品积分抵扣 VmEventOpenMember = "open_member" // 开通会员奖励 VmEventRenewMember = "renew_member" // 续费会员奖励 VmEventUpgradeMember = "upgrade_member" // 升级会员奖励 VmEventInvite1Member = "invite_1_member" // 邀请会员奖励 VmEventInvite2Member = "invite_2_member" // 邀请会员奖励 VmEventAttendance = "attendance" // 签到获取积分 VmEventErpOrderSale = "erp_order_sale" // 零售销售获得积分 VmEventErpOrderReject = "erp_order_reject" // 零售退货扣除积分 ) // 用户积分 // gen:qs // //go:generate goqueryset -in user_vm.go type UserVm struct { Model Uid uint32 `json:"uid" gorm:"column:uid;unique_index"` Vm uint32 `json:"vm"` } // 用户积分-变动记录 // gen:qs type UserVmRecord struct { Model Uid uint32 `json:"uid" gorm:"column:uid;index"` BeforeVm uint32 `json:"before_vm"` // 变动前 AfterVm uint32 `json:"after_vm"` // 变动后 Alter int `json:"alter"` // 数值 Event string `json:"event" gorm:"type:varchar(100)"` // 事件 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 }