GetUserMonthlyUsageStatistics 获取特定用户的月度用量统计数据
(userId int, startDate, endDate string, tokenId int, modelName string, page, pageSize int)
| 441 | |
| 442 | // GetUserMonthlyUsageStatistics 获取特定用户的月度用量统计数据 |
| 443 | func GetUserMonthlyUsageStatistics(userId int, startDate, endDate string, tokenId int, modelName string, page, pageSize int) ([]*UsageStatistics, int64, error) { |
| 444 | var statistics []*UsageStatistics |
| 445 | var total int64 |
| 446 | |
| 447 | // 使用原生SQL查询实现按月分组统计 |
| 448 | db := DB.Table("usage_statistics"). |
| 449 | Joins("JOIN tokens ON usage_statistics.token_id = tokens.id"). |
| 450 | Where("tokens.user_id = ?", userId) |
| 451 | |
| 452 | // 构建查询条件 |
| 453 | conditions := " AND tokens.user_id = ?" |
| 454 | params := []interface{}{userId} |
| 455 | |
| 456 | // 添加日期范围条件(按月查询) |
| 457 | if startDate != "" { |
| 458 | conditions += " AND usage_statistics.date >= ?" |
| 459 | params = append(params, startDate+"-01") |
| 460 | } |
| 461 | if endDate != "" { |
| 462 | // 获取 endDate 所在月份的最后一天 |
| 463 | if len(endDate) >= 7 { |
| 464 | year := endDate[0:4] |
| 465 | month := endDate[5:7] |
| 466 | conditions += " AND usage_statistics.date <= ?" |
| 467 | params = append(params, year+"-"+month+"-31") |
| 468 | } |
| 469 | } |
| 470 | |
| 471 | if tokenId > 0 { |
| 472 | conditions += " AND usage_statistics.token_id = ?" |
| 473 | params = append(params, tokenId) |
| 474 | } |
| 475 | if modelName != "" { |
| 476 | conditions += " AND usage_statistics.model_name LIKE ?" |
| 477 | params = append(params, "%"+modelName+"%") |
| 478 | } |
| 479 | |
| 480 | // 构建完整的SQL查询 |
| 481 | sql := ` |
| 482 | SELECT |
| 483 | MAX(usage_statistics.id) as id, |
| 484 | SUBSTR(usage_statistics.date, 1, 7) as date, |
| 485 | usage_statistics.token_id, |
| 486 | usage_statistics.token_name, |
| 487 | usage_statistics.model_name, |
| 488 | SUM(usage_statistics.total_requests) as total_requests, |
| 489 | SUM(usage_statistics.successful_requests) as successful_requests, |
| 490 | SUM(usage_statistics.failed_requests) as failed_requests, |
| 491 | SUM(usage_statistics.total_tokens) as total_tokens, |
| 492 | SUM(usage_statistics.prompt_tokens) as prompt_tokens, |
| 493 | SUM(usage_statistics.completion_tokens) as completion_tokens, |
| 494 | SUM(usage_statistics.total_quota) as total_quota, |
| 495 | MAX(usage_statistics.created_time) as created_time, |
| 496 | MAX(usage_statistics.updated_time) as updated_time |
| 497 | FROM usage_statistics |
| 498 | JOIN tokens ON usage_statistics.token_id = tokens.id |
| 499 | WHERE 1=1` + conditions + ` |
| 500 | GROUP BY SUBSTR(usage_statistics.date, 1, 7), usage_statistics.token_id, usage_statistics.token_name, usage_statistics.model_name |
no test coverage detected