package digital.laboratory.platform.entrustment.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
//import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import digital.laboratory.platform.entrustment.json.DynamicBigDecimalSerializer;
import digital.laboratory.platform.sys.entity.DrugLite;
import digital.laboratory.platform.common.mybatis.base.BaseEntity;
import digital.laboratory.platform.sys.entity.entrustment.IMAdditionalProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

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

import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang.StringUtils;
import org.checkerframework.checker.units.qual.A;


/**
 * 检材信息
 *
 * @author Zhang Xiaolong created at  2022-04-20
 * @describe 检材信息 实体类
 */
@Data
@TableName(value = "b_entrustment_identification_material", autoResultMap = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "检材信息")
public class EntrustmentIdentificationMaterial extends BaseEntity {

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

    /**
     * 检材编号
     */
    @ApiModelProperty(value = "检材编号")
    private String imNo;

    /**
     * 检材委托序号
     */
    @ApiModelProperty(value = "检材委托序号")
    private String imEntrustNumber;

    /**
     * 物证id
     */
    @ApiModelProperty(value = "物证id")
    private String evidenceId;

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

    /**
     * 委托id
     */
    @ApiModelProperty(value = "委托id")
    private String entrustmentId;

    /**
     * 检材名称
     */
    @ApiModelProperty(value = "检材名称")
    private String name;

    /**
     * 检材类别:继承所取物证的类别或从物证类别选择
     */
    @ApiModelProperty(value = "检材类别:继承所取物证的类别或从物证类别选择")
    private String type;

    /**
     * 检材类别名称:继承所取物证的类别或从物证类别选择
     * 2023/5/31 在咸阳分中心添加
     */
    @ApiModelProperty(value = "检材类别名称:继承所取物证的类别或从物证类别选择")
    private String typeName;

    /**
     * 检材颜色:继承所取物证颜色或手动填入
     */
    @ApiModelProperty(value = "检材颜色:继承所取物证颜色或手动填入")
    private String color;

    /**
     * 检材性状:继承所取物证性状或从物证性状类别选择
     */
    @ApiModelProperty(value = "检材性状:继承所取物证性状或从物证性状类别选择")
    private String form;

    /**
     * 检材性状:继承所取物证性状或从物证性状类别选择
     * * 2023/5/31 在咸阳分中心添加
     */
    @ApiModelProperty(value = "检材性状名称:继承所取物证性状或从物证性状类别选择")
    private String formName;

    /**
     * 检材情况之承载物名称, 例如 棉签 2 棵, 粉末 少许
     */
    @ApiModelProperty(value = "检材情况之承载物名称, 例如 棉签 2 棵, 粉末 少许")
    private String fundName;

    /**
     * 检材情况之承载物数量, 例如 5 颗, 3包
     */
    @ApiModelProperty(value = "检材情况之承载物数量, 例如 5 颗, 3包")
    private Integer fundQuantity;

    /**
     * 检材情况之承载物单位, 例如 5 颗, 3包
     */
    @ApiModelProperty(value = "检材情况之承载物单位, 例如 5 颗, 3包")
    private String fundUnit;

    /**
     * 检材数量, 例如 3.8 克 或 4.5毫升
     */
    @ApiModelProperty(value = "检材数量, 例如 3.8 克 或 4.5毫升")
    @JsonSerialize(using = DynamicBigDecimalSerializer.class)
    private BigDecimal quantity;

    /**
     * 计量单位, 例如 3.8 克 或 4.5毫升
     */
    @ApiModelProperty(value = "计量单位, 例如 3.8 克 或 4.5毫升")
    private String unit;

    /**
     * 附加属性, 如:体积3毫升,密码123,型号abc
     */
    @ApiModelProperty(value = "附加属性, 如:体积3毫升,密码123,型号abc")
    @TableField(typeHandler = FastjsonTypeHandler.class)
    private List<IMAdditionalProperty> additionalProperties;

    /**
     * 提取方法
     */
    @ApiModelProperty(value = "提取方法")
    private String drawWay;

