diff --git a/sage_datamart/dashboards.py b/sage_datamart/dashboards.py index 4309f81..7dcf6a7 100644 --- a/sage_datamart/dashboards.py +++ b/sage_datamart/dashboards.py @@ -246,20 +246,26 @@ async def get_top_models(env, sor, limit=5): async def get_top_providers(env, sor, limit=5): """Top N 供应商(按金额,全量)""" - sql = """SELECT providerid, COUNT(*) as cnt, COALESCE(SUM(amount_cny), 0) as total_amount - FROM dm_model_call_fact WHERE providerid IS NOT NULL - GROUP BY providerid ORDER BY total_amount DESC LIMIT ${limit}$""" + sql = """SELECT f.providerid, COUNT(*) as cnt, COALESCE(SUM(f.amount_cny), 0) as total_amount, + COALESCE(p.name, f.providerid) as provider_name + FROM dm_model_call_fact f + LEFT JOIN llmprovider p ON p.id = f.providerid + WHERE f.providerid IS NOT NULL + GROUP BY f.providerid ORDER BY total_amount DESC LIMIT ${limit}$""" recs = await sor.sqlExe(sql, {'limit': limit}) - return [{'provider_name': r.providerid or 'Unknown', 'cnt': int(r.cnt), - 'total_amount': round(float(r.total_amount), 2)} for r in recs] + return [{'provider_name': r.provider_name or r.providerid or 'Unknown', + 'cnt': int(r.cnt), 'total_amount': round(float(r.total_amount), 2)} for r in recs] async def get_top_users(env, sor, limit=5): """全量 Top N 用户(按金额)""" - sql = """SELECT userid, COUNT(*) as cnt, COALESCE(SUM(amount_cny), 0) as total_amount - FROM dm_model_call_fact GROUP BY userid ORDER BY total_amount DESC LIMIT ${limit}$""" + sql = """SELECT f.userid, COUNT(*) as cnt, COALESCE(SUM(f.amount_cny), 0) as total_amount, + COALESCE(u.username, f.userid) as user_name + FROM dm_model_call_fact f + LEFT JOIN users u ON u.id = f.userid + GROUP BY f.userid ORDER BY total_amount DESC LIMIT ${limit}$""" recs = await sor.sqlExe(sql, {'limit': limit}) - return [{'user_name': r.userid, 'cnt': int(r.cnt), + return [{'user_name': r.user_name or r.userid, 'cnt': int(r.cnt), 'total_amount': round(float(r.total_amount), 2)} for r in recs]