mirror of
https://github.com/songquanpeng/one-api.git
synced 2025-09-29 22:56:39 +08:00
108 lines
3.0 KiB
Go
108 lines
3.0 KiB
Go
package model
|
|
|
|
import (
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type OrderStatus string
|
|
|
|
const (
|
|
OrderStatusPending OrderStatus = "pending"
|
|
OrderStatusSuccess OrderStatus = "success"
|
|
OrderStatusFailed OrderStatus = "failed"
|
|
OrderStatusClosed OrderStatus = "closed"
|
|
)
|
|
|
|
type Order struct {
|
|
ID int `json:"id"`
|
|
UserId int `json:"user_id"`
|
|
TradeNo string `json:"trade_no" gorm:"type:varchar(50);uniqueIndex"`
|
|
GatewayNo string `json:"gateway_no" gorm:"type:varchar(100)"`
|
|
Amount int `json:"amount" gorm:"default:0"`
|
|
OrderAmount float64 `json:"order_amount" gorm:"type:decimal(10,2);default:0"`
|
|
OrderCurrency CurrencyType `json:"order_currency" gorm:"type:varchar(16)"`
|
|
Quota int `json:"quota" gorm:"type:int;default:0"`
|
|
Fee float64 `json:"fee" gorm:"type:decimal(10,2);default:0"`
|
|
Status OrderStatus `json:"status" gorm:"type:varchar(32)"`
|
|
CreatedAt int `json:"created_at"`
|
|
UpdatedAt int `json:"-"`
|
|
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
|
|
}
|
|
|
|
// 查询并关闭未完成的订单
|
|
func CloseUnfinishedOrder() error {
|
|
// 关闭超过 3 小时未支付的订单
|
|
unixTime := time.Now().Unix() - 3*3600
|
|
return DB.Model(&Order{}).Where("status = ? AND created_at < ?", OrderStatusPending, unixTime).Update("status", OrderStatusClosed).Error
|
|
}
|
|
|
|
func GetOrderByTradeNo(tradeNo string) (*Order, error) {
|
|
var order Order
|
|
err := DB.Where("trade_no = ?", tradeNo).First(&order).Error
|
|
return &order, err
|
|
}
|
|
|
|
func GetUserOrder(userId int, tradeNo string) (*Order, error) {
|
|
var order Order
|
|
err := DB.Where("user_id = ? AND trade_no = ?", userId, tradeNo).First(&order).Error
|
|
return &order, err
|
|
}
|
|
|
|
func (o *Order) Insert() error {
|
|
return DB.Create(o).Error
|
|
}
|
|
|
|
func (o *Order) Update() error {
|
|
return DB.Save(o).Error
|
|
}
|
|
|
|
var allowedOrderFields = map[string]bool{
|
|
"id": true,
|
|
"user_id": true,
|
|
"status": true,
|
|
"created_at": true,
|
|
}
|
|
|
|
type SearchOrderParams struct {
|
|
UserId int `form:"user_id"`
|
|
TradeNo string `form:"trade_no"`
|
|
GatewayNo string `form:"gateway_no"`
|
|
Status string `form:"status"`
|
|
StartTimestamp int64 `form:"start_timestamp"`
|
|
EndTimestamp int64 `form:"end_timestamp"`
|
|
PaginationParams
|
|
}
|
|
|
|
func GetOrderList(params *SearchOrderParams) (*DataResult[Order], error) {
|
|
var orders []*Order
|
|
|
|
db := DB.Omit("key")
|
|
|
|
if params.UserId != 0 {
|
|
db = db.Where("user_id = ?", params.UserId)
|
|
}
|
|
|
|
if params.TradeNo != "" {
|
|
db = db.Where("trade_no = ?", params.TradeNo)
|
|
}
|
|
|
|
if params.GatewayNo != "" {
|
|
db = db.Where("gateway_no = ?", params.GatewayNo)
|
|
}
|
|
|
|
if params.Status != "" {
|
|
db = db.Where("status = ?", params.Status)
|
|
}
|
|
|
|
if params.StartTimestamp != 0 {
|
|
db = db.Where("created_at >= ?", params.StartTimestamp)
|
|
}
|
|
if params.EndTimestamp != 0 {
|
|
db = db.Where("created_at <= ?", params.EndTimestamp)
|
|
}
|
|
|
|
return PaginateAndOrder(db, ¶ms.PaginationParams, &orders, allowedOrderFields)
|
|
}
|