from datetime import datetime from sqlalchemy import DateTime, String, Text, JSON, Numeric, ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from app.core.base_model import PaymentModelMixin, TenantMixin, EnterpriseMixin from app.common.enums import PermissionFilterStrategy from .enums import ( AccountSignStatusEnum, AccountStatusEnum, TransferStatusEnum, DepositStatusEnum, WithdrawStatusEnum, ) class AccountModel(PaymentModelMixin, TenantMixin, EnterpriseMixin): """资金专户模型""" __tablename__ = "pay_account" __table_args__ = {"comment": "资金专户表"} __permission_strategy__ = PermissionFilterStrategy.ENTERPRISE_BASED account_book_id: Mapped[str | None] = mapped_column( String(64), unique=True, index=True, comment="资金专户号" ) account_name: Mapped[str | None] = mapped_column( String(128), comment="账户名称" ) account_type: Mapped[str | None] = mapped_column( String(32), default="ALL", comment="账户类型: INCOME/DISBURSE/ALL" ) scene: Mapped[str] = mapped_column( String(32), default="B2B_TRANS", comment="应用场景码: ENT_CREDIT/B2B_TRANS" ) sign_status: Mapped[str] = mapped_column( String(32), default=AccountSignStatusEnum.PENDING.value, comment="签约状态: PENDING/AUTHORIZED/AUTHORIZE_FAILED/UNAUTHORIZED" ) sign_time: Mapped[datetime | None] = mapped_column( DateTime, comment="签约时间" ) status: Mapped[str] = mapped_column( String(32), default=AccountStatusEnum.ACTIVE.value, comment="专户状态: ACTIVE/FROZEN/CLOSED" ) remark: Mapped[str | None] = mapped_column(Text, comment="备注") class TransferModel(PaymentModelMixin, TenantMixin, EnterpriseMixin): """转账记录模型""" __tablename__ = "pay_transfer" __table_args__ = {"comment": "转账记录表"} __permission_strategy__ = PermissionFilterStrategy.ENTERPRISE_BASED out_biz_no: Mapped[str | None] = mapped_column( String(64), unique=True, index=True, comment="商家侧订单号" ) account_book_id: Mapped[str | None] = mapped_column( String(64), comment="付款方资金专户号" ) amount: Mapped[float | None] = mapped_column( Numeric(12, 2), comment="转账金额" ) order_title: Mapped[str | None] = mapped_column( String(64), comment="转账标题" ) payee_info: Mapped[dict | None] = mapped_column( JSON, comment="收款方信息" ) status: Mapped[str] = mapped_column( String(32), default=TransferStatusEnum.DEALING.value, comment="转账状态: DEALING/SUCCESS/FAIL/REFUND" ) order_no: Mapped[str | None] = mapped_column( String(64), comment="支付宝转账单号" ) fund_order_id: Mapped[str | None] = mapped_column( String(64), comment="宝支付资金流水号" ) error_code: Mapped[str | None] = mapped_column( String(64), comment="错误码" ) error_msg: Mapped[str | None] = mapped_column( Text, comment="错误信息" ) ext_info: Mapped[dict | None] = mapped_column( JSON, comment="扩展信息" ) remark: Mapped[str | None] = mapped_column(Text, comment="备注") class DepositModel(PaymentModelMixin, TenantMixin, EnterpriseMixin): """充值记录模型""" __tablename__ = "pay_deposit" __table_args__ = {"comment": "充值记录表"} __permission_strategy__ = PermissionFilterStrategy.ENTERPRISE_BASED out_biz_no: Mapped[str | None] = mapped_column( String(64), unique=True, index=True, comment="商家侧订单号" ) account_book_id: Mapped[str | None] = mapped_column( String(64), comment="资金专户号" ) amount: Mapped[float | None] = mapped_column( Numeric(12, 2), comment="充值金额" ) url: Mapped[str | None] = mapped_column( Text, comment="充值确认页面URL" ) status: Mapped[str] = mapped_column( String(32), default=DepositStatusEnum.DEALING.value, comment="充值状态: DEALING/SUCCESS/FAIL" ) notify_content: Mapped[dict | None] = mapped_column( JSON, comment="通知内容原始数据" ) remark: Mapped[str | None] = mapped_column(Text, comment="备注") class WithdrawModel(PaymentModelMixin, TenantMixin, EnterpriseMixin): """提现记录模型""" __tablename__ = "pay_withdraw" __table_args__ = {"comment": "提现记录表"} __permission_strategy__ = PermissionFilterStrategy.ENTERPRISE_BASED out_biz_no: Mapped[str | None] = mapped_column( String(64), unique=True, index=True, comment="商家侧订单号" ) account_book_id: Mapped[str | None] = mapped_column( String(64), comment="资金专户号" ) amount: Mapped[float | None] = mapped_column( Numeric(12, 2), comment="提现金额" ) status: Mapped[str] = mapped_column( String(32), default=WithdrawStatusEnum.DEALING.value, comment="提现状态: DEALING/SUCCESS/FAIL" ) order_no: Mapped[str | None] = mapped_column( String(64), comment="支付宝提现单号" ) notify_content: Mapped[dict | None] = mapped_column( JSON, comment="通知内容原始数据" ) error_code: Mapped[str | None] = mapped_column( String(64), comment="错误码" ) error_msg: Mapped[str | None] = mapped_column( Text, comment="错误信息" ) remark: Mapped[str | None] = mapped_column(Text, comment="备注")