mirror of
https://github.com/yangjian102621/geekai.git
synced 2025-09-17 16:56:38 +08:00
84 lines
1.8 KiB
Go
84 lines
1.8 KiB
Go
package service
|
|
|
|
import (
|
|
"fmt"
|
|
"geekai/core/types"
|
|
"geekai/store/model"
|
|
"gorm.io/gorm"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
type UserService struct {
|
|
db *gorm.DB
|
|
lock sync.Mutex
|
|
}
|
|
|
|
func NewUserService(db *gorm.DB) *UserService {
|
|
return &UserService{db: db, lock: sync.Mutex{}}
|
|
}
|
|
|
|
// IncreasePower 增加用户算力
|
|
func (s *UserService) IncreasePower(userId int, power int, log model.PowerLog) error {
|
|
s.lock.Lock()
|
|
defer s.lock.Unlock()
|
|
|
|
tx := s.db.Begin()
|
|
err := tx.Model(&model.User{}).Where("id", userId).UpdateColumn("power", gorm.Expr("power + ?", power)).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
var user model.User
|
|
tx.Where("id", userId).First(&user)
|
|
err = tx.Create(&model.PowerLog{
|
|
UserId: user.Id,
|
|
Username: user.Username,
|
|
Type: log.Type,
|
|
Amount: power,
|
|
Balance: user.Power,
|
|
Mark: types.PowerAdd,
|
|
Model: log.Model,
|
|
Remark: log.Remark,
|
|
CreatedAt: time.Now(),
|
|
}).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
tx.Commit()
|
|
return nil
|
|
}
|
|
|
|
// DecreasePower 减少用户算力
|
|
func (s *UserService) DecreasePower(userId int, power int, log model.PowerLog) error {
|
|
s.lock.Lock()
|
|
defer s.lock.Unlock()
|
|
|
|
tx := s.db.Begin()
|
|
err := tx.Model(&model.User{}).Where("id", userId).UpdateColumn("power", gorm.Expr("power - ?", power)).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return fmt.Errorf("扣减算力失败:%v", err)
|
|
}
|
|
var user model.User
|
|
tx.Where("id", userId).First(&user)
|
|
err = tx.Create(&model.PowerLog{
|
|
UserId: user.Id,
|
|
Username: user.Username,
|
|
Type: log.Type,
|
|
Amount: power,
|
|
Balance: user.Power,
|
|
Mark: types.PowerSub,
|
|
Model: log.Model,
|
|
Remark: log.Remark,
|
|
CreatedAt: time.Now(),
|
|
}).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return fmt.Errorf("记录算力日志失败:%v", err)
|
|
}
|
|
tx.Commit()
|
|
return nil
|
|
}
|