package thyyxxk.webserver.entity.casefrontsheet;

import java.io.Serializable;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import thyyxxk.webserver.entity.casefrontsheet.state.AuditState;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import static thyyxxk.webserver.utils.StringUtil.isBlank;

/**
 * @author dj
 */
@Data
@TableName(value = "t_case_frontsheet_main")
public class CaseFrontsheetMain implements Serializable {

    private static final long serialVersionUID = 3870281948419892424L;

    /**
     * 病案号，和住院号一样
     */
    private String bah;

    /**
     * 住院次数
     */
    private Integer admissTimes;

    /**
     * 签收状态 0,未签收   1,已签收   2,已打印
     */
    private Integer fileStatus;

    /**
     * 迟交标志，0,否   1,是
     */
    private Integer lateFlag;

    /**
     * 签收时间
     */
    private Date signDate;

    /**
     * 解除签收时间
     * */
    private Date unsignDate;

    /**
     * 签收人
     * */
    private String signStaff;

    /**
     * 医疗付费方式
     */
    private String payMethod;

    /**
     * 健康卡号
     */
    private String healthCardNo;

    private String name;

    private String sex;

    /**
     * 出生日期
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthDate;

    private Integer age;

    /**
     * 国籍
     */
    private String country;

    /**
     * 出生天数
     */
    private Integer ageDays;

    /**
     * 新生儿体重
     */
    private Integer newBornWeight;

    /**
     * 新生儿入院体重
     */
    private Integer newBornAdmissWeight;

    /**
     * 出生地编码
     */
    private String birthPlace;

    /**
     * 出生地名称
     */
    private String birthPlaceName;

    /**
     * 籍贯编码
     */
    private String nativePlace;

    /**
     * 籍贯名称
     */
    private String nativePlaceName;

    /**
     * 民族
     */
    private String nation;

    /**
     * 身份证
     */
    private String socialNo;

    /**
     * 职业
     */
    private String occupation;

    /**
     * 婚姻情况
     */
    private String marriage;

    /**
     * 三级地址代码
     * */
    @TableField(exist = false)
    private Integer[] standardAddress;

    /**
     * 现住址
     */
    private String livePlace;

    /**
     * 住址拼接
     * */
    private String livePlaceCombo;

    /**
     * 手机号
     */
    private String phone;

    /**
     * 居住他邮编
     */
    private String addrZipCode;

    /**
     * 户口地址编码
     */
    private String hkPlace;

    /**
     * 户口地址
     */
    private String hkPlaceName;

    /**
     * 户口地址邮编
     */
    private String hkZipCode;

    /**
     * 工作单位
     */
    private String unitName;

    /**
     * 工作单位地址
     */
    private String unitPlace;

    /**
     * 工作单位电话
     */
    private String unitPhone;

    /**
     * 工作单位邮编
     */
    private String unitZipCode;

    /**
     * 联系人姓名
     */
    private String contactName;

    /**
     * 联系人关系
     */
    private String contactRelation;

    /**
     * 联系人地址
     */
    private String contactAddrName;

    /**
     * 联系人电话
     */
    private String contactPhone;

    /**
     * 联系人地址编码
     */
    private String contactAddr;

    /**
     * 入院方式
     */
    private String zyAdmissWay;

    /**
     * 是否有手术
     */
    private String hasSurgery;

    /**
     * 入院日期
     */
    private Date admissDate;

    /**
     * 入院科室
     */
    private String admissDept;
    private String admissDeptCode;

    /**
     * 入院病房
     */
    private String admissWard;
    private String admissWardCode;

    /**
     * 转科科室
     */
    private String transDept;
    private String transDeptCode;

    /**
     * 出院日期
     */
    private Date dismissDate;

    /**
     * 出院科室
     */
    private String dismissDept;
    private String dismissDeptCode;

    /**
     * 出院病房
     */
    private String dismissWard;
    private String dismissWardCode;

    /**
     * 住院天数
     */
    private String admissDays;

    /**
     * 门诊诊断编码
     */
    private String clinicDiagCode;

