feat: 支持合同模板上传与对比记录持久化

This commit is contained in:
wren
2026-05-19 20:47:54 +08:00
parent ebcfe4281a
commit d58755a063
5 changed files with 398 additions and 13 deletions
@@ -1,5 +1,6 @@
"""文档控制器。"""
import json
from typing import Any
from fastapi import Depends, File, Form, Query, UploadFile
@@ -8,7 +9,8 @@ from sqlalchemy import text
from fastapi_common.fastapi_common_sqlalchemy.database import GetAsyncSession
from fastapi_common.fastapi_common_web.controller import BaseController
from fastapi_common.fastapi_common_web.domain.responses import Result
from fastapi_common.fastapi_common_web.domain.responses import Result, StatusCodeEnum
from fastapi_common.fastapi_common_web.exception.LeauditException import LeauditException
from fastapi_common.fastapi_common_security.security import verify_access_token
from fastapi_modules.fastapi_leaudit.domian.vo.documentVo import (
@@ -21,6 +23,7 @@ from fastapi_modules.fastapi_leaudit.domian.vo.documentVo import (
DocumentTypeRootCreateDTO,
DocumentTypeRootItemVO,
DocumentTypeRootUpdateDTO,
ContractTemplateUploadVO,
DocumentTypeUpdateDTO,
DocumentUploadVO,
)
@@ -94,6 +97,33 @@ class DocumentController(BaseController):
)
return Result.success(data=Data)
@self.router.post("/upload/upload_contract_template", response_model=Result[ContractTemplateUploadVO])
async def UploadContractTemplate(
file: UploadFile = File(..., description="合同模板文件"),
upload_info: str = Form(..., description="模板上传信息 JSON,包含 document_id/comparison_id"),
payload: dict[str, Any] = Depends(verify_access_token),
):
"""兼容旧前端的合同模板上传接口。"""
try:
uploadInfo = json.loads(upload_info or "{}")
except json.JSONDecodeError as error:
raise LeauditException(StatusCodeEnum.HTTP_400_BAD_REQUEST, "upload_info 不是合法 JSON") from error
documentId = int(uploadInfo.get("document_id") or 0)
comparisonIdRaw = uploadInfo.get("comparison_id")
comparisonId = int(comparisonIdRaw) if comparisonIdRaw not in (None, "") else None
content = await file.read()
data = await self.DocumentService.UploadContractTemplate(
CurrentUserId=int(payload["user_id"]),
DocumentId=documentId,
FileName=file.filename or "template.bin",
FileContent=content,
ContentType=file.content_type,
ComparisonId=comparisonId,
)
return Result.success(data=data, message="合同模板上传成功")
@self.router.get("/documents/list", response_model=Result[DocumentListPageVO])
async def ListDocuments(
page: int = 1,