deep-risk/backend/app/schemas/streamer.py
2025-12-14 20:08:27 +08:00

242 lines
9.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
主播相关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