model.py 5.6 KB

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