package cn.gov.customs.data.entity.wxjy.bus;

import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;

/**
 * 报关单表头用于统计用的副本新维度中间表
 * 
 * @author YJL
 * @Aug 20, 2019
 */
@Entity
@Data
@Table(name = "WXJY_ENTRY_HEAD")
public class EntryHead implements Serializable {
	private static final long serialVersionUID = 6122282857637625069L;

	// 报关单号，18位，4位关区代码+4位年份+入境(1)/出境(0)+9位序列号
	@Id
	@Column(name = "ENTRY_ID", length = 20)
	private String entryId;
	
	// 维护状态 1：维护完成所有字段。其它值都表示还未维护完
	// 定时任务根据此值来查询还需要维护哪些报关单的相关数据
	// TODO 若每日定时任务只维护头一天结关的数据，那么该字段可以忽略
	@Column(name = "MAIN_STATUS", length = 1)
	private String mainStatus;

	// （额外维护属性）通关模式： 1：一体化通关 2：口岸清关（直接进出口）3：转关
	@Column(name = "PASS_MODE", length = 1, nullable = false)
	private String passMode;

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

	// 出入境标志 I：入境 E：出境
	@Column(name = "I_E_FLAG", length = 1, nullable = false)
	private String ieFlag;

	// 进出境口岸：4位
	@Column(name = "I_E_PORT", length = 10)
	private String iePort;

	// 申报口岸：业务现场关区代码：4位
	@Column(name = "DECL_PORT", length = 10)
	private String declPort;

	// 所属海关：4位
	@Column(name = "CUSTOMS_CODE", length = 10)
	private String customsCode;

