package com.openhis.web.externalintegration.dto;

import org.hibernate.validator.constraints.Length;

import com.alibaba.fastjson2.annotation.JSONField;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 【BPC】交易请求
 *
 * @author Thanking
 * @date 2025-10-16
 */
@Data
@Accessors(chain = true)
public class BpcTransactionRequestDto {

    /**
     * 设备终端编号：设备的唯一编号（必填）
     */
    @Length(max = 10)
    @JSONField(name = "posNo")
    private String posNo;

    /**
     * 终端实时经纬度信息：（最新，甲方确认可以不传）tranType为C时必填，格式为为纬度/经度，+表示北纬、东经，-表示南纬、西 经。例：+37.12/-121.213。例：+37.12/-121.213
     */
    @Length(max = 30)
    @JSONField(name = "posGa")
    private String posGa;

    /**
     * 交易类型：（枚举TranType）
     */
    @Length(max = 1)
    @JSONField(name = "tranType")
    private String tranType;

    /**
     * 交易金额：以分为单位的交易金额
     */
    @Length(max = 12)
    @JSONField(name = "txnAmt")
    private String txnAmt;

    /**
     * 银行优惠金额：撤销、退货交易时填写原消费交易的优惠金额，可以不填
     */
    @Length(max = 12)
    @JSONField(name = "discountAmt")
    private String discountAmt;

    /**
     * 支付方式：（枚举PayType）当tranType为F时，payType不填写返回聚合码scanCode填写则返回订单数据payData（部分收单行支持）
     */
    @Length(max = 4)
    @JSONField(name = "payType")
    private String payType;

    /**
     * 二维码信息：被扫交易，采集到的手机支付二维码信息，主扫交易该字段为空
     */
    @Length(max = 64)
    @JSONField(name = "scanCode")
    private String scanCode;

    /**
     * 商户编号
     */
    @Length(max = 15)
    @JSONField(name = "mid")
    private String mid;

    /**
     * 终端编号（可以不填）
     */
    @Length(max = 8)
    @JSONField(name = "tid")
    private String tid;

    /**
     * 终端流水号：终端号系统跟踪号，从 000001 开始到 999999 循环，应答报文原值返回，客户端收到应答报文需要验证traceNo字段值，如果不一致则丢包交易失败
     */
    @Length(max = 6)
    @JSONField(name = "traceNo")
    private String traceNo;

    /**
     * 商品名称：自定义商品名称（可以不填，默认为“商品”）
     */
    @Length(max = 200)
    @JSONField(name = "goodsName")
    private String goodsName;

    /**
     * 原交易订单号：银行订单号（可以不填）
     */
    @Length(max = 64)
    @JSONField(name = "tradeNo")
    private String tradeNo;

    /**
     * 原交易日期时间：（yyyyMMddHHmmss）撤销、退货时填写原消费交易返回的时间日期
     */
    @Length(max = 14)
    @JSONField(name = "orgTxnTime")
    private String orgTxnTime;

    /**
     * 商户系统订单号：商户系统订单号，消费交易、定金交易，商户生成唯一订单号（如果不能生成，可以向扫码平台申请商户系统订单号）；支付结果查询、定金支付结果查询、消费撤销、
     * 消费撤销结果查询、退货交易需要传入原消费或定金交易商户系统订单号；退订、定金确认，填写原定金交易订单号；定金确认撤销、定金确认撤销结果查询，填写定金确认订单号
     */
    @Length(max = 64)
    @JSONField(name = "merTradeNo")
    private String merTradeNo;

    /**
     * 退款退订定金单号：商户系统退货、退订、定金确认订单号（如果不能生成，可以向扫码平台申请商户系统订单号）；退货结果查询、退订结果查询、定金确认查询，需要传入原商户系统退货单号
     */
    @Length(max = 64)
    @JSONField(name = "vfTradeNo")
    private String vfTradeNo;

    /**
     * 有效时间：主扫二维码有效时间（可以不填，部分收单行不支持）
     */
    @Length(max = 6)
    @JSONField(name = "qrValidTime")
    private String qrValidTime;

    /**
     * 通知URL：主扫交易延时响应时的交易结果通知URL（可以不填）
     */
    @Length(max = 256)
    @JSONField(name = "retUrl")
    private String retUrl;

    /**
     * 支付成功回调地址：主扫交易当使用微信和支付宝支付成功后，前端可通过此地址回调到商户提供的地址。注意：地址必须以 HTTP 或 HTTPS 开头，且 HTTPS 必须为颁发的有效证书。
     * 回调地址不支持换行符等不可见字符以及特殊字符（可以不填，部分收单行不支持）微信需要对接微信点金计划，详情请参考微信相关文档
     */
    @Length(max = 128)
    @JSONField(name = "callBackUrl")
    private String callBackUrl;

    /**
     * 商户应用ID：当tranType为F时，payType 值为ZFBA或WEIX时需填写
     */
    @Length(max = 32)
    @JSONField(name = "subAppId")
    private String subAppId;

    /**
     * 商户用户openId：当tranType为F时，payType 值为ZFBA或WEIX时需填写。当上送wxApiType字段时，可以不用填写。
     */
    @Length(max = 64)
    @JSONField(name = "subOpenId")
    private String subOpenId;

    /**
     * 微信API类型：当业务场景为微信APP支付时，填写固定值APP，其余交易不送该字段
     */
    @Length(max = 10)
    @JSONField(name = "wxApiType")
    private String wxApiType;

    /**
     * 收款方备注
     */
    @Length(max = 64)
    @JSONField(name = "txtRemarks")
    private String txtRemarks;

    /**
     * 实名标志：（枚举RealNameAuthFlag）
     */
    @Length(max = 1)
    @JSONField(name = "realNameAuth")
    private String realNameAuth;

    /**
     * 付款人姓名：当realNameAuth为1时必填
     */
    @Length(max = 64)
    @JSONField(name = "payerName")
    private String payerName;

    /**
     * 付款人身份证件类型：当realNameAuth为1时必填
     */
    @Length(max = 2)
    @JSONField(name = "payerIDType")
    private String payerIdType;

    /**
     * 付款人身份证件号码：当realNameAuth为1时必填
     */
    @Length(max = 20)
    @JSONField(name = "payerID")
    private String payerId;

    /**
     * 发起方IP地址：支持IPv6格式
     */
    @Length(max = 40)
    @JSONField(name = "IP")
    private String ip;

    /**
     * 终端类型：（枚举DeviceType）
     */
    @Length(max = 2)
    @JSONField(name = "deviceType")
    private String deviceType;

    /**
     * 银行卡号
     */
    @JSONField(name = "pan")
    private String pan;

}
