feat: export

This commit is contained in:
ulleo
2025-08-05 10:56:59 +08:00
parent 8b20110ebc
commit 86abe25e27
5 changed files with 30 additions and 22 deletions
+9 -5
View File
@@ -1,5 +1,8 @@
import datetime
import hashlib
import io
import traceback
import uuid
import numpy as np
import pandas as pd
@@ -12,6 +15,7 @@ from apps.chat.models.chat_model import CreateChat, ChatRecord, RenameChat, Chat
from apps.chat.task.llm import LLMService
from common.core.config import settings
from common.core.deps import CurrentAssistant, SessionDep, CurrentUser
from starlette.responses import FileResponse
router = APIRouter(tags=["Data Q&A"], prefix="/chat")
@@ -202,12 +206,12 @@ async def export_excel(excel_data: ExcelData):
_fields_list.append(field.name)
df = pd.DataFrame(np.array(data), columns=_fields_list)
file_name = f"{excel_data.name}-{datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.xlsx"
file_name = f"{excel_data.name}-{datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}_{hashlib.sha256(uuid.uuid4().bytes).hexdigest()[:10]}.xlsx"
file_path = f'{(settings.EXCEL_PATH if settings.EXCEL_PATH[-1] == "/" else (settings.EXCEL_PATH + "/"))}{file_name}'
file_download_path = f'{(settings.SERVER_EXCEL_HOST if settings.SERVER_EXCEL_HOST[-1] == "/" else (settings.SERVER_EXCEL_HOST + "/"))}{file_name}'
buffer = io.BytesIO()
df.to_excel(buffer, index=False)
buffer.seek(0)
df.to_excel(file_path, index=False)
return file_download_path
return StreamingResponse(io.BytesIO(buffer.getvalue()))
+2 -1
View File
@@ -8,6 +8,7 @@ import pandas as pd
from fastapi import APIRouter, File, UploadFile, HTTPException
from apps.db.engine import create_table, get_data_engine, insert_data
from common.core.config import settings
from common.core.deps import SessionDep, CurrentUser, Trans
from common.utils.utils import SQLBotLogUtil
from ..crud.datasource import get_datasource_list, check_status, create_ds, update_ds, delete_ds, getTables, getFields, \
@@ -17,7 +18,7 @@ from ..crud.table import get_tables_by_ds_id
from ..models.datasource import CoreDatasource, CreateDatasource, TableObj, CoreTable, CoreField
router = APIRouter(tags=["datasource"], prefix="/datasource")
path = "/opt/sqlbot/data/excel"
path = settings.EXCEL_PATH
@router.get("/ws/{oid}", include_in_schema=False)
+1 -2
View File
@@ -79,9 +79,8 @@ class Settings(BaseSettings):
)
MCP_IMAGE_PATH: str = '/opt/sqlbot/images'
EXCEL_PATH: str
EXCEL_PATH: str = '/opt/sqlbot/data/excel'
MCP_IMAGE_HOST: str = 'http://localhost:3000'
SERVER_IMAGE_HOST: str
SERVER_EXCEL_HOST: str
settings = Settings() # type: ignore
+11 -12
View File
@@ -1,21 +1,22 @@
from fastapi.concurrency import asynccontextmanager
import sqlbot_xpack
from alembic.config import Config
from fastapi import FastAPI
from fastapi.concurrency import asynccontextmanager
from fastapi.routing import APIRoute
from starlette.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi_mcp import FastApiMCP
from starlette.exceptions import HTTPException as StarletteHTTPException
from starlette.middleware.cors import CORSMiddleware
from alembic import command
from apps.api import api_router
from apps.system.crud.assistant import init_dynamic_cors
from apps.system.middleware.auth import TokenMiddleware
from common.core.config import settings
from common.core.response_middleware import ResponseMiddleware, exception_handler
from alembic.config import Config
from alembic import command
from fastapi_mcp import FastApiMCP
from fastapi.staticfiles import StaticFiles
import sqlbot_xpack
from common.utils.utils import SQLBotLogUtil
from common.core.sqlbot_cache import init_sqlbot_cache
from apps.api import api_router
from common.utils.utils import SQLBotLogUtil
def run_migrations():
alembic_cfg = Config("alembic.ini")
@@ -32,6 +33,7 @@ async def lifespan(app: FastAPI):
yield
SQLBotLogUtil.info("SQLBot 应用关闭")
def custom_generate_unique_id(route: APIRoute) -> str:
tag = route.tags[0] if route.tags and len(route.tags) > 0 else ""
return f"{tag}-{route.name}"
@@ -44,9 +46,6 @@ app = FastAPI(
lifespan=lifespan
)
app.mount("/excel", StaticFiles(directory=settings.EXCEL_PATH), name="excel")
mcp_app = FastAPI()
# mcp server, images path
mcp_app.mount("/images", StaticFiles(directory=settings.MCP_IMAGE_PATH), name="images")
@@ -232,8 +232,13 @@ function exportToExcel() {
chatApi
.export2Excel({ ...chartRef.value?.getExcelData(), name: chartObject.value.title })
.then((res) => {
console.log('download_path: ' + res)
//todo download
const blob = new Blob([res.data])
const link = document.createElement('a')
link.href = URL.createObjectURL(blob)
link.download = `${chartObject.value.title ?? 'Excel'}.xlsx`
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
})
exportRef.value?.hide()
}