package cn.palmte.work.model;

import cn.palmte.work.bean.ApproveStatusEnum;
import org.hibernate.annotations.GenericGenerator;
import top.jfunc.common.datetime.DatetimeUtils;

import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date;

/**
 * 项目实体
 * @author xiongshiyan at 2021/10/29 , contact me with email yanshixiong@126.com or phone 15208384257
 */
@Entity
@Table(name = "project")
public class Project {
    public static final int STATUS_ESTIMATE = 1;
    public static final int STATUS_BUDGET = 5;
    public static final int STATUS_SETTLE = 10;
    public static final int STATUS_FINAL = 15;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @GenericGenerator(name = "persistenceGenerator", strategy = "increment")
    private int id;
    /**
     * 序号
     */
    @Transient
    private int tempId;
    /**
     * 项目编号
     */
    private String projectNo;
    /**
     * 项目名称
     */
    private String name;
    /**
     * 项目类型:1工程集成类、2设备集成类、3战略合作类
     */
    private int type;
    @Column(name = "type_desc")
    private String typeDesc;
    /**
     * 项目状态:1项目创建(概算),5预算,10结算,15决算
     */
    private int status;
    @Column(name = "status_desc")
    private String statusDesc;
    /**
     * 概算、预算、结算、决算:审核状态:0草稿,1待审核,2审核通过,3审核不通过
     */
    @Column(name = "approve_status_estimate")
    private int approveStatusEstimate = -1;
    @Column(name = "approve_status_budget")
    private int approveStatusBudget = -1;
    @Column(name = "approve_status_settle")
    private int approveStatusSettle = -1;
    @Column(name = "approve_status_final")
    private int approveStatusFinal = -1;

    /**
     * 审核人id
     */
    @Column(name = "approve_id")
    private int approveId = 0;
    @Column(name = "approve_name")
    private String approveName;
    /**
     * 项目创建者id
     */
    @Column(name = "creator_id")
    private int creatorId;
    @Column(name = "creator_name")
    private String creatorName;
    /**
     * 项目部门id
     */
    @Column(name = "dept_id")
    private int deptId;
    @Column(name = "dept_name")
    private String deptName;
    /**
     * 项目开始时间,精确到月
     */
    @Column(name = "start_date")
    @Temporal(TemporalType.TIMESTAMP)
    private Date startDate;
    /**
     * 项目结束时间,精确到月
     */
    @Column(name = "end_date")
    @Temporal(TemporalType.TIMESTAMP)
    private Date endDate;
    /**
     * 垫资模式:1A类-不垫资(战略合作),2B类-不垫资(背靠背),3C类-垫资(账期覆盖),4D类-垫资(账期不覆盖)
     */
    @Column(name = "underwritten_mode")
    private int underwrittenMode;
    /**
     * 合作对象
     */
    @Column(name = "collaborator")
    private String collaborator;
    /**
     * 合作对象url
     */
    @Column(name = "collaborator_url")
    private String collaboratorUrl;
    /**
     * 客户名称
     */
    @Column(name = "customer")
    private String customer;
    /**
     * 最终用户名称
     */
    @Column(name = "terminal_customer")
    private String terminalCustomer;
    /**
     * 垫资利息(元为单位)
     */
    @Column(name = "advance_interest_amount")
    private BigDecimal advanceInterestAmount;
    /**
     * 垫资峰值
     */
    @Column(name = "advance_peak_amount")
    private BigDecimal advancePeakAmount;
    /**
     * 合同金额
     */
    @Column(name = "contract_amount")
    private BigDecimal contractAmount;
    /**
     * 行业场景应用
     */
    @Column(name = "industry_scene")
    private Integer industryScene;
    /**
     * 行业场景应用
     */
    @Column(name = "industry_scenario")
    private String industryScenario;
    /**
     *华智产品金额
     */
    @Column(name = "huazhi_product_amount")
    private BigDecimal huazhiProductAmount;
    /**
     *其他产品金额
     */
    @Column(name = "ziguang_other_amount")
    private BigDecimal ziguangOtherAmount;
    /**
     * 主合同收款条款
     */
    @Column(name = "main_contract_collection_terms")
    private String mainContractCollectionTerms;
    /**
     * 价值及风险
     */
    @Column(name = "value_risk")
    private String valueRisk;
    /**
     * 其他中的小类名称
     */
    @Column(name = "other_name")
    private String otherName;
    /**
     * 项目创建时的配置的阀值
     */
    @Column(name = "project_contribution_profit_rate_threshold")
    private BigDecimal projectContributionProfitRateThreshold;
    /**
     * 项目创建配置的年利率
     */
    @Column(name = "underwritten_tax_rate")
    private BigDecimal underwrittenTaxRate;
    /**
     * 创建时间
     */
    @Column(name = "create_time")
    @Temporal(TemporalType.TIMESTAMP)
    private Date createTime;
    /**
     * 最后更新时间
     */
    @Column(name = "last_update_time")
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastUpdateTime;

