"""统计报表路由(A7 + A8) GET /overview 使用概览 GET /trend 趋势数据 GET /kb-health 知识库健康度 GET /token-cost Token 消耗统计 """ from flask import Blueprint, request, jsonify from insurance.stats.service import StatsService from insurance.middleware.auth_middleware import admin_required stats_bp = Blueprint("stats", __name__) stats_service = StatsService() @stats_bp.route("/overview", methods=["GET"]) @admin_required def overview(): """使用概览数据。""" result = stats_service.get_overview() return jsonify(result) @stats_bp.route("/trend", methods=["GET"]) @admin_required def trend(): """趋势数据。""" metric = request.args.get("metric", "chat_count") start_date = request.args.get("start_date", "") end_date = request.args.get("end_date", "") granularity = request.args.get("granularity", "day") result = stats_service.get_trend(metric, start_date, end_date, granularity) return jsonify(result) @stats_bp.route("/kb-health", methods=["GET"]) @admin_required def kb_health(): """知识库健康度。""" days = request.args.get("days", 7, type=int) result = stats_service.get_kb_health(days) return jsonify(result) @stats_bp.route("/token-cost", methods=["GET"]) @admin_required def token_cost(): """Token 消耗统计(旧接口,保持兼容)。""" start_date = request.args.get("start_date", "") end_date = request.args.get("end_date", "") group_by = request.args.get("group_by", "model") result = stats_service.get_token_cost(start_date, end_date, group_by) return jsonify(result) @stats_bp.route("/token-usage", methods=["GET"]) @admin_required def token_usage(): """Token 使用统计:总量 + 按模型 + 按用户 + 日趋势。""" params = { "start_date": request.args.get("start_date", ""), "end_date": request.args.get("end_date", ""), "models": request.args.getlist("models"), } result = stats_service.get_token_usage(params) return jsonify(result) @stats_bp.route("/token-usage/models", methods=["GET"]) @admin_required def token_usage_models(): """获取可用的模型列表。""" result = stats_service.get_token_models() return jsonify(result)