1、完善用户积分过期扣减逻辑;

2、完善零售获取积分逻辑,避免重复记录;
This commit is contained in:
chenlin 2025-08-19 11:35:18 +08:00
parent d88d40c9e6
commit fcba75ba00
2 changed files with 83 additions and 32 deletions

View File

@ -4220,46 +4220,82 @@ func UpdateExpireUserVm() {
for _, record := range userVmRecords { for _, record := range userVmRecords {
// 计算需要扣除的积分 // 计算需要扣除的积分
pointsToDeduct := record.Alter - record.UsedVm pointsToDeduct := record.Alter - record.UsedVm
if pointsToDeduct <= 0 {
continue
}
// 开启事务
tx := orm.Eloquent.Begin()
if tx.Error != nil {
log.Printf("Failed to begin transaction for uid %d: %v", record.Uid, tx.Error)
continue
}
// 查询用户当前总积分
var currentVm int64
err = tx.Table("user_vm").
Where("uid = ?", record.Uid).
Pluck("vm", &currentVm).Error
if err != nil {
log.Printf("Failed to get current vm for uid %d: %v", record.Uid, err)
tx.Rollback()
continue
}
// currentVm 是扣减前积分
beforeVm := currentVm
afterVm := currentVm - int64(pointsToDeduct)
if afterVm < 0 {
afterVm = 0
}
if pointsToDeduct > 0 {
// 更新 UserVm 表,防止 vm 变为负值,并更新 updated_at 字段 // 更新 UserVm 表,防止 vm 变为负值,并更新 updated_at 字段
sql := ` sql := `
UPDATE user_vm UPDATE user_vm
SET vm = IF(vm - ? >= 0, vm - ?, 0), updated_at = ? SET vm = IF(vm - ? >= 0, vm - ?, 0), updated_at = ?
WHERE uid = ? WHERE uid = ?
` `
err = orm.Eloquent.Exec(sql, pointsToDeduct, pointsToDeduct, time.Now(), record.Uid).Error err = tx.Exec(sql, pointsToDeduct, pointsToDeduct, time.Now(), record.Uid).Error
if err != nil { if err != nil {
log.Printf("Failed to update user_vm for uid %d: %v", record.Uid, err) log.Printf("Failed to update user_vm for uid %d: %v", record.Uid, err)
tx.Rollback()
continue continue
} }
// 更新原有的 UserVmRecord更新 used_vm 的值为 alter // 更新原有的 UserVmRecord更新 used_vm 的值为 alter
err = orm.Eloquent.Table("user_vm_record").Where("id=?", record.ID). err = tx.Table("user_vm_record").Where("id=?", record.ID).
Updates(map[string]interface{}{ Updates(map[string]interface{}{
"used_vm": record.Alter, "used_vm": record.Alter,
"updated_at": time.Now(), "updated_at": time.Now(),
}).Error }).Error
if err != nil { if err != nil {
log.Printf("Failed to update user_vm_record (used_vm) for record id %d: %v", record.ID, err) log.Printf("Failed to update user_vm_record (used_vm) for record id %d: %v", record.ID, err)
tx.Rollback()
continue continue
} }
// 创建新的 UserVmRecord 记录扣除过期积分 // 创建新的 UserVmRecord 记录扣除过期积分
newRecord := UserVmRecord{ newRecord := UserVmRecord{
Uid: record.Uid, Uid: record.Uid,
BeforeVm: record.AfterVm, BeforeVm: uint32(beforeVm), // 扣减前的积分
AfterVm: record.AfterVm - uint32(pointsToDeduct), AfterVm: uint32(afterVm), // 扣减后的积分
Alter: -pointsToDeduct, Alter: -pointsToDeduct,
Event: VmEventExpired, Event: VmEventExpired,
Describe: "积分过期扣减", Describe: "积分过期扣减",
BillSn: record.BillSn, BillSn: record.BillSn,
} }
err = orm.Eloquent.Table("user_vm_record").Create(&newRecord).Error err = tx.Table("user_vm_record").Create(&newRecord).Error
if err != nil { if err != nil {
log.Printf("Failed to create new user_vm_record for uid %d: %v", record.Uid, err) log.Printf("Failed to create new user_vm_record for uid %d: %v", record.Uid, err)
tx.Rollback()
continue
} }
// 提交事务
if err = tx.Commit().Error; err != nil {
log.Printf("Failed to commit transaction for uid %d: %v", record.Uid, err)
tx.Rollback()
} }
} }
} }

View File

@ -57,6 +57,21 @@ type UserVmRecord struct {
} }
func UserVmUpdate(gdb *gorm.DB, billSn string, uid uint32, amount int, event, describe string) error { func UserVmUpdate(gdb *gorm.DB, billSn string, uid uint32, amount int, event, describe string) error {
// 仅对零售销售事件做幂等检查
var count int64
if event == VmEventErpOrderSale {
err := orm.Eloquent.Table("user_vm_record").
Where("bill_sn = ? AND event = ?", billSn, event).
Count(&count).Error
if err != nil {
return err
}
if count > 0 {
// 已有记录,直接返回
return nil
}
}
var userVm UserVm var userVm UserVm
err := orm.Eloquent.Table("user_vm"). err := orm.Eloquent.Table("user_vm").
Where("uid=?", uid).Find(&userVm).Error Where("uid=?", uid).Find(&userVm).Error