feat: wire native leaudit upload flow
This commit is contained in:
@@ -15,46 +15,46 @@ class LeauditAuditRun(BaseModel):
|
||||
|
||||
__tablename__ = "leaudit_audit_runs"
|
||||
|
||||
Id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
|
||||
documentId: Mapped[int] = mapped_column(BigInteger, comment="关联 leaudit_documents.id")
|
||||
documentFileId: Mapped[int | None] = mapped_column(BigInteger, comment="输入文件ID")
|
||||
runNo: Mapped[int] = mapped_column(Integer, comment="同一文档第几次执行")
|
||||
triggerSource: Mapped[str] = mapped_column(String(64), comment="upload/manual/retry/migration/batch")
|
||||
triggerUserId: Mapped[int | None] = mapped_column(BigInteger, comment="触发人")
|
||||
taskId: Mapped[str | None] = mapped_column(String(128), comment="Celery 任务 ID")
|
||||
Id: Mapped[int] = mapped_column("id", BigInteger, primary_key=True, autoincrement=True)
|
||||
documentId: Mapped[int] = mapped_column("document_id", BigInteger, comment="关联 leaudit_documents.id")
|
||||
documentFileId: Mapped[int | None] = mapped_column("document_file_id", BigInteger, comment="输入文件ID")
|
||||
runNo: Mapped[int] = mapped_column("run_no", Integer, comment="同一文档第几次执行")
|
||||
triggerSource: Mapped[str] = mapped_column("trigger_source", String(64), comment="upload/manual/retry/migration/batch")
|
||||
triggerUserId: Mapped[int | None] = mapped_column("trigger_user_id", BigInteger, comment="触发人")
|
||||
taskId: Mapped[str | None] = mapped_column("task_id", String(128), comment="Celery 任务 ID")
|
||||
|
||||
# 状态
|
||||
status: Mapped[str] = mapped_column(String(64), default="pending", comment="pending/processing/completed/failed/cancelled")
|
||||
phase: Mapped[str | None] = mapped_column(String(32), comment="draft/executed")
|
||||
status: Mapped[str] = mapped_column("status", String(64), default="pending", comment="pending/processing/completed/failed/cancelled")
|
||||
phase: Mapped[str | None] = mapped_column("phase", String(32), comment="draft/executed")
|
||||
|
||||
# 规则溯源
|
||||
ruleSetId: Mapped[int] = mapped_column(BigInteger, comment="关联 leaudit_rule_sets.id")
|
||||
ruleVersionId: Mapped[int] = mapped_column(BigInteger, comment="关联 leaudit_rule_versions.id")
|
||||
ruleTypeId: Mapped[str | None] = mapped_column(String(256), comment="LeAudit metadata.type_id")
|
||||
ruleSourceOssUrl: Mapped[str | None] = mapped_column(String(2048), comment="规则 YAML OSS 地址")
|
||||
ruleSourceSha256: Mapped[str | None] = mapped_column(String(64), comment="规则文件 SHA256")
|
||||
ruleLocalCachePath: Mapped[str | None] = mapped_column(String(1024), comment="本地缓存路径")
|
||||
ruleSetId: Mapped[int] = mapped_column("rule_set_id", BigInteger, comment="关联 leaudit_rule_sets.id")
|
||||
ruleVersionId: Mapped[int] = mapped_column("rule_version_id", BigInteger, comment="关联 leaudit_rule_versions.id")
|
||||
ruleTypeId: Mapped[str | None] = mapped_column("rule_type_id", String(256), comment="LeAudit metadata.type_id")
|
||||
ruleSourceOssUrl: Mapped[str | None] = mapped_column("rule_source_oss_url", String(2048), comment="规则 YAML OSS 地址")
|
||||
ruleSourceSha256: Mapped[str | None] = mapped_column("rule_source_sha256", String(64), comment="规则文件 SHA256")
|
||||
ruleLocalCachePath: Mapped[str | None] = mapped_column("rule_local_cache_path", String(1024), comment="本地缓存路径")
|
||||
|
||||
# 模型快照
|
||||
engineVersion: Mapped[str | None] = mapped_column(String(64))
|
||||
llmProvider: Mapped[str | None] = mapped_column(String(64))
|
||||
llmModel: Mapped[str | None] = mapped_column(String(128))
|
||||
vlmProvider: Mapped[str | None] = mapped_column(String(64))
|
||||
vlmModel: Mapped[str | None] = mapped_column(String(128))
|
||||
ocrProvider: Mapped[str | None] = mapped_column(String(64))
|
||||
ocrModel: Mapped[str | None] = mapped_column(String(128))
|
||||
engineVersion: Mapped[str | None] = mapped_column("engine_version", String(64))
|
||||
llmProvider: Mapped[str | None] = mapped_column("llm_provider", String(64))
|
||||
llmModel: Mapped[str | None] = mapped_column("llm_model", String(128))
|
||||
vlmProvider: Mapped[str | None] = mapped_column("vlm_provider", String(64))
|
||||
vlmModel: Mapped[str | None] = mapped_column("vlm_model", String(128))
|
||||
ocrProvider: Mapped[str | None] = mapped_column("ocr_provider", String(64))
|
||||
ocrModel: Mapped[str | None] = mapped_column("ocr_model", String(128))
|
||||
|
||||
# Rescue
|
||||
rescueMode: Mapped[str | None] = mapped_column(String(32), comment="off/tier1/auto")
|
||||
rescueApplied: Mapped[bool] = mapped_column(Boolean, default=False, comment="是否执行 rescue")
|
||||
rescueMode: Mapped[str | None] = mapped_column("rescue_mode", String(32), comment="off/tier1/auto")
|
||||
rescueApplied: Mapped[bool] = mapped_column("rescue_applied", Boolean, default=False, comment="是否执行 rescue")
|
||||
|
||||
# 结果汇总
|
||||
totalScore: Mapped[float | None] = mapped_column(Numeric(10, 2))
|
||||
passedCount: Mapped[int | None] = mapped_column(Integer)
|
||||
failedCount: Mapped[int | None] = mapped_column(Integer)
|
||||
skippedCount: Mapped[int | None] = mapped_column(Integer)
|
||||
resultStatus: Mapped[str | None] = mapped_column(String(32), comment="pass/fail/partial/error")
|
||||
totalScore: Mapped[float | None] = mapped_column("total_score", Numeric(10, 2))
|
||||
passedCount: Mapped[int | None] = mapped_column("passed_count", Integer)
|
||||
failedCount: Mapped[int | None] = mapped_column("failed_count", Integer)
|
||||
skippedCount: Mapped[int | None] = mapped_column("skipped_count", Integer)
|
||||
resultStatus: Mapped[str | None] = mapped_column("result_status", String(32), comment="pass/fail/partial/error")
|
||||
|
||||
# 时间
|
||||
startedAt: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
|
||||
finishedAt: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
|
||||
startedAt: Mapped[datetime | None] = mapped_column("started_at", DateTime(timezone=True))
|
||||
finishedAt: Mapped[datetime | None] = mapped_column("finished_at", DateTime(timezone=True))
|
||||
|
||||
@@ -17,11 +17,11 @@ class LeauditDocument(BaseModel):
|
||||
|
||||
__tablename__ = "leaudit_documents"
|
||||
|
||||
Id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
|
||||
bizDocumentId: Mapped[int] = mapped_column(BigInteger, unique=True, comment="关联业务 documents.id")
|
||||
typeId: Mapped[int | None] = mapped_column(BigInteger, comment="文档类型ID")
|
||||
processingStatus: Mapped[str | None] = mapped_column(String(64), default="waiting", comment="waiting/processing/completed/failed")
|
||||
currentRunId: Mapped[int | None] = mapped_column(BigInteger, comment="最新有效 run id")
|
||||
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
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from sqlalchemy import BigInteger, Boolean, String
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy.orm import Mapped, mapped_column
|
||||
|
||||
from fastapi_common.fastapi_common_web.models import BaseModel
|
||||
@@ -13,16 +14,42 @@ class LeauditDocumentFile(BaseModel):
|
||||
|
||||
__tablename__ = "leaudit_document_files"
|
||||
|
||||
Id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
|
||||
documentId: Mapped[int] = mapped_column(BigInteger, comment="关联 leaudit_documents.id")
|
||||
fileRole: Mapped[str] = mapped_column(String(64), comment="original/converted_pdf/merged_pdf/temp_input")
|
||||
fileName: Mapped[str] = mapped_column(String(512), comment="文件名")
|
||||
fileExt: Mapped[str | None] = mapped_column(String(32), comment="扩展名")
|
||||
mimeType: Mapped[str | None] = mapped_column(String(128), comment="MIME")
|
||||
fileSize: Mapped[int | None] = mapped_column(BigInteger, comment="文件大小")
|
||||
sha256: Mapped[str | None] = mapped_column(String(64), comment="SHA256")
|
||||
localPath: Mapped[str | None] = mapped_column(String(1024), comment="本地路径")
|
||||
ossUrl: Mapped[str | None] = mapped_column(String(2048), comment="OSS 地址")
|
||||
storageProvider: Mapped[str | None] = mapped_column(String(32), comment="oss/minio/local")
|
||||
isActive: Mapped[bool] = mapped_column(Boolean, default=True, comment="当前生效文件")
|
||||
createdBy: Mapped[int | None] = mapped_column(BigInteger, comment="上传人")
|
||||
Id: Mapped[int] = mapped_column("id", BigInteger, primary_key=True, autoincrement=True)
|
||||
documentId: Mapped[int] = mapped_column("document_id", BigInteger, comment="关联 leaudit_documents.id")
|
||||
fileRole: Mapped[str] = mapped_column("file_role", String(64), comment="original/converted_pdf/merged_pdf/temp_input")
|
||||
fileName: Mapped[str] = mapped_column("file_name", String(512), comment="文件名")
|
||||
fileExt: Mapped[str | None] = mapped_column("file_ext", String(32), comment="扩展名")
|
||||
mimeType: Mapped[str | None] = mapped_column("mime_type", String(128), comment="MIME")
|
||||
fileSize: Mapped[int | None] = mapped_column("file_size", BigInteger, comment="文件大小")
|
||||
sha256: Mapped[str | None] = mapped_column("sha256", String(64), comment="SHA256")
|
||||
localPath: Mapped[str | None] = mapped_column("local_path", String(1024), comment="本地路径")
|
||||
ossUrl: Mapped[str | None] = mapped_column("oss_url", String(2048), comment="OSS 地址")
|
||||
storageProvider: Mapped[str | None] = mapped_column("storage_provider", String(32), comment="oss/minio/local")
|
||||
isActive: Mapped[bool] = mapped_column("is_active", Boolean, default=True, comment="当前生效文件")
|
||||
createdBy: Mapped[int | None] = mapped_column("created_by", BigInteger, comment="上传人")
|
||||
|
||||
@classmethod
|
||||
async def deactivate_active_by_document(cls, session: AsyncSession, documentId: int) -> None:
|
||||
"""把指定文档当前激活文件全部置为非激活。"""
|
||||
from sqlalchemy import update
|
||||
|
||||
await session.execute(
|
||||
update(cls)
|
||||
.where(
|
||||
cls.documentId == documentId,
|
||||
cls.isActive.is_(True),
|
||||
)
|
||||
.values(isActive=False)
|
||||
)
|
||||
|
||||
@classmethod
|
||||
async def count_by_document(cls, session: AsyncSession, documentId: int) -> int:
|
||||
"""统计指定文档历史文件版本数。"""
|
||||
from sqlalchemy import func, select
|
||||
|
||||
return int(
|
||||
await session.scalar(
|
||||
select(func.count()).select_from(cls).where(cls.documentId == documentId)
|
||||
)
|
||||
or 0
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user