mitao
2024-07-12 3e456f3e812ead6a19e80cfbdbf86ae0263d50b9
完成7.4迭代内容,通过冒烟测试
40个文件已修改
1个文件已添加
1606 ■■■■ 已修改文件
finance-admin-dept/src/main/resources/application-dev.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-admin/src/main/java/com/finance/web/controller/api/CurrentQuarterController.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-admin/src/main/java/com/finance/web/controller/api/TbDeptController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-admin/src/main/java/com/finance/web/controller/service/ScreenService.java 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-admin/src/main/resources/application-dev.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-admin/src/test/java/com/finance/FinanceManageApplicationTest.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-common/src/main/java/com/finance/common/core/domain/entity/SysUser.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-common/src/main/java/com/finance/common/enums/AreaLevelEnum.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-common/src/main/java/com/finance/common/enums/BasicDataFieldEnum.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-common/src/main/java/com/finance/common/enums/IndicatorItemEnum.java 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-common/src/main/java/com/finance/common/enums/QuestionTypeEnum.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-common/src/main/java/com/finance/common/utils/DateUtils.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/domain/TbBasicDataField.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/domain/TbQuestion.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/dto/QuestionDTO.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/dto/update/QuestionUpdDTO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/dto/update/RiskLevelUpdDTO.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/listener/BasicDataListener.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/mapper/TbBasicDataMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/mapper/TbScoreMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/service/AsyncService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/service/ISysUserService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/service/TbBasicDataConfigService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/service/TbBasicDataService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/service/TbScoreService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java 571 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/service/impl/SysUserServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataConfigServiceImpl.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataServiceImpl.java 258 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/service/impl/TbDataScreenConfigServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/service/impl/TbDeptServiceImpl.java 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/service/impl/TbQuestionServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/service/impl/TbScoreServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/vo/DataAnalysisVO.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/vo/DeptVO.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/vo/FieldAndScoreDataVO.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/vo/QuestionVO.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/java/com/finance/system/vo/RiskMapVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/resources/mapper/system/TbBasicDataMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/resources/mapper/system/TbDataScreenScoreMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-system/src/main/resources/mapper/system/TbScoreMapper.xml 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
finance-admin-dept/src/main/resources/application-dev.yml
@@ -102,9 +102,9 @@
    druid:
      # 主库数据源
      master:
        url: jdbc:mysql://1.95.13.179:3306/financialdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://127.0.0.1:3306/financialdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: Si8bnm5KPGSZkF3F
        password: 123456
        #                url: jdbc:mysql://8.137.10.192:3306/sys_config?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
        #                username: root
        #                password: shms#123~
@@ -165,7 +165,7 @@
  # 令牌密钥
  secret: abcdefghijklmnopqrstuvwxyz
  # 令牌有效期(默认30分钟)
  expireTime: 60 * 12
  expireTime: 720
