""" 银行流水模型 """ from datetime import datetime from typing import Optional, TYPE_CHECKING from sqlalchemy import ( Boolean, Column, Date, DateTime, String, Text, Float, ) from sqlalchemy.orm import Mapped, mapped_column from app.models.base import BaseModel if TYPE_CHECKING: from .streamer import StreamerInfo, McnAgency class BankTransaction(BaseModel): """ 银行流水表 """ __tablename__ = "bank_transaction" transaction_id: Mapped[str] = mapped_column( String(50), unique=True, nullable=False, comment="流水ID" ) account_no: Mapped[str] = mapped_column( String(50), nullable=False, comment="账号" ) account_name: Mapped[str] = mapped_column( String(200), nullable=False, comment="账户名" ) bank_name: Mapped[str] = mapped_column( String(200), nullable=False, comment="开户行" ) transaction_date: Mapped[Date] = mapped_column( Date, nullable=False, comment="交易日期" ) transaction_time: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, comment="交易时间" ) transaction_type: Mapped[str] = mapped_column( String(20), nullable=False, comment="交易类型:debit-借方(支出),credit-贷方(收入)", ) transaction_amount: Mapped[float] = mapped_column( nullable=False, comment="交易金额" ) balance: Mapped[float] = mapped_column( nullable=False, comment="余额" ) counterparty_account_no: Mapped[Optional[str]] = mapped_column( String(50), nullable=True, comment="对手方账号" ) counterparty_account_name: Mapped[Optional[str]] = mapped_column( String(200), nullable=True, comment="对手方账户名" ) counterparty_bank_name: Mapped[Optional[str]] = mapped_column( String(200), nullable=True, comment="对手方开户行" ) voucher_no: Mapped[Optional[str]] = mapped_column( String(100), nullable=True, comment="凭证号" ) transaction_purpose: Mapped[Optional[str]] = mapped_column( String(500), nullable=True, comment="交易用途" ) is_cross_border: Mapped[bool] = mapped_column( default=False, comment="是否跨境" ) currency: Mapped[str] = mapped_column( String(10), default="CNY", comment="币种" ) amount_cny: Mapped[float] = mapped_column( nullable=False, comment="折算人民币金额" ) exchange_rate: Mapped[float] = mapped_column( default=1.0000, comment="汇率" ) is_large_amount: Mapped[bool] = mapped_column( default=False, comment="是否大额交易(>20万)" ) is_suspicious: Mapped[bool] = mapped_column( default=False, comment="是否可疑交易" ) suspicious_reason: Mapped[Optional[str]] = mapped_column( Text, nullable=True, comment="可疑原因" ) is_reconciled: Mapped[bool] = mapped_column( default=False, comment="是否已对账" ) reconciled_time: Mapped[Optional[datetime]] = mapped_column( DateTime(timezone=True), nullable=True, comment="对账时间" )