k94314517
2025-05-20 142bcc9b22f48a8a2098a66b2964fe10c97c6fe8
server/service/src/main/java/com/doumee/core/utils/Constants.java
@@ -1,15 +1,16 @@
package com.doumee.core.utils;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.IdcardUtil;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.dao.business.dto.CountCyclePriceDTO;
import com.doumee.dao.business.model.ApplyDetail;
import com.doumee.dao.business.model.Solutions;
import com.doumee.dao.business.model.*;
import com.doumee.dao.business.vo.ChangeDealTypeVO;
import com.doumee.dao.business.vo.CountCyclePriceVO;
import io.swagger.models.auth.In;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.compress.archivers.zip.Zip64Mode;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.lang3.StringUtils;
@@ -34,6 +35,8 @@
    public static final int TWO = 2 ;
    public static final int
            THREE = 3 ;
    public static final int FIVE = 5 ;
    public static final int SIX = 6 ;
    public static final int SEVEN = 7 ;
    public static final String ACCESS_ID="ACCESS_ID";
    public static final String BUCKETNAME = "BUCKETNAME";
@@ -53,15 +56,16 @@
    public static final String WX_MIN_APPID = "WX_MIN_APPID";
    public static final String WX_MIN_SECRET = "WX_MIN_SECRET";
    public static final String PLAT_COMPANY_NAME ="PLAT_COMPANY_NAME";
    public static final String PLAT_CREDIT_CODE ="PLAT_CREDIT_CODE";
    public static final String PLAT_EMAIL ="PLAT_EMAIL";
    public static final String SYSTEM ="SYSTEM";
    public static final String PROTOCOL ="PROTOCOL";
    public static final String PRIVACY ="PRIVACY";
    public static final String USE ="USE";
    public static final String GOODS_IMG_DIR ="GOODS_IMG_DIR";
    public static final String CREDIT_CODE_REGEX = "[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}";
    public static final String  ROOT_PATH="ROOT_PATH";//本地文件上传地址配置
    public static final String  FILE_DIR="FILE_DIR";//本地文件访问地址配置
