Spaces:
Build error
Build error
| package model | |
| import ( | |
| "errors" | |
| "fmt" | |
| "one-api/common" | |
| "one-api/logger" | |
| "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", logger.FormatQuota(int(quota)), topUp.Amount)) | |
| return nil | |
| } | |