From 3e456f3e812ead6a19e80cfbdbf86ae0263d50b9 Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期五, 12 七月 2024 22:39:45 +0800 Subject: [PATCH] 完成7.4迭代内容,通过冒烟测试 --- finance-admin/src/main/java/com/finance/web/controller/service/ScreenService.java | 246 ++++++++++++++++++++++++++++++++---------------- 1 files changed, 164 insertions(+), 82 deletions(-) diff --git a/finance-admin/src/main/java/com/finance/web/controller/service/ScreenService.java b/finance-admin/src/main/java/com/finance/web/controller/service/ScreenService.java index d699985..acf53a9 100644 --- a/finance-admin/src/main/java/com/finance/web/controller/service/ScreenService.java +++ b/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.Collections; 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)); @@ -113,28 +118,29 @@ public RiskAndTransferVO getRiskAndTransfer() throws Exception { String nowQuarter = DateUtils.getNowQuarter(); RiskAndTransferVO riskAndTransferVO = new RiskAndTransferVO(); - //查询转移支付规模总额 + // 查询转移支付规模总额 List<TbBasicData> list = tbBasicDataService.lambdaQuery() .select(TbBasicData::getTransferPaymentScale) .eq(TbBasicData::getQuarter, nowQuarter) - .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED) + // .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(nowQuarter, null); - List<TbDataScreenScore> dataScreenScoreList = tbDataScreenScoreService.selectRiskByQuarter( - nowQuarter, riskLevel.getId(), null); for (RiskLevelVO vo : riskLevelVOList) { - long count = dataScreenScoreList.stream() + 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)) { @@ -145,24 +151,24 @@ 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 +210,7 @@ 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.getNowQuarter()); int rank = 1; for (RiskRankingVO riskRankingVO : voList) { riskRankingVO.setRank(rank++); @@ -235,7 +240,7 @@ public DataAnalysisVO getDataAnalysis(String areaCode) throws Exception { DataAnalysisVO dataAnalysisVO = new DataAnalysisVO(); - //查询得分排名 + // 查询得分排名 ScoreRankVO scoreRankVO = tbScoreService.queryRankAndScoreByAreaCode(areaCode); if (Objects.isNull(scoreRankVO)) { return dataAnalysisVO; @@ -243,9 +248,10 @@ dataAnalysisVO.setRank(scoreRankVO.getRank()); dataAnalysisVO.setScore(scoreRankVO.getScore()); String nowQuarter = DateUtils.getNowQuarter(); - //查询问题 + // 查询问题 List<TbQuestion> list = tbQuestionService.lambdaQuery() - .eq(TbQuestion::getQuarter, nowQuarter).list(); + .eq(TbQuestion::getQuarter, nowQuarter).eq(TbQuestion::getDeptAreaCode, areaCode) + .list(); List<QuestionVO> questionVOS = BeanUtils.copyList(list, QuestionVO.class); dataAnalysisVO.setQuestions(questionVOS); SysUser user = sysUserService.lambdaQuery() @@ -255,24 +261,16 @@ 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, 1)); + + dataAnalysisVO.setLastYearScore(getYearScore(areaCode, 2)); + // 查询风险等级 + List<RiskMapVO> currentScoreList = tbScoreService.getCurrentScoreList(nowQuarter, areaCode); + for (RiskMapVO tbDataScreenScore : currentScoreList) { for (RiskLevelVO vo : riskLevelVOList) { if (vo.getRiskLevel().equals(RiskLevelEnum.L1) && tbDataScreenScore.getScore() <= vo.getMin()) { @@ -288,58 +286,142 @@ } } } - //查询形式指标得分 - 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, nowQuarter, 1); + List<FieldAndScoreDataVO> lastYearList = + tbBasicDataService.getFieldAndScoreData(areaCode, nowQuarter, 2); + // 查询四个指标下的三级指标 + List<FieldAndScoreDataVO> allDeptVoList = + tbBasicDataService.getFieldAndScoreData(null, nowQuarter, 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(); + Double indicatorOne = getLevelThreeIndicators(voList, indicatorList.get(i)).stream() + .map(FieldAndScoreDataVO::getScore).reduce(Double::sum).orElse(0D); + + List<Double> allIndicatorsScore = getAllIndicatorsScoreByName(allDeptVoList, + indicatorList.get(i)); + scoreRateDataVO.setRank(findPositionInList(allIndicatorsScore, indicatorOne)); + 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; + } + + public static int findPositionInList(List<Double> list, Double value) { + // Sorting the list to use binary search + Collections.sort(list); + + // Finding the index using binary search + int index = Collections.binarySearch(list, value); + + if (index < 0) { + // If the value is not found, binarySearch returns (-(insertion point) - 1) + // Convert to the insertion point by doing (-index - 1) + index = -index - 1; + } + + return index + 1; + } + + + 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; + }).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++) { + Double indicatorOne = getLevelThreeIndicators(voList, indicatorList.get(i)).stream() + .map(FieldAndScoreDataVO::getScore).reduce(Double::sum).orElse(0D); + Double indicatorOneLastYear = getLevelThreeIndicators(lastYearList, + indicatorList.get(i)).stream() + .map(FieldAndScoreDataVO::getScore).reduce(Double::sum).orElse(0D); + ScoreDataVO scoreDataVO = new ScoreDataVO(); + 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, Integer yearType) { + List<RiskMapVO> thisYearScoreList = tbScoreService.getScoreByYearType(areaCode, yearType); + return thisYearScoreList.stream().map(RiskMapVO::getScore) + .reduce(Double::sum).orElse(0D); } 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); -- Gitblit v1.7.1