81 lines
3.4 KiB
Python
81 lines
3.4 KiB
Python
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
|