"""OCR / AI 后台任务状态,前端轮询。""" import enum from sqlalchemy import ForeignKey, String, Text from sqlalchemy import Enum as SAEnum from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.types import JSON from app.models.base import new_uuid from app.db import Base, TimestampMixin class JobStatus(str, enum.Enum): pending = "pending" ocr_running = "ocr_running" ai_running = "ai_running" done = "done" failed = "failed" class ProcessingJob(Base, TimestampMixin): __tablename__ = "processing_jobs" id: Mapped[str] = mapped_column(String(36), primary_key=True, default=new_uuid) user_id: Mapped[str] = mapped_column( ForeignKey("users.id", ondelete="CASCADE"), index=True ) image_id: Mapped[str | None] = mapped_column( ForeignKey("images.id", ondelete="SET NULL"), nullable=True ) kind: Mapped[str] = mapped_column(String(32), default="ocr_extract") status: Mapped[JobStatus] = mapped_column( SAEnum(JobStatus), default=JobStatus.pending ) # 一张图可能拆成多条笔记 result_question_ids: Mapped[list | None] = mapped_column(JSON, nullable=True) error_message: Mapped[str | None] = mapped_column(Text, nullable=True) engine_used: Mapped[str | None] = mapped_column(String(32), nullable=True)