k94314517
2025-06-03 e29d594f812c201abaa2e2d1c031a9ab61ba8200
git ch
已修改10个文件
579 ■■■■ 文件已修改
server/platform/src/main/java/com/doumee/api/business/SettleRiskController.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/utils/Constants.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/utils/DateUtil.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/model/SettleClaims.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/vo/dataBoard/DataListVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/vo/dataBoard/SettleClaimsDataVO.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/InsuranceApplyService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/SettleClaimsService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/InsuranceApplyServiceImpl.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/SettleClaimsServiceImpl.java 399 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/platform/src/main/java/com/doumee/api/business/SettleRiskController.java
@@ -6,6 +6,9 @@
import com.doumee.dao.business.dto.*;
import com.doumee.dao.business.vo.CompensationVO;
import com.doumee.dao.business.vo.RiskConfigVO;
import com.doumee.dao.business.vo.dataBoard.InsuranceDataVO;
import com.doumee.dao.business.vo.dataBoard.SettleClaimsDataVO;
import com.doumee.service.business.InsuranceApplyService;
import com.doumee.service.business.SettleClaimsService;
import com.doumee.service.system.SystemDictDataService;
import io.swagger.annotations.Api;
@@ -29,6 +32,7 @@
    @Autowired
    private SettleClaimsService settleClaimsService;
    @ApiOperation("获取风险配置")
    @GetMapping("/getRiskConfig")
@@ -180,4 +184,17 @@
    }
    @ApiOperation("理赔报案数据报表")
    @GetMapping("/getSettleClaimsDataVO")
    public ApiResponse<SettleClaimsDataVO> getSettleClaimsDataVO() {
        return ApiResponse.success(settleClaimsService.getSettleClaimsDataVO());
    }
    @ApiOperation("理赔报案数据报表")
    @GetMapping("/getInsuranceDataVO")
    public ApiResponse<InsuranceDataVO> getInsuranceDataVO() {
        return ApiResponse.success(settleClaimsService.getInsuranceDataVO());
    }
}
server/service/src/main/java/com/doumee/core/utils/Constants.java
@@ -21,7 +21,10 @@
import java.math.RoundingMode;
import java.net.URL;
import java.net.URLDecoder;
import java.time.Instant;
import java.time.LocalDate;
import java.time.Period;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.Date;
@@ -317,6 +320,26 @@
        return Constants.countPriceVO(countCyclePriceDTO.getStartDate(),countCyclePriceDTO.getSolutions());
    }
    public static int calculateAge(String idCard,Date dateDate) {
        if (idCard == null || idCard.length() != 18) {
            throw new IllegalArgumentException("身份证号码必须是18位");
        }
        // 提取出生日期
        String birthDateStr = idCard.substring(6, 14); // 例如:19900101
        LocalDate birthDate = LocalDate.parse(birthDateStr);
        Instant instant = dateDate.toInstant();
        // 获取当前日期
        LocalDate currentDate = instant.atZone(ZoneId.systemDefault()).toLocalDate(); // 转换为 LocalDate
        // 计算年龄
        Period period = Period.between(birthDate, currentDate);
        int age = period.getYears(); // 直接获取年份差即为年龄
        return age;
    }
    public static CountCyclePriceVO countPriceVO(Date startDate, Solutions solutions){
        CountCyclePriceVO countCyclePriceVO = new CountCyclePriceVO();
        //天
server/service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -3204,13 +3204,13 @@
    public static void main(String[] args) throws Exception{
//        System.out.println(DateUtil.DateToStr(
//                DateUtil.afterDateByType(new Date(),1,-1),"yyyy-MM")
//        );
        System.out.println(DateUtil.getBetweenHours(DateUtil.fromStringToDate("yyyy-MM-dd HH:mm:ss","2025-05-26 10:46:43"),
                DateUtil.fromStringToDate("yyyy-MM-dd HH:mm:ss","2025-05-26 07:41:43")));
        ;
        System.out.println(DateUtil.DateToStr(
                DateUtil.afterDateByType(new Date(),1,-11),"yyyy-MM")
        );
//
//        System.out.println(DateUtil.getBetweenHours(DateUtil.fromStringToDate("yyyy-MM-dd HH:mm:ss","2025-05-26 10:46:43"),
//                DateUtil.fromStringToDate("yyyy-MM-dd HH:mm:ss","2025-05-26 07:41:43")));
//        ;
//        System.out.println(DateUtil.getLongDateTime(new Date()));;
    }
server/service/src/main/java/com/doumee/dao/business/model/SettleClaims.java
@@ -59,6 +59,9 @@
    @ApiModelProperty(value = "人员编码(关联memeber)", example = "1")
    private Integer memberId;
    @ApiModelProperty(value = "人员年龄", example = "1")
    private Integer memberAge;
    @ApiModelProperty(value = "事故发生时间")
    private String happenTime;
@@ -157,6 +160,13 @@
    private Integer riskNewUser    ;
    @ApiModelProperty(value = "设计敏感词,多个英文逗号隔开")
    private String riskSensitive;
    @ApiModelProperty(value = "延迟报案风险 0否1是")
    private Integer riskDelayUnit    ;
    @ApiModelProperty(value = "保单未生效风险 0否1是")
    private Integer riskUnTakeEffect    ;
    @ApiModelProperty(value = "报案号设置状态 0未设置 1已设置 2已修改")
    private Integer reportNumStatus;
    @ApiModelProperty(value = "所有赔付项信息(json数组[{name:“伙食费”,val:100,info:“伙食费说明”,type:0}]),type:0主要赔付项 1其他赔付项 2定损方案费用\t")
server/service/src/main/java/com/doumee/dao/business/vo/dataBoard/DataListVO.java
@@ -18,5 +18,7 @@
    @ApiModelProperty(value = "第二个参数 - 纵向坐标", example = "1")
    private String dataSecond;
    @ApiModelProperty(value = "第三个参数", example = "1")
    private String dataThird;
}
server/service/src/main/java/com/doumee/dao/business/vo/dataBoard/SettleClaimsDataVO.java
@@ -40,4 +40,60 @@
    @ApiModelProperty(value = "平均理赔处理时长  近6个月")
    private List<DataListVO> averageSettleClaimsList;
    @ApiModelProperty(value = "本月多次出险次数")
    private Integer riskTimesCxTotal;
    @ApiModelProperty(value = "本月多次出险次数环比")
    private BigDecimal riskTimesCxRata;
    @ApiModelProperty(value = "疑似重复报案风险次数")
    private Integer riskRepeatTotal;
    @ApiModelProperty(value = "疑似重复报案风险次数环比")
    private BigDecimal riskRepeatRata;
    @ApiModelProperty(value = "索赔次数过多次数")
    private Integer riskTimesSpTotal;
    @ApiModelProperty(value = "疑似重复报案风险次数环比")
    private BigDecimal riskTimesSpRata;
    @ApiModelProperty(value = "新员工出险风险次数")
    private Integer riskNewUserTotal;
    @ApiModelProperty(value = "新员工出险风险环比")
    private BigDecimal riskNewUserRata;
    @ApiModelProperty(value = "敏感词风险次数")
    private Integer riskSensitiveTotal;
    @ApiModelProperty(value = "敏感词风险环比")
    private BigDecimal riskSensitiveRata;
    @ApiModelProperty(value = "延迟报案风险次数")
    private Integer riskDelayUnitTotal;
    @ApiModelProperty(value = "延迟报案风险环比")
    private BigDecimal riskDelayUnitRata;
    @ApiModelProperty(value = "保单未生效风险次数")
    private Integer riskUnTakeEffectTotal;
    @ApiModelProperty(value = "保单未生效风险环比")
    private BigDecimal riskUnTakeEffectRata;
    @ApiModelProperty(value = "风险敏感词报表")
    private List<DataListVO> sensitiveDataList;
    @ApiModelProperty(value = "区域分布")
    private List<DataListVO> areaDataList;
    @ApiModelProperty(value = "各类型案件分布")
    private List<DataListVO> caseTypeDataList;
    @ApiModelProperty(value = "理赔金额趋势 - 月")
    private List<DataListVO> monthTotalMoneyDataList;
    @ApiModelProperty(value = "结案率")
    private List<DataListVO> closeRataDataList;
    @ApiModelProperty(value = "事故类型分布")
    private List<DataListVO> typeDataList;
    @ApiModelProperty(value = "人员年龄分布")
    private List<DataListVO> memberAgeDataList;
    @ApiModelProperty(value = "工种数量分布")
    private List<DataListVO> workTypeDataList;
}
server/service/src/main/java/com/doumee/service/business/InsuranceApplyService.java
@@ -189,7 +189,6 @@
    void testSendEmail();
