mitao
2025-04-07 18891c60ab1c06a4acc85d0ec54dee50d1b1a19f
finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java
@@ -1,36 +1,49 @@
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;
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.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;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -56,6 +69,8 @@
    private final TbBasicDataCategoryService tbBasicDataCategoryService;
    private final TbBasicDataConfigDetailService tbBasicDataConfigDetailService;
    private final TbBasicDataMapper tbBasicDataMapper;
    private final TbQuestionMapper tbQuestionMapper;
    private final ISysUserService sysUserService;
    @Async
    @Override
@@ -172,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("四川省未上传该季度基础数据,请联系管理员");
@@ -189,142 +211,479 @@
        // 待计算的基础数据字段
        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")));
            boolean res1 = false;
            boolean res2 = false;
            switch (Objects.requireNonNull(IndicatorItemEnum.getEnumByCode(vo.getId()))) {
                case INDICATOR_ITEM1:
                    // 1:财政经济形势-收入占GDP比重-地方一般公共预算收入占GDP的比重;
                    // 获取所需字段
                    deptDividendValue = getBigDecimal(sysUser.getAreaName(), 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()));
                    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(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD2);
                    deptDivisorValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD1);
                    res1 = validateDivisorValue(deptDivisorValue);
                    if (!res1) {
                        score = getScore(deptDividendValue, deptDivisorValue, month,
                                BigDecimal.valueOf(12D),
                                vo);
                    } else {
                        score = 0D;
                    }
                    break;
                case INDICATOR_ITEM3:
                    // 3:财政经济形势-收入执行率-政府性基金预算收入执行进度(政府性基金预算收入/年初预算或调整预算)
                    deptDividendValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD18);
                    deptDivisorValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD17);
                    res1 = validateDivisorValue(deptDivisorValue);
                    if (!res1) {
                        score = getScore(deptDividendValue, deptDivisorValue, month,
                                BigDecimal.valueOf(12D),
                                vo);
                    } else {
                        score = 0D;
                    }
                    break;
                case INDICATOR_ITEM4:
                    // 4:财政经济形势-收入质量-税收收入占地方一般公共预算收入比重
                    // 获取所需字段
                    deptDividendValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD3);
                    deptDivisorValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD2);
                    provinceDividendValue = getProvinceBigDecimal(provinceFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD3);
                    provinceDivisorValue = getProvinceBigDecimal(provinceFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD2);
                    res1 = validateDivisorValue(deptDivisorValue);
                    res2 = validateDivisorValue(provinceDivisorValue);
                    score = 0D;
                    if (!res1 && !res2) {
                        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(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD7);
                    deptDivisorValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD13);
                    provinceDividendValue = getProvinceBigDecimal(provinceFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD7);
                    provinceDivisorValue = getProvinceBigDecimal(provinceFieldsMap,
                            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(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD47);
                    BigDecimal ap = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD40);
                    BigDecimal az = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD50);
                    BigDecimal aq = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD41);
                    BigDecimal bc = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD53);
                    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(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD45);
                    BigDecimal r = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD13);
                    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:
                    // 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(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 = 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(3D))
                                .setScale(1, RoundingMode.HALF_UP);
                        part1 = add.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : add;
                    } else {
                        part1 = BigDecimal.valueOf(3D);
                    }
            } 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()) {
                    // 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(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD15);
                    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(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD23);
                    deptDivisorValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD22);
                    res1 = validateDivisorValue(deptDivisorValue);
                    score = 0D;
                    if (!res1) {
                        score = getScoreByMonth(deptDividendValue, deptDivisorValue, month, vo);
                    }
                    break;
                case INDICATOR_ITEM16:
                    // 16:预算执行方面-中央直达资金-中央直达资金支付进度
                    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)
                                .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();
                    }
                    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(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD57);
                    score = deptDividendValue.compareTo(BigDecimal.ZERO) > 0 ? 0D
                            : vo.getMaxScore();
                    break;
                case INDICATOR_ITEM19:
                    // 19:风险防控方面-暂付款管理-暂付款累计余额
                    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(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD59);
                    deptDivisorValue = getBigDecimal(sysUser.getAreaName(), deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD58);
                    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:风险防控方面-债务管理-法定债务率
                    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.isEmpty(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 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()
                .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(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(areaName + "-" + "字段【%s】的数据缺失,请修改后再试",
                            key.getDesc()));
        }
        return BigDecimal.valueOf(
                Double.parseDouble(
                        tbBasicDataField.getFieldValue().replace(",", "").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;
        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());
        }
        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, 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 = BigDecimal.valueOf(vo.getMaxScore());
        } else {
            score = provinceDivided.subtract(deptDivided)
                    .multiply(BigDecimal.valueOf(100L))
                    .add(BigDecimal.valueOf(vo.getMaxScore()))
                    .setScale(1, RoundingMode.HALF_UP);
            score = score.compareTo(BigDecimal.ZERO) >= 0 ? score : BigDecimal.ZERO;
        }
        return score.doubleValue();
    }
@@ -391,4 +750,133 @@
        }
        return field;
    }
    private Double getScoreByMonth(BigDecimal deptDividendValue, BigDecimal deptDivisorValue,
            BigDecimal currentMonth, BasicDataConfigVO vo) {
        double score;
        BigDecimal divided1 = deptDividendValue.divide(deptDivisorValue, 4,
                RoundingMode.HALF_UP);
        BigDecimal divided2 = currentMonth.divide(BigDecimal.valueOf(12D), 4,
                RoundingMode.HALF_UP);
        if (divided1.compareTo(
                currentMonth.divide(BigDecimal.valueOf(12D), 4, RoundingMode.HALF_UP))
                < 0) {
            BigDecimal add = divided1.subtract(divided2)
                    .multiply(BigDecimal.valueOf(100D))
                    .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();
        }
        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 previousQuarter = DateUtils.getPreviousQuarter();
        previousQuarter = QuarterConstant.CURRENT_QUARTER;
        TbBasicData tbBasicData = tbBasicDataMapper.selectOne(
                Wrappers.lambdaQuery(TbBasicData.class).eq(TbBasicData::getQuarter, previousQuarter)
                        .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, previousQuarter)
                        .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) ? -3D : vo.getMaxScore();
                    break;
                case INDICATOR_ITEM24:
                    // 24:风险防控方面-债务管理-日常监督发现问题
                    questionList = getQuestList(list, deptAreaCode,
                            QuestionTypeEnum.ENUM7);
                    if (CollUtils.isNotEmpty(questionList)) {
                        score = questionList.size() * -1D;
                    }
                    break;
                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);
        }
    }
}