113 lines
2.6 KiB
Go
113 lines
2.6 KiB
Go
package api
|
||
|
||
import (
|
||
"encoding/json"
|
||
"net/http"
|
||
"strconv"
|
||
"time"
|
||
|
||
"codex-pool/internal/database"
|
||
)
|
||
|
||
// MaxRPMData 最高 RPM 数据
|
||
type MaxRPMData struct {
|
||
MaxRPM int `json:"max_rpm"`
|
||
Date string `json:"date"`
|
||
UpdatedAt string `json:"updated_at,omitempty"`
|
||
}
|
||
|
||
// GetMaxRPMToday 获取今日最高 RPM
|
||
func GetMaxRPMToday() MaxRPMData {
|
||
if database.Instance == nil {
|
||
return MaxRPMData{MaxRPM: 0, Date: time.Now().Format("2006-01-02")}
|
||
}
|
||
|
||
today := time.Now().Format("2006-01-02")
|
||
|
||
// 获取存储的日期
|
||
storedDate, _ := database.Instance.GetConfig("max_rpm_date")
|
||
|
||
// 如果日期不是今天,重置
|
||
if storedDate != today {
|
||
return MaxRPMData{MaxRPM: 0, Date: today}
|
||
}
|
||
|
||
// 获取今日最高 RPM
|
||
maxRPMStr, _ := database.Instance.GetConfig("max_rpm_today")
|
||
maxRPM, _ := strconv.Atoi(maxRPMStr)
|
||
|
||
updatedAt, _ := database.Instance.GetConfig("max_rpm_updated_at")
|
||
|
||
return MaxRPMData{
|
||
MaxRPM: maxRPM,
|
||
Date: today,
|
||
UpdatedAt: updatedAt,
|
||
}
|
||
}
|
||
|
||
// UpdateMaxRPM 更新今日最高 RPM(如果当前值更高)
|
||
func UpdateMaxRPM(currentRPM int) bool {
|
||
if database.Instance == nil || currentRPM <= 0 {
|
||
return false
|
||
}
|
||
|
||
today := time.Now().Format("2006-01-02")
|
||
|
||
// 获取存储的日期
|
||
storedDate, _ := database.Instance.GetConfig("max_rpm_date")
|
||
|
||
var currentMax int
|
||
if storedDate == today {
|
||
// 同一天,获取当前最高值
|
||
maxRPMStr, _ := database.Instance.GetConfig("max_rpm_today")
|
||
currentMax, _ = strconv.Atoi(maxRPMStr)
|
||
} else {
|
||
// 新的一天,重置
|
||
currentMax = 0
|
||
database.Instance.SetConfig("max_rpm_date", today)
|
||
}
|
||
|
||
// 如果当前 RPM 更高,更新记录
|
||
if currentRPM > currentMax {
|
||
database.Instance.SetConfig("max_rpm_today", strconv.Itoa(currentRPM))
|
||
database.Instance.SetConfig("max_rpm_updated_at", time.Now().Format("15:04:05"))
|
||
return true
|
||
}
|
||
|
||
return false
|
||
}
|
||
|
||
// HandleGetMaxRPM GET /api/stats/max-rpm - 获取今日最高 RPM
|
||
func HandleGetMaxRPM(w http.ResponseWriter, r *http.Request) {
|
||
if r.Method != http.MethodGet {
|
||
Error(w, http.StatusMethodNotAllowed, "仅支持 GET")
|
||
return
|
||
}
|
||
|
||
data := GetMaxRPMToday()
|
||
Success(w, data)
|
||
}
|
||
|
||
// ExtractRPMFromDashboard 从仪表盘响应中提取 RPM 值
|
||
func ExtractRPMFromDashboard(body []byte) int {
|
||
var data map[string]interface{}
|
||
if err := json.Unmarshal(body, &data); err != nil {
|
||
return 0
|
||
}
|
||
|
||
// 尝试从不同的响应结构中提取 RPM
|
||
// 格式1: { "rpm": 123 }
|
||
if rpm, ok := data["rpm"].(float64); ok {
|
||
return int(rpm)
|
||
}
|
||
|
||
// 格式2: { "data": { "rpm": 123 } }
|
||
if dataObj, ok := data["data"].(map[string]interface{}); ok {
|
||
if rpm, ok := dataObj["rpm"].(float64); ok {
|
||
return int(rpm)
|
||
}
|
||
}
|
||
|
||
return 0
|
||
}
|