//    InsuranceDataVO getInsuranceDataVO();
}
server/service/src/main/java/com/doumee/service/business/SettleClaimsService.java
@@ -5,6 +5,7 @@
import com.doumee.dao.business.dto.*;
import com.doumee.dao.business.model.SettleClaims;
import com.doumee.dao.business.vo.CompensationVO;
import com.doumee.dao.business.vo.dataBoard.InsuranceDataVO;
import com.doumee.dao.business.vo.dataBoard.SettleClaimsDataVO;
import com.doumee.service.system.impl.SystemDictDataServiceImpl;
import io.swagger.models.auth.In;
@@ -267,4 +268,7 @@
    void updReceiveInfo(UpdReceiveInfoDTO dto);
    SettleClaimsDataVO getSettleClaimsDataVO();
    InsuranceDataVO getInsuranceDataVO();
}
server/service/src/main/java/com/doumee/service/business/impl/InsuranceApplyServiceImpl.java
@@ -3766,59 +3766,6 @@
        return applyPowerVO;
    }
//    @Override
//    public InsuranceDataVO getInsuranceDataVO(){
//        InsuranceDataVO insuranceDataVO = new InsuranceDataVO();
//        insuranceDataVO.setInsuranceTotal(Constants.ZERO);
//        insuranceDataVO.setInsuranceAddTotal(Constants.ZERO);
//        insuranceDataVO.setInsuranceApplyTotal(Constants.ZERO);
//        insuranceDataVO.setInsuranceApplyAddTotal(Constants.ZERO);
//        insuranceDataVO.setInsuranceUserTotal(Constants.ZERO);
//        insuranceDataVO.setInsuranceUserAddTotal(Constants.ZERO);
//        insuranceDataVO.setTotalAddFee(BigDecimal.ZERO);
//        insuranceDataVO.setTotalFee(BigDecimal.ZERO);
//        //本月日期
//        String monthData = DateUtil.DateToStr(new Date(),"yyyy-MM");
//        //保险公司数量
//        List<Insurance> insuranceList = insuranceMapper.selectList(new QueryWrapper<Insurance>().lambda().eq(Insurance::getIsdeleted,Constants.ZERO).eq(Insurance::getStatus,Constants.ZERO));
//        if(CollectionUtils.isNotEmpty(insuranceList)){
//            insuranceDataVO.setInsuranceTotal(insuranceList.size());
//            insuranceDataVO.setInsuranceAddTotal(insuranceList.stream().filter(i->Objects.nonNull(i.getCreateDate())&&DateUtil.DateToStr(i.getCreateDate(),"yyyy-MM").equals(monthData)).collect(Collectors.toList()).size());
//        }
//
//        //保单数量
//        List<InsuranceApply> insuranceApplyList = insuranceApplyMapper.selectList(new QueryWrapper<InsuranceApply>()
//                .lambda().eq(InsuranceApply::getIsdeleted,Constants.ZERO).in(InsuranceApply::getStatus,
//                Constants.InsuranceApplyStatus.UPLOAD_INSURANCE.getKey(),Constants.InsuranceApplyStatus.WTB_DONE.getKey())
//        );
//        if(CollectionUtils.isNotEmpty(insuranceApplyList)){
//            insuranceDataVO.setInsuranceApplyTotal(insuranceApplyList.size());
//            insuranceDataVO.setInsuranceApplyAddTotal(insuranceApplyList.stream().filter(i->Objects.nonNull(i.getCreateDate())&&DateUtil.DateToStr(i.getCreateDate(),"yyyy-MM").equals(monthData)).collect(Collectors.toList()).size());
//        }
//
//        //在保人数
//        List<ApplyDetail> applyDetailList = applyDetailJoinMapper.selectJoinList(ApplyDetail.class,new MPJLambdaWrapper<ApplyDetail>().selectAll(ApplyDetail.class)
//                .leftJoin(InsuranceApply.class,InsuranceApply::getId,ApplyDetail::getApplyId)
//                .eq(InsuranceApply::getIsdeleted,Constants.ZERO).in(InsuranceApply::getStatus,
//                        Constants.InsuranceApplyStatus.UPLOAD_INSURANCE.getKey(),Constants.InsuranceApplyStatus.WTB_DONE.getKey())
//                .eq(ApplyDetail::getIsdeleted,Constants.ZERO)
//                .apply(" ( t.START_TIME >= now() and t.END_TIME <= now() ) ")
//        );
//        if(CollectionUtils.isNotEmpty(applyDetailList)){
//            insuranceDataVO.setInsuranceUserTotal(applyDetailList.size());
//            insuranceDataVO.setInsuranceUserAddTotal(
//                    applyDetailList.stream().filter(i->Objects.nonNull(i.getCreateDate())&&DateUtil.DateToStr(i.getCreateDate(),"yyyy-MM")
//                            .equals(monthData)).collect(Collectors.toList()).size());
//
//            insuranceDataVO.setTotalFee(applyDetailList.stream().map(i->i.getFee()).reduce(BigDecimal.ZERO,BigDecimal::add));
//            insuranceDataVO.setTotalAddFee(applyDetailList.stream()
//                    .filter(i->Objects.nonNull(i.getCreateDate())&&DateUtil.DateToStr(i.getCreateDate(),"yyyy-MM")
//                    .equals(monthData)).map(i->i.getFee()).reduce(BigDecimal.ZERO,BigDecimal::add));
//        }
//
//        return insuranceDataVO;
//    }
}
server/service/src/main/java/com/doumee/service/business/impl/SettleClaimsServiceImpl.java
@@ -14,6 +14,7 @@
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dto.*;
import com.doumee.dao.business.join.ApplyDetailJoinMapper;
import com.doumee.dao.business.join.MultifileJoinMapper;
import com.doumee.dao.business.join.SettleClaimsJoinMapper;
import com.doumee.dao.business.join.SettleClaimsLogJoinMapper;
@@ -23,6 +24,7 @@
import com.doumee.dao.business.vo.SettleClaimsMoneyVO;
import com.doumee.dao.business.vo.SettleParentStatusVO;
import com.doumee.dao.business.vo.dataBoard.DataListVO;
import com.doumee.dao.business.vo.dataBoard.InsuranceDataVO;
import com.doumee.dao.business.vo.dataBoard.SettleClaimsDataVO;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.SettleClaimsLogService;
@@ -53,6 +55,7 @@
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@@ -100,6 +103,18 @@
    @Autowired
    private ApplyDetailMapper applyDetailMapper;
    @Autowired
    private AreasMapper areasMapper;
    @Autowired
    private WorktypeMapper worktypeMapper;
    @Autowired
    private InsuranceMapper insuranceMapper;
    @Autowired
    private ApplyDetailJoinMapper applyDetailJoinMapper;
    /**
     * 删除附件
     * @return
@@ -1378,6 +1393,9 @@
        settleClaims.setOrigin(Constants.ZERO);
        settleClaims.setMemberName(member.getName());
        settleClaims.setCreateDate(new Date());
        settleClaims.setMemberAge(
                Constants.calculateAge(member.getIdcardNo(),DateUtil.StringToDate(settleClaims.getHappenTime()))
        );
        if(Constants.equalsInteger(settleClaimsDTO.getSaveType(),Constants.ONE)&&StringUtils.isBlank(settleClaims.getCode())){
            Long nextCode = settleClaimsMapper.selectCount(new QueryWrapper<SettleClaims>().lambda().ne(SettleClaims::getStatus,Constants.SettleClaimsStatus.WAIT_ACCEPTANCE.getKey())
                    .eq(SettleClaims::getOrigin,Constants.ZERO) .like(SettleClaims::getCreateDate,DateUtil.getDate(new Date(),"yyyy-MM-dd"))
@@ -1443,6 +1461,12 @@
    }
    public void saveRisk(SettleClaims settleClaims, SettleClaimsDTO settleClaimsDTO, SystemDictDataServiceImpl systemDictDataService){
        settleClaims.setRiskDelayUnit(Constants.ZERO);
        settleClaims.setRiskUnTakeEffect(Constants.ZERO);
        settleClaims.setRiskNewUser(Constants.ZERO);
        settleClaims.setRiskTimesCx(Constants.ZERO);
        settleClaims.setRiskTimesSp(Constants.ZERO);
        settleClaims.setRiskRepeat(Constants.ZERO);
        //根据保单信息 查询出主方案
        InsuranceApply insuranceApply = insuranceApplyMapper.selectById(settleClaims.getInsuranceApplyId());
        if(Objects.isNull(insuranceApply)){
@@ -1491,6 +1515,7 @@
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"事故发生时间未在人员保障日期范围内");
            }else{
                map.put("info","事故发生时间早于保单生效时间"+solutionsBase.getRiskNewUserUnit()+(Constants.equalsInteger(solutionsBase.getRiskNewUserUnit(),Constants.ONE)?"小时内":"天内"));
                settleClaims.setRiskUnTakeEffect(Constants.ONE);
                riskList.add(map);
            }
        }else{
@@ -1507,17 +1532,20 @@
            if(Constants.equalsInteger(solutionsBase.getRiskDelayUnit(),Constants.ZERO)){
                if(DateUtil.getBetweenMin(happenTime,new Date())>solutionsBase.getRiskDelayTime()){
                    map.put("info","报案时间超过案发时间"+solutionsBase.getRiskDelayTime()+"分钟");
                    settleClaims.setRiskDelayUnit(Constants.ONE);
                    riskList.add(map);
                }
            }else if(Constants.equalsInteger(solutionsBase.getRiskDelayUnit(),Constants.ONE)){
                if(DateUtil.getBetweenHours(happenTime,new Date())>solutionsBase.getRiskDelayTime()){
                    map.put("info","报案时间超过案发时间"+solutionsBase.getRiskDelayTime()+"小时");
                    riskList.add(map);
                    settleClaims.setRiskDelayUnit(Constants.ONE);
                }
            }else if(Constants.equalsInteger(solutionsBase.getRiskDelayUnit(),Constants.TWO)){
                if(DateUtil.getBetweenDay(happenTime,new Date())>solutionsBase.getRiskDelayTime()){
                    map.put("info","报案时间超过案发时间"+solutionsBase.getRiskDelayTime()+"天");
                    riskList.add(map);
                    settleClaims.setRiskDelayUnit(Constants.ONE);
                }
            }
        }
@@ -2912,7 +2940,7 @@
                settleClaimsTotal.setDataFirst(monthData);
                settleClaimsTotal.setDataSecond(
                        settleClaimsList.stream().filter(j->DateUtil.DateToStr(j.getCreateDate(),"yyyy-MM").equals(monthData)).collect(Collectors.toList()).toString()
                        settleClaimsList.stream().filter(j->DateUtil.DateToStr(j.getCreateDate(),"yyyy-MM").equals(monthData)).collect(Collectors.toList()).size()+""
                );
 
                settleClaimsFee.setDataFirst(monthData);
@@ -2922,9 +2950,14 @@
                averageSettleClaims.setDataFirst(monthData);
                Integer sumHours = closeCaseMonthList.stream().map(j->
                        j.getTotalHours()).reduce(Constants.ZERO,Integer::sum);
                averageSettleClaims.setDataSecond(
                        new BigDecimal(sumHours.toString()).divide(new BigDecimal((closeCaseMonthList.size()*24)+"")).toString()
                );
                if(Objects.isNull(sumHours)||CollectionUtils.isEmpty(closeCaseMonthList)
                || Constants.equalsInteger(sumHours,Constants.ZERO)){
                    averageSettleClaims.setDataSecond("0");
                }else{
                    averageSettleClaims.setDataSecond(
                            new BigDecimal(sumHours.toString()).divide(new BigDecimal((closeCaseMonthList.size()*24)+""),2,BigDecimal.ROUND_HALF_UP).toString());
                }
                ;
 
                settleClaimsTotalList.add(settleClaimsTotal);
                settleClaimsFeeList.add(settleClaimsFee);
@@ -2945,21 +2978,373 @@
            settleClaimsDataVO.setAverageSettleClaimsTime(
                    new BigDecimal(closeCaseList.stream().map(i->i.getTotalHours()).reduce(Constants.ZERO,Integer::sum).toString())
                            .divide(new BigDecimal((closeCaseList.size()*24)+"") ,2,BigDecimal.ROUND_HALF_UP)
            );
            String monthDate = DateUtil.getFomartDate(new Date(),"yyyy-MM");
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.MONTH, -1);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
            String lastMonth = sdf.format(calendar.getTime());
            //风险案件占比数据
            settleClaimsDataVO.setRiskTimesCxTotal(settleClaimsList.stream().filter(i->DateUtil.formatDate(i.getCreateDate(),"yyyy-MM").equals(monthDate)
                            &&Constants.equalsInteger(i.getRiskTimesCx(),Constants.ONE))
                    .collect(Collectors.toList()).size());
            Integer lastMonthTotal = settleClaimsList.stream().filter(i->DateUtil.formatDate(i.getCreateDate(),"yyyy-MM").equals(lastMonth)
                            &&Constants.equalsInteger(i.getRiskTimesCx(),Constants.ONE))
                    .collect(Collectors.toList()).size();
            settleClaimsDataVO.setRiskTimesCxRata(this.jsRata(settleClaimsDataVO.getRiskTimesCxTotal(),lastMonthTotal));
            settleClaimsDataVO.setRiskRepeatTotal(settleClaimsList.stream().filter(i->DateUtil.formatDate(i.getCreateDate(),"yyyy-MM").equals(monthDate)
                            &&Constants.equalsInteger(i.getRiskRepeat(),Constants.ONE))
                    .collect(Collectors.toList()).size());
            lastMonthTotal = settleClaimsList.stream().filter(i->DateUtil.formatDate(i.getCreateDate(),"yyyy-MM").equals(lastMonth)
                            &&Constants.equalsInteger(i.getRiskRepeat(),Constants.ONE))
                    .collect(Collectors.toList()).size();
            settleClaimsDataVO.setRiskRepeatRata(this.jsRata(settleClaimsDataVO.getRiskRepeatTotal(),lastMonthTotal));
            settleClaimsDataVO.setRiskTimesSpTotal(settleClaimsList.stream().filter(i->DateUtil.formatDate(i.getCreateDate(),"yyyy-MM").equals(monthDate)
                            &&Constants.equalsInteger(i.getRiskTimesSp(),Constants.ONE))
                    .collect(Collectors.toList()).size());
            lastMonthTotal = settleClaimsList.stream().filter(i->DateUtil.formatDate(i.getCreateDate(),"yyyy-MM").equals(lastMonth)
                            &&Constants.equalsInteger(i.getRiskTimesSp(),Constants.ONE))
                    .collect(Collectors.toList()).size();
            settleClaimsDataVO.setRiskTimesSpRata(this.jsRata(settleClaimsDataVO.getRiskTimesSpTotal(),lastMonthTotal));
            settleClaimsDataVO.setRiskNewUserTotal(settleClaimsList.stream().filter(i->DateUtil.formatDate(i.getCreateDate(),"yyyy-MM").equals(monthDate)
                            &&Constants.equalsInteger(i.getRiskNewUser(),Constants.ONE))
                    .collect(Collectors.toList()).size());
            lastMonthTotal = settleClaimsList.stream().filter(i->DateUtil.formatDate(i.getCreateDate(),"yyyy-MM").equals(lastMonth)
                            &&Constants.equalsInteger(i.getRiskNewUser(),Constants.ONE))
                    .collect(Collectors.toList()).size();
            settleClaimsDataVO.setRiskNewUserRata(this.jsRata(settleClaimsDataVO.getRiskNewUserTotal(),lastMonthTotal));
            settleClaimsDataVO.setRiskSensitiveTotal(settleClaimsList.stream().filter(i->DateUtil.formatDate(i.getCreateDate(),"yyyy-MM").equals(monthDate)
                            &&StringUtils.isNotBlank(i.getRiskSensitive()))
                    .collect(Collectors.toList()).size());
            lastMonthTotal = settleClaimsList.stream().filter(i->DateUtil.formatDate(i.getCreateDate(),"yyyy-MM").equals(lastMonth)
                            &&StringUtils.isNotBlank(i.getRiskSensitive()))
                    .collect(Collectors.toList()).size();
            settleClaimsDataVO.setRiskSensitiveRata(this.jsRata(settleClaimsDataVO.getRiskSensitiveTotal(),lastMonthTotal));
            settleClaimsDataVO.setRiskDelayUnitTotal(settleClaimsList.stream().filter(i->DateUtil.formatDate(i.getCreateDate(),"yyyy-MM").equals(monthDate)
                            &&Constants.equalsInteger(i.getRiskDelayUnit(),Constants.ONE))
                    .collect(Collectors.toList()).size());
            lastMonthTotal = settleClaimsList.stream().filter(i->DateUtil.formatDate(i.getCreateDate(),"yyyy-MM").equals(lastMonth)
                            &&Constants.equalsInteger(i.getRiskDelayUnit(),Constants.ONE))
                    .collect(Collectors.toList()).size();
            settleClaimsDataVO.setRiskDelayUnitRata(this.jsRata(settleClaimsDataVO.getRiskDelayUnitTotal(),lastMonthTotal));
            settleClaimsDataVO.setRiskUnTakeEffectTotal(settleClaimsList.stream().filter(i->DateUtil.formatDate(i.getCreateDate(),"yyyy-MM").equals(monthDate)
                            &&Constants.equalsInteger(i.getRiskUnTakeEffect(),Constants.ONE))
                    .collect(Collectors.toList()).size());
            lastMonthTotal = settleClaimsList.stream().filter(i->DateUtil.formatDate(i.getCreateDate(),"yyyy-MM").equals(lastMonth)
                            &&Constants.equalsInteger(i.getRiskUnTakeEffect(),Constants.ONE))
                    .collect(Collectors.toList()).size();
            settleClaimsDataVO.setRiskUnTakeEffectRata(this.jsRata(settleClaimsDataVO.getRiskUnTakeEffectTotal(),lastMonthTotal));
            //风险敏感词报表
            List<String> sensitiveList = settleClaimsList.stream().filter(i->StringUtils.isNotBlank(i.getRiskSensitive())).map(i->i.getRiskSensitive()).collect(Collectors.toList());
            if(CollectionUtils.isNotEmpty(sensitiveList)){
                List<String> allSensitiveStrList = new ArrayList<>();
                for (String string:sensitiveList) {
                    allSensitiveStrList.addAll(Arrays.asList(string.split(",")));
                }
                Set<String> sensitiveSetList = new HashSet<>(allSensitiveStrList);
                List<DataListVO> sensitiveDataList = new ArrayList<>();
                for (String string:sensitiveSetList) {
                    DataListVO dataListVO = new DataListVO();
                    dataListVO.setDataFirst(string);
                    dataListVO.setDataSecond(allSensitiveStrList.stream().filter(i->i.equals(string)).collect(Collectors.toList()).size()+"");
                    sensitiveDataList.add(dataListVO);
                }
                settleClaimsDataVO.setSensitiveDataList(sensitiveDataList);
            }
            //区域案件类型分布
            this.getAreaDistribution(settleClaimsDataVO,
                    settleClaimsList.stream().filter(i->StringUtils.isNotBlank(i.getAreaId())).collect(Collectors.toList()));
            //各类型案件分布
            this.getCaseType(settleClaimsDataVO,
                    settleClaimsList.stream().filter(i->Objects.nonNull(i.getCaseType())).collect(Collectors.toList()));
            //按月统计案件金额
            this.getSettleTotalMoneyData(settleClaimsDataVO,
                    settleClaimsList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.SettleClaimsStatus.CLOSE_CASE.getKey())).collect(Collectors.toList()));
            //结案率
            this.getCloseRata(settleClaimsDataVO,
                    settleClaimsList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.SettleClaimsStatus.CLOSE_CASE.getKey())).collect(Collectors.toList()));
            //年龄分布
            this.getMemberAgeDataList(settleClaimsDataVO,
                    settleClaimsList.stream().filter(i->Objects.nonNull(i.getMemberAge())).collect(Collectors.toList()));
            //工种数据分布
            this.getWorkTypeDate(settleClaimsDataVO,
                    settleClaimsList.stream().filter(i->Objects.nonNull(i.getWorktypeId())).collect(Collectors.toList()));
        }
        return settleClaimsDataVO;
    }
    public BigDecimal jsRata(Integer a,Integer b){
        if(Objects.isNull(a)||Objects.isNull(b)||Constants.equalsInteger(a,Constants.ZERO)||Constants.equalsInteger(b,Constants.ZERO)){
            return BigDecimal.ZERO;
        }
        return new BigDecimal(a.toString()).divide(new BigDecimal(b.toString()),2,BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.ONE);
    }
    public void getAreaDistribution(SettleClaimsDataVO settleClaimsDataVO, List<SettleClaims> settleClaimsList){
        List<Areas> areasList = areasMapper.selectList(new QueryWrapper<Areas>().lambda().isNull(Areas::getParentId).orderByAsc(Areas::getId));
        List<DataListVO> areaDataList = new ArrayList<>();
        for (Areas areas:areasList) {
            DataListVO dataListVO = new DataListVO();
            dataListVO.setDataFirst(areas.getName());
            dataListVO.setDataSecond(
                    settleClaimsList.stream().filter(i->i.getAreaId().indexOf(areas.getCode())>=Constants.ZERO).collect(Collectors.toList()).size()+""
            );
            dataListVO.setDataThird(areas.getCode());
            areaDataList.add(dataListVO);
        }
        settleClaimsDataVO.setAreaDataList(areaDataList);
    }
    public void getCaseType(SettleClaimsDataVO settleClaimsDataVO, List<SettleClaims> settleClaimsList){
        List<DataListVO> caseTypeDataList = new ArrayList<>();
        //1=医疗;2=伤残;3=死亡
        for (int i = 1; i <= 3; i++) {
            int finalI = i;
            DataListVO dataListVO = new DataListVO();
            if(finalI==1){
                dataListVO.setDataFirst("医疗");
            }else{
                dataListVO.setDataFirst(Constants.equalsInteger(finalI,Constants.TWO)?"伤残":"死亡");
            }
            dataListVO.setDataSecond(settleClaimsList.stream()
                    .filter(j->Objects.nonNull(j.getCaseType())&&Constants.equalsInteger(j.getCaseType(), finalI)).collect(Collectors.toList()).size()+"");
            caseTypeDataList.add(dataListVO);
        }
        settleClaimsDataVO.setCaseTypeDataList(caseTypeDataList);
    }
    public void getSettleTotalMoneyData(SettleClaimsDataVO settleClaimsDataVO, List<SettleClaims> settleClaimsList){
        List<DataListVO> monthTotalMoneyDataList = new ArrayList<>();
        for (int i = -11; i <= 0 ; i++) {
            String month = DateUtil.DateToStr(
                    DateUtil.afterDateByType(new Date(),1,i),"yyyy-MM");
            DataListVO dataListVO = new DataListVO();
            dataListVO.setDataFirst(month);
            BigDecimal hpAccount = settleClaimsList.stream().filter(j->DateUtil.DateToStr(j.getCreateDate(),"yyyy-MM").equals(month))
                    .map(j->j.getHpAccount().add(j.getHpOtherAccount())).reduce(BigDecimal.ZERO,BigDecimal::add);
            dataListVO.setDataSecond(hpAccount.compareTo(BigDecimal.ZERO)>Constants.ZERO?
                    hpAccount.divide(new BigDecimal("10000"),2,BigDecimal.ROUND_HALF_UP).toString():"0"
            );
            monthTotalMoneyDataList.add(dataListVO);
        }
        settleClaimsDataVO.setMonthTotalMoneyDataList(monthTotalMoneyDataList);
    }
    public void getCloseRata(SettleClaimsDataVO settleClaimsDataVO, List<SettleClaims> settleClaimsList){
        List<DataListVO> closeRataDataList = new ArrayList<>();
        for (int i = -5; i <= 0 ; i++) {
            String month = DateUtil.DateToStr(
                    DateUtil.afterDateByType(new Date(),1,i),"yyyy-MM");
            DataListVO dataListVO = new DataListVO();
            dataListVO.setDataFirst(month);
            List<SettleClaims> monthList =    settleClaimsList.stream().filter(j->DateUtil.DateToStr(j.getCreateDate(),"yyyy-MM").equals(month)).collect(Collectors.toList());
            if(CollectionUtils.isNotEmpty(monthList)){
                List<SettleClaims> closeCaseList = monthList.stream().filter(j->Constants.equalsInteger(j.getStatus(),Constants.SettleClaimsStatus.CLOSE_CASE.getKey())).collect(Collectors.toList());
                if(CollectionUtils.isEmpty(closeCaseList)){
                    dataListVO.setDataSecond("0");
                }else{
                    dataListVO.setDataSecond(new BigDecimal(closeCaseList.size()+"").divide(new BigDecimal(monthList.size()+""),2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%");
                }
            }else{
                dataListVO.setDataSecond("0");
            }
            closeRataDataList.add(dataListVO);
        }
        settleClaimsDataVO.setCloseRataDataList(closeRataDataList);
    }
    public void getType(SettleClaimsDataVO settleClaimsDataVO, List<SettleClaims> settleClaimsList){
        List<DataListVO> typeDataList = new ArrayList<>();
        //0工作期间受伤 1上下班途中受伤 2非工作时间受伤 3意外受伤
        for (int i = 0; i <= 3; i++) {
            int finalI = i;
            DataListVO dataListVO = new DataListVO();
            if(finalI==0){
                dataListVO.setDataFirst("工作期间受伤");
            }else if(finalI==1){
                dataListVO.setDataFirst("上下班途中受伤");
            }else{
                dataListVO.setDataFirst(Constants.equalsInteger(finalI,Constants.TWO)?"非工作时间受伤":"意外受伤");
            }
            dataListVO.setDataSecond(settleClaimsList.stream()
                    .filter(j->Objects.nonNull(j.getType())&&Constants.equalsInteger(j.getCaseType(), finalI)).collect(Collectors.toList()).size()+"");
            typeDataList.add(dataListVO);
        }
        settleClaimsDataVO.setTypeDataList(typeDataList);
    }
    public void getMemberAgeDataList(SettleClaimsDataVO settleClaimsDataVO, List<SettleClaims> settleClaimsList){
        List<DataListVO> memberAgeDataList = new ArrayList<>();
        DataListVO dataListVOa = new DataListVO();
        dataListVOa.setDataFirst("18-25");
        dataListVOa.setDataSecond(
                settleClaimsList.stream()
                        .filter(j->Objects.nonNull(j.getMemberAge())&&
                                (j.getMemberAge() >= 18 || j.getMemberAge() <= 25))
                        .collect(Collectors.toList()).size()+""
        );
        memberAgeDataList.add(dataListVOa);
        DataListVO dataListVOb = new DataListVO();
        dataListVOb.setDataFirst("26-35");
        dataListVOb.setDataSecond(
                settleClaimsList.stream()
                        .filter(j->Objects.nonNull(j.getMemberAge())&&
                                (j.getMemberAge() >= 26 || j.getMemberAge() <= 35))
                        .collect(Collectors.toList()).size()+""
        );
        memberAgeDataList.add(dataListVOb);
        DataListVO dataListVOc = new DataListVO();
        dataListVOc.setDataFirst("36-45");
        dataListVOc.setDataSecond(
                settleClaimsList.stream()
                        .filter(j->Objects.nonNull(j.getMemberAge())&&
                                (j.getMemberAge() >= 36 || j.getMemberAge() <= 45))
                        .collect(Collectors.toList()).size()+""
        );
        memberAgeDataList.add(dataListVOc);
        DataListVO dataListVOd = new DataListVO();
        dataListVOd.setDataFirst("46-55");
        dataListVOd.setDataSecond(
                settleClaimsList.stream()
                        .filter(j->Objects.nonNull(j.getMemberAge())&&
                                (j.getMemberAge() >= 46 || j.getMemberAge() <= 55))
                        .collect(Collectors.toList()).size()+""
        );
        memberAgeDataList.add(dataListVOd);
        DataListVO dataListVOe = new DataListVO();
        dataListVOe.setDataFirst("56-65");
        dataListVOe.setDataSecond(
                settleClaimsList.stream()
                        .filter(j->Objects.nonNull(j.getMemberAge())&&
                                (j.getMemberAge() >= 56 || j.getMemberAge() <= 65))
                        .collect(Collectors.toList()).size()+""
        );
        memberAgeDataList.add(dataListVOe);
        DataListVO dataListVOf = new DataListVO();
        dataListVOf.setDataFirst("65+");
        dataListVOf.setDataSecond(
                settleClaimsList.stream()
                        .filter(j->Objects.nonNull(j.getMemberAge())&&
                                j.getMemberAge() >= 66 )
                        .collect(Collectors.toList()).size()+""
        );
        memberAgeDataList.add(dataListVOf);
        settleClaimsDataVO.setMemberAgeDataList(memberAgeDataList);
    }
    public void getWorkTypeDate(SettleClaimsDataVO settleClaimsDataVO, List<SettleClaims> settleClaimsList){
        List<DataListVO> workTypeDataList = new ArrayList<>();
        if(CollectionUtils.isEmpty(settleClaimsList)){
            return ;
        }
        List<Integer> workTypeIdList = settleClaimsList.stream().map(i->i.getWorktypeId()).collect(Collectors.toList());
        if(CollectionUtils.isEmpty(workTypeIdList)){
            return ;
        }
        Set<Integer> setWorkType = new HashSet<>(workTypeIdList);
        List<Worktype> workTypeList = worktypeMapper.selectList(new QueryWrapper<Worktype>().lambda().eq(Worktype::getIsdeleted,Constants.ZERO).in(Worktype::getId,setWorkType));
        if(CollectionUtils.isEmpty(workTypeList)){
            return ;
        }
        for (Worktype worktype:workTypeList) {
            DataListVO dataListVO = new DataListVO();
            dataListVO.setDataFirst(worktype.getName());
            dataListVO.setDataSecond(
                    settleClaimsList.stream().filter(i->Constants.equalsInteger(i.getWorktypeId(),worktype.getId())).collect(Collectors.toList()).size()+"");
            workTypeDataList.add(dataListVO);
        }
        workTypeDataList = workTypeDataList.stream().sorted(Comparator.comparing(DataListVO::getDataSecond).reversed()).collect(Collectors.toList());
        settleClaimsDataVO.setWorkTypeDataList(workTypeDataList);
    }
    @Override
    public InsuranceDataVO getInsuranceDataVO(){
        InsuranceDataVO insuranceDataVO = new InsuranceDataVO();
        insuranceDataVO.setInsuranceTotal(Constants.ZERO);
        insuranceDataVO.setInsuranceAddTotal(Constants.ZERO);
        insuranceDataVO.setInsuranceApplyTotal(Constants.ZERO);
        insuranceDataVO.setInsuranceApplyAddTotal(Constants.ZERO);
        insuranceDataVO.setInsuranceUserTotal(Constants.ZERO);
        insuranceDataVO.setInsuranceUserAddTotal(Constants.ZERO);
        insuranceDataVO.setTotalAddFee(BigDecimal.ZERO);
        insuranceDataVO.setTotalFee(BigDecimal.ZERO);
        //本月日期
        String monthData = DateUtil.DateToStr(new Date(),"yyyy-MM");
        //保险公司数量
        List<Insurance> insuranceList = insuranceMapper.selectList(new QueryWrapper<Insurance>().lambda().eq(Insurance::getIsdeleted,Constants.ZERO).eq(Insurance::getStatus,Constants.ZERO));
        if(CollectionUtils.isNotEmpty(insuranceList)){
            insuranceDataVO.setInsuranceTotal(insuranceList.size());
            insuranceDataVO.setInsuranceAddTotal(insuranceList.stream().filter(i->Objects.nonNull(i.getCreateDate())&&DateUtil.DateToStr(i.getCreateDate(),"yyyy-MM").equals(monthData)).collect(Collectors.toList()).size());
        }
        //保单数量
        List<InsuranceApply> insuranceApplyList = insuranceApplyMapper.selectList(new QueryWrapper<InsuranceApply>()
                .lambda().eq(InsuranceApply::getIsdeleted,Constants.ZERO).in(InsuranceApply::getStatus,
                        Constants.InsuranceApplyStatus.UPLOAD_INSURANCE.getKey(),Constants.InsuranceApplyStatus.WTB_DONE.getKey())
        );
        if(CollectionUtils.isNotEmpty(insuranceApplyList)){
            insuranceDataVO.setInsuranceApplyTotal(insuranceApplyList.size());
            insuranceDataVO.setInsuranceApplyAddTotal(insuranceApplyList.stream().filter(i->Objects.nonNull(i.getCreateDate())&&DateUtil.DateToStr(i.getCreateDate(),"yyyy-MM").equals(monthData)).collect(Collectors.toList()).size());
        }
        //在保人数
        List<ApplyDetail> applyDetailList = applyDetailJoinMapper.selectJoinList(ApplyDetail.class,new MPJLambdaWrapper<ApplyDetail>().selectAll(ApplyDetail.class)
                .leftJoin(InsuranceApply.class,InsuranceApply::getId,ApplyDetail::getApplyId)
                .eq(InsuranceApply::getIsdeleted,Constants.ZERO).in(InsuranceApply::getStatus,
                        Constants.InsuranceApplyStatus.UPLOAD_INSURANCE.getKey(),Constants.InsuranceApplyStatus.WTB_DONE.getKey())
                .eq(ApplyDetail::getIsdeleted,Constants.ZERO)
                .apply(" ( t.START_TIME >= now() and t.END_TIME <= now() ) ")
        );
        if(CollectionUtils.isNotEmpty(applyDetailList)){
            insuranceDataVO.setInsuranceUserTotal(applyDetailList.size());
            insuranceDataVO.setInsuranceUserAddTotal(
                    applyDetailList.stream().filter(i->Objects.nonNull(i.getCreateDate())&&DateUtil.DateToStr(i.getCreateDate(),"yyyy-MM")
                            .equals(monthData)).collect(Collectors.toList()).size());
            insuranceDataVO.setTotalFee(applyDetailList.stream().map(i->i.getFee()).reduce(BigDecimal.ZERO,BigDecimal::add));
            insuranceDataVO.setTotalAddFee(applyDetailList.stream()
                    .filter(i->Objects.nonNull(i.getCreateDate())&&DateUtil.DateToStr(i.getCreateDate(),"yyyy-MM")
                            .equals(monthData)).map(i->i.getFee()).reduce(BigDecimal.ZERO,BigDecimal::add));
        }
        return insuranceDataVO;
    }