1
0

usage_statistics.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package controller
  2. import (
  3. "net/http"
  4. "one-api/model"
  5. "strconv"
  6. "time"
  7. "github.com/gin-gonic/gin"
  8. )
  9. // GetUsageStatistics 获取用量统计数据
  10. func GetUsageStatistics(c *gin.Context) {
  11. // 获取查询参数
  12. page, _ := strconv.Atoi(c.DefaultQuery("p", "1"))
  13. pageSize, _ := strconv.Atoi(c.DefaultQuery("size", "20"))
  14. startDate := c.Query("start_date")
  15. endDate := c.Query("end_date")
  16. tokenId, _ := strconv.Atoi(c.Query("token_id"))
  17. modelName := c.Query("model_name")
  18. // 设置默认查询最近7天
  19. if startDate == "" && endDate == "" {
  20. now := time.Now()
  21. startDate = now.AddDate(0, 0, -7).Format("2006-01-02")
  22. endDate = now.Format("2006-01-02")
  23. }
  24. // 验证参数
  25. if page < 1 {
  26. page = 1
  27. }
  28. if pageSize < 1 || pageSize > 100 {
  29. pageSize = 20
  30. }
  31. // 查询数据
  32. statistics, total, err := model.GetUsageStatistics(startDate, endDate, tokenId, modelName, page, pageSize)
  33. if err != nil {
  34. c.JSON(http.StatusOK, gin.H{
  35. "success": false,
  36. "message": err.Error(),
  37. })
  38. return
  39. }
  40. // 获取摘要信息
  41. summary, err := model.GetUsageStatisticsSummary(startDate, endDate, tokenId, modelName)
  42. if err != nil {
  43. c.JSON(http.StatusOK, gin.H{
  44. "success": false,
  45. "message": err.Error(),
  46. })
  47. return
  48. }
  49. c.JSON(http.StatusOK, gin.H{
  50. "success": true,
  51. "message": "",
  52. "data": gin.H{
  53. "items": statistics,
  54. "total": total,
  55. "page": page,
  56. "page_size": pageSize,
  57. "summary": summary,
  58. },
  59. })
  60. }
  61. // GetUsageStatisticsSummary 获取用量统计摘要
  62. func GetUsageStatisticsSummary(c *gin.Context) {
  63. // 获取查询参数
  64. startDate := c.Query("start_date")
  65. endDate := c.Query("end_date")
  66. tokenId, _ := strconv.Atoi(c.Query("token_id"))
  67. modelName := c.Query("model_name")
  68. // 设置默认查询最近7天
  69. if startDate == "" && endDate == "" {
  70. now := time.Now()
  71. startDate = now.AddDate(0, 0, -7).Format("2006-01-02")
  72. endDate = now.Format("2006-01-02")
  73. }
  74. // 获取摘要信息
  75. summary, err := model.GetUsageStatisticsSummary(startDate, endDate, tokenId, modelName)
  76. if err != nil {
  77. c.JSON(http.StatusOK, gin.H{
  78. "success": false,
  79. "message": err.Error(),
  80. })
  81. return
  82. }
  83. c.JSON(http.StatusOK, gin.H{
  84. "success": true,
  85. "message": "",
  86. "data": summary,
  87. })
  88. }
  89. // GetUserUsageStatistics 获取用户自己的用量统计数据
  90. func GetUserUsageStatistics(c *gin.Context) {
  91. userId := c.GetInt("id")
  92. if userId == 0 {
  93. c.JSON(http.StatusOK, gin.H{
  94. "success": false,
  95. "message": "用户ID不能为空",
  96. })
  97. return
  98. }
  99. // 获取查询参数
  100. page, _ := strconv.Atoi(c.DefaultQuery("p", "1"))
  101. pageSize, _ := strconv.Atoi(c.DefaultQuery("size", "20"))
  102. startDate := c.Query("start_date")
  103. endDate := c.Query("end_date")
  104. tokenId, _ := strconv.Atoi(c.Query("token_id"))
  105. modelName := c.Query("model_name")
  106. // 设置默认查询最近7天
  107. if startDate == "" && endDate == "" {
  108. now := time.Now()
  109. startDate = now.AddDate(0, 0, -7).Format("2006-01-02")
  110. endDate = now.Format("2006-01-02")
  111. }
  112. // 验证参数
  113. if page < 1 {
  114. page = 1
  115. }
  116. if pageSize < 1 || pageSize > 100 {
  117. pageSize = 20
  118. }
  119. // 如果指定了tokenId,需要验证token是否属于当前用户
  120. if tokenId > 0 {
  121. token, err := model.GetTokenByIds(tokenId, userId)
  122. if err != nil {
  123. c.JSON(http.StatusOK, gin.H{
  124. "success": false,
  125. "message": "Token不存在或无权访问",
  126. })
  127. return
  128. }
  129. if token.UserId != userId {
  130. c.JSON(http.StatusOK, gin.H{
  131. "success": false,
  132. "message": "无权访问该Token的统计数据",
  133. })
  134. return
  135. }
  136. }
  137. // 查询数据 - 这里需要修改model函数来支持用户过滤
  138. statistics, total, err := model.GetUserUsageStatistics(userId, startDate, endDate, tokenId, modelName, page, pageSize)
  139. if err != nil {
  140. c.JSON(http.StatusOK, gin.H{
  141. "success": false,
  142. "message": err.Error(),
  143. })
  144. return
  145. }
  146. // 获取摘要信息
  147. summary, err := model.GetUserUsageStatisticsSummary(userId, startDate, endDate, tokenId, modelName)
  148. if err != nil {
  149. c.JSON(http.StatusOK, gin.H{
  150. "success": false,
  151. "message": err.Error(),
  152. })
  153. return
  154. }
  155. c.JSON(http.StatusOK, gin.H{
  156. "success": true,
  157. "message": "",
  158. "data": gin.H{
  159. "items": statistics,
  160. "total": total,
  161. "page": page,
  162. "page_size": pageSize,
  163. "summary": summary,
  164. },
  165. })
  166. }