xuyonghao
2025-01-14 9de1ba1b182cc82582da5825660ad5671bda0df2
app/api/excel.py
@@ -1,9 +1,15 @@
from fastapi import APIRouter, File, UploadFile, Form, BackgroundTasks, Depends
import random
import string
from fastapi import APIRouter, File, UploadFile, Form, BackgroundTasks, Depends, Request
from fastapi.responses import JSONResponse, FileResponse
from sqlalchemy.orm import Session
from starlette.websockets import WebSocket
from app.api import get_current_user, get_current_user_websocket
from app.models import UserModel
from app.models import UserModel, AgentType
from app.models.base_model import get_db
from app.service.session import SessionService
from app.utils.excelmerge.conformity import run_conformity
import shutil
import os
@@ -41,6 +47,23 @@
    return os.path.join(path, userid)
def generate_db_id(prefix: str = "me") -> str:
    random_part = ''.join(random.choices(string.ascii_letters + string.digits, k=13))
    return prefix + random_part
def db_create_session(db: Session, user_id: str):
    db_id = generate_db_id()
    session = SessionService(db).create_session(
        db_id,
        "合并Excel",
        "basic_excel_merge",
        AgentType.BASIC,
        int(user_id)
    )
    return session
@router.post('/excel/upload')
async def upload_file(files: list[UploadFile] = File(...), current_user: UserModel = Depends(get_current_user)):
    user_id = str(current_user.id)
@@ -71,7 +94,9 @@
# ws://localhost:9201/api/document/ws/excel
@router.websocket("/ws/excel")
async def ws_excel(websocket: WebSocket, current_user: UserModel = Depends(get_current_user_websocket)):
async def ws_excel(websocket: WebSocket,
                   current_user: UserModel = Depends(get_current_user_websocket),
                   db: Session = Depends(get_db)):
    await websocket.accept()
    user_id = str(current_user.id)
@@ -97,32 +122,54 @@
                        "message": "文档合并成功!",
                        "type": "close",
                    })
                    # 创建会话记录
                    session = db_create_session(db, user_id)
                    # 更新会话记录
                    if session:
                        session_id = session.id
                        new_message = {
                            "role": "assistant",
                            "content": {
                                "message": "\u5408\u5e76\u6210\u529f",
                                "type": "message",
                                "file_url": f"/api/document/download/{merge_file}.xlsx",
                                "file_name": f"{merge_file}.xlsx"
                            }
                        }
                        session_service = SessionService(db)
                        session_service.update_session(session_id, message=new_message)
                else:
                    await websocket.send_json({"error": "合并失败", "type": "stream", "files": []})
                    await websocket.close()
            else:
                print(f"Received data: {data}")
                await websocket.send_json({"error": "未知指令", "data": str(data)})
                await websocket.close()
        except Exception as e:
            await websocket.send_json({"error": str(e)})
            await websocket.close()
@router.get("/download/{file_full_name}")
async def download_file(background_tasks: BackgroundTasks, file_full_name: str):
async def download_file(file_full_name: str):
    file_name = os.path.basename(file_full_name)
    user_excel = EXCEL_FILES_PATH
    file_path = os.path.join(user_excel, file_full_name)
    if not os.path.exists(file_path):
        return JSONResponse(content={"error": "文件不存在"}, status_code=404)
    def delete_file():
        try:
            os.unlink(file_path)
        except OSError as e:
            print(f"Deleting file error")
    return FileResponse(
        path=file_path,
        filename="Excel.xlsx",
        media_type='application/octet-stream',
    )
    # def delete_file():
    #     try:
    #         os.unlink(file_path)
    #     except OSError as e:
    #         print(f"Deleting file error")
    # 待下载完成后删除生成的文件
    background_tasks.add_task(delete_file)
    return FileResponse(path=file_path, filename=file_name,
                        media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    # background_tasks.add_task(delete_file)
    # return FileResponse(path=file_path, filename=file_name,
    #                    media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")