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

326 lines
12 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.

"""
主播和MCN机构相关模型
"""
from datetime import date
from typing import Optional, TYPE_CHECKING
from sqlalchemy import (
Boolean,
Column,
Date,
DateTime,
ForeignKey,
Integer,
String,
Text,
JSON,
)
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.models.base import BaseModel
if TYPE_CHECKING:
from .user import User
class McnAgency(BaseModel):
"""
MCN机构表
"""
__tablename__ = "mcn_agency"
mcn_id: Mapped[str] = mapped_column(
String(50), unique=True, nullable=False, comment="MCN机构唯一标识"
)
mcn_name: Mapped[str] = mapped_column(
String(200), nullable=False, comment="MCN机构名称"
)
unified_social_credit_code: Mapped[str] = mapped_column(
String(18), unique=True, nullable=False, comment="统一社会信用代码"
)
tax_registration_no: Mapped[Optional[str]] = mapped_column(
String(30), nullable=True, comment="税务登记证号"
)
tax_authority_code: Mapped[Optional[str]] = mapped_column(
String(20), nullable=True, comment="主管税务机关代码"
)
tax_authority_name: Mapped[Optional[str]] = mapped_column(
String(200), nullable=True, comment="主管税务机关名称"
)
legal_person_name: Mapped[str] = mapped_column(
String(100), nullable=False, comment="法人姓名"
)
legal_person_id_card: Mapped[str] = mapped_column(
String(18), nullable=False, comment="法人身份证号"
)
registered_capital: Mapped[Optional[float]] = mapped_column(
nullable=True, comment="注册资本"
)
establishment_date: Mapped[Optional[date]] = mapped_column(
Date, nullable=True, comment="成立日期"
)
registered_address: Mapped[str] = mapped_column(
String(500), nullable=False, comment="注册地址"
)
actual_address: Mapped[Optional[str]] = mapped_column(
String(500), nullable=True, comment="实际经营地址"
)
business_scope: Mapped[Optional[Text]] = mapped_column(
Text, nullable=True, comment="经营范围"
)
mcn_type: Mapped[str] = mapped_column(
String(50),
nullable=False,
comment="MCN类型tip_based-打赏类ecommerce_based-带货类mixed-混合型",
)
streamer_count: Mapped[int] = mapped_column(
Integer, default=0, comment="签约主播数量"
)
annual_revenue: Mapped[float] = mapped_column(
default=0, comment="年度营业收入"
)
annual_tax_paid: Mapped[float] = mapped_column(
default=0, comment="年度应纳税额"
)
tax_burden_rate: Mapped[float] = mapped_column(
default=0, comment="税负率"
)
top_10_upstream_revenue: Mapped[float] = mapped_column(
default=0, comment="十大上游企业营业收入"
)
top_10_upstream_invoice_amount: Mapped[float] = mapped_column(
default=0, comment="十大上游企业开票金额"
)
contact_person: Mapped[Optional[str]] = mapped_column(
String(100), nullable=True, comment="联系人"
)
contact_phone: Mapped[Optional[str]] = mapped_column(
String(20), nullable=True, comment="联系电话"
)
contact_email: Mapped[Optional[str]] = mapped_column(
String(100), nullable=True, comment="联系邮箱"
)
bank_account_no: Mapped[str] = mapped_column(
String(50), nullable=False, comment="银行账号"
)
bank_name: Mapped[str] = mapped_column(
String(100), nullable=False, comment="开户银行"
)
status: Mapped[str] = mapped_column(
String(20),
default="active",
comment="状态active-活跃inactive-停用blacklist-黑名单",
)
risk_level: Mapped[Optional[str]] = mapped_column(
String(20), comment="风险等级high-高风险medium-中风险low-低风险"
)
# 关系
streamers: Mapped[list["StreamerInfo"]] = relationship(
"StreamerInfo", back_populates="mcn_agency"
)
class StreamerInfo(BaseModel):
"""
主播信息表
"""
__tablename__ = "streamer_info"
streamer_id: Mapped[str] = mapped_column(
String(50), unique=True, nullable=False, comment="主播唯一标识"
)
streamer_name: Mapped[str] = mapped_column(
String(100), nullable=False, comment="主播姓名/企业名称"
)
entity_type: Mapped[str] = mapped_column(
String(20),
nullable=False,
comment="主体类型individual-个人sole_proprietor-个体户enterprise-企业",
)
id_card_no: Mapped[Optional[str]] = mapped_column(
String(18), unique=True, nullable=True, comment="身份证号(个人)"
)
social_security_no: Mapped[Optional[str]] = mapped_column(
String(30), nullable=True, comment="社会保障号"
)
phone_number: Mapped[str] = mapped_column(
String(20), nullable=False, comment="手机号码"
)
unified_social_credit_code: Mapped[Optional[str]] = mapped_column(
String(18), nullable=True, comment="统一社会信用代码(企业/个体户)"
)
tax_registration_no: Mapped[Optional[str]] = mapped_column(
String(30), nullable=True, comment="税务登记证号"
)
legal_person_name: Mapped[Optional[str]] = mapped_column(
String(100), nullable=True, comment="法人姓名(企业)"
)
legal_person_id_card: Mapped[Optional[str]] = mapped_column(
String(18), nullable=True, comment="法人身份证号(企业)"
)
registered_address: Mapped[Optional[str]] = mapped_column(
String(500), nullable=True, comment="注册地址(企业)"
)
actual_address: Mapped[Optional[str]] = mapped_column(
String(500), nullable=True, comment="实际经营地址"
)
bank_account_no: Mapped[str] = mapped_column(
String(50), nullable=False, comment="银行账号"
)
bank_name: Mapped[str] = mapped_column(
String(100), nullable=False, comment="开户银行"
)
wechat_pay_account: Mapped[Optional[str]] = mapped_column(
String(50), nullable=True, comment="微信支付账号"
)
alipay_account: Mapped[Optional[str]] = mapped_column(
String(50), nullable=True, comment="支付宝账号"
)
douyin_account: Mapped[Optional[str]] = mapped_column(
String(100), nullable=True, comment="抖音账号"
)
kuaishou_account: Mapped[Optional[str]] = mapped_column(
String(100), nullable=True, comment="快手账号"
)
xiaohongshu_account: Mapped[Optional[str]] = mapped_column(
String(100), nullable=True, comment="小红书账号"
)
weibo_account: Mapped[Optional[str]] = mapped_column(
String(100), nullable=True, comment="微博账号"
)
bilibili_account: Mapped[Optional[str]] = mapped_column(
String(100), nullable=True, comment="B站账号"
)
streamer_certificate_no: Mapped[Optional[str]] = mapped_column(
String(50), nullable=True, comment="主播证书号"
)
certificate_issuing_authority: Mapped[Optional[str]] = mapped_column(
String(200), nullable=True, comment="证书颁发机构"
)
certificate_issue_date: Mapped[Optional[date]] = mapped_column(
Date, nullable=True, comment="证书颁发日期"
)
certificate_expiry_date: Mapped[Optional[date]] = mapped_column(
Date, nullable=True, comment="证书有效期至"
)
mcn_agency_id: Mapped[Optional[int]] = mapped_column(
Integer, ForeignKey("mcn_agency.id"), nullable=True, comment="所属MCN机构ID"
)
related_persons: Mapped[Optional[dict]] = mapped_column(
JSON, nullable=True, comment="关联人员名单JSON格式"
)
status: Mapped[str] = mapped_column(
String(20),
default="active",
comment="状态active-活跃inactive-停用blacklist-黑名单",
)
registration_date: Mapped[date] = mapped_column(
Date, default=date.today, comment="入驻时间"
)
# 关系
mcn_agency: Mapped[Optional[McnAgency]] = relationship(
"McnAgency", back_populates="streamers"
)
class PlatformRecharge(BaseModel):
"""
平台充值记录表
"""
__tablename__ = "platform_recharge"
recharge_id: Mapped[str] = mapped_column(
String(50), unique=True, nullable=False, comment="充值记录ID"
)
user_id: Mapped[str] = mapped_column(
String(50), nullable=False, comment="用户ID"
)
user_name: Mapped[Optional[str]] = mapped_column(
String(100), nullable=True, comment="用户昵称"
)
user_phone: Mapped[Optional[str]] = mapped_column(
String(20), nullable=True, comment="用户手机号"
)
recharge_amount: Mapped[float] = mapped_column(
nullable=False, comment="充值金额"
)
recharge_time: Mapped[Optional[DateTime]] = mapped_column(
DateTime(timezone=True), nullable=True, comment="充值时间"
)
payment_method: Mapped[str] = mapped_column(
String(50),
nullable=False,
comment="支付方式wechat-微信alipay-支付宝unionpay-银联applepay-苹果支付",
)
payment_channel: Mapped[Optional[str]] = mapped_column(
String(100), nullable=True, comment="支付渠道"
)
transaction_no: Mapped[str] = mapped_column(
String(100), nullable=False, comment="交易流水号"
)
platform_order_no: Mapped[str] = mapped_column(
String(100), nullable=False, comment="平台订单号"
)
currency_type: Mapped[str] = mapped_column(
String(10), default="CNY", comment="币种"
)
exchange_rate: Mapped[float] = mapped_column(
default=1.0000, comment="汇率"
)
actual_amount_cny: Mapped[float] = mapped_column(
nullable=False, comment="折算人民币金额"
)
recharge_type: Mapped[str] = mapped_column(
String(50),
default="normal",
comment="充值类型normal-正常activity-活动gift-赠送",
)
bonus_coins: Mapped[float] = mapped_column(
default=0, comment="赠送虚拟币"
)
total_coins: Mapped[float] = mapped_column(
nullable=False, comment="到账虚拟币"
)
is_first_recharge: Mapped[bool] = mapped_column(
default=False, comment="是否首充"
)
ip_address: Mapped[Optional[str]] = mapped_column(
String(50), nullable=True, comment="充值IP地址"
)
device_type: Mapped[Optional[str]] = mapped_column(
String(50), nullable=True, comment="设备类型iOSAndroidWeb"
)
device_id: Mapped[Optional[str]] = mapped_column(
String(100), nullable=True, comment="设备ID"
)
province: Mapped[Optional[str]] = mapped_column(
String(50), nullable=True, comment="省份"
)
city: Mapped[Optional[str]] = mapped_column(
String(50), nullable=True, comment="城市"
)
status: Mapped[str] = mapped_column(
String(20),
nullable=False,
comment="充值状态success-成功pending-处理中failed-失败refunded-已退款",
)
refund_amount: Mapped[float] = mapped_column(
default=0, comment="退款金额"
)
refund_time: Mapped[Optional[DateTime]] = mapped_column(
DateTime(timezone=True), nullable=True, comment="退款时间"
)
withdrawal_status: Mapped[str] = mapped_column(
String(20),
nullable=False,
comment="提现状态not_withdrawn-未提现withdrawn-已提现partial-部分提现",
)
withdrawn_amount: Mapped[float] = mapped_column(
default=0, comment="已提现金额"
)