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-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java | 595 +++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 491 insertions(+), 104 deletions(-) diff --git a/finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java b/finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java index 46451c7..0ec80e2 100644 --- a/finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java +++ b/finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java @@ -1,5 +1,6 @@ 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; @@ -7,20 +8,24 @@ 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; @@ -31,6 +36,7 @@ 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; @@ -56,6 +62,7 @@ private final TbBasicDataCategoryService tbBasicDataCategoryService; private final TbBasicDataConfigDetailService tbBasicDataConfigDetailService; private final TbBasicDataMapper tbBasicDataMapper; + private final TbQuestionMapper tbQuestionMapper; @Async @Override @@ -189,123 +196,349 @@ // 待计算的基础数据字段 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; - // 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()) { - // 2:财政经济形势-收入执行率-地方一般公共预算收入执行进度(地方一般公共预算收入/年初预算或调整预算); + 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的比重; + // 获取所需字段 + 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()) { - // 3:财政经济形势-收入执行率-政府性基金预算收入执行进度(政府性基金预算收入/年初预算或调整预算) - } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM4.getCode()) { - // 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); - } - } 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()) { - + score = getScore(deptDividendValue, deptDivisorValue, month, + BigDecimal.valueOf(12D), + vo); + break; + case INDICATOR_ITEM3: + // 3:财政经济形势-收入执行率-政府性基金预算收入执行进度(政府性基金预算收入/年初预算或调整预算) + 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:财政经济形势-收入质量-税收收入占地方一般公共预算收入比重 + // 获取所需字段 + 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(); + } + 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; } - TbScore tbScore = new TbScore(); - tbScore.setScore((double) score); - tbScore.setBasicDataId(tbBasicData.getId()); - tbScore.setBasicDataConfigId(vo.getId()); - scoreList.add(tbScore); + 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); + } + } + + 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 vo 基础数据配置 + * @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; @@ -325,6 +558,34 @@ 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(); } @@ -391,4 +652,130 @@ } 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); + } + } } -- Gitblit v1.7.1