package com.sckw.transport.model.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.Digits;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

/**
 * @author lfdc
 * @desc 物流订单-分包托运-v4.2
 * @date 2024-03-05 14:03:45
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LogisticsOrderSubcontractDto implements Serializable {

    /**
     * 订单id-分包时要使用
     */
    @JsonProperty("lOrderId")
    private String lOrderId;

    /**
     * 订单编号-分包时要使用
     */
    @JsonProperty("lOrderNo")
    private String lOrderNo;

    /**
     * 订单类型-托运订单1-承运订单2
     */
    @NotBlank(message = "订单类型不能为空")
    private String type;

    /**
     * 托运单位
     */
    @NotNull(message = "托运单位名称不能为空")
    private String consignCompany;

    /**
     * 托运单位id
     */
    @NotNull(message = "托运单位id不能为空")
    private String consignCompanyId;

    /**
     * 托运联系电话
     */
    @NotNull(message = "托运联系电话不能为空")
    private String consignContactPhone;

    /**
     * 托运联系人
     */
    @NotNull(message = "托运联系人不能为空")
    private String consignContacts;

    /**
     * 托运联系人id
     */
    @NotNull(message = "托运联系人id不能为空")
    private String consignContactsId;

    /**
     * 托运单位
     */
    @NotBlank(message = "托运单位名称不能为空")
    private String checkCompany;

    /**
     * 托运单位id
     */
    @NotNull(message = "托运单位id不能为空")
    private String checkCompanyId;


    /**
     * 托运联系电话
     */
    @NotNull(message = "托运联系电话不能为空")
    private String checkContactPhone;

    /**
     * 托运联系人
     */
    @NotNull(message = "托运联系人不能为空")
    private String checkContacts;

    /**
     * 托运联系人id
     */
    @NotNull(message = "托运联系人id不能为空")
    private String checkContactsId;

    /**
     * 承运单位
     */
    @NotBlank(message = "承运单位不能为空")
    private String acceptCompany;

    /**
     * 承运单位ID
     */
    @NotBlank(message = "承运单位ID不能为空")
    private String acceptCompanyId;

    /**
     * 承运联系电话
     */
    @NotNull(message = "承运联系电话不能为空")
    private String acceptContactPhone;

    /**
     * 承运联系人
     */
    @NotNull(message = "承运联系人不能为空")
    private String acceptContacts;

    /**
     * 承运联系人id
     */
    @NotNull(message = "承运联系人id不能为空")
    private String acceptContactsId;

    /**
     * 货物id
     */
    //@NotNull(message = "货物id不能为空")
    private String goodsId;

    /**
     * 商品类型
     */
    private String goodsType;

    /**
     * 货物名称
     */
    @NotNull(message = "货物名称不能为空")
    private String goodsName;

    /**
     * skuId
     */
    private String skuId;

    /**
     * 结算周期(周结、月结、季结)
     */
    // @NotNull(message = "结算周期不能为空")
    private Long settlementCycle;

    /**
     * 税率
     */
    @NotNull(message = "税率不能为空")
    private Long taxRate;

    /**
     * 合同签约方式
     */
    @NotNull(message = "合同签约方式不能为空")
    private String payment;

    /**
     * 分配承运量使用的单位
     */
    private String carryingCapacityUnit;

    /**
     * 商品价值（扣亏货值）
     */
    // @NotNull(message = "扣亏货值不能为空")
    @Digits(integer = 5, fraction = 2,message = "商品价值（扣亏货值）格式填写错误")
    private BigDecimal goodsPrice;

    /**
     * 商品价值（扣亏货值）单位
     */
    private String goodsPriceUnit;

    /**
     * 合理损耗
     */
    // @NotNull(message = "合理损耗不能为空")
    @Digits(integer = 5, fraction = 2,message = "合理损耗格式填写错误")
    private BigDecimal loss;

    /**
     * 合理损耗单位
     */
    private String lossUnit;

    /**
     * 扣亏货值
     */
    @Digits(integer = 5,fraction = 2,message = "扣亏货值格式填写错误")
    private BigDecimal defectiveValue;

    /**
     * 计费方式
     */
    @NotNull(message = "计费方式不能为空")
    private String billingMode;

    /**
     * 是否全量
     */
    @NotNull(message = "是否全量不能为空")
    private Boolean isFullDose;

    /**
     * 运价
     */
    @NotNull(message = "运价不能为空")
    @Digits(integer = 5,fraction = 2,message = "运价格式填写错误!")
    private BigDecimal price;

    /**
     * 运价方式
     */
    @NotNull(message = "运价方式不能为空")
    private String priceType;

    /**
     *总量
     */
    private BigDecimal amount;

    /**
     * 分配承运量
     */
    @Digits(integer = 10,fraction = 2,message = "分配承运量填写错误")
    @DecimalMin(value = "0.00",message = "委托量不能小于{value}")
    private BigDecimal carryingCapacity;

    /**
     * 计划卸货日期
     */
    @NotNull(message = "计划卸货日期不能为空")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate startTime;

    /**
     * 计划发货日期
     */
    @NotNull(message = "计划发货日期不能为空")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endTime;

    /**
     * 合同id
     */
    @NotNull(message = "合同id不能为空")
    private String contractId;

    /**
     * 合同编号
     */
    @NotNull(message = "合同编号不能为空")
    private String contractNo;

    /**
     * 合同名称
     */
    @NotNull(message = "合同名称不能为空")
    private String contractName;

    /**
     * 备注
     */
    @Length(max = 200, message = "单据编号长度错误最大长度:{max}")
    private String remark;

    /**
     * 地址信息
     */
    @NotNull(message = "地址信息不能为空")
    @JsonProperty("addressInfo")
    private List<AddressInfoDto> addressInfo;

    /**
     * 线路分配
     */
    @JsonProperty("lineFreightList")
    private List<LineFreightDto> lineFreightList;
}
