package com.yc.ship.module.trade.dal.dataobject.order;

import com.baomidou.mybatisplus.annotation.*;

import com.yc.ship.framework.mybatis.core.dataobject.TenantSyncDO;
import com.yc.ship.framework.tenant.core.db.TenantBaseDO;
import com.yc.ship.module.trade.dal.dataobject.tradeOrderaudit.TradeOrderAuditDO;
import com.yc.ship.module.trade.enums.SellMethodEnum;
import com.yc.ship.module.trade.enums.TradeOrderStatusEnum;
import com.yc.ship.module.trade.enums.invoice.InvoiceStatusEnum;
import com.yc.ship.module.trade.framework.annotation.ForUpdate;
import lombok.*;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

/**
 * 交易订单 DO
 *
 * @author 管理员
 */
@TableName("trade_order")
@KeySequence("trade_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库，可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TradeOrderDO extends TenantSyncDO {

    /**
     * 主键
     */
    @TableId(type= IdType.INPUT)
    private Long id;
    /**
     * 订单号
     */
    private String orderNo;
    /**
     * 第三方订单号
     */
    private String externalOrderNo;
    /**
     * 第三方原始订单号，内部旅行社下单
     */
    @TableField(exist = false)
    private String externalOriginOrderNo;

    @TableField(exist = false)
    private TradeOrderBindDO bindOrder;
    /**
     * 类型  1：游船 2：附加产品 3：赠票
     */
    @TableField(exist = false)
    private Long routePlanId;
    /**
     * 游客类型
     */
    @ForUpdate(fieldName = "游客类型")
    private Integer visitorType;
    /**
     * 游玩日期
     */
    @ForUpdate(fieldName = "游玩日期")
    private Date travelDate;
    /**
     * 销售方式
     * 关联 {@link SellMethodEnum}
     */
    private Integer sellMethod;
    /**
     * 销售来源
     */
    private String sourceId;
    /**
     * 来源名称
     */
    private String sourceName;
    /**
     * 门店ID
     */
    private Long storeId;
    /**
     * 门店名称
     */
    private String storeName;
    /**
     * 销售员ID
     */
    private String sellerId;
    /**
     * 会员ID
     */
    private String memberId;
    /**
     * 订单金额
     */
    @ForUpdate(fieldName = "订单金额")
    private BigDecimal amount;
    /**
     * 支付金额
     */
    @ForUpdate(fieldName = "实际金额")
    private BigDecimal payAmount;
    /**
     * 订单状态
     * 关联 {@link TradeOrderStatusEnum}
     */
//    @ForUpdate(fieldName = "订单状态")
    private Integer orderStatus;
    /**
     * 支付时间
     */
    private LocalDateTime paymentDate;

    /**
     * 确认时间
     */
    private LocalDateTime confirmDate;
    /**
     * 支付状态
     */
    private Integer payStatus;
    /**
     * 备注
     */
    @ForUpdate(fieldName = "备注")
    private String remark;

    @ForUpdate(fieldName = "联系人")
    private String linkMan;

    @ForUpdate(fieldName = "联系人电话")
    private String linkMobile;

    @ForUpdate(fieldName = "联系人邮箱")
    private String linkEmail;

    /**
     * 携程需要的
     */
    private String itemId;
    /**
     * 开票标识{@link InvoiceStatusEnum}
     */
    private Integer isInvoice;
    /**
     * 投保标识 0投保状态不确认 1成功
     */
    private Integer isInsure;
    /**
     * 合同标识 0不确认 1成功
     */
    private Integer isContract;

    /**
     * 关联标识 0主订单 1被关联订单
     */
    @TableField(exist = false)
    private Integer isBind;

    /**
     * 改签订单标识 0老订单 1新订单
     */
    @TableField(exist = false)
    private Integer isChangeOrder;


    /**
     * 是否完全支付 0 否 1是
     */
    private Integer isFullPay;

    /**
     * 转交分销商的分销商ID
     */
    @TableField(exist = false)
    private Long transDistributorId;

    /**
     * 转交金额
     */
    @TableField(exist = false)
    private BigDecimal transAmount;

    /**
     * 业绩共享人
     */
    private String shareName;

    /**
     * 计调状态 0待出票 1部分出票 2全部出票
     */
    @TableField(exist = false)
    private Integer dispatchStatus;

    /**
     * 是否为定向库存订单 0共享 1定向
     */
    @TableField(exist = false)
    private Integer isDirect;

    /**
     * 区域经理
     */
    @TableField(exist = false)
    private Long areaManagerId;
    /**
     * 是否评论
     */
    private Integer isComment;
    /**
     * 组团社ID
     */
    private Long agencyGroupId;
    /**
     * 是否申请营销政策（0否 1是）
     */
    private Integer isMarketing;
    /**
     * 是否申请使用营销政策（0否 1是）
     */
    private Integer isMarketingUse;
    /**
     * 时间方案分组类型
     */
    private Integer routePlanGroupType;

    /**
     * 是否为增加订单
     */
    @TableField(exist = false)
    private Integer isAddOrder;

    /**
     * 是否账单
     */
    private Integer isBill;

    /**
     * 团号
     */
    @ForUpdate(fieldName = "团号")
    private String groupNo;

    /**
     * 平台结算金额，扣除退票金额
     */
    @TableField(exist = false)
    private BigDecimal platAmount;

    /**
     * 是否需要审核0无需确认 1未确认 2已确认 3取消
     */
    @TableField(exist = false)
    private Integer confirmType;

    /**
     * 出行状态 0已取消 1未出行 2部分出行 3已出行 4已结束
     */
    private Integer travelStatus;

    /**
     * 完结状态 平台订单（有效订单）出行日期三天后变成已完结
     * 内部旅行社订单（有效订单）出行日期七天后变成已完结
     * 0 否 1是
     */
    private Integer finishStatus;
    /**
     * 审核流程类型 1:1级别流程 2：2级流程 3：3级流程 4：4级流程
     */
    private Integer auditType;
    /**
     * 审核状态 0、无需审核 1、一级审核中  2：二级审核中 3：三级审核中 4：四级审核中 5：审核通过 6：审核驳回
     */
    private Integer auditStatus;
    /**
     * 待审核人员ID
     */
    private Integer auditUser;

    /**
     * 航次ID
     */
    @ForUpdate(fieldName = "航次")
    private Long voyageId;

    /**
     * 游轮ID
     */
    @ForUpdate(fieldName = "游轮")
    private Long shipId;
    /**
     * 折扣ID
     */
    private Long discountId;


    /**
     * 币种 字典trade_order_currency
     */
    @ForUpdate(fieldName = "币种")
    private String currency;

    /**
     * 客户名称
     */
    @ForUpdate(fieldName = "客户名称")
    private String customerName;

    @TableField(exist = false)
    private List<TradeOrderAuditDO> tradeOrderAuditList;


    /**
     * 灰点（已审阅）/红点（未审阅） 0 未审阅 1 已审阅
     */
    private Integer isRead;
    /**
     * 审阅人员ID
     */
    private Long readUser;

    /**
     * 审阅时间
     */
    private LocalDateTime readTime;

    /**
     * 定金
     */
    @ForUpdate(fieldName = "定金")
    private BigDecimal deposi;

    @ForUpdate(fieldName = "实付已经金额")
    private BigDecimal realPayAmount;

    @ForUpdate(fieldName = "政策优惠金额")
    private BigDecimal freeAmount;

//    @ForUpdate(fieldName = "是否需要补缴费 1是 0 否 2已补差价")
    private Integer isSupplementary;

    @ForUpdate(fieldName = "受损金额")
    private BigDecimal damaged;

//    @ForUpdate(fieldName = "补缴费金额")
    private BigDecimal  supplementAmount;
    /**
     * 取消状态 0：初始 1：已提交取消 2：取消成功 3取消审核不通过
     */
    @ForUpdate(fieldName = "取消状态")
    private Integer damagedStatus;
    /**
     * 受损提交时间
     */
    private LocalDateTime damagedTime;

    /**
     * 定金状态0：初始  1：待支付（审核通过）2：已支付
     */
    private Integer deposiStatus;

    /**
     * 定金支付时间
     */
    private LocalDateTime deposiPayTime;

    /**
     * 排序
     */
    private Integer orderSort;
}