package com.spot.dto.mq;

import lombok.Data;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 订单消息DTO，用于现货 API → 撮合引擎的 MQ 通信
 * 仅接受状态 0（初始化）和 5（撤单中）的订单
 *
 * @author jean
 * @date 2026-05-06
 */
@Data
public class OrderMessage implements Serializable {

    private static final long serialVersionUID = 1L;

    /** 订单ID */
    private Long id;

    /** 用户ID */
    private Integer userId;

    /** 交易对（如：BTCUSDT） */
    private String symbol;

    /** 买卖方向：BUY/SELL */
    private String side;

    /** 限价单委托价格 */
    private BigDecimal price;

    /** 委托总数量 */
    private BigDecimal volume;

    /** 挂单手续费率（Maker） */
    private Double feeRateMaker;

    /** 吃单手续费率（Taker） */
    private Double feeRateTaker;

    /** 手续费 */
    private BigDecimal fee;

    /** 支付手续费币种折扣，0为关闭该币种支付手续费 */
    private Double feeCoinRate;

    /** 累计成交数量 */
    private BigDecimal dealVolume;

    /** 累计成交金额 */
    private BigDecimal dealMoney;

    /** 成交均价 */
    private BigDecimal avgPrice;

    /**
     * 订单状态：只接受 0-init，5-pending_cancel
     * @see com.spot.enums.OrderStatus
     */
    private Integer status;

    /**
     * 委托类型：1-限价单，2-市价单，3-止损单
     * @see com.spot.enums.OrderType
     */
    private Integer type;

    /** 创建时间 */
    private LocalDateTime ctime;

    /** 更新时间 */
    private LocalDateTime mtime;

    /** 订单来源：1-web，2-app，3-api */
    private Integer source;

    /** 订单类型：1-常规订单，2-杠杆订单 */
    private Integer orderType;

    /** 退回数量（剩余数量过小时退回用户） */
    private BigDecimal refundVolume = BigDecimal.ZERO;

    /** 消息时间戳（毫秒，用于追踪） */
    private Long timestamp;

    /** 消息ID（用于幂等性检查） */
    private String messageId;
}