@@ -92,12 +96,121 @@
    public static final String SMS_COMNAME = "SMS_COMNAME";
    public static final String TAXES_FILE = "TAXES_FILE";
    public static final String APPLY_FILE ="APPLY_FILE" ;
    public static final String COMPANY_USER_APPLY ="COMPANY_USER_APPLY" ;
    public static final String INSURANCE ="INSURANCE" ;
    public static final String CONTRACT ="CONTRACT" ;
    public static final String SETTLE_FILE ="SETTLE_FILE" ;
    public static final String DU_FILE ="DU_FILE" ;
    public static final String SIGN_DONE_NOTIFY_URL = "SIGN_DONE_NOTIFY_URL";
    public static final int FOUR = 4;
    public static final String COMPANY_PHONE_AUTH ="COMPANY_PHONE_AUTH" ;
    /*RISK_TIMES_OPEN   风险提醒设置-多次出现提醒是否开启:0=否;1=是;
    RISK_TIMES_REPORT_TIMES   风险提醒设置-多次出现报案次数提醒
    RISK_REPEAT_REPORT_OPEN   风险提醒设置-重复报案是否开启:0=否;1=是;
    RISK_REPEAT_REPORT_TIME_UNIT   风险提醒设置-重复报案时间单位:0分钟 1小时 2天
    RISK_REPEAT_REPORT_TIME   风险提醒设置-重复报案时间
    RISK_CLAIM_TIMES_OPEN   风险提醒设置-索赔次数过多是否开启:0=否;1=是;
    RISK_CLAIM_TIMES   风险提醒设置-索赔次数
    RISK_NEW_MEMBER_OPEN   风险提醒设置-新员工出险提醒是否开启:0=否;1=是;
    RISK_NEW_MEMBER_TIME_UNIT   风险提醒设置-新员工出险提醒时间单位:0分钟 1小时 2天
    RISK_NEW_MEMBER_TIME   风险提醒设置-新员工出险提醒时间
    RISK_SENSITIVE_WORDS_OPEN   风险提醒设置-敏感词提醒是否开启:0=否;1=是;
    RISK_SENSITIVE_WORDS   风险提醒设置-多次出现报案次数提醒*/
    public static final String RISK_TIMES_OPEN ="RISK_TIMES_OPEN" ;
    public static final String RISK_TIMES_REPORT_TIMES ="RISK_TIMES_REPORT_TIMES" ;
    public static final String RISK_REPEAT_REPORT_OPEN ="RISK_REPEAT_REPORT_OPEN" ;
    public static final String RISK_REPEAT_REPORT_TIME_UNIT ="RISK_REPEAT_REPORT_TIME_UNIT" ;
    public static final String RISK_REPEAT_REPORT_TIME ="RISK_REPEAT_REPORT_TIME" ;
    public static final String RISK_CLAIM_TIMES_OPEN ="RISK_CLAIM_TIMES_OPEN" ;
    public static final String RISK_CLAIM_TIMES ="RISK_CLAIM_TIMES" ;
    public static final String RISK_NEW_MEMBER_OPEN ="RISK_NEW_MEMBER_OPEN" ;
    public static final String RISK_NEW_MEMBER_TIME_UNIT ="RISK_NEW_MEMBER_TIME_UNIT" ;
    public static final String RISK_NEW_MEMBER_TIME ="RISK_NEW_MEMBER_TIME" ;
    public static final String RISK_SENSITIVE_WORDS_OPEN ="RISK_SENSITIVE_WORDS_OPEN" ;
    public static final String RISK_SENSITIVE_WORDS ="RISK_SENSITIVE_WORDS" ;
    /**
     * 获取申请单时间列标题
     * @param type 0开始时间 1截止时间
     * @param model
     * @return
     */
    public static String getApplyTimeTitle(int type, InsuranceApply model){
        if(type ==1){
            if(Constants.equalsInteger(model.getSolutionType(),Constants.ONE)){
                return  Constants.equalsInteger(model.getUnionApplyTbdStatus(),Constants.THREE)?"保险生效起期":"期望保险生效起期";
            }else{
                return  Constants.equalsInteger(model.getStatus(), InsuranceApplyStatus.UPLOAD_INSURANCE.getKey())?"保险生效起期":"期望保险生效起期";
            }
        }else{
            if(Constants.equalsInteger(model.getSolutionType(),Constants.ONE)){
                return  Constants.equalsInteger(model.getUnionApplyTbdStatus(),Constants.THREE)?"保险生效止期":"预计生效止期";
            }else{
                return  Constants.equalsInteger(model.getStatus(), InsuranceApplyStatus.UPLOAD_INSURANCE.getKey())?"保险生效止期":"预计生效止期";
            }
        }
    }
    public interface DATAPERMISSION_TYPE{
        public static final  int all = 0;
        public static final  int departAndChild = 1;
        public static final  int departAndLeaf = 2;
        public static final  int depart = 3;
        public static final  int custom = 4;
        public static final  int self = -1;
    }
    /**
     * 获取批改单时间标题列
     * @param type 0更换派遣单位 1加保 0减保
     * @param model
     * @return
     */
    public static String getChangeApplyTimeTitle(int type, ApplyChange model){
        if(type ==2){
             return  Constants.equalsInteger(model.getStatus(), ApplyChangeStatus.APPROVE.getKey())?"批单生效期":"期望批单生效期";
        }else  if(type ==1){
            return  Constants.equalsInteger(model.getStatus(), ApplyChangeStatus.APPROVE.getKey())?"批增生效起期":"期望批增生效起期";
        }else{
            return  Constants.equalsInteger(model.getStatus(), ApplyChangeStatus.APPROVE.getKey())?"批减生效起期":"期望批减生效起期";
        }
    }
    public static String getApplyTimeTitle(int type, UnionApply model){
        if(type ==1){
                return  Constants.equalsInteger(model.getStatus(), UnionApplyStatus.FINISH.getKey())?"保险生效起期":"期望保险生效起期";
        }else{
                return  Constants.equalsInteger(model.getStatus(), UnionApplyStatus.FINISH.getKey())?"保险生效止期":"预计生效止期";
        }
    }
    /**
     * 获取批改单时间标题列
     * @param type 0更换派遣单位 1加保 0减保
     * @param model
     * @return
     */
    public static String getChangeApplyTimeTitle(int type, UnionChange model){
        if(type ==2){
             return  Constants.equalsInteger(model.getStatus(), UnionChangeStatus.FINISH.getKey())?"批单生效期":"期望批单生效期";
        }else  if(type ==1){
            return  Constants.equalsInteger(model.getStatus(), UnionChangeStatus.FINISH.getKey())?"批增生效起期":"期望批增生效起期";
        }else{
            return  Constants.equalsInteger(model.getStatus(), UnionChangeStatus.FINISH.getKey())?"批减生效起期":"期望批减生效起期";
        }
    }
    /**
     * 企业数据来源 0平台注册 1后台导入
     */