    /**
     * 所有者姓名
     */
    @ApiModelProperty(value = "所有者姓名")
    private String personName;

    /**
     * 所有者证件类型
     */
    @ApiModelProperty(value = "所有者证件类型")
    private String personCert;

    /**
     * 所有者证件号
     */
    @ApiModelProperty(value = "所有者证件号")
    private String personId;

    /**
     * 所有者性别,公安系统编码: 1=男 2=女 0=未知
     */
    @ApiModelProperty(value = "所有者性别,公安系统编码: 1=男 2=女 0=未知")
    private Integer personGender;

    /**
     * 所有者国籍
     */
    @ApiModelProperty(value = "所有者国籍")
    private String personNationality;

    /**
     * 所有者民族编码,公安系统编码
     */
    @ApiModelProperty(value = "所有者民族编码,公安系统编码")
    private Integer personNation;

    /**
     * 所有者地址
     */
    @ApiModelProperty(value = "所有者地址")
    private String personAddress;

    /**
     * 所有者年龄
     */
    @ApiModelProperty(value = "所有者年龄")
    private Integer personAge;

    /**
     * 采集人1姓名
     */
    @ApiModelProperty(value = "采集人1姓名")
    private String take1Name;

    /**
     * 采集人1职务
     */
    @ApiModelProperty(value = "采集人1职务")
    private String take1Position;

    /**
     * 采集人1证件名称
     */
    @ApiModelProperty(value = "采集人1证件名称")
    private String take1Cert;

    /**
     * 采集人1证件号
     */
    @ApiModelProperty(value = "采集人1证件号")
    private String take1Id;

    /**
     * 采集人1联系电话
     */
    @ApiModelProperty(value = "采集人1联系电话")
    private String take1Phone;

    /**
     * 采集人2姓名
     */
    @ApiModelProperty(value = "采集人2姓名")
    private String take2Name;

    /**
     * 采集人2职务
     */
    @ApiModelProperty(value = "采集人2职务")
    private String take2Position;

    /**
     * 采集人2证件名称
     */
    @ApiModelProperty(value = "采集人2证件名称")
    private String take2Cert;

    /**
     * 采集人2证件号
     */
    @ApiModelProperty(value = "采集人2证件号")
    private String take2Id;

    /**
     * 采集人2联系电话
     */
    @ApiModelProperty(value = "采集人2联系电话")
    private String take2Phone;

    /**
     * 采集日期
     */
    @ApiModelProperty(value = "采集日期")
    private LocalDateTime takeTime;

    /**
     * 见证人姓名
     */
    @ApiModelProperty(value = "见证人姓名")
    private String witnessName;

    /**
     * 见证人证件名称
     */
    @ApiModelProperty(value = "见证人证件名称")
    private String witnessCert;

    /**
     * 见证人证件号
     */
    @ApiModelProperty(value = "见证人证件号")
    private String witnessId;

    /**
     * 包装情况:纸袋,纸盒,纸箱,自定义
     */
    @ApiModelProperty(value = "包装情况:纸袋,纸盒,纸箱,自定义")
    private String pack;

    /**
     * 包装情况名称:纸袋,纸盒,纸箱,自定义
     * 2023/5/31 在咸阳分中心添加
     */
    @ApiModelProperty(value = "包装情况名称:纸袋,纸盒,纸箱,自定义")
    private String packName;

    /**
     * 存储方法:常规,冷藏,特殊
     */
    @ApiModelProperty(value = "存储方法:常规,冷藏,特殊")
    private String storageMethod;

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

    @ApiModelProperty(value = "候选毒品列表转为字符串")
    @TableField(exist = false)
    private String drugsValue;
    /**
     * 检材概要
     */
    @ApiModelProperty(value = "检材概要")
    private String description;

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

    /**
     * 审核是否通过: 1=审核通过
     */
    @ApiModelProperty(value = "审核是否通过: 1=审核通过")
    private Integer checkPassed;

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

    /**
     * 审批是否通过: 1=审批通过
     */
    @ApiModelProperty(value = "审批是否通过: 1=审批通过")
    private Integer approvePassed;

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

