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