mitao
2 天以前 a93ad50197f1626a12ba5067639119400542f455
finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java
@@ -1,5 +1,7 @@
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;
@@ -49,6 +51,7 @@
import java.util.function.Function;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@@ -68,6 +71,8 @@
    private final TbBasicDataMapper tbBasicDataMapper;
    private final TbQuestionMapper tbQuestionMapper;
    private final ISysUserService sysUserService;
    @Value("${fdb.quarter}")
    private String quarter;
    @Async
    @Override
@@ -271,7 +276,7 @@
                            BasicDataFieldEnum.BASIC_DATA_FIELD17);
                    res1 = validateDivisorValue(deptDivisorValue);
                    if (!res1) {
                        score = getScore(deptDividendValue, deptDivisorValue, month,
                        score = getScore5(deptDividendValue, deptDivisorValue, month,
                                BigDecimal.valueOf(12D),
                                vo);
                    } else {
@@ -293,7 +298,7 @@
                    res2 = validateDivisorValue(provinceDivisorValue);
                    score = 0D;
                    if (!res1 && !res2) {
                        score = getScore(deptDividendValue, deptDivisorValue,
                        score = getScore5(deptDividendValue, deptDivisorValue,
                                provinceDividendValue, provinceDivisorValue, vo);
                    }
                    break;
@@ -346,23 +351,29 @@
                    score = res ? 0 : vo.getMaxScore();
                    break;
                case INDICATOR_ITEM9:
                    // 预算管理方面-“三保”保障情况-“三保”需求占可用财力的比重
                    BigDecimal au = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD45);
                    BigDecimal r = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD13);
                    res1 = validateDivisorValue(r);
                    score = 0D;
                    if (!res1) {
                        BigDecimal divided = au.divide(r, 2, RoundingMode.HALF_UP);
                        if (divided.compareTo(BigDecimal.valueOf(0.6D)) > 0) {
                            BigDecimal add = BigDecimal.valueOf(0.6D).subtract(divided)
                                    .multiply(BigDecimal.valueOf(100D))
                                    .divide(BigDecimal.valueOf(4D), 2, RoundingMode.HALF_UP)
                                    .add(BigDecimal.valueOf(8))
                                    .setScale(2, RoundingMode.HALF_UP);
                            score = add.compareTo(BigDecimal.ZERO) >= 0 ? add.doubleValue() : 0D;
                        } else {
                            score = vo.getMaxScore();
                    TbScore tbScore = scoreList.stream().filter(s -> s.getBasicDataConfigId()
                            .equals(INDICATOR_ITEM8.getCode())).findFirst().orElse(null);
                    if (tbScore != null) {
                        if (!res1 && tbScore.getScore() != 0) {
                            BigDecimal divided = au.divide(r, 4, RoundingMode.HALF_UP);
                            if (divided.compareTo(BigDecimal.valueOf(0.6D)) > 0) {
                                BigDecimal add = BigDecimal.valueOf(0.6D).subtract(divided)
                                        .multiply(BigDecimal.valueOf(100D))
                                        .divide(BigDecimal.valueOf(4D), 4, RoundingMode.HALF_UP)
                                        .add(BigDecimal.valueOf(8))
                                        .setScale(1, RoundingMode.HALF_UP);
                                score = add.compareTo(BigDecimal.ZERO) >= 0 ? add.doubleValue()
                                        : 0D;
                            } else {
                                score = vo.getMaxScore();
                            }
                        }
                    }
                    break;
@@ -397,10 +408,10 @@
                    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), 2, RoundingMode.HALF_UP)
                                .divide(BigDecimal.valueOf(0.1D), 4, RoundingMode.HALF_UP)
                                .multiply(BigDecimal.valueOf(0.6D))
                                .add(BigDecimal.valueOf(3D))
                                .setScale(2, RoundingMode.HALF_UP);
                                .setScale(1, RoundingMode.HALF_UP);
                        part1 = add.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : add;
                    } else {
                        part1 = BigDecimal.valueOf(3D);
@@ -426,14 +437,14 @@
                    String substring = tbBasicData.getQuarter().substring(4);
                    if (substring.equals("四季度")) {
                        // 使用全年评价
                        BigDecimal divide = deptDividendValue.divide(deptDivisorValue, 2,
                        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), 2, RoundingMode.HALF_UP)
                                    .divide(BigDecimal.valueOf(3D), 4, RoundingMode.HALF_UP)
                                    .add(BigDecimal.valueOf(vo.getMaxScore()))
                                    .setScale(2, RoundingMode.HALF_UP).doubleValue();
                                    .setScale(1, RoundingMode.HALF_UP).doubleValue();
                        } else {
                            score = vo.getMaxScore();
                        }