    /**
     * 打印出的受理时间，因为要将date类型转为String类型
     */
    @ApiModelProperty(value = "打印出的受理时间")
    @TableField(exist = false)
    private String printAcceptTime;

    /**
     * 是否受理: 0=未受理, 1=已受理, -1=不予受理
     */
    @ApiModelProperty(value = "是否受理: 0=未受理, 1=已受理, -1=不予受理")
    private Integer acceptPassed;

    /**
     * 提供的样本1是否存在, 应该总是存在
     */
    // @ApiModelProperty(value="提供的样本1是否存在, 应该总是存在")
    // private Boolean providedSample1Present;

    /**
     * 提供的样本1编号
     */
    @ApiModelProperty(value = "提供的样本1编号")
    private String providedSample1No;

    /**
     * 提供的样本1承载物数量(重量), 例如 5颗, 3包
     */
    @ApiModelProperty(value = "提供的样本1承载物数量(重量), 例如 5颗, 3包")
    private Integer providedSample1FundQuantity;

    /**
     * 提供的样本1数量, 例如 3.8 克 或 4.5毫升
     */
    @ApiModelProperty(value = "提供的样本1数量, 例如 3.8 克 或 4.5毫升")
    private BigDecimal providedSample1Quantity;

    /**
     * 提供的样本2是否存在
     */
    @ApiModelProperty(value = "提供的样本2是否存在")
    private Boolean providedSample2Present;

    /**
     * 提供的样本2编号
     */
    @ApiModelProperty(value = "提供的样本2编号")
    private String providedSample2No;

    /**
     * 提供的样本2承载物数量(重量), 例如 5颗, 3包
     */
    @ApiModelProperty(value = "提供的样本2承载物数量(重量), 例如 5颗, 3包")
    private Integer providedSample2FundQuantity;

    /**
     * 提供的样本2数量, 例如 3.8 克 或 4.5毫升
     */
    @ApiModelProperty(value = "提供的样本2数量, 例如 3.8 克 或 4.5毫升")
    private BigDecimal providedSample2Quantity;

    /**
     * 是否已分样: 0=未分样, 1=已分样
     */
    @ApiModelProperty(value = "是否已分样: 0=未分样, 1=已分样")
    private Boolean splitedSample;

    /**
     * 样本1是否存在, 应该总是存在
     */
    // @ApiModelProperty(value="样本1是否存在, 应该总是存在")
    // private Boolean sample1Present;

    /**
     * 样本1编号
     */
    @ApiModelProperty(value = "样本1编号")
    private String sample1No;

    /**
     * 样本1承载物数量(重量), 例如 5颗, 3包
     */
    @ApiModelProperty(value = "样本1承载物数量(重量), 例如 5颗, 3包")
    private Integer sample1FundQuantity;

    /**
     * 样本1数量, 例如 3.8 克 或 4.5毫升
     */
    @ApiModelProperty(value = "样本1数量, 例如 3.8 克 或 4.5毫升")
    private BigDecimal sample1Quantity;

    /**
     * 样本1盒子 id
     */
    @ApiModelProperty(value = "样本1盒子 id")
    private String sample1BoxId;

    /**
     * 样本2是否存在
     */
    @ApiModelProperty(value = "样本2是否存在")
    private Boolean sample2Present;

    /**
     * 样本2编号
     */
    @ApiModelProperty(value = "样本2编号")
    private String sample2No;

    /**
     * 样本2承载物数量(重量), 例如 5颗, 3包
     */
    @ApiModelProperty(value = "样本2承载物数量(重量), 例如 5颗, 3包")
    private Integer sample2FundQuantity;

    /**
     * 样本2数量, 例如 3.8 克 或 4.5毫升
     */
    @ApiModelProperty(value = "样本2数量, 例如 3.8 克 或 4.5毫升")
    private BigDecimal sample2Quantity;

