Files
leaudit-platform-backend/fastapi_modules/fastapi_leaudit/models/leauditDocument.py
T
2026-04-28 16:53:16 +08:00

46 lines
2.0 KiB
Python

"""LeAudit 域文档镜像模型 —— leaudit_documents 表。
通过 biz_document_id 关联业务 documents 表,不复制业务字段。
"""
from __future__ import annotations
from sqlalchemy import BigInteger, String, ForeignKey
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import Mapped, mapped_column
from fastapi_common.fastapi_common_web.models import BaseModel
class LeauditDocument(BaseModel):
"""LeAudit 文档镜像表。"""
__tablename__ = "leaudit_documents"
Id: Mapped[int] = mapped_column("id", BigInteger, primary_key=True, autoincrement=True)
bizDocumentId: Mapped[int] = mapped_column("biz_document_id", BigInteger, unique=True, comment="关联业务 documents.id")
typeId: Mapped[int | None] = mapped_column("type_id", BigInteger, comment="文档类型ID")
processingStatus: Mapped[str | None] = mapped_column("processing_status", String(64), default="waiting", comment="waiting/processing/completed/failed")
currentRunId: Mapped[int | None] = mapped_column("current_run_id", BigInteger, comment="最新有效 run id")
region: Mapped[str] = mapped_column(String(32), default="default", comment="所属地区: mz/yf/jy/cz/default")
@classmethod
async def get_by_biz_id(cls, session: AsyncSession, bizDocumentId: int) -> "LeauditDocument | None":
"""按业务文档 ID 查询。"""
from sqlalchemy import select
return await session.scalar(select(cls).where(cls.bizDocumentId == bizDocumentId))
@classmethod
async def upsert_by_biz_id(cls, session: AsyncSession, bizDocumentId: int, **fields) -> "LeauditDocument":
"""按业务文档 ID 创建或更新。"""
from sqlalchemy import select
doc = await session.scalar(select(cls).where(cls.bizDocumentId == bizDocumentId))
if doc is None:
doc = cls(bizDocumentId=bizDocumentId, **fields)
session.add(doc)
else:
for k, v in fields.items():
setattr(doc, k, v)
await session.flush()
return doc