@@ -645,6 +758,18 @@
        WTB_CA_DONE_PDF(23, "委托加减保/换厂业务 - 合并单最终保单", "委托加减保/换厂业务 - 合并单最终保单"),
        WTB_CONFIRMATION_LATTER(24, "委托保 - 投保方案确认书", "委托保 - 投保方案确认书"),
        WTB_CA_TBD_PDF(25, "委托加减保/换厂业务 -申请单(商户签署后PDF)", "委托加减保/换厂业务 -申请单(商户签署后PDF)"),
        CONTRACT_PDF(26, "合同附件", "合同附件"),
        CONTRACT_FIRST_PDF(27, "合同签署附件", "合同签署附件"),
        CONTRACT_DONE_PDF(28, "合同签署附件", "合同签署附件"),
        COMPANY_SOLUTION_SIGN_PDF(29, "企业签署后方案确认书", "企业签署后方案确认书"),
        COMPANY_USER_APPLY(30, "企业申请集团用户附件", "企业申请集团用户附件"),
        LP_STAMP_FILE(31, "保险公司理赔盖章文件", "保险公司理赔盖章文件"),
        LP_FILE(32, "保险公司上传理赔材料一览表", "保险公司上传理赔材料一览表"),
        LP_OTHER_FILE(33, "理赔其他材料", "理赔其他材料"),
        LP_PAY_FILE(34, "打款凭证", "打款凭证"),
        ;
        // 成员变量
        private String name;
