API统计页面
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user