package database import ( "database/sql" "time" "go.uber.org/zap" ) // SkillStats Skills统计信息 type SkillStats struct { SkillName string TotalCalls int SuccessCalls int FailedCalls int LastCallTime *time.Time } // SaveSkillStats 保存Skills统计信息 func (db *DB) SaveSkillStats(skillName string, stats *SkillStats) error { var lastCallTime sql.NullTime if stats.LastCallTime != nil { lastCallTime = sql.NullTime{Time: *stats.LastCallTime, Valid: true} } query := ` INSERT OR REPLACE INTO skill_stats (skill_name, total_calls, success_calls, failed_calls, last_call_time, updated_at) VALUES (?, ?, ?, ?, ?, ?) ` _, err := db.Exec(query, skillName, stats.TotalCalls, stats.SuccessCalls, stats.FailedCalls, lastCallTime, time.Now(), ) if err != nil { db.logger.Error("保存Skills统计信息失败", zap.Error(err), zap.String("skillName", skillName)) return err } return nil } // LoadSkillStats 加载所有Skills统计信息 func (db *DB) LoadSkillStats() (map[string]*SkillStats, error) { query := ` SELECT skill_name, total_calls, success_calls, failed_calls, last_call_time FROM skill_stats ` rows, err := db.Query(query) if err != nil { return nil, err } defer rows.Close() stats := make(map[string]*SkillStats) for rows.Next() { var stat SkillStats var lastCallTime sql.NullTime err := rows.Scan( &stat.SkillName, &stat.TotalCalls, &stat.SuccessCalls, &stat.FailedCalls, &lastCallTime, ) if err != nil { db.logger.Warn("加载Skills统计信息失败", zap.Error(err)) continue } if lastCallTime.Valid { stat.LastCallTime = &lastCallTime.Time } stats[stat.SkillName] = &stat } return stats, nil } // UpdateSkillStats 更新Skills统计信息(累加模式) func (db *DB) UpdateSkillStats(skillName string, totalCalls, successCalls, failedCalls int, lastCallTime *time.Time) error { var lastCallTimeSQL sql.NullTime if lastCallTime != nil { lastCallTimeSQL = sql.NullTime{Time: *lastCallTime, Valid: true} } query := ` INSERT INTO skill_stats (skill_name, total_calls, success_calls, failed_calls, last_call_time, updated_at) VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT(skill_name) DO UPDATE SET total_calls = total_calls + ?, success_calls = success_calls + ?, failed_calls = failed_calls + ?, last_call_time = COALESCE(?, last_call_time), updated_at = ? ` _, err := db.Exec(query, skillName, totalCalls, successCalls, failedCalls, lastCallTimeSQL, time.Now(), totalCalls, successCalls, failedCalls, lastCallTimeSQL, time.Now(), ) if err != nil { db.logger.Error("更新Skills统计信息失败", zap.Error(err), zap.String("skillName", skillName)) return err } return nil } // ClearSkillStats 清空所有Skills统计信息 func (db *DB) ClearSkillStats() error { query := `DELETE FROM skill_stats` _, err := db.Exec(query) if err != nil { db.logger.Error("清空Skills统计信息失败", zap.Error(err)) return err } db.logger.Info("已清空所有Skills统计信息") return nil } // ClearSkillStatsByName 清空指定skill的统计信息 func (db *DB) ClearSkillStatsByName(skillName string) error { query := `DELETE FROM skill_stats WHERE skill_name = ?` _, err := db.Exec(query, skillName) if err != nil { db.logger.Error("清空指定skill统计信息失败", zap.Error(err), zap.String("skillName", skillName)) return err } db.logger.Info("已清空指定skill统计信息", zap.String("skillName", skillName)) return nil }