mirror of
https://github.com/linux-do/new-api.git
synced 2025-09-18 00:16:37 +08:00
100 lines
2.1 KiB
Go
100 lines
2.1 KiB
Go
package model
|
||
|
||
import (
|
||
"errors"
|
||
"fmt"
|
||
"gorm.io/gorm"
|
||
"one-api/common"
|
||
)
|
||
|
||
type TopUp struct {
|
||
Id int `json:"id"`
|
||
UserId int `json:"user_id" gorm:"index"`
|
||
Amount int `json:"amount"`
|
||
Money float64 `json:"money"`
|
||
TradeNo string `json:"trade_no" gorm:"unique"`
|
||
CreateTime int64 `json:"create_time"`
|
||
CompleteTime int64 `json:"complete_time"`
|
||
Status string `json:"status"`
|
||
}
|
||
|
||
func (topUp *TopUp) Insert() error {
|
||
var err error
|
||
err = DB.Create(topUp).Error
|
||
return err
|
||
}
|
||
|
||
func (topUp *TopUp) Update() error {
|
||
var err error
|
||
err = DB.Save(topUp).Error
|
||
return err
|
||
}
|
||
|
||
func GetTopUpById(id int) *TopUp {
|
||
var topUp *TopUp
|
||
var err error
|
||
err = DB.Where("id = ?", id).First(&topUp).Error
|
||
if err != nil {
|
||
return nil
|
||
}
|
||
return topUp
|
||
}
|
||
|
||
func GetTopUpByTradeNo(tradeNo string) *TopUp {
|
||
var topUp *TopUp
|
||
var err error
|
||
err = DB.Where("trade_no = ?", tradeNo).First(&topUp).Error
|
||
if err != nil {
|
||
return nil
|
||
}
|
||
return topUp
|
||
}
|
||
|
||
func Recharge(referenceId string) (err error) {
|
||
if referenceId == "" {
|
||
return errors.New("未提供支付单号")
|
||
}
|
||
|
||
var quota float64
|
||
topUp := &TopUp{}
|
||
|
||
refCol := "`trade_no`"
|
||
if common.UsingPostgreSQL {
|
||
refCol = `"trade_no"`
|
||
}
|
||
|
||
err = DB.Transaction(func(tx *gorm.DB) error {
|
||
err := tx.Set("gorm:query_option", "FOR UPDATE").Where(refCol+" = ?", referenceId).First(topUp).Error
|
||
if err != nil {
|
||
return errors.New("充值订单不存在")
|
||
}
|
||
|
||
if topUp.Status != common.TopUpStatusPending {
|
||
return errors.New("充值订单状态错误")
|
||
}
|
||
|
||
topUp.CompleteTime = common.GetTimestamp()
|
||
topUp.Status = common.TopUpStatusSuccess
|
||
err = tx.Save(topUp).Error
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
quota = topUp.Money * common.QuotaPerUnit
|
||
err = tx.Model(&User{}).Where("id = ?", topUp.UserId).Update("quota", gorm.Expr("quota + ?", quota)).Error
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
return nil
|
||
})
|
||
|
||
if err != nil {
|
||
return errors.New("充值失败," + err.Error())
|
||
}
|
||
|
||
RecordLog(topUp.UserId, LogTypeTopup, fmt.Sprintf("使用在线充值成功,充值金额: %v,支付金额:%d", common.LogQuotaF(quota), topUp.Amount))
|
||
|
||
return nil
|
||
}
|