From de51ed2e9f5080c7677daf197a5393b2afa76f6d Mon Sep 17 00:00:00 2001 From: caoxiaozhu Date: Wed, 13 May 2026 15:29:25 +0000 Subject: [PATCH] chore(backend): update config and user agent schema - core/config.py: update application configuration - schemas/user_agent.py: update user agent data schemas --- server/src/app/core/config.py | 4 +++ server/src/app/schemas/user_agent.py | 50 ++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/server/src/app/core/config.py b/server/src/app/core/config.py index f274243..581d669 100644 --- a/server/src/app/core/config.py +++ b/server/src/app/core/config.py @@ -71,6 +71,10 @@ class Settings(BaseSettings): ocr_timeout_seconds: int = Field(default=180, alias="OCR_TIMEOUT_SECONDS") ocr_max_file_size_mb: int = Field(default=20, alias="OCR_MAX_FILE_SIZE_MB") ocr_language: str = Field(default="ch", alias="OCR_LANGUAGE") + seed_demo_financial_records: bool = Field( + default=False, + alias="SEED_DEMO_FINANCIAL_RECORDS", + ) ocr_text_detection_model: str = Field( default="PP-OCRv5_mobile_det", alias="OCR_TEXT_DETECTION_MODEL", diff --git a/server/src/app/schemas/user_agent.py b/server/src/app/schemas/user_agent.py index dd76bdc..f0ef4ac 100644 --- a/server/src/app/schemas/user_agent.py +++ b/server/src/app/schemas/user_agent.py @@ -34,6 +34,52 @@ class UserAgentDraftPayload(BaseModel): status: str | None = Field(default=None, description="当前报销草稿状态。") +class UserAgentQueryStatusGroup(BaseModel): + key: str = Field(description="状态分组键名。") + label: str = Field(description="状态分组展示名。") + count: int = Field(default=0, ge=0, description="该分组单据数。") + + +class UserAgentExpenseQueryRecord(BaseModel): + claim_id: str = Field(description="报销单主键。") + claim_no: str = Field(description="报销单号。") + employee_name: str = Field(default="", description="申请人。") + expense_type: str = Field(default="", description="费用类型编码。") + expense_type_label: str = Field(default="", description="费用类型中文名。") + amount: float = Field(default=0.0, ge=0.0, description="金额。") + status: str = Field(default="", description="单据状态编码。") + status_label: str = Field(default="", description="单据状态中文名。") + status_group: str = Field(default="", description="状态分组编码。") + status_group_label: str = Field(default="", description="状态分组中文名。") + approval_stage: str | None = Field(default=None, description="审批节点。") + document_date: str = Field(default="", description="用于近 10 日展示的单据日期。") + occurred_at: str = Field(default="", description="业务发生日期。") + reason: str = Field(default="", description="事由。") + location: str = Field(default="", description="地点。") + + +class UserAgentQueryPayload(BaseModel): + result_type: str = Field(default="expense_claim_list", description="结构化查询结果类型。") + scope_label: str = Field(default="报销单", description="当前查询范围名。") + recent_window_applied: bool = Field(default=False, description="是否应用了近 10 日窗口。") + window_days: int | None = Field(default=None, ge=1, description="近 N 日窗口天数。") + window_start_date: str | None = Field(default=None, description="近 N 日窗口开始日期。") + window_end_date: str | None = Field(default=None, description="近 N 日窗口结束日期。") + record_count: int = Field(default=0, ge=0, description="当前展示范围内的单据数。") + preview_count: int = Field(default=0, ge=0, description="当前返回的单据数。") + older_record_count: int = Field(default=0, ge=0, description="超出近 10 日窗口的单据数。") + has_more_in_window: bool = Field(default=False, description="当前展示范围内是否还有更多单据未返回。") + total_amount: float = Field(default=0.0, ge=0.0, description="当前展示范围内金额合计。") + status_groups: list[UserAgentQueryStatusGroup] = Field( + default_factory=list, + description="当前展示范围内的状态分组统计。", + ) + records: list[UserAgentExpenseQueryRecord] = Field( + default_factory=list, + description="当前返回的单据列表。", + ) + + class UserAgentReviewRiskBrief(BaseModel): title: str = Field(description="风险或注意事项标题。") level: str = Field(default="info", description="级别,例如 info / warning / high。") @@ -159,6 +205,10 @@ class UserAgentResponse(BaseModel): default_factory=list, description="建议的下一步动作。", ) + query_payload: UserAgentQueryPayload | None = Field( + default=None, + description="结构化查询结果,用于前端渲染真实单据列表。", + ) draft_payload: UserAgentDraftPayload | None = Field(default=None, description="可选草稿内容。") review_payload: UserAgentReviewPayload | None = Field( default=None,