feat: 新增票据夹模块并优化 OCR 与员工画像服务
后端新增票据夹端点、数据模型和服务模块,优化 OCR 端点 Schema 和附件操作逻辑,完善员工行为画像服务和辅助函数, 前端新增票据夹视图和服务层,优化文档中心样式和侧边栏导 航,完善员工画像详情弹窗和权限控制,补充单元测试。
This commit is contained in:
@@ -39,6 +39,10 @@ class OcrRecognizeDocumentRead(BaseModel):
|
||||
)
|
||||
preview_kind: str = Field(default="", description="预览类型,PDF 转图后通常为 image。")
|
||||
preview_data_url: str = Field(default="", description="用于前端展示的图片预览 data URL。")
|
||||
receipt_id: str = Field(default="", description="票据夹中的持久化票据 ID。")
|
||||
receipt_status: str = Field(default="", description="票据夹关联状态,unlinked / linked。")
|
||||
receipt_preview_url: str = Field(default="", description="票据夹预览接口地址。")
|
||||
receipt_source_url: str = Field(default="", description="票据夹原始文件接口地址。")
|
||||
warnings: list[str] = Field(default_factory=list, description="该文件的识别提示或警告。")
|
||||
lines: list[OcrRecognizeLineRead] = Field(default_factory=list, description="逐行识别结果。")
|
||||
|
||||
|
||||
68
server/src/app/schemas/receipt_folder.py
Normal file
68
server/src/app/schemas/receipt_folder.py
Normal file
@@ -0,0 +1,68 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Any
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
|
||||
class ReceiptFolderFieldRead(BaseModel):
|
||||
key: str = ""
|
||||
label: str = ""
|
||||
value: str = ""
|
||||
|
||||
|
||||
class ReceiptFolderItemRead(BaseModel):
|
||||
id: str
|
||||
file_name: str
|
||||
media_type: str = "application/octet-stream"
|
||||
size_bytes: int = 0
|
||||
status: str = "unlinked"
|
||||
status_label: str = "未关联"
|
||||
document_type: str = "other"
|
||||
document_type_label: str = "其他单据"
|
||||
scene_code: str = "other"
|
||||
scene_label: str = "其他票据"
|
||||
summary: str = ""
|
||||
amount: str = ""
|
||||
document_date: str = ""
|
||||
merchant_name: str = ""
|
||||
avg_score: float = 0.0
|
||||
uploaded_at: datetime | None = None
|
||||
linked_at: datetime | None = None
|
||||
linked_claim_id: str = ""
|
||||
linked_claim_no: str = ""
|
||||
previewable: bool = False
|
||||
preview_kind: str = ""
|
||||
preview_url: str = ""
|
||||
source_url: str = ""
|
||||
warnings: list[str] = Field(default_factory=list)
|
||||
|
||||
|
||||
class ReceiptFolderDetailRead(ReceiptFolderItemRead):
|
||||
engine: str = ""
|
||||
model: str = ""
|
||||
ocr_text: str = ""
|
||||
line_count: int = 0
|
||||
page_count: int = 1
|
||||
classification_confidence: float = 0.0
|
||||
classification_evidence: list[str] = Field(default_factory=list)
|
||||
fields: list[ReceiptFolderFieldRead] = Field(default_factory=list)
|
||||
raw_meta: dict[str, Any] = Field(default_factory=dict)
|
||||
|
||||
|
||||
class ReceiptFolderUpdate(BaseModel):
|
||||
document_type: str | None = None
|
||||
document_type_label: str | None = None
|
||||
scene_code: str | None = None
|
||||
scene_label: str | None = None
|
||||
summary: str | None = None
|
||||
amount: str | None = None
|
||||
document_date: str | None = None
|
||||
merchant_name: str | None = None
|
||||
fields: list[ReceiptFolderFieldRead] | None = None
|
||||
|
||||
|
||||
class ReceiptFolderDeleteResponse(BaseModel):
|
||||
message: str
|
||||
receipt_id: str
|
||||
Reference in New Issue
Block a user