model.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. from datetime import datetime
  2. from decimal import Decimal
  3. from typing import Optional
  4. from sqlalchemy import DateTime, String, Text, JSON, Numeric, ForeignKey, Integer
  5. from sqlalchemy.orm import Mapped, mapped_column, relationship
  6. from app.core.base_model import PaymentModelMixin, TenantMixin, EnterpriseMixin
  7. from app.common.enums import PermissionFilterStrategy
  8. from .enums import (
  9. AccountSignStatusEnum,
  10. AccountStatusEnum,
  11. TransferStatusEnum,
  12. DepositStatusEnum,
  13. WithdrawStatusEnum,
  14. )
  15. class AccountModel(PaymentModelMixin, TenantMixin, EnterpriseMixin):
  16. """资金专户模型"""
  17. __tablename__ = "pay_account"
  18. __table_args__ = {"comment": "资金专户表"}
  19. __permission_strategy__ = PermissionFilterStrategy.ENTERPRISE_BASED
  20. account_book_id: Mapped[str | None] = mapped_column(
  21. String(64), unique=True, index=True, comment="资金专户号"
  22. )
  23. account_name: Mapped[str | None] = mapped_column(
  24. String(128), comment="账户名称"
  25. )
  26. account_type: Mapped[str | None] = mapped_column(
  27. String(32),
  28. default="ALL",
  29. comment="账户类型: INCOME/DISBURSE/ALL"
  30. )
  31. scene: Mapped[str] = mapped_column(
  32. String(32),
  33. default="B2B_TRANS",
  34. comment="应用场景码: ENT_CREDIT/B2B_TRANS"
  35. )
  36. sign_status: Mapped[str] = mapped_column(
  37. String(32),
  38. default=AccountSignStatusEnum.PENDING.value,
  39. comment="签约状态: PENDING/AUTHORIZED/AUTHORIZE_FAILED/UNAUTHORIZED"
  40. )
  41. sign_time: Mapped[datetime | None] = mapped_column(
  42. DateTime, comment="签约时间"
  43. )
  44. status: Mapped[str] = mapped_column(
  45. String(32),
  46. default=AccountStatusEnum.ACTIVE.value,
  47. comment="专户状态: ACTIVE/FROZEN/CLOSED"
  48. )
  49. remark: Mapped[str | None] = mapped_column(Text, comment="备注")
  50. class TransferModel(PaymentModelMixin, TenantMixin, EnterpriseMixin):
  51. """转账记录模型"""
  52. __tablename__ = "pay_transfer"
  53. __table_args__ = {"comment": "转账记录表"}
  54. __permission_strategy__ = PermissionFilterStrategy.ENTERPRISE_BASED
  55. out_biz_no: Mapped[str | None] = mapped_column(
  56. String(64), unique=True, index=True, comment="商家侧订单号"
  57. )
  58. account_book_id: Mapped[str | None] = mapped_column(
  59. String(64), comment="付款方资金专户号"
  60. )
  61. amount: Mapped[Decimal | None] = mapped_column(
  62. Numeric(12, 2), comment="转账金额"
  63. )
  64. order_title: Mapped[str | None] = mapped_column(
  65. String(64), comment="转账标题"
  66. )
  67. payee_info: Mapped[dict | None] = mapped_column(
  68. JSON, comment="收款方信息"
  69. )
  70. payee_type: Mapped[str | None] = mapped_column(
  71. String(32), index=True, comment="收款方类型: ALIPAY_ACCOUNT/BANK_CARD/BOOK"
  72. )
  73. status: Mapped[str] = mapped_column(
  74. String(32),
  75. default=TransferStatusEnum.DEALING.value,
  76. comment="转账状态: DEALING/SUCCESS/FAIL/REFUND"
  77. )
  78. order_no: Mapped[str | None] = mapped_column(
  79. String(64), comment="支付宝转账单号"
  80. )
  81. fund_order_id: Mapped[str | None] = mapped_column(
  82. String(64), comment="宝支付资金流水号"
  83. )
  84. error_code: Mapped[str | None] = mapped_column(
  85. String(64), comment="错误码"
  86. )
  87. error_msg: Mapped[str | None] = mapped_column(
  88. Text, comment="错误信息"
  89. )
  90. ext_info: Mapped[dict | None] = mapped_column(
  91. JSON, comment="扩展信息"
  92. )
  93. remark: Mapped[str | None] = mapped_column(Text, comment="备注")
  94. retry_count: Mapped[int] = mapped_column(
  95. Integer, default=0, nullable=False, server_default='0', comment="反查重试次数"
  96. )
  97. next_retry_at: Mapped[Optional[datetime]] = mapped_column(
  98. DateTime, nullable=True, comment="下次反查时间"
  99. )
  100. class DepositModel(PaymentModelMixin, TenantMixin, EnterpriseMixin):
  101. """充值记录模型"""
  102. __tablename__ = "pay_deposit"
  103. __table_args__ = {"comment": "充值记录表"}
  104. __permission_strategy__ = PermissionFilterStrategy.ENTERPRISE_BASED
  105. out_biz_no: Mapped[str | None] = mapped_column(
  106. String(64), unique=True, index=True, comment="商家侧订单号"
  107. )
  108. account_book_id: Mapped[str | None] = mapped_column(
  109. String(64), comment="资金专户号"
  110. )
  111. amount: Mapped[Decimal | None] = mapped_column(
  112. Numeric(12, 2), comment="充值金额"
  113. )
  114. url: Mapped[str | None] = mapped_column(
  115. Text, comment="充值确认页面URL"
  116. )
  117. status: Mapped[str] = mapped_column(
  118. String(32),
  119. default=DepositStatusEnum.DEALING.value,
  120. comment="充值状态: DEALING/SUCCESS/FAIL"
  121. )
  122. notify_content: Mapped[dict | None] = mapped_column(
  123. JSON, comment="通知内容原始数据"
  124. )
  125. remark: Mapped[str | None] = mapped_column(Text, comment="备注")
  126. class WithdrawModel(PaymentModelMixin, TenantMixin, EnterpriseMixin):
  127. """提现记录模型"""
  128. __tablename__ = "pay_withdraw"
  129. __table_args__ = {"comment": "提现记录表"}
  130. __permission_strategy__ = PermissionFilterStrategy.ENTERPRISE_BASED
  131. out_biz_no: Mapped[str | None] = mapped_column(
  132. String(64), unique=True, index=True, comment="商家侧订单号"
  133. )
  134. account_book_id: Mapped[str | None] = mapped_column(
  135. String(64), comment="资金专户号"
  136. )
  137. amount: Mapped[Decimal | None] = mapped_column(
  138. Numeric(12, 2), comment="提现金额"
  139. )
  140. status: Mapped[str] = mapped_column(
  141. String(32),
  142. default=WithdrawStatusEnum.DEALING.value,
  143. comment="提现状态: DEALING/SUCCESS/FAIL"
  144. )
  145. order_no: Mapped[str | None] = mapped_column(
  146. String(64), comment="支付宝提现单号"
  147. )
  148. notify_content: Mapped[dict | None] = mapped_column(
  149. JSON, comment="通知内容原始数据"
  150. )
  151. error_code: Mapped[str | None] = mapped_column(
  152. String(64), comment="错误码"
  153. )
  154. error_msg: Mapped[str | None] = mapped_column(
  155. Text, comment="错误信息"
  156. )
  157. remark: Mapped[str | None] = mapped_column(Text, comment="备注")