feat(server): add OCR invoice processing functionality
New endpoints: - server/src/app/api/v1/endpoints/ocr.py: OCR API endpoints for invoice scanning New schemas: - server/src/app/schemas/ocr.py: OCR request/response data schemas New services: - server/src/app/services/ocr.py: OCR processing business logic - server/src/app/services/expense_claims.py: expense claims management service Scripts: - server/scripts/bootstrap_paddleocr_mobile.sh: PaddleOCR mobile setup script - server/scripts/paddle_ocr_worker.py: PaddleOCR worker process
This commit is contained in:
35
server/src/app/schemas/ocr.py
Normal file
35
server/src/app/schemas/ocr.py
Normal file
@@ -0,0 +1,35 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
|
||||
class OcrRecognizeLineRead(BaseModel):
|
||||
text: str = Field(description="识别出的文本行。")
|
||||
score: float = Field(default=0.0, ge=0.0, le=1.0, description="该行识别置信度。")
|
||||
box: list[list[int]] = Field(default_factory=list, description="文本框坐标。")
|
||||
page_index: int | None = Field(default=None, description="页码,从 0 开始。")
|
||||
|
||||
|
||||
class OcrRecognizeDocumentRead(BaseModel):
|
||||
filename: str = Field(description="原始文件名。")
|
||||
media_type: str = Field(description="文件媒体类型。")
|
||||
engine: str = Field(default="paddleocr_mobile", description="使用的 OCR 引擎。")
|
||||
model: str = Field(default="PP-OCRv5_mobile", description="模型族标识。")
|
||||
text: str = Field(default="", description="合并后的完整 OCR 文本。")
|
||||
summary: str = Field(default="", description="供对话和语义层复用的简短摘要。")
|
||||
avg_score: float = Field(default=0.0, ge=0.0, le=1.0, description="平均识别置信度。")
|
||||
line_count: int = Field(default=0, ge=0, description="文本行数。")
|
||||
page_count: int = Field(default=1, ge=0, description="识别页数。")
|
||||
warnings: list[str] = Field(default_factory=list, description="该文件的识别提示或警告。")
|
||||
lines: list[OcrRecognizeLineRead] = Field(default_factory=list, description="逐行识别结果。")
|
||||
|
||||
|
||||
class OcrRecognizeBatchRead(BaseModel):
|
||||
engine: str = Field(default="paddleocr_mobile", description="使用的 OCR 引擎。")
|
||||
model: str = Field(default="PP-OCRv5_mobile", description="模型族标识。")
|
||||
total_file_count: int = Field(default=0, ge=0, description="本次上传的总文件数。")
|
||||
success_count: int = Field(default=0, ge=0, description="成功进入 OCR 的文件数。")
|
||||
documents: list[OcrRecognizeDocumentRead] = Field(
|
||||
default_factory=list,
|
||||
description="逐文件 OCR 结果。",
|
||||
)
|
||||
Reference in New Issue
Block a user