package models import ( "errors" "fmt" orm "go-admin/common/global" "go-admin/logger" "gorm.io/gorm" ) const ( VmEventBuyGoods = "buy_goods" // 购买商品积分抵扣 VmEventOpenMember = "open_member" // 开通会员奖励 VmEventInvite1Member = "invite_1_member" // 邀请会员奖励 VmEventInvite2Member = "invite_2_member" // 邀请会员奖励 VmEventUserShareCard = "user_share_card" // 用户共享卡收益 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"` //UserVm uint32 `json:"user_vm"` } // 用户积分-变动记录 // gen:qs type UserVmRecord struct { Model Uid uint32 `json:"uid" gorm:"column:uid;unique_index"` // 用户ID 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"` // 描述 ErpOrderId uint32 `json:"erp_order_id" gorm:"index"` // 零售订单id User *UserInfo `json:"user,omitempty" gorm:"-"` } func UserVmUpdate(gdb *gorm.DB, orderId, 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 } // 变动前的积分 nBeforeVm := userVm.Vm //flag := false begin := gdb if gdb == nil { //flag = true begin = orm.Eloquent.Begin() } if userVm.Uid == 0 { // 没有积分记录 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 { // 如果用户积分不够抵扣,则扣到0为止 if int(userVm.Vm)+amount <= 0 { sql := fmt.Sprintf("UPDATE user_vm SET vm = ? WHERE uid=?") err = begin.Exec(sql, 0, uid).Error } 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(nBeforeVm), AfterVm: 0, // 默认值为 0 Alter: amount, Event: event, Describe: describe, } if newValue := int(userVm.Vm) + amount; newValue > 0 { vmRecord.AfterVm = uint32(newValue) } err = begin.Create(vmRecord).Error if err != nil { begin.Rollback() logger.Error("err:", logger.Field("err", err)) return err } //if flag { // err = begin.Commit().Error // if err != nil { // begin.Rollback() // logger.Error("err:", logger.Field("err", err)) // return err // } //} return nil }