@@ -660,7 +785,7 @@
        // 普通方法
        public static String getName(int index) {
            for (ProjectRecord c : ProjectRecord.values()) {
            for (MultiFile c : MultiFile.values()) {
                if (c.getKey() == index) {
                    return c.name;
                }
@@ -670,7 +795,7 @@
        // 普通方法
        public static String getInfo(int index) {
            for (ProjectRecord c : ProjectRecord.values()) {
            for (MultiFile c : MultiFile.values()) {
                if (c.getKey() == index) {
                    return c.noteinfo;
                }
@@ -761,10 +886,8 @@
    }
    public static void main(String[] args) {
        System.out.println(IdcardUtil.isValidCard("342623199201150101"));
        System.out.println(IdcardUtil.isValidCard("342623199201150102"));
        System.out.println(IdcardUtil.isValidCard("342623199201150103"));
        System.out.println(IdcardUtil.isValidCard("342623199201150104"));
         System.out.println(BigDecimal.valueOf(3.45678).setScale(2,BigDecimal.ROUND_HALF_UP));
        System.out.println(BigDecimal.valueOf(3.45678).setScale(2,BigDecimal.ROUND_DOWN));
//        System.out.println(IdcardUtil.isValidCard("340621199310134818"));
//        System.out.println(IdcardUtil.isValidCard("341621199310134818"));
@@ -961,7 +1084,7 @@
    public  enum ApplyLogType {
        UPLOAD(0, "提交投保","提交意见:${param}",0),
        PLATFORM_RETURN(1, "退回投保","提交意见:${param}",0),
        PLATFORM_RETURN(1, "退回申请","提交意见:${param}",0),
        WAIT_SIGNATURE(2, "上传投保单","提交意见:${param}",0),
        SIGNATURE(3, "企业签章","",0),
        FAIL_RETURN(4, "保单出具失败退回","提交意见:${param}",0),
@@ -973,14 +1096,14 @@
        COMPANY_EDIT(10, "保单修改","提交意见:${param1}\n${param2}",0),
        PLATFORM_CHECK_PASS(11, "投保审核通过","提交意见:${param}",0),
        CA_PLATFORM_CHECK_PASS_NO(12, "退回投保","提交意见:${param}",1),
        CA_PLATFORM_CHECK_PASS_NO(12, "退回申请","提交意见:${param}",1),
        CA_PLATFORM_AGREE_BACK_APPLY(13, "同意退回申请","提交意见:${param}",1),
        CA_PLATFORM_APPROVE(14, "批单完成","保险生效起期:${param1}变更为${param2}",1),
        CA_PLATFORM_CHECK_SIGNATURE(15, "企业签章","",1),
        CA_COMPANY_EDIT(16, "批单修改","提交意见:${param1}\n${param2}",1),
        CA_COMPANY_COMMIT(17, "提交投保","",1),
        CA_COMPANY_BACK_APPLY(18, "申请退回","提交意见:${param}",1),
        CA_COMPANY_CLOSE(19, "关闭订单","",1),
        CA_COMPANY_CLOSE(19, "关闭申请","",1),
        CA_PALTFORM_REFUSE_APPLY(20, "驳回退回申请","",1),
        CA_PALTFORM_EDIT_PIDAN(21, "修改批单","修改原因:${param}",1),
        CA_JIAJIAN_APPLY_SIGN(23, "加减保申请企业签章","",1),
@@ -1005,6 +1128,7 @@
        IA_HBD_UPLOAD_INSURANCE(35, "投保完成","保险生效起期:${param1}变更为${param2}",3),
        IA_HBD_CLOSE(36, "退回申请","原因:${param}",3),
        IA_HBD_UPLOAD_BXD(41, "上传保险单","",3),
        IA_HBD_REEXAMINE_PASS(42, "复审通过","",3),
@@ -1104,6 +1228,7 @@
        UPLOAD_INSURANCE_POLICY(2, "待出单","",0),
        FINISH(3, "保障中","",0),
        CLOSE(4, "已退回","",0),
        RETRIAL(5, "待审核","",0),
        ;
        // 成员变量
        private String name;
@@ -1391,7 +1516,7 @@
        CLOSE(9, "订单关闭","",6),
        PLATFORM_CHECK_PASS(10,"平台投保审核通过","提交意见:${param}",0),
        COMPANY_BACK_APPLY_PASS(11, "企业申请退回(平台投保审核通过)","提交意见:${param}",5),
        REEXAMINE(12, "商户或平台复审","复审意见:${param}",0),
        WTB_UPLOAD(20, "提交投保","",28),
@@ -1400,7 +1525,7 @@
        WTB_BUSINESS_CHECK_PASS(23,"商户投保审核通过","提交意见:${param}",23),
        WTB_RETURN(24, "已退回","提交意见:${param}",24),
        WTB_CLOSED(25, "已关闭","提交意见:${param}",25),
        WTB_TOUBAOING(26, "投保中","提交意见:${param}",26),
        WTB_TOUBAOING(26, "待出单","提交意见:${param}",26),
        WTB_DONE(27, "保障中","提交意见:${param}",27),
        ;
@@ -1497,7 +1622,10 @@
        CHANGE_FACTORY(2, "员工换厂申请","保险方案"),
        DISPATCH_UNIT(3, "派遣单位申请","派遣单位"),
        TAXES(4, "开票申请","开票金额"),
        SETTLE_CLAIMS(5, "报案理赔","报案人")
        SETTLE_CLAIMS(5, "报案理赔","报案人"),
        CONTRACT(6, "合同签署","合同签署"),
        SOLUTIONS(7, "方案签署","方案签署"),
        COMPANY_USER_APPLY(8, "集团申请","集团申请"),
        ;
        // 成员变量
        private int key;
@@ -1552,18 +1680,19 @@
    public  enum NoticeType {
        ZERO(0, "待审核","","","待审核","待处理","处理中"),
        ONE(1, "企业待签署","","","工种待审核","","已结案"),
        TWO(2, "待出单","待审核","待审核","","",""),
        THREE(3, "申请退回","申请退回","申请退回","","",""),
        FOUR(4, "已退回","已退回","已退回","","","已撤销"),
        FIVE(5, "申请驳回","申请驳回","申请驳回","","",""),
        ZERO(0, "待审核","","","待审核","待处理","处理中","待签署","待签署"),
        ONE(1, "企业待签署","","","工种待审核","","已结案","",""),
        TWO(2, "待出单","待审核","待审核","","","","",""),
        THREE(3, "申请退回","申请退回","申请退回","","","","",""),
        FOUR(4, "已退回","已退回","已退回","","","已撤销","",""),
        FIVE(5, "申请驳回","申请驳回","申请驳回","","","","",""),
        //续保通知
        SIX(6, "","","","","",""),
        SIX(6, "","","","","","","",""),
        //商户端 委托保 - 投保待审核 加减保 换厂 待审核
        SEVEN(7, "待审核","待审核","待审核","","",""),
        EIGHT(8, "","","","","",""),
        NINE(9, "","","","","",""),
        SEVEN(7, "待审核","待审核","待审核","","","","",""),
        //待复审
        EIGHT(8, "待审核","","","","","","",""),
        NINE(9, "","","","","","","",""),
        ;
        // 成员变量
@@ -1574,11 +1703,13 @@
        private String dispatchUnitDetail;
        private String taxesDetail;
        private String settleClaimsDetail;
        private String contract;
        private String solutions;
        // 构造方法
        NoticeType(int status, String insuranceApplyDetail,String applyChangeDetail
                , String changeFactoryDetail,String dispatchUnitDetail
                , String taxesDetail,String settleClaimsDetail) {
                , String taxesDetail,String settleClaimsDetail,String contract,String solutions) {
            this.status = status;
            this.insuranceApplyDetail = insuranceApplyDetail;
            this.applyChangeDetail = applyChangeDetail;
@@ -1586,6 +1717,8 @@
            this.dispatchUnitDetail = dispatchUnitDetail;
            this.taxesDetail = taxesDetail;
            this.settleClaimsDetail = settleClaimsDetail;
            this.contract = contract;
            this.solutions = solutions;
        }
        // 普通方法
@@ -1604,6 +1737,10 @@
                        return c.getTaxesDetail();
                    }else if(type == NoticeObjectType.SETTLE_CLAIMS.getKey()){
                        return c.getSettleClaimsDetail();
                    }else if(type == NoticeObjectType.CONTRACT.getKey()){
                        return c.getContract();
                    }else if(type == NoticeObjectType.SOLUTIONS.getKey()){
                        return c.getContract();
                    }
                }
            }
@@ -1667,6 +1804,13 @@
            this.settleClaimsDetail = settleClaimsDetail;
        }
        public String getContract() {
            return contract;
        }
        public void setContract(String info) {
            this.contract = contract;
        }
    }
@@ -1741,18 +1885,78 @@
    }
    public  enum SettleClaimsStatus {
        WAIT_ACCEPTANCE(0, "待受理"),
        RETURN_ACCEPTANCE(1, "退回受理"),
        DEAL_ING(2, "受理中"),
        CONFIRM_INFORMATION(3, "确认资料"),
        FINISH_ACCEPTANCE(4, "完成受理"),
    public enum CONTRACT_STATUS{
        WAIT(0, "待签署"),
        OUT_SIGN(1, "我方已签署"),
        COMPANY_SIGN(2, "企业/商户已签署"),
        FINISH(3, "已完成"),
        CANCEL(4, "已取消"),
        CLOSE(5, "已关闭"),
        ;
        // 成员变量
        private String name;
        private int key;
        // 构造方法
        CONTRACT_STATUS(int key, String name) {
            this.name = name;
            this.key = key;
        }
        // 普通方法
        public static String getName(int index) {
            for (CONTRACT_STATUS c : CONTRACT_STATUS.values()) {
                if (c.getKey() == index) {
                    return c.name;
                }
            }
            return null;
        }
        // get set 方法
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getKey() {
            return key;
        }
        public void setKey(int key) {
            this.key = key;
        }
    }
    public  enum SettleClaimsStatus {
        //状态 0暂存中 1已报案 2待立案 3已立案 4立案退回 5待受理 6拒绝受理 7商议待审批
        // 8商议审批拒绝 9已受理 10待核赔  11已核赔 12已确认金额 13已结案 14已撤案
        WAIT_ACCEPTANCE(0, "暂存中"),
        RETURN_ACCEPTANCE(1, "已报案"),
        DEAL_ING(2, "待立案 (弃用)"),
        CONFIRM_INFORMATION(3, "已立案"),
        FINISH_ACCEPTANCE(4, "立案退回"),
        WAIT_DEAL(5, "待受理"),
        REJECT_DEAL(6, "拒绝受理"),
        WAIT_DISCUSS_AUDIT(7, "待商议审批"),
        WAIT_DISCUSS_REJECT(8, "商议审批拒绝"),
        ACCEPTANCE(9, "已受理"),//待理算
        WAIT_AUDIT_COMPENSATION(10, "待核赔"),
        COMPENSATION(11, "已核赔"),
        CONFIRM_FEE(12, "已确认金额"),
        CLOSE_CASE(13, "已结案"),
        RETURN(14, "已撤案"),
        ;
        // 成员变量
        private String name;//业务描述
        private int key;//业务状态
        private int companyParentKey;//企业主流程
        private int platformParentKey;//平台主流程
        // 构造方法
        SettleClaimsStatus(int key, String name) {
@@ -1792,15 +1996,28 @@
        UPLOAD(0, "提交报案","提交意见:${param}"),
        PLATFORM_RETURN(1, "平台退回","提交意见:${param}"),
        PLATFORM_CONFIRM_INFORMATION(2, "平台确认资料",""),
        PLATFORM_FINISH(3, "结案提交","提交意见:${param}"),
        PLATFORM_FINISH(3, "结案","提交意见:${param}"),
        UPDATE_DATA(4, "修改信息","提交意见:${param}"),
        SUPPLEMENT(5, "补充说明","提交意见:${param}"),
        PLATFORM_LP_DEAL(6, "平台理赔处理","提交意见:${param}"),
        PLATFORM_LP_DEAL(6, "平台理赔处理","已在平台完成理赔"),
        PLATFORM_REMARK(7, "平台备注标签","${param}"),
        PLATFORM_ADDCODE(8, "平台添加报案号","备案号:${param}"),
        PLATFORM_UN_AGREE_BACK(9, "企业下载资料",""),
        PLATFORM_DOWNLOAD(10, "平台下载资料",""),
        PLATFORM_CHECK_PASS(11, "平台上传资料",""),
        SUPPLEMENT_DESCRIBE(12, "平台填写需补充内容",""),
        RETURN_SETTLE(13, "撤销报案",""),
        PLATFORM_REGISTER(14, "平台立案",""),
        PLATFORM_ACCEPTANCE(15, "受理-已受理",""),
        PLATFORM_REFUSE_ACCEPTANCE(16, "受理-拒绝受理","拒绝原因:${param}"),
        PLATFORM_DISCUSS(17, "受理-商议",""),
        PLATFORM_DISCUSS_PASS(18, "受理-商议通过",""),
        PLATFORM_DISCUSS_REFUSE(19, "受理-商议拒绝","拒绝原因:${param}"),
        PLATFORM_WAIT_DISCUSS(20, "受理-商议待审批",""),
        PLATFORM_HP_DEAL(21, "核赔-提交核赔金额","已提交赔付金额,待用户确认"),
        PLATFORM_UPD_FEE(22, "核赔-修改金额",""),
        CONFIRM_FEE(22, "核赔-客户确认金额","已确认金额"),
        UPD_CASE_TYPE(23, "受理-确认案件类型","已确认案件类型"),
        ;
        // 成员变量
        private String name;
@@ -2138,7 +2355,13 @@
            InputStream inStream = null;
            OutputStream os = null;
            try {
                String tempDir = System.getProperty("java.io.tmpdir")+fileName;
                String tempDir = "C:\\hj\\jars\\temp\\";
                File f =  new File(tempDir);
                if(!f.exists() ){
                    f.mkdirs();
                }
                tempDir +=  fileName;
                System.out.println(url+"================="+tempDir);
                file = new File(tempDir);
                //下载
                urlfile = new URL(url);
@@ -2164,25 +2387,44 @@
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return file;
    }
    public static void packFilesToZip(List<File> files,    ServletOutputStream os) throws IOException {
        try (ZipArchiveOutputStream zipOutputStream = new ZipArchiveOutputStream(os)) {
    public static void packFilesToZip(List<File> files,    OutputStream os) throws IOException {
        try {
            ZipArchiveOutputStream zipOutputStream = new ZipArchiveOutputStream(os);
            zipOutputStream.setUseZip64(Zip64Mode.AsNeeded);
            for (File file : files) {
                if(!file.exists()){
                    System.out.println("===文件不存在======="+file.getPath());
                    continue;
                }else{
                    System.out.println("===文件存在======="+file.getPath());
                }
                ZipArchiveEntry entry = new ZipArchiveEntry(file.getName());
                zipOutputStream.putArchiveEntry(entry);
                try (FileInputStream fileInputStream = new FileInputStream(file)) {
                    byte[] buffer = new byte[1024];
                    int length;
                    while ((length = fileInputStream.read(buffer)) > 0) {
                        zipOutputStream.write(buffer, 0, length);
                    }
                FileInputStream fileInputStream = new FileInputStream(file);
                byte[] buffer = new byte[1024];
                int length;
                while ((length = fileInputStream.read(buffer)) > 0) {
                    zipOutputStream.write(buffer, 0, length);
                }
                zipOutputStream.closeArchiveEntry();
                zipOutputStream.flush();
                IoUtil.close(fileInputStream);
                file.delete();
            }
        }catch (Exception e){
            throw new BusinessException(ResponseStatus.EXPORT_EXCEL_ERROR.getCode(),"对不起,下载压缩文件失败");
        }finally {
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
@@ -2209,18 +2451,18 @@
        }else{
            if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.DAY.getValue())){
                //天为批改单位
                return fee.multiply(new BigDecimal(days)).divide(new BigDecimal(countDays),2, RoundingMode.HALF_UP);
                return fee.multiply(new BigDecimal(days)).divide(new BigDecimal(countDays),6, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_MONTH.getValue())) {
                //半月为批改单位
                BigDecimal cycle = new BigDecimal(days).divide(insureCycleUnit.getDays(),0,RoundingMode.CEILING);
                //根据投保周期 定义的 每个周期 = X个 半月周期 进行计算
                // 总金额 * 产生费用的周期 / 投保周期定义的 半月周期数
                return fee.multiply(cycle).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
                return fee.multiply(cycle).divide(new BigDecimal(timeUnit.getCoefficient()),6, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.MONTH.getValue())) {
                //月份为批改单位
                BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(reduceEndTime,reduceStartTime));
                // 总金额 * 产生费用的周期 / 投保周期定义的 半月周期数 * 2
                return fee.multiply(cycle).multiply(new BigDecimal(2)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
                return fee.multiply(cycle).multiply(new BigDecimal(2)).divide(new BigDecimal(timeUnit.getCoefficient()),6, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.QUARTER.getValue())) {
                //季度为批改单位
@@ -2229,7 +2471,7 @@
                //转换为 总季度
                cycle = cycle.divide(new BigDecimal(3),0,RoundingMode.CEILING);
                // 总金额 * 产生费用的周期 / 投保周期定义的 半月周期数 * 6
                return fee.multiply(cycle).multiply(new BigDecimal(6)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
                return fee.multiply(cycle).multiply(new BigDecimal(6)).divide(new BigDecimal(timeUnit.getCoefficient()),6, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_YEAR.getValue())) {
                //半年为批改单位
                //查询产生费用总月份
@@ -2237,7 +2479,7 @@
                //转换为 半年
                cycle = cycle.divide(new BigDecimal(6),0,RoundingMode.CEILING);
                // 总金额 * 产生费用的周期 / 投保周期定义的 半月周期数 * 6
                return fee.multiply(cycle).multiply(new BigDecimal(12)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
                return fee.multiply(cycle).multiply(new BigDecimal(12)).divide(new BigDecimal(timeUnit.getCoefficient()),6, RoundingMode.HALF_UP);
            }else {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"方案配置错误");
            }
@@ -2262,18 +2504,18 @@
        }else{
            if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.DAY.getValue())){
                //天为批改单位
                return fee.multiply(new BigDecimal(days)).divide(new BigDecimal(countDays),2, RoundingMode.HALF_UP);
                return fee.multiply(new BigDecimal(days)).divide(new BigDecimal(countDays),6, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_MONTH.getValue())) {
                //半月为批改单位
                BigDecimal cycle = new BigDecimal(days).divide(insureCycleUnit.getDays(),0,RoundingMode.CEILING);
                //根据投保周期 定义的 每个周期 = X个 半月周期 进行计算
                // 总金额 * 产生费用的周期 / 投保周期定义的 半月周期数
                return fee.multiply(cycle).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
                return fee.multiply(cycle).divide(new BigDecimal(timeUnit.getCoefficient()),6, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.MONTH.getValue())) {
                //月份为批改单位
                BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(newEndTime,newStartTime));
                // 总金额 * 产生费用的周期 / 投保周期定义的 半月周期数 * 2
                return fee.multiply(cycle).multiply(new BigDecimal(2)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
                return fee.multiply(cycle).multiply(new BigDecimal(2)).divide(new BigDecimal(timeUnit.getCoefficient()),6, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.QUARTER.getValue())) {
                //季度为批改单位
@@ -2282,7 +2524,7 @@
                //转换为 总季度
                cycle = cycle.divide(new BigDecimal(3),0,RoundingMode.CEILING);
                // 总金额 * 产生费用的周期 / 投保周期定义的 半月周期数 * 6
                return fee.multiply(cycle).multiply(new BigDecimal(6)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
                return fee.multiply(cycle).multiply(new BigDecimal(6)).divide(new BigDecimal(timeUnit.getCoefficient()),6, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_YEAR.getValue())) {
                //半年为批改单位
                //查询产生费用总月份
@@ -2290,7 +2532,7 @@
                //转换为 半年
                cycle = cycle.divide(new BigDecimal(6),0,RoundingMode.CEILING);
                // 总金额 * 产生费用的周期 / 投保周期定义的 半月周期数 * 6
                return fee.multiply(cycle).multiply(new BigDecimal(12)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
                return fee.multiply(cycle).multiply(new BigDecimal(12)).divide(new BigDecimal(timeUnit.getCoefficient()),6, RoundingMode.HALF_UP);
            }else {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"方案配置错误");
            }
@@ -2318,18 +2560,18 @@
        }else{
            if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.DAY.getValue())){
                //天为批改单位
                return fee.multiply(new BigDecimal(days)).divide(new BigDecimal(countDays),2, RoundingMode.HALF_UP);
                return fee.multiply(new BigDecimal(days)).divide(new BigDecimal(countDays),6, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_MONTH.getValue())) {
                //半月为批改单位
                BigDecimal cycle = new BigDecimal(days).divide(insureCycleUnit.getDays(),0,RoundingMode.CEILING);
                //根据投保周期 定义的 每个周期 = X个 半月周期 进行计算
                // 总金额 * 产生费用的周期 / 投保周期定义的 半月周期数
                return fee.multiply(cycle).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
                return fee.multiply(cycle).divide(new BigDecimal(timeUnit.getCoefficient()),6, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.MONTH.getValue())) {
                //月份为批改单位
                BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(new Date(),startTime));
                // 总金额 * 产生费用的周期 / 投保周期定义的 半月周期数 * 2
                return fee.multiply(cycle).multiply(new BigDecimal(2)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
                return fee.multiply(cycle).multiply(new BigDecimal(2)).divide(new BigDecimal(timeUnit.getCoefficient()),6, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.QUARTER.getValue())) {
                //季度为批改单位
@@ -2338,7 +2580,7 @@
                //转换为 总季度
                cycle = cycle.divide(new BigDecimal(3),0,RoundingMode.CEILING);
                // 总金额 * 产生费用的周期 / 投保周期定义的 半月周期数 * 6
                return fee.multiply(cycle).multiply(new BigDecimal(6)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
                return fee.multiply(cycle).multiply(new BigDecimal(6)).divide(new BigDecimal(timeUnit.getCoefficient()),6, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_YEAR.getValue())) {
                //半年为批改单位
                //查询产生费用总月份
@@ -2346,7 +2588,7 @@
                //转换为 半年
                cycle = cycle.divide(new BigDecimal(6),0,RoundingMode.CEILING);
                // 总金额 * 产生费用的周期 / 投保周期定义的 半月周期数 * 6
                return fee.multiply(cycle).multiply(new BigDecimal(12)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
                return fee.multiply(cycle).multiply(new BigDecimal(12)).divide(new BigDecimal(timeUnit.getCoefficient()),6, RoundingMode.HALF_UP);
            }else {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"方案配置错误");
            }
@@ -2362,27 +2604,106 @@
        }else{
            if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.DAY.getValue())){
                //天为批改单位
                return fee.divide(new BigDecimal(countDays),2, RoundingMode.HALF_UP);
                return fee.divide(new BigDecimal(countDays),6, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_MONTH.getValue())) {
                //根据投保周期 定义的 每个周期 = X个 半月周期 进行计算
                // 总金额 / 投保周期定义的 半月周期数
                return fee.divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
                return fee.divide(new BigDecimal(timeUnit.getCoefficient()),6, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.MONTH.getValue())) {
                // 总金额 / 投保周期定义的 半月周期数 * 2
                return fee.multiply(new BigDecimal(2)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
                return fee.multiply(new BigDecimal(2)).divide(new BigDecimal(timeUnit.getCoefficient()),6, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.QUARTER.getValue())) {
                //季度为批改单位
                // 总金额  / 投保周期定义的 半月周期数 * 6
                return fee.multiply(new BigDecimal(6)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
                return fee.multiply(new BigDecimal(6)).divide(new BigDecimal(timeUnit.getCoefficient()),6, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_YEAR.getValue())) {
                //半年为批改单位
                // 总金额 * 产生费用的周期 / 投保周期定义的 半月周期数 * 6
                return fee.multiply(new BigDecimal(12)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
                return fee.multiply(new BigDecimal(12)).divide(new BigDecimal(timeUnit.getCoefficient()),6, RoundingMode.HALF_UP);
            }else {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"方案配置错误");
            }
        }
    }
    public static BigDecimal getTwoPoint(BigDecimal bigDecimal){
        if(Objects.isNull(bigDecimal)){
            return BigDecimal.ZERO;
        }
        if(BigDecimal.ZERO.compareTo(bigDecimal) == 0){
            return BigDecimal.ZERO;
        }
        return bigDecimal.setScale(2,BigDecimal.ROUND_DOWN);
    }
    /**
     * 赔付项
     */
    public  enum compensation{
        YL_COMPENSATION(0, "医疗理赔",1),
        WG_COMPENSATION(1, "误工理赔",1),
        SC_COMPENSATION(2, "伤残理赔",1),
        SW_COMPENSATION(3, "死亡理赔",1),
        HSF_FEE(4, "伙食费",2),
        XY_FEE(5, "续医费",2),
        YY_FEE(6, "营养费",2),
        HL_FEE(7, "护理费",2),
        ZDJB_FEE(8, "重大疾病赔偿金",2),
        TB_FEE(9, "特别费用",2),
        ZS_FEE(10, "住宿费",2),
        JT_FEE(11, "津贴",2),
        CJ_FEE(12, "残疾赔偿金",2),
        BFYR_FEE(13, "被抚养人生活费",2),
        SCF_FEE(14, "丧葬费",2),
        JSFXJ_FEE(15, "精神抚恤金",2),
        JD_FEE(16, "鉴定费",2),
        SS_FEE(17, "诉讼费",2),
        LS_FEE(18, "律师费",2),
        TRAFFIC_FEE(19, "交通费",2),
        CJQJ_FEE(20, "残疾器具费",2),
        QT_FEE(21, "其他费用",2),
        ;
        // 成员变量
        private String name;
        private int key;
        private int type;
        // 构造方法
        compensation(int key, String name, int type) {
            this.name = name;
            this.key = key;
            this.type = type;
        }
        // get set 方法
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getKey() {
            return key;
        }
        public void setKey(int key) {
            this.key = key;
        }
        public int getType() {
            return type;
        }
        public void setType(int type) {
            this.type = type;
        }
    }
}