usedata.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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(frequency int) {
  18. for {
  19. common.SysLog("正在更新数据看板数据...")
  20. SaveQuotaDataCache()
  21. time.Sleep(time.Duration(frequency) * time.Minute)
  22. }
  23. }
  24. var CacheQuotaData = make(map[string]*QuotaData)
  25. func LogQuotaDataCache(userId int, username string, modelName string, quota int, createdAt int64) {
  26. // 只精确到小时
  27. createdAt = createdAt - (createdAt % 3600)
  28. key := fmt.Sprintf("%d-%s-%s-%d", userId, username, modelName, createdAt)
  29. quotaData, ok := CacheQuotaData[key]
  30. if ok {
  31. quotaData.Count += 1
  32. quotaData.Quota += quota
  33. } else {
  34. quotaData = &QuotaData{
  35. UserID: userId,
  36. Username: username,
  37. ModelName: modelName,
  38. CreatedAt: createdAt,
  39. Count: 1,
  40. Quota: quota,
  41. }
  42. }
  43. CacheQuotaData[key] = quotaData
  44. }
  45. func LogQuotaData(userId int, username string, modelName string, quota int, createdAt int64) {
  46. LogQuotaDataCache(userId, username, modelName, quota, createdAt)
  47. }
  48. func SaveQuotaDataCache() {
  49. // 如果缓存中有数据,就保存到数据库中
  50. // 1. 先查询数据库中是否有数据
  51. // 2. 如果有数据,就更新数据
  52. // 3. 如果没有数据,就插入数据
  53. for _, quotaData := range CacheQuotaData {
  54. quotaDataDB := &QuotaData{}
  55. DB.Table("quota_data").Where("user_id = ? and username = ? and model_name = ? and created_at = ?",
  56. quotaData.UserID, quotaData.Username, quotaData.ModelName, quotaData.CreatedAt).First(quotaDataDB)
  57. if quotaDataDB.Id > 0 {
  58. quotaDataDB.Count += quotaData.Count
  59. quotaDataDB.Quota += quotaData.Quota
  60. DB.Table("quota_data").Save(quotaDataDB)
  61. } else {
  62. DB.Table("quota_data").Create(quotaData)
  63. }
  64. }
  65. CacheQuotaData = make(map[string]*QuotaData)
  66. }
  67. func GetQuotaDataByUsername(username string) (quotaData []*QuotaData, err error) {
  68. var quotaDatas []*QuotaData
  69. // 从quota_data表中查询数据
  70. err = DB.Table("quota_data").Where("username = ?", username).Find(&quotaDatas).Error
  71. return quotaDatas, err
  72. }
  73. func GetAllQuotaDates() (quotaData []*QuotaData, err error) {
  74. var quotaDatas []*QuotaData
  75. // 从quota_data表中查询数据
  76. err = DB.Table("quota_data").Find(&quotaDatas).Error
  77. return quotaDatas, err
  78. }