| | |
| | | package com.finance.system.service.impl; |
| | | |
| | | import cn.hutool.core.date.DateUtil; |
| | | import com.alibaba.fastjson2.JSONArray; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
| | |
| | | import com.finance.common.enums.BasicDataFieldEnum; |
| | | import com.finance.common.enums.CalculateTypeEnum; |
| | | import com.finance.common.enums.IndicatorItemEnum; |
| | | import com.finance.common.enums.QuestionTypeEnum; |
| | | import com.finance.common.enums.ShowStatusEnum; |
| | | import com.finance.common.enums.ValueTypeEnum; |
| | | import com.finance.common.exception.ServiceException; |
| | | import com.finance.common.utils.CalculateUtil; |
| | | 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.TbBasicDataConfig; |
| | | import com.finance.system.domain.TbBasicDataConfigDetail; |
| | | import com.finance.system.domain.TbBasicDataField; |
| | | import com.finance.system.domain.TbField; |
| | | import com.finance.system.domain.TbQuestion; |
| | | import com.finance.system.domain.TbScore; |
| | | import com.finance.system.dto.CalculateItemDTO; |
| | | import com.finance.system.mapper.TbBasicDataMapper; |
| | | import com.finance.system.mapper.TbQuestionMapper; |
| | | import com.finance.system.service.AsyncService; |
| | | import com.finance.system.service.TbBasicDataCategoryService; |
| | | import com.finance.system.service.TbBasicDataConfigDetailService; |
| | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Map.Entry; |
| | |
| | | private final TbBasicDataCategoryService tbBasicDataCategoryService; |
| | | private final TbBasicDataConfigDetailService tbBasicDataConfigDetailService; |
| | | private final TbBasicDataMapper tbBasicDataMapper; |
| | | private final TbQuestionMapper tbQuestionMapper; |
| | | |
| | | @Async |
| | | @Override |
| | |
| | | // 待计算的基础数据字段 |
| | | Map<Long, TbBasicDataField> deptFieldsMap = fields.stream() |
| | | .collect(Collectors.toMap(TbBasicDataField::getFieldId, Function.identity())); |
| | | List<TbScore> scoreList = new ArrayList<>(); |
| | | List<TbQuestion> list = tbQuestionMapper.selectList( |
| | | Wrappers.lambdaQuery(TbQuestion.class) |
| | | .eq(TbQuestion::getQuarter, tbBasicData.getQuarter())); |
| | | String deptAreaCode = tbBasicData.getDeptAreaCode(); |
| | | List<TbScore> scoreList = tbScoreService.lambdaQuery() |
| | | .eq(TbScore::getBasicDataId, tbBasicData.getId()).list(); |
| | | for (BasicDataConfigVO vo : fixedRulesConfigList) { |
| | | double score = 0D; |
| | | BigDecimal deptDividendValue; |
| | | BigDecimal deptDivisorValue; |
| | | BigDecimal provinceDividendValue; |
| | | BigDecimal provinceDivisorValue; |
| | | List<TbQuestion> questionList; |
| | | // 季度末时间 |
| | | Date quarterDate = DateUtils.getQuarterDateEnd(tbBasicData.getQuarter()); |
| | | BigDecimal month = BigDecimal.valueOf( |
| | | Double.parseDouble(DateUtil.format(quarterDate, "MM"))); |
| | | switch (Objects.requireNonNull(IndicatorItemEnum.getEnumByCode(vo.getId()))) { |
| | | case INDICATOR_ITEM1: |
| | | // 1:财政经济形势-收入占GDP比重-地方一般公共预算收入占GDP的比重; |
| | | if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM1.getCode()) { |
| | | // 获取所需字段 |
| | | TbBasicDataField provinceField = provinceFieldsMap.get( |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD2.getCode()); |
| | | TbBasicDataField deptField = deptFieldsMap.get( |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD2.getCode()); |
| | | score = getScore(deptField.getFieldValue(), tbBasicData.getCurrentGdp(), |
| | | provinceField.getFieldValue(), provinceBasicData.getCurrentGdp(), vo); |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM2.getCode()) { |
| | | deptDividendValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD2); |
| | | deptDivisorValue = BigDecimal.valueOf( |
| | | Double.parseDouble(tbBasicData.getCurrentGdp())); |
| | | provinceDividendValue = getProvinceBigDecimal(provinceFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD2); |
| | | provinceDivisorValue = BigDecimal.valueOf( |
| | | Double.parseDouble(provinceBasicData.getCurrentGdp())); |
| | | score = getScore(deptDividendValue, deptDivisorValue, |
| | | provinceDividendValue, provinceDivisorValue, vo); |
| | | break; |
| | | case INDICATOR_ITEM2: |
| | | // 2:财政经济形势-收入执行率-地方一般公共预算收入执行进度(地方一般公共预算收入/年初预算或调整预算); |
| | | deptDividendValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD2); |
| | | deptDivisorValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD1); |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM3.getCode()) { |
| | | score = getScore(deptDividendValue, deptDivisorValue, month, |
| | | BigDecimal.valueOf(12D), |
| | | vo); |
| | | break; |
| | | case INDICATOR_ITEM3: |
| | | // 3:财政经济形势-收入执行率-政府性基金预算收入执行进度(政府性基金预算收入/年初预算或调整预算) |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM4.getCode()) { |
| | | deptDividendValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD18); |
| | | deptDivisorValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD17); |
| | | score = getScore(deptDividendValue, deptDivisorValue, month, |
| | | BigDecimal.valueOf(12D), |
| | | vo); |
| | | break; |
| | | case INDICATOR_ITEM4: |
| | | // 4:财政经济形势-收入质量-税收收入占地方一般公共预算收入比重 |
| | | // 获取所需字段 |
| | | TbBasicDataField provinceField = provinceFieldsMap.get( |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD3.getCode()); |
| | | TbBasicDataField deptField = deptFieldsMap.get( |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD3.getCode()); |
| | | TbBasicDataField provinceField2 = provinceFieldsMap.get( |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD2.getCode()); |
| | | TbBasicDataField deptField2 = deptFieldsMap.get( |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD2.getCode()); |
| | | score = getScore(deptField.getFieldValue(), deptField2.getFieldValue(), |
| | | provinceField.getFieldValue(), provinceField2.getFieldValue(), vo); |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM5.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM6.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM7.getCode()) { |
| | | TbField field = getFieldByFieldName(fieldList, "(一)一般公共预算", |
| | | "上级补助收入", "", |
| | | "执行数"); |
| | | |
| | | TbField field2 = getFieldByFieldName(fieldList, "(一)一般公共预算", |
| | | "综合财力(本级收入+上级补助-上解+下级上解收入-补助下级支出)", "", |
| | | "执行数"); |
| | | if (Objects.nonNull(field) && Objects.nonNull(field2)) { |
| | | TbBasicDataField provinceField = provinceFieldsMap.get(field.getId()); |
| | | TbBasicDataField deptField = deptFieldsMap.get(field.getId()); |
| | | TbBasicDataField provinceField2 = provinceFieldsMap.get(field2.getId()); |
| | | TbBasicDataField deptField2 = deptFieldsMap.get(field2.getId()); |
| | | score = getScore(deptField.getFieldValue(), deptField2.getFieldValue(), |
| | | provinceField.getFieldValue(), provinceField2.getFieldValue(), vo); |
| | | deptDividendValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD3); |
| | | deptDivisorValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD2); |
| | | provinceDividendValue = getProvinceBigDecimal(provinceFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD3); |
| | | provinceDivisorValue = getProvinceBigDecimal(provinceFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD2); |
| | | score = getScore(deptDividendValue, deptDivisorValue, |
| | | provinceDividendValue, provinceDivisorValue, vo); |
| | | break; |
| | | case INDICATOR_ITEM5: |
| | | // 5: 财政经济形势-重大财税政策落实情况-减税降费落实情况 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM0); |
| | | score = CollUtils.isNotEmpty(questionList) ? -5D : 0D; |
| | | break; |
| | | case INDICATOR_ITEM6: |
| | | // 6:财政经济形势-重大财税政策落实情况-其他重大政策落实情况 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM1); |
| | | score = CollUtils.isNotEmpty(questionList) ? questionList.size() * -3D : 0D; |
| | | break; |
| | | case INDICATOR_ITEM7: |
| | | // 7:预算管理方面-转移支付-中央转移支付占地方可用财力比重 |
| | | deptDividendValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD7); |
| | | deptDivisorValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD13); |
| | | provinceDividendValue = getProvinceBigDecimal(provinceFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD7); |
| | | provinceDivisorValue = getProvinceBigDecimal(provinceFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD7); |
| | | score = getScore2(deptDividendValue, deptDivisorValue, |
| | | provinceDividendValue, provinceDivisorValue, vo); |
| | | break; |
| | | case INDICATOR_ITEM8: |
| | | // 8:预算管理方面-“三保”保障情况-“三保”年初预算保障情况 |
| | | BigDecimal aw = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD47); |
| | | BigDecimal ap = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD40); |
| | | BigDecimal az = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD50); |
| | | BigDecimal aq = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD41); |
| | | BigDecimal bc = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD53); |
| | | BigDecimal ar = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD42); |
| | | boolean res = aw.compareTo(ap) < 0 || (az.compareTo(aq) < 0 || (bc.compareTo(ar) |
| | | < 0)); |
| | | score = res ? 0 : vo.getMaxScore(); |
| | | break; |
| | | case INDICATOR_ITEM9: |
| | | BigDecimal au = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD45); |
| | | BigDecimal r = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD13); |
| | | 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(); |
| | | } |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM8.getCode()) { |
| | | TbField field = getFieldByFieldName(fieldList, "(四)“三保”保障情况", |
| | | "地方标准“三保”支出(以地方实际结构填列,含国标)", "保基本民生", |
| | | "保基本民生"); |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM9.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM10.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM11.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM12.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM13.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM14.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM15.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM16.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM17.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM18.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM19.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM20.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM21.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM22.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM23.getCode()) { |
| | | |
| | | } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM24.getCode()) { |
| | | |
| | | break; |
| | | case INDICATOR_ITEM10: |
| | | // 10:预算管理方面-“三保”保障情况-“三保”支出保障情况 |
| | | questionList = getQuestList(list, deptAreaCode, QuestionTypeEnum.ENUM2); |
| | | score = CollUtils.isNotEmpty(questionList) ? 0D : vo.getMaxScore(); |
| | | break; |
| | | case INDICATOR_ITEM11: |
| | | // 11:预算管理方面-强化预算约束-存量资金盘活 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM3); |
| | | score = CollUtils.isNotEmpty(questionList) ? -3D : 0D; |
| | | break; |
| | | case INDICATOR_ITEM12: |
| | | // 12:预算管理方面-强化预算约束-不得无预算、超预算拨款 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM4); |
| | | score = CollUtils.isNotEmpty(questionList) ? -3D : 0D; |
| | | break; |
| | | case INDICATOR_ITEM13: |
| | | // 13:预算执行方面-库款管理-库款保障水平 |
| | | BigDecimal currentData = getBigDecimal(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(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD36); |
| | | BigDecimal second = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD37); |
| | | BigDecimal third = getBigDecimal(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); |
| | | score = part1.add(part2).doubleValue(); |
| | | break; |
| | | case INDICATOR_ITEM14: |
| | | // 14:预算执行方面-预算执行情况-一般公共预算支出执行率 |
| | | deptDividendValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD15); |
| | | deptDivisorValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD14); |
| | | score = getScoreByMonth(deptDividendValue, deptDivisorValue, month, vo); |
| | | break; |
| | | case INDICATOR_ITEM15: |
| | | // 15:预算执行方面-预算执行情况-政府性基金预算支出执行率 |
| | | deptDividendValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD23); |
| | | deptDivisorValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD22); |
| | | score = getScoreByMonth(deptDividendValue, deptDivisorValue, month, vo); |
| | | break; |
| | | case INDICATOR_ITEM16: |
| | | // 16:预算执行方面-中央直达资金-中央直达资金支付进度 |
| | | deptDividendValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD11); |
| | | BigDecimal divided1 = month.divide(BigDecimal.valueOf(12D), 2, |
| | | RoundingMode.HALF_UP); |
| | | 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())); |
| | | score = add.compareTo(BigDecimal.ZERO) < 0 ? 0D : add.doubleValue(); |
| | | } else { |
| | | score = vo.getMaxScore(); |
| | | } |
| | | break; |
| | | case INDICATOR_ITEM17: |
| | | // 17:预算执行方面-中央直达资金-直达资金规范使用 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM5); |
| | | score = CollUtils.isNotEmpty(questionList) ? 0D : vo.getMaxScore(); |
| | | break; |
| | | case INDICATOR_ITEM18: |
| | | // 18:风险防控方面-暂付款管理-违规新增暂付款 |
| | | deptDividendValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD57); |
| | | score = deptDividendValue.compareTo(BigDecimal.ZERO) > 0 ? 0D |
| | | : vo.getMaxScore(); |
| | | break; |
| | | case INDICATOR_ITEM19: |
| | | // 19:风险防控方面-暂付款管理-暂付款累计余额 |
| | | BigDecimal bk = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD61); |
| | | BigDecimal t = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD15); |
| | | BigDecimal ab = getBigDecimal(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)); |
| | | score = bk.compareTo(add) > 0 ? 0D : vo.getMaxScore(); |
| | | break; |
| | | case INDICATOR_ITEM20: |
| | | // 20:风险防控方面-暂付款管理-暂付款消化 |
| | | deptDividendValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD59); |
| | | deptDivisorValue = getBigDecimal(deptFieldsMap, |
| | | BasicDataFieldEnum.BASIC_DATA_FIELD58); |
| | | BigDecimal d1 = deptDividendValue.divide(deptDivisorValue, 2, |
| | | RoundingMode.HALF_UP); |
| | | BigDecimal d2 = month.divide(BigDecimal.valueOf(12D), 2, |
| | | RoundingMode.HALF_UP); |
| | | score = d1.compareTo(d2) < 0 ? d1.divide(d2, 2, RoundingMode.HALF_UP) |
| | | .multiply(BigDecimal.valueOf(vo.getMaxScore())).doubleValue() |
| | | : vo.getMaxScore(); |
| | | break; |
| | | case INDICATOR_ITEM21: |
| | | // 21:风险防控方面-债务管理-法定债务率 |
| | | score = getTextFieldScore(deptFieldsMap, BasicDataFieldEnum.BASIC_DATA_FIELD74, |
| | | vo); |
| | | break; |
| | | case INDICATOR_ITEM22: |
| | | // 22:风险防控方面-债务管理-隐性债务率 |
| | | score = getTextFieldScore(deptFieldsMap, BasicDataFieldEnum.BASIC_DATA_FIELD76, |
| | | vo); |
| | | break; |
| | | case INDICATOR_ITEM23: |
| | | // 23:风险防控方面-债务管理-隐性债务化解 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM6); |
| | | score = CollUtils.isNotEmpty(questionList) ? vo.getMaxScore() : -3D; |
| | | break; |
| | | case INDICATOR_ITEM24: |
| | | // 24:风险防控方面-债务管理-日常监督发现问题 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM7); |
| | | if (CollUtils.isNotEmpty(questionList)) { |
| | | score = -18D + questionList.size() * -1D; |
| | | } |
| | | break; |
| | | case INDICATOR_ITEM25: |
| | | // 25:风险防控方面-日常监督发现问题 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM8); |
| | | if (CollUtils.isNotEmpty(questionList)) { |
| | | score = questionList.size() * -1D; |
| | | } |
| | | break; |
| | | default: |
| | | // Handle default case if needed |
| | | break; |
| | | } |
| | | Optional<TbScore> scoreOpt = scoreList.stream() |
| | | .filter(s -> s.getBasicDataConfigId().equals(vo.getId())) |
| | | .findFirst(); |
| | | if (scoreOpt.isPresent()) { |
| | | TbScore tbScore = scoreOpt.get(); |
| | | tbScore.setScore(score); |
| | | } else { |
| | | TbScore tbScore = new TbScore(); |
| | | tbScore.setScore((double) score); |
| | | tbScore.setScore(score); |
| | | tbScore.setBasicDataId(tbBasicData.getId()); |
| | | tbScore.setBasicDataConfigId(vo.getId()); |
| | | scoreList.add(tbScore); |
| | | } |
| | | } |
| | | if (CollUtils.isNotEmpty(scoreList)) { |
| | | tbScoreService.saveOrUpdateBatch(scoreList); |
| | | } |
| | | } |
| | | |
| | | private static List<TbQuestion> getQuestList(List<TbQuestion> list, String deptAreaCode, |
| | | QuestionTypeEnum type) { |
| | | return list.stream() |
| | | .filter(q -> q.getDeptAreaCode().equals(deptAreaCode) && q.getType() |
| | | .equals(type)) |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | | private BigDecimal getProvinceBigDecimal(Map<Long, TbBasicDataField> provinceFieldsMap, |
| | | BasicDataFieldEnum key) { |
| | | TbBasicDataField tbBasicDataField = provinceFieldsMap.get(key.getCode()); |
| | | if (Objects.isNull(tbBasicDataField)) { |
| | | throw new ServiceException( |
| | | String.format("四川省的字段【%s】的数据缺失,请修改后再试", key.getDesc())); |
| | | } |
| | | return BigDecimal.valueOf(Double.parseDouble(tbBasicDataField.getFieldValue())); |
| | | } |
| | | |
| | | private BigDecimal getBigDecimal(Map<Long, TbBasicDataField> deptFieldsMap, |
| | | BasicDataFieldEnum key) { |
| | | TbBasicDataField tbBasicDataField = deptFieldsMap.get(key.getCode()); |
| | | if (Objects.isNull(tbBasicDataField) || StringUtils.isBlank( |
| | | tbBasicDataField.getFieldValue())) { |
| | | throw new ServiceException( |
| | | String.format("字段【%s】的数据缺失,请修改后再试", key.getDesc())); |
| | | } |
| | | |
| | | return BigDecimal.valueOf( |
| | | Double.parseDouble(tbBasicDataField.getFieldValue().replace(",", ""))); |
| | | } |
| | | |
| | | /** |
| | | * 通用计算公式获取得分 |
| | | * |
| | | * @param deptDividendValueStr 部门被除数字段值 |
| | | * @param deptDivisorValueStr 部门除数字段值 |
| | | * @param provinceDividendValueStr 省份被除数字段值 |
| | | * @param provinceDivisorValueStr 省份除数字段值 |
| | | * @param deptDividendValue 部门被除数 |
| | | * @param deptDivisorValue 部门除数 |
| | | * @param provinceDividendValue 省份被除数 |
| | | * @param provinceDivisorValue 省份除数 |
| | | * @param vo 基础数据配置 |
| | | * @return 得分 |
| | | */ |
| | | private Double getScore(String deptDividendValueStr, String deptDivisorValueStr, |
| | | String provinceDividendValueStr, String provinceDivisorValueStr, BasicDataConfigVO vo) { |
| | | private Double getScore(BigDecimal deptDividendValue, BigDecimal deptDivisorValue, |
| | | BigDecimal provinceDividendValue, BigDecimal provinceDivisorValue, |
| | | BasicDataConfigVO vo) { |
| | | BigDecimal score = BigDecimal.ZERO; |
| | | BigDecimal provinceDividendValue = BigDecimal.valueOf( |
| | | Long.parseLong(provinceDividendValueStr)); |
| | | BigDecimal provinceDivisorValue = BigDecimal.valueOf( |
| | | Long.parseLong(provinceDivisorValueStr)); |
| | | BigDecimal deptDividendValue = BigDecimal.valueOf( |
| | | Long.parseLong(deptDividendValueStr)); |
| | | BigDecimal deptDivisorValue = BigDecimal.valueOf( |
| | | Long.parseLong(deptDivisorValueStr)); |
| | | // 开始计算 |
| | | BigDecimal deptDivided = BigDecimal.ZERO; |
| | | |
| | |
| | | score = score.compareTo(BigDecimal.ZERO) >= 0 ? score : BigDecimal.ZERO; |
| | | } else { |
| | | score = BigDecimal.valueOf(vo.getMaxScore()); |
| | | } |
| | | return score.doubleValue(); |
| | | } |
| | | |
| | | private Double getScore2(BigDecimal deptDividendValue, BigDecimal deptDivisorValue, |
| | | BigDecimal provinceDividendValue, BigDecimal provinceDivisorValue, |
| | | BasicDataConfigVO vo) { |
| | | BigDecimal score = BigDecimal.ZERO; |
| | | // 开始计算 |
| | | BigDecimal deptDivided = BigDecimal.ZERO; |
| | | |
| | | if (deptDivisorValue.compareTo(BigDecimal.ZERO) > 0) { |
| | | deptDivided = deptDividendValue.divide(deptDivisorValue, 2, RoundingMode.HALF_UP); |
| | | } |
| | | BigDecimal provinceDivided = BigDecimal.ZERO; |
| | | |
| | | if (provinceDivisorValue.compareTo(BigDecimal.ZERO) > 0) { |
| | | provinceDivided = provinceDividendValue.divide(provinceDivisorValue, 2, |
| | | RoundingMode.HALF_UP); |
| | | } |
| | | if (deptDivided.compareTo(provinceDivided) < 0) { |
| | | |
| | | score = BigDecimal.valueOf(vo.getMaxScore()); |
| | | } else { |
| | | score = deptDivided.subtract(provinceDivided) |
| | | .multiply(BigDecimal.valueOf(100L)) |
| | | .add(BigDecimal.valueOf(vo.getMaxScore())); |
| | | score = score.compareTo(BigDecimal.ZERO) >= 0 ? score : BigDecimal.ZERO; |
| | | } |
| | | return score.doubleValue(); |
| | | } |
| | |
| | | } |
| | | return field; |
| | | } |
| | | |
| | | private Double getScoreByMonth(BigDecimal deptDividendValue, BigDecimal deptDivisorValue, |
| | | BigDecimal currentMonth, BasicDataConfigVO vo) { |
| | | double score; |
| | | BigDecimal divided1 = deptDividendValue.divide(deptDivisorValue, 2, |
| | | RoundingMode.HALF_UP); |
| | | BigDecimal divided2 = currentMonth.divide(BigDecimal.valueOf(12D), 2, |
| | | RoundingMode.HALF_UP); |
| | | if (divided1.compareTo( |
| | | currentMonth.divide(BigDecimal.valueOf(12D), 2, RoundingMode.HALF_UP)) |
| | | < 0) { |
| | | BigDecimal add = divided1.subtract(divided2) |
| | | .multiply(BigDecimal.valueOf(100D)) |
| | | .divide(BigDecimal.valueOf(5D), 2, |
| | | RoundingMode.HALF_UP) |
| | | .add(BigDecimal.valueOf(vo.getMaxScore())); |
| | | score = add.compareTo(BigDecimal.ZERO) < 0 ? 0D : add.doubleValue(); |
| | | } else { |
| | | score = vo.getMaxScore(); |
| | | } |
| | | return score; |
| | | } |
| | | |
| | | private Double getTextFieldScore(Map<Long, TbBasicDataField> deptFieldsMap, |
| | | BasicDataFieldEnum key, |
| | | BasicDataConfigVO vo) { |
| | | double score = 0D; |
| | | TbBasicDataField tbBasicDataField = deptFieldsMap.get( |
| | | key.getCode()); |
| | | if (Objects.isNull(tbBasicDataField) || StringUtils.isBlank( |
| | | tbBasicDataField.getFieldValue())) { |
| | | throw new ServiceException(String.format("字段【%s】的数据缺失,请修改后再试", |
| | | key.getDesc())); |
| | | } |
| | | score = tbBasicDataField.getFieldValue().equals("绿") ? vo.getMaxScore() |
| | | : tbBasicDataField.getFieldValue().equals("黄") ? 6D |
| | | : tbBasicDataField.getFieldValue().equals("橙") ? 3D : 0D; |
| | | return score; |
| | | } |
| | | |
| | | @Override |
| | | public void subtractScoreWithFixedRules(String deptAreaCode) throws Exception { |
| | | String nowQuarter = DateUtils.getNowQuarter(); |
| | | TbBasicData tbBasicData = tbBasicDataMapper.selectOne( |
| | | Wrappers.lambdaQuery(TbBasicData.class).eq(TbBasicData::getQuarter, nowQuarter) |
| | | .eq(TbBasicData::getDeptAreaCode, deptAreaCode)); |
| | | if (Objects.isNull(tbBasicData)) { |
| | | return; |
| | | } |
| | | List<TbScore> scoreList = tbScoreService.lambdaQuery() |
| | | .eq(TbScore::getBasicDataId, tbBasicData.getId()).list(); |
| | | List<BasicDataConfigVO> fixedRulesConfigList = tbBasicDataConfigService.getSubsractRulesConfigList(); |
| | | List<TbQuestion> list = tbQuestionMapper.selectList( |
| | | Wrappers.lambdaQuery(TbQuestion.class) |
| | | .eq(TbQuestion::getQuarter, nowQuarter) |
| | | .eq(TbQuestion::getDeptAreaCode, deptAreaCode)); |
| | | List<TbQuestion> questionList; |
| | | |
| | | for (BasicDataConfigVO vo : fixedRulesConfigList) { |
| | | double score = 0D; |
| | | switch (Objects.requireNonNull(IndicatorItemEnum.getEnumByCode(vo.getId()))) { |
| | | case INDICATOR_ITEM5: |
| | | // 5: 财政经济形势-重大财税政策落实情况-减税降费落实情况 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM0); |
| | | score = CollUtils.isNotEmpty(questionList) ? -5D : 0D; |
| | | break; |
| | | case INDICATOR_ITEM6: |
| | | // 6:财政经济形势-重大财税政策落实情况-其他重大政策落实情况 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM1); |
| | | score = CollUtils.isNotEmpty(questionList) ? questionList.size() * -3D : 0D; |
| | | break; |
| | | case INDICATOR_ITEM11: |
| | | // 11:预算管理方面-强化预算约束-存量资金盘活 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM3); |
| | | score = CollUtils.isNotEmpty(questionList) ? -3D : 0D; |
| | | break; |
| | | case INDICATOR_ITEM12: |
| | | // 12:预算管理方面-强化预算约束-不得无预算、超预算拨款 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM4); |
| | | score = CollUtils.isNotEmpty(questionList) ? -3D : 0D; |
| | | break; |
| | | case INDICATOR_ITEM23: |
| | | // 23:风险防控方面-债务管理-隐性债务化解 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM6); |
| | | score = CollUtils.isNotEmpty(questionList) ? vo.getMaxScore() : -3D; |
| | | break; |
| | | case INDICATOR_ITEM24: |
| | | // 24:风险防控方面-债务管理-日常监督发现问题 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM7); |
| | | if (CollUtils.isNotEmpty(questionList)) { |
| | | score = -18D + questionList.size() * -1D; |
| | | } |
| | | case INDICATOR_ITEM25: |
| | | // 25:风险防控方面-日常监督发现问题 |
| | | questionList = getQuestList(list, deptAreaCode, |
| | | QuestionTypeEnum.ENUM8); |
| | | if (CollUtils.isNotEmpty(questionList)) { |
| | | score = questionList.size() * -1D; |
| | | } |
| | | break; |
| | | |
| | | } |
| | | Optional<TbScore> scoreOpt = scoreList.stream() |
| | | .filter(s -> s.getBasicDataConfigId().equals(vo.getId())) |
| | | .findFirst(); |
| | | if (scoreOpt.isPresent()) { |
| | | TbScore tbScore = scoreOpt.get(); |
| | | tbScore.setScore(score); |
| | | } else { |
| | | TbScore tbScore = new TbScore(); |
| | | tbScore.setScore(score); |
| | | tbScore.setBasicDataId(tbBasicData.getId()); |
| | | tbScore.setBasicDataConfigId(vo.getId()); |
| | | scoreList.add(tbScore); |
| | | } |
| | | } |
| | | if (CollUtils.isNotEmpty(scoreList)) { |
| | | tbScoreService.saveOrUpdateBatch(scoreList); |
| | | } |
| | | } |
| | | } |