""" 主播相关Pydantic模型 """ from datetime import date, datetime from typing import Optional, Dict, Any from pydantic import BaseModel, Field class McnAgencyBase(BaseModel): """MCN机构基础模型""" mcn_name: str = Field(..., description="MCN机构名称") unified_social_credit_code: str = Field(..., description="统一社会信用代码") legal_person_name: str = Field(..., description="法人姓名") legal_person_id_card: str = Field(..., description="法人身份证号") registered_address: str = Field(..., description="注册地址") bank_account_no: str = Field(..., description="银行账号") bank_name: str = Field(..., description="开户银行") mcn_type: str = Field(..., description="MCN类型") contact_person: Optional[str] = Field(None, description="联系人") contact_phone: Optional[str] = Field(None, description="联系电话") contact_email: Optional[str] = Field(None, description="联系邮箱") status: str = Field(default="active", description="状态") class McnAgencyCreate(McnAgencyBase): """创建MCN机构""" pass class McnAgencyUpdate(BaseModel): """更新MCN机构""" mcn_name: Optional[str] = None unified_social_credit_code: Optional[str] = None tax_registration_no: Optional[str] = None tax_authority_code: Optional[str] = None tax_authority_name: Optional[str] = None legal_person_name: Optional[str] = None legal_person_id_card: Optional[str] = None registered_capital: Optional[float] = None establishment_date: Optional[date] = None registered_address: Optional[str] = None actual_address: Optional[str] = None business_scope: Optional[str] = None mcn_type: Optional[str] = None contact_person: Optional[str] = None contact_phone: Optional[str] = None contact_email: Optional[str] = None bank_account_no: Optional[str] = None bank_name: Optional[str] = None status: Optional[str] = None risk_level: Optional[str] = None class McnAgencyResponse(McnAgencyBase): """MCN机构响应模型""" id: int mcn_id: str tax_registration_no: Optional[str] = None tax_authority_code: Optional[str] = None tax_authority_name: Optional[str] = None registered_capital: Optional[float] = None establishment_date: Optional[date] = None actual_address: Optional[str] = None business_scope: Optional[str] = None streamer_count: int = 0 annual_revenue: float = 0 annual_tax_paid: float = 0 tax_burden_rate: float = 0 top_10_upstream_revenue: float = 0 top_10_upstream_invoice_amount: float = 0 risk_level: Optional[str] = None created_at: datetime updated_at: Optional[datetime] = None class Config: from_attributes = True class StreamerBase(BaseModel): """主播基础模型""" streamer_name: str = Field(..., description="主播姓名/企业名称") entity_type: str = Field(..., description="主体类型") phone_number: str = Field(..., description="手机号码") bank_account_no: str = Field(..., description="银行账号") bank_name: str = Field(..., description="开户银行") wechat_pay_account: Optional[str] = Field(None, description="微信支付账号") alipay_account: Optional[str] = Field(None, description="支付宝账号") douyin_account: Optional[str] = Field(None, description="抖音账号") mcn_agency_id: Optional[int] = Field(None, description="所属MCN机构ID") status: str = Field(default="active", description="状态") registration_date: Optional[date] = Field(None, description="入驻时间") class StreamerCreate(StreamerBase): """创建主播""" id_card_no: Optional[str] = Field(None, description="身份证号") social_security_no: Optional[str] = Field(None, description="社会保障号") unified_social_credit_code: Optional[str] = Field(None, description="统一社会信用代码") tax_registration_no: Optional[str] = Field(None, description="税务登记证号") legal_person_name: Optional[str] = Field(None, description="法人姓名") legal_person_id_card: Optional[str] = Field(None, description="法人身份证号") registered_address: Optional[str] = Field(None, description="注册地址") actual_address: Optional[str] = Field(None, description="实际经营地址") kuaishou_account: Optional[str] = Field(None, description="快手账号") xiaohongshu_account: Optional[str] = Field(None, description="小红书账号") weibo_account: Optional[str] = Field(None, description="微博账号") bilibili_account: Optional[str] = Field(None, description="B站账号") streamer_certificate_no: Optional[str] = Field(None, description="主播证书号") certificate_issuing_authority: Optional[str] = Field(None, description="证书颁发机构") certificate_issue_date: Optional[date] = Field(None, description="证书颁发日期") certificate_expiry_date: Optional[date] = Field(None, description="证书有效期至") related_persons: Optional[Dict[str, Any]] = Field(None, description="关联人员名单") class StreamerUpdate(BaseModel): """更新主播""" streamer_name: Optional[str] = None entity_type: Optional[str] = None phone_number: Optional[str] = None bank_account_no: Optional[str] = None bank_name: Optional[str] = None wechat_pay_account: Optional[str] = None alipay_account: Optional[str] = None douyin_account: Optional[str] = None mcn_agency_id: Optional[int] = None status: Optional[str] = None registration_date: Optional[date] = None id_card_no: Optional[str] = None social_security_no: Optional[str] = None unified_social_credit_code: Optional[str] = None tax_registration_no: Optional[str] = None legal_person_name: Optional[str] = None legal_person_id_card: Optional[str] = None registered_address: Optional[str] = None actual_address: Optional[str] = None kuaishou_account: Optional[str] = None xiaohongshu_account: Optional[str] = None weibo_account: Optional[str] = None bilibili_account: Optional[str] = None streamer_certificate_no: Optional[str] = None certificate_issuing_authority: Optional[str] = None certificate_issue_date: Optional[date] = None certificate_expiry_date: Optional[date] = None related_persons: Optional[Dict[str, Any]] = None class StreamerResponse(StreamerBase): """主播响应模型""" id: int streamer_id: str mcn_agency_name: Optional[str] = None created_at: datetime updated_at: Optional[datetime] = None class Config: from_attributes = True class StreamerDetailResponse(StreamerResponse): """主播详情响应模型""" id_card_no: Optional[str] = None social_security_no: Optional[str] = None unified_social_credit_code: Optional[str] = None tax_registration_no: Optional[str] = None legal_person_name: Optional[str] = None legal_person_id_card: Optional[str] = None registered_address: Optional[str] = None actual_address: Optional[str] = None kuaishou_account: Optional[str] = None xiaohongshu_account: Optional[str] = None weibo_account: Optional[str] = None bilibili_account: Optional[str] = None streamer_certificate_no: Optional[str] = None certificate_issuing_authority: Optional[str] = None certificate_issue_date: Optional[date] = None certificate_expiry_date: Optional[date] = None related_persons: Optional[Dict[str, Any]] = None class StreamerListResponse(BaseModel): """主播列表响应模型""" records: list[StreamerResponse] total: int page: int size: int class DataImportUploadRequest(BaseModel): """数据导入上传请求""" import_type: str = Field(..., description="导入类型:streamer, recharge, order, contract") mapping: Optional[Dict[str, str]] = Field(None, description="字段映射") class DataImportUploadResponse(BaseModel): """数据导入上传响应""" upload_id: str file_name: str file_size: int total_rows: int preview_data: list[Dict[str, Any]] field_mapping: Dict[str, str] class DataImportConfirmRequest(BaseModel): """数据导入确认请求""" upload_id: str = Field(..., description="上传ID") import_type: str = Field(..., description="导入类型") field_mapping: Dict[str, str] = Field(..., description="字段映射") options: Optional[Dict[str, Any]] = Field(None, description="导入选项") class DataImportConfirmResponse(BaseModel): """数据导入确认响应""" task_id: str total_rows: int success_rows: int failed_rows: int error_log: list[Dict[str, Any]] class DataImportHistoryResponse(BaseModel): """数据导入历史响应""" id: int import_type: str import_type_name: str file_name: str total_rows: int success_rows: int failed_rows: int status: str created_by: str created_at: datetime error_file_url: Optional[str] = None class DataImportHistoryListResponse(BaseModel): """数据导入历史列表响应""" records: list[DataImportHistoryResponse] total: int page: int size: int