| | |
| | | package com.finance.system.service.impl; |
| | | |
| | | import static com.finance.common.enums.IndicatorItemEnum.INDICATOR_ITEM8; |
| | | |
| | | import cn.hutool.core.date.DateUtil; |
| | | import com.alibaba.fastjson2.JSONArray; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | |
| | | import com.finance.common.utils.CollUtils; |
| | | import com.finance.common.utils.DateUtils; |
| | | import com.finance.common.utils.StringUtils; |
| | | import com.finance.system.constants.QuarterConstant; |
| | | import com.finance.system.domain.TbBasicData; |
| | | import com.finance.system.domain.TbBasicDataConfig; |
| | | import com.finance.system.domain.TbBasicDataConfigDetail; |
| | |
| | | import com.finance.system.service.TbBasicDataFieldService; |
| | | import com.finance.system.service.TbScoreService; |
| | | import com.finance.system.vo.BasicDataConfigVO; |
| | | import com.google.common.collect.Lists; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.ArrayList; |
| | |
| | | } else { |
| | | score = 0D; |
| | | } |
| | | |
| | | break; |
| | | case INDICATOR_ITEM2: |
| | | // 2:财政经济形势-收入执行率-地方一般公共预算收入执行进度(地方一般公共预算收入/年初预算或调整预算); |
| | |
| | | score = getScore(deptDividendValue, deptDivisorValue, |
| | | provinceDividendValue, provinceDivisorValue, vo); |
| | | } |
| | | |
| | | break; |
| | | case INDICATOR_ITEM5: |
| | | // 5: 财政经济形势-重大财税政策落实情况-减税降费落实情况 |
| | |
| | | provinceDividendValue = getProvinceBigDecimal(provinceFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD7); |
| | | provinceDivisorValue = getProvinceBigDecimal(provinceFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD7); |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD13); |
| | | res1 = validateDivisorValue(deptDivisorValue); |
| | | res2 = validateDivisorValue(provinceDivisorValue); |
| | | score = 0D; |
| | | if (!res1 && res2) { |
| | | if (!res1 && !res2) { |
| | | score = getScore2(deptDividendValue, deptDivisorValue, |
| | | provinceDividendValue, provinceDivisorValue, vo); |
| | | } |
| | |
| | | score = res ? 0 : vo.getMaxScore(); |
| | | break; |
| | | case INDICATOR_ITEM9: |
| | | // 预算管理方面-“三保”保障情况-“三保”需求占可用财力的比重 |
| | | BigDecimal au = getBigDecimal(sysUser.getAreaName(), deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD45); |
| | | BigDecimal r = getBigDecimal(sysUser.getAreaName(), deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD13); |
| | | res1 = validateDivisorValue(r); |
| | | score = 0D; |
| | | if (!res1) { |
| | | BigDecimal divided = au.divide(r, 2, RoundingMode.HALF_UP); |
| | | if (divided.compareTo(BigDecimal.valueOf(0.6D)) > 0) { |
| | | BigDecimal add = BigDecimal.valueOf(0.6D).subtract(divided) |
| | | .multiply(BigDecimal.valueOf(100D)) |
| | | .divide(BigDecimal.valueOf(4D), 2, RoundingMode.HALF_UP) |
| | | .add(BigDecimal.valueOf(8)); |
| | | score = add.compareTo(BigDecimal.ZERO) >= 0 ? add.doubleValue() : 0D; |
| | | } else { |
| | | score = vo.getMaxScore(); |
| | | TbScore tbScore = scoreList.stream().filter(s -> s.getBasicDataConfigId() |
| | | .equals(INDICATOR_ITEM8.getCode())).findFirst().orElse(null); |
| | | if (tbScore != null) { |
| | | if (!res1 && tbScore.getScore() != 0) { |
| | | BigDecimal divided = au.divide(r, 4, RoundingMode.HALF_UP); |
| | | if (divided.compareTo(BigDecimal.valueOf(0.6D)) > 0) { |
| | | BigDecimal add = BigDecimal.valueOf(0.6D).subtract(divided) |
| | | .multiply(BigDecimal.valueOf(100D)) |
| | | .divide(BigDecimal.valueOf(4D), 4, RoundingMode.HALF_UP) |
| | | .add(BigDecimal.valueOf(8)) |
| | | .setScale(1, RoundingMode.HALF_UP); |
| | | score = add.compareTo(BigDecimal.ZERO) >= 0 ? add.doubleValue() |
| | | : 0D; |
| | | } else { |
| | | score = vo.getMaxScore(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | break; |
| | | case INDICATOR_ITEM10: |
| | | // 10:预算管理方面-“三保”保障情况-“三保”支出保障情况 |
| | |
| | | // 13:预算执行方面-库款管理-库款保障水平 |
| | | BigDecimal currentData = getBigDecimal(sysUser.getAreaName(), deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD35); |
| | | BigDecimal part1; |
| | | BigDecimal part2; |
| | | if (currentData.compareTo(BigDecimal.valueOf(0.8D)) < 0) { |
| | | BigDecimal add = currentData.subtract(BigDecimal.valueOf(0.8D)) |
| | | .divide(BigDecimal.valueOf(0.1D), 2, RoundingMode.HALF_UP) |
| | | .multiply(BigDecimal.valueOf(0.6D)) |
| | | .add(BigDecimal.valueOf(4D)); |
| | | part1 = add.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : add; |
| | | } else { |
| | | part1 = BigDecimal.valueOf(4D); |
| | | } |
| | | BigDecimal first = getBigDecimal(sysUser.getAreaName(), deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD36); |
| | | BigDecimal second = getBigDecimal(sysUser.getAreaName(), deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD37); |
| | | BigDecimal third = getBigDecimal(sysUser.getAreaName(), deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD38); |
| | | part2 = first.compareTo(BigDecimal.valueOf(0.3D)) < 0 |
| | | || second.compareTo(BigDecimal.valueOf(0.3D)) < 0 || third.compareTo( |
| | | BigDecimal.valueOf(0.3D)) < 0 ? BigDecimal.ZERO |
| | | : BigDecimal.valueOf(2D); |
| | | BigDecimal part1; |
| | | BigDecimal part2 = BigDecimal.ZERO; |
| | | if (third.compareTo(BigDecimal.valueOf(0.8D)) < 0) { |
| | | BigDecimal add = third.subtract(BigDecimal.valueOf(0.8D)) |
| | | .divide(BigDecimal.valueOf(0.1D), 4, RoundingMode.HALF_UP) |
| | | .multiply(BigDecimal.valueOf(0.6D)) |
| | | .add(BigDecimal.valueOf(3D)) |
| | | .setScale(1, RoundingMode.HALF_UP); |
| | | part1 = add.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : add; |
| | | } else { |
| | | part1 = BigDecimal.valueOf(3D); |
| | | } |
| | | |
| | | // String year = tbBasicData.getQuarter().substring(0, 4); |
| | | // List<BigDecimal> kuKuanList = tbBasicDataMapper.getKuKuanBaoZhangShuiPingByAreaCode( |
| | | // sysUser.getAreaCode(), |
| | | // year).stream() |
| | | // .map(BigDecimal::new) |
| | | // .collect(Collectors.toList()); |
| | | long count = Lists.newArrayList(first, second, third).stream() |
| | | .filter(item -> item.compareTo(BigDecimal.valueOf(0.3D)) >= 0).count(); |
| | | part2 = BigDecimal.valueOf(count); |
| | | score = part1.add(part2).doubleValue(); |
| | | break; |
| | | case INDICATOR_ITEM14: |
| | |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD15); |
| | | deptDivisorValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD14); |
| | | String substring = tbBasicData.getQuarter().substring(4); |
| | | if (substring.equals("四季度")) { |
| | | // 使用全年评价 |
| | | BigDecimal divide = deptDividendValue.divide(deptDivisorValue, 4, |
| | | RoundingMode.HALF_UP); |
| | | if (divide.compareTo(BigDecimal.valueOf(0.98D)) < 0) { |
| | | score = divide.subtract(BigDecimal.valueOf(0.98D)) |
| | | .multiply(BigDecimal.valueOf(100D)) |
| | | .divide(BigDecimal.valueOf(3D), 4, RoundingMode.HALF_UP) |
| | | .add(BigDecimal.valueOf(vo.getMaxScore())) |
| | | .setScale(1, RoundingMode.HALF_UP).doubleValue(); |
| | | } else { |
| | | score = vo.getMaxScore(); |
| | | } |
| | | } |
| | | score = getScoreByMonth(deptDividendValue, deptDivisorValue, month, vo); |
| | | break; |
| | | case INDICATOR_ITEM15: |
| | |
| | | case INDICATOR_ITEM16: |
| | | // 16:预算执行方面-中央直达资金-中央直达资金支付进度 |
| | | deptDividendValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD11); |
| | | BigDecimal divided1 = month.divide(BigDecimal.valueOf(12D), 2, |
| | | RoundingMode.HALF_UP); |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD89); |
| | | BigDecimal divided1 = month.divide(BigDecimal.valueOf(12D), 4, |
| | | RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100L)); |
| | | if (deptDividendValue.compareTo(divided1) < 0) { |
| | | BigDecimal add = deptDividendValue.subtract(divided1) |
| | | .multiply(BigDecimal.valueOf(100D)) |
| | | .divide(BigDecimal.valueOf(5D), 2, |
| | | RoundingMode.HALF_UP) |
| | | .add(BigDecimal.valueOf(vo.getMaxScore())); |
| | | .divide(BigDecimal.valueOf(5D), 4, RoundingMode.HALF_UP) |
| | | .add(BigDecimal.valueOf(vo.getMaxScore())) |
| | | .setScale(1, RoundingMode.HALF_UP); |
| | | score = add.compareTo(BigDecimal.ZERO) < 0 ? 0D : add.doubleValue(); |
| | | } else { |
| | | score = vo.getMaxScore(); |
| | |
| | | case INDICATOR_ITEM19: |
| | | // 19:风险防控方面-暂付款管理-暂付款累计余额 |
| | | BigDecimal bk = getBigDecimal(sysUser.getAreaName(), deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD61); |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD61);// 175414 |
| | | BigDecimal t = getBigDecimal(sysUser.getAreaName(), deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD15); |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD15);// 696635 |
| | | BigDecimal ab = getBigDecimal(sysUser.getAreaName(), deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD23); |
| | | BigDecimal add = t.add(ab.divide(month.multiply( |
| | | BigDecimal.valueOf(12D).multiply(BigDecimal.valueOf(0.05D))), 2, |
| | | RoundingMode.HALF_UP)); |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD23); // 56552 |
| | | BigDecimal add = t.add(ab).divide(month, 4, RoundingMode.HALF_UP) |
| | | .multiply(BigDecimal.valueOf(12D)) |
| | | .multiply(BigDecimal.valueOf(0.05D)) |
| | | .setScale(1, RoundingMode.HALF_UP); |
| | | score = bk.compareTo(add) > 0 ? 0D : vo.getMaxScore(); |
| | | break; |
| | | case INDICATOR_ITEM20: |
| | |
| | | res1 = validateDivisorValue(deptDivisorValue); |
| | | score = 0D; |
| | | if (!res1) { |
| | | BigDecimal d1 = deptDividendValue.divide(deptDivisorValue, 2, |
| | | BigDecimal d1 = deptDividendValue.divide(deptDivisorValue, 4, |
| | | RoundingMode.HALF_UP); |
| | | BigDecimal d2 = month.divide(BigDecimal.valueOf(12D), 2, |
| | | BigDecimal d2 = month.divide(BigDecimal.valueOf(12D), 4, |
| | | RoundingMode.HALF_UP); |
| | | score = d1.compareTo(d2) < 0 ? d1.divide(d2, 2, RoundingMode.HALF_UP) |
| | | .multiply(BigDecimal.valueOf(vo.getMaxScore())).doubleValue() |
| | | score = d1.compareTo(d2) < 0 ? d1.divide(d2, 4, RoundingMode.HALF_UP) |
| | | .multiply(BigDecimal.valueOf(vo.getMaxScore())) |
| | | .setScale(1, RoundingMode.HALF_UP).doubleValue() |
| | | : vo.getMaxScore(); |
| | | } else { |
| | | score = vo.getMaxScore(); |
| | | } |
| | | break; |
| | | case INDICATOR_ITEM21: |
| | |
| | | return false; |
| | | } |
| | | |
| | | |
| | | private static List<TbQuestion> getQuestList(List<TbQuestion> list, String deptAreaCode, |
| | | QuestionTypeEnum type) { |
| | | return list.stream() |
| | |
| | | } |
| | | |
| | | return BigDecimal.valueOf( |
| | | Double.parseDouble(tbBasicDataField.getFieldValue().replace(",", ""))); |
| | | Double.parseDouble( |
| | | tbBasicDataField.getFieldValue().replace(",", "").replace("%", ""))); |
| | | } |
| | | |
| | | /** |
| | |
| | | BigDecimal deptDivided = BigDecimal.ZERO; |
| | | |
| | | if (deptDivisorValue.compareTo(BigDecimal.ZERO) > 0) { |
| | | deptDivided = deptDividendValue.divide(deptDivisorValue, 2, RoundingMode.HALF_UP); |
| | | deptDivided = deptDividendValue.divide(deptDivisorValue, 4, RoundingMode.HALF_UP); |
| | | } |
| | | BigDecimal provinceDivided = BigDecimal.ZERO; |
| | | |
| | | if (provinceDivisorValue.compareTo(BigDecimal.ZERO) > 0) { |
| | | provinceDivided = provinceDividendValue.divide(provinceDivisorValue, 2, |
| | | provinceDivided = provinceDividendValue.divide(provinceDivisorValue, 4, |
| | | RoundingMode.HALF_UP); |
| | | } |
| | | if (deptDivided.compareTo(provinceDivided) < 0) { |
| | | score = deptDivided.subtract(provinceDivided) |
| | | .multiply(BigDecimal.valueOf(100L)) |
| | | .add(BigDecimal.valueOf(vo.getMaxScore())); |
| | | .add(BigDecimal.valueOf(vo.getMaxScore())) |
| | | .setScale(1, RoundingMode.HALF_UP); |
| | | score = score.compareTo(BigDecimal.ZERO) >= 0 ? score : BigDecimal.ZERO; |
| | | } else { |
| | | score = BigDecimal.valueOf(vo.getMaxScore()); |
| | |
| | | BigDecimal deptDivided = BigDecimal.ZERO; |
| | | |
| | | if (deptDivisorValue.compareTo(BigDecimal.ZERO) > 0) { |
| | | deptDivided = deptDividendValue.divide(deptDivisorValue, 2, RoundingMode.HALF_UP); |
| | | deptDivided = deptDividendValue.divide(deptDivisorValue, 4, RoundingMode.HALF_UP); |
| | | } |
| | | BigDecimal provinceDivided = BigDecimal.ZERO; |
| | | |
| | | if (provinceDivisorValue.compareTo(BigDecimal.ZERO) > 0) { |
| | | provinceDivided = provinceDividendValue.divide(provinceDivisorValue, 2, |
| | | provinceDivided = provinceDividendValue.divide(provinceDivisorValue, 4, |
| | | RoundingMode.HALF_UP); |
| | | } |
| | | if (deptDivided.compareTo(provinceDivided) < 0) { |
| | | |
| | | score = BigDecimal.valueOf(vo.getMaxScore()); |
| | | } else { |
| | | score = deptDivided.subtract(provinceDivided) |
| | | score = provinceDivided.subtract(deptDivided) |
| | | .multiply(BigDecimal.valueOf(100L)) |
| | | .add(BigDecimal.valueOf(vo.getMaxScore())); |
| | | .add(BigDecimal.valueOf(vo.getMaxScore())) |
| | | .setScale(1, RoundingMode.HALF_UP); |
| | | score = score.compareTo(BigDecimal.ZERO) >= 0 ? score : BigDecimal.ZERO; |
| | | } |
| | | return score.doubleValue(); |
| | |
| | | private Double getScoreByMonth(BigDecimal deptDividendValue, BigDecimal deptDivisorValue, |
| | | BigDecimal currentMonth, BasicDataConfigVO vo) { |
| | | double score; |
| | | BigDecimal divided1 = deptDividendValue.divide(deptDivisorValue, 2, |
| | | BigDecimal divided1 = deptDividendValue.divide(deptDivisorValue, 4, |
| | | RoundingMode.HALF_UP); |
| | | BigDecimal divided2 = currentMonth.divide(BigDecimal.valueOf(12D), 2, |
| | | BigDecimal divided2 = currentMonth.divide(BigDecimal.valueOf(12D), 4, |
| | | RoundingMode.HALF_UP); |
| | | if (divided1.compareTo( |
| | | currentMonth.divide(BigDecimal.valueOf(12D), 2, RoundingMode.HALF_UP)) |
| | | currentMonth.divide(BigDecimal.valueOf(12D), 4, RoundingMode.HALF_UP)) |
| | | < 0) { |
| | | BigDecimal add = divided1.subtract(divided2) |
| | | .multiply(BigDecimal.valueOf(100D)) |
| | | .divide(BigDecimal.valueOf(5D), 2, |
| | | .divide(BigDecimal.valueOf(5D), 4, |
| | | RoundingMode.HALF_UP) |
| | | .add(BigDecimal.valueOf(vo.getMaxScore())); |
| | | .add(BigDecimal.valueOf(vo.getMaxScore())) |
| | | .setScale(1, RoundingMode.HALF_UP); |
| | | score = add.compareTo(BigDecimal.ZERO) < 0 ? 0D : add.doubleValue(); |
| | | } else { |
| | | score = vo.getMaxScore(); |
| | |
| | | @Override |
| | | public void subtractScoreWithFixedRules(String deptAreaCode) throws Exception { |
| | | String previousQuarter = DateUtils.getPreviousQuarter(); |
| | | previousQuarter = QuarterConstant.CURRENT_QUARTER; |
| | | TbBasicData tbBasicData = tbBasicDataMapper.selectOne( |
| | | Wrappers.lambdaQuery(TbBasicData.class).eq(TbBasicData::getQuarter, previousQuarter) |
| | | .eq(TbBasicData::getDeptAreaCode, deptAreaCode)); |
| | |
| | | // 23:风险防控方面-债务管理-隐性债务化解 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM6); |
| | | score = CollUtils.isNotEmpty(questionList) ? vo.getMaxScore() : -3D; |
| | | score = CollUtils.isNotEmpty(questionList) ? -3D : vo.getMaxScore(); |
| | | break; |
| | | case INDICATOR_ITEM24: |
| | | // 24:风险防控方面-债务管理-日常监督发现问题 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM7); |
| | | if (CollUtils.isNotEmpty(questionList)) { |
| | | score = -18D + questionList.size() * -1D; |
| | | score = questionList.size() * -1D; |
| | | } |
| | | break; |
| | | case INDICATOR_ITEM25: |
| | | // 25:风险防控方面-日常监督发现问题 |
| | | questionList = getQuestList(list, deptAreaCode, |