mitao
2024-07-24 4b5624af301dfbdcf54b65dc55aadde1b6a8efd5
finance-admin/src/main/java/com/finance/web/controller/service/ScreenService.java
@@ -14,9 +14,9 @@
import com.finance.common.utils.BeanUtils;
import com.finance.common.utils.CollUtils;
import com.finance.common.utils.DateUtils;
import com.finance.common.utils.StringUtils;
import com.finance.system.domain.TbBasicData;
import com.finance.system.domain.TbBasicDataCategory;
import com.finance.system.domain.TbDataScreenScore;
import com.finance.system.domain.TbQuestion;
import com.finance.system.query.CalculateDetailQuery;
import com.finance.system.query.DeptCalculateDetailQuery;
@@ -48,8 +48,13 @@
import com.finance.system.vo.ScoreRankVO;
import com.finance.system.vo.ScoreRateDataVO;
import com.finance.system.vo.TransferPaymentScaleVO;
import com.google.common.collect.Lists;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -77,10 +82,10 @@
    public ProvinceStaticsVO provinceStatics() {
        ProvinceStaticsVO vo = new ProvinceStaticsVO();
        int provinceCount = getCount("省本级");
        int cityCount = getCount("市");
        int developmentZonesCount = getCount("开发区");
        int countyCount = getCount("县");
        int provinceCount = getCount(AreaLevelEnum.PROVINCE);
        int cityCount = getCount(AreaLevelEnum.CITY);
        int developmentZonesCount = getCount(AreaLevelEnum.DEVELOPMENT_ZONES);
        int countyCount = getCount(AreaLevelEnum.COUNTY);
        vo.setProvinceCount(provinceCount);
        vo.setCityCount(cityCount);
@@ -89,7 +94,7 @@
        return vo;
    }
    private int getCount(String level) {
    private int getCount(AreaLevelEnum level) {
        return (int) sysUserService.count(
                Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUserType, UserTypeEnum.DEPARTMENT)
                        .eq(SysUser::getAreaLevel, level));
@@ -111,30 +116,55 @@
    }
    public RiskAndTransferVO getRiskAndTransfer() throws Exception {
        String nowQuarter = DateUtils.getNowQuarter();
        String previousQuarter = DateUtils.getPreviousQuarter();
        previousQuarter = "2024年一季度";
        RiskAndTransferVO riskAndTransferVO = new RiskAndTransferVO();
        //查询转移支付规模总额
        // 查询转移支付规模总额
        List<TbBasicData> list = tbBasicDataService.lambdaQuery()
                .select(TbBasicData::getTransferPaymentScale)
                .eq(TbBasicData::getQuarter, nowQuarter)
                .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED)
                .eq(TbBasicData::getQuarter, previousQuarter)
                // .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED)
                .list();
        Optional<Double> reduce = list.stream()
                .map(tbBasicData -> Double.parseDouble(tbBasicData.getTransferPaymentScale()))
                .reduce(Double::sum);
        riskAndTransferVO.setTransferPaymentScale(reduce.orElse(0D));
        //查询风险等级设置
        // 查询风险等级设置
        DataScreenConfigVO riskLevel = tbDataScreenConfigService.getRiskLevel();
        List<RiskLevelVO> riskLevelVOList = formatRiskLevel(riskLevel);
        riskAndTransferVO.setRiskLevelVOList(riskLevelVOList);
        RiskCountVO riskCountVO = new RiskCountVO();
        List<RiskMapVO> riskMapVOList = tbScoreService.getCurrentScoreList(previousQuarter, null);
        String[] noRiskArr = riskLevel.getNoRisk().split("-");
        String[] lowRiskArr = riskLevel.getLowRisk().split("-");
        String[] mediumRiskArr = riskLevel.getMediumRisk().split("-");
        String[] highRiskArr = riskLevel.getHighRisk().split("-");
        List<RiskMapVO> cityRiskVO = riskMapVOList.stream()
                .filter(r -> r.getAreaLevel().equals(AreaLevelEnum.CITY))
                .collect(Collectors.toList());
        long noRiskCount = cityRiskVO.stream()
                .filter(item -> item.getScore() >= Double.parseDouble(noRiskArr[0])
                        && item.getScore() <= Double.parseDouble(noRiskArr[1])).count();
        riskCountVO.setNoRiskCount((int) noRiskCount);
        long lowRiskCount = cityRiskVO.stream()
                .filter(item -> item.getScore() >= Double.parseDouble(lowRiskArr[0])
                        && item.getScore() <= Double.parseDouble(lowRiskArr[1])).count();
        riskCountVO.setLowRiskCount((int) lowRiskCount);
        long mediumRiskCount = cityRiskVO.stream()
                .filter(item -> item.getScore() >= Double.parseDouble(mediumRiskArr[0])
                        && item.getScore() <= Double.parseDouble(mediumRiskArr[1])).count();
        riskCountVO.setHighRiskCount((int) mediumRiskCount);
        long highRiskCount = cityRiskVO.stream()
                .filter(item -> item.getScore() >= Double.parseDouble(highRiskArr[0])
                        && item.getScore() <= Double.parseDouble(highRiskArr[1])).count();
        riskCountVO.setHighRiskCount((int) highRiskCount);
        List<TbDataScreenScore> dataScreenScoreList = tbDataScreenScoreService.selectRiskByQuarter(
                nowQuarter, riskLevel.getId(), null);
        for (RiskLevelVO vo : riskLevelVOList) {
            long count = dataScreenScoreList.stream()
        /*for (RiskLevelVO vo : riskLevelVOList) {
            long count = riskMapVOList.stream()
                    .filter(r -> r.getAreaLevel().equals(AreaLevelEnum.CITY))
                    .filter(item -> item.getScore() >= vo.getMin()
                            && item.getScore() <= vo.getMax()).count();
            if (vo.getRiskLevel().equals(RiskLevelEnum.L1)) {
                riskCountVO.setNoRiskCount((int) count);
            } else if (vo.getRiskLevel().equals(RiskLevelEnum.L2)) {
@@ -144,25 +174,25 @@
            } else if (vo.getRiskLevel().equals(RiskLevelEnum.L4)) {
                riskCountVO.setHighRiskCount((int) count);
            }
        }
        //TODO
        riskCountVO.setNoRiskCount(50);
        riskCountVO.setLowRiskCount(45);
        riskCountVO.setMediumRiskCount(30);
        riskCountVO.setHighRiskCount(80);
        }*/
        // TODO
        // riskCountVO.setNoRiskCount(50);
        // riskCountVO.setLowRiskCount(45);
        // riskCountVO.setMediumRiskCount(30);
        // riskCountVO.setHighRiskCount(80);
        riskAndTransferVO.setRiskCountVO(riskCountVO);
        //查询风险配置对应得分
        List<RiskMapVO> riskMapVOList = tbDataScreenScoreService.queryScore4Map(nowQuarter,
                riskLevel.getId());
        // 查询风险配置对应得分
        // List<RiskMapVO> riskMapVOList = tbDataScreenScoreService.queryScore4Map(nowQuarter,
        //         riskLevel.getId());
        riskAndTransferVO.setRiskMapVOList(riskMapVOList);
        return riskAndTransferVO;
    }
    private List<RiskLevelVO> formatRiskLevel(DataScreenConfigVO riskLevel) {
        String[] noRiskArr = riskLevel.getNoRisk().split("_");
        String[] lowRiskArr = riskLevel.getLowRisk().split("_");
        String[] mediumRiskArr = riskLevel.getMediumRisk().split("_");
        String[] highRiskArr = riskLevel.getHighRisk().split("_");
        String[] noRiskArr = riskLevel.getNoRisk().split("-");
        String[] lowRiskArr = riskLevel.getLowRisk().split("-");
        String[] mediumRiskArr = riskLevel.getMediumRisk().split("-");
        String[] highRiskArr = riskLevel.getHighRisk().split("-");
        return handleRiskLevel(noRiskArr, lowRiskArr, mediumRiskArr,
                highRiskArr);
    }
