document.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. from __future__ import annotations
  2. from datetime import datetime
  3. from sqlalchemy import (
  4. Boolean,
  5. DateTime,
  6. Float,
  7. ForeignKey,
  8. Index,
  9. Integer,
  10. JSON,
  11. String,
  12. Text,
  13. )
  14. from sqlalchemy.dialects.mysql import LONGTEXT
  15. from sqlalchemy.orm import Mapped, mapped_column
  16. from app.db.base import Base, TimestampMixin, UUIDPrimaryKeyMixin
  17. LONG_TEXT = Text().with_variant(LONGTEXT, "mysql")
  18. class BusinessDocument(UUIDPrimaryKeyMixin, TimestampMixin, Base):
  19. __tablename__ = "business_documents"
  20. mine_id: Mapped[str] = mapped_column(
  21. String(32), ForeignKey("mines.id", ondelete="CASCADE"), index=True
  22. )
  23. code: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
  24. title: Mapped[str] = mapped_column(String(255), index=True)
  25. category: Mapped[str] = mapped_column(String(32), index=True)
  26. subcategory: Mapped[str] = mapped_column(String(64), default="")
  27. document_type: Mapped[str] = mapped_column(String(128), default="", index=True)
  28. file_name: Mapped[str] = mapped_column(String(255))
  29. file_path: Mapped[str] = mapped_column(String(512))
  30. file_ext: Mapped[str] = mapped_column(String(16), default="")
  31. file_size: Mapped[int] = mapped_column(Integer, default=0)
  32. page_count: Mapped[int | None] = mapped_column(Integer, nullable=True)
  33. row_count: Mapped[int | None] = mapped_column(Integer, nullable=True)
  34. owner_name: Mapped[str] = mapped_column(String(128), default="")
  35. department: Mapped[str] = mapped_column(String(128), default="")
  36. version: Mapped[str] = mapped_column(String(32), default="V1.0")
  37. status: Mapped[str] = mapped_column(String(32), default="active", index=True)
  38. parse_status: Mapped[str] = mapped_column(String(32), default="pending", index=True)
  39. parse_progress: Mapped[int] = mapped_column(Integer, default=0)
  40. parse_error: Mapped[str] = mapped_column(Text, default="")
  41. effective_date: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  42. expire_date: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  43. is_confidential: Mapped[bool] = mapped_column(Boolean, default=False)
  44. tags: Mapped[list] = mapped_column(JSON, default=list)
  45. summary: Mapped[str] = mapped_column(Text, default="")
  46. metadata_json: Mapped[dict] = mapped_column("metadata", JSON, default=dict)
  47. class DocumentExtraction(UUIDPrimaryKeyMixin, TimestampMixin, Base):
  48. __tablename__ = "document_extractions"
  49. document_id: Mapped[str] = mapped_column(
  50. String(32), ForeignKey("business_documents.id", ondelete="CASCADE"), index=True
  51. )
  52. field_key: Mapped[str] = mapped_column(String(128), index=True)
  53. field_name: Mapped[str] = mapped_column(String(128))
  54. field_value: Mapped[str] = mapped_column(Text, default="")
  55. normalized_value: Mapped[str] = mapped_column(Text, default="")
  56. original_value: Mapped[str] = mapped_column(Text, default="")
  57. value_type: Mapped[str] = mapped_column(String(32), default="text")
  58. unit: Mapped[str] = mapped_column(String(32), default="")
  59. confidence: Mapped[float | None] = mapped_column(Float, nullable=True)
  60. page_no: Mapped[int | None] = mapped_column(Integer, nullable=True)
  61. evidence_text: Mapped[str] = mapped_column(Text, default="")
  62. edited: Mapped[bool] = mapped_column(Boolean, default=False, index=True)
  63. edit_count: Mapped[int] = mapped_column(Integer, default=0)
  64. extraction_correct: Mapped[bool] = mapped_column(Boolean, default=True, index=True)
  65. edit_reason: Mapped[str] = mapped_column(Text, default="")
  66. edit_judgement_source: Mapped[str] = mapped_column(String(32), default="")
  67. edit_judgement_confidence: Mapped[float | None] = mapped_column(Float, nullable=True)
  68. edit_judgement_status: Mapped[str] = mapped_column(
  69. String(32), default="not_required", index=True
  70. )
  71. edit_judged_at: Mapped[datetime | None] = mapped_column(
  72. DateTime(timezone=True), nullable=True
  73. )
  74. verified: Mapped[bool] = mapped_column(Boolean, default=False, index=True)
  75. verified_by: Mapped[str] = mapped_column(String(128), default="")
  76. metadata_json: Mapped[dict] = mapped_column("metadata", JSON, default=dict)
  77. class DocumentExtractionTemplate(UUIDPrimaryKeyMixin, TimestampMixin, Base):
  78. __tablename__ = "document_extraction_templates"
  79. code: Mapped[str] = mapped_column(String(64), unique=True, index=True)
  80. name: Mapped[str] = mapped_column(String(128))
  81. document_type: Mapped[str] = mapped_column(String(128), index=True)
  82. description: Mapped[str] = mapped_column(Text, default="")
  83. version: Mapped[str] = mapped_column(String(32), default="V1.0")
  84. prompt: Mapped[str] = mapped_column(Text)
  85. extraction_schema: Mapped[dict] = mapped_column(JSON, default=dict)
  86. enabled: Mapped[bool] = mapped_column(Boolean, default=True, index=True)
  87. class DocumentProcessingRun(UUIDPrimaryKeyMixin, TimestampMixin, Base):
  88. __tablename__ = "document_processing_runs"
  89. __table_args__ = (
  90. Index(
  91. "ix_document_processing_runs_document_created",
  92. "document_id",
  93. "created_at",
  94. ),
  95. )
  96. document_id: Mapped[str] = mapped_column(
  97. String(32), ForeignKey("business_documents.id", ondelete="CASCADE"), index=True
  98. )
  99. template_id: Mapped[str | None] = mapped_column(
  100. String(32),
  101. ForeignKey("document_extraction_templates.id", ondelete="SET NULL"),
  102. nullable=True,
  103. index=True,
  104. )
  105. status: Mapped[str] = mapped_column(String(32), default="pending", index=True)
  106. stage: Mapped[str] = mapped_column(String(32), default="uploaded")
  107. progress: Mapped[int] = mapped_column(Integer, default=0)
  108. document_type: Mapped[str] = mapped_column(String(128), default="", index=True)
  109. parser_engine: Mapped[str] = mapped_column(String(32), default="mineru_api_lightweight")
  110. parsed_markdown_path: Mapped[str] = mapped_column(String(512), default="")
  111. parsed_markdown: Mapped[str] = mapped_column(LONG_TEXT, default="")
  112. model_output: Mapped[dict] = mapped_column(JSON, default=dict)
  113. error: Mapped[str] = mapped_column(Text, default="")
  114. started_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  115. finished_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  116. metadata_json: Mapped[dict] = mapped_column("metadata", JSON, default=dict)