package com.fs.erp.dto.wdt;

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

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
// import java.time.LocalDateTime; // 如果需要反序列化为日期时间对象

/**
 * ERP 旺店通 订单信息 DTO.
 * 代表单个订单的详细信息。
 *
 * @author xdd
 * @version 1.0
 * @since 2025-02-27
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ErpWdtTradeInfo {

    /**
     * erp订单表的主键
     */
    @JsonProperty("trade_id")
    @NotNull // 必须
    private Integer tradeId;

    /**
     * 订单编号，系统订单编号，默认单号为JY开头，ERP内支持自定义订单编号生成规则（设置路径：设置——编码设置）
     */
    @JsonProperty("trade_no")
    @NotNull // 必须
    private String tradeNo;

    /**
     * 平台ID，响应值为代表平台的ID数字，ID对应的平台名称单击这里
     */
    @JsonProperty("platform_id")
    @NotNull // 必须
    private Integer platformId;

    /**
     * 店铺平台ID，响应值为代表平台的ID数字，ID对应的平台名称单击这里
     */
    @JsonProperty("shop_platform_id")
    @NotNull // 必须
    private Integer shopPlatformId;

    /**
     * 店铺编号，代表店铺所有属性的唯一编码，用于店铺区分，ERP内支持自定义（ERP店铺界面设置）
     */
    @JsonProperty("shop_no")
    @NotNull // 必须
    private String shopNo;

    /**
     * 店铺名称
     */
    @JsonProperty("shop_name")
    @NotNull // 必须
    private String shopName;

    /**
     * 店铺备注
     */
    @JsonProperty("shop_remark")
    @NotNull // 必须
    private String shopRemark;

    /**
     * 仓库类型（0不限 1普通仓库 2自动流传外部 3京东仓储 4科捷 5百世物流 6SKU360 7通天晓 8中联网仓 9顺丰仓储 10网仓2号 11奇门仓储 12旺店通仓储 13心怡仓储 14力威仓储 15京东沧海 16云集仓储 17POS 18虎符 20外部链路型 22抖店云仓 126分销委外仓 127其它）
     */
    @JsonProperty("warehouse_type")
    @NotNull // 必须
    private Integer warehouseType;

    /**
     * 仓库编号，代表仓库所有属性的唯一编码，用于仓库区分，ERP内支持自定义（ERP仓库界面设置）（根据编号可查询仓库名称）
     */
    @JsonProperty("warehouse_no")
    @NotNull // 必须
    private String warehouseNo;

    /**
     * 原始单号，商城或电商平台的订单编号,合并订单的多个订单编号有逗号隔开
     */
    @JsonProperty("src_tids")
    @NotNull // 必须
    private String srcTids;

    /**
     * 订单状态 5已取消 10待付款 12待尾款 13待选仓 15等未付16延时审核 19预订单前处理 20前处理(赠品，合并，拆分)21委外前处理22抢单前处理 25预订单 27待抢单 30待客审 35待财审 40待递交仓库 45递交仓库中 50已递交仓库 53未确认 55已确认（已审核）90发货中  95已发货 105部分打款 110已完成 113异常发货
     */
    @JsonProperty("trade_status")
    @NotNull // 必须
    private Integer tradeStatus;

    /**
     * 发货状态，出库状态：0表示无出库状态，1验货 2称重 4出库 8物流同步16分拣 32档口  64拣货 128供销回传成功  256供销回传失败（注意：如果是3，则表示完成了验货和称重“1+2”，如果是15，则表示四个过程都完成了“1+2+4+8”，其他数字以此类推）
     */
    @JsonProperty("consign_status")
    @NotNull // 必须
    private Integer consignStatus;

    /**
     * 订单类型 1网店销售 2线下零售 3售后换货 4批发业务 5保修换新 6保修完成 7订单补发 8供销补发   101自定义类型1 102自定义类型2 103自定义类型3 104自定义类型4 105自定义类型5 106自定义类型6 107自定义属性7 108自定义属性8
     */
    @JsonProperty("trade_type")
    @NotNull // 必须
    private Integer tradeType;

    /**
     * 发货条件 1款到发货 2货到付款(包含部分货到付款)，4挂账
     */
    @JsonProperty("delivery_term")
    @NotNull // 必须
    private Integer deliveryTerm;

    /**
     * 冻结原因
     */
    @JsonProperty("freeze_reason")
    @NotNull // 必须
    private Integer freezeReason;

    /**
     * 退款状态 0无退款 1申请退款 2部分退款 3全部退款 4未付款关闭或手工关闭
     */
    @JsonProperty("refund_status")
    @NotNull // 必须
    private Integer refundStatus;

    /**
     * 分销类别 0非分销订单 1转供销 2代销 3经销
     */
    @JsonProperty("fenxiao_type")
    @NotNull // 必须
    private Integer fenxiaoType;

    /**
     * 分销商信息，不同平台单据分销商会存不同格式情况，具体以返回信息为准
     */
    @JsonProperty("fenxiao_nick")
    @NotNull // 必须
    private String fenxiaoNick;

    /**
     * 下单时间 时间格式：yyyy-MM-dd HH:mm:ss
     */
    @JsonProperty("trade_time")
    @NotNull // 必须
    private String tradeTime; // 或者 LocalDateTime tradeTime; 并配置Jackson

    /**
     * 付款时间 时间格式：yyyy-MM-dd HH:mm:ss
     */
    @JsonProperty("pay_time")
    @NotNull // 必须
    private String payTime; // 或者 LocalDateTime payTime; 并配置Jackson

    /**
     * 客户名称
     */
    @JsonProperty("customer_name")
    @NotNull // 必须
    private String customerName;

    /**
     * 客户编码
     */
    @JsonProperty("customer_no")
    @NotNull // 必须
    private String customerNo;

    /**
     * 买家付款账号
     */
    @JsonProperty("pay_account")
    @NotNull // 必须
    private String payAccount;

    /**
     * 客户网名
     */
    @JsonProperty("buyer_nick")
    @NotNull // 必须
    private String buyerNick;

    /**
     * 收件人
     */
    @JsonProperty("receiver_name")
    @NotNull // 必须
    private String receiverName;

    /**
     * 收件人的省份,按照城市代码表中对应城市代码进行返回
     */
    @JsonProperty("receiver_province")
    @NotNull // 必须
    private Integer receiverProvince;

    /**
     * 收件人的城市,按照城市代码表中对应城市代码进行返回
     */
    @JsonProperty("receiver_city")
    @NotNull // 必须
    private Integer receiverCity;

    /**
     * 收件人的地区,按照城市代码表中对应城市代码进行返回
     */
    @JsonProperty("receiver_district")
    @NotNull // 必须
    private Integer receiverDistrict;

    /**
     * 地址
     */
    @JsonProperty("receiver_address")
    @NotNull // 必须
    private String receiverAddress;

    /**
     * 手机
     */
    @JsonProperty("receiver_mobile")
    @NotNull // 必须
    private String receiverMobile;

    /**
     * 电话
     */
    @JsonProperty("receiver_telno")
    @NotNull // 必须
    private String receiverTelno;

    /**
     * 收件人邮编
     */
    @JsonProperty("receiver_zip")
    @NotNull // 必须
    private String receiverZip;

    /**
     * 省市县空格分隔
     */
    @JsonProperty("receiver_area")
    @NotNull // 必须
    private String receiverArea;

    /**
     * 收件人区域
     */
    @JsonProperty("receiver_ring")
    @NotNull // 必须
    private String receiverRing;

    /**
     * 大头笔
     */
    @JsonProperty("receiver_dtb")
    @NotNull // 必须
    private String receiverDtb;

    /**
     * 派送时间 如周一至周五，上午
     */
    @JsonProperty("to_deliver_time")
    @NotNull // 必须
    private String toDeliverTime;

    /**
     * 异常订单(bit位)， 2地址变化 8仓库变化 16客服备注变化 128拦截赠品 64退款 2048买家留言发生变更
     */
    @JsonProperty("bad_reason")
    @NotNull // 必须
    private Integer badReason;

    /**
     * 物流公司ID（系统自增主键id）
     */
    @JsonProperty("logistics_id")
    @NotNull // 必须
    private Integer logisticsId;

    /**
     * 物流公司名称
     */
    @JsonProperty("logistics_name")
    @NotNull // 必须
    private String logisticsName;

    /**
     * 物流公司编号，代表物流所有属性的唯一编码，用于物流区分，ERP内支持自定义（ERP物流界面设置）
     */
    @JsonProperty("logistics_code")
    @NotNull // 必须
    private String logisticsCode;

    /**
     * 物流方式，响应值为代表物流方式的数字，数字对应的物流方式名称单击这里
     */
    @JsonProperty("logistics_type")
    @NotNull // 必须
    private Integer logisticsType;

    /**
     * 物流单号
     */
    @JsonProperty("logistics_no")
    @NotNull // 必须
    private String logisticsNo;

    /**
     * 店铺id，店铺列表主键
     */
    @JsonProperty("shop_id")
    @NotNull // 必须
    private Integer shopId;

    /**
     * 仓库ID
     */
    @JsonProperty("warehouse_id")
    @NotNull // 必须
    private Integer warehouseId;

    /**
     * 审核步骤，用于多级审核,特殊值：-100根据预售策略自动转入特殊单，-101人工转入
     */
    @JsonProperty("check_step")
    @NotNull // 必须
    private Integer checkStep;

    /**
     * 未合并标记,1有未付款订单,2有同名未合并订单
     */
    @JsonProperty("unmerge_mask")
    @NotNull // 必须
    private Integer unmergeMask;

    /**
     * 延迟处理，延时此进一步处理，等未付或延时审核 激活时间 秒级时间戳格式返回
     */
    @JsonProperty("delay_to_time")
    @NotNull // 必须
    private String delayToTime; // 通常是 Long 类型的时间戳，但描述是 varchar，保持 String

    /**
     * 客户类型 0普通客户1经销商
     */
    @JsonProperty("customer_type")
    @NotNull // 必须
    private Integer customerType;

    /**
     * 买家ID
     */
    @JsonProperty("customer_id")
    @NotNull // 必须
    private String customerId; // 描述是 varchar(11)

    /**
     * 收件人国家
     */
    @JsonProperty("receiver_country")
    @NotNull // 必须
    private Integer receiverCountry;

    /**
     * 预配送时间，配送中心,未使用
     */
    @JsonProperty("pre_charge_time")
    @NotNull // 必须
    private String preChargeTime;

    /**
     * 是否京配(为1时,只能发京邦达）
     */
    @JsonProperty("is_prev_notify")
    @NotNull // 必须
    private Integer isPrevNotify;

    /**
     * 便签条数
     */
    @JsonProperty("note_count")
    @NotNull // 必须
    private Integer noteCount;

    /**
     * 买家留言条数
     */
    @JsonProperty("buyer_message_count")
    @NotNull // 必须
    private Integer buyerMessageCount;

    /**
     * 客服备注条数
     */
    @JsonProperty("cs_remark_count")
    @NotNull // 必须
    private Integer csRemarkCount;

    /**
     * 客服备注变化 0,未变化1平台变化,2手工修改,4发票手工修改
     */
    @JsonProperty("cs_remark_change_count")
    @NotNull // 必须
    private Integer csRemarkChangeCount;

    /**
     * 优惠变化金额,更新货品和数量
     */
    @JsonProperty("discount_change")
    @NotNull // 必须
    private BigDecimal discountChange;

    /**
     * 客户使用的预存款
     */
    @JsonProperty("trade_prepay")
    @NotNull // 必须
    private BigDecimal tradePrepay;

    /**
     * 分期付款金额
     */
    @JsonProperty("pi_amount")
    @NotNull // 必须
    private BigDecimal piAmount;

    /**
     * 其它成本(目前用作记录货到付款单据的物流佣金）
     */
    @JsonProperty("other_cost")
    @NotNull // 必须
    private BigDecimal otherCost;

    /**
     * 体积（单位：cm³）
     */
    @JsonProperty("volume")
    @NotNull // 必须
    private BigDecimal volume;

    /**
     * 销售积分,未使用
     */
    @JsonProperty("sales_score")
    @NotNull // 必须
    private String salesScore; // varchar(11)

    /**
     * 背景色标记id
     */
    @JsonProperty("flag_id")
    @NotNull // 必须
    private Integer flagId;

    /**
     * 不可合并拆分
     */
    @JsonProperty("is_sealed")
    @NotNull // 必须
    private Integer isSealed; // tinyint(1)

    /**
     * 赠品标记1已处理过赠品,但没有匹配任何策略2自动赠送4手工赠送6即有自动也有手工
     */
    @JsonProperty("gift_mask")
    @NotNull // 必须
    private Integer giftMask;

    /**
     * 拆分订单，原单ID，用于避免自动合并,大件拆分为（原订单的id值），自动拆分为负值（原订单的-id值）
     */
    @JsonProperty("split_from_trade_id")
    @NotNull // 必须
    private String splitFromTradeId; // varchar(11)

    /**
     * 物流单模板ID，未使用
     */
    @JsonProperty("logistics_template_id")
    @NotNull // 必须
    private String logisticsTemplateId; // varchar(11)

    /**
     * 发货单模板id，未使用
     */
    @JsonProperty("sendbill_template_id")
    @NotNull // 必须
    private String sendbillTemplateId; // varchar(11)

    /**
     * 驳回原因
     */
    @JsonProperty("revert_reason")
    @NotNull // 必须
    private Integer revertReason;

    /**
     * 取消原因
     */
    @JsonProperty("cancel_reason")
    @NotNull // 必须
    private Integer cancelReason;

    /**
     * 催未付款订单消息发送标记
     */
    @JsonProperty("is_unpayment_sms")
    @NotNull // 必须
    private Integer isUnpaymentSms; // tinyint(1)

    /**
     * 包装id
     */
    @JsonProperty("package_id")
    @NotNull // 必须
    private String packageId; // varchar(11)

    /**
     * 订单标记位 1使用智选物流 2 航空禁运 4 预订单自动转审核失败 8 预占用待发货库存 16 订单货品指定批次 32 自动流转仓库 64 部分发货 128 全部发货 256 已发过签收消息 512 大单锁定仓库 1024 人工转入预订单 2048因配置先占用待发货库存 4096 顺丰前置发货 8192订单批量合并后标记 16384 达到原始单最大合并限制 32768 物流升级原始单指定物流订单 65536 BIC订单标记 131072 标记货品指定物流 3554432前N有礼订单 67108864预售下沉
     */
    @JsonProperty("trade_mask")
    @NotNull // 必须
    private String tradeMask; // varchar(11)，虽然是位标记，但类型是varchar

    /**
     * 保留
     */
    @JsonProperty("reserve")
    @NotNull // 必须
    private String reserve;

    /**
     * 大件类型，包含大件类型，1普通套件2独立套件3分组单发,未使用-1非单发件 取子单中的最大值
     */
    @JsonProperty("large_type")
    @NotNull // 必须
    private Integer largeType;

    /**
     * 买家留言
     */
    @JsonProperty("buyer_message")
    @NotNull // 必须
    private String buyerMessage;

    /**
     * 客服备注
     */
    @JsonProperty("cs_remark")
    @NotNull // 必须
    private String csRemark;

    /**
     * 标旗 0至5对应的标旗颜色依次为灰（无标旗）、红、黄、绿、蓝、紫
     */
    @JsonProperty("remark_flag")
    @NotNull // 必须
    private String remarkFlag;

    /**
     * 打印备注
     */
    @JsonProperty("print_remark")
    @NotNull // 必须
    private String printRemark;

    /**
     * 货品种类数
     */
    @JsonProperty("goods_type_count")
    @NotNull // 必须
    private Integer goodsTypeCount;

    /**
     * 货品总数
     */
    @JsonProperty("goods_count")
    @NotNull // 必须
    private BigDecimal goodsCount;

    /**
     * 货品总额（未扣除优惠），sum（share_amount+discount）所得
     */
    @JsonProperty("goods_amount")
    @NotNull // 必须
    private BigDecimal goodsAmount;

    /**
     * 邮费
     */
    @JsonProperty("post_amount")
    @NotNull // 必须
    private BigDecimal postAmount;

    /**
     * 其它费用，其它从买家的收费（非订单支付金额以及服务费），从原始订单列表继承
     */
    @JsonProperty("other_amount")
    @NotNull // 必须
    private BigDecimal otherAmount;

    /**
     * 订单优惠，系统子订单“优惠”求合所得
     */
    @JsonProperty("discount")
    @NotNull // 必须
    private BigDecimal discount;

    /**
     * 应收金额，系统订单的（“货品总额”+“邮资”-“折扣”）所得
     */
    @JsonProperty("receivable")
    @NotNull // 必须
    private BigDecimal receivable;

    /**
     * 款到发货金额,paid>=dap_amount才可发货
     */
    @JsonProperty("dap_amount")
    @NotNull // 必须
    private BigDecimal dapAmount;

    /**
     * COD金额，货到付款订单金额，系统子订单的（“分摊后总价”+“分摊邮费”-“已付”）再求和
     */
    @JsonProperty("cod_amount")
    @NotNull // 必须
    private BigDecimal codAmount;

    /**
     * 买家COD费用，货到付款非订单金额，从原始订单继承
     */
    @JsonProperty("ext_cod_fee")
    @NotNull // 必须
    private BigDecimal extCodFee;

    /**
     * 货款预估成本
     */
    @JsonProperty("goods_cost")
    @NotNull // 必须
    private BigDecimal goodsCost;

    /**
     * 预估邮费成本
     */
    @JsonProperty("post_cost")
    @NotNull // 必须
    private BigDecimal postCost;

    /**
     * 已付金额，系统子订单“已付”求合所得
     */
    @JsonProperty("paid")
    @NotNull // 必须
    private BigDecimal paid;

    /**
     * 预估重量（单位：kg）
     */
    @JsonProperty("weight")
    @NotNull // 必须
    private BigDecimal weight;

    /**
     * 预估毛利
     */
    @JsonProperty("profit")
    @NotNull // 必须
    private BigDecimal profit;

    /**
     * 税额
     */
    @JsonProperty("tax")
    @NotNull // 必须
    private BigDecimal tax;

    /**
     * 税率
     */
    @JsonProperty("tax_rate")
    @NotNull // 必须
    private BigDecimal taxRate;

    /**
     * 佣金
     */
    @JsonProperty("commission")
    @NotNull // 必须
    private BigDecimal commission;

    /**
     * 发票类别 0 不需要，1普通发票，2增值普通税发票，3增值专用税发票
     */
    @JsonProperty("invoice_type")
    @NotNull // 必须
    private Integer invoiceType;

    /**
     * 发票抬头
     */
    @JsonProperty("invoice_title")
    @NotNull // 必须
    private String invoiceTitle;

    /**
     * 发票内容
     */
    @JsonProperty("invoice_content")
    @NotNull // 必须
    private String invoiceContent;

    /**
     * 业务员ID
     */
    @JsonProperty("salesman_id")
    @NotNull // 必须
    private Integer salesmanId;

    /**
     * 审核员工ID
     */
    @JsonProperty("checker_id")
    @NotNull // 必须
    private Integer checkerId;

    /**
     * 业务员姓名
     */
    @JsonProperty("fullname")
    @NotNull // 必须
    private String fullname;

    /**
     * 审核员工姓名
     */
    @JsonProperty("checker_name")
    @NotNull // 必须
    private String checkerName;

    /**
     * 财审操作员ID
     */
    @JsonProperty("fchecker_id")
    @NotNull // 必须
    private Integer fcheckerId;

    /**
     * 签出员工id
     */
    @JsonProperty("checkouter_id")
    @NotNull // 必须
    private Integer checkouterId;

    /**
     * 出库单号,内部或外部仓库的订单号
     */
    @JsonProperty("stockout_no")
    @NotNull // 必须
    private String stockoutNo;

    /**
     * 背景色标记名称
     */
    @JsonProperty("flag_name")
    @NotNull // 必须
    private String flagName;

    /**
     * 订单来源 1API抓单，2手工建单 3excel导入 4现款销售
     */
    @JsonProperty("trade_from")
    @NotNull // 必须
    private Integer tradeFrom;

    /**
     * 货品商家编码
     */
    @JsonProperty("single_spec_no")
    @NotNull // 必须
    private String singleSpecNo;

    /**
     * 原始货品数量
     */
    @JsonProperty("raw_goods_count")
    @NotNull // 必须
    private BigDecimal rawGoodsCount;

    /**
     * 原始货品种类数
     */
    @JsonProperty("raw_goods_type_count")
    @NotNull // 必须
    private Integer rawGoodsTypeCount;

    /**
     * 币种
     */
    @JsonProperty("currency")
    @NotNull // 必须
    private String currency;

    /**
     * 已拆分包裹数
     */
    @JsonProperty("split_package_num")
    @NotNull // 必须
    private Integer splitPackageNum;

    /**
     * 发票ID，0表示未开发票，＞0表示已开发票
     */
    @JsonProperty("invoice_id")
    @NotNull // 必须
    private Integer invoiceId;

    /**
     * 订单每修改一次，版本号做一次变更
     */
    @JsonProperty("version_id")
    @NotNull // 必须
    private Integer versionId;

    /**
     * 最后修改时间 时间格式：yyyy-MM-dd HH:mm:ss
     */
    @JsonProperty("modified")
    @NotNull // 必须
    private String modified; // 或者 LocalDateTime modified;

    /**
     * 系统单生成时间 时间格式：yyyy-MM-dd HH:mm:ss
     */
    @JsonProperty("created")
    @NotNull // 必须
    private String created; // 或者 LocalDateTime created;

    /**
     * 证件类别
     */
    @JsonProperty("id_card_type")
    @NotNull // 必须
    private Integer idCardType;

    /**
     * 证件号码，仅返回自有平台、线下平台订单
     */
    @JsonProperty("id_card")
    @NotNull // 必须
    private String idCard;

    /**
     * 财审人名称
     */
    @JsonProperty("fchecker_name")
    @NotNull // 必须
    private String fcheckerName;

    /**
     * 签出人名称
     */
    @JsonProperty("checkouter_name")
    @NotNull // 必须
    private String checkouterName;

    /**
     * 冻结原因名称
     */
    @JsonProperty("freeze_reason_info")
    @NotNull // 必须
    private String freezeReasonInfo;

    /**
     * 分销原始单号
     */
    @JsonProperty("fenxiao_tid")
    @NotNull // 必须
    private String fenxiaoTid;

    /**
     * 订单标签/异常id，具体标签/异常名称查询，需使用查询标签/异常名称接口
     */
    @JsonProperty("tags")
    @NotNull // 必须
    private String tags;

    /**
     * 货品列表节点，响应参数的2级数据节点，包含系统订单货品明细所有属性信息的数据节点
     */
    @JsonProperty("goods_list")
    @NotNull // 必须
    private List<ErpWdtGoodsInfo> goodsList;

}
