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.time.LocalDateTime; // 如果需要反序列化为日期时间对象

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

    /**
     * erp子订单主键
     */
    @JsonProperty("rec_id")
    @NotNull // 必须
    private Integer recId;

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

    /**
     * erp内商品主键
     */
    @JsonProperty("spec_id")
    @NotNull // 必须
    private Integer specId;

    /**
     * 平台ID
     */
    @JsonProperty("platform_id")
    @NotNull // 必须
    private Integer platformId;

    /**
     * 原始子订单号
     */
    @JsonProperty("src_oid")
    @NotNull // 必须
    private String srcOid;

    /**
     * 平台货品ID
     */
    @JsonProperty("platform_goods_id")
    @NotNull // 必须
    private String platformGoodsId;

    /**
     * 平台商品ID
     */
    @JsonProperty("platform_spec_id")
    @NotNull // 必须
    private String platformSpecId;

    /**
     * 组合装ID，如果货品是由组合装拆分的，这里组合装ID
     */
    @JsonProperty("suite_id")
    @NotNull // 必须
    private Integer suiteId;

    /**
     * 区分子单拆分的唯一性标记，子单拆分时，单品明细都一致，用来区分子单的唯一性
     */
    @JsonProperty("flag")
    @NotNull // 必须
    private Integer flag;

    /**
     * 原始订单号
     */
    @JsonProperty("src_tid")
    @NotNull // 必须
    private String srcTid;

    /**
     * 是否是赠品 0非赠品 1自动赠送 2手工赠送 3回购自动送赠品  4前N有礼送赠品 6天猫优仓赠品 7淘宝CRM会员送赠
     */
    @JsonProperty("gift_type")
    @NotNull // 必须
    private Integer giftType;

    /**
     * 退款状态 0无退款,1取消退款,2已申请退款,3等待退货,4等待收货,5退款成功 6已关闭
     */
    @JsonProperty("refund_status")
    @NotNull // 必须
    private Integer refundStatus;

    /**
     * 担保方式 1担保 2非担保 3在线非担保
     */
    @JsonProperty("guarantee_mode")
    @NotNull // 必须
    private Integer guaranteeMode;

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

    /**
     * 关联发货
     */
    @JsonProperty("bind_oid")
    @NotNull // 必须
    private String bindOid;

    /**
     * 货品数量
     */
    @JsonProperty("num")
    @NotNull // 必须
    private BigDecimal num;

    /**
     * 销售单价，手工新建时使用货品属性中的“零售价”
     */
    @JsonProperty("price")
    @NotNull // 必须
    private BigDecimal price;

    /**
     * 实发数量,此数量为发货数量,删除操作等于将此值设置为0
     */
    @JsonProperty("actual_num")
    @NotNull // 必须
    private BigDecimal actualNum;

    /**
     * 无实际含义
     */
    @JsonProperty("refund_num")
    @NotNull // 必须
    private BigDecimal refundNum;

    /**
     * 成交价,原始单折扣及分摊之后的价格
     */
    @JsonProperty("order_price")
    @NotNull // 必须
    private BigDecimal orderPrice;

    /**
     * 进入ERP后再次调整的价格，默认值与order_price一致
     */
    @JsonProperty("share_price")
    @NotNull // 必须
    private BigDecimal sharePrice;

    /**
     * 手工调整价,正数为加价,负数为减价
     */
    @JsonProperty("adjust")
    @NotNull // 必须
    private BigDecimal adjust;

    /**
     * 总折扣金额
     */
    @JsonProperty("discount")
    @NotNull // 必须
    private BigDecimal discount;

    /**
     * 分摊后合计应收=share_price * num , share_price 是根据share_amount反推的,因此share_price可能有精度损失
     */
    @JsonProperty("share_amount")
    @NotNull // 必须
    private BigDecimal shareAmount;

    /**
     * 分摊邮费
     */
    @JsonProperty("share_post")
    @NotNull // 必须
    private BigDecimal sharePost;

    /**
     * 已支付金额
     */
    @JsonProperty("paid")
    @NotNull // 必须
    private BigDecimal paid;

    /**
     * 货品名称
     */
    @JsonProperty("goods_name")
    @NotNull // 必须
    private String goodsName;

    /**
     * 分类名称
     */
    @JsonProperty("class_name")
    @NotNull // 必须
    private String className;

    /**
     * 自定义属性2
     */
    @JsonProperty("prop2")
    @NotNull // 必须
    private String prop2;

    /**
     * 分销商id
     */
    @JsonProperty("tc_order_id")
    @NotNull // 必须
    private String tcOrderId;

    /**
     * 主条码
     */
    @JsonProperty("barcode")
    @NotNull // 必须
    private String barcode;

    /**
     * 货品id
     */
    @JsonProperty("goods_id")
    @NotNull // 必须
    private Integer goodsId;

    /**
     * 货品编号，代表货品(spu)所有属性的唯一编号，用于系统货品区分
     */
    @JsonProperty("goods_no")
    @NotNull // 必须
    private String goodsNo;

    /**
     * 规格名
     */
    @JsonProperty("spec_name")
    @NotNull // 必须
    private String specName;

    /**
     * 商家编码，代表单品(sku)所有属性的唯一编码，用于系统单品区分
     */
    @JsonProperty("spec_no")
    @NotNull // 必须
    private String specNo;

    /**
     * 规格码
     */
    @JsonProperty("spec_code")
    @NotNull // 必须
    private String specCode;

    /**
     * 组合装编码，代表组合装商品所有属性的唯一编码，用于系统组合装商品的区分
     */
    @JsonProperty("suite_no")
    @NotNull // 必须
    private String suiteNo;

    /**
     * 如果是组合装拆分的，此为组合装名称
     */
    @JsonProperty("suite_name")
    @NotNull // 必须
    private String suiteName;

    /**
     * 组合装数量
     */
    @JsonProperty("suite_num")
    @NotNull // 必须
    private BigDecimal suiteNum;

    /**
     * 组合装分摊后总价
     */
    @JsonProperty("suite_amount")
    @NotNull // 必须
    private BigDecimal suiteAmount;

    /**
     * 组合装优惠
     */
    @JsonProperty("suite_discount")
    @NotNull // 必须
    private BigDecimal suiteDiscount;

    /**
     * share_amount备份值,退款恢复使用,!可回收 目前会存放分销订单发货回传的分销价
     */
    @JsonProperty("share_amount2")
    @NotNull // 必须
    private BigDecimal shareAmount2;

    /**
     * 是否打印组合装 0:组合装明细/1:组合装以及明细/2:组合装
     */
    @JsonProperty("is_print_suite")
    @NotNull // 必须
    private Integer isPrintSuite;

    /**
     * 是否允许0成本
     */
    @JsonProperty("is_zero_cost")
    @NotNull // 必须
    private Integer isZeroCost; // tinyint(1)

    /**
     * 库存保留情况 0未保留（取消的订单或完成）1无库存记录 2未付款 3已保留待审核 4待发货 5预订单库存
     */
    @JsonProperty("stock_reserved")
    @NotNull // 必须
    private Integer stockReserved;

    /**
     * 平台已发货
     */
    @JsonProperty("is_consigned")
    @NotNull // 必须
    private Integer isConsigned;

    /**
     * 线上订单，标记是否打款
     */
    @JsonProperty("is_received")
    @NotNull // 必须
    private Integer isReceived;

    /**
     * 是否主子订单,为发货算法使用
     */
    @JsonProperty("is_master")
    @NotNull // 必须
    private Integer isMaster; // tinyint(1)

    /**
     * 平台货品名称
     */
    @JsonProperty("api_goods_name")
    @NotNull // 必须
    private String apiGoodsName;

    /**
     * 平台规格名称
     */
    @JsonProperty("api_spec_name")
    @NotNull // 必须
    private String apiSpecName;

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

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

    /**
     * 货品类别 1销售商品 2原材料 3包装 4周转材料5虚拟商品 0其它
     */
    @JsonProperty("goods_type")
    @NotNull // 必须
    private Integer goodsType;

    /**
     * 大件类型 0非大件 1普通大件 2独立大件
     */
    @JsonProperty("large_type")
    @NotNull // 必须
    private Integer largeType; // tinyint(1)

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

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

    /**
     * 订单内部来源1手机，2聚划算，4服务子订单，8家装，16二次付款，32开具电子发票，128指定批次，2048当日达，4096次日达，8192预计时效，262144天猫直送/唯品仓中仓，524288‘3PL时效/jitx’，2097152区域零售，4194304预售单，8388608周期购，16777216 同城购(淘宝)，268435456 物流升级，536870912 抖店抽奖订单
     */
    @JsonProperty("from_mask")
    @NotNull // 必须
    private Integer fromMask;

    /**
     * 类目id
     */
    @JsonProperty("cid")
    @NotNull // 必须
    private Integer cid;

    /**
     * 货品明细备注
     */
    @JsonProperty("remark")
    @NotNull // 必须
    private String remark;

    /**
     * 最后修改时间 时间格式：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("tax_rate")
    private BigDecimal taxRate; // 可选

    /**
     * 基本单位ID
     */
    @JsonProperty("base_unit_id")
    private Integer baseUnitId; // 可选

    /**
     * 基本单位名称
     */
    @JsonProperty("unit_name")
    private String unitName; // 可选

    /**
     * 交易流水单号 (请求参数src传为1时返回)
     */
    @JsonProperty("pay_id")
    private String payId; // 可选

    /**
     * 子单付款状态 0(未付款),1(部分付款),2(已付款) (请求参数src传为1时返回)
     */
    @JsonProperty("pay_status")
    private Integer payStatus; // 可选

    /**
     * 子单付款时间 时间格式：yyyy-MM-dd HH:mm:ss (请求参数src传为1时返回)
     */
    @JsonProperty("pay_time")
    private String payTime; // 可选, 或者 LocalDateTime payTime;
}
