package com.yolo.keyboard.dal.dataobject.tenantwithdraworder;

import com.yolo.keyboard.framework.tenant.core.aop.TenantIgnore;
import lombok.*;

import java.math.BigDecimal;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.yolo.keyboard.framework.mybatis.core.dataobject.BaseDO;

/**
 * 租户提现订单表（申请-审核-打款-完成/失败） DO
 *
 * @author ziin
 */
@TableName("system_tenant_withdraw_order")
@KeySequence("system_tenant_withdraw_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库，可不写。
@Data
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TenantIgnore
public class KeyboardTenantWithdrawOrderDO {

    /**
     * 主键
     */
    @TableId
    private Long id;
    /**
     * 提现单号（业务唯一）
     */
    private String withdrawNo;
    /**
     * 业务幂等号（防重复提交）
     */
    private String bizNo;
    /**
     * 币种（默认 CNY）
     */
    private String currency;
    /**
     * 提现申请金额（单位：元）
     */
    private BigDecimal amount;
    /**
     * 手续费金额（单位：元）
     */
    private BigDecimal feeAmount;
    /**
     * 实际到账金额（单位：元 = amount - fee_amount）
     */
    private BigDecimal actualAmount;
    /**
     * 打款渠道：BANK/ALIPAY/WECHAT/PAYPAL 等
     */
    private String payChannel;
    /**
     * 收款方类型：PERSON（个人）/COMPANY（企业）
     */
    private String payeeType;
    /**
     * 收款人姓名或公司名称（快照）
     */
    private String payeeName;
    /**
     * 收款账号（银行卡/支付宝等，建议加密或脱敏）
     */
    private String payeeAccount;
    /**
     * 收款银行名称
     */
    private String payeeBankName;
    /**
     * 银行编码（可选）
     */
    private String payeeBankCode;
    /**
     * 银行支行名称（可选）
     */
    private String payeeBankBranch;
    /**
     * 提现状态：APPLIED/APPROVED/REJECTED/PAYING/PAID/FAILED/CANCELED
     */
    private String status;
    /**
     * 审核状态：PENDING/PASSED/REJECTED
     */
    private String auditStatus;
    /**
     * 拒绝原因或打款失败原因
     */
    private String reason;
    /**
     * 提现申请时间
     */
    private LocalDateTime applyTime;
    /**
     * 审核完成时间
     */
    private LocalDateTime auditTime;
    /**
     * 发起打款时间（请求第三方）
     */
    private LocalDateTime payTime;
    /**
     * 打款成功时间（第三方确认）
     */
    private LocalDateTime paidTime;
    /**
     * 业务终态时间（成功/失败/取消）
     */
    private LocalDateTime finishTime;
    /**
     * 打款批次号（内部使用）
     */
    private String payerBatchNo;
    /**
     * 第三方打款交易号/流水号（对账用）
     */
    private String channelTradeNo;
    /**
     * 第三方返回的原始报文（用于排查）
     */
    private Object channelRaw;
    /**
     * 关联余额流水ID（冻结/扣减/返还）
     */
    private Long balanceTxnId;
    /**
     * 乐观锁版本号
     */
    @Version
    private Integer version;
    /**
     * 提现申请人ID
     */
    private Long creatorId;
    /**
     * 审核人ID
     */
    private Long auditorId;
    /**
     * 打款操作人ID
     */
    private Long payerId;
    /**
     * 创建时间
     */
    private LocalDateTime createdAt;
    /**
     * 更新时间
     */
    private LocalDateTime updatedAt;

    private Long tenantId;
}