package com.yami.shop.bean.dto.hb;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单详细信息
 * 海博
 *
 * @author fbj
 * @version 1.0.0
 * @since 2025-09-29
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class CreateOrderRequest {

    /**
     *交互订单号，用于交互， 需保证商家级别唯一，不超过64位
     */
    private String channelOrderId;
    private String viewOrderId;

    /**
     * 订单状态：
     * 20：订单已接单（待拣货）
     * 30：订单待配送（拣货完成/自提类订单为待自提）
     * 40：订单配送中
     * 50：订单取消待审核
     * 60：订单已取消
     * 70：订单已送达
     * 80：订单已完成
     */
    private Integer orderStatus;

    /**
     * 门店当天订单流水号，每天从1开始，不可重复
     * 建议商家生成，如果商家不传值，则海博系统生成规则是按订单支付时间为准生成，
     * 商家门店渠道订单级唯一，同一个订单只会有一个小号
     * 注：商家不可仅对部分订单生成小号（商家统一生成或统一不生成），否则会出现乱序的问题
     */
    private Integer daySeq;

    /**
     * 商家门店编码
     */
    private String outStationNo;

    /**
     * 商家门店名称。如不传值，以海博系统配置为准, 长度不超过50
     */
    private String outStationName;

    /**
     * 订单备注信息, 长度不超过500
     * 订单备注 = #下单人手机号*订单备注
     * 样例：#13011112345*请尽快发货
     */
    private String caution;

    /**
     * 收件人姓名，长度不超过20
     */
    private String recipientName;

    /**
     * 收件人电话，有隐私号传隐私号，否则传真实手机号。长度不超过20
     */
    private String recipientPhone;

    /**
     * 收货地址纬度（火星系坐标）
     */
    private Double recipientLatitude;

    /**
     * 收货地址经度（火星系坐标）
     */
    private Double recipientLongitude;

    /**
     * 收货人地址，长度不超过255
     */
    private String recipientAddress;

    /**
     * 配送方式：
     * 10商家自送
     * 40用户自提
     * 80快递配送
     */
    private Integer logisticsType;


    /**
     * 运单号，快递单号。长度不超过50
     */
    private String carrierNo;

    /**
     * 骑士姓名，长度不超过20
     */
    private String logisticsDispatcherName;

    /**
     * 骑士电话，长度不超过20
     */
    private String logisticsDispatcherMobile;

    /**
     * 订单时效类型：
     * 0立即达
     * 2定时达
     */
    private Integer orderAgingType;

    /**
     * 配送小费（商家增加的配送小费）
     */
    private Long logisticsStationTips;

    /**
     * 订单接单时间，时间戳毫秒数。如未传值，按订单支付时间为准
     */
    private Long orderConfirmTime;

    /**
     * 配送预计开始时间，时间戳毫秒数。如未传值，按配送预计送达时间为准
     */
    private Long logisticsPreStartTime;

    /**
     * 配送预计送达时间，时间戳毫秒数
     */
    private Long logisticsPreEndTime;

    /**
     * 订单支付时间，时间戳毫秒数
     */
    private Long orderPayTime;

    /**
     * 实际拣货完成时间，时间戳毫秒数
     */
    private Long orderPickTime;

    /**
     * 预计拣货完成时间，时间戳毫秒数
     */
    private Long orderPickPreEndTime;

    /**
     * 商品出库时间，即发货时间，时间戳毫秒数
     */
    private Long orderOutStockTime;

    /**
     * 订单完成配送时间，时间戳毫秒数
     */
    private Long orderLogisticsEndTime;

    /**
     * 订单完成时间，时间戳毫秒数
     */
    private Long orderCompletedTime;

    /**
     * 订单取消时间，时间戳毫秒数
     */
    private Long orderCancelTime;

    /**
     * 订单取消原因备注，长度不超过255
     */
    private String orderCancelRemark;



    /**
     * 是否预售单：
     * 0：非预售单（默认）
     * 1：预售单
     * 只要有商品是预售，订单即为预售单
     */
    private Integer preSaleOrder;

    /**
     * 订单是否调整过：
     * 0：未调整（默认）
     * 1：已调整
     */
    private Integer adjusted;

    /**
     * 自提核验码（明文码），长度不超过50
     * 商家提供核验码时优先本地核验（不再请求商家核验接口）。建议商家提供核验接口。
     */
    private String selfPickCode;

    /**
     * 额外信息
     */
    private String extra;

    /**
     * 订单费用
     */
    private OrderFee orderFee;

    /**
     * 发票信息
     */
    private List<OrderInvoice> orderInvoices;

    /**
     * 订单商品明细
     */
    private List<OrderProduct> products;

    /**
     * 商品活动信息列表（非必传）
     */
    private List<ProductActivity> productActivities;

    /**
     * 订单支付方式列表
     */
    private List<OrderPayment> orderPayments;
}
