package cn.gov.customs.wxjy.analyze.pojo;

import cn.gov.customs.wxjy.common.annotation.Excel;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;

/**
 * @description 法检报关单表头
 * @author wangqian
 * @since 2025/11/4 上午10:16
 */
@Getter
@Setter
public class Entry implements Serializable {
  // 报关单号，18位，4位关区代码+4位年份+入境(1)/出境(0)+9位序列号
  private String id;

  // 报关单号，18位，4位关区代码+4位年份+入境(1)/出境(0)+9位序列号
  @Excel(name = "报关单号",sort=1)
  private String entryId;
  /** 维护状态 */
  private String mainStatus;

  /** 通关模式 */
  @Excel(name = "通关模式",dictType = "pass_mode",sort=2)
  private String passMode;

  // 运输方式 2：水运 3：铁路 4：公路 5：空运 6：邮件 9：其它
  @Excel(name = "运输方式",sort=3)
  private String trafMode;

  // 出入境标志 I：入境 E：出境
  @Excel(name = "出入境标志",dictType = "ie_flag",sort=4)
  private String ieFlag;

  // 进出境口岸：4位
  @Excel(name = "进出境口岸",sort=5)
  private String iePort;

  // 申报口岸：业务现场关区代码：4位
  private String declPort;

  // 所属海关：4位
  @Excel(name = "隶属海关",dictType = "affiliation_customs_info",sort=6)
  private String customsCode;

