diff --git a/router/router.go b/router/router.go index 6510268..733133e 100644 --- a/router/router.go +++ b/router/router.go @@ -323,6 +323,7 @@ func HandleProy(c *gin.Context) { } if resp.StatusCode == 200 { // todo + log.Println(string(bodyRes)) } resbody := io.NopCloser(bytes.NewReader(bodyRes)) // 返回 API 响应主体 @@ -382,41 +383,27 @@ func HandleReverseProxy(c *gin.Context) { } -type Usage struct { - Cost string `json:"cost"` - UserID int `json:"userId"` - TotalUnit int `json:"totalUnit"` -} - func HandleUsage(c *gin.Context) { fromStr := c.Query("from") toStr := c.Query("to") - from, err := time.Parse("2006-01-02", fromStr) - if err != nil { - c.JSON(400, gin.H{"error": "Invalid from date format"}) - return - } + // from, err := time.Parse("2006-01-02", fromStr) + // if err != nil { + // c.JSON(400, gin.H{"error": "Invalid from date format"}) + // return + // } - to, err := time.Parse("2006-01-02", toStr) - if err != nil { - c.JSON(400, gin.H{"error": "Invalid to date format"}) - return - } + // to, err := time.Parse("2006-01-02", toStr) + // if err != nil { + // c.JSON(400, gin.H{"error": "Invalid to date format"}) + // return + // } - err = store.QueryUsage(from, to) + usage, err := store.QueryUsage(fromStr, toStr) if err != nil { c.JSON(http.StatusForbidden, gin.H{"error": err.Error()}) return } - // Mock data for testing - usage := Usage{ - Cost: "0.000076", - UserID: 1, - TotalUnit: 38, - } - - c.JSON(200, []Usage{usage}) - + c.JSON(200, usage) } diff --git a/store/usage.go b/store/usage.go index 23a755e..89810c9 100644 --- a/store/usage.go +++ b/store/usage.go @@ -1,6 +1,8 @@ package store -import "time" +import ( + "time" +) type DailyUsage struct { ID int `gorm:"column:id"` @@ -33,6 +35,62 @@ func (Usage) TableName() string { return "usages" } -func QueryUsage(from, to time.Time) error { +type Summary struct { + UserId int + // SumPromptUnits int + // SumCompletionUnits int + SumTotalUnit int + SumCost float64 +} +type CalcUsage struct { + UserID int `json:"userId,omitempty"` + TotalUnit int `json:"totalUnit,omitempty"` + Cost string `json:"cost,omitempty"` +} + +func QueryUsage(from, to string) ([]CalcUsage, error) { + var results = []CalcUsage{} + err := usage.Model(&DailyUsage{}).Select(`user_id, + --SUM(prompt_units) AS prompt_units, + -- SUM(completion_units) AS completion_units, + SUM(total_unit) AS total_unit, + SUM(cost) AS cost`). + Group("user_id"). + Where("date >= ? AND date < ?", from, to). + Find(&results).Error + if err != nil { + return nil, err + } + return results, nil +} + +func SumDaily(userid string) ([]Summary, error) { + return nil, nil +} + +func SumDailyV2(uid string) error { + + // err := usage.Model(&DailyUsage{}). + // Select("user_id, '2023-04-18' as date, sku, SUM(prompt_units) as sum_prompt_units, SUM(completion_units) as sum_completion_units, SUM(total_unit) as sum_total_unit, SUM(cost) as sum_cost"). + // Where("date >= ?", "2023-04-18"). + // Where("user_id = ?", 2). + // Create(&DailyUsage{}).Error + nowstr := time.Now().Format("2006-01-02") + err := usage.Exec(`INSERT INTO daily_usages + (user_id, date, sku, prompt_units, completion_units, total_unit, cost) + SELECT + user_id, + ?, + sku, + SUM(prompt_units) AS sum_prompt_units, + SUM(completion_units) AS sum_completion_units, + SUM(total_unit) AS sum_total_unit, + SUM(cost) AS sum_cost + FROM usages + WHERE date >= ? + AND user_id = ?`, nowstr, nowstr, uid).Error + if err != nil { + return err + } return nil }