    @Column(name = "plan_start_str")
    private String planStartStr;

    @Column(name = "plan_end_str")
    private String planEndStr;

    @Column(name = "underwritten_mode_str")
    private String underwrittenModeStr;

    @Column(name = "cooperate_type")
    private Integer cooperateType;

    @Column(name = "cooperate_type_str")
    private String cooperateTypeStr;

    @Column(name = "certainty")
    private Integer certainty;

    @Column(name = "certainty_str")
    private String certaintyStr;

    @Column(name = "gross_profit")
    private BigDecimal grossProfit;

    @Column(name = "gross_profit_margin")
    private BigDecimal grossProfitMargin;

    @Column(name = "huizhi_product_amount")
    private BigDecimal huizhiProductAmount;

    @Column(name = "huasan_product_amount")
    private BigDecimal huasanProductAmount;

    @Column(name = "principal")
    private String principal;

    @Column(name = "contract_time")
    private Date contractTime;

    @Column(name = "bids_time")
    private Date bidsTime;

    @Column(name = "is_second")
    private Integer isSecond;

    @Column(name = "is_second_str")
    private String isSecondStr;

    @Column(name = "sign_type")
    private Integer signType;

    @Column(name = "sign_type_str")
    private String signTypeStr;

    @Column(name = "resolve_plan")
    private Integer resolvePlan;

    @Column(name = "resolve_plan_str")
    private String resolvePlanStr;

    @Column(name = "main_contract_resolve_plan")
    private String mainContractResolvePlan;

    @Column(name = "calculation_collection")
    private String calculationCollection;

    @Column(name = "stage")
    private Integer stage;

    @Column(name = "stage_remark")
    private String stageRemark;

    @Transient
    private String contractRound;

    @Transient
    private String huazhiRound;

    @Transient
    private String ziguangRound;

    @Transient
    private String huizhiRound;

    @Transient
    private String huasanRound;

    @Transient
    private String grossProfitRound;

    @Transient
    private String grossProfitMarginRound;

    @Transient
    private String advanceInterestAmountRound;

    @Transient
    private String advancePeakAmountRound;

    @Transient
    private String contractRound2;

    @Transient
    private String huazhiRound2;

    @Transient
    private String ziguangRound2;

    @Transient
    private String huizhiRound2;

    @Transient
    private String huasanRound2;

    @Transient
    private String grossProfitRound2;

    @Transient
    private String grossProfitMarginRound2;

    @Transient
    private String advanceInterestAmountRound2;

    @Transient
    private String advancePeakAmountRound2;

    @Transient
    private int isBudget;

    @Transient
    private String remark;

    /**
     * 审批任务节点
     */
    @Transient
    private String actTaskName;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getTempId() {
        return tempId;
    }

    public void setTempId(int tempId) {
        this.tempId = tempId;
    }

    public String getProjectNo() {
        return projectNo;
    }

