document.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. from __future__ import annotations
  2. from datetime import datetime
  3. from pydantic import BaseModel, Field
  4. from app.schemas.common import ORMModel
  5. class BusinessDocumentCreate(BaseModel):
  6. mine_id: str
  7. code: str | None = None
  8. title: str = Field(max_length=255)
  9. category: str = Field(max_length=32)
  10. subcategory: str = ""
  11. document_type: str = ""
  12. file_name: str
  13. file_path: str
  14. file_ext: str = ""
  15. file_size: int = 0
  16. page_count: int | None = None
  17. row_count: int | None = None
  18. owner_name: str = ""
  19. department: str = ""
  20. version: str = "V1.0"
  21. status: str = "active"
  22. parse_status: str = "pending"
  23. effective_date: datetime | None = None
  24. expire_date: datetime | None = None
  25. is_confidential: bool = False
  26. tags: list[str] = Field(default_factory=list)
  27. summary: str = ""
  28. metadata: dict = Field(default_factory=dict)
  29. class BusinessDocumentUpdate(BaseModel):
  30. code: str | None = None
  31. title: str | None = None
  32. category: str | None = None
  33. subcategory: str | None = None
  34. file_name: str | None = None
  35. file_path: str | None = None
  36. owner_name: str | None = None
  37. department: str | None = None
  38. version: str | None = None
  39. status: str | None = None
  40. parse_status: str | None = None
  41. parse_progress: int | None = None
  42. parse_error: str | None = None
  43. effective_date: datetime | None = None
  44. expire_date: datetime | None = None
  45. is_confidential: bool | None = None
  46. tags: list[str] | None = None
  47. summary: str | None = None
  48. metadata: dict | None = None
  49. class BusinessDocumentRead(ORMModel):
  50. id: str
  51. mine_id: str
  52. code: str | None
  53. title: str
  54. category: str
  55. subcategory: str
  56. document_type: str
  57. file_name: str
  58. file_path: str
  59. file_ext: str
  60. file_size: int
  61. page_count: int | None
  62. row_count: int | None
  63. owner_name: str
  64. department: str
  65. version: str
  66. status: str
  67. parse_status: str
  68. parse_progress: int
  69. parse_error: str
  70. effective_date: datetime | None
  71. expire_date: datetime | None
  72. is_confidential: bool
  73. tags: list
  74. summary: str
  75. metadata: dict = Field(validation_alias="metadata_json")
  76. created_at: datetime
  77. updated_at: datetime
  78. class DocumentExtractionCreate(BaseModel):
  79. document_id: str
  80. field_key: str
  81. field_name: str
  82. field_value: str = ""
  83. normalized_value: str = ""
  84. value_type: str = "text"
  85. unit: str = ""
  86. confidence: float | None = None
  87. page_no: int | None = None
  88. evidence_text: str = ""
  89. metadata: dict = Field(default_factory=dict)
  90. class DocumentExtractionRead(ORMModel):
  91. id: str
  92. document_id: str
  93. field_key: str
  94. field_name: str
  95. field_value: str
  96. normalized_value: str
  97. original_value: str
  98. value_type: str
  99. unit: str
  100. confidence: float | None
  101. page_no: int | None
  102. evidence_text: str
  103. edited: bool
  104. edit_count: int
  105. extraction_correct: bool
  106. edit_reason: str
  107. edit_judgement_source: str
  108. edit_judgement_confidence: float | None
  109. edit_judgement_status: str
  110. edit_judged_at: datetime | None
  111. verified: bool
  112. verified_by: str
  113. metadata: dict = Field(validation_alias="metadata_json")
  114. class DocumentExtractionUpdate(BaseModel):
  115. field_value: str | None = None
  116. normalized_value: str | None = None
  117. verified: bool | None = None
  118. verified_by: str | None = None
  119. class DocumentCategorySummary(BaseModel):
  120. category: str
  121. count: int
  122. class BusinessDocumentStatistics(BaseModel):
  123. total_documents: int
  124. documents_added_this_month: int
  125. extracted_fields: int
  126. field_completeness: float
  127. extraction_accuracy: float
  128. accuracy_change: float
  129. pending_tasks: int
  130. estimated_minutes: int
  131. verified_fields: int
  132. edited_fields: int
  133. incorrect_fields: int
  134. expected_fields: int
  135. valid_fields: int
  136. invalid_fields: int
  137. missing_fields: int
  138. pending_judgements: int
  139. accuracy_fields: int
  140. storage_used_bytes: int
  141. storage_capacity_bytes: int
  142. storage_usage_percent: float
  143. updated_at: datetime
  144. class BusinessDocumentDetail(BusinessDocumentRead):
  145. extractions: list[DocumentExtractionRead] = Field(default_factory=list)
  146. class DocumentPreviewRead(BaseModel):
  147. id: str
  148. title: str
  149. file_name: str
  150. file_ext: str
  151. file_size: int
  152. preview_type: str
  153. source_available: bool
  154. text_available: bool
  155. can_download: bool
  156. file_url: str
  157. download_url: str
  158. text: str = ""
  159. class DocumentSearchSnippet(BaseModel):
  160. source: str
  161. label: str
  162. text: str
  163. class DocumentSearchHit(BaseModel):
  164. document: BusinessDocumentRead
  165. score: float
  166. snippets: list[DocumentSearchSnippet] = Field(default_factory=list)
  167. class DocumentSearchResponse(BaseModel):
  168. query: str
  169. total: int
  170. page: int
  171. page_size: int
  172. items: list[DocumentSearchHit] = Field(default_factory=list)
  173. class DocumentExtractionTemplateRead(ORMModel):
  174. id: str
  175. code: str
  176. name: str
  177. document_type: str
  178. description: str
  179. version: str
  180. fields: dict = Field(
  181. validation_alias="extraction_schema",
  182. serialization_alias="fields",
  183. )
  184. enabled: bool
  185. created_at: datetime
  186. updated_at: datetime
  187. class DocumentProcessingRunRead(ORMModel):
  188. id: str
  189. document_id: str
  190. template_id: str | None
  191. status: str
  192. stage: str
  193. progress: int
  194. document_type: str
  195. parser_engine: str
  196. parsed_markdown_path: str
  197. model_output: dict
  198. error: str
  199. started_at: datetime | None
  200. finished_at: datetime | None
  201. metadata: dict = Field(validation_alias="metadata_json")
  202. created_at: datetime
  203. updated_at: datetime
  204. class DocumentProcessingTaskRead(BaseModel):
  205. id: str
  206. document_id: str
  207. title: str
  208. file_name: str
  209. file_ext: str
  210. status: str
  211. stage: str
  212. progress: int
  213. document_type: str
  214. parser_engine: str
  215. page_count: int | None
  216. row_count: int | None
  217. field_count: int
  218. processing_seconds: float | None
  219. started_at: datetime | None
  220. error: str
  221. created_at: datetime
  222. updated_at: datetime
  223. class DocumentProcessingStart(BaseModel):
  224. force: bool = False
  225. parse_mode: str = "lightweight"
  226. template_id: str | None = None