from datetime import datetime from decimal import Decimal from sqlalchemy import JSON, DateTime, String, Text, Boolean, Numeric from sqlalchemy.orm import Mapped, mapped_column from app.core.base_model import PaymentModelMixin, TenantMixin, EnterpriseMixin from app.common.enums import PermissionFilterStrategy class AlipayNotifyLogModel(PaymentModelMixin): """支付宝通知日志模型""" __tablename__ = "pay_alipay_notify_log" __table_args__ = {"comment": "支付宝通知日志表"} notify_id: Mapped[str | None] = mapped_column( String(50), nullable=False, comment="通知ID" ) msg_method: Mapped[str] = mapped_column( String(100), nullable=False, comment="消息接口名称" ) notify_type: Mapped[str | None] = mapped_column( String(100), comment="通知类型" ) message: Mapped[dict] = mapped_column( JSON, nullable=False, comment="完整的消息数据" ) verify_result: Mapped[bool] = mapped_column( Boolean, nullable=False, comment="验签结果" ) process_result: Mapped[bool | None] = mapped_column( Boolean, comment="处理结果" ) error: Mapped[str | None] = mapped_column( Text, comment="错误信息" ) received_at: Mapped[datetime] = mapped_column( DateTime, default=datetime.now, nullable=False, comment="接收时间" ) class PayBillModel(PaymentModelMixin, TenantMixin, EnterpriseMixin): """账单主表""" __tablename__ = "pay_bill" __table_args__ = {"comment": "企业码账单表"} __permission_strategy__ = PermissionFilterStrategy.ENTERPRISE_BASED pay_no: Mapped[str] = mapped_column( String(64), unique=True, index=True, comment="支付宝账单号" ) account_id: Mapped[str] = mapped_column(String(64), comment="共同账户ID") employee_id: Mapped[str] = mapped_column(String(64), comment="员工ID") consume_type: Mapped[str] = mapped_column( String(32), comment="账单类型: CONSUME/REFUND/TRANSFER" ) consume_amount: Mapped[Decimal] = mapped_column( Numeric(12, 2), comment="账单金额" ) gmt_biz_create: Mapped[datetime] = mapped_column( DateTime, comment="账单创建时间" ) gmt_recieve_pay: Mapped[datetime | None] = mapped_column( DateTime, comment="支付时间" ) peer_pay_amount: Mapped[Decimal | None] = mapped_column( Numeric(12, 2), comment="企业代付金额" ) notify_reason: Mapped[str] = mapped_column(String(255), comment="通知原因") notify_msg: Mapped[str | None] = mapped_column(Text, comment="通知描述") related_pay_no: Mapped[str | None] = mapped_column( String(64), comment="关联账单号" ) expense_rule_group_id: Mapped[str | None] = mapped_column( String(64), comment="费控规则ID" ) expense_scene_code: Mapped[str | None] = mapped_column( String(32), comment="费用场景" ) expense_type: Mapped[str | None] = mapped_column( String(64), comment="费用类型" ) status: Mapped[str] = mapped_column( String(32), default="NEW", comment="状态: NEW/PROCESSED/FAILED" ) ext_infos: Mapped[dict | None] = mapped_column(JSON, comment="扩展信息") class PayBillOrderModel(PaymentModelMixin, TenantMixin, EnterpriseMixin): """订单明细表""" __tablename__ = "pay_bill_order" __table_args__ = {"comment": "账单订单明细表"} __permission_strategy__ = PermissionFilterStrategy.ENTERPRISE_BASED pay_no: Mapped[str] = mapped_column( String(64), index=True, comment="关联账单号" ) order_no: Mapped[str] = mapped_column( String(64), unique=True, index=True, comment="支付宝订单号" ) trade_no: Mapped[str | None] = mapped_column( String(64), comment="支付宝交易号" ) product_code: Mapped[str | None] = mapped_column( String(64), comment="产品码" ) order_title: Mapped[str | None] = mapped_column( String(255), comment="订单标题" ) order_amount: Mapped[Decimal | None] = mapped_column( Numeric(12, 2), comment="订单金额" ) order_status: Mapped[str | None] = mapped_column( String(32), comment="订单状态" ) merchant_name: Mapped[str | None] = mapped_column( String(255), comment="商户名称" ) merchant_id: Mapped[str | None] = mapped_column( String(64), comment="商户ID" ) shop_name: Mapped[str | None] = mapped_column( String(255), comment="门店名称" ) gmt_payment: Mapped[datetime | None] = mapped_column( DateTime, comment="支付时间" ) fund_channel: Mapped[str | None] = mapped_column( String(64), comment="资金渠道" ) class PayBillVoucherModel(PaymentModelMixin, TenantMixin, EnterpriseMixin): """凭证信息表""" __tablename__ = "pay_bill_voucher" __table_args__ = {"comment": "账单凭证信息表"} __permission_strategy__ = PermissionFilterStrategy.ENTERPRISE_BASED pay_no: Mapped[str] = mapped_column( String(64), index=True, comment="关联账单号" ) voucher_id: Mapped[str] = mapped_column( String(64), index=True, comment="凭证ID" ) voucher_type: Mapped[str | None] = mapped_column( String(32), comment="凭证类型" ) voucher_status: Mapped[str | None] = mapped_column( String(32), comment="凭证状态" ) invoice_code: Mapped[str | None] = mapped_column( String(64), comment="发票代码" ) invoice_no: Mapped[str | None] = mapped_column( String(64), comment="发票号码" ) invoice_amount: Mapped[Decimal | None] = mapped_column( Numeric(12, 2), comment="发票金额" ) tax_amount: Mapped[Decimal | None] = mapped_column( Numeric(12, 2), comment="税额" ) issue_date: Mapped[datetime | None] = mapped_column( DateTime, comment="开票日期" ) check_code: Mapped[str | None] = mapped_column( String(64), comment="校验码" ) pdf_url: Mapped[str | None] = mapped_column(Text, comment="PDF下载地址")