From 18891c60ab1c06a4acc85d0ec54dee50d1b1a19f Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期一, 07 四月 2025 17:20:07 +0800
Subject: [PATCH] bug修改

---
 finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java |  323 +++++++++++++++++++++++++++++++++++------------------
 1 files changed, 212 insertions(+), 111 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 0ec80e2..cbeba71 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,21 +1,26 @@
 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.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.finance.common.core.domain.entity.SysUser;
 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.UserTypeEnum;
 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.constants.QuarterConstant;
 import com.finance.system.domain.TbBasicData;
 import com.finance.system.domain.TbBasicDataConfig;
 import com.finance.system.domain.TbBasicDataConfigDetail;
@@ -27,12 +32,14 @@
 import com.finance.system.mapper.TbBasicDataMapper;
 import com.finance.system.mapper.TbQuestionMapper;
 import com.finance.system.service.AsyncService;
+import com.finance.system.service.ISysUserService;
 import com.finance.system.service.TbBasicDataCategoryService;
 import com.finance.system.service.TbBasicDataConfigDetailService;
 import com.finance.system.service.TbBasicDataConfigService;
 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;
@@ -63,6 +70,7 @@
     private final TbBasicDataConfigDetailService tbBasicDataConfigDetailService;
     private final TbBasicDataMapper tbBasicDataMapper;
     private final TbQuestionMapper tbQuestionMapper;
+    private final ISysUserService sysUserService;
 
     @Async
     @Override
@@ -179,11 +187,18 @@
     @Override
     public void calculateScoreWithFixedRules(TbBasicData tbBasicData,
             List<TbBasicDataField> fields, List<TbField> fieldList) {
+        if (tbBasicData.getDeptAreaCode().equals("000000")) {
+            return;
+        }
+        SysUser sysUser = sysUserService.lambdaQuery()
+                .eq(SysUser::getAreaCode, tbBasicData.getDeptAreaCode())
+                .eq(SysUser::getUserType,
+                        UserTypeEnum.DEPARTMENT).oneOpt().get();
         List<BasicDataConfigVO> fixedRulesConfigList = tbBasicDataConfigService.getFixedRulesConfigList();
         // 查询四川省的基础数据
         TbBasicData provinceBasicData = tbBasicDataMapper.selectOne(
                 Wrappers.lambdaQuery(TbBasicData.class)
-                        .eq(TbBasicData::getDeptAreaCode, "510000")
+                        .eq(TbBasicData::getDeptAreaCode, "000000")
                         .eq(TbBasicData::getQuarter, tbBasicData.getQuarter()));
         if (Objects.isNull(provinceBasicData)) {
             throw new ServiceException("四川省未上传该季度基础数据,请联系管理员");
@@ -213,11 +228,13 @@
             Date quarterDate = DateUtils.getQuarterDateEnd(tbBasicData.getQuarter());
             BigDecimal month = BigDecimal.valueOf(
                     Double.parseDouble(DateUtil.format(quarterDate, "MM")));
+            boolean res1 = false;
+            boolean res2 = false;
             switch (Objects.requireNonNull(IndicatorItemEnum.getEnumByCode(vo.getId()))) {
                 case INDICATOR_ITEM1:
                     // 1:财政经济形势-收入占GDP比重-地方一般公共预算收入占GDP的比重;
                     // 获取所需字段
-                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                    deptDividendValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD2);
                     deptDivisorValue = BigDecimal.valueOf(
                             Double.parseDouble(tbBasicData.getCurrentGdp()));
@@ -225,43 +242,63 @@
                             BasicDataFieldEnum.BASIC_DATA_FIELD2);
                     provinceDivisorValue = BigDecimal.valueOf(
                             Double.parseDouble(provinceBasicData.getCurrentGdp()));
-                    score = getScore(deptDividendValue, deptDivisorValue,
-                            provinceDividendValue, provinceDivisorValue, vo);
+                    res1 = validateDivisorValue(deptDivisorValue);
+                    res2 = validateDivisorValue(provinceDivisorValue);
+                    if (!res1 && !res2) {
+                        score = getScore(deptDividendValue, deptDivisorValue,
+                                provinceDividendValue, provinceDivisorValue, vo);
+                    } else {
+                        score = 0D;
+                    }
                     break;
                 case INDICATOR_ITEM2:
                     // 2:财政经济形势-收入执行率-地方一般公共预算收入执行进度(地方一般公共预算收入/年初预算或调整预算);
-                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                    deptDividendValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD2);
-                    deptDivisorValue = getBigDecimal(deptFieldsMap,
+                    deptDivisorValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD1);
-
-                    score = getScore(deptDividendValue, deptDivisorValue, month,
-                            BigDecimal.valueOf(12D),
-                            vo);
+                    res1 = validateDivisorValue(deptDivisorValue);
+                    if (!res1) {
+                        score = getScore(deptDividendValue, deptDivisorValue, month,
+                                BigDecimal.valueOf(12D),
+                                vo);
+                    } else {
+                        score = 0D;
+                    }
                     break;
                 case INDICATOR_ITEM3:
                     // 3:财政经济形势-收入执行率-政府性基金预算收入执行进度(政府性基金预算收入/年初预算或调整预算)
