usedata.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package model
  2. import (
  3. "fmt"
  4. "one-api/common"
  5. "time"
  6. )
  7. // QuotaData 柱状图数据
  8. type QuotaData struct {
  9. Id int `json:"id"`
  10. UserID int `json:"user_id" gorm:"index"`
  11. Username string `json:"username" gorm:"index:index_quota_data_model_user_name,priority:2;default:''"`
  12. ModelName string `json:"model_name" gorm:"index;index:index_quota_data_model_user_name,priority:1;default:''"`
  13. CreatedAt int64 `json:"created_at" gorm:"bigint;index:index_quota_data_created_at,priority:2"`
  14. Count int `json:"count" gorm:"default:0"`
  15. Quota int `json:"quota" gorm:"default:0"`
  16. }
  17. func UpdateQuotaData() {
  18. for {
  19. if common.DataExportEnabled {
  20. common.SysLog("正在更新数据看板数据...")
  21. SaveQuotaDataCache()
  22. }
  23. time.Sleep(time.Duration(common.DataExportInterval) * time.Minute)
  24. }
  25. }
  26. var CacheQuotaData = make(map[string]*QuotaData)
  27. func LogQuotaDataCache(userId int, username string, modelName string, quota int, createdAt int64) {
  28. // 只精确到小时
  29. createdAt = createdAt - (createdAt % 3600)
  30. key := fmt.Sprintf("%d-%s-%s-%d", userId, username, modelName, createdAt)
  31. quotaData, ok := CacheQuotaData[key]
  32. if ok {
  33. quotaData.Count += 1
  34. quotaData.Quota += quota
  35. } else {
  36. quotaData = &QuotaData{
  37. UserID: userId,
  38. Username: username,
  39. ModelName: modelName,
  40. CreatedAt: createdAt,
  41. Count: 1,
  42. Quota: quota,
  43. }
  44. }
  45. CacheQuotaData[key] = quotaData
  46. }
  47. func LogQuotaData(userId int, username string, modelName string, quota int, createdAt int64) {
  48. LogQuotaDataCache(userId, username, modelName, quota, createdAt)
  49. }
  50. func SaveQuotaDataCache() {
  51. // 如果缓存中有数据,就保存到数据库中
  52. // 1. 先查询数据库中是否有数据
  53. // 2. 如果有数据,就更新数据
  54. // 3. 如果没有数据,就插入数据
  55. for _, quotaData := range CacheQuotaData {
  56. quotaDataDB := &QuotaData{}
  57. DB.Table("quota_data").Where("user_id = ? and username = ? and model_name = ? and created_at = ?",
  58. quotaData.UserID, quotaData.Username, quotaData.ModelName, quotaData.CreatedAt).First(quotaDataDB)
  59. if quotaDataDB.Id > 0 {
  60. quotaDataDB.Count += quotaData.Count
  61. quotaDataDB.Quota += quotaData.Quota
  62. DB.Table("quota_data").Save(quotaDataDB)
  63. } else {
  64. DB.Table("quota_data").Create(quotaData)
  65. }
  66. }
  67. CacheQuotaData = make(map[string]*QuotaData)
  68. }
  69. func GetQuotaDataByUsername(username string) (quotaData []*QuotaData, err error) {
  70. var quotaDatas []*QuotaData
  71. // 从quota_data表中查询数据
  72. err = DB.Table("quota_data").Where("username = ?", username).Find(&quotaDatas).Error
  73. return quotaDatas, err
  74. }
  75. func GetAllQuotaDates() (quotaData []*QuotaData, err error) {
  76. var quotaDatas []*QuotaData
  77. // 从quota_data表中查询数据
  78. err = DB.Table("quota_data").Find(&quotaDatas).Error
  79. return quotaDatas, err
  80. }