    /**
     * 样本2盒子 id
     */
    @ApiModelProperty(value = "样本2盒子 id")
    private String sample2BoxId;
    //add by xy 2023-04-15,记录复秤的结果而增加的字段信息
    /**
     * 样本1复秤后的重量
     */
    @ApiModelProperty(value = "样本1的复秤重量")
    private BigDecimal sample1RepeatWeigh;
    /**
     * 样本2复秤后的重量
     */
    @ApiModelProperty(value = "样本2的复秤重量")
    private BigDecimal sample2RepeatWeigh;

    /**
     * 分析项目   定性分析，定量分析，定性定量分析，关联性判断 其他
     * 1.定性分析   2.定量分析 3.定性定量分析 4.关联性判断 5。其他
     */
    @ApiModelProperty(value = "分析项目  1.定性分析   2.定量分析 3.定性定量分析 4.关联性判断 5。其他")
    private Integer analysisOption;

    @ApiModelProperty(value = "将分析项目转为字符串类型")
    @TableField(exist = false)
    private String analysisOptionValue;

    /**
     * 数据来源，用于区别数据来自自身系统还是外部系统 、0：本系统 1：禁毒大数据平台
     */
    @ApiModelProperty(value = "数据来源")
    private Integer dataSources;
    /**
     * 检材受理编号，一般是绑定检材所属的委托的受理编号
     */
    @ApiModelProperty(value = "检材受理编号")
    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private String acceptNo;

    /**
     * 打印委托书的时候需要对检材的序号，但是这个时候检材又没有受理，所以添加一个顺序号
     */
    @ApiModelProperty(value = "委托检材顺序号，由系统根据录入顺序生成")
    private Integer orderNo;

    /***************************** 贵阳新增需求 ***********************************************/
    /**
     * 提取时间--贵阳新增需求
     */
    @ApiModelProperty(value = "提取时间--贵阳新增需求")
    private LocalDateTime drawTime;
    /**
     * 提取时间--贵阳新增需求
     */
    @ApiModelProperty(value = "提取时间--贵阳新增需求 打印转为字符串")
    @TableField(exist = false)
    private String printDrawTime;

    /**
     * 提取地点--贵阳新增需求
     */
    @ApiModelProperty(value = "提取地点--贵阳新增需求")
    private String drawPlace;

    /**
     * 包装是否完整--贵阳新增需求
     */
    @ApiModelProperty(value = "包装是否完整--贵阳新增需求")
    private Boolean packComplete;

    /* 留存样个数--贵阳新增需求
     */
    @ApiModelProperty(value = "留存样个数--贵阳新增需求")
    private Integer rtSampleQuantity;

    /* 留存样个数--贵阳新增需求
     */
    @ApiModelProperty(value = "检材备注--贵阳新增需求")
    private String  remark;

    @ApiModelProperty(value = "检材年龄，用于后续统计各年龄阶段的数据--贵阳新增需求")
    private Integer materialAge;

    @ApiModelProperty(value = "生物检材类型， 目前区分毛发和尿液--贵阳新增需求")
    private String biologyType;
    /*****************************************************************************************/

    public String getOrderNo1() {
        return this.orderNo + "号检材";
    }

    public String getSampleCondition() {
        if (this.getSample2FundQuantity() != null && this.getSample2FundQuantity() > 0) {
            return this.getSample2FundQuantity() + this.getFundUnit();
        } else {
            return "";
        }
    }

    /**
     * 获取检材的描述性编号（简短称呼）,如果还没有受理之前，是没有受理编号的，所以未受理之前，使用不了这个函数
     *
     * @return
     */
    public String getShortNameDes() {
        String acceptNo = this.getAcceptNo();
        if (StringUtils.isNotBlank(acceptNo)) {
            int seqNo = Integer.parseInt(acceptNo.substring(acceptNo.lastIndexOf("-") + 1));
            return seqNo + "号";
        } else {
            return "0号";
        }
    }


    /**
     * 取检材的序号
     *
     * @return
     */
    public int getIndex() {
        String acceptNo = this.getAcceptNo();
        if (StringUtils.isNotBlank(acceptNo)) {
            int seqNo = Integer.parseInt(acceptNo.substring(acceptNo.lastIndexOf("-") + 1));
            return seqNo;
        } else {
            return 0;
        }
    }

}
