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