package models import ( "errors" "fmt" orm "go-admin/common/global" "go-admin/logger" ) const ( VmEventBuyGoods = "buy_goods" VmEventOpenMember = "open_member" VmEventInvite1Member = "invite_1_member" VmEventInvite2Member = "invite_2_member" VmEventUserShareCard = "user_share_card" VmEventAttendance = "attendance" ) // 用户积分 // 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"` //UserVm uint32 `json:"user_vm"` } // 用户积分-变动记录 // gen:qs type UserVmRecord struct { Model Uid uint32 `json:"uid" gorm:"column:uid;unique_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 := orm.Eloquent.Table("user_vm"). Where("uid=?", uid).Find(&userVm).Error if err != nil { logger.Error("share card retrieve cards err:", logger.Field("err", err)) return err } begin := orm.Eloquent.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:", logger.Field("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:", logger.Field("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:", logger.Field("err", err)) return err } err = begin.Commit().Error if err != nil { begin.Rollback() logger.Error("err:", logger.Field("err", err)) return err } return nil }