-                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                    deptDividendValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD18);
-                    deptDivisorValue = getBigDecimal(deptFieldsMap,
+                    deptDivisorValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD17);
-                    score = getScore(deptDividendValue, deptDivisorValue, month,
-                            BigDecimal.valueOf(12D),
-                            vo);
+                    res1 = validateDivisorValue(deptDivisorValue);
+                    if (!res1) {
+                        score = getScore(deptDividendValue, deptDivisorValue, month,
+                                BigDecimal.valueOf(12D),
+                                vo);
+                    } else {
+                        score = 0D;
+                    }
                     break;
                 case INDICATOR_ITEM4:
                     // 4:财政经济形势-收入质量-税收收入占地方一般公共预算收入比重
                     // 获取所需字段
-                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                    deptDividendValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD3);
-                    deptDivisorValue = getBigDecimal(deptFieldsMap,
+                    deptDivisorValue = getBigDecimal(sysUser.getAreaName(), 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);
+                    res1 = validateDivisorValue(deptDivisorValue);
+                    res2 = validateDivisorValue(provinceDivisorValue);
+                    score = 0D;
+                    if (!res1 && !res2) {
+                        score = getScore(deptDividendValue, deptDivisorValue,
+                                provinceDividendValue, provinceDivisorValue, vo);
+                    }
                     break;
                 case INDICATOR_ITEM5:
                     // 5: 财政经济形势-重大财税政策落实情况-减税降费落实情况
@@ -277,49 +314,65 @@
                     break;
                 case INDICATOR_ITEM7:
                     // 7:预算管理方面-转移支付-中央转移支付占地方可用财力比重
-                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                    deptDividendValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD7);
-                    deptDivisorValue = getBigDecimal(deptFieldsMap,
+                    deptDivisorValue = getBigDecimal(sysUser.getAreaName(), 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);
+                            BasicDataFieldEnum.BASIC_DATA_FIELD13);
+                    res1 = validateDivisorValue(deptDivisorValue);
+                    res2 = validateDivisorValue(provinceDivisorValue);
+                    score = 0D;
+                    if (!res1 && !res2) {
+                        score = getScore2(deptDividendValue, deptDivisorValue,
+                                provinceDividendValue, provinceDivisorValue, vo);
+                    }
                     break;
                 case INDICATOR_ITEM8:
                     // 8:预算管理方面-“三保”保障情况-“三保”年初预算保障情况
-                    BigDecimal aw = getBigDecimal(deptFieldsMap,
+                    BigDecimal aw = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD47);
-                    BigDecimal ap = getBigDecimal(deptFieldsMap,
+                    BigDecimal ap = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD40);
-                    BigDecimal az = getBigDecimal(deptFieldsMap,
+                    BigDecimal az = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD50);
-                    BigDecimal aq = getBigDecimal(deptFieldsMap,
+                    BigDecimal aq = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD41);
-                    BigDecimal bc = getBigDecimal(deptFieldsMap,
+                    BigDecimal bc = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD53);
-                    BigDecimal ar = getBigDecimal(deptFieldsMap,
+                    BigDecimal ar = getBigDecimal(sysUser.getAreaName(), 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,
+                    // 预算管理方面-“三保”保障情况-“三保”需求占可用财力的比重
+                    BigDecimal au = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD45);
-                    BigDecimal r = getBigDecimal(deptFieldsMap,
+                    BigDecimal r = getBigDecimal(sysUser.getAreaName(), 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();
+                    res1 = validateDivisorValue(r);
+                    score = 0D;
+                    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:
@@ -341,59 +394,84 @@
                     break;
                 case INDICATOR_ITEM13:
                     // 13:预算执行方面-库款管理-库款保障水平
-                    BigDecimal currentData = getBigDecimal(deptFieldsMap,
+                    BigDecimal currentData = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD35);
+                    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);
                     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)
+                    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(4D));
+                                .add(BigDecimal.valueOf(3D))
+                                .setScale(1, RoundingMode.HALF_UP);
                         part1 = add.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : add;
                     } else {
-                        part1 = BigDecimal.valueOf(4D);
+                        part1 = BigDecimal.valueOf(3D);
                     }
-                    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);
+
+                    // 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:
                     // 14:预算执行方面-预算执行情况-一般公共预算支出执行率
