159 lines
4.1 KiB
Go
159 lines
4.1 KiB
Go
package model
|
||
|
||
import (
|
||
"errors"
|
||
"one-api/common"
|
||
)
|
||
|
||
// PurchasedServer 已购服务器表
|
||
type PurchasedServer struct {
|
||
Id int `json:"id"`
|
||
UserId int `json:"user_id" gorm:"index"` // 用户ID
|
||
ServerId int `json:"server_id" gorm:"index"` // 服务器配置ID
|
||
ServerTitle string `json:"server_title" gorm:"type:varchar(255)"` // 服务器标题(冗余字段,防止配置被删除)
|
||
ServerConfig string `json:"server_config" gorm:"type:text"` // 服务器配置(冗余字段)
|
||
Price float64 `json:"price"` // 购买价格
|
||
Duration int `json:"duration"` // 购买时长(天)
|
||
PurchaseTime int64 `json:"purchase_time" gorm:"bigint;index"` // 购买时间
|
||
ExpireTime int64 `json:"expire_time" gorm:"bigint;index"` // 到期时间
|
||
Status int `json:"status" gorm:"default:1"` // 状态:1-正常,2-已过期
|
||
TradeNo string `json:"trade_no" gorm:"type:varchar(255);index"` // 交易单号
|
||
}
|
||
|
||
func (ps *PurchasedServer) Insert() error {
|
||
return DB.Create(ps).Error
|
||
}
|
||
|
||
func (ps *PurchasedServer) Update() error {
|
||
return DB.Save(ps).Error
|
||
}
|
||
|
||
func GetPurchasedServerById(id int) (*PurchasedServer, error) {
|
||
if id == 0 {
|
||
return nil, errors.New("id 为空")
|
||
}
|
||
ps := PurchasedServer{Id: id}
|
||
err := DB.First(&ps, "id = ?", id).Error
|
||
return &ps, err
|
||
}
|
||
|
||
func GetPurchasedServerByTradeNo(tradeNo string) (*PurchasedServer, error) {
|
||
var ps PurchasedServer
|
||
err := DB.Where("trade_no = ?", tradeNo).First(&ps).Error
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &ps, nil
|
||
}
|
||
|
||
func GetAllPurchasedServers(pageInfo *common.PageInfo) (servers []*PurchasedServer, total int64, err error) {
|
||
tx := DB.Begin()
|
||
if tx.Error != nil {
|
||
return nil, 0, tx.Error
|
||
}
|
||
defer func() {
|
||
if r := recover(); r != nil {
|
||
tx.Rollback()
|
||
}
|
||
}()
|
||
|
||
err = tx.Model(&PurchasedServer{}).Count(&total).Error
|
||
if err != nil {
|
||
tx.Rollback()
|
||
return nil, 0, err
|
||
}
|
||
|
||
err = tx.Order("id desc").Limit(pageInfo.GetPageSize()).Offset(pageInfo.GetStartIdx()).Find(&servers).Error
|
||
if err != nil {
|
||
tx.Rollback()
|
||
return nil, 0, err
|
||
}
|
||
|
||
if err = tx.Commit().Error; err != nil {
|
||
return nil, 0, err
|
||
}
|
||
|
||
return servers, total, nil
|
||
}
|
||
|
||
func GetUserPurchasedServers(userId int, pageInfo *common.PageInfo) (servers []*PurchasedServer, total int64, err error) {
|
||
tx := DB.Begin()
|
||
if tx.Error != nil {
|
||
return nil, 0, tx.Error
|
||
}
|
||
defer func() {
|
||
if r := recover(); r != nil {
|
||
tx.Rollback()
|
||
}
|
||
}()
|
||
|
||
err = tx.Model(&PurchasedServer{}).Where("user_id = ?", userId).Count(&total).Error
|
||
if err != nil {
|
||
tx.Rollback()
|
||
return nil, 0, err
|
||
}
|
||
|
||
err = tx.Where("user_id = ?", userId).Order("id desc").Limit(pageInfo.GetPageSize()).Offset(pageInfo.GetStartIdx()).Find(&servers).Error
|
||
if err != nil {
|
||
tx.Rollback()
|
||
return nil, 0, err
|
||
}
|
||
|
||
if err = tx.Commit().Error; err != nil {
|
||
return nil, 0, err
|
||
}
|
||
|
||
return servers, total, nil
|
||
}
|
||
|
||
func SearchPurchasedServers(keyword string, startIdx int, num int) (servers []*PurchasedServer, total int64, err error) {
|
||
tx := DB.Begin()
|
||
if tx.Error != nil {
|
||
return nil, 0, tx.Error
|
||
}
|
||
defer func() {
|
||
if r := recover(); r != nil {
|
||
tx.Rollback()
|
||
}
|
||
}()
|
||
|
||
query := tx.Model(&PurchasedServer{})
|
||
if keyword != "" {
|
||
// 支持按用户ID、服务器标题搜索
|
||
query = query.Where("server_title LIKE ? OR user_id = ?", "%"+keyword+"%", keyword)
|
||
}
|
||
|
||
err = query.Count(&total).Error
|
||
if err != nil {
|
||
tx.Rollback()
|
||
return nil, 0, err
|
||
}
|
||
|
||
err = query.Order("id desc").Limit(num).Offset(startIdx).Find(&servers).Error
|
||
if err != nil {
|
||
tx.Rollback()
|
||
return nil, 0, err
|
||
}
|
||
|
||
if err = tx.Commit().Error; err != nil {
|
||
return nil, 0, err
|
||
}
|
||
|
||
return servers, total, nil
|
||
}
|
||
|
||
func DeletePurchasedServerById(id int) error {
|
||
if id == 0 {
|
||
return errors.New("id 为空")
|
||
}
|
||
return DB.Delete(&PurchasedServer{}, "id = ?", id).Error
|
||
}
|
||
|
||
// UpdateExpiredServers 更新过期服务器状态
|
||
func UpdateExpiredServers() error {
|
||
now := common.GetTimestamp()
|
||
return DB.Model(&PurchasedServer{}).
|
||
Where("expire_time < ? AND status = ?", now, 1).
|
||
Update("status", 2).Error
|
||
}
|