Files
AiTool/backend/app/schemas.py
2026-03-15 16:38:59 +08:00

139 lines
3.2 KiB
Python

from datetime import date, datetime
from typing import Any, Dict, List, Optional
from pydantic import BaseModel, Field
class CustomerBase(BaseModel):
name: str = Field(..., description="Customer name")
contact_info: Optional[str] = Field(None, description="Contact information")
tags: Optional[str] = Field(None, description="Comma-separated tags, e.g. 重点客户,已签约")
class CustomerCreate(CustomerBase):
pass
class CustomerUpdate(BaseModel):
name: Optional[str] = None
contact_info: Optional[str] = None
tags: Optional[str] = None
class CustomerRead(CustomerBase):
id: int
created_at: datetime
class Config:
from_attributes = True
class ProjectRead(BaseModel):
id: int
customer_id: int
raw_requirement: str
ai_solution_md: Optional[str] = None
status: str
created_at: datetime
customer: Optional[CustomerRead] = None
class Config:
from_attributes = True
class ProjectUpdate(BaseModel):
raw_requirement: Optional[str] = None
ai_solution_md: Optional[str] = None
status: Optional[str] = None
class RequirementAnalyzeRequest(BaseModel):
customer_id: int = Field(..., description="Related customer id")
raw_text: str = Field(..., description="Raw requirement text from chat or WeChat")
class RequirementAnalyzeResponse(BaseModel):
project_id: int
ai_solution_md: str
ai_solution_json: Dict[str, Any]
class QuoteGenerateResponse(BaseModel):
quote_id: int
project_id: int
total_amount: float
excel_path: str
pdf_path: str
class ContractGenerateRequest(BaseModel):
delivery_date: str = Field(..., description="Delivery date, e.g. 2026-03-31")
extra_placeholders: Dict[str, str] = Field(
default_factory=dict,
description="Additional placeholder mappings for the contract template",
)
class ContractGenerateResponse(BaseModel):
project_id: int
contract_path: str
class PushToCloudRequest(BaseModel):
platform: str = Field(..., description="feishu | yuque | tencent")
title: Optional[str] = Field(None, description="文档标题,默认使用「项目方案 - 项目#id」")
body_md: Optional[str] = Field(None, description="要推送的 Markdown 内容,不传则使用项目已保存的方案")
class PushToCloudResponse(BaseModel):
url: str
cloud_doc_id: str
class FinanceSyncResult(BaseModel):
id: int
month: str
type: str
file_name: str
file_path: str
class FinanceSyncResponse(BaseModel):
status: str = "success"
new_files: int = 0
details: List[FinanceSyncResult] = Field(default_factory=list)
class FinanceRecordRead(BaseModel):
id: int
month: str
type: str
file_name: str
file_path: str
amount: Optional[float] = None
billing_date: Optional[date] = None
created_at: datetime
class Config:
from_attributes = True
class FinanceRecordUpdate(BaseModel):
amount: Optional[float] = None
billing_date: Optional[date] = None
class FinanceUploadResponse(BaseModel):
id: int
month: str
type: str
file_name: str
file_path: str
amount: Optional[float] = None
billing_date: Optional[date] = None
created_at: datetime
class Config:
from_attributes = True