	// 货物运抵(进出口)时间
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "I_E_DATE")
	private Date ieDate;
	
	// 申报时间
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DECL_DATE")
	private Date declDate;

	// 报关单是否提前申报标记：1-是，其它-否
	// TODO 由于出入境报关单第一个时间点目前不精准，无法赋值
	@Column(name = "DECL_ADVANCE_FLAG", length = 1)
	private String declAdvanceFlag;

	// 自动受理时间：对应ENTRY_WORKFLOW表STEP_ID='10000000'节点
	// TODO
	// 注：(用户建议)对于提前申报的单子，由于货物出入境日期晚于申报日期，自动受理时间会早于货物出入境日期，这种情况将自动受理时间重新赋值为货物出入境日期
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "ACCEPT_DATE")
	private Date acceptDate;
	
	// 出境报关单-货物进港时间(暨货物抵达海关监管场所时间/运抵时间)。出境类型报关单的申报前准备时间大致是申报时间-货物进港时间，同入境的不同
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "EX_IN_PORT_DATE")
	private Date exInPortDate;

	// ========2019.11.11起 增加字段
	// 境内收发货人代码
	@Column(name = "CONSIGN_SCC", length = 18)
	private String consignScc;

	@Column(name = "CONSIGN_CODE", length = 10)
	private String consignCode;

	// 境内收发货人名称
	@Column(name = "CONSIGN_NAME", length = 256)
	private String consignName;

	/**
	 * 境外收发货人代码
	 */
	@Column(name = "FRN_CONSIGN_CODE", length = 10)
	private String frnConsignCode;
	/**
	 * 境外收发货人名称(中文)
	 */
	@Column(name = "FRN_CONSIGN_NAME", length = 256)
	private String frnConsignName;
	
	// 监管方式
	@Column(name = "TRADE_MODE", length = 4)
	private String tradeMode;

	// 贸易国别代码
	@Column(name = "TRADE_COUNTRY", length = 3)
	private String tradeCountry;
	
	//货运量毛重
	@Column(name = "GROSS_WT", precision = 19, scale = 5)
	private BigDecimal grossWt;
	
	//货运量净重
	@Column(name = "NET_WT", precision = 19, scale = 5)
	private BigDecimal netWt;
	
	// 货运值人民币
	@Column(name = "RMB_PRICE", precision = 19)
	private BigDecimal rmbPrice;

	// 货运值美元
	@Column(name = "USD_PRICE", precision = 19)
	private BigDecimal usdPrice;
	
	// 集装箱数量
	@Column(name = "CONTAINER", precision = 19)
	private BigInteger container;

	// 报关模式（部分订单既是两步申报又是提前申报，做多两种模式所以该字段采用逗号存储，方便组合查询）：
	// 1：一般申报 2：两步申报3：提前申报
	@Column(name = "DECL_MODE", length = 10)
	private String declMode;
	
	// 报关单状态 1：未放行 2：已放行未结关3：已结关
	@Column(name = "DECL_STATUS", length = 10)
	private String declStatus;
	
	// 现场接单时间：对应ENTRY_WORKFLOW表STEP_ID='30000000'节点(只要PROC_RESULT为G的)
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "ORDER_RECEIVE_DATE")
	private Date orderReceiveDate;

	// 接单耗时即单证审核时长(秒)：30000000-10000000
	@Column(name = "ORDER_RECEIVE_COST", precision = 19)
	private Long orderReceiveCost;
	
	// 单证放行时间：ENTRY_WORKFLOW '70000000'节点时间
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "CERT_RLS_DATE")
	private Date certRlsDate;
	
	// 担保放行时间：对应ENTRY_WORKFLOW表STEP_ID='81000000'节点
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "PRE_RELEASE_DATE")
	private Date preReleaseDate;
	
	// 申报单位代码
	@Column(name = "AGENT_CODE", length = 10)
	private String agentCode;

	// 申报单位名称
	@Column(name = "AGENT_NAME", length = 256)
	private String agentName;
	
	// 备注
	@Column(name = "NOTE_S", length = 512)
	private String noteS;
	
	// 货主单位代码/h2018生产销售单位代码
	@Column(name = "OWNER_CODE", length = 10)
	private String ownerCode;

	// 货主单位名称/h2018生产销售单位名称
	@Column(name = "OWNER_NAME", length = 256)
	private String ownerName;
	
	// 转关数据发送时间（仅入境转关单有值）
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "EXAM_DATE")
	private Date examDate;

	// 转关数据核销时间（仅入境转关单有值）
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "CHECK_DATE")
	private Date checkDate;
	
	// 完整申报电子申报时间：ENTRY_WORKFLOW '00200000'节点时间
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "COMP_ELE_DATE")
	private Date compEleDate;
	
	// 结关时间：对应ENTRY_WORKFLOW表STEP_ID='80000000'节点（该字段最好做成索引）
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "RELEASE_DATE")
	private Date releaseDate;
	
	// 海关通关时间(秒)：为负数时自动换为0
	// 入境：有81的为预放行时间-自动受理时间；没有81的为放行时间-自动受理时间
	// 2019.10.25 出境报关单计算规则修正：70/81节点(取早的那一个)-10节点时间
	@Column(name = "CU_COST", precision = 19)
	private Long cuCost;
	
	// 总体通关时间(秒)：申报前准备时间+海关通关时间
	// 入境：没有81节点时是结关时间(81)-货物运抵时间，有81节点时时81节点时间-货物进出口时间
	// 出境报关单计算规则修正：70/81节点(取早的那一个)-货物进港时间（不是货物进出境时间）
	@Column(name = "TOTAL_COST", precision = 19)
	private Long totalCost;

	// 申报前准备时间(秒)：为负数时自动换为0
	// 入境：报关单受理时间(ENTYR_WORKFLOW，STEP_ID='10000000')-转关数据核销时间(CHECK_TIME)
	// TODO 2019.10.25 入境报关单规则不变，出境报关单申报前准备时间&整体通关时间计算规则要修正,申报时间（应该是受理时间） - 货物进港时间(货物抵达海关监管场所时间，不是货物进出境时间)
	//电子申报时间-货物运抵
	@Column(name = "BEFORE_DECL_COST", precision = 19)
	private Long beforeDeclCost;
	
	// 报关单是否专业审单（环节代码33000000不为9999标记）：1-是，其它-否
	@Column(name = "PROF_VERIFY_FLAG", length = 1)
	private String profVerifyFlag;
	
	// 报关单是否新两步申报标记：1-是，其它-否
	@Column(name = "NEW_TWO_STEP_FLAG", length = 1)
	private String newTwoStepFlag;
	
	//20250731新增业务
	//电子申报时间：对应ENTRY_WORKFLOW表STEP_ID='00000000'节点
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "ELE_DECL_DATE")
	private Date eleDeclDate;
	
	//排查处置/现场验估时间：对应ENTRY_WORKFLOW表STEP_ID='26000000'节点(只要PROC_RESULT为M的)
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "ASSESS_START_DATE")
	private Date assessStartDate;
	
	//验估处置完毕时间：对应ENTRY_WORKFLOW表STEP_ID='26000000'节点(只要PROC_RESULT为G的)
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "ASSESS_END_DATE")
	private Date assessEndDate;

	// 退单时间：对应ENTRY_WORKFLOW表STEP_ID='81000000'节点
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "REFUND_DATE")
	private Date refundDate;

	// 报关单是否退过单标记：1-是，其它-否
	@Column(name = "REFUND_FLAG", length = 1)
	private String refundFlag;
	
	// 查验指令下达时间：来源CI_CHECK_MAN_WORK_HEAD(对接物流辅助系统进口理货时间和指令下达时间哪个晚哪个就是下发时间)
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "MAN_CREATE_TIME")
	private Date manCreateTime;
	
	// 查验开始时间：来源CI_CHECK_MAN_WORK_HEAD
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "MAN_CHK_TIME_START")
	private Date manChkTimeStart;

	// 查验关区：4位
	@Column(name = "CHECK_CUSTOMS_CODE", length = 10)
	private String checkCustomsCode;

	// 是否查验：1：是，0：否
	@Column(name = "CHECK_FLAG", length = 1)
	private String checkFlag;

	// 查验结束时间：来源CI_CHECK_MAN_WORK_HEAD
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "MAN_CHK_TIME_END")
	private Date manChkTimeEnd;

	// 处理结果
	@Column(name = "MAN_PROC_RESULT", length = 512)
	private String manProcResult;

	// 处理意见
	@Column(name = "MAN_PROC_IDEA", length = 512)
	private String manProcIdea;
}