@@ -456,13 +467,13 @@
                    // 16:预算执行方面-中央直达资金-中央直达资金支付进度
                    deptDividendValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD89);
                    BigDecimal divided1 = month.divide(BigDecimal.valueOf(12D), 2,
                    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)
                                .divide(BigDecimal.valueOf(5D), 2, RoundingMode.HALF_UP)
                                .divide(BigDecimal.valueOf(5D), 4, RoundingMode.HALF_UP)
                                .add(BigDecimal.valueOf(vo.getMaxScore()))
                                .setScale(2, RoundingMode.HALF_UP);
                                .setScale(1, RoundingMode.HALF_UP);
                        score = add.compareTo(BigDecimal.ZERO) < 0 ? 0D : add.doubleValue();
                    } else {
                        score = vo.getMaxScore();
@@ -489,9 +500,10 @@
                            BasicDataFieldEnum.BASIC_DATA_FIELD15);// 696635
                    BigDecimal ab = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD23); // 56552
                    BigDecimal add = t.add(ab).divide(month.multiply(
                                    BigDecimal.valueOf(12D)).multiply(BigDecimal.valueOf(0.05D)), 2,
                            RoundingMode.HALF_UP);
                    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:
@@ -503,13 +515,13 @@
                    res1 = validateDivisorValue(deptDivisorValue);
                    score = 0D;
                    if (!res1) {
                        BigDecimal d1 = deptDividendValue.divide(deptDivisorValue, 2,
                        BigDecimal d1 = deptDividendValue.divide(deptDivisorValue, 4,
                                RoundingMode.HALF_UP);
                        BigDecimal d2 = month.divide(BigDecimal.valueOf(12D), 2,
                        BigDecimal d2 = month.divide(BigDecimal.valueOf(12D), 4,
                                RoundingMode.HALF_UP);
                        score = d1.compareTo(d2) < 0 ? d1.divide(d2, 2, RoundingMode.HALF_UP)
                        score = d1.compareTo(d2) < 0 ? d1.divide(d2, 4, RoundingMode.HALF_UP)
                                .multiply(BigDecimal.valueOf(vo.getMaxScore()))
                                .setScale(2, RoundingMode.HALF_UP).doubleValue()
                                .setScale(1, RoundingMode.HALF_UP).doubleValue()
                                : vo.getMaxScore();
                    } else {
                        score = vo.getMaxScore();
@@ -612,7 +624,7 @@
    }
    /**
     * 通用计算公式获取得分
     * 通用计算公式获取得分(每低1个百分点扣1分)
     *
     * @param deptDividendValue     部门被除数
     * @param deptDivisorValue      部门除数
@@ -629,19 +641,57 @@
        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()))
                    .setScale(2, RoundingMode.HALF_UP);
                    .setScale(1, RoundingMode.HALF_UP);
            score = score.compareTo(BigDecimal.ZERO) >= 0 ? score : BigDecimal.ZERO;
        } else {
            score = BigDecimal.valueOf(vo.getMaxScore());
        }
        return score.doubleValue();
    }
    /**
     * 通用计算公式获取得分(每低5个百分点扣一分)
     *
     * @param deptDividendValue     部门被除数
     * @param deptDivisorValue      部门除数
     * @param provinceDividendValue 省份被除数
     * @param provinceDivisorValue  省份除数
     * @param vo                    基础数据配置
     * @return 得分
     */
    private Double getScore5(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, 4, RoundingMode.HALF_UP);
        }
        BigDecimal provinceDivided = BigDecimal.ZERO;
        if (provinceDivisorValue.compareTo(BigDecimal.ZERO) > 0) {
            provinceDivided = provinceDividendValue.divide(provinceDivisorValue, 4,
                    RoundingMode.HALF_UP);
        }
        if (deptDivided.compareTo(provinceDivided) < 0) {
            score = deptDivided.subtract(provinceDivided)
                    .multiply(BigDecimal.valueOf(20))
                    .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());
@@ -657,12 +707,12 @@
        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) {
@@ -672,7 +722,7 @@
            score = provinceDivided.subtract(deptDivided)
                    .multiply(BigDecimal.valueOf(100L))
                    .add(BigDecimal.valueOf(vo.getMaxScore()))
                    .setScale(2, RoundingMode.HALF_UP);
                    .setScale(1, RoundingMode.HALF_UP);
            score = score.compareTo(BigDecimal.ZERO) >= 0 ? score : BigDecimal.ZERO;
        }
        return score.doubleValue();
@@ -744,18 +794,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();
@@ -783,6 +834,7 @@
    @Override
    public void subtractScoreWithFixedRules(String deptAreaCode) throws Exception {
        String previousQuarter = DateUtils.getPreviousQuarter();
        previousQuarter = quarter;
        TbBasicData tbBasicData = tbBasicDataMapper.selectOne(
                Wrappers.lambdaQuery(TbBasicData.class).eq(TbBasicData::getQuarter, previousQuarter)
                        .eq(TbBasicData::getDeptAreaCode, deptAreaCode));
@@ -829,15 +881,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,