-                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                    deptDividendValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD15);
-                    deptDivisorValue = getBigDecimal(deptFieldsMap,
+                    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:
                     // 15:预算执行方面-预算执行情况-政府性基金预算支出执行率
-                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                    deptDividendValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD23);
-                    deptDivisorValue = getBigDecimal(deptFieldsMap,
+                    deptDivisorValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD22);
-                    score = getScoreByMonth(deptDividendValue, deptDivisorValue, month, vo);
+                    res1 = validateDivisorValue(deptDivisorValue);
+                    score = 0D;
+                    if (!res1) {
+                        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);
+                    deptDividendValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
+                            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();
@@ -407,37 +485,45 @@
                     break;
                 case INDICATOR_ITEM18:
                     // 18:风险防控方面-暂付款管理-违规新增暂付款
-                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                    deptDividendValue = getBigDecimal(sysUser.getAreaName(), 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));
+                    BigDecimal bk = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD61);// 175414
+                    BigDecimal t = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD15);// 696635
+                    BigDecimal ab = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
+                            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:
                     // 20:风险防控方面-暂付款管理-暂付款消化
-                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                    deptDividendValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                             BasicDataFieldEnum.BASIC_DATA_FIELD59);
-                    deptDivisorValue = getBigDecimal(deptFieldsMap,
+                    deptDivisorValue = getBigDecimal(sysUser.getAreaName(), 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();
+                    res1 = validateDivisorValue(deptDivisorValue);
+                    score = 0D;
+                    if (!res1) {
+                        BigDecimal d1 = deptDividendValue.divide(deptDivisorValue, 4,
+                                RoundingMode.HALF_UP);
+                        BigDecimal d2 = month.divide(BigDecimal.valueOf(12D), 4,
+                                RoundingMode.HALF_UP);
+                        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:
                     // 21:风险防控方面-债务管理-法定债务率
@@ -453,7 +539,7 @@
                     // 23:风险防控方面-债务管理-隐性债务化解
                     questionList = getQuestList(list, deptAreaCode,
                             QuestionTypeEnum.ENUM6);
-                    score = CollUtils.isNotEmpty(questionList) ? vo.getMaxScore() : -3D;
+                    score = CollUtils.isEmpty(questionList) ? vo.getMaxScore() : -3D;
                     break;
                 case INDICATOR_ITEM24:
                     // 24:风险防控方面-债务管理-日常监督发现问题
@@ -494,6 +580,14 @@
         }
     }
 
+    private static boolean validateDivisorValue(BigDecimal deptDivisorValue) {
+        if (deptDivisorValue.compareTo(BigDecimal.ZERO) == 0) {
+            return true;
+        }
+        return false;
+    }
+
+
     private static List<TbQuestion> getQuestList(List<TbQuestion> list, String deptAreaCode,
             QuestionTypeEnum type) {
         return list.stream()
@@ -512,17 +606,19 @@
         return BigDecimal.valueOf(Double.parseDouble(tbBasicDataField.getFieldValue()));
     }
 
-    private BigDecimal getBigDecimal(Map<Long, TbBasicDataField> deptFieldsMap,
+    private BigDecimal getBigDecimal(String areaName, 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()));
+                    String.format(areaName + "-" + "字段【%s】的数据缺失,请修改后再试",
+                            key.getDesc()));
         }
 
         return BigDecimal.valueOf(
-                Double.parseDouble(tbBasicDataField.getFieldValue().replace(",", "")));
+                Double.parseDouble(
+                        tbBasicDataField.getFieldValue().replace(",", "").replace("%", "")));
     }
 
     /**
@@ -543,18 +639,19 @@
         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());
@@ -570,21 +667,22 @@
         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();
@@ -656,18 +754,19 @@
     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();
@@ -694,9 +793,10 @@
 
     @Override
     public void subtractScoreWithFixedRules(String deptAreaCode) throws Exception {
-        String nowQuarter = DateUtils.getNowQuarter();
+        String previousQuarter = DateUtils.getPreviousQuarter();
+        previousQuarter = QuarterConstant.CURRENT_QUARTER;
         TbBasicData tbBasicData = tbBasicDataMapper.selectOne(
-                Wrappers.lambdaQuery(TbBasicData.class).eq(TbBasicData::getQuarter, nowQuarter)
+                Wrappers.lambdaQuery(TbBasicData.class).eq(TbBasicData::getQuarter, previousQuarter)
                         .eq(TbBasicData::getDeptAreaCode, deptAreaCode));
         if (Objects.isNull(tbBasicData)) {
             return;
@@ -706,7 +806,7 @@
         List<BasicDataConfigVO> fixedRulesConfigList = tbBasicDataConfigService.getSubsractRulesConfigList();
         List<TbQuestion> list = tbQuestionMapper.selectList(
                 Wrappers.lambdaQuery(TbQuestion.class)
-                        .eq(TbQuestion::getQuarter, nowQuarter)
+                        .eq(TbQuestion::getQuarter, previousQuarter)
                         .eq(TbQuestion::getDeptAreaCode, deptAreaCode));
         List<TbQuestion> questionList;
 
@@ -741,15 +841,16 @@
                     // 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,

--
Gitblit v1.7.1