    /**
     * 是否正确门诊诊断编码（0-否，其他-是）
     * */
    @TableField(exist = false)
    private Integer validClinicDiag;

    /**
     * 门诊诊断名称
     */
    private String clinicDiagStr;

    /**
     * 意外伤害名称
     */
    private String hurtReasonName;

    /**
     * 意外伤害编码
     */
    private String hurtReasonCode;

    /**
     * 病理诊断名称
     */
    private String pathologicDiagStr;

    /**
     * 病理诊断编码
     */
    private String pathologicDiagCode;

    /**
     * 病历号
     */
    private String blh;

    /**
     * 是否有过敏
     */
    private String allergy;

    /**
     * 过敏药物
     */
    private String allergicMedicine;

    /**
     * 是否进行过尸检
     */
    private String autopsy;

    /**
     * 输血前四项（HbsAg）
     */
    private String hbsAg;

    /**
     * 输血前四项（HCV-Ab）
     */
    private String hcvAb;

    /**
     * 输血前四项（HIV-Ab)
     */
    private String hivAb;

    /**
     * 输血前四项（TP-Ab）
     */
    private String tpAb;

    /**
     * 血型
     */
    private String bloodType;

    /**
     * Rh
     */
    private String rh;

    /**
     * 科室主任
     */
    private String deptLeader;

    /**
     * 主任（副主任）医师
     */
    private String leaderDoctor;

    /**
     * 主治医师
     */
    private String mainDoctor;

    /**
     * 住院医师
     */
    private String admissDoctor;

    /**
     * 责任护士
     */
    private String dutyNurse;

    /**
     * 进修医师
     */
    private String studyDoctor;

    /**
     * 实习医师
     */
    private String internshipDoctor;

    /**
     * 编码员
     */
    private String coder;

    /**
     * 科室主任姓名
     */
    private String deptLeaderName;

    /**
     * 主任（副主任）医师姓名
     */
    private String leaderDoctorName;

    /**
     * 主治医师姓名
     */
    private String mainDoctorName;

    /**
     * 住院医师姓名
     */
    private String admissDoctorName;

    /**
     * 责任护士姓名
     */
    private String dutyNurseName;

    /**
     * 进修医师姓名
     */
    private String studyDoctorName;

    /**
     * 实习医师姓名
     */
    private String internshipDoctorName;

    /**
     * 编码员姓名
     */
    private String coderName;

    /**
     * 病案质量
     */
    private String qualityControlLevel;

    /**
     * 质控医师
     */
    private String qualityControlDoctor;

    /**
     * 质控护士
     */
    private String qualityControlNurse;

    /**
     * 质控医师姓名
     */
    private String qualityControlDoctorName;

    /**
     * 质控护士姓名
     */
    private String qualityControlNurseName;

    /**
     * 质控日期
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date qualityControlDate;

    /**
     * 离院方式
     */
    private String zyDismissWay;

    // 非医嘱离院原因
    private String fyzlyyy;

    /**
     * 拟接收医疗机构名称
     */
    private String dismissDestination;

    /**
     * 是否有出院31天内再住院计划
     */
    private String admissAgainInOneMonth;

    /**
     * 出院31天内再住院目的
     */
    private String admissAgainPurpose;

    /**
     * 颅脑损伤患者入院前昏迷时间（天）
     */
    private String comaDaysBeforeAdmiss;

    /**
     * 颅脑损伤患者入院前昏迷时间（小时）
     */
    private String comaHoursBeforeAdmiss;

    /**
     * 颅脑损伤患者入院前昏迷时间（分钟）
     */
    private String comaMinutesBeforeAdmiss;

    /**
     * 颅脑损伤患者入院后昏迷时间（天）
     */
    private String comaDaysAfterAdmiss;

    /**
     * 颅脑损伤患者入院后昏迷时间（小时）
     */
    private String comaHoursAfterAdmiss;

    /**
     * 颅脑损伤患者入院后昏迷时间（分钟）
     */
    private String comaMinutesAfterAdmiss;

    /**
     * 住院总费用
     */
    private String totalCost;

    /**
     * 住院自费金额
     */
    private String selfPay;

