feat(govdoc): 新增内部公文模块全链路(后端58+前端11文件)

This commit is contained in:
wren
2026-05-13 14:37:12 +08:00
parent 99699e20e1
commit 5d777599bf
63 changed files with 7608 additions and 0 deletions
@@ -14,6 +14,9 @@ from fastapi_modules.fastapi_leaudit.models.leauditRagChatApp import LeauditRagC
from fastapi_modules.fastapi_leaudit.models.leauditRagConversation import LeauditRagConversation
from fastapi_modules.fastapi_leaudit.models.leauditRagMessage import LeauditRagMessage
from fastapi_modules.fastapi_leaudit.models.usageLoginEvent import UsageLoginEvent
from fastapi_modules.fastapi_leaudit.models.govdocRun import GovdocRun
from fastapi_modules.fastapi_leaudit.models.govdocRuleResult import GovdocRuleResult
from fastapi_modules.fastapi_leaudit.models.govdocReportArtifact import GovdocReportArtifact
__all__ = [
"LeauditDocument",
@@ -30,4 +33,7 @@ __all__ = [
"LeauditRagConversation",
"LeauditRagMessage",
"UsageLoginEvent",
"GovdocRun",
"GovdocRuleResult",
"GovdocReportArtifact",
]
@@ -0,0 +1,27 @@
"""Govdoc 报告产物模型 —— govdoc_report_artifacts 表。"""
from __future__ import annotations
from sqlalchemy import BigInteger, String
from sqlalchemy.orm import Mapped, mapped_column
from fastapi_common.fastapi_common_web.models import BaseModel
class GovdocReportArtifact(BaseModel):
"""公文审查报告产物索引表。"""
__tablename__ = "govdoc_report_artifacts"
Id: Mapped[int] = mapped_column("id", BigInteger, primary_key=True, autoincrement=True)
runId: Mapped[int] = mapped_column("run_id", BigInteger, comment="关联 govdoc_runs.id")
artifactType: Mapped[str] = mapped_column("artifact_type", String(64), comment="产物类型:html_report/annotated_docx/paragraph_html/json_report/original")
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")
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")
description: Mapped[str | None] = mapped_column("description", String(512), comment="产物说明")
@@ -0,0 +1,39 @@
"""Govdoc 规则结果模型 —— govdoc_rule_results 表。"""
from __future__ import annotations
from sqlalchemy import BigInteger, Integer, Numeric, String, Text
from sqlalchemy.orm import Mapped, mapped_column
from fastapi_common.fastapi_common_web.models import BaseModel
class GovdocRuleResult(BaseModel):
"""公文规则执行结果明细表。"""
__tablename__ = "govdoc_rule_results"
Id: Mapped[int] = mapped_column("id", BigInteger, primary_key=True, autoincrement=True)
runId: Mapped[int] = mapped_column("run_id", BigInteger, comment="关联 govdoc_runs.id")
# 规则标识
ruleId: Mapped[str] = mapped_column("rule_id", String(128), comment="规则标识")
ruleName: Mapped[str | None] = mapped_column("rule_name", String(256), comment="规则名称")
severity: Mapped[str | None] = mapped_column("severity", String(32), comment="严重等级:error/warning/info")
category: Mapped[str | None] = mapped_column("category", String(128), comment="规则分类")
# 结果内容
message: Mapped[str | None] = mapped_column("message", Text, comment="结果描述")
suggestion: Mapped[str | None] = mapped_column("suggestion", Text, comment="修改建议")
actual: Mapped[str | None] = mapped_column("actual", Text, comment="实际值")
expected: Mapped[str | None] = mapped_column("expected", Text, comment="期望值")
evidence: Mapped[str | None] = mapped_column("evidence", Text, comment="证据文本")
# 文档定位
paragraphIndex: Mapped[int | None] = mapped_column("paragraph_index", Integer, comment="段落索引")
paragraphText: Mapped[str | None] = mapped_column("paragraph_text", Text, comment="段落原文")
locationPath: Mapped[str | None] = mapped_column("location_path", String(512), comment="文档结构位置路径")
# 判定
result: Mapped[str] = mapped_column("result", String(32), default="pass", comment="执行结果:pass/fail/skipped/error")
score: Mapped[float | None] = mapped_column("score", Numeric(10, 2), comment="本条得分")
@@ -0,0 +1,46 @@
"""Govdoc 审查运行模型 —— govdoc_runs 表。"""
from __future__ import annotations
from datetime import datetime
from sqlalchemy import BigInteger, DateTime, Integer, Numeric, String, Text
from sqlalchemy.orm import Mapped, mapped_column
from fastapi_common.fastapi_common_web.models import BaseModel
class GovdocRun(BaseModel):
"""公文审查运行主表。"""
__tablename__ = "govdoc_runs"
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,关联 leaudit_document_files.id")
runNo: Mapped[int] = mapped_column("run_no", Integer, default=1, comment="同一文档第几次执行")
triggerSource: Mapped[str] = mapped_column("trigger_source", String(64), default="upload", comment="触发来源:upload/manual/retry/migration")
triggerUserId: Mapped[int | None] = mapped_column("trigger_user_id", BigInteger, comment="触发人 user_id")
taskId: Mapped[str | None] = mapped_column("task_id", String(128), comment="Celery 任务 ID")
# 运行状态
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="当前阶段:parsing/executing/reporting")
# 引擎快照
engineVersion: Mapped[str | None] = mapped_column("engine_version", String(64), comment="引擎版本号")
llmProvider: Mapped[str | None] = mapped_column("llm_provider", String(64), comment="LLM 提供商")
llmModel: Mapped[str | None] = mapped_column("llm_model", String(128), comment="LLM 模型名")
# 结果汇总
totalScore: Mapped[float | None] = mapped_column("total_score", Numeric(10, 2), comment="总分")
passedCount: Mapped[int | None] = mapped_column("passed_count", Integer, comment="通过规则数")
failedCount: Mapped[int | None] = mapped_column("failed_count", Integer, comment="未通过规则数")
skippedCount: Mapped[int | None] = mapped_column("skipped_count", Integer, comment="跳过规则数")
resultStatus: Mapped[str | None] = mapped_column("result_status", String(32), comment="综合结果:pass/fail/partial/error")
resultSummaryJson: Mapped[str | None] = mapped_column("result_summary_json", Text, comment="结构化结果摘要 JSON")
errorMessage: Mapped[str | None] = mapped_column("error_message", Text, comment="运行失败时错误描述")
# 时间
startedAt: Mapped[datetime | None] = mapped_column("started_at", DateTime(timezone=True), comment="开始执行时间")
finishedAt: Mapped[datetime | None] = mapped_column("finished_at", DateTime(timezone=True), comment="结束执行时间")