Files
ai-doc-template-system/backend/app/services/template_service.py
T
2026-07-01 20:27:15 +08:00

55 lines
1.7 KiB
Python

"""模板相关业务逻辑"""
from datetime import datetime
from pathlib import Path
from uuid import uuid4
from fastapi import UploadFile
from sqlalchemy.orm import Session
from ..models.template import Template
from .storage import upload_file
ALLOWED_EXTENSIONS = {".docx"}
MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB
TEMPLATE_BUCKET = "templates"
def validate_file(file: UploadFile):
"""校验文件格式和大小"""
if not file.filename:
raise ValueError("文件名不能为空")
ext = "." + file.filename.rsplit(".", 1)[-1].lower() if "." in file.filename else ""
if ext not in ALLOWED_EXTENSIONS:
raise ValueError(f"不支持的文件格式: {ext},仅支持 .docx")
# 读取文件头校验大小
content = file.file.read()
file.file.seek(0)
if len(content) > MAX_FILE_SIZE:
raise ValueError(f"文件大小超过限制 (50MB)")
return content
def build_template_file_path(filename: str) -> str:
"""生成模板文件存储路径。"""
suffix = Path(filename).suffix.lower()
today = datetime.now().strftime("%Y%m%d")
return f"{today}/{uuid4().hex}{suffix}"
def store_template_file(file: UploadFile) -> tuple[str, bytes]:
"""校验并保存上传的模板文件,返回存储路径和文件内容。"""
content = validate_file(file)
file_path = build_template_file_path(file.filename or "template.docx")
stored_path = upload_file(TEMPLATE_BUCKET, file_path, content)
return stored_path, content
def create_template_record(db: Session, name: str, file_path: str, type: str = "report") -> Template:
"""创建模板记录"""
tmpl = Template(name=name, type=type, original_file_path=file_path)
db.add(tmpl)
db.commit()
db.refresh(tmpl)
return tmpl