2024-01-07 18:31:14 +08:00
package model
import (
"fmt"
"one-api/common"
2024-01-07 22:07:17 +08:00
"sync"
2024-01-07 18:31:14 +08:00
"time"
)
// QuotaData 柱状图数据
type QuotaData struct {
Id int ` json:"id" `
UserID int ` json:"user_id" gorm:"index" `
2024-01-08 10:11:36 +08:00
Username string ` json:"username" gorm:"index:idx_qdt_model_user_name,priority:2;size:64;default:''" `
2024-01-08 11:32:27 +08:00
ModelName string ` json:"model_name" gorm:"index:idx_qdt_model_user_name,priority:1;size:64;default:''" `
2024-01-07 22:07:17 +08:00
CreatedAt int64 ` json:"created_at" gorm:"bigint;index:idx_qdt_created_at,priority:2" `
2024-01-07 18:31:14 +08:00
Count int ` json:"count" gorm:"default:0" `
Quota int ` json:"quota" gorm:"default:0" `
}
2024-01-07 18:33:41 +08:00
func UpdateQuotaData ( ) {
2024-01-07 21:27:28 +08:00
// recover
defer func ( ) {
if r := recover ( ) ; r != nil {
common . SysLog ( fmt . Sprintf ( "UpdateQuotaData panic: %s" , r ) )
}
} ( )
2024-01-07 18:31:14 +08:00
for {
2024-01-07 18:33:41 +08:00
if common . DataExportEnabled {
common . SysLog ( "正在更新数据看板数据..." )
SaveQuotaDataCache ( )
}
time . Sleep ( time . Duration ( common . DataExportInterval ) * time . Minute )
2024-01-07 18:31:14 +08:00
}
}
var CacheQuotaData = make ( map [ string ] * QuotaData )
2024-01-07 22:07:17 +08:00
var CacheQuotaDataLock = sync . Mutex { }
2024-01-07 18:31:14 +08:00
func LogQuotaDataCache ( userId int , username string , modelName string , quota int , createdAt int64 ) {
// 只精确到小时
createdAt = createdAt - ( createdAt % 3600 )
key := fmt . Sprintf ( "%d-%s-%s-%d" , userId , username , modelName , createdAt )
quotaData , ok := CacheQuotaData [ key ]
if ok {
quotaData . Count += 1
quotaData . Quota += quota
} else {
quotaData = & QuotaData {
UserID : userId ,
Username : username ,
ModelName : modelName ,
CreatedAt : createdAt ,
Count : 1 ,
Quota : quota ,
}
}
CacheQuotaData [ key ] = quotaData
}
func LogQuotaData ( userId int , username string , modelName string , quota int , createdAt int64 ) {
2024-01-07 22:07:17 +08:00
CacheQuotaDataLock . Lock ( )
defer CacheQuotaDataLock . Unlock ( )
2024-01-07 18:31:14 +08:00
LogQuotaDataCache ( userId , username , modelName , quota , createdAt )
}
func SaveQuotaDataCache ( ) {
2024-01-07 22:07:17 +08:00
CacheQuotaDataLock . Lock ( )
defer CacheQuotaDataLock . Unlock ( )
size := len ( CacheQuotaData )
2024-01-07 18:31:14 +08:00
// 如果缓存中有数据,就保存到数据库中
// 1. 先查询数据库中是否有数据
// 2. 如果有数据,就更新数据
// 3. 如果没有数据,就插入数据
for _ , quotaData := range CacheQuotaData {
quotaDataDB := & QuotaData { }
DB . Table ( "quota_data" ) . Where ( "user_id = ? and username = ? and model_name = ? and created_at = ?" ,
quotaData . UserID , quotaData . Username , quotaData . ModelName , quotaData . CreatedAt ) . First ( quotaDataDB )
if quotaDataDB . Id > 0 {
quotaDataDB . Count += quotaData . Count
quotaDataDB . Quota += quotaData . Quota
DB . Table ( "quota_data" ) . Save ( quotaDataDB )
} else {
DB . Table ( "quota_data" ) . Create ( quotaData )
}
}
CacheQuotaData = make ( map [ string ] * QuotaData )
2024-01-07 22:07:17 +08:00
common . SysLog ( fmt . Sprintf ( "保存数据看板数据成功,共保存%d条数据" , size ) )
2024-01-07 18:31:14 +08:00
}
2024-01-07 19:47:35 +08:00
func GetQuotaDataByUsername ( username string , startTime int64 , endTime int64 ) ( quotaData [ ] * QuotaData , err error ) {
2024-01-07 18:31:14 +08:00
var quotaDatas [ ] * QuotaData
// 从quota_data表中查询数据
err = DB . Table ( "quota_data" ) . Where ( "username = ?" , username ) . Find ( & quotaDatas ) . Error
return quotaDatas , err
}
2024-01-07 19:47:35 +08:00
func GetQuotaDataByUserId ( userId int , startTime int64 , endTime int64 ) ( quotaData [ ] * QuotaData , err error ) {
2024-01-07 18:31:14 +08:00
var quotaDatas [ ] * QuotaData
// 从quota_data表中查询数据
2024-01-07 19:47:35 +08:00
err = DB . Table ( "quota_data" ) . Where ( "user_id = ? and created_at >= ? and created_at <= ?" , userId , startTime , endTime ) . Find ( & quotaDatas ) . Error
return quotaDatas , err
}
2024-01-08 18:49:10 +08:00
func GetAllQuotaDates ( startTime int64 , endTime int64 , username string ) ( quotaData [ ] * QuotaData , err error ) {
if username != "" {
return GetQuotaDataByUsername ( username , startTime , endTime )
}
2024-01-07 19:47:35 +08:00
var quotaDatas [ ] * QuotaData
// 从quota_data表中查询数据
2024-01-08 18:49:10 +08:00
// only select model_name, sum(count) as count, sum(quota) as quota, model_name, created_at from quota_data group by model_name, created_at;
//err = DB.Table("quota_data").Where("created_at >= ? and created_at <= ?", startTime, endTime).Find("aDatas).Error
err = DB . Table ( "quota_data" ) . Select ( "model_name, sum(count) as count, sum(quota) as quota, created_at" ) . Where ( "created_at >= ? and created_at <= ?" , startTime , endTime ) . Group ( "model_name, created_at" ) . Find ( & quotaDatas ) . Error
2024-01-07 18:31:14 +08:00
return quotaDatas , err
}