@@ -204,8 +234,10 @@
    public List<RiskRankingVO> riskRanking() throws Exception {
        DataScreenConfigVO riskLevel = tbDataScreenConfigService.getRiskLevel();
        List<RiskLevelVO> riskLevelVOList = formatRiskLevel(riskLevel);
        List<RiskRankingVO> voList = tbDataScreenScoreService.queryRiskRanking(riskLevel.getId(),
                DateUtils.getNowQuarter(), AreaLevelEnum.COUNTY);
        // List<RiskRankingVO> voList = tbScoreService.queryRiskRanking(
        //         DateUtils.getPreviousQuarter());
        List<RiskRankingVO> voList = tbScoreService.queryRiskRanking(
                "2024年一季度");
        int rank = 1;
        for (RiskRankingVO riskRankingVO : voList) {
            riskRankingVO.setRank(rank++);
@@ -228,24 +260,29 @@
    }
    public List<QuestionVO> queryQuestions() throws Exception {
        String previousQuarter = DateUtils.getPreviousQuarter();
        previousQuarter = "2024年一季度";
        List<TbQuestion> list = tbQuestionService.lambdaQuery()
                .eq(TbQuestion::getQuarter, DateUtils.getNowQuarter()).list();
                .eq(TbQuestion::getQuarter, previousQuarter).list();
        return BeanUtils.copyList(list, QuestionVO.class);
    }
    public DataAnalysisVO getDataAnalysis(String areaCode) throws Exception {
        DataAnalysisVO dataAnalysisVO = new DataAnalysisVO();
        //查询得分排名
        // 查询得分排名
        ScoreRankVO scoreRankVO = tbScoreService.queryRankAndScoreByAreaCode(areaCode);
        if (Objects.isNull(scoreRankVO)) {
            return dataAnalysisVO;
        }
        dataAnalysisVO.setRank(scoreRankVO.getRank());
        dataAnalysisVO.setScore(scoreRankVO.getScore());
        String nowQuarter = DateUtils.getNowQuarter();
        //查询问题
        String previousQuarter = DateUtils.getPreviousQuarter();
        previousQuarter = "2024年一季度";
        // 查询问题
        List<TbQuestion> list = tbQuestionService.lambdaQuery()
                .eq(TbQuestion::getQuarter, nowQuarter).list();
                .eq(TbQuestion::getQuarter, previousQuarter)
                .eq(TbQuestion::getDeptAreaCode, areaCode)
                .list();
        List<QuestionVO> questionVOS = BeanUtils.copyList(list, QuestionVO.class);
        dataAnalysisVO.setQuestions(questionVOS);
        SysUser user = sysUserService.lambdaQuery()
@@ -255,24 +292,17 @@
            return dataAnalysisVO;
        }
        dataAnalysisVO.setAreaName(user.getDeptName());
        //查询风险得分
        // 查询风险得分
        DataScreenConfigVO riskLevel = tbDataScreenConfigService.getRiskLevel();
        List<RiskLevelVO> riskLevelVOList = formatRiskLevel(riskLevel);
        List<DataScreenScoreVO> thisYearScore = tbDataScreenScoreService.queryScoreByAreaAndYear(
                areaCode, riskLevel.getId(), 1);
        Optional<Double> thisYear = thisYearScore.stream().map(DataScreenScoreVO::getScore)
                .reduce(Double::sum);
        dataAnalysisVO.setYearScore(thisYear.orElse(0D));
        List<DataScreenScoreVO> lastYearScore = tbDataScreenScoreService.queryScoreByAreaAndYear(
                areaCode, riskLevel.getId(), 2);
        Optional<Double> lastYear = lastYearScore.stream().map(DataScreenScoreVO::getScore)
                .reduce(Double::sum);
        dataAnalysisVO.setLastYearScore(lastYear.orElse(0D));
        //查询风险等级
        List<TbDataScreenScore> dataScreenScoreList = tbDataScreenScoreService.selectRiskByQuarter(
                nowQuarter,
                riskLevel.getId(), areaCode);
        for (TbDataScreenScore tbDataScreenScore : dataScreenScoreList) {
        dataAnalysisVO.setYearScore(getYearScore(areaCode, previousQuarter));
        String lastYearQuarter = DateUtils.getLastYearQuarter(previousQuarter);
        dataAnalysisVO.setLastYearScore(getYearScore(areaCode, lastYearQuarter));
        // 查询风险等级
        List<RiskMapVO> currentScoreList = tbScoreService.getCurrentScoreList(previousQuarter,
                areaCode);
        for (RiskMapVO tbDataScreenScore : currentScoreList) {
            for (RiskLevelVO vo : riskLevelVOList) {
                if (vo.getRiskLevel().equals(RiskLevelEnum.L1)
                        && tbDataScreenScore.getScore() <= vo.getMin()) {
@@ -288,58 +318,151 @@
                }
            }
        }
        //查询形式指标得分
        List<ScoreDataVO> scoreDataVOList = new ArrayList<>();
        handleDataIndicators(areaCode, scoreDataVOList);
        dataAnalysisVO.setScoreDataList(scoreDataVOList);
        //查询数据指标得分
        List<ScoreRateDataVO> scoreRateDataVOList = new ArrayList<>();
        handleDataIndicators(areaCode, scoreRateDataVOList, nowQuarter);
        dataAnalysisVO.setScoreRateDataList(scoreRateDataVOList);
        //查询大屏下方字段列表
        // 查询四个指标下的三级指标
        List<FieldAndScoreDataVO> voList =
                tbBasicDataService.getFieldAndScoreData(areaCode, previousQuarter, 1, 2);
        List<FieldAndScoreDataVO> lastYearList =
                tbBasicDataService.getFieldAndScoreData(areaCode, previousQuarter, 2, 2);
        // 查询四个指标下的三级指标
        List<FieldAndScoreDataVO> allDeptVoList =
                tbBasicDataService.getFieldAndScoreData(areaCode, previousQuarter, 1, 1);
        // 查询形式指标得分
        dataAnalysisVO.setScoreDataList(handleDataIndicators(voList, lastYearList));
        // 查询数据指标得分
        dataAnalysisVO.setScoreRateDataList(handleDataIndicatorsRate(allDeptVoList, voList));
        // 查询大屏下方字段列表
        List<TbBasicDataCategory> categoryList = tbBasicDataCategoryService.lambdaQuery()
                .eq(TbBasicDataCategory::getStatus, ShowStatusEnum.SHOW).last("limit 4").list();
        List<FieldAndScoreDataVO> voList = tbBasicDataService.selectBasicDataFieldsConfig(areaCode,
                nowQuarter);
                .eq(TbBasicDataCategory::getParentId, -1)
                .eq(TbBasicDataCategory::getStatus, ShowStatusEnum.SHOW)
                .last("limit 4").list();
        if (categoryList.isEmpty()) {
            dataAnalysisVO.setScoreRateDataListOne(CollUtils.emptyList());
            dataAnalysisVO.setScoreRateDataListTwo(CollUtils.emptyList());
            dataAnalysisVO.setScoreRateDataListThree(CollUtils.emptyList());
            dataAnalysisVO.setScoreRateDataListFour(CollUtils.emptyList());
        } else {
            int size = categoryList.size();
            for (int i = 0; i < 4; i++) {
                List<FieldAndScoreDataVO> dataList;
                if (i < size) {
                    dataList = getFieldAndScoreData(voList,
                            categoryList.get(i).getBasicDataCategoryName());
                } else {
                    dataList = CollUtils.emptyList();
                }
                switch (i) {
                    case 0:
                        dataAnalysisVO.setScoreRateDataListOne(dataList);
                        break;
                    case 1:
                        dataAnalysisVO.setScoreRateDataListTwo(dataList);
                        break;
                    case 2:
                        dataAnalysisVO.setScoreRateDataListThree(dataList);
                        break;
                    case 3:
                        dataAnalysisVO.setScoreRateDataListFour(dataList);
                        break;
                }
            }
            dataAnalysisVO.setScoreRateDataListOne(getLevelThreeIndicators(voList, "财政经济形势"));
            dataAnalysisVO.setScoreRateDataListTwo(getLevelThreeIndicators(voList, "预算管理方面"));
            dataAnalysisVO.setScoreRateDataListThree(
                    getLevelThreeIndicators(voList, "预算执行方面"));
            dataAnalysisVO.setScoreRateDataListFour(
                    getLevelThreeIndicators(voList, "风险防控方面"));
        }
        return dataAnalysisVO;
    }
    private List<ScoreRateDataVO> handleDataIndicatorsRate(List<FieldAndScoreDataVO> allDeptVoList,
            List<FieldAndScoreDataVO> voList) {
        List<ScoreRateDataVO> result = new ArrayList<>();
        List<String> indicatorList = Lists.newArrayList("财政经济形势", "预算管理方面",
                "预算执行方面", "风险防控方面");
        for (int i = 0; i < indicatorList.size(); i++) {
            ScoreRateDataVO scoreRateDataVO = new ScoreRateDataVO();
            if (CollUtils.isEmpty(voList)) {
                scoreRateDataVO.setRank(0);
                scoreRateDataVO.setScore(0D);
                scoreRateDataVO.setSubType(SubTypeEnum.getEnumByCode(i + 1));
                scoreRateDataVO.setScoreRate(0D);
            } else {
                Double indicatorOne = getLevelThreeIndicators(voList, indicatorList.get(i)).stream()
                        .map(FieldAndScoreDataVO::getScore).reduce(Double::sum)
                        .map(BigDecimal::valueOf)
                        .orElse(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP)
                        .doubleValue();
                List<Double> allIndicatorsScore = getAllIndicatorsScoreByName(allDeptVoList,
                        indicatorList.get(i));
                allIndicatorsScore.add(indicatorOne);
                allIndicatorsScore.sort(Comparator.comparing(Double::doubleValue).reversed());
                scoreRateDataVO.setRank(allIndicatorsScore.indexOf(indicatorOne) + 1);
                scoreRateDataVO.setScore(indicatorOne);
                scoreRateDataVO.setSubType(SubTypeEnum.getEnumByCode(i + 1));
                scoreRateDataVO.setScoreRate(BigDecimal.valueOf(indicatorOne)
                        .divide(BigDecimal.valueOf(voList.get(i).getLevelOneIndicatorMaxScore()), 2,
                                RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100L))
                        .doubleValue());
            }
            result.add(scoreRateDataVO);
        }
        return result;
    }
    private List<Double> getAllIndicatorsScoreByName(List<FieldAndScoreDataVO> allDeptVoList,
            String indicatorName) {
        Map<String, List<FieldAndScoreDataVO>> collect = allDeptVoList.stream()
                .collect(Collectors.groupingBy(FieldAndScoreDataVO::getDeptAreaCode));
        return collect.keySet().stream().map(key -> {
            Double score = getLevelThreeIndicators(collect.get(key), indicatorName).stream()
                    .map(FieldAndScoreDataVO::getScore).reduce(Double::sum).orElse(0D);
            return score;
        }).sorted(Comparator.comparing(Double::intValue).reversed()).collect(Collectors.toList());
    }
    private List<ScoreDataVO> handleDataIndicators(List<FieldAndScoreDataVO> voList,
            List<FieldAndScoreDataVO> lastYearList) {
        List<ScoreDataVO> scoreDataVOList = new ArrayList<>();
        List<String> indicatorList = Lists.newArrayList("财政经济形势", "预算管理方面",
                "预算执行方面", "风险防控方面");
        for (int i = 0; i < indicatorList.size(); i++) {
            ScoreDataVO scoreDataVO = new ScoreDataVO();
            if (CollUtils.isEmpty(voList)) {
                scoreDataVO.setLastScore(0D);
                scoreDataVO.setScore(0D);
                scoreDataVO.setMaxScore(0D);
                scoreDataVO.setSubType(SubTypeEnum.getEnumByCode(i + 1));
            } else {
                Double indicatorOne = getLevelThreeIndicators(voList,
                        indicatorList.get(i)).stream()
                        .map(FieldAndScoreDataVO::getScore).reduce(Double::sum)
                        .map(BigDecimal::valueOf)
                        .orElse(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP)
                        .doubleValue();
                Double indicatorOneLastYear = getLevelThreeIndicators(lastYearList,
                        indicatorList.get(i)).stream()
                        .map(FieldAndScoreDataVO::getScore).reduce(Double::sum)
                        .map(BigDecimal::valueOf)
                        .orElse(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP).doubleValue();
                scoreDataVO.setLastScore(indicatorOneLastYear);
                scoreDataVO.setScore(indicatorOne);
                scoreDataVO.setMaxScore(voList.get(0).getLevelOneIndicatorMaxScore());
                scoreDataVO.setSubType(SubTypeEnum.getEnumByCode(i + 1));
            }
            scoreDataVOList.add(scoreDataVO);
        }
        return scoreDataVOList;
    }
    private List<FieldAndScoreDataVO> getLevelThreeIndicators(List<FieldAndScoreDataVO> voList,
            String indicatorName) {
        return voList.stream().map(vo -> {
            if (StringUtils.isNotBlank(vo.getLevelOneIndicator())) {
                if (StringUtils.trim(vo.getLevelOneIndicator()).equals(indicatorName)) {
                    return vo;
                } else {
                    if (StringUtils.isNotBlank(vo.getLevelTwoIndicator())
                            && StringUtils.trim(vo.getLevelTwoIndicator()).equals(indicatorName)) {
                        return vo;
                    }
                }
            }
            return null;
        }).filter(Objects::nonNull).collect(Collectors.toList());
    }
    private Double getYearScore(String areaCode, String previousQuarter) {
        List<RiskMapVO> thisYearScoreList = tbScoreService.getScoreByYearType(areaCode,
                previousQuarter);
        return thisYearScoreList.stream().map(RiskMapVO::getScore)
                .reduce(Double::sum).map(BigDecimal::valueOf).orElse(BigDecimal.ZERO)
                .setScale(2, RoundingMode.HALF_UP).doubleValue();
    }
    private void handleDataIndicators(String areaCode, List<ScoreDataVO> scoreDataVOList) {
        List<DataScreenScoreVO> formalIndicatorsYear = tbDataScreenScoreService.selectIndicators(
                areaCode, null, DataScreenConfigEnum.FORMAL_INDICATORS, 1);
        if (CollUtils.isNotEmpty(formalIndicatorsYear)) {
            //形式指标一
            // 形式指标一
            for (SubTypeEnum value : SubTypeEnum.values()) {
                ScoreDataVO scoreDataVO = new ScoreDataVO();
                scoreDataVO.setSubType(value);
@@ -425,14 +548,18 @@
    public List<DeptCalculateDetailVO> deptCalculateDetail(DeptCalculateDetailQuery query)
            throws Exception {
        return tbScoreService.deptCalculateDetail(query, DateUtils.getNowQuarter());
        String previousQuarter = DateUtils.getPreviousQuarter();
        previousQuarter = "2024年一季度";
        return tbScoreService.deptCalculateDetail(query, previousQuarter);
    }
    public CurrentFieldsDetailVO viewRawData(String areaCode) throws Exception {
        String previousQuarter = DateUtils.getPreviousQuarter();
        previousQuarter = "2024年一季度";
        Optional<TbBasicData> basicDataOptional = tbBasicDataService.lambdaQuery()
                .eq(TbBasicData::getDeptAreaCode, areaCode)
                .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED)
                .eq(TbBasicData::getQuarter, DateUtils.getNowQuarter()).oneOpt();
                .eq(TbBasicData::getQuarter, previousQuarter).oneOpt();
        if (basicDataOptional.isPresent()) {
            return tbBasicDataService.fieldsDetails(basicDataOptional.get().getId()).getData();
        } else {
@@ -442,7 +569,11 @@
    public ScoreCalculateDetailVO fieldsDetail(CalculateDetailQuery query) {
        List<SysUser> countyList = getCountyList(query.getCityAreaCode());
        return tbScoreService.fieldsDetail(query, countyList);
        try {
            return tbScoreService.fieldsDetail(query, countyList);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    public List<SysUser> getCountyList(String areaCode) {