package digital.laboratory.platform.entrustment.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.fasterxml.jackson.annotation.JsonFormat;
import digital.laboratory.platform.common.mybatis.base.BaseEntity;
import digital.laboratory.platform.sewage.entity.UpdateInfo;
import digital.laboratory.platform.sys.entity.DrugLite;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;


/**
 * 委托
 *
 * @author Zhang Xiaolong created at  2022-04-20
 * @describe 委托 Mapper 类
 */
@Data
@Accessors(chain = true)
@TableName(value = "b_entrustment", autoResultMap = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "委托")
public class Entrustment extends BaseEntity {

    /**
     * 编号
     */
    @TableId(value = "id", type = IdType.ASSIGN_UUID)
    @ApiModelProperty(value="编号")
    private String id;

    /**
     * 案件Id
     */
    @ApiModelProperty(value="案件Id")
    private String caseId;

    /**
     * 委托编号
     */
    @ApiModelProperty(value="委托编号")
    private String entrustmentNo;

    /**
     * 委托类型: 0=常规毒品, 1=生物样本
     */
    @ApiModelProperty(value="委托类型: 0=常规毒品, 1=生物样本")
    private Integer entrustmentType;

    /**
     * 业务类型: 0=毒品鉴定 1=.....用于对应到各个检验小组
     */
    @ApiModelProperty(value="业务类型: 0=毒品鉴定 1=.....用于对应到各个检验小组")
    private Integer businessType;

    /**
     * 对应的流程实例Id
     */
    @ApiModelProperty(value="对应的流程实例Id")
    private String processInstanceId;

    /**
     * 受理Id, 通过这个可以得到鉴定号
     */
    @ApiModelProperty(value="受理Id, 通过这个可以得到鉴定号")
    private String identificationId;

