242 lines
9.1 KiB
Python
242 lines
9.1 KiB
Python
"""
|
||
主播相关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
|