    /**
     * 一般医疗服务费
     */
    private String generalMedicalServiceFee;

    /**
     * 一般治疗操作费
     */
    private String generalTreatmentOperatingFee;

    /**
     * 护理费
     */
    private String careFee;

    /**
     * 其他费
     */
    private String elseFee;

    /**
     * 病理诊断费
     */
    private String pathologicDiagFee;

    /**
     * 实验室诊断费
     */
    private String experimentDiagFee;

    /**
     * 影像学诊断费
     */
    private String ctDiagFee;

    /**
     * 临床诊断项目费
     */
    private String clinicalDiagFee;

    /**
     * 非手术治疗项目费
     */
    private String notSurgicalFee;

    /**
     * 临床物理治疗费
     */
    private String clinicalPhysicalFee;

    /**
     * 手术治疗费
     */
    private String surgicalFee;

    /**
     * 麻醉费
     */
    private String anesthetizeFee;

    /**
     * 手术费
     */
    private String surgeryFee;

    /**
     * 康复费
     */
    private String recoverFee;

    /**
     * 中医治疗费
     */
    private String tcmTreatmentFee = "0.00";

    /**
     * 西药费
     */
    private String westMedicineFee;

    /**
     * 中成药费
     */
    private String chinesePatentMedicineFee;

    /**
     * 中草药费
     */
    private String chineseHerbalMedicineFee;

    /**
     * 血费
     */
    private String bloodFee;

    /**
     * 白蛋白类制品费
     */
    private String albuminProductsFee;

    /**
     * 球蛋白类制品费
     */
    private String globulinProductsFee;

    /**
     * 凝血因子类制品费
     */
    private String coagulationFactorProductsFee;

    /**
     * 细胞因子类制品费
     */
    private String cytokineProductsFee;

    /**
     * 检查用一次性医用材料费
     */
    private String costOfDisposableMedicalMaterialsForExamination;

    /**
     * 治疗用一次性医用材料费
     */
    private String costOfDisposableMedicalMaterialsForTreatment;

    /**
     * 手术用一次性医用材料费
     */
    private String costOfDisposableMedicalMaterialsForOperation;

    /**
     * 其他费
     */
    private String otherFees;

    /**
     * 门诊与出院
     */
    private String diagConform1;

    /**
     * 入院与出院
     */
    private String diagConform2;

    /**
     * 术前与术后
     */
    private String diagConform3;

    /**
     * 临床与病理
     */
    private String diagConform4;

    /**
     * 放射与病理
     */
    private String diagConform5;

    /**
     * 抢救次数
     */
    private String rescueTimes;

    /**
     * 抢救成功次数
     */
    private String rescueSuccessTimes;

    /**
     * 病例分型
     */
    private String caseClassification;

    /**
     * 是否实施重症监护
     */
    private String hasIcu;

    /**
     * 重症监护时间（天）
     */
    private String icuDays;

    /**
     * 重症监护时间（小时）
     */
    private String icuHours;

    /**
     * 单病种管理
     */
    private String monopathyManagement;

    /**
     * 临床路径管理
     */
    private String clinicalPathwayManagement;

    /**
     * DRGs管理
     */
    private String drgsManagement;

    /**
     * 抗生素使用（1是 2否）
     */
    private String useAntibiotic;

    /**
     * 细菌培养标本送检（1是 2否）
     */
    private String bacilliculture;

    /**
     * 法定传染病
     */
    private String statutoryEpidemic;

    /**
     * 肿瘤分期（T）
     */
    private String tumorLevelT;

    /**
     * 肿瘤分期（N）
     */
    private String tumorLevelN;

    /**
     * 肿瘤分期（M）
     */
    private String tumorLevelM;

    /**
     * 肿瘤分期
     */
    private String tumorLevel;

    /**
     * 新生儿Apgar评分
     */
    private String xxeApgar;

    /**
     * 医疗类别
     */
    private String medType;

    /**
     * 是否有婴儿
     */
    private String hasInfant;

    /**
     *
     */
    private String zkWardCode;

    /**
     * 出院主诊断治愈好转率
     * */
    private Integer mainDisdiagStatus;