    public void setProjectNo(String projectNo) {
        this.projectNo = projectNo;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getTypeDesc() {
        return typeDesc;
    }

    public void setTypeDesc(String typeDesc) {
        this.typeDesc = typeDesc;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getStatusDesc() {
        return statusDesc;
    }

    public void setStatusDesc(String statusDesc) {
        this.statusDesc = statusDesc;
    }


    public int getApproveStatus() {
        if(status == STATUS_ESTIMATE){
            return approveStatusEstimate;
        }
        if(status == STATUS_BUDGET){
            return approveStatusBudget;
        }
        if(status == STATUS_SETTLE){
            return approveStatusSettle;
        }
        if(status == STATUS_FINAL){
            return approveStatusFinal;
        }
        return -1;
    }

    public String getApproveStatusDesc() {
        int approveStatus = getApproveStatus();
        if(-1 == approveStatus){
            return "未知";
        }
        return ApproveStatusEnum.parseApproveStatus(approveStatus).getApproveStatusDesc();
    }

    public int getApproveStatusEstimate() {
        return approveStatusEstimate;
    }

    public void setApproveStatusEstimate(int approveStatusEstimate) {
        this.approveStatusEstimate = approveStatusEstimate;
    }

    public int getApproveStatusBudget() {
        return approveStatusBudget;
    }

    public void setApproveStatusBudget(int approveStatusBudget) {
        this.approveStatusBudget = approveStatusBudget;
    }

    public int getApproveStatusSettle() {
        return approveStatusSettle;
    }

    public void setApproveStatusSettle(int approveStatusSettle) {
        this.approveStatusSettle = approveStatusSettle;
    }

    public int getApproveStatusFinal() {
        return approveStatusFinal;
    }

    public void setApproveStatusFinal(int approveStatusFinal) {
        this.approveStatusFinal = approveStatusFinal;
    }

    public int getApproveId() {
        return approveId;
    }

    public void setApproveId(int approveId) {
        this.approveId = approveId;
    }

    public String getApproveName() {
        return approveName;
    }

    public void setApproveName(String approveName) {
        this.approveName = approveName;
    }

    public int getCreatorId() {
        return creatorId;
    }

    public void setCreatorId(int creatorId) {
        this.creatorId = creatorId;
    }

    public String getCreatorName() {
        return creatorName;
    }

    public void setCreatorName(String creatorName) {
        this.creatorName = creatorName;
    }

    public int getDeptId() {
        return deptId;
    }

    public void setDeptId(int deptId) {
        this.deptId = deptId;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public Date getStartDate() {
        return startDate;
    }

    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }

    public Date getEndDate() {
        return endDate;
    }

    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }

    public int getUnderwrittenMode() {
        return underwrittenMode;
    }

    public void setUnderwrittenMode(int underwrittenMode) {
        this.underwrittenMode = underwrittenMode;
    }

    public String getCollaborator() {
        return collaborator;
    }

    public void setCollaborator(String collaborator) {
        this.collaborator = collaborator;
    }

    public String getCollaboratorUrl() {
        return collaboratorUrl;
    }

    public void setCollaboratorUrl(String collaboratorUrl) {
        this.collaboratorUrl = collaboratorUrl;
    }

    public String getCustomer() {
        return customer;
    }

    public void setCustomer(String customer) {
        this.customer = customer;
    }

    public String getTerminalCustomer() {
        return terminalCustomer;
    }

    public void setTerminalCustomer(String terminalCustomer) {
        this.terminalCustomer = terminalCustomer;
    }

    public BigDecimal getAdvanceInterestAmount() {
        return advanceInterestAmount;
    }

    public void setAdvanceInterestAmount(BigDecimal advanceInterestAmount) {
        this.advanceInterestAmount = advanceInterestAmount;
    }

    public BigDecimal getAdvancePeakAmount() {
        return advancePeakAmount;
    }

    public void setAdvancePeakAmount(BigDecimal advancePeakAmount) {
        this.advancePeakAmount = advancePeakAmount;
    }

    public BigDecimal getContractAmount() {
        return contractAmount;
    }

    public void setContractAmount(BigDecimal contractAmount) {
        this.contractAmount = contractAmount;
    }

    public Integer getIndustryScene() {
        return industryScene;
    }

    public void setIndustryScene(Integer industryScene) {
        this.industryScene = industryScene;
    }

    public String getIndustryScenario() {
        return industryScenario;
    }

    public void setIndustryScenario(String industryScenario) {
        this.industryScenario = industryScenario;
    }

    public BigDecimal getHuazhiProductAmount() {
        return huazhiProductAmount;
    }

    public void setHuazhiProductAmount(BigDecimal huazhiProductAmount) {
        this.huazhiProductAmount = huazhiProductAmount;
    }

    public BigDecimal getZiguangOtherAmount() {
        return ziguangOtherAmount;
    }

    public void setZiguangOtherAmount(BigDecimal ziguangOtherAmount) {
        this.ziguangOtherAmount = ziguangOtherAmount;
    }

    public String getMainContractCollectionTerms() {
        return mainContractCollectionTerms;
    }

    public void setMainContractCollectionTerms(String mainContractCollectionTerms) {
        this.mainContractCollectionTerms = mainContractCollectionTerms;
    }

    public String getValueRisk() {
        return valueRisk;
    }

    public void setValueRisk(String valueRisk) {
        this.valueRisk = valueRisk;
    }

    public String getOtherName() {
        return otherName;
    }

    public void setOtherName(String otherName) {
        this.otherName = otherName;
    }

    public BigDecimal getProjectContributionProfitRateThreshold() {
        return projectContributionProfitRateThreshold;
    }

    public void setProjectContributionProfitRateThreshold(BigDecimal projectContributionProfitRateThreshold) {
        this.projectContributionProfitRateThreshold = projectContributionProfitRateThreshold;
    }

    public BigDecimal getUnderwrittenTaxRate() {
        return underwrittenTaxRate;
    }

    public void setUnderwrittenTaxRate(BigDecimal underwrittenTaxRate) {
        this.underwrittenTaxRate = underwrittenTaxRate;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getLastUpdateTime() {
        return lastUpdateTime;
    }

    public void setLastUpdateTime(Date lastUpdateTime) {
        this.lastUpdateTime = lastUpdateTime;
    }

    public String getPlanStartStr() {
        return planStartStr;
    }

    public void setPlanStartStr(String planStartStr) {
        this.planStartStr = planStartStr;
    }

    public String getPlanEndStr() {
        return planEndStr;
    }

    public void setPlanEndStr(String planEndStr) {
        this.planEndStr = planEndStr;
    }

    public String getUnderwrittenModeStr() {
        return underwrittenModeStr;
    }

    public void setUnderwrittenModeStr(String underwrittenModeStr) {
        this.underwrittenModeStr = underwrittenModeStr;
    }

    public Integer getCooperateType() {
        return cooperateType;
    }

    public void setCooperateType(Integer cooperateType) {
        this.cooperateType = cooperateType;
    }

    public String getCooperateTypeStr() {
        return cooperateTypeStr;
    }

    public void setCooperateTypeStr(String cooperateTypeStr) {
        this.cooperateTypeStr = cooperateTypeStr;
    }

    public Integer getCertainty() {
        return certainty;
    }

    public void setCertainty(Integer certainty) {
        this.certainty = certainty;
    }

    public String getCertaintyStr() {
        return certaintyStr;
    }

    public void setCertaintyStr(String certaintyStr) {
        this.certaintyStr = certaintyStr;
    }

    public BigDecimal getGrossProfit() {
        return grossProfit;
    }

    public void setGrossProfit(BigDecimal grossProfit) {
        this.grossProfit = grossProfit;
    }

    public BigDecimal getGrossProfitMargin() {
        return grossProfitMargin;
    }

    public void setGrossProfitMargin(BigDecimal grossProfitMargin) {
        this.grossProfitMargin = grossProfitMargin;
    }

    public BigDecimal getHuizhiProductAmount() {
        return huizhiProductAmount;
    }

    public void setHuizhiProductAmount(BigDecimal huizhiProductAmount) {
        this.huizhiProductAmount = huizhiProductAmount;
    }

    public BigDecimal getHuasanProductAmount() {
        return huasanProductAmount;
    }

    public void setHuasanProductAmount(BigDecimal huasanProductAmount) {
        this.huasanProductAmount = huasanProductAmount;
    }

    public String getPrincipal() {
        return principal;
    }

    public void setPrincipal(String principal) {
        this.principal = principal;
    }

    public Date getContractTime() {
        return contractTime;
    }

    public void setContractTime(Date contractTime) {
        this.contractTime = contractTime;
    }

    public Date getBidsTime() {
        return bidsTime;
    }

    public void setBidsTime(Date bidsTime) {
        this.bidsTime = bidsTime;
    }

    public Integer getIsSecond() {
        return isSecond;
    }

    public void setIsSecond(Integer isSecond) {
        this.isSecond = isSecond;
    }

    public String getIsSecondStr() {
        return isSecondStr;
    }

    public void setIsSecondStr(String isSecondStr) {
        this.isSecondStr = isSecondStr;
    }

    public Integer getSignType() {
        return signType;
    }

    public void setSignType(Integer signType) {
        this.signType = signType;
    }

    public String getSignTypeStr() {
        return signTypeStr;
    }

    public void setSignTypeStr(String signTypeStr) {
        this.signTypeStr = signTypeStr;
    }

    public Integer getResolvePlan() {
        return resolvePlan;
    }

    public void setResolvePlan(Integer resolvePlan) {
        this.resolvePlan = resolvePlan;
    }

    public String getResolvePlanStr() {
        return resolvePlanStr;
    }

    public void setResolvePlanStr(String resolvePlanStr) {
        this.resolvePlanStr = resolvePlanStr;
    }

    public String getMainContractResolvePlan() {
        return mainContractResolvePlan;
    }

    public void setMainContractResolvePlan(String mainContractResolvePlan) {
        this.mainContractResolvePlan = mainContractResolvePlan;
    }

    public String getCalculationCollection() {
        return calculationCollection;
    }

    public void setCalculationCollection(String calculationCollection) {
        this.calculationCollection = calculationCollection;
    }

    public String getContractRound() {
        return contractRound;
    }

    public void setContractRound(String contractRound) {
        this.contractRound = contractRound;
    }

    public String getHuazhiRound() {
        return huazhiRound;
    }

    public void setHuazhiRound(String huazhiRound) {
        this.huazhiRound = huazhiRound;
    }

    public String getZiguangRound() {
        return ziguangRound;
    }

    public void setZiguangRound(String ziguangRound) {
        this.ziguangRound = ziguangRound;
    }

    public String getHuizhiRound() {
        return huizhiRound;
    }

    public void setHuizhiRound(String huizhiRound) {
        this.huizhiRound = huizhiRound;
    }

    public String getHuasanRound() {
        return huasanRound;
    }

    public void setHuasanRound(String huasanRound) {
        this.huasanRound = huasanRound;
    }

    public String getGrossProfitRound() {
        return grossProfitRound;
    }

    public void setGrossProfitRound(String grossProfitRound) {
        this.grossProfitRound = grossProfitRound;
    }

    public String getGrossProfitMarginRound() {
        return grossProfitMarginRound;
    }

    public void setGrossProfitMarginRound(String grossProfitMarginRound) {
        this.grossProfitMarginRound = grossProfitMarginRound;
    }

    public String getAdvanceInterestAmountRound() {
        return advanceInterestAmountRound;
    }

    public void setAdvanceInterestAmountRound(String advanceInterestAmountRound) {
        this.advanceInterestAmountRound = advanceInterestAmountRound;
    }

    public String getAdvancePeakAmountRound() {
        return advancePeakAmountRound;
    }

    public void setAdvancePeakAmountRound(String advancePeakAmountRound) {
        this.advancePeakAmountRound = advancePeakAmountRound;
    }

    public String getContractRound2() {
        return contractRound2;
    }

    public void setContractRound2(String contractRound2) {
        this.contractRound2 = contractRound2;
    }

    public String getHuazhiRound2() {
        return huazhiRound2;
    }

    public void setHuazhiRound2(String huazhiRound2) {
        this.huazhiRound2 = huazhiRound2;
    }

    public String getZiguangRound2() {
        return ziguangRound2;
    }

    public void setZiguangRound2(String ziguangRound2) {
        this.ziguangRound2 = ziguangRound2;
    }

    public String getHuizhiRound2() {
        return huizhiRound2;
    }

    public void setHuizhiRound2(String huizhiRound2) {
        this.huizhiRound2 = huizhiRound2;
    }

    public String getHuasanRound2() {
        return huasanRound2;
    }

    public void setHuasanRound2(String huasanRound2) {
        this.huasanRound2 = huasanRound2;
    }

    public String getGrossProfitRound2() {
        return grossProfitRound2;
    }

    public void setGrossProfitRound2(String grossProfitRound2) {
        this.grossProfitRound2 = grossProfitRound2;
    }

    public String getGrossProfitMarginRound2() {
        return grossProfitMarginRound2;
    }

    public void setGrossProfitMarginRound2(String grossProfitMarginRound2) {
        this.grossProfitMarginRound2 = grossProfitMarginRound2;
    }

    public String getAdvanceInterestAmountRound2() {
        return advanceInterestAmountRound2;
    }

    public void setAdvanceInterestAmountRound2(String advanceInterestAmountRound2) {
        this.advanceInterestAmountRound2 = advanceInterestAmountRound2;
    }

    public String getAdvancePeakAmountRound2() {
        return advancePeakAmountRound2;
    }

    public void setAdvancePeakAmountRound2(String advancePeakAmountRound2) {
        this.advancePeakAmountRound2 = advancePeakAmountRound2;
    }

    public int getIsBudget() {
        return isBudget;
    }

    public void setIsBudget(int isBudget) {
        this.isBudget = isBudget;
    }

    public String getActTaskName() {
        return actTaskName;
    }

    public void setActTaskName(String actTaskName) {
        this.actTaskName = actTaskName;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public Integer getStage() {
        return stage;
    }

    public void setStage(Integer stage) {
        this.stage = stage;
    }

    public String getStageRemark() {
        return stageRemark;
    }

    public void setStageRemark(String stageRemark) {
        this.stageRemark = stageRemark;
    }
}