# MyBatis配置
#mybatis:
finance-admin/src/main/java/com/finance/web/controller/api/CurrentQuarterController.java
@@ -13,23 +13,28 @@
import com.finance.system.query.QuestionQuery;
import com.finance.system.query.ScoreCalculateDetailQuery;
import com.finance.system.query.ScoreCalculateQuery;
import com.finance.system.service.ISysUserService;
import com.finance.system.service.TbBasicDataService;
import com.finance.system.service.TbQuestionService;
import com.finance.system.service.TbScoreService;
import com.finance.system.vo.CurrentFieldsAllVO;
import com.finance.system.vo.CurrentFieldsDetailVO;
import com.finance.system.vo.CurrentFieldsVO;
import com.finance.system.vo.DeptVO;
import com.finance.system.vo.QuestionVO;
import com.finance.system.vo.ScoreCalculateDetailVO;
import com.finance.system.vo.ScoreCalculateVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -50,6 +55,7 @@
    private final TbBasicDataService tbBasicDataService;
    private final TbQuestionService tbQuestionService;
    private final TbScoreService tbScoreService;
    private final ISysUserService sysUserService;
    /**
     * 字段统计
@@ -225,9 +231,9 @@
     */
    @GetMapping("/detail-question")
    @ApiOperation(value = "发现问题-问题详情" , notes = "发现问题")
    public R<QuestionDTO> detailQuestion(@RequestParam("id") Long id) {
    public R<QuestionVO> detailQuestion(@RequestParam("id") Long id) {
        TbQuestion question = tbQuestionService.getById(id);
        return R.ok(BeanUtils.copyBean(question, QuestionDTO.class));
        return R.ok(BeanUtils.copyBean(question, QuestionVO.class));
    }
    /**
@@ -242,4 +248,12 @@
        tbQuestionService.removeById(id);
        return R.ok();
    }
    @GetMapping(value = {"/dept/list/{deptName}", "/dept/list"})
    @ApiOperation(value = "发现问题-获取部门列表", notes = "发现问题")
    public R<List<DeptVO>> deptList(
            @ApiParam(value = "部门名称", required = false) @PathVariable(value = "deptName", required = false) String deptName) {
        return R.ok(sysUserService.queryDeptListByName(deptName));
    }
}
finance-admin/src/main/java/com/finance/web/controller/api/TbDeptController.java
@@ -76,7 +76,7 @@
            String fileName = URLEncoder.encode("部门导入模板", "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            Map<Integer, String[]> selectedMap = new HashMap<>();
            selectedMap.put(3, new String[]{"省本级", "市", "开发区", "县"});
            selectedMap.put(3, new String[]{"省", "市", "开发区", "县"});
            selectedMap.put(4, new String[]{"是", "否"});
            EasyExcel.write(response.getOutputStream(), DeptExcel.class).sheet("模板")
                    .registerWriteHandler(EasyExcelUtil.getStyleStrategy())
finance-admin/src/main/java/com/finance/web/controller/service/ScreenService.java
@@ -14,9 +14,9 @@
import com.finance.common.utils.BeanUtils;
import com.finance.common.utils.CollUtils;
import com.finance.common.utils.DateUtils;
import com.finance.common.utils.StringUtils;
import com.finance.system.domain.TbBasicData;
import com.finance.system.domain.TbBasicDataCategory;
import com.finance.system.domain.TbDataScreenScore;
import com.finance.system.domain.TbQuestion;
import com.finance.system.query.CalculateDetailQuery;
import com.finance.system.query.DeptCalculateDetailQuery;
@@ -48,8 +48,13 @@
import com.finance.system.vo.ScoreRankVO;
import com.finance.system.vo.ScoreRateDataVO;
import com.finance.system.vo.TransferPaymentScaleVO;
import com.google.common.collect.Lists;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -77,10 +82,10 @@
    public ProvinceStaticsVO provinceStatics() {
        ProvinceStaticsVO vo = new ProvinceStaticsVO();
        int provinceCount = getCount("省本级");
        int cityCount = getCount("市");
        int developmentZonesCount = getCount("开发区");
        int countyCount = getCount("县");
        int provinceCount = getCount(AreaLevelEnum.PROVINCE);
        int cityCount = getCount(AreaLevelEnum.CITY);
        int developmentZonesCount = getCount(AreaLevelEnum.DEVELOPMENT_ZONES);
        int countyCount = getCount(AreaLevelEnum.COUNTY);
        vo.setProvinceCount(provinceCount);
        vo.setCityCount(cityCount);
@@ -89,7 +94,7 @@
        return vo;
    }
    private int getCount(String level) {
    private int getCount(AreaLevelEnum level) {
        return (int) sysUserService.count(
                Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUserType, UserTypeEnum.DEPARTMENT)
                        .eq(SysUser::getAreaLevel, level));
@@ -117,7 +122,7 @@
        List<TbBasicData> list = tbBasicDataService.lambdaQuery()
                .select(TbBasicData::getTransferPaymentScale)
                .eq(TbBasicData::getQuarter, nowQuarter)
                .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED)
                // .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED)
                .list();
        Optional<Double> reduce = list.stream()
                .map(tbBasicData -> Double.parseDouble(tbBasicData.getTransferPaymentScale()))
@@ -128,13 +133,14 @@
        List<RiskLevelVO> riskLevelVOList = formatRiskLevel(riskLevel);
        riskAndTransferVO.setRiskLevelVOList(riskLevelVOList);
        RiskCountVO riskCountVO = new RiskCountVO();
        List<RiskMapVO> riskMapVOList = tbScoreService.getCurrentScoreList(nowQuarter, null);
        List<TbDataScreenScore> dataScreenScoreList = tbDataScreenScoreService.selectRiskByQuarter(
                nowQuarter, riskLevel.getId(), null);
        for (RiskLevelVO vo : riskLevelVOList) {
            long count = dataScreenScoreList.stream()
            long count = riskMapVOList.stream()
                    .filter(r -> r.getAreaLevel().equals(AreaLevelEnum.CITY))
                    .filter(item -> item.getScore() >= vo.getMin()
                            && item.getScore() <= vo.getMax()).count();
            if (vo.getRiskLevel().equals(RiskLevelEnum.L1)) {
                riskCountVO.setNoRiskCount((int) count);
            } else if (vo.getRiskLevel().equals(RiskLevelEnum.L2)) {
@@ -146,23 +152,23 @@
            }
        }
        //TODO
        riskCountVO.setNoRiskCount(50);
        riskCountVO.setLowRiskCount(45);
        riskCountVO.setMediumRiskCount(30);
        riskCountVO.setHighRiskCount(80);
        // riskCountVO.setNoRiskCount(50);
        // riskCountVO.setLowRiskCount(45);
        // riskCountVO.setMediumRiskCount(30);
        // riskCountVO.setHighRiskCount(80);
        riskAndTransferVO.setRiskCountVO(riskCountVO);
        //查询风险配置对应得分
        List<RiskMapVO> riskMapVOList = tbDataScreenScoreService.queryScore4Map(nowQuarter,
                riskLevel.getId());
        // List<RiskMapVO> riskMapVOList = tbDataScreenScoreService.queryScore4Map(nowQuarter,
        //         riskLevel.getId());
        riskAndTransferVO.setRiskMapVOList(riskMapVOList);
        return riskAndTransferVO;
    }
    private List<RiskLevelVO> formatRiskLevel(DataScreenConfigVO riskLevel) {
        String[] noRiskArr = riskLevel.getNoRisk().split("_");
        String[] lowRiskArr = riskLevel.getLowRisk().split("_");
        String[] mediumRiskArr = riskLevel.getMediumRisk().split("_");
        String[] highRiskArr = riskLevel.getHighRisk().split("_");
        String[] noRiskArr = riskLevel.getNoRisk().split("-");
        String[] lowRiskArr = riskLevel.getLowRisk().split("-");
        String[] mediumRiskArr = riskLevel.getMediumRisk().split("-");
        String[] highRiskArr = riskLevel.getHighRisk().split("-");
        return handleRiskLevel(noRiskArr, lowRiskArr, mediumRiskArr,
                highRiskArr);
    }
@@ -204,8 +210,7 @@
    public List<RiskRankingVO> riskRanking() throws Exception {
        DataScreenConfigVO riskLevel = tbDataScreenConfigService.getRiskLevel();
        List<RiskLevelVO> riskLevelVOList = formatRiskLevel(riskLevel);
        List<RiskRankingVO> voList = tbDataScreenScoreService.queryRiskRanking(riskLevel.getId(),
                DateUtils.getNowQuarter(), AreaLevelEnum.COUNTY);
        List<RiskRankingVO> voList = tbScoreService.queryRiskRanking(DateUtils.getNowQuarter());
        int rank = 1;
        for (RiskRankingVO riskRankingVO : voList) {
            riskRankingVO.setRank(rank++);
@@ -245,7 +250,8 @@
        String nowQuarter = DateUtils.getNowQuarter();
        //查询问题
        List<TbQuestion> list = tbQuestionService.lambdaQuery()
                .eq(TbQuestion::getQuarter, nowQuarter).list();
                .eq(TbQuestion::getQuarter, nowQuarter).eq(TbQuestion::getDeptAreaCode, areaCode)
                .list();
        List<QuestionVO> questionVOS = BeanUtils.copyList(list, QuestionVO.class);
        dataAnalysisVO.setQuestions(questionVOS);
        SysUser user = sysUserService.lambdaQuery()
@@ -258,21 +264,13 @@
        //查询风险得分
        DataScreenConfigVO riskLevel = tbDataScreenConfigService.getRiskLevel();
        List<RiskLevelVO> riskLevelVOList = formatRiskLevel(riskLevel);
        List<DataScreenScoreVO> thisYearScore = tbDataScreenScoreService.queryScoreByAreaAndYear(
                areaCode, riskLevel.getId(), 1);
        Optional<Double> thisYear = thisYearScore.stream().map(DataScreenScoreVO::getScore)
                .reduce(Double::sum);
        dataAnalysisVO.setYearScore(thisYear.orElse(0D));
        List<DataScreenScoreVO> lastYearScore = tbDataScreenScoreService.queryScoreByAreaAndYear(
                areaCode, riskLevel.getId(), 2);
        Optional<Double> lastYear = lastYearScore.stream().map(DataScreenScoreVO::getScore)
                .reduce(Double::sum);
        dataAnalysisVO.setLastYearScore(lastYear.orElse(0D));
        dataAnalysisVO.setYearScore(getYearScore(areaCode, 1));
        dataAnalysisVO.setLastYearScore(getYearScore(areaCode, 2));
        //查询风险等级
        List<TbDataScreenScore> dataScreenScoreList = tbDataScreenScoreService.selectRiskByQuarter(
                nowQuarter,
                riskLevel.getId(), areaCode);
        for (TbDataScreenScore tbDataScreenScore : dataScreenScoreList) {
        List<RiskMapVO> currentScoreList = tbScoreService.getCurrentScoreList(nowQuarter, areaCode);
        for (RiskMapVO tbDataScreenScore : currentScoreList) {
            for (RiskLevelVO vo : riskLevelVOList) {
                if (vo.getRiskLevel().equals(RiskLevelEnum.L1)
                        && tbDataScreenScore.getScore() <= vo.getMin()) {
@@ -288,53 +286,137 @@
                }
            }
        }
        // 查询四个指标下的三级指标
        List<FieldAndScoreDataVO> voList =
                tbBasicDataService.getFieldAndScoreData(areaCode, nowQuarter, 1);
        List<FieldAndScoreDataVO> lastYearList =
                tbBasicDataService.getFieldAndScoreData(areaCode, nowQuarter, 2);
        // 查询四个指标下的三级指标
        List<FieldAndScoreDataVO> allDeptVoList =
                tbBasicDataService.getFieldAndScoreData(null, nowQuarter, 1);
        //查询形式指标得分
        List<ScoreDataVO> scoreDataVOList = new ArrayList<>();
        handleDataIndicators(areaCode, scoreDataVOList);
        dataAnalysisVO.setScoreDataList(scoreDataVOList);
        dataAnalysisVO.setScoreDataList(handleDataIndicators(voList, lastYearList));
        //查询数据指标得分
        List<ScoreRateDataVO> scoreRateDataVOList = new ArrayList<>();
        handleDataIndicators(areaCode, scoreRateDataVOList, nowQuarter);
        dataAnalysisVO.setScoreRateDataList(scoreRateDataVOList);
        dataAnalysisVO.setScoreRateDataList(handleDataIndicatorsRate(allDeptVoList, voList));
        //查询大屏下方字段列表
        List<TbBasicDataCategory> categoryList = tbBasicDataCategoryService.lambdaQuery()
                .eq(TbBasicDataCategory::getStatus, ShowStatusEnum.SHOW).last("limit 4").list();
        List<FieldAndScoreDataVO> voList = tbBasicDataService.selectBasicDataFieldsConfig(areaCode,
                nowQuarter);
                .eq(TbBasicDataCategory::getParentId, -1)
                .eq(TbBasicDataCategory::getStatus, ShowStatusEnum.SHOW)
                .last("limit 4").list();
        if (categoryList.isEmpty()) {
            dataAnalysisVO.setScoreRateDataListOne(CollUtils.emptyList());
            dataAnalysisVO.setScoreRateDataListTwo(CollUtils.emptyList());
            dataAnalysisVO.setScoreRateDataListThree(CollUtils.emptyList());
            dataAnalysisVO.setScoreRateDataListFour(CollUtils.emptyList());
        } else {
            int size = categoryList.size();
            for (int i = 0; i < 4; i++) {
                List<FieldAndScoreDataVO> dataList;
                if (i < size) {
                    dataList = getFieldAndScoreData(voList,
                            categoryList.get(i).getBasicDataCategoryName());
                } else {
                    dataList = CollUtils.emptyList();
                }
                switch (i) {
                    case 0:
                        dataAnalysisVO.setScoreRateDataListOne(dataList);
                        break;
                    case 1:
                        dataAnalysisVO.setScoreRateDataListTwo(dataList);
                        break;
                    case 2:
                        dataAnalysisVO.setScoreRateDataListThree(dataList);
                        break;
                    case 3:
                        dataAnalysisVO.setScoreRateDataListFour(dataList);
                        break;
                }
            }
            dataAnalysisVO.setScoreRateDataListOne(getLevelThreeIndicators(voList, "财政经济形势"));
            dataAnalysisVO.setScoreRateDataListTwo(getLevelThreeIndicators(voList, "预算管理方面"));
            dataAnalysisVO.setScoreRateDataListThree(
                    getLevelThreeIndicators(voList, "预算执行方面"));
            dataAnalysisVO.setScoreRateDataListFour(
                    getLevelThreeIndicators(voList, "风险防控方面"));
        }
        return dataAnalysisVO;
    }
    private List<ScoreRateDataVO> handleDataIndicatorsRate(List<FieldAndScoreDataVO> allDeptVoList,
            List<FieldAndScoreDataVO> voList) {
        List<ScoreRateDataVO> result = new ArrayList<>();
        List<String> indicatorList = Lists.newArrayList("财政经济形势", "预算管理方面",
                "预算执行方面", "风险防控方面");
        for (int i = 0; i < indicatorList.size(); i++) {
            ScoreRateDataVO scoreRateDataVO = new ScoreRateDataVO();
            Double indicatorOne = getLevelThreeIndicators(voList, indicatorList.get(i)).stream()
                    .map(FieldAndScoreDataVO::getScore).reduce(Double::sum).orElse(0D);
            List<Double> allIndicatorsScore = getAllIndicatorsScoreByName(allDeptVoList,
                    indicatorList.get(i));
            scoreRateDataVO.setRank(findPositionInList(allIndicatorsScore, indicatorOne));
            scoreRateDataVO.setScore(indicatorOne);
            scoreRateDataVO.setSubType(SubTypeEnum.getEnumByCode(i + 1));
            scoreRateDataVO.setScoreRate(BigDecimal.valueOf(indicatorOne)
                    .divide(BigDecimal.valueOf(voList.get(i).getLevelOneIndicatorMaxScore()), 2,
                            RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100L)).doubleValue());
            result.add(scoreRateDataVO);
        }
        return result;
    }
    public static int findPositionInList(List<Double> list, Double value) {
        // Sorting the list to use binary search
        Collections.sort(list);
        // Finding the index using binary search
        int index = Collections.binarySearch(list, value);
        if (index < 0) {
            // If the value is not found, binarySearch returns (-(insertion point) - 1)
            // Convert to the insertion point by doing (-index - 1)
            index = -index - 1;
        }
        return index + 1;
    }
    private List<Double> getAllIndicatorsScoreByName(List<FieldAndScoreDataVO> allDeptVoList,
            String indicatorName) {
        Map<String, List<FieldAndScoreDataVO>> collect = allDeptVoList.stream()
                .collect(Collectors.groupingBy(FieldAndScoreDataVO::getDeptAreaCode));
        return collect.keySet().stream().map(key -> {
            Double score = getLevelThreeIndicators(collect.get(key), indicatorName).stream()
                    .map(FieldAndScoreDataVO::getScore).reduce(Double::sum).orElse(0D);
            return score;
        }).collect(Collectors.toList());
    }
    private List<ScoreDataVO> handleDataIndicators(List<FieldAndScoreDataVO> voList,
            List<FieldAndScoreDataVO> lastYearList) {
        List<ScoreDataVO> scoreDataVOList = new ArrayList<>();
        List<String> indicatorList = Lists.newArrayList("财政经济形势", "预算管理方面",
                "预算执行方面", "风险防控方面");
        for (int i = 0; i < indicatorList.size(); i++) {
            Double indicatorOne = getLevelThreeIndicators(voList, indicatorList.get(i)).stream()
                    .map(FieldAndScoreDataVO::getScore).reduce(Double::sum).orElse(0D);
            Double indicatorOneLastYear = getLevelThreeIndicators(lastYearList,
                    indicatorList.get(i)).stream()
                    .map(FieldAndScoreDataVO::getScore).reduce(Double::sum).orElse(0D);
            ScoreDataVO scoreDataVO = new ScoreDataVO();
            scoreDataVO.setLastScore(indicatorOneLastYear);
            scoreDataVO.setScore(indicatorOne);
            scoreDataVO.setMaxScore(voList.get(0).getLevelOneIndicatorMaxScore());
            scoreDataVO.setSubType(SubTypeEnum.getEnumByCode(i + 1));
            scoreDataVOList.add(scoreDataVO);
        }
        return scoreDataVOList;
    }
    private List<FieldAndScoreDataVO> getLevelThreeIndicators(List<FieldAndScoreDataVO> voList,
            String indicatorName) {
        return voList.stream().map(vo -> {
            if (StringUtils.isNotBlank(vo.getLevelOneIndicator())) {
                if (StringUtils.trim(vo.getLevelOneIndicator()).equals(indicatorName)) {
                    return vo;
                } else {
                    if (StringUtils.isNotBlank(vo.getLevelTwoIndicator())
                            && StringUtils.trim(vo.getLevelTwoIndicator()).equals(indicatorName)) {
                        return vo;
                    }
                }
            }
            return null;
        }).filter(Objects::nonNull).collect(Collectors.toList());
    }
    private Double getYearScore(String areaCode, Integer yearType) {
        List<RiskMapVO> thisYearScoreList = tbScoreService.getScoreByYearType(areaCode, yearType);
        return thisYearScoreList.stream().map(RiskMapVO::getScore)
                .reduce(Double::sum).orElse(0D);
    }
    private void handleDataIndicators(String areaCode, List<ScoreDataVO> scoreDataVOList) {
        List<DataScreenScoreVO> formalIndicatorsYear = tbDataScreenScoreService.selectIndicators(
                areaCode, null, DataScreenConfigEnum.FORMAL_INDICATORS, 1);
finance-admin/src/main/resources/application-dev.yml
@@ -166,7 +166,7 @@
  # 令牌密钥
  secret: abcdefghijklmnopqrstuvwxyz
  # 令牌有效期(默认30分钟)
  expireTime: 120
  expireTime: 720
# MyBatis配置
#mybatis:
finance-admin/src/test/java/com/finance/FinanceManageApplicationTest.java
@@ -5,15 +5,25 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.finance.common.enums.ShowStatusEnum;
import com.finance.common.utils.BeanUtils;
import com.finance.system.domain.TbBasicData;
import com.finance.system.domain.TbBasicDataCategory;
import com.finance.system.domain.TbBasicDataConfig;
import com.finance.system.domain.TbBasicDataField;
import com.finance.system.domain.TbField;
import com.finance.system.mapper.TbBasicDataFieldMapper;
import com.finance.system.mapper.TbBasicDataMapper;
import com.finance.system.service.AsyncService;
import com.finance.system.service.TbBasicDataCategoryService;
import com.finance.system.service.TbBasicDataConfigService;
import com.finance.system.service.TbFieldService;
import com.finance.system.vo.BasicDataConfigVO;
import com.finance.web.controller.service.DepartmentRanking;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@@ -35,6 +45,10 @@
    private TbBasicDataFieldMapper basicDataFieldMapper;
    @Resource
    private TbFieldService tbFieldService;
    @Resource
    private TbBasicDataConfigService tbBasicDataConfigService;
    @Resource
    private TbBasicDataCategoryService tbBasicDataCategoryService;
    @Test
    public void test() {
@@ -88,5 +102,35 @@
                tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
        asyncService.calculateScoreWithFixedRules(one, list, fieldList);
    }
    @Test
    public void test3() {
        List<TbBasicDataConfig> configList = tbBasicDataConfigService.lambdaQuery()
                .le(TbBasicDataConfig::getId, 25).list();
        List<BasicDataConfigVO> configVOList = BeanUtils.copyList(configList,
                BasicDataConfigVO.class);
        Map<Long, TbBasicDataCategory> configCategoryMap = tbBasicDataCategoryService.list()
                .stream()
                .collect(Collectors.toMap(TbBasicDataCategory::getId,
                        Function.identity()));
        configVOList = configVOList.stream().peek(c -> {
            TbBasicDataCategory tbBasicDataCategory2 = configCategoryMap.get(
                    c.getBasicDataCategoryId());
            if (Objects.nonNull(tbBasicDataCategory2)) {
                if (tbBasicDataCategory2.getParentId() == -1) {
                    c.setBasicDataCategoryOne(tbBasicDataCategory2.getBasicDataCategoryName());
                } else {
                    c.setBasicDataCategory(tbBasicDataCategory2.getBasicDataCategoryName());
                    TbBasicDataCategory tbBasicDataCategory1 = configCategoryMap.get(
                            tbBasicDataCategory2.getParentId());
                    if (Objects.nonNull(tbBasicDataCategory1)) {
                        c.setBasicDataCategoryOne(
                                tbBasicDataCategory1.getBasicDataCategoryName());
                    }
                }
            }
        }).collect(Collectors.toList());
        System.err.println(configVOList);
    }
}
finance-common/src/main/java/com/finance/common/core/domain/entity/SysUser.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.finance.common.core.domain.BaseEntity;
import com.finance.common.enums.AreaLevelEnum;
import com.finance.common.enums.DisabledEnum;
import com.finance.common.enums.UserTypeEnum;
import com.finance.common.xss.Xss;
@@ -192,10 +193,10 @@
    @ApiModelProperty(value = "区划代码")
    @TableField("area_code")
    private String areaCode;
    @ApiModelProperty(value = "级次(省、市、县)")
    // 1:省 2:市 3:开发区 4:县
    @ApiModelProperty(value = "级次(省、市、开发区、县)")
    @TableField("area_level")
    private String areaLevel;
    private AreaLevelEnum areaLevel;
    @ApiModelProperty(value = "县级标志(不包含直辖市的区 0:否 1:是)")
    @TableField("county_flag")
finance-common/src/main/java/com/finance/common/enums/AreaLevelEnum.java
@@ -1,17 +1,20 @@
package com.finance.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum AreaLevelEnum {
    PROVINCE(1, "省本级"),
    PROVINCE(1, "省"),
    CITY(2, "市"),
    DEVELOPMENT_ZONES(3, "开发区"),
    COUNTY(3, "县");
    COUNTY(4, "县");
    @EnumValue
    private final Integer code;
    @JsonValue
    private final String desc;
    public static AreaLevelEnum getEnumByCode(Integer code) {
finance-common/src/main/java/com/finance/common/enums/BasicDataFieldEnum.java
@@ -85,8 +85,9 @@
    BASIC_DATA_FIELD56(56L, "(五)暂付款情况-截至上年底暂付性款项余额-其中:2018年底前形成的暂付款"),
    BASIC_DATA_FIELD57(57L, "(五)暂付款情况-当年新增暂付性款项金额"),
    BASIC_DATA_FIELD58(58L, "(五)暂付款情况-当年消化情况-当年拟消化金额"),
    BASIC_DATA_FIELD59(59L, "(五)暂付款情况-当年消化情况-金额"),
    BASIC_DATA_FIELD60(60L, "(五)暂付款情况-当年消化情况-其中:已消化2018年底存量暂付款"),
    BASIC_DATA_FIELD59(59L, "(五)暂付款情况-当年消化情况-当年已消化金额-金额"),
    BASIC_DATA_FIELD60(60L,
            "(五)暂付款情况-当年消化情况-当年已消化金额-其中:已消化2018年底存量暂付款"),
    BASIC_DATA_FIELD61(61L, "(五)暂付款情况-累计暂付性款项余额"),
    BASIC_DATA_FIELD62(62L, "(六)存量资金情况-结转结余-总额"),
    BASIC_DATA_FIELD63(63L, "(六)存量资金情况-结转结余-其中:-一般公共预算结转结余"),
@@ -111,10 +112,10 @@
    BASIC_DATA_FIELD82(82L, "(七)债务管理情况-当年需付息金额-一般债-预算数"),
    BASIC_DATA_FIELD83(83L, "(七)债务管理情况-当年需付息金额-专项债-需求数"),
    BASIC_DATA_FIELD84(84L, "(七)债务管理情况-当年需付息金额-专项债-预算数"),
    BASIC_DATA_FIELD85(85L, "(七)债务管理情况', '当年已付息金额-一般债"),
    BASIC_DATA_FIELD86(86L, "(七)债务管理情况', '当年已付息金额-专项债"),
    BASIC_DATA_FIELD87(87L, "(七)债务管理情况', '当年已付息金额-一般债"),
    BASIC_DATA_FIELD88(88L, "(七)债务管理情况', '当年已付息金额-专项债");
    BASIC_DATA_FIELD85(85L, "(七)债务管理情况-当年已付息金额-一般债"),
    BASIC_DATA_FIELD86(86L, "(七)债务管理情况-当年已付息金额-专项债"),
    BASIC_DATA_FIELD87(87L, "(七)债务管理情况-当年已付息金额-一般债"),
    BASIC_DATA_FIELD88(88L, "(七)债务管理情况-当年已付息金额-专项债");
    private final Long code;
    private final String desc;
finance-common/src/main/java/com/finance/common/enums/IndicatorItemEnum.java
@@ -6,37 +6,38 @@
@Getter
@AllArgsConstructor
public enum IndicatorItemEnum {
    INDICATOR_ITEM1(1, "财政经济形势-收入占GDP比重-地方一般公共预算收入占GDP的比重"),
    INDICATOR_ITEM2(2,
    INDICATOR_ITEM1(1L, "财政经济形势-收入占GDP比重-地方一般公共预算收入占GDP的比重"),
    INDICATOR_ITEM2(2L,
            "财政经济形势-收入执行率-地方一般公共预算收入执行进度(地方一般公共预算收入/年初预算或调整预算)"),
    INDICATOR_ITEM3(3,
    INDICATOR_ITEM3(3L,
            "财政经济形势-收入执行率-政府性基金预算收入执行进度(政府性基金预算收入/年初预算或调整预算)"),
    INDICATOR_ITEM4(4, "财政经济形势-收入质量-税收收入占地方一般公共预算收入比重"),
    INDICATOR_ITEM5(5, "财政经济形势-重大财税政策落实情况-减税降费落实情况"),
    INDICATOR_ITEM6(6, "财政经济形势-重大财税政策落实情况-其他重大政策落实情况"),
    INDICATOR_ITEM7(7, "预算管理方面-转移支付-中央转移支付占地方可用财力比重"),
    INDICATOR_ITEM8(8, "预算管理方面-“三保”保障情况-“三保”年初预算保障情况"),
    INDICATOR_ITEM9(9, "预算管理方面-“三保”保障情况-“三保”需求占可用财力的比重"),
    INDICATOR_ITEM10(10, "预算管理方面-“三保”保障情况-“三保”支出保障情况"),
    INDICATOR_ITEM11(11, "预算管理方面-强化预算约束-存量资金盘活"),
    INDICATOR_ITEM12(12, "预算管理方面-强化预算约束-不得无预算、超预算拨款"),
    INDICATOR_ITEM13(13, "预算执行方面-库款管理-库款保障水平"),
    INDICATOR_ITEM14(14, "预算执行方面-预算执行情况-一般公共预算支出执行率"),
    INDICATOR_ITEM15(15, "预算执行方面-预算执行情况-政府性基金预算支出执行率"),
    INDICATOR_ITEM16(16, "预算执行方面-中央直达资金-中央直达资金支付进度"),
    INDICATOR_ITEM17(17, "预算执行方面-中央直达资金-直达资金规范使用"),
    INDICATOR_ITEM18(18, "风险防控方面-暂付款管理-违规新增暂付款"),
    INDICATOR_ITEM19(19, "风险防控方面-暂付款管理-暂付款累计余额"),
    INDICATOR_ITEM20(20, "风险防控方面-暂付款管理-暂付款消化"),
    INDICATOR_ITEM21(21, "风险防控方面-债务管理-法定债务率"),
    INDICATOR_ITEM22(22, "风险防控方面-债务管理-隐性债务率"),
    INDICATOR_ITEM23(23, "风险防控方面-债务管理-日常监督发现问题"),
    INDICATOR_ITEM24(24, "风险防控方面-日常监督发现问题");
    INDICATOR_ITEM4(4L, "财政经济形势-收入质量-税收收入占地方一般公共预算收入比重"),
    INDICATOR_ITEM5(5L, "财政经济形势-重大财税政策落实情况-减税降费落实情况"),
    INDICATOR_ITEM6(6L, "财政经济形势-重大财税政策落实情况-其他重大政策落实情况"),
    INDICATOR_ITEM7(7L, "预算管理方面-转移支付-中央转移支付占地方可用财力比重"),
    INDICATOR_ITEM8(8L, "预算管理方面-“三保”保障情况-“三保”年初预算保障情况"),
    INDICATOR_ITEM9(9L, "预算管理方面-“三保”保障情况-“三保”需求占可用财力的比重"),
    INDICATOR_ITEM10(10L, "预算管理方面-“三保”保障情况-“三保”支出保障情况"),
    INDICATOR_ITEM11(11L, "预算管理方面-强化预算约束-存量资金盘活"),
    INDICATOR_ITEM12(12L, "预算管理方面-强化预算约束-不得无预算、超预算拨款"),
    INDICATOR_ITEM13(13L, "预算执行方面-库款管理-库款保障水平"),
    INDICATOR_ITEM14(14L, "预算执行方面-预算执行情况-一般公共预算支出执行率"),
    INDICATOR_ITEM15(15L, "预算执行方面-预算执行情况-政府性基金预算支出执行率"),
    INDICATOR_ITEM16(16L, "预算执行方面-中央直达资金-中央直达资金支付进度"),
    INDICATOR_ITEM17(17L, "预算执行方面-中央直达资金-直达资金规范使用"),
    INDICATOR_ITEM18(18L, "风险防控方面-暂付款管理-违规新增暂付款"),
    INDICATOR_ITEM19(19L, "风险防控方面-暂付款管理-暂付款累计余额"),
    INDICATOR_ITEM20(20L, "风险防控方面-暂付款管理-暂付款消化"),
    INDICATOR_ITEM21(21L, "风险防控方面-债务管理-法定债务率"),
    INDICATOR_ITEM22(22L, "风险防控方面-债务管理-隐性债务率"),
    INDICATOR_ITEM23(23L, "风险防控方面-债务管理-隐性债务化解"),
    INDICATOR_ITEM24(24L, "风险防控方面-债务管理-日常监督发现问题"),
    INDICATOR_ITEM25(25L, "风险防控方面-日常监督发现问题");
    private final Integer code;
    private final Long code;
    private final String desc;
    public static IndicatorItemEnum getEnumByCode(Integer code) {
    public static IndicatorItemEnum getEnumByCode(Long code) {
        for (IndicatorItemEnum e : IndicatorItemEnum.values()) {
            if (e.code.equals(code)) {
                return e;
finance-common/src/main/java/com/finance/common/enums/QuestionTypeEnum.java
New file
@@ -0,0 +1,33 @@
package com.finance.common.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum QuestionTypeEnum {
    ENUM0(1, "减税降费政策未落实情况"),
    ENUM1(2, "其他重大财税政策"),
    ENUM2(3, "“三保”支出保障情况"),
    ENUM3(4, "盘活存量资金"),
    ENUM4(5, "无预算、超预算拨款"),
    ENUM5(6, "直达资金规范使用"),
    ENUM6(7, "隐形债务化解"),
    ENUM7(8, "债务日常监管"),
    ENUM8(9, "日常监管发现问题");
    @EnumValue
    private final Integer code;
    @JsonValue
    private final String desc;
    public static QuestionTypeEnum getEnumByCode(Integer code) {
        for (QuestionTypeEnum e : QuestionTypeEnum.values()) {
            if (e.code.equals(code)) {
                return e;
            }
        }
        return null;
    }
}
finance-common/src/main/java/com/finance/common/utils/DateUtils.java
@@ -1,6 +1,7 @@
package com.finance.common.utils;
import cn.hutool.core.convert.NumberChineseFormatter;
import cn.hutool.core.date.DateUtil;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@@ -409,13 +410,40 @@
        return DateUtils.toDate(startDate);
    }
    public static Date getQuarterDateEnd(String quarter) {
        // 提取年份和季度信息
        int year = Integer.parseInt(quarter.substring(0, 4));
        int quarterNumber = NumberChineseFormatter.chineseToNumber(quarter.substring(5, 6)); // 季度数字
        // 计算季度初的日期
        LocalDate startDate;
        switch (quarterNumber) {
            case 1:
                startDate = LocalDate.of(year, 3, 1);
                break;
            case 2:
                startDate = LocalDate.of(year, 6, 1);
                break;
            case 3:
                startDate = LocalDate.of(year, 9, 1);
                break;
            case 4:
                startDate = LocalDate.of(year, 12, 1);
                break;
            default:
                throw new IllegalArgumentException("Invalid quarter number: " + quarterNumber);
        }
        return DateUtils.toDate(startDate);
    }
    //测试 getNowQuarter
    public static void main(String[] args) throws Exception {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String nowQuarter = getNowQuarter();
        System.out.println(nowQuarter);
        System.out.println(NumberChineseFormatter.chineseToNumber("一"));
        System.out.println(simpleDateFormat.format(getQuarterDate("2024年一季度")));
        System.out.println(simpleDateFormat.format(getQuarterDateEnd("2024年一季度")));
        String month = DateUtil.format(getQuarterDateEnd("2024年一季度"), "MM");
        System.out.println(Double.parseDouble(month));
        System.out.println(simpleDateFormat.format(getQuarterDate("2024年二季度")));
        System.out.println(simpleDateFormat.format(getQuarterDate("2024年三季度")));
        System.out.println(simpleDateFormat.format(getQuarterDate("2024年四季度")));
finance-system/src/main/java/com/finance/system/domain/TbBasicDataField.java
@@ -48,18 +48,6 @@
    @TableField("field_value")
    private String fieldValue;
    @ApiModelProperty(value = "第一月数据")
    @TableField("first_month_value")
    private String firstMonthValue;
    @ApiModelProperty(value = "第二月数据")
    @TableField("second_month_value")
    private String secondMonthValue;
    @ApiModelProperty(value = "第三月数据")
    @TableField("third_month_value")
    private String thirdMonthValue;
    @ApiModelProperty(value = "创建人")
    @TableField(value = "create_by", fill = FieldFill.INSERT)
    private String createBy;
finance-system/src/main/java/com/finance/system/domain/TbQuestion.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.finance.common.enums.QuestionTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
@@ -45,6 +46,14 @@
    @TableField("`quarter`")
    private String quarter;
    @ApiModelProperty(value = "问题类型")
    @TableField("`type`")
    private QuestionTypeEnum type;
    @ApiModelProperty(value = "区划代码")
    @TableField("dept_area_code")
    private String deptAreaCode;
    @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)")
    @TableField("del_flag")
    @TableLogic
finance-system/src/main/java/com/finance/system/dto/QuestionDTO.java
@@ -1,11 +1,12 @@
package com.finance.system.dto;
import com.finance.common.enums.QuestionTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import lombok.Data;
/**
 * @author mitao
@@ -14,11 +15,23 @@
@Data
@ApiModel(value = "发现问题数据传输对象")
public class QuestionDTO implements Serializable {
    private static final long serialVersionUID = -8074469734465858811L;
    @ApiModelProperty(value = "问题标题")
    @NotBlank(message = "问题标题不能为空")
    private String title;
    @ApiModelProperty(value = "问题内容")
    @NotBlank(message = "问题内容不能为空")
    private String content;
    @ApiModelProperty(value = "问题类型", notes = "问题类型 1:减税降费政策未落实情况 2:其他重大财税政策 "
            + "3:“三保”支出保障情况4:盘活存量资金5:无预算、超预算拨款6:直达资金规范使用7:隐形债务化解"
            + "8:债务日常监管9:日常监管发现问题")
    @NotNull(message = "问题内容不能为空")
    private QuestionTypeEnum type;
    @ApiModelProperty("区划代码")
    @NotBlank(message = "区划代码不能为空")
    private String deptAreaCode;
}
finance-system/src/main/java/com/finance/system/dto/update/QuestionUpdDTO.java
@@ -1,5 +1,6 @@
package com.finance.system.dto.update;
import com.finance.common.enums.QuestionTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
@@ -19,10 +20,22 @@
    @ApiModelProperty(value = "id")
    @NotNull(message = "id不能为空")
    private Long id;
    @ApiModelProperty(value = "问题标题")
    @NotBlank(message = "问题标题不能为空")
    private String title;
    @ApiModelProperty(value = "问题内容")
    @NotBlank(message = "问题内容不能为空")
    private String content;
    @ApiModelProperty(value = "问题类型", notes = "问题类型 1:减税降费政策未落实情况 2:其他重大财税政策 "
            + "3:“三保”支出保障情况4:盘活存量资金5:无预算、超预算拨款6:直达资金规范使用7:隐形债务化解"
            + "8:债务日常监管9:日常监管发现问题")
    @NotNull(message = "问题内容不能为空")
    private QuestionTypeEnum type;
    @ApiModelProperty("区划代码")
    @NotBlank(message = "区划代码不能为空")
    private String deptAreaCode;
}
finance-system/src/main/java/com/finance/system/dto/update/RiskLevelUpdDTO.java
@@ -6,7 +6,6 @@
import java.io.Serializable;
import java.util.List;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import lombok.Data;
/**
@@ -20,7 +19,7 @@
    private static final long serialVersionUID = -4878457973955230627L;
    @ApiModelProperty(value = "计算规则")
    @NotEmpty(message = "计算规则不能为空")
    // @NotEmpty(message = "计算规则不能为空")
    private List<CalculateItemDTO> calculateItemList;
    @ApiModelProperty(value = "风险等级范围-高风险得分")
finance-system/src/main/java/com/finance/system/listener/BasicDataListener.java
@@ -279,7 +279,7 @@
        tbBasicDataFieldService.saveBatch(fields);
        log.info(String.format("%s导入基础数据成功!", dataMap.get(0)));
        // asyncService.calculateScore(tbBasicData, fields);
        asyncService.asyncTask();
        asyncService.calculateScoreWithFixedRules(tbBasicData, fields, fieldList);
    }
finance-system/src/main/java/com/finance/system/mapper/TbBasicDataMapper.java
@@ -29,4 +29,7 @@
    List<FieldAndScoreDataVO> selectBasicDataFieldsConfig(@Param("areaCode") String areaCode,
            @Param("nowQuarter") String nowQuarter);
    List<FieldAndScoreDataVO> getFieldAndScoreData(@Param("areaCode") String areaCode,
            @Param("nowQuarter") String nowQuarter, @Param("yearType") Integer yearType);
}
finance-system/src/main/java/com/finance/system/mapper/TbScoreMapper.java
@@ -8,6 +8,8 @@
import com.finance.system.query.ScoreCalculateDetailQuery;
import com.finance.system.query.ScoreQuery;
import com.finance.system.vo.DeptCalculateDetailVO;
import com.finance.system.vo.RiskMapVO;
import com.finance.system.vo.RiskRankingVO;
import com.finance.system.vo.ScoreDetailVO;
import com.finance.system.vo.ScoreRankVO;
import com.finance.system.vo.ScoreVO;
@@ -38,4 +40,12 @@
    Page<ScoreDetailVO> fieldsDetail(@Param("query") CalculateDetailQuery query,
            @Param("page") Page<ScoreDetailVO> page, @Param("countyList") List<String> countyList);
    List<RiskMapVO> getCurrentScoreList(@Param("nowQuarter") String nowQuarter,
            @Param("areaCode") String areaCode);
    List<RiskRankingVO> queryRiskRanking(@Param("nowQuarter") String nowQuarter);
    List<RiskMapVO> getScoreByYearType(@Param("areaCode") String areaCode,
            @Param("yearType") Integer yearType);
}
finance-system/src/main/java/com/finance/system/service/AsyncService.java
@@ -17,4 +17,6 @@
    void calculateScoreWithFixedRules(TbBasicData tbBasicData, List<TbBasicDataField> fields,
            List<TbField> fieldList);
    void subtractScoreWithFixedRules(String deptAreaCode) throws Exception;
}
finance-system/src/main/java/com/finance/system/service/ISysUserService.java
@@ -4,6 +4,7 @@
import com.finance.common.basic.PageDTO;
import com.finance.common.core.domain.entity.SysUser;
import com.finance.system.query.SysUserQuery;
import com.finance.system.vo.DeptVO;
import com.finance.system.vo.SysUserVO;
import java.util.List;
@@ -270,4 +271,5 @@
    SysUser selectPlatUserByUserName(String username);
    List<DeptVO> queryDeptListByName(String deptName);
}
finance-system/src/main/java/com/finance/system/service/TbBasicDataConfigService.java
@@ -43,4 +43,6 @@
            BasicDataConfigQuery query);
    List<BasicDataConfigVO> getFixedRulesConfigList();
    List<BasicDataConfigVO> getSubsractRulesConfigList();
}
finance-system/src/main/java/com/finance/system/service/TbBasicDataService.java
@@ -60,4 +60,9 @@
    List<FieldAndScoreDataVO> selectBasicDataFieldsConfig(String areaCode, String nowQuarter);
    void editBasicData(BasicDataUpdDTO dto) throws Exception;
    void exportDataV2(List<String> quarterList) throws IOException;
    List<FieldAndScoreDataVO> getFieldAndScoreData(String areaCode, String nowQuarter,
            Integer yearType);
}
finance-system/src/main/java/com/finance/system/service/TbScoreService.java
@@ -11,6 +11,8 @@
import com.finance.system.query.ScoreCalculateDetailQuery;
import com.finance.system.query.ScoreQuery;
import com.finance.system.vo.DeptCalculateDetailVO;
import com.finance.system.vo.RiskMapVO;
import com.finance.system.vo.RiskRankingVO;
import com.finance.system.vo.ScoreCalculateDetailVO;
import com.finance.system.vo.ScoreRankVO;
import com.finance.system.vo.ScoreVO;
@@ -40,4 +42,10 @@
            String nowQuarter);
    ScoreCalculateDetailVO fieldsDetail(CalculateDetailQuery query, List<SysUser> countyList);
    List<RiskMapVO> getCurrentScoreList(String nowQuarter, String areaCode);
    List<RiskRankingVO> queryRiskRanking(String nowQuarter);
    List<RiskMapVO> getScoreByYearType(String areaCode, Integer yearType);
}
finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java
@@ -1,5 +1,6 @@
package com.finance.system.service.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson2.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -7,20 +8,24 @@
import com.finance.common.enums.BasicDataFieldEnum;
import com.finance.common.enums.CalculateTypeEnum;
import com.finance.common.enums.IndicatorItemEnum;
import com.finance.common.enums.QuestionTypeEnum;
import com.finance.common.enums.ShowStatusEnum;
import com.finance.common.enums.ValueTypeEnum;
import com.finance.common.exception.ServiceException;
import com.finance.common.utils.CalculateUtil;
import com.finance.common.utils.CollUtils;
import com.finance.common.utils.DateUtils;
import com.finance.common.utils.StringUtils;
import com.finance.system.domain.TbBasicData;
import com.finance.system.domain.TbBasicDataConfig;
import com.finance.system.domain.TbBasicDataConfigDetail;
import com.finance.system.domain.TbBasicDataField;
import com.finance.system.domain.TbField;
import com.finance.system.domain.TbQuestion;
import com.finance.system.domain.TbScore;
import com.finance.system.dto.CalculateItemDTO;
import com.finance.system.mapper.TbBasicDataMapper;
import com.finance.system.mapper.TbQuestionMapper;
import com.finance.system.service.AsyncService;
import com.finance.system.service.TbBasicDataCategoryService;
import com.finance.system.service.TbBasicDataConfigDetailService;
@@ -31,6 +36,7 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -56,6 +62,7 @@
    private final TbBasicDataCategoryService tbBasicDataCategoryService;
    private final TbBasicDataConfigDetailService tbBasicDataConfigDetailService;
    private final TbBasicDataMapper tbBasicDataMapper;
    private final TbQuestionMapper tbQuestionMapper;
    @Async
    @Override
@@ -189,123 +196,349 @@
        // 待计算的基础数据字段
        Map<Long, TbBasicDataField> deptFieldsMap = fields.stream()
                .collect(Collectors.toMap(TbBasicDataField::getFieldId, Function.identity()));
        List<TbScore> scoreList = new ArrayList<>();
        List<TbQuestion> list = tbQuestionMapper.selectList(
                Wrappers.lambdaQuery(TbQuestion.class)
                        .eq(TbQuestion::getQuarter, tbBasicData.getQuarter()));
        String deptAreaCode = tbBasicData.getDeptAreaCode();
        List<TbScore> scoreList = tbScoreService.lambdaQuery()
                .eq(TbScore::getBasicDataId, tbBasicData.getId()).list();
        for (BasicDataConfigVO vo : fixedRulesConfigList) {
            double score = 0D;
            BigDecimal deptDividendValue;
            BigDecimal deptDivisorValue;
            BigDecimal provinceDividendValue;
            BigDecimal provinceDivisorValue;
            List<TbQuestion> questionList;
            // 季度末时间
            Date quarterDate = DateUtils.getQuarterDateEnd(tbBasicData.getQuarter());
            BigDecimal month = BigDecimal.valueOf(
                    Double.parseDouble(DateUtil.format(quarterDate, "MM")));
            switch (Objects.requireNonNull(IndicatorItemEnum.getEnumByCode(vo.getId()))) {
                case INDICATOR_ITEM1:
            // 1:财政经济形势-收入占GDP比重-地方一般公共预算收入占GDP的比重;
            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()) {
                    deptDividendValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD2);
                    deptDivisorValue = BigDecimal.valueOf(
                            Double.parseDouble(tbBasicData.getCurrentGdp()));
                    provinceDividendValue = getProvinceBigDecimal(provinceFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD2);
                    provinceDivisorValue = BigDecimal.valueOf(
                            Double.parseDouble(provinceBasicData.getCurrentGdp()));
                    score = getScore(deptDividendValue, deptDivisorValue,
                            provinceDividendValue, provinceDivisorValue, vo);
                    break;
                case INDICATOR_ITEM2:
                // 2:财政经济形势-收入执行率-地方一般公共预算收入执行进度(地方一般公共预算收入/年初预算或调整预算);
                    deptDividendValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD2);
                    deptDivisorValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD1);
            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM3.getCode()) {
                    score = getScore(deptDividendValue, deptDivisorValue, month,
                            BigDecimal.valueOf(12D),
                            vo);
                    break;
                case INDICATOR_ITEM3:
                // 3:财政经济形势-收入执行率-政府性基金预算收入执行进度(政府性基金预算收入/年初预算或调整预算)
            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM4.getCode()) {
                    deptDividendValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD18);
                    deptDivisorValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD17);
                    score = getScore(deptDividendValue, deptDivisorValue, month,
                            BigDecimal.valueOf(12D),
                            vo);
                    break;
                case INDICATOR_ITEM4:
                // 4:财政经济形势-收入质量-税收收入占地方一般公共预算收入比重
                // 获取所需字段
                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);
                    deptDividendValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD3);
                    deptDivisorValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD2);
                    provinceDividendValue = getProvinceBigDecimal(provinceFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD3);
                    provinceDivisorValue = getProvinceBigDecimal(provinceFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD2);
                    score = getScore(deptDividendValue, deptDivisorValue,
                            provinceDividendValue, provinceDivisorValue, vo);
                    break;
                case INDICATOR_ITEM5:
                    // 5: 财政经济形势-重大财税政策落实情况-减税降费落实情况
                    questionList = getQuestList(list, deptAreaCode,
                            QuestionTypeEnum.ENUM0);
                    score = CollUtils.isNotEmpty(questionList) ? -5D : 0D;
                    break;
                case INDICATOR_ITEM6:
                    // 6:财政经济形势-重大财税政策落实情况-其他重大政策落实情况
                    questionList = getQuestList(list, deptAreaCode,
                            QuestionTypeEnum.ENUM1);
                    score = CollUtils.isNotEmpty(questionList) ? questionList.size() * -3D : 0D;
                    break;
                case INDICATOR_ITEM7:
                    // 7:预算管理方面-转移支付-中央转移支付占地方可用财力比重
                    deptDividendValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD7);
                    deptDivisorValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD13);
                    provinceDividendValue = getProvinceBigDecimal(provinceFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD7);
                    provinceDivisorValue = getProvinceBigDecimal(provinceFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD7);
                    score = getScore2(deptDividendValue, deptDivisorValue,
                            provinceDividendValue, provinceDivisorValue, vo);
                    break;
                case INDICATOR_ITEM8:
                    // 8:预算管理方面-“三保”保障情况-“三保”年初预算保障情况
                    BigDecimal aw = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD47);
                    BigDecimal ap = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD40);
                    BigDecimal az = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD50);
                    BigDecimal aq = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD41);
                    BigDecimal bc = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD53);
                    BigDecimal ar = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD42);
                    boolean res = aw.compareTo(ap) < 0 || (az.compareTo(aq) < 0 || (bc.compareTo(ar)
                            < 0));
                    score = res ? 0 : vo.getMaxScore();
                    break;
                case INDICATOR_ITEM9:
                    BigDecimal au = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD45);
                    BigDecimal r = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD13);
                    BigDecimal divided = au.divide(r, 2, RoundingMode.HALF_UP);
                    if (divided.compareTo(BigDecimal.valueOf(0.6D)) > 0) {
                        BigDecimal add = BigDecimal.valueOf(0.6D).subtract(divided)
                                .multiply(BigDecimal.valueOf(100D))
                                .divide(BigDecimal.valueOf(4D), 2, RoundingMode.HALF_UP)
                                .add(BigDecimal.valueOf(8));
                        score = add.compareTo(BigDecimal.ZERO) >= 0 ? add.doubleValue() : 0D;
                    } else {
                        score = vo.getMaxScore();
                }
            } 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()) {
                    break;
                case INDICATOR_ITEM10:
                    // 10:预算管理方面-“三保”保障情况-“三保”支出保障情况
                    questionList = getQuestList(list, deptAreaCode, QuestionTypeEnum.ENUM2);
                    score = CollUtils.isNotEmpty(questionList) ? 0D : vo.getMaxScore();
                    break;
                case INDICATOR_ITEM11:
                    // 11:预算管理方面-强化预算约束-存量资金盘活
                    questionList = getQuestList(list, deptAreaCode,
                            QuestionTypeEnum.ENUM3);
                    score = CollUtils.isNotEmpty(questionList) ? -3D : 0D;
                    break;
                case INDICATOR_ITEM12:
                    // 12:预算管理方面-强化预算约束-不得无预算、超预算拨款
                    questionList = getQuestList(list, deptAreaCode,
                            QuestionTypeEnum.ENUM4);
                    score = CollUtils.isNotEmpty(questionList) ? -3D : 0D;
                    break;
                case INDICATOR_ITEM13:
                    // 13:预算执行方面-库款管理-库款保障水平
                    BigDecimal currentData = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD35);
                    BigDecimal part1;
                    BigDecimal part2;
                    if (currentData.compareTo(BigDecimal.valueOf(0.8D)) < 0) {
                        BigDecimal add = currentData.subtract(BigDecimal.valueOf(0.8D))
                                .divide(BigDecimal.valueOf(0.1D), 2, RoundingMode.HALF_UP)
                                .multiply(BigDecimal.valueOf(0.6D))
                                .add(BigDecimal.valueOf(4D));
                        part1 = add.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : add;
                    } else {
                        part1 = BigDecimal.valueOf(4D);
            }
                    BigDecimal first = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD36);
                    BigDecimal second = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD37);
                    BigDecimal third = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD38);
                    part2 = first.compareTo(BigDecimal.valueOf(0.3D)) < 0
                            || second.compareTo(BigDecimal.valueOf(0.3D)) < 0 || third.compareTo(
                            BigDecimal.valueOf(0.3D)) < 0 ? BigDecimal.ZERO
                            : BigDecimal.valueOf(2D);
                    score = part1.add(part2).doubleValue();
                    break;
                case INDICATOR_ITEM14:
                    // 14:预算执行方面-预算执行情况-一般公共预算支出执行率
                    deptDividendValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD15);
                    deptDivisorValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD14);
                    score = getScoreByMonth(deptDividendValue, deptDivisorValue, month, vo);
                    break;
                case INDICATOR_ITEM15:
                    // 15:预算执行方面-预算执行情况-政府性基金预算支出执行率
                    deptDividendValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD23);
                    deptDivisorValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD22);
                    score = getScoreByMonth(deptDividendValue, deptDivisorValue, month, vo);
                    break;
                case INDICATOR_ITEM16:
                    // 16:预算执行方面-中央直达资金-中央直达资金支付进度
                    deptDividendValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD11);
                    BigDecimal divided1 = month.divide(BigDecimal.valueOf(12D), 2,
                            RoundingMode.HALF_UP);
                    if (deptDividendValue.compareTo(divided1) < 0) {
                        BigDecimal add = deptDividendValue.subtract(divided1)
                                .multiply(BigDecimal.valueOf(100D))
                                .divide(BigDecimal.valueOf(5D), 2,
                                        RoundingMode.HALF_UP)
                                .add(BigDecimal.valueOf(vo.getMaxScore()));
                        score = add.compareTo(BigDecimal.ZERO) < 0 ? 0D : add.doubleValue();
                    } else {
                        score = vo.getMaxScore();
                    }
                    break;
                case INDICATOR_ITEM17:
                    // 17:预算执行方面-中央直达资金-直达资金规范使用
                    questionList = getQuestList(list, deptAreaCode,
                            QuestionTypeEnum.ENUM5);
                    score = CollUtils.isNotEmpty(questionList) ? 0D : vo.getMaxScore();
                    break;
                case INDICATOR_ITEM18:
                    // 18:风险防控方面-暂付款管理-违规新增暂付款
                    deptDividendValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD57);
                    score = deptDividendValue.compareTo(BigDecimal.ZERO) > 0 ? 0D
                            : vo.getMaxScore();
                    break;
                case INDICATOR_ITEM19:
                    // 19:风险防控方面-暂付款管理-暂付款累计余额
                    BigDecimal bk = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD61);
                    BigDecimal t = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD15);
                    BigDecimal ab = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD23);
                    BigDecimal add = t.add(ab.divide(month.multiply(
                                    BigDecimal.valueOf(12D).multiply(BigDecimal.valueOf(0.05D))), 2,
                            RoundingMode.HALF_UP));
                    score = bk.compareTo(add) > 0 ? 0D : vo.getMaxScore();
                    break;
                case INDICATOR_ITEM20:
                    // 20:风险防控方面-暂付款管理-暂付款消化
                    deptDividendValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD59);
                    deptDivisorValue = getBigDecimal(deptFieldsMap,
                            BasicDataFieldEnum.BASIC_DATA_FIELD58);
                    BigDecimal d1 = deptDividendValue.divide(deptDivisorValue, 2,
                            RoundingMode.HALF_UP);
                    BigDecimal d2 = month.divide(BigDecimal.valueOf(12D), 2,
                            RoundingMode.HALF_UP);
                    score = d1.compareTo(d2) < 0 ? d1.divide(d2, 2, RoundingMode.HALF_UP)
                            .multiply(BigDecimal.valueOf(vo.getMaxScore())).doubleValue()
                            : vo.getMaxScore();
                    break;
                case INDICATOR_ITEM21:
                    // 21:风险防控方面-债务管理-法定债务率
                    score = getTextFieldScore(deptFieldsMap, BasicDataFieldEnum.BASIC_DATA_FIELD74,
                            vo);
                    break;
                case INDICATOR_ITEM22:
                    // 22:风险防控方面-债务管理-隐性债务率
                    score = getTextFieldScore(deptFieldsMap, BasicDataFieldEnum.BASIC_DATA_FIELD76,
                            vo);
                    break;
                case INDICATOR_ITEM23:
                    // 23:风险防控方面-债务管理-隐性债务化解
                    questionList = getQuestList(list, deptAreaCode,
                            QuestionTypeEnum.ENUM6);
                    score = CollUtils.isNotEmpty(questionList) ? vo.getMaxScore() : -3D;
                    break;
                case INDICATOR_ITEM24:
                    // 24:风险防控方面-债务管理-日常监督发现问题
                    questionList = getQuestList(list, deptAreaCode,
                            QuestionTypeEnum.ENUM7);
                    if (CollUtils.isNotEmpty(questionList)) {
                        score = -18D + questionList.size() * -1D;
                    }
                    break;
                case INDICATOR_ITEM25:
                    // 25:风险防控方面-日常监督发现问题
                    questionList = getQuestList(list, deptAreaCode,
                            QuestionTypeEnum.ENUM8);
                    if (CollUtils.isNotEmpty(questionList)) {
                        score = questionList.size() * -1D;
                    }
                    break;
                default:
                    // Handle default case if needed
                    break;
            }
            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((double) score);
                tbScore.setScore(score);
            tbScore.setBasicDataId(tbBasicData.getId());
            tbScore.setBasicDataConfigId(vo.getId());
            scoreList.add(tbScore);
        }
    }
        if (CollUtils.isNotEmpty(scoreList)) {
            tbScoreService.saveOrUpdateBatch(scoreList);
        }
    }
    private static List<TbQuestion> getQuestList(List<TbQuestion> list, String deptAreaCode,
            QuestionTypeEnum type) {
        return list.stream()
                .filter(q -> q.getDeptAreaCode().equals(deptAreaCode) && q.getType()
                        .equals(type))
                .collect(Collectors.toList());
    }
    private BigDecimal getProvinceBigDecimal(Map<Long, TbBasicDataField> provinceFieldsMap,
            BasicDataFieldEnum key) {
        TbBasicDataField tbBasicDataField = provinceFieldsMap.get(key.getCode());
        if (Objects.isNull(tbBasicDataField)) {
            throw new ServiceException(
                    String.format("四川省的字段【%s】的数据缺失,请修改后再试", key.getDesc()));
        }
        return BigDecimal.valueOf(Double.parseDouble(tbBasicDataField.getFieldValue()));
    }
    private BigDecimal getBigDecimal(Map<Long, TbBasicDataField> deptFieldsMap,
            BasicDataFieldEnum key) {
        TbBasicDataField tbBasicDataField = deptFieldsMap.get(key.getCode());
        if (Objects.isNull(tbBasicDataField) || StringUtils.isBlank(
                tbBasicDataField.getFieldValue())) {
            throw new ServiceException(
                    String.format("字段【%s】的数据缺失,请修改后再试", key.getDesc()));
        }
        return BigDecimal.valueOf(
                Double.parseDouble(tbBasicDataField.getFieldValue().replace(",", "")));
    }
    /**
     * 通用计算公式获取得分
     *
     * @param deptDividendValueStr     部门被除数字段值
     * @param deptDivisorValueStr      部门除数字段值
     * @param provinceDividendValueStr 省份被除数字段值
     * @param provinceDivisorValueStr  省份除数字段值
     * @param deptDividendValue     部门被除数
     * @param deptDivisorValue      部门除数
     * @param provinceDividendValue 省份被除数
     * @param provinceDivisorValue  省份除数
     * @param vo                       基础数据配置
     * @return 得分
     */
    private Double getScore(String deptDividendValueStr, String deptDivisorValueStr,
            String provinceDividendValueStr, String provinceDivisorValueStr, BasicDataConfigVO vo) {
    private Double getScore(BigDecimal deptDividendValue, BigDecimal deptDivisorValue,
            BigDecimal provinceDividendValue, BigDecimal provinceDivisorValue,
            BasicDataConfigVO vo) {
        BigDecimal score = BigDecimal.ZERO;
        BigDecimal provinceDividendValue = BigDecimal.valueOf(
                Long.parseLong(provinceDividendValueStr));
        BigDecimal provinceDivisorValue = BigDecimal.valueOf(
                Long.parseLong(provinceDivisorValueStr));
        BigDecimal deptDividendValue = BigDecimal.valueOf(
                Long.parseLong(deptDividendValueStr));
        BigDecimal deptDivisorValue = BigDecimal.valueOf(
                Long.parseLong(deptDivisorValueStr));
        // 开始计算
        BigDecimal deptDivided = BigDecimal.ZERO;
@@ -325,6 +558,34 @@
            score = score.compareTo(BigDecimal.ZERO) >= 0 ? score : BigDecimal.ZERO;
        } else {
            score = BigDecimal.valueOf(vo.getMaxScore());
        }
        return score.doubleValue();
    }
    private Double getScore2(BigDecimal deptDividendValue, BigDecimal deptDivisorValue,
            BigDecimal provinceDividendValue, BigDecimal provinceDivisorValue,
            BasicDataConfigVO vo) {
        BigDecimal score = BigDecimal.ZERO;
        // 开始计算
        BigDecimal deptDivided = BigDecimal.ZERO;
        if (deptDivisorValue.compareTo(BigDecimal.ZERO) > 0) {
            deptDivided = deptDividendValue.divide(deptDivisorValue, 2, RoundingMode.HALF_UP);
        }
        BigDecimal provinceDivided = BigDecimal.ZERO;
        if (provinceDivisorValue.compareTo(BigDecimal.ZERO) > 0) {
            provinceDivided = provinceDividendValue.divide(provinceDivisorValue, 2,
                    RoundingMode.HALF_UP);
        }
        if (deptDivided.compareTo(provinceDivided) < 0) {
            score = BigDecimal.valueOf(vo.getMaxScore());
        } else {
            score = deptDivided.subtract(provinceDivided)
                    .multiply(BigDecimal.valueOf(100L))
                    .add(BigDecimal.valueOf(vo.getMaxScore()));
            score = score.compareTo(BigDecimal.ZERO) >= 0 ? score : BigDecimal.ZERO;
        }
        return score.doubleValue();
    }
@@ -391,4 +652,130 @@
        }
        return field;
    }
    private Double getScoreByMonth(BigDecimal deptDividendValue, BigDecimal deptDivisorValue,
            BigDecimal currentMonth, BasicDataConfigVO vo) {
        double score;
        BigDecimal divided1 = deptDividendValue.divide(deptDivisorValue, 2,
                RoundingMode.HALF_UP);
        BigDecimal divided2 = currentMonth.divide(BigDecimal.valueOf(12D), 2,
                RoundingMode.HALF_UP);
        if (divided1.compareTo(
                currentMonth.divide(BigDecimal.valueOf(12D), 2, RoundingMode.HALF_UP))
                < 0) {
            BigDecimal add = divided1.subtract(divided2)
                    .multiply(BigDecimal.valueOf(100D))
                    .divide(BigDecimal.valueOf(5D), 2,
                            RoundingMode.HALF_UP)
                    .add(BigDecimal.valueOf(vo.getMaxScore()));
            score = add.compareTo(BigDecimal.ZERO) < 0 ? 0D : add.doubleValue();
        } else {
            score = vo.getMaxScore();
        }
        return score;
    }
    private Double getTextFieldScore(Map<Long, TbBasicDataField> deptFieldsMap,
            BasicDataFieldEnum key,
            BasicDataConfigVO vo) {
        double score = 0D;
        TbBasicDataField tbBasicDataField = deptFieldsMap.get(
                key.getCode());
        if (Objects.isNull(tbBasicDataField) || StringUtils.isBlank(
                tbBasicDataField.getFieldValue())) {
            throw new ServiceException(String.format("字段【%s】的数据缺失,请修改后再试",
                    key.getDesc()));
        }
        score = tbBasicDataField.getFieldValue().equals("绿") ? vo.getMaxScore()
                : tbBasicDataField.getFieldValue().equals("黄") ? 6D
                        : tbBasicDataField.getFieldValue().equals("橙") ? 3D : 0D;
        return score;
    }
    @Override
    public void subtractScoreWithFixedRules(String deptAreaCode) throws Exception {
        String nowQuarter = DateUtils.getNowQuarter();
        TbBasicData tbBasicData = tbBasicDataMapper.selectOne(
                Wrappers.lambdaQuery(TbBasicData.class).eq(TbBasicData::getQuarter, nowQuarter)
                        .eq(TbBasicData::getDeptAreaCode, deptAreaCode));
        if (Objects.isNull(tbBasicData)) {
            return;
        }
        List<TbScore> scoreList = tbScoreService.lambdaQuery()
                .eq(TbScore::getBasicDataId, tbBasicData.getId()).list();
        List<BasicDataConfigVO> fixedRulesConfigList = tbBasicDataConfigService.getSubsractRulesConfigList();
        List<TbQuestion> list = tbQuestionMapper.selectList(
                Wrappers.lambdaQuery(TbQuestion.class)
                        .eq(TbQuestion::getQuarter, nowQuarter)
                        .eq(TbQuestion::getDeptAreaCode, deptAreaCode));
        List<TbQuestion> questionList;
        for (BasicDataConfigVO vo : fixedRulesConfigList) {
            double score = 0D;
            switch (Objects.requireNonNull(IndicatorItemEnum.getEnumByCode(vo.getId()))) {
                case INDICATOR_ITEM5:
                    // 5: 财政经济形势-重大财税政策落实情况-减税降费落实情况
                    questionList = getQuestList(list, deptAreaCode,
                            QuestionTypeEnum.ENUM0);
                    score = CollUtils.isNotEmpty(questionList) ? -5D : 0D;
                    break;
                case INDICATOR_ITEM6:
                    // 6:财政经济形势-重大财税政策落实情况-其他重大政策落实情况
                    questionList = getQuestList(list, deptAreaCode,
                            QuestionTypeEnum.ENUM1);
                    score = CollUtils.isNotEmpty(questionList) ? questionList.size() * -3D : 0D;
                    break;
                case INDICATOR_ITEM11:
                    // 11:预算管理方面-强化预算约束-存量资金盘活
                    questionList = getQuestList(list, deptAreaCode,
                            QuestionTypeEnum.ENUM3);
                    score = CollUtils.isNotEmpty(questionList) ? -3D : 0D;
                    break;
                case INDICATOR_ITEM12:
                    // 12:预算管理方面-强化预算约束-不得无预算、超预算拨款
                    questionList = getQuestList(list, deptAreaCode,
                            QuestionTypeEnum.ENUM4);
                    score = CollUtils.isNotEmpty(questionList) ? -3D : 0D;
                    break;
                case INDICATOR_ITEM23:
                    // 23:风险防控方面-债务管理-隐性债务化解
                    questionList = getQuestList(list, deptAreaCode,
                            QuestionTypeEnum.ENUM6);
                    score = CollUtils.isNotEmpty(questionList) ? vo.getMaxScore() : -3D;
                    break;
                case INDICATOR_ITEM24:
                    // 24:风险防控方面-债务管理-日常监督发现问题
                    questionList = getQuestList(list, deptAreaCode,
                            QuestionTypeEnum.ENUM7);
                    if (CollUtils.isNotEmpty(questionList)) {
                        score = -18D + questionList.size() * -1D;
                    }
                case INDICATOR_ITEM25:
                    // 25:风险防控方面-日常监督发现问题
                    questionList = getQuestList(list, deptAreaCode,
                            QuestionTypeEnum.ENUM8);
                    if (CollUtils.isNotEmpty(questionList)) {
                        score = questionList.size() * -1D;
                    }
                    break;
            }
            Optional<TbScore> scoreOpt = scoreList.stream()
                    .filter(s -> s.getBasicDataConfigId().equals(vo.getId()))
                    .findFirst();
            if (scoreOpt.isPresent()) {
                TbScore tbScore = scoreOpt.get();
                tbScore.setScore(score);
            } else {
                TbScore tbScore = new TbScore();
                tbScore.setScore(score);
                tbScore.setBasicDataId(tbBasicData.getId());
                tbScore.setBasicDataConfigId(vo.getId());
                scoreList.add(tbScore);
            }
        }
        if (CollUtils.isNotEmpty(scoreList)) {
            tbScoreService.saveOrUpdateBatch(scoreList);
        }
    }
}
finance-system/src/main/java/com/finance/system/service/impl/SysUserServiceImpl.java
@@ -7,7 +7,9 @@
import com.finance.common.constant.UserConstants;
import com.finance.common.core.domain.entity.SysRole;
import com.finance.common.core.domain.entity.SysUser;
import com.finance.common.enums.UserTypeEnum;
import com.finance.common.exception.ServiceException;
import com.finance.common.utils.BeanUtils;
import com.finance.common.utils.SecurityUtils;
import com.finance.common.utils.StringUtils;
import com.finance.common.utils.bean.BeanValidators;
@@ -23,6 +25,7 @@
import com.finance.system.query.SysUserQuery;
import com.finance.system.service.ISysConfigService;
import com.finance.system.service.ISysUserService;
import com.finance.system.vo.DeptVO;
import com.finance.system.vo.SysUserVO;
import java.util.ArrayList;
import java.util.List;
@@ -612,4 +615,14 @@
        return userMapper.selectPlatUserByUserName(userName);
    }
    @Override
    public List<DeptVO> queryDeptListByName(String deptName) {
        List<SysUser> list = this.lambdaQuery()
                .eq(SysUser::getUserType, UserTypeEnum.DEPARTMENT.getCode())
                .like(StringUtils.isNotBlank(deptName), SysUser::getAreaName,
                        deptName)
                .orderByDesc(SysUser::getCreateTime)
                .list();
        return BeanUtils.copyList(list, DeptVO.class);
    }
}
finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataConfigServiceImpl.java
@@ -266,25 +266,59 @@
    @Override
    public List<BasicDataConfigVO> getFixedRulesConfigList() {
        List<TbBasicDataConfig> configList = this.lambdaQuery()
                .le(TbBasicDataConfig::getId, 24).list();
                .le(TbBasicDataConfig::getId, 25).list();
        Map<Long, TbBasicDataCategory> configCategoryMap = tbBasicDataCategoryService.list()
                .stream()
                .collect(Collectors.toMap(TbBasicDataCategory::getId,
                        Function.identity()));
        List<BasicDataConfigVO> configVOList = BeanUtils.copyList(configList,
                BasicDataConfigVO.class);
        configVOList = configVOList.stream().map(c -> {
        configVOList = configVOList.stream().peek(c -> {
            TbBasicDataCategory tbBasicDataCategory2 = configCategoryMap.get(
                    c.getBasicDataCategoryId());
            if (Objects.nonNull(tbBasicDataCategory2)) {
                if (tbBasicDataCategory2.getParentId() == -1) {
                    c.setBasicDataCategoryOne(tbBasicDataCategory2.getBasicDataCategoryName());
                } else {
                c.setBasicDataCategory(tbBasicDataCategory2.getBasicDataCategoryName());
                TbBasicDataCategory tbBasicDataCategory1 = configCategoryMap.get(
                        tbBasicDataCategory2.getParentId());
                if (Objects.nonNull(tbBasicDataCategory1)) {
                    c.setBasicDataCategoryOne(tbBasicDataCategory1.getBasicDataCategoryName());
                        c.setBasicDataCategoryOne(
                                tbBasicDataCategory1.getBasicDataCategoryName());
                }
            }
            return c;
            }
        }).collect(Collectors.toList());
        return configVOList;
    }
    @Override
    public List<BasicDataConfigVO> getSubsractRulesConfigList() {
        List<TbBasicDataConfig> configList = this.lambdaQuery()
                .in(TbBasicDataConfig::getId, 5, 6, 11, 12, 23, 24, 25).list();
        Map<Long, TbBasicDataCategory> configCategoryMap = tbBasicDataCategoryService.list()
                .stream()
                .collect(Collectors.toMap(TbBasicDataCategory::getId,
                        Function.identity()));
        List<BasicDataConfigVO> configVOList = BeanUtils.copyList(configList,
                BasicDataConfigVO.class);
        configVOList = configVOList.stream().peek(c -> {
            TbBasicDataCategory tbBasicDataCategory2 = configCategoryMap.get(
                    c.getBasicDataCategoryId());
            if (Objects.nonNull(tbBasicDataCategory2)) {
                if (tbBasicDataCategory2.getParentId() == -1) {
                    c.setBasicDataCategoryOne(tbBasicDataCategory2.getBasicDataCategoryName());
                } else {
                    c.setBasicDataCategory(tbBasicDataCategory2.getBasicDataCategoryName());
                    TbBasicDataCategory tbBasicDataCategory1 = configCategoryMap.get(
                            tbBasicDataCategory2.getParentId());
                    if (Objects.nonNull(tbBasicDataCategory1)) {
                        c.setBasicDataCategoryOne(
                                tbBasicDataCategory1.getBasicDataCategoryName());
                    }
                }
            }
        }).collect(Collectors.toList());
        return configVOList;
    }
finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataServiceImpl.java
@@ -50,6 +50,7 @@
import com.finance.system.query.ScoreQuery;
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;
@@ -60,6 +61,7 @@
import com.finance.system.service.TbOperLogService;
import com.finance.system.service.TbScoreService;
import com.finance.system.utils.FieldBuildUtil;
import com.finance.system.vo.BasicDataConfigVO;
import com.finance.system.vo.BasicDataReportingVO;
import com.finance.system.vo.CurrentFieldsAllVO;
import com.finance.system.vo.CurrentFieldsDetailVO;
@@ -80,6 +82,7 @@
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
@@ -116,6 +119,7 @@
    private final TbDataScreenScoreService tbDataScreenScoreService;
    private final TbDataScreenConfigService tbDataScreenConfigService;
    private final AsyncService asyncService;
    private final TbBasicDataCategoryService tbBasicDataCategoryService;
    public static void setFieldValues(
            List<FieldsTreeVO> fields, Map<Long, TbBasicDataField> fieldMap) {
@@ -162,6 +166,10 @@
                        Wrappers.<TbBasicData>lambdaQuery()
                                .eq(TbBasicData::getDeptAreaCode, dept.getAreaCode())
                                .between(TbBasicData::getReportingTime, quarterStart, quarterEnd));
        if (Objects.nonNull(basicData)) {
            vo.setCreateTime(basicData.getCreateTime());
            vo.setUpdateTime(basicData.getUpdateTime());
        }
        // 查询需要填写的字段
        List<TbField> list =
                tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
@@ -231,6 +239,8 @@
        if (basicDataOpt.isPresent()) {
            tbBasicData.setId(basicDataOpt.get().getId());
            tbBasicData.setDeptAreaCode(areaCode);
            tbBasicData.setQuarter(basicDataOpt.get().getQuarter());
            tbBasicData.setUpdateTime(new Date());
            this.updateById(tbBasicData);
            // 查询该基础数据的动态字端
            List<TbBasicDataField> originFields = tbBasicDataFieldService.lambdaQuery()
@@ -321,12 +331,13 @@
            tbBasicData.setStatus(ReportingStatusEnum.FILLED);
            this.updateById(tbBasicData);
        }
        if (ReportingStatusEnum.FILLED.equals(tbBasicData.getStatus())) {
        /*if (ReportingStatusEnum.FILLED.equals(tbBasicData.getStatus())) {
            CompletableFuture.runAsync(() -> {
                calculateScore(tbBasicData, tbBasicDataFields);
                calculateScreenScore(tbBasicData, tbBasicDataFields);
            });
        }
        }*/
        asyncService.calculateScoreWithFixedRules(tbBasicData, tbBasicDataFields, fieldList);
    }
    private void calculateScreenScore(TbBasicData tbBasicData,
@@ -565,7 +576,7 @@
                        }
                        if (CalculateTypeEnum.PERCENTAGE.equals(
                                textAndPercentage.getCalculateType())) {
                            for (Map.Entry<String, String> stringStringEntry : scoreMap.entrySet()) {
                            for (Entry<String, String> stringStringEntry : scoreMap.entrySet()) {
                                String[] split = stringStringEntry.getKey().split("_");
                                double v = Double.parseDouble(
                                        textAndPercentageData.getFieldValue());
@@ -630,7 +641,7 @@
                            vo.setPhoneNumber(item.getPhoneNumber());
                            vo.setPersonInCharge(item.getPersonInCharge());
                        });
        // 查询动态字段
       /* // 查询动态字段
        List<TbBasicDataField> basicDataFields =
                tbBasicDataFieldService
                        .lambdaQuery()
@@ -687,7 +698,44 @@
                            fieldsTreeVO.setCategory(Boolean.FALSE);
                            root.add(fieldsTreeVO);
                        });
        vo.setFields(root);
        vo.setFields(root);*/
        // 查询需要填写的字段
        List<TbField> list =
                tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
        List<FieldsTreeVO> roots = new ArrayList<>();
        FieldsTreeVO fieldsTreeVO = new FieldsTreeVO();
        fieldsTreeVO.setId(-1L);
        fieldsTreeVO.setName("转移支付规模");
        fieldsTreeVO.setCategory(Boolean.FALSE);
        FieldsTreeVO fieldsTreeVO2 = new FieldsTreeVO();
        fieldsTreeVO2.setId(-2L);
        fieldsTreeVO2.setName("当期GDP");
        fieldsTreeVO2.setCategory(Boolean.FALSE);
        roots.add(fieldsTreeVO);
        roots.add(fieldsTreeVO2);
        if (CollUtils.isNotEmpty(list)) {
            FieldBuildUtil.buildTreeFromTbFieldList(list, roots);
            FieldsTreeVO remark = new FieldsTreeVO();
            remark.setId(-3L);
            remark.setName("备注");
            roots.add(remark);
            vo.setFields(roots);
        }
        vo.setStatus(basicData.getStatus());
        // 查询已填报数据 包含数据缺失和已填报
        List<TbBasicDataField> basicDataFields =
                tbBasicDataFieldService
                        .lambdaQuery()
                        .eq(TbBasicDataField::getBasicDataId, basicData.getId())
                        .list();
        if (CollUtils.isNotEmpty(basicDataFields)) {
            Map<Long, TbBasicDataField> fieldMap =
                    basicDataFields.stream()
                            .collect(Collectors.toMap(TbBasicDataField::getFieldId,
                                    Function.identity()));
            setFieldValues(vo.getFields(), fieldMap);
        }
        return R.ok(vo);
    }
@@ -1082,6 +1130,9 @@
        String nowQuarter = DateUtils.getNowQuarter();
        this.updateById(basicData);
        // 查询该基础数据的动态字端
        // 查询需要填写的动态字段
        List<TbField> fieldList =
                tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
        List<TbBasicDataField> originFields = tbBasicDataFieldService.lambdaQuery()
                .eq(TbBasicDataField::getBasicDataId, basicData.getId()).list();
        Set<Long> fieldIdList = originFields.stream().map(TbBasicDataField::getFieldId)
@@ -1097,9 +1148,10 @@
        // 保存基础数据动态字段数据
        List<TbBasicDataField> tbBasicDataFields =
                BeanUtils.copyList(dto.getFields(), TbBasicDataField.class);
        for (TbBasicDataField item : tbBasicDataFields) {
        tbBasicDataFields = tbBasicDataFields.stream().filter(f -> Objects.nonNull(f.getFieldId()))
                .peek(item -> {
            TbField tbField = fieldMap.get(item.getFieldId());
                    if (Objects.nonNull(tbField)) {
            Integer numMax = tbField.getNumMax();
            Integer numMin = tbField.getNumMin();
            Integer textMaxNum = tbField.getTextMaxNum();
@@ -1109,30 +1161,32 @@
                double fieldValue = Double.parseDouble(item.getFieldValue());
                if (fieldValue < numMin || fieldValue > numMax) {
                    throw new ServiceException(
                            String.format("字段%s的值不在范围%d-%d内", tbField.getFieldName(),
                                        String.format("字段%s的值不在范围%d-%d内",
                                                tbField.getFieldName(),
                                    numMin, numMax));
                }
            }
            if (FieldTypeEnum.TEXT.equals(tbField.getFieldType())
                    && FieldInputTypeEnum.MANUAL_INPUT.equals(tbField.getTextInputType())
                                && FieldInputTypeEnum.MANUAL_INPUT.equals(
                                tbField.getTextInputType())
                    && Objects.nonNull(
                    textMaxNum) && Objects.nonNull(textMinNum)) {
                String fieldValue = item.getFieldValue();
                if (fieldValue.length() < numMin || fieldValue.length() > numMax) {
                    throw new ServiceException(
                            String.format("字段%s的值的长度不在范围%d-%d内", tbField.getFieldName(),
                                        String.format("字段%s的值的长度不在范围%d-%d内",
                                                tbField.getFieldName(),
                                    textMinNum, textMaxNum));
                }
            }
        }
        tbBasicDataFields.forEach(
                item -> {
                    item.setBasicDataId(tbBasicData.getId());
                    TbField tbField = fieldMap.get(item.getFieldId());
                    if (Objects.nonNull(tbField)) {
                        item.setFieldName(tbField.getFieldName());
                        if (StringUtils.isNotBlank(item.getFieldValue())) {
                            item.setFieldValue(item.getFieldValue().replace(",", ""));
                    }
                });
                    }
                }).collect(Collectors.toList());
        // 添加固定字段 转移支付规模、当期GDP
        TbBasicDataField transferPaymentScale = new TbBasicDataField();
        transferPaymentScale.setBasicDataId(tbBasicData.getId());
@@ -1153,12 +1207,182 @@
        tbBasicDataFieldService.remove(
                Wrappers.<TbBasicDataField>lambdaQuery()
                        .eq(TbBasicDataField::getBasicDataId, tbBasicData.getId()));
        Optional<TbBasicDataField> any = tbBasicDataFields.stream()
                .filter(t -> StringUtils.isBlank(t.getFieldValue())).findAny();
        if (!any.isPresent()) {
            tbBasicData.setStatus(ReportingStatusEnum.FILLED);
            this.updateById(tbBasicData);
        }
        tbBasicDataFieldService.saveBatch(tbBasicDataFields);
        if (ReportingStatusEnum.FILLED.equals(tbBasicData.getStatus())) {
        /*if (ReportingStatusEnum.FILLED.equals(tbBasicData.getStatus())) {
            CompletableFuture.runAsync(() -> {
                calculateScore(tbBasicData, tbBasicDataFields);
                calculateScreenScore(tbBasicData, tbBasicDataFields);
            });
        }*/
        asyncService.calculateScoreWithFixedRules(tbBasicData, tbBasicDataFields, fieldList);
        }
    @Override
    public void exportDataV2(List<String> quarterList) throws IOException {
        {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            String fileName = "财政运行分析指标评价表";
            response.setHeader(
                    "Content-disposition",
                    "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
            List<TbBasicData> tbBasicDataList = this.lambdaQuery()
                    .in(TbBasicData::getQuarter, quarterList)
                    .groupBy(TbBasicData::getQuarter).list();
            // 符合导出条件的基础数据
            List<TbBasicData> tbBasicDataListAll = this.lambdaQuery()
                    .in(TbBasicData::getQuarter, quarterList)
                    .list();
            Set<Long> basicDataSet = tbBasicDataListAll.stream().map(TbBasicData::getId)
                    .collect(Collectors.toSet());
            List<TbScore> scoreList = null;
            if (CollUtils.isNotEmpty(basicDataSet)) {
                // 符合导出条件的得分
                scoreList = tbScoreService.lambdaQuery()
                        .in(TbScore::getBasicDataId, basicDataSet)
                        .list();
            }
            List<BasicDataConfigVO> configVOList = tbBasicDataConfigService.getFixedRulesConfigList();
            // 基础数据id列表
            Set<Long> basicDataIdList = tbBasicDataList.stream().map(TbBasicData::getId)
                    .collect(Collectors.toSet());
            // 涉及到的部门编码
            Set<String> userAreaCodeList = tbBasicDataList.stream()
                    .map(TbBasicData::getDeptAreaCode)
                    .collect(Collectors.toSet());
            // 用户信息map
            Map<String, SysUser> userMap = sysUserService.lambdaQuery()
                    .in(SysUser::getAreaCode, userAreaCodeList).list().stream()
                    .collect(Collectors.toMap(SysUser::getAreaCode, e -> e));
            // 构建Excel写对象
            try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
                    .registerWriteHandler(new CustomCellWriteHandler())
                    .registerWriteHandler(EasyExcelUtil.getStyleStrategy()).build()) {
                WriteSheet writeSheet;
                // 遍历季度基础数据
                for (String quarter : quarterList) {
                    List<TbBasicData> currentBasicData = tbBasicDataListAll.stream()
                            .filter(d -> d.getQuarter().equals(quarter)).collect(
                                    Collectors.toList());
                    Set<Long> cbdIdSet = currentBasicData.stream().map(TbBasicData::getId)
                            .collect(Collectors.toSet());
                    // 表头
                    List<List<String>> head = headV2(configVOList);
                    if (CollUtils.isNotEmpty(scoreList)) {
                        List<List<Object>> dataList = dataListV2(scoreList, currentBasicData,
                                userMap, head);
                        // 构建sheet对象
                        writeSheet = EasyExcel.writerSheet(quarter).head(head).build();
                        // 写出sheet数据
                        excelWriter.write(dataList, writeSheet);
                    }
                }
            }
        }
    }
    private List<List<String>> headV2(List<BasicDataConfigVO> configVOList) {
        List<List<String>> headTitles = Lists.newArrayList();
        // 固定字段
        headTitles.add(Lists.newArrayList("财政运行分析指标评价表", "财政运行分析指标评价表",
                "财政运行分析指标评价表", "财政运行分析指标评价表", "财政运行分析指标评价表",
                "财政运行分析指标评价表", "财政运行分析指标评价表", "财政运行分析指标评价表",
                "财政运行分析指标评价表", "财政运行分析指标评价表", "财政运行分析指标评价表",
                "财政运行分析指标评价表", "财政运行分析指标评价表", "财政运行分析指标评价表",
                "财政运行分析指标评价表", "财政运行分析指标评价表", "财政运行分析指标评价表",
                "财政运行分析指标评价表", "财政运行分析指标评价表", "财政运行分析指标评价表",
                "财政运行分析指标评价表", "财政运行分析指标评价表", "财政运行分析指标评价表",
                "财政运行分析指标评价表", "财政运行分析指标评价表"));
        headTitles.add(Lists.newArrayList("地区"));
        headTitles.add(Lists.newArrayList("级次"));
        headTitles.add(Lists.newArrayList("得分合计"));
        headTitles.add(Lists.newArrayList("一级指标", "财政经济形式",
                "预算管理方面", "预算执行方面", "风险防控方面"));
        headTitles.add(
                Lists.newArrayList("分值", "27", "重大财税政策落实情况",
                        "26", "20", "27"));
        headTitles.add(Lists.newArrayList("二级指标", "收入占GDP比重",
                "收入执行率", "收入质量", "重大财税落实情况", "重大财税政策落实情况", "转移支付",
                "\"三保\"保障情况", "强化预算约束", "库款管理", "预算执行情况", "中央直达资金",
                "暂付款管理", "债务管理", "日常监督发现问题"));
        headTitles.add(Lists.newArrayList("分值", "8", "11", "8", "--", "重大财税政策落实情况", "9",
                "17", "--", "6", "8", "6", "9", "18", "日常监督发现问题"));
        headTitles.add(
                Lists.newArrayList("三级指标", "地方一般公共预算收入占GDP的比重",
                        "地方一般公共预算收入执行进度(地方一般公共预算收入/年初预算或调整预算)",
                        "政府性基金预算收入执行进度(政府性基金预算收入/年初预算或调整预算)",
                        "税收收入占地方一般公共预算收入比重", "减税降费落实情况",
                        "其他重大政策落实情况", "中央转移支付占地方可用财力比重",
                        "“三保”年初预算保障情况", "“三保”需求占可用财力的比重",
                        "“三保”支出保障情况", "存量资金盘活", "不得无预算、超预算拨款",
                        "库款保障水平", "一般公共预算支出执行率", "政府性基金预算支出执行率",
                        "中央直达资金支付进度", "直达资金规范使用", "违规新增暂付款",
                        "暂付款累计余额", "暂付款消化", "法定债务率", "隐性债务率", "隐性债务化解",
                        "日常监督发现问题", "日常监督发现问题"));
        headTitles.add(
                Lists.newArrayList("分值", "8", "7", "4", "8", "--", "--", "9", "6", "8", "3", "——",
                        "--", "6", "5", "3", "3", "3", "3", "3", "3", "9", "9", "--", "--", "--"));
        return headTitles;
    }
    private List<List<Object>> dataListV2(List<TbScore> scoreList,
            List<TbBasicData> list,
            Map<String, SysUser> userMap,
            List<List<String>> head) {
        // 所有数据集合
        List<List<Object>> excellist = new ArrayList<>();
        // 构建栏号行
        List<Object> columnNo = Lists.newArrayList("栏号");
        for (int i = 1; i < head.size(); i++) {
            columnNo.add(String.valueOf(i));
        }
        excellist.add(columnNo);
        // 动态字段数据行
        for (TbBasicData tbBasicData : list) {
            // 转换为map,方便遍历的时候取
         /*   Map<Long, TbBasicDataField> basicDataFieldMap = tbBasicDataFieldList.stream()
                    .filter(item -> tbBasicData.getId().equals(item.getBasicDataId()))
                    .collect(Collectors.toMap(TbBasicDataField::getFieldId, e -> e));
            SysUser sysUser = userMap.get(tbBasicData.getDeptAreaCode());
            if (CollUtils.isEmpty(basicDataFieldMap) || Objects.isNull(sysUser)) {
                continue;
            }*/
           /* List<Object> valueList = Lists.newArrayList(sysUser.getAreaName(),
                    tbBasicData.getQuarter());
            TbBasicDataField transferPaymentScale = basicDataFieldMap.get(-1L);
            valueList.add(
                    Objects.nonNull(transferPaymentScale)
                            ? transferPaymentScale.getFieldValue()
                            : "");
            TbBasicDataField currentGdp = basicDataFieldMap.get(-2L);
            valueList.add(
                    Objects.nonNull(currentGdp)
                            ? currentGdp.getFieldValue()
                            : "");
            for (TbField tbField : fieldList) {
                TbBasicDataField tbBasicDataField = basicDataFieldMap.get(tbField.getId());
                valueList.add(
                        Objects.nonNull(tbBasicDataField)
                                ? tbBasicDataField.getFieldValue()
                                : "");
            }
            excellist.add(valueList);
            valueList.add(tbBasicData.getRemark());*/
        }
        return excellist;
    }
    @Override
    public List<FieldAndScoreDataVO> getFieldAndScoreData(String areaCode, String nowQuarter,
            Integer yearType) {
        return baseMapper.getFieldAndScoreData(areaCode, nowQuarter, yearType);
    }
}
finance-system/src/main/java/com/finance/system/service/impl/TbDataScreenConfigServiceImpl.java
@@ -69,14 +69,14 @@
                .oneOpt().orElseGet(() -> BeanUtils.copyBean(dto,
                        TbDataScreenConfig.class));
        List<CalculateItemDTO> calculateItemList = dto.getCalculateItemList();
        validateCalculateItemList(calculateItemList);
        // validateCalculateItemList(calculateItemList);
        String numberCalculateFormulaJsonStr = JSON.toJSONString(calculateItemList);
        tbDataScreenConfig.setCalculateFormula(numberCalculateFormulaJsonStr);
        // tbDataScreenConfig.setCalculateFormula(numberCalculateFormulaJsonStr);
        tbDataScreenConfig.setType(DataScreenConfigEnum.RISK_LEVEL);
        this.saveOrUpdate(tbDataScreenConfig);
        DataScreenConfigVO dataScreenConfigVO = BeanUtils.copyBean(tbDataScreenConfig,
                DataScreenConfigVO.class);
        dataScreenConfigVO.setRateCalculateList(calculateItemList);
        // dataScreenConfigVO.setRateCalculateList(calculateItemList);
        return dataScreenConfigVO;
    }
finance-system/src/main/java/com/finance/system/service/impl/TbDeptServiceImpl.java
finance-system/src/main/java/com/finance/system/service/impl/TbQuestionServiceImpl.java
@@ -1,9 +1,12 @@
package com.finance.system.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.finance.common.basic.PageDTO;
import com.finance.common.core.domain.entity.SysUser;
import com.finance.common.utils.BeanUtils;
import com.finance.common.utils.CollUtils;
import com.finance.common.utils.DateUtils;
import com.finance.common.utils.StringUtils;
import com.finance.system.domain.TbQuestion;
@@ -11,9 +14,17 @@
import com.finance.system.dto.update.QuestionUpdDTO;
import com.finance.system.mapper.TbQuestionMapper;
import com.finance.system.query.QuestionQuery;
import com.finance.system.service.AsyncService;
import com.finance.system.service.ISysUserService;
import com.finance.system.service.TbQuestionService;
import com.finance.system.vo.QuestionVO;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * <p>
@@ -24,19 +35,27 @@
 * @since 2024-03-13
 */
@Service
@RequiredArgsConstructor
public class TbQuestionServiceImpl extends ServiceImpl<TbQuestionMapper, TbQuestion> implements
        TbQuestionService {
    private final ISysUserService sysUserService;
    private final AsyncService asyncService;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addQuestion(QuestionDTO dto) throws Exception {
        TbQuestion tbQuestion = BeanUtils.copyBean(dto, TbQuestion.class);
        tbQuestion.setType(dto.getType());
        tbQuestion.setQuarter(DateUtils.getNowQuarter());
        this.save(tbQuestion);
        asyncService.subtractScoreWithFixedRules(dto.getDeptAreaCode());
    }
    @Override
    public void editQuestion(QuestionUpdDTO dto) {
        TbQuestion tbQuestion = BeanUtils.copyBean(dto, TbQuestion.class);
        tbQuestion.setType(dto.getType());
        this.updateById(tbQuestion);
    }
@@ -48,6 +67,26 @@
                .like(StringUtils.isNotBlank(dto.getTitle()), TbQuestion::getTitle, dto.getTitle())
                .orderByDesc(TbQuestion::getCreateTime)
                .page(new Page<>(dto.getPageNum(), dto.getPageSize()));
        return PageDTO.of(page, QuestionVO.class);
        if (StringUtils.isEmpty(page.getRecords())) {
            return PageDTO.empty(page.getTotal(), page.getPages());
        }
        PageDTO<QuestionVO> questionVOPageDTO = PageDTO.of(page, QuestionVO.class);
        Set<String> areaCodeSet = questionVOPageDTO.getList().stream()
                .map(QuestionVO::getDeptAreaCode)
                .collect(Collectors.toSet());
        if (CollUtils.isNotEmpty(areaCodeSet)) {
            List<SysUser> sysUsers = sysUserService.list(
                    Wrappers.lambdaQuery(SysUser.class).in(SysUser::getAreaCode, areaCodeSet));
            Map<String, String> deptNameMap = sysUsers.stream()
                    .collect(Collectors.toMap(SysUser::getAreaCode, SysUser::getAreaName));
            if (CollUtils.isNotEmpty(deptNameMap)) {
                for (QuestionVO questionVO : questionVOPageDTO.getList()) {
                    String deptName = deptNameMap.get(questionVO.getDeptAreaCode());
                    questionVO.setDeptName(StringUtils.isNotBlank(deptName) ? deptName : "");
                }
            }
        }
        return questionVOPageDTO;
    }
}
finance-system/src/main/java/com/finance/system/service/impl/TbScoreServiceImpl.java
@@ -18,6 +18,8 @@
import com.finance.system.service.TbBasicDataConfigService;
import com.finance.system.service.TbScoreService;
import com.finance.system.vo.DeptCalculateDetailVO;
import com.finance.system.vo.RiskMapVO;
import com.finance.system.vo.RiskRankingVO;
import com.finance.system.vo.ScoreCalculateDetailVO;
import com.finance.system.vo.ScoreDetailVO;
import com.finance.system.vo.ScoreRankVO;
@@ -116,4 +118,24 @@
        vo.setList(pageVO.getRecords());
        return vo;
    }
    @Override
    public List<RiskMapVO> getCurrentScoreList(String nowQuarter, String areaCode) {
        return baseMapper.getCurrentScoreList(nowQuarter, areaCode);
    }
    @Override
    public List<RiskRankingVO> queryRiskRanking(String nowQuarter) {
        return baseMapper.queryRiskRanking(nowQuarter);
    }
    /**
     * @param areaCode 区划代码
     * @param yearType 年份类型 1=今年 2=去年
     * @return
     */
    @Override
    public List<RiskMapVO> getScoreByYearType(String areaCode, Integer yearType) {
        return baseMapper.getScoreByYearType(areaCode, yearType);
    }
}
finance-system/src/main/java/com/finance/system/vo/DataAnalysisVO.java
@@ -45,16 +45,16 @@
    @ApiModelProperty("数据指标得分")
    private List<ScoreRateDataVO> scoreRateDataList;
    @ApiModelProperty("字段列表一")
    @ApiModelProperty("财政经济形势")
    private List<FieldAndScoreDataVO> scoreRateDataListOne;
    @ApiModelProperty("字段列表二")
    @ApiModelProperty("预算管理方面")
    private List<FieldAndScoreDataVO> scoreRateDataListTwo;
    @ApiModelProperty("字段列表三")
    @ApiModelProperty("预算执行方面")
    private List<FieldAndScoreDataVO> scoreRateDataListThree;
    @ApiModelProperty("字段列表四")
    @ApiModelProperty("风险防控方面")
    private List<FieldAndScoreDataVO> scoreRateDataListFour;
}
finance-system/src/main/java/com/finance/system/vo/DeptVO.java
@@ -1,11 +1,11 @@
package com.finance.system.vo;
import com.finance.common.enums.AreaLevelEnum;
import com.finance.common.enums.DisabledEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import lombok.Data;
/**
 * @author mitao
@@ -30,7 +30,7 @@
    private String areaCode;
    @ApiModelProperty(value = "级次(省、市、县)")
    private String areaLevel;
    private AreaLevelEnum areaLevel;
    @ApiModelProperty(value = "县级标志(不包含直辖市的区 0:否 1:是)")
    private DisabledEnum countyFlag;
finance-system/src/main/java/com/finance/system/vo/FieldAndScoreDataVO.java
@@ -19,6 +19,9 @@
    @ApiModelProperty(value = "计算类型id")
    private Long id;
    @ApiModelProperty(value = "区划代码")
    private String deptAreaCode;
    @ApiModelProperty("类型名称")
    private String typeName;
@@ -34,4 +37,13 @@
    @ApiModelProperty("分类id")
    private String basicDataCategoryId;
    @ApiModelProperty("一级指标")
    private String levelOneIndicator;
    @ApiModelProperty("二级指标")
    private String levelTwoIndicator;
    @ApiModelProperty("最大分值")
    private Double levelOneIndicatorMaxScore;
}
finance-system/src/main/java/com/finance/system/vo/QuestionVO.java
@@ -1,12 +1,12 @@
package com.finance.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.finance.common.enums.QuestionTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
 * @author mitao
@@ -27,6 +27,15 @@
    @ApiModelProperty(value = "问题内容")
    private String content;
    @ApiModelProperty(value = "问题类型")
    private QuestionTypeEnum type;
    @ApiModelProperty("区划代码")
    private String deptAreaCode;
    @ApiModelProperty(value = "部门名称")
    private String deptName;
    @ApiModelProperty(value = "填报时间")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    private Date createTime;
finance-system/src/main/java/com/finance/system/vo/RiskMapVO.java
@@ -1,5 +1,6 @@
package com.finance.system.vo;
import com.finance.common.enums.AreaLevelEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -10,8 +11,13 @@
    @ApiModelProperty("区划代码")
    private String areaCode;
    @ApiModelProperty("部门名称")
    private String areaName;
    @ApiModelProperty("风险得分")
    private Double score;
    @ApiModelProperty("风险等级")
    private AreaLevelEnum areaLevel;
}
finance-system/src/main/resources/mapper/system/TbBasicDataMapper.xml
@@ -92,5 +92,33 @@
      AND tbd.dept_area_code = #{areaCode}
      AND tbd.quarter = #{nowQuarter}
  </select>
  <select id="getFieldAndScoreData" resultType="com.finance.system.vo.FieldAndScoreDataVO">
    SELECT tbdc.id,
    tbdc.type_name,
    ts.score,
    tbdc.max_score,
    tbd.dept_area_code,
    tbdc.basic_data_category_id AS basicDataCategoryId,
    tbdc2.basic_data_category_name AS levelTwoIndicator,
    tbdc3.basic_data_category_name AS levelOneIndicator,
    tbdc3.score AS levelOneIndicatorMaxScore
    FROM tb_basic_data tbd
    LEFT JOIN tb_score ts ON tbd.id = ts.basic_data_id
    LEFT JOIN tb_basic_data_config tbdc ON ts.basic_data_config_id = tbdc.id
    LEFT JOIN tb_basic_data_category tbdc2 ON tbdc2.id = tbdc.basic_data_category_id
    LEFT JOIN tb_basic_data_category tbdc3 ON tbdc2.parent_id = tbdc3.id
    <where>
      tbd.`quarter` = #{nowQuarter}
      <if test="areaCode!=null and areaCode != ''">
        AND tbd.dept_area_code = #{areaCode}
      </if>
      <if test="yearType==1">
        AND YEAR(tbd.reporting_time) = YEAR(CURDATE())
      </if>
      <if test="yearType==2">
        AND YEAR(tbd.reporting_time) = YEAR(CURDATE())-1
      </if>
    </where>
  </select>
</mapper>
finance-system/src/main/resources/mapper/system/TbDataScreenScoreMapper.xml
@@ -37,7 +37,7 @@
    WHERE 1 = 1
      AND tbd.quarter = #{nowQuarter}
      AND tbsc.id = #{dataScreenConfigId}
      AND su.area_level LIKE '县'
      AND su.area_level = 'com.finance.common.enums.AreaLevelEnum@COUNTY.getCode()'
    ORDER BY tdss.score DESC
  </select>
  <select id="selectRiskByQuarter" resultType="com.finance.system.domain.TbDataScreenScore">
finance-system/src/main/resources/mapper/system/TbScoreMapper.xml
@@ -113,4 +113,53 @@
      </if>
    </where>
  </select>
  <select id="getCurrentScoreList" resultType="com.finance.system.vo.RiskMapVO">
    SELECT SUM(ts.score) score,
    su.area_code,
    su.area_name,
    su.area_level
    FROM tb_score ts
    LEFT JOIN tb_basic_data tbd ON ts.basic_data_id = tbd.id
    LEFT JOIN sys_user su ON tbd.dept_area_code = su.area_code
    <where>
      tbd.`quarter` = #{nowQuarter}
      <if test="areaCode !=  null and areaCode != ''">
        AND tbd.dept_area_code = #{areaCode}
      </if>
    </where>
    GROUP BY tbd.id
  </select>
  <select id="queryRiskRanking" resultType="com.finance.system.vo.RiskRankingVO"
    parameterType="java.lang.String">
    SELECT *
    FROM (SELECT SUM(ts.score) score, su.area_code, su.area_name
    FROM tb_score ts
    LEFT JOIN tb_basic_data tbd ON tbd.id = ts.basic_data_id
    LEFT JOIN sys_user su ON su.area_code = tbd.dept_area_code
    <where>
      AND tbd.quarter = #{nowQuarter}
      AND su.area_level = '${@com.finance.common.enums.AreaLevelEnum@COUNTY.getCode()}'
    </where>
    GROUP BY tbd.id) rs
    ORDER BY rs.score DESC
  </select>
  <select id="getScoreByYearType" resultType="com.finance.system.vo.RiskMapVO">
    SELECT *
    FROM (SELECT SUM(ts.score) score, su.area_code, su.area_name
    FROM tb_score ts
    LEFT JOIN tb_basic_data tbd ON tbd.id = ts.basic_data_id
    LEFT JOIN sys_user su ON su.area_code = tbd.dept_area_code
    <where>
      tbd.dept_area_code = #{areaCode}
      <if test="yearType!=null and yearType==1">
        AND YEAR(tbd.reporting_time) = YEAR(CURDATE())
      </if>
      <if test="yearType!=null and yearType==2">
        AND YEAR(tbd.reporting_time) = YEAR(CURDATE())-1
      </if>
    </where>
    GROUP BY tbd.id) rs
    ORDER BY rs.score DESC
  </select>
</mapper>