| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | |
| | | 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); |
| | |
| | | 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)); |
| | |
| | | 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)) { |
| | |
| | | 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); |
| | | } |
| | |
| | | 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++); |
| | |
| | | |
| | | 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(); |
| | | //查询问题 |
| | | // 查询问题 |
| | | 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() |
| | |
| | | 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()) { |
| | |
| | | } |
| | | } |
| | | } |
| | | //查询形式指标得分 |
| | | 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); |