172 lines
4.1 KiB
Go
172 lines
4.1 KiB
Go
package model
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"one-api/common"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type TopUp struct {
|
|
Id int `json:"id"`
|
|
UserId int `json:"user_id" gorm:"index"`
|
|
Amount int64 `json:"amount"`
|
|
Money float64 `json:"money"`
|
|
TradeNo string `json:"trade_no" gorm:"unique;type:varchar(255);index"`
|
|
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, customerId 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).Updates(map[string]interface{}{"stripe_customer": customerId, "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.FormatQuota(int(quota)), topUp.Amount))
|
|
|
|
return nil
|
|
}
|
|
|
|
func RechargeCreem(referenceId string, customerEmail string, customerName 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
|
|
}
|
|
|
|
// Creem 直接使用 Amount 作为充值额度
|
|
quota = float64(topUp.Amount)
|
|
|
|
// 构建更新字段,优先使用邮箱,如果邮箱为空则使用用户名
|
|
updateFields := map[string]interface{}{
|
|
"quota": gorm.Expr("quota + ?", quota),
|
|
}
|
|
|
|
// 如果有客户邮箱,尝试更新用户邮箱(仅当用户邮箱为空时)
|
|
if customerEmail != "" {
|
|
// 先检查用户当前邮箱是否为空
|
|
var user User
|
|
err = tx.Where("id = ?", topUp.UserId).First(&user).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 如果用户邮箱为空,则更新为支付时使用的邮箱
|
|
if user.Email == "" {
|
|
updateFields["email"] = customerEmail
|
|
fmt.Printf("更新用户邮箱:用户ID %d, 新邮箱 %s\n", topUp.UserId, customerEmail)
|
|
}
|
|
}
|
|
|
|
err = tx.Model(&User{}).Where("id = ?", topUp.UserId).Updates(updateFields).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
return errors.New("充值失败," + err.Error())
|
|
}
|
|
|
|
RecordLog(topUp.UserId, LogTypeTopup, fmt.Sprintf("使用Creem充值成功,充值额度: %v,支付金额:%.2f,客户邮箱:%s", common.FormatQuota(int(quota)), topUp.Money, customerEmail))
|
|
|
|
return nil
|
|
}
|