    /**
     * 委托日期, 鉴定委托书打印日期
     */
    @ApiModelProperty(value="委托日期, 鉴定委托书打印日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime entrustmentTime;

    /**
     * 委托提交者, 后期可能会转给其他人user_id
     */
    @ApiModelProperty(value="委托提交者, 后期可能会转给其他人user_id")
    private String submitter;

    /**
     * 提交日期, 提交审核的日期
     */
    @ApiModelProperty(value="提交日期, 提交审核的日期")
    private LocalDateTime submitTime;

    /**
     * 鉴定委托单位编码
     */
    @ApiModelProperty(value="鉴定委托单位编码")
    private String clientOrgId;

    /**
     * 鉴定委托单位名称
     */
    @ApiModelProperty(value="鉴定委托单位名称")
    private String clientOrgName;

    /**
     * 通讯地址
     */
    @ApiModelProperty(value="通讯地址")
    private String clientAddress;

    /**
     * 邮政编码
     */
    @ApiModelProperty(value="邮政编码")
    private String clientPostcode;

    /**
     * 电话号码
     */
    @ApiModelProperty(value="电话号码")
    private String clientTel;

    /**
     * 传真号码
     */
    @ApiModelProperty(value="传真号码")
    private String clientFax;

    /**
     * 委托鉴定专业
     */
    @ApiModelProperty(value="委托鉴定专业")
    private String identificationDomain;

    /**
     * 鉴定机构名称
     */
    @ApiModelProperty(value="鉴定机构名称")
    private String identificationOrgName;

    /**
     * 定性分析
     */
    @ApiModelProperty(value="定性分析")
    private Boolean qualitativeAnalysis;

    /**
     * 定量分析
     */
    @ApiModelProperty(value="定量分析")
    private Boolean quantitativeAnalysis;

    /**
     * 其他鉴定要求
     */
    @ApiModelProperty(value="其他鉴定要求")
    private String otherIdentificationRequests;

    /**
     * 候选毒品列表(drug 对象的 json array)
     */
    @ApiModelProperty(value="候选毒品列表(drug 对象的 json array)")
    //@TableField(typeHandler = JacksonTypeHandler.class)
    @TableField(typeHandler = FastjsonTypeHandler.class)
    private List<DrugLite> candidateDrugs;

    /**
     * 是否由委托方指定鉴定方法
     */
    @ApiModelProperty(value="是否由委托方指定鉴定方法")
    private Boolean isClientSpecifiedMethod;

    /**
     * 委托方指定的鉴定方法
     */
    @ApiModelProperty(value="委托方指定的鉴定方法")
    private String clientSpecifiedMethod;

    /**
     * 是否有损检验:0=无损,1=有损
     */
    @ApiModelProperty(value="是否有损检验:0=无损,1=有损")
    private Boolean destructiveAnalysis;

    /**
     * 检验的其他说明(鉴定事项确认书中要求, 审核人填写)
     */
    @ApiModelProperty(value="检验的其他说明(鉴定事项确认书中要求, 审核人填写)")
    private String otherIdentificationNotes;

    /**
     * 是否重新鉴定:0=否,1=重新鉴定
     */
    @ApiModelProperty(value="是否重新鉴定:0=否,1=重新鉴定")
    private Boolean reidentification;

    /**
     * 原鉴定机构
     */
    @ApiModelProperty(value="原鉴定机构")
    private String oldIdentificationOrgName;

    /**
     * 原鉴定文书
     */
    @ApiModelProperty(value="原鉴定文书")
    private String oldIdentificationDocument;

    /**
     * 原鉴定结果
     */
    @ApiModelProperty(value="原鉴定结果，" +
            "常规毒品：首次鉴定、初筛（不要报告、只要结果）、补充鉴定、重新鉴定；" +
            "生物样本：首次鉴定、初筛（不要报告、只要结果）、涉缅人员、自愿戒治人员、补充鉴定、重新鉴定")
    private String oldIdentificationResult;

    /**
     * 重新鉴定理由
     */
    @ApiModelProperty(value="重新鉴定理由")
    private String reidentificationReason;

    /**
     * 回避的鉴定人及回避事由, json 格式
     */
    @ApiModelProperty(value="回避的鉴定人及回避事由, json 格式")
    @TableField(typeHandler = FastjsonTypeHandler.class)
    private List<AvoidIdentifier> avoidIdentifier;

    /**
     * 指定鉴定人, 委托中指定鉴定人
     */
    @ApiModelProperty(value="指定鉴定人, 委托中指定鉴定人")
    private String specifiedIdentifier;

    /**
     * 其它约定事项,打印在鉴定事项确认书中的"约定->其他"
     */
    @ApiModelProperty(value="其它约定事项,打印在鉴定事项确认书中的\"约定->其他\"")
    private String otherAgreement;

    /**
     * 备注
     */
    @ApiModelProperty(value="备注")
    private String comments;

    /**
     * 候选审核人, user_id列表, 逗号分隔
     */
    @ApiModelProperty(value="候选审核人, user_id列表, 逗号分隔")
    private String checkCandidateUser;

    /**
     * 审核任务认领人
     */
    @ApiModelProperty(value="审核任务认领人")
    private String checkClaimUser;

    /**
     * 审核任务认领时间
     */
    @ApiModelProperty(value="审核任务认领时间")
    private LocalDateTime checkClaimTime;

    /**
     * 实际审核人, user_id
     */
    @ApiModelProperty(value="实际审核人, user_id")
    private String checkUser;

    /**
     * 审核时间
     */
    @ApiModelProperty(value="审核时间")
    private LocalDateTime checkTime;

    /**
     * 审核意见: (审批通过 审批不通过及原因)
     */
    @ApiModelProperty(value="审核意见: (审批通过 审批不通过及原因)")
    private String checkComments;

    /**
     * 审核次数记录
     */
    @ApiModelProperty(value="审核次数记录")
    private Integer checkTimes;

    /**
     * 专业全部物证检验状态: 0=未全部审核 1=已全部审核
     */
    @ApiModelProperty(value="专业全部物证检验状态: 0=未全部审核 1=已全部审核")
    private Boolean checkAllIdentificationMaterialConfirmed;

    /**
     * 候选审批人, user_id列表, 逗号分隔
     */
    @ApiModelProperty(value="候选审批人, user_id列表, 逗号分隔")
    private String approveCandidateUser;

    /**
     * 审批任务认领人
     */
    @ApiModelProperty(value="审批任务认领人")
    private String approveClaimUser;

    /**
     * 审批任务认领时间
     */
    @ApiModelProperty(value="审批任务认领时间")
    private LocalDateTime approveClaimTime;

    /**
     * 实际审批人, user_id
     */
    @ApiModelProperty(value="实际审批人, user_id")
    private String approveUser;

    /**
     * 审批时间
     */
    @ApiModelProperty(value="审批时间")
    private LocalDateTime approveTime;

    /**
     * 审批意见: (审批通过 审批不通过及原因)
     */
    @ApiModelProperty(value="审批意见: (审批通过 审批不通过及原因)")
    private String approveComments;

    /**
     * 审批次数:该字段在审核通过时初始化, 值为0或1时代表初审, 2代表复审
     */
    @ApiModelProperty(value="审批次数:该字段在审核通过时初始化, 值为0或1时代表初审, 2代表复审")
    private Integer approveTimes;

    /**
     * 送检确认人user_id
     */
    @ApiModelProperty(value="送检确认人user_id")
    private String deliverConfirmUser;

    /**
     * 送检确认时间
     */
    @ApiModelProperty(value="送检确认时间")
    private LocalDateTime deliverConfirmTime;

    /**
     * 送检确认意见
     */
    @ApiModelProperty(value="送检确认意见")
    private String deliverConfirmComments;

    /**
     * 送检日期
     */
    @ApiModelProperty(value="送检日期")
    private LocalDateTime deliverTime;

    /**
     * 送检操作提交用户user_id
     */
    @ApiModelProperty(value="送检操作提交用户user_id")
    private String deliverSubmitter;

    // /**
    //  * 如果送检人1是系统用户, 记录用户id
    //  */
    // @ApiModelProperty(value="如果送检人1是系统用户, 记录用户id")
    // private String deliverer1UserId;

    /**
     * 送检人1姓名
     */
    @ApiModelProperty(value="送检人1姓名")
    private String deliverer1Name;

    /**
     * 送检人1职务
     */
    @ApiModelProperty(value="送检人1职务")
    private String deliverer1Position;

    /**
     * 送检人1证件名称
     */
    @ApiModelProperty(value="送检人1证件名称")
    private String deliverer1Cert;

    /**
     * 送检人1证件编号
     */
    @ApiModelProperty(value="送检人1证件编号")
    private String deliverer1Id;

    /**
     * 送检人1电话
     */
    @ApiModelProperty(value="送检人1电话")
    private String deliverer1Phone;

    // /**
    //  * 如果送检人2是系统用户, 记录用户id
    //  */
    // @ApiModelProperty(value="如果送检人2是系统用户, 记录用户id")
    // private String deliverer2UserId;

    /**
     * 送检人2姓名
     */
    @ApiModelProperty(value="送检人2姓名")
    private String deliverer2Name;

    /**
     * 送检人2职务
     */
    @ApiModelProperty(value="送检人2职务")
    private String deliverer2Position;

    /**
     * 送检人2证件名称
     */
    @ApiModelProperty(value="送检人2证件名称")
    private String deliverer2Cert;

    /**
     * 送检人2证件编号
     */
    @ApiModelProperty(value="送检人2证件编号")
    private String deliverer2Id;

    /**
     * 送检人2电话
     */
    @ApiModelProperty(value="送检人2电话")
    private String deliverer2Phone;

    // /**
    //  * 受理任务认领人
    //  */
    // @ApiModelProperty(value="受理任务认领人")
    // private String acceptClaimUser;
    //
    // /**
    //  * 受理任务认领时间
    //  */
    // @ApiModelProperty(value="受理任务认领时间")
    // private LocalDateTime acceptClaimTime;

    /**
     * 受理编号
     */
    @ApiModelProperty(value="受理编号")
    private String acceptNo;

    /**
     * 受理人user_id
     */
    @ApiModelProperty(value="受理人user_id")
    private String acceptUser;

    /**
     * 受理时间
     */
    @ApiModelProperty(value="受理时间")
    private LocalDateTime acceptTime;

    /**
     * 受理意见
     */
    @ApiModelProperty(value="受理意见")
    private String acceptComments;

    /**
     * 鉴定事项确认书是否已经打印
     */
    @ApiModelProperty(value="鉴定事项确认书是否已经打印")
    private Boolean identificationItemsConfirmPrinted;


    /**
     * 送检受理信息, 以 json 格式记录送检受理各环节的文字意见
     */
    @ApiModelProperty(value="送检受理信息, 以 json 格式记录送检受理各环节的文字意见")
//    @TableField(typeHandler = JacksonTypeHandler.class)
    @TableField(typeHandler = FastjsonTypeHandler.class)
    private List<UpdateInfo> processInfo;

    /**
     * 报告领取方式: 0=自取, 1=代领, 2=邮寄
     */
    @ApiModelProperty(value="报告领取方式: 0=自取, 1=代领, 2=邮寄")
    private String reportReceiveMode;

    /**
     * 报告领取人1的 user id
     */
    @ApiModelProperty(value="报告领取人1的 user id")
    private String reportReceiver1UserId;

    /**
     * 报告领取人1的姓名
     */
    @ApiModelProperty(value="报告领取人1的姓名")
    private String reportReceiver1Name;

    /**
     * 报告领取人1的职务
     */
    @ApiModelProperty(value="报告领取人1的职务")
    private String reportReceiver1Position;

    /**
     * 报告领取人1的证件类型
     */
    @ApiModelProperty(value="报告领取人1的证件类型")
    private String reportReceiver1Cert;

    /**
     * 报告领取人1的证件号
     */
    @ApiModelProperty(value="报告领取人1的证件号")
    private String reportReceiver1Id;

    /**
     * 报告领取人1的电话
     */
    @ApiModelProperty(value="报告领取人1的电话")
    private String reportReceiver1Phone;

    /**
     * 报告领取人2的 user id
     */
    @ApiModelProperty(value="报告领取人2的 user id")
    private String reportReceiver2UserId;

    /**
     * 报告领取人2的姓名
     */
    @ApiModelProperty(value="报告领取人2的姓名")
    private String reportReceiver2Name;

    /**
     * 报告领取人2的职务
     */
    @ApiModelProperty(value="报告领取人2的职务")
    private String reportReceiver2Position;

    /**
     * 报告领取人2的证件类型
     */
    @ApiModelProperty(value="报告领取人2的证件类型")
    private String reportReceiver2Cert;

    /**
     * 报告领取人2的证件号
     */
    @ApiModelProperty(value="报告领取人2的证件号")
    private String reportReceiver2Id;

    /**
     * 报告领取人2的电话
     */
    @ApiModelProperty(value="报告领取人2的电话")
    private String reportReceiver2Phone;

    /**
     * 报告发放人user_id(通常是受理员)
     */
    @ApiModelProperty(value="报告发放人user_id(通常是受理员)")
    private String reportSenderUserId;

    /**
     * 报告发放时间
     */
    @ApiModelProperty(value="报告发放时间")
    private LocalDateTime reportSentTime;

    /**
     * 报告领取人1领取报告时的签名
     */
    @ApiModelProperty(value="报告领取人1领取报告时的签名")
    private String reportReceiver1Signature;

    /**
     * 报告领取人2领取报告时的签名
     */
    @ApiModelProperty(value="报告领取人2领取报告时的签名")
    private String reportReceiver2Signature;

    /**
     * 检材领取方式: 0=自取, 1=实验室自行处理
     */
    @ApiModelProperty(value="检材领取方式: 0=自取, 1=实验室自行处理")
    private Integer sampleReceiveMode;

    /**
     * 如果检材领取人1是系统用户, 记录userId
     */
    @ApiModelProperty(value="如果检材领取人1是系统用户, 记录userId")
    private String sampleReceiver1UserId;

    /**
     * 检材领取人1姓名
     */
    @ApiModelProperty(value="检材领取人1姓名")
    private String sampleReceiver1Name;

    /**
     * 检材领取人1职位
     */
    @ApiModelProperty(value="检材领取人1职位")
    private String sampleReceiver1Position;

    /**
     * 检材领取人1证件类型
     */
    @ApiModelProperty(value="检材领取人1证件类型")
    private String sampleReceiver1Cret;

    /**
     * 检材领取人1证件号
     */
    @ApiModelProperty(value="检材领取人1证件号")
    private String sampleReceiver1Id;

    /**
     * 检材领取人1电话
     */
    @ApiModelProperty(value="检材领取人1电话")
    private String sampleReceiver1Phone;

    /**
     * 如果检材领取人2是系统用户, 记录userId
     */
    @ApiModelProperty(value="如果检材领取人2是系统用户, 记录userId")
    private String sampleReceiver2UserId;

    /**
     * 检材领取人2姓名
     */
    @ApiModelProperty(value="检材领取人2姓名")
    private String sampleReceiver2Name;

    /**
     * 检材领取人2职位
     */
    @ApiModelProperty(value="检材领取人2职位")
    private String sampleReceiver2Position;

    /**
     * 检材领取人2证件类型
     */
    @ApiModelProperty(value="检材领取人2证件类型")
    private String sampleReceiver2Cret;

    /**
     * 检材领取人2证件号
     */
    @ApiModelProperty(value="检材领取人2证件号")
    private String sampleReceiver2Id;

    /**
     * 检材领取人2电话
     */
    @ApiModelProperty(value="检材领取人2电话")
    private String sampleReceiver2Phone;

    /**
     * 检材发放人, 鉴定机构工作人员user_id
     */
    @ApiModelProperty(value="检材发放人, 鉴定机构工作人员user_id")
    private String sampleSenderUserId;

    /**
     * 检材发放时间
     */
    @ApiModelProperty(value="检材发放时间")
    private String sampleSentTime;

    /**
     * 检材领取人1签名
     */
    @ApiModelProperty(value="检材领取人1签名")
    private String sampleReceiver1PersonSignature;

    /**
     * 检材领取人2签名
     */
    @ApiModelProperty(value="检材领取人2签名")
    private String sampleReceiver2PersonSignnature;

    /**
     * 状态
     */
    @ApiModelProperty(value="状态")
    private Integer status;

    /**
     * 上一个状态
     */
    @ApiModelProperty(value="上一个状态")
    private Integer previousStatus;

    /**
     * 数据来源，用于区别数据来自自身系统还是外部系统
     */
    @ApiModelProperty(value="数据来源")
    private Integer dataSources;

    /**
     * 第三方数据系统中的委托编号，
     */
    @ApiModelProperty(value="禁毒数据平台的委托编号")
    private String thirdSysEntrustNo;

    /**
     * 第三方系统受理编号，
     */
    @ApiModelProperty(value="第三方系统受理编号")
    private String acceptNoThirdSys;
    /**
     * 鉴定要求，
     */
    @ApiModelProperty(value="鉴定要求")
    private String entrustRequirement;
    /**
     * 邮寄地址，
     */
    @ApiModelProperty(value="邮寄地址")
    private String postAddress;
    /**
     * 是否流转
     */
    @ApiModelProperty(value="是否流转,0,未流转，1是已经流转")
        private Integer isTrans;

    /**
     * 是否退回，
     */
    @ApiModelProperty(value="是否退回（0：未退回，-1：已退回）")
    private Integer returnOrNot;

//    /**
//     * 20250121 新增的一个委托类型，选择生物样本类型后需要区分是 0 委托、1 初筛、 2 两社人员、 3 其他人员， 常规毒品 0 委托 1 初筛，其他的不需要区分
//     * 存字符串，不用code表达
//     */
//    @ApiModelProperty("新增的一个委托类型，选择生物样本类型后需要区分是 0 委托、1 初筛、 2 两社人员、 3 其他人员， 常规毒品 0 委托 1 初筛，其他的不需要区分")
//    private String type;


}
