Files
sixGuoDjango/wechat_数据库/支付数据库/商家转账数据库.py
T

81 lines
3.4 KiB
Python
Raw Normal View History

2026-08-02 14:07:04 +08:00
from django.db import models
from django.utils.translation import gettext_lazy as _
from uuid6 import uuid8
from wechat_数据库.用户数据库.小程序登陆用户 import models_app_name
from wechat_数据库.雪花算法.雪花算法工具 import generator
class WechatTransferOrder(models.Model):
"""
微信商家转账订单记录表
用于存储发起请求参数、微信返回的中间状态以及最终回调结果
"""
# === 核心业务字段 ===
# 商户单据号 (发起时生成,全局唯一)
class TransferOrderState(models.TextChoices):
"""
商家转账订单状态枚举
涵盖发起时的中间状态和回调时的终态
"""
# --- 中间状态 (非终态) ---
ACCEPTED = "ACCEPTED", _("已受理 (可原单重试)")
PROCESSING = "PROCESSING", _("资金锁定中")
WAIT_USER_CONFIRM = "WAIT_USER_CONFIRM", _("待用户确认")
TRANSFERING = "TRANSFERING", _("转账中")
CANCELING = "CANCELING", _("撤销中")
# --- 终态 ---
SUCCESS = "SUCCESS", _("转账成功")
FAIL = "FAIL", _("转账失败")
CANCELLED = "CANCELLED", _("已撤销")
id_主键_转账 = models.UUIDField(primary_key=True, default=uuid8, editable=True, )
id_str = models.CharField(max_length=128, default=generator.generate_str)
out_bill_no = models.CharField(max_length=120)
# 微信转账单号 (回调时返回,发起时可能为空或为预生成值)
transfer_bill_no = models.CharField(max_length=64, db_comment="微信转账单号", blank=True, null=True, )
# 订单状态
state = models.CharField(max_length=32, choices=TransferOrderState, )
# 转账金额 (单位:分)
transfer_amount = models.IntegerField(db_comment="转账金额(分)", )
# 收款用户 OpenID
openid = models.CharField(max_length=64, db_comment="收款用户OpenID", blank=True, null=True, )
# 商户号
mch_id = models.CharField(max_length=32, db_comment="商户号", blank=True, null=True, )
# === 异常与扩展字段 ===
# 失败原因 (仅在 state=FAIL 时有值)
fail_reason = models.CharField(max_length=128, db_comment="失败原因代码", blank=True, null=True, )
# 失败详细描述 (可选,如果需要存储更详细的错误信息)
fail_message = models.TextField(db_comment="失败详细描述", blank=True, null=True)
# 加密包信息 (发起时返回,用于特定场景下的重试或解密)
package_info = models.TextField(db_comment="加密包信息", blank=True, null=True, )
# === 时间字段 ===
# 微信返回的创建时间 (发起接口返回的 create_time)
wx_create_time = models.DateTimeField(db_comment="微信单据创建时间", null=True, blank=True)
# 微信返回的更新时间 (回调接口返回的 update_time)
wx_update_time = models.DateTimeField(db_comment="微信单据更新时间", null=True, blank=True)
# 业务创建时间 (本地记录创建时间)
created_at = models.DateTimeField(auto_now_add=True, db_comment="本地创建时间")
# 本地最后更新时间 (每次状态变更自动更新)
updated_at = models.DateTimeField(auto_now=True, db_comment="本地最后更新时间")
class Meta:
db_table = "WechatTransferOrder" # 给数据表自定义一个名称;默认的会是在 应用名+类名
# 联合索引优化查询:常按状态和创建时间查询
app_label = models_app_name