    private Integer maindiagInputErr;
    private Integer maindiagCodeErr;
    private Integer mainsurgInputErr;
    private Integer mainsurgCodeErr;

    /**
     * 诊断列表
     */
    @TableField(exist = false)
    private List<CaseFrontsheetDisdiag> disdiagList;

    /**
     * 手术列表
     */
    @TableField(exist = false)
    private List<CaseFrontsheetSurgery> surgeryList;

    /**
     * 险种类型
     * */
    @TableField(exist = false)
    private String insutype;

    /**
     * 医疗类别名称
     */
    @TableField(exist = false)
    private String medTypeName;

    @TableField(exist = false)
    private StandardAddressMember addressMember;

    @TableField(exist = false)
    private Boolean isDoctorPrint;

    @TableField(exist = false)
    private Integer duplicated;

    @TableField(exist = false)
    private Integer closedown;

    @TableField(exist = false)
    private Integer lendout;

    @TableField(exist = false)
    private AuditState auditState;

    @TableField(exist = false)
    private FrontSheetSupplement supplement;

    public List<CaseFrontsheetDisdiag> getDisdiagList() {
        return null == disdiagList ? new ArrayList<>() : disdiagList;
    }

    public List<CaseFrontsheetSurgery> getSurgeryList() {
        return null == surgeryList ? new ArrayList<>() : surgeryList;
    }

    public String getRescueTimes() {
        return isBlank(rescueTimes) ? "0" : rescueTimes;
    }

    public String getRescueSuccessTimes() {
        return isBlank(rescueSuccessTimes) ? "0" : rescueSuccessTimes;
    }

    public String getComaDaysBeforeAdmiss() {
        return isBlank(comaDaysBeforeAdmiss) ? "0" : comaDaysBeforeAdmiss;
    }

    public String getComaHoursBeforeAdmiss() {
        return isBlank(comaHoursBeforeAdmiss) ? "0" : comaHoursBeforeAdmiss;
    }

    public String getComaMinutesBeforeAdmiss() {
        return isBlank(comaMinutesBeforeAdmiss) ? "0" : comaMinutesBeforeAdmiss;
    }

    public String getComaDaysAfterAdmiss() {
        return isBlank(comaDaysAfterAdmiss) ? "0" : comaDaysAfterAdmiss;
    }

    public String getComaHoursAfterAdmiss() {
        return isBlank(comaHoursAfterAdmiss) ? "0" : comaHoursAfterAdmiss;
    }

    public String getComaMinutesAfterAdmiss() {
        return isBlank(comaMinutesAfterAdmiss) ? "0" : comaMinutesAfterAdmiss;
    }

    public String getTotalCost() {
        return isBlank(totalCost) ? "0" : totalCost.trim();
    }

    public String getSelfPay() {
        return isBlank(selfPay) ? "0.00" : selfPay.trim();
    }

    public String getSurgicalFee() {
        return isBlank(surgicalFee) ? "0.00" : surgicalFee.trim();
    }

    public String getAnesthetizeFee() {
        return isBlank(anesthetizeFee) ? "0.00" : anesthetizeFee.trim();
    }

    public String getSurgeryFee() {
        return isBlank(surgeryFee) ? "0.00" : surgeryFee.trim();
    }

    public String getDismissDept() {
        return isBlank(dismissDept) ? getAdmissDept() : dismissDept.trim();
    }

    public String getDismissWard() {
        return isBlank(dismissWard) ? getAdmissWard() : dismissWard.trim();
    }

    public String getIcuDays() {
        return isBlank(icuDays) ? "0" : icuDays;
    }

    public String getIcuHours() {
        return isBlank(icuHours) ? "0" : icuHours;
    }

    public Boolean isDoctorPrint() {
        return null != isDoctorPrint && isDoctorPrint;
    }

    public String getPathologicDiagStr() {
        return null == pathologicDiagStr ? "" : pathologicDiagStr;
    }

    public String getClinicDiagStr() {
        return null == clinicDiagStr ? "" : clinicDiagStr;
    }
}
