API统计页面

This commit is contained in:
BBIT-Kai
2026-07-27 10:16:24 +08:00
parent 89f6944e65
commit 38efd8ef1a
21 changed files with 3554 additions and 123 deletions
+4
View File
@@ -25,3 +25,7 @@ class SendCubeReportMessageRequest(BaseModel):
class RenameCubeReportConversationRequest(BaseModel):
name: str = Field(min_length=1, max_length=200)
class ExportCubeReportRequest(BaseModel):
columnKeys: list[str] = Field(min_length=1, max_length=16384)
+7
View File
@@ -25,6 +25,7 @@ from db.postgres.cube_report import (
)
from models.BaseResponse import BaseResponse
from models.CubeReportRequest import (
ExportCubeReportRequest,
RenameCubeReportConversationRequest,
SendCubeReportMessageRequest,
)
@@ -352,11 +353,13 @@ async def _export_cube_result(
tenant_id: str,
limit_source: str,
title: str,
column_keys: list[str] | None = None,
) -> BaseResponse:
export_data = await query_cube_export(
base_load=query,
tenant_id=tenant_id,
limit_source=limit_source,
column_keys=column_keys,
)
filename = sanitize_filename(title or "Cube查询结果")
contents, sheet_count = await asyncio.to_thread(
@@ -378,6 +381,7 @@ async def _export_cube_result(
@cubeReportRouter.post("/reports/{report_id}/export")
async def export_report_data(
report_id: str,
request: ExportCubeReportRequest | None = None,
user_id: UUID = Depends(get_user_id_from_token),
):
report, tenant_id = await _resolve_saved_report(report_id, user_id)
@@ -386,6 +390,7 @@ async def export_report_data(
tenant_id=tenant_id,
limit_source=report["limitSource"],
title=report["title"],
column_keys=request.columnKeys if request else None,
)
@@ -440,6 +445,7 @@ async def delete_report(
@cubeReportRouter.post("/sessions/{conversation_id}/export")
async def export_session_data(
conversation_id: str,
request: ExportCubeReportRequest | None = None,
user_id: UUID = Depends(get_user_id_from_token),
):
session = await get_dify_conversation(conversation_id, str(user_id))
@@ -453,6 +459,7 @@ async def export_session_data(
tenant_id=tenant_id,
limit_source=state["limitSource"],
title=str(session.get("title") or state.get("title") or "Cube查询结果"),
column_keys=request.columnKeys if request else None,
)
+14
View File
@@ -903,6 +903,7 @@ async def query_cube_export(
base_load: dict[str, Any],
tenant_id: str | None,
limit_source: str | None,
column_keys: list[str] | None = None,
) -> dict[str, Any]:
query = deepcopy(base_load)
if not tenant_id:
@@ -925,6 +926,19 @@ async def query_cube_export(
key: _column_title(key, sql_info["aliases"], member_titles)
for key in keys
}
if column_keys:
selected_keys = list(dict.fromkeys(str(key).strip() for key in column_keys))
invalid_keys = [key for key in selected_keys if key not in headers]
if invalid_keys:
raise HTTPException(
status_code=422,
detail=f"导出列不存在或已失效:{', '.join(invalid_keys[:5])}",
)
headers = {key: headers[key] for key in selected_keys}
rows = [
{key: row.get(key) for key in selected_keys}
for row in rows
]
return {
"headers": headers,
"rows": rows,