  // 货物运抵(进出口)时间
  @Excel(name = "进出口时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=7)
  private Date ieDate;

  // 申报时间
  @Excel(name = "申报时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=8)
  private Date declDate;

  /** 是否提前申报标记 */
  @Excel(name = "是否提前申报",dictType = "yes_no",sort=9)
  private String declAdvanceFlag;

  /** 自动受理时间 */
  @Excel(name = "自动受理时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=10)
  private Date acceptDate;

  // 自动受理时间：对应ENTRY_WORKFLOW表STEP_ID='10000000'节点
  // TODO
  // 注：(用户建议)对于提前申报的单子，由于货物出入境日期晚于申报日期，自动受理时间会早于货物出入境日期，这种情况将自动受理时间重新赋值为货物出入境日期
  @Excel(name = "货物进港时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=11)
  private Date exInPortDate;

  // 境内收发货人代码
  private String consignScc;
  @Excel(name = "境内收发货人代码",sort=12)
  private String consignCode;

  // 境内收发货人名称
  @Excel(name = "境内收发货人名称",sort=13)
  private String consignName;

  /**
   * 境外收发货人代码
   */
  @Excel(name = "境外收发货人代码",sort=14)
  private String frnConsignCode;
  /**
   * 境外收发货人名称(中文)
   */
  @Excel(name = "境外收发货人名称(中文)",sort=15)
  private String frnConsignName;

  // 监管方式
  @Excel(name = "监管方式",sort=16)
  private String tradeMode;

  // 贸易国别代码
  @Excel(name = "贸易国别",sort=17)
  private String tradeCountry;

  //货运量毛重
  @Excel(name = "货运量毛重",sort=18)
  private BigDecimal grossWt;

  //货运量净重
  @Excel(name = "货运量净重",sort=19)
  private BigDecimal netWt;

  /** 货运值人民币 */
  @Excel(name = "货运值人民币(总)",sort=20)
  private BigDecimal rmbPrice;

  /** 货运值美元 */
  @Excel(name = "货运值美元(总)",sort=21)
  private BigDecimal usdPrice;

  /** 集装箱数量 */
  private BigInteger container;

  // 报关模式（部分订单既是两步申报又是提前申报，做多两种模式所以该字段采用逗号存储，方便组合查询）：
  // 1：一般申报 2：两步申报3：提前申报
  @Excel(name = "报关模式",dictType = "decl_mode",sort=22)
  private String declMode;

  // 报关单状态 1：未放行 2：已放行未结关3：已结关
  private String declStatus;

  // 现场接单时间：对应ENTRY_WORKFLOW表STEP_ID='30000000'节点(只要PROC_RESULT为G的)
  @Excel(name = "现场接单时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=23)
  private Date orderReceiveDate;

  /** 接单耗时即单证审核时长(秒) */
  @Excel(name = "接单耗时(小时)",sort=24)
  private BigDecimal orderReceiveCost;

  // 单证放行时间：ENTRY_WORKFLOW '70000000'节点时间
  @Excel(name = "单证放行时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=25)
  private Date certRlsDate;

  // 担保放行时间：对应ENTRY_WORKFLOW表STEP_ID='81000000'节点
  @Excel(name = "担保放行时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=26)
  private Date preReleaseDate;

  // 申报单位代码
  @Excel(name = "申报单位代码",sort=27)
  private String agentCode;

  // 申报单位名称
  @Excel(name = "接单耗时(小时)",sort=28)
  private String agentName;


  // 货主单位代码/h2018生产销售单位代码
  @Excel(name = "生产销售单位代码",sort=29)
  private String ownerCode;

  // 货主单位名称/h2018生产销售单位名称
  @Excel(name = "生产销售单位名称",sort=30)
  private String ownerName;

  // 转关数据发送时间
  @Excel(name = "转关数据发送时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=31)
  private Date examDate;

  // 转关数据核销时间
  @Excel(name = "转关数据核销时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=32)
  private Date checkDate;

  // 完整申报电子申报时间
  @Excel(name = "完整申报电子申报时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=33)
  private Date compEleDate;

  // 结关时间
  @Excel(name = "结关时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=34)
  private Date releaseDate;

  /** 海关通关时间(秒) */
  @Excel(name = "海关通关时间(小时)",sort=35)
  private BigDecimal cuCost;

  /** 总体通关时间(秒) */
  @Excel(name = "整体通关时间(小时)",sort=36)
  private BigDecimal totalCost;

  /** 申报前准备时间(秒) */
  @Excel(name = "申报前准备时间(小时)",sort=37)
  private BigDecimal beforeDeclCost;

  // 报关单是否专业审单（环节代码33000000不为9999标记）：1-是，其它-否
  @Excel(name = "是否专业审单",dictType = "yes_no",sort=38)
  private String profVerifyFlag;

  // 报关单是否新两步申报标记：1-是，其它-否
  @Excel(name = "是否新两步申报",dictType = "yes_no",sort=39)
  private String newTwoStepFlag;

  //20250731新增业务
  //电子申报时间：对应ENTRY_WORKFLOW表STEP_ID='00000000'节点
  @Excel(name = "电子申报时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=40)
  private Date eleDeclDate;

  //排查处置/现场验估时间：对应ENTRY_WORKFLOW表STEP_ID='26000000'节点(只要PROC_RESULT为M的)
  @Excel(name = "现场验估时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=41)
  private Date assessStartDate;

  //验估处置完毕时间：对应ENTRY_WORKFLOW表STEP_ID='26000000'节点(只要PROC_RESULT为G的)
  @Excel(name = "验估处置完毕时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=42)
  private Date assessEndDate;

  /** 退单时间 */
  @Excel(name = "退单时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=43)
  private Date refundDate;

  /** 是否退过单标记 */
  private String refundFlag;

  // 是否查验：1：是，0：否
  @Excel(name = "是否查验",dictType = "yes_no",sort=44)
  private String checkFlag;

  // 查验关区：4位
  @Excel(name = "是否查验",dictType = "affiliation_customs_info",sort=45)
  private String checkCustomsCode;

  // 查验指令下达时间：来源CI_CHECK_MAN_WORK_HEAD(对接物流辅助系统进口理货时间和指令下达时间哪个晚哪个就是下发时间)
  @Excel(name = "查验指令下达时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=46)
  private Date manCreateTime;

  // 查验开始时间：来源CI_CHECK_MAN_WORK_HEAD
  @Excel(name = "查验开始时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=47)
  private Date manChkTimeStart;


  // 查验结束时间：来源CI_CHECK_MAN_WORK_HEAD
  @Excel(name = "查验结束时间",dateFormat = "yyyy-MM-dd HH:mm:ss",sort=48)
  private Date manChkTimeEnd;

  // 处理结果
  @Excel(name = "查验处理结果",dictType = "proc_result",sort=49)
  private String manProcResult;

  // 处理意见
  @Excel(name = "查验处理意见",dictType = "proc_idea",sort=50)
  private String manProcIdea;

  // 备注
  @Excel(name = "备注",sort=51)
  private String noteS;

  // 商品序号
  @Excel(name = "商品序号",sort=52)
  private BigDecimal gno;

  //按综合处杨科要求在新组合查询功能新增根据商品名称模糊查询
  @Excel(name = "商品编码",sort=53)
  private String codeTs;

  /**
   * 检验检疫编码
   */
  @Excel(name = "检验检疫编码",sort=53)
  private String iqCode;

  //按综合处杨科要求在新组合查询功能新增根据商品名称模糊查询    wq
  @Excel(name = "商品名称",sort=54)
  private String gname;

  @Excel(name = "规格型号",sort=55)
  private String gmodel;

  //第一（法定）数量
  @Excel(name = "第一(法定)数量",sort=56)
  private BigDecimal qty1;

  // 货运值人民币
  @Excel(name = "货运值人民币",sort=57)
  private BigDecimal rmbPriceList;

  // 货运值美元
  @Excel(name = "货运值美元",sort=58)
  private BigDecimal usdPriceList;

  //六位商品编码  2024-10-16
  private String codeTsShort;

  //每项商品需要监管证件
  @Excel(name = "每项商品需要监管证件",sort=59)
  private String gCertFlag;

  /**
   * UN编码
   */
  @Excel(name = "UN编码",sort=60)
  private String ungid;

  /**
   * 非危险化学品
   */
  @Excel(name = "非危险化学品",dictType = "yes_no",sort=61)
  private String ungFlag;
  /**
   * 危包规格
   */
  @Excel(name = "危包规格",sort=62)
  private String ungModel;
  /**
   * 危包类别
   */
  @Excel(name = "危包类别",sort=63)
  private String ungClassify;

  /**
   * 危险货物名称
   */
  @Excel(name = "危险货物名称",sort=64)
  private String ungGName;
  /**
   * 货物属性代码
   */
  @Excel(name = "货物属性代码",sort=64)
  private String productCharCode;

  /**
   * 危险品类型（1、危化品；2、危险货物；3、危化品兼危险货物）
   */
  @Excel(name = "危险品类型",sort=65)
  private String goodsType;
}
