| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- 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
- }
|