from datetime import datetime from typing import Optional, List, Any from pydantic import BaseModel, Field class ContractDocumentResponse(BaseModel): id: int = Field(description="合同文档ID") contract_type: str = Field(description="合同类型编码") contract_name: str = Field(description="合同名称") is_primary: int = Field(description="是否主合同,1是0否") status: int = Field(description="签署状态,0未签1已签") sign_flow_id: str = Field(description="e签宝签署流程ID") file_id: str = Field(description="e签宝文件ID") template_url: str = Field(description="合同模板文件链接") sign_url: str = Field(description="签署链接") download_url: str = Field(description="已签文件下载链接") signing_time: Optional[datetime] = Field(default=None, description="签署时间") effective_time: Optional[datetime] = Field(default=None, description="生效时间") expiry_time: Optional[datetime] = Field(default=None, description="到期时间") class ContractBundleResponse(BaseModel): id: int = Field(description="合同包ID") subject_type: str = Field(description="主体类型,store或lawyer") subject_id: int = Field(description="主体ID") subject_name: str = Field(description="主体名称") business_segment: str = Field(description="业务板块") contact_name: str = Field(description="联系人姓名") contact_phone: str = Field(description="联系人手机号") ord_id: str = Field(description="统一社会信用代码") bundle_type: str = Field(description="合同包类型") status: str = Field(description="合同包状态") primary_document_id: Optional[int] = Field(default=None, description="主合同文档ID") documents: List[ContractDocumentResponse] = Field(description="合同文档列表") class BundleCreateResponse(BaseModel): success: bool = Field(description="是否成功") message: str = Field(description="响应消息") bundle_id: Optional[int] = Field(default=None, description="合同包ID") primary_sign_flow_id: Optional[str] = Field(default=None, description="主合同签署流程ID") created_contracts: Optional[List[dict]] = Field(default=None, description="本次创建的合同列表") class ErrorResponse(BaseModel): success: bool = Field(default=False, description="是否成功") message: str = Field(description="错误消息") raw: Optional[Any] = Field(default=None, description="原始错误数据") class SuccessResponse(BaseModel): code: str = Field(description="响应代码") msg: str = Field(description="响应消息") class PaginatedBundleResponse(BaseModel): items: List[ContractBundleResponse] = Field(description="合同包列表") total: int = Field(description="总记录数") page: int = Field(description="当前页码") page_size: int = Field(description="每页条数") total_pages: int = Field(description="总页数") class ModuleStatusResponse(BaseModel): module: str = Field(description="模块名称") status: str = Field(description="模块状态")