From 3e456f3e812ead6a19e80cfbdbf86ae0263d50b9 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期五, 12 七月 2024 22:39:45 +0800
Subject: [PATCH] 完成7.4迭代内容,通过冒烟测试

---
 finance-admin/src/main/java/com/finance/web/controller/api/CurrentQuarterController.java        |   52 +
 finance-system/src/main/java/com/finance/system/dto/update/RiskLevelUpdDTO.java                 |    3 
 finance-system/src/main/java/com/finance/system/dto/QuestionDTO.java                            |   19 
 finance-system/src/main/resources/mapper/system/TbBasicDataMapper.xml                           |   28 
 finance-admin/src/main/java/com/finance/web/controller/api/TbDeptController.java                |    8 
 finance-admin/src/main/resources/application-dev.yml                                            |    2 
 finance-system/src/main/java/com/finance/system/vo/DataAnalysisVO.java                          |   10 
 finance-system/src/main/java/com/finance/system/service/impl/TbDataScreenConfigServiceImpl.java |   18 
 finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java              |  595 +++++++++++++++---
 finance-system/src/main/java/com/finance/system/dto/update/QuestionUpdDTO.java                  |   13 
 finance-system/src/main/resources/mapper/system/TbScoreMapper.xml                               |   49 +
 finance-system/src/main/java/com/finance/system/listener/BasicDataListener.java                 |    2 
 finance-system/src/main/java/com/finance/system/service/ISysUserService.java                    |    2 
 finance-system/src/main/java/com/finance/system/vo/FieldAndScoreDataVO.java                     |   12 
 finance-common/src/main/java/com/finance/common/enums/QuestionTypeEnum.java                     |   33 +
 finance-system/src/main/resources/mapper/system/TbDataScreenScoreMapper.xml                     |    2 
 finance-admin-dept/src/main/resources/application-dev.yml                                       |    6 
 finance-admin/src/test/java/com/finance/FinanceManageApplicationTest.java                       |   44 +
 finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataConfigServiceImpl.java  |   50 +
 finance-system/src/main/java/com/finance/system/service/impl/TbDeptServiceImpl.java             |   14 
 finance-system/src/main/java/com/finance/system/service/TbBasicDataService.java                 |    5 
 finance-system/src/main/java/com/finance/system/service/TbScoreService.java                     |    8 
 finance-common/src/main/java/com/finance/common/core/domain/entity/SysUser.java                 |    7 
 finance-system/src/main/java/com/finance/system/service/impl/SysUserServiceImpl.java            |   13 
 finance-system/src/main/java/com/finance/system/service/TbBasicDataConfigService.java           |    2 
 finance-system/src/main/java/com/finance/system/service/AsyncService.java                       |    2 
 finance-system/src/main/java/com/finance/system/service/impl/TbScoreServiceImpl.java            |   26 
 finance-common/src/main/java/com/finance/common/enums/AreaLevelEnum.java                        |    9 
 finance-system/src/main/java/com/finance/system/vo/RiskMapVO.java                               |    6 
 finance-common/src/main/java/com/finance/common/enums/IndicatorItemEnum.java                    |   53 
 finance-system/src/main/java/com/finance/system/service/impl/TbQuestionServiceImpl.java         |   41 +
 finance-system/src/main/java/com/finance/system/vo/QuestionVO.java                              |   13 
 finance-system/src/main/java/com/finance/system/mapper/TbScoreMapper.java                       |   10 
 finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataServiceImpl.java        |  300 ++++++++-
 finance-common/src/main/java/com/finance/common/utils/DateUtils.java                            |   46 +
 finance-system/src/main/java/com/finance/system/domain/TbBasicDataField.java                    |   12 
 finance-admin/src/main/java/com/finance/web/controller/service/ScreenService.java               |  246 +++++--
 finance-common/src/main/java/com/finance/common/enums/BasicDataFieldEnum.java                   |   21 
 finance-system/src/main/java/com/finance/system/mapper/TbBasicDataMapper.java                   |    3 
 finance-system/src/main/java/com/finance/system/vo/DeptVO.java                                  |    8 
 finance-system/src/main/java/com/finance/system/domain/TbQuestion.java                          |    9 
 41 files changed, 1,443 insertions(+), 359 deletions(-)

diff --git a/finance-admin-dept/src/main/resources/application-dev.yml b/finance-admin-dept/src/main/resources/application-dev.yml
index 5c9b1c1..d658886 100644
--- a/finance-admin-dept/src/main/resources/application-dev.yml
+++ b/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:
diff --git a/finance-admin/src/main/java/com/finance/web/controller/api/CurrentQuarterController.java b/finance-admin/src/main/java/com/finance/web/controller/api/CurrentQuarterController.java
index 1c18d5e..9ecbf1c 100644
--- a/finance-admin/src/main/java/com/finance/web/controller/api/CurrentQuarterController.java
+++ b/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,13 +55,14 @@
     private final TbBasicDataService tbBasicDataService;
     private final TbQuestionService tbQuestionService;
     private final TbScoreService tbScoreService;
+    private final ISysUserService sysUserService;
 
     /**
      * 字段统计
      *
      * @return R<PageDTO < CurrentFieldsVO>>
      */
-    @ApiOperation(value = "字段统计" , notes = "字段统计")
+    @ApiOperation(value = "字段统计", notes = "字段统计")
     @PostMapping("/fields-statics")
     public R<PageDTO<CurrentFieldsVO>> fieldsStatics(
             @Validated @RequestBody CurrentFieldsQuery dto) {
@@ -64,7 +70,7 @@
             dto.setQuarter(DateUtils.getNowQuarter());
             return tbBasicDataService.fieldsStatics(dto);
         } catch (Exception e) {
-            log.error("获取字段统计相关信息异常" , e);
+            log.error("获取字段统计相关信息异常", e);
             return R.fail();
         }
     }
@@ -76,8 +82,8 @@
      * @return R<CurrentFieldsDetailVO>
      */
     @GetMapping("/fields-details")
-    @ApiOperation(value = "字段统计-查看详情" , notes = "字段统计")
-    @ApiImplicitParam(name = "id" , value = "基础数据id" , required = true, dataType = "int" , paramType = "query" , dataTypeClass = Long.class)
+    @ApiOperation(value = "字段统计-查看详情", notes = "字段统计")
+    @ApiImplicitParam(name = "id", value = "基础数据id", required = true, dataType = "int", paramType = "query", dataTypeClass = Long.class)
     public R<CurrentFieldsDetailVO> fieldsDetails(@RequestParam("id") Long id) {
         try {
             return tbBasicDataService.fieldsDetails(id);
@@ -85,7 +91,7 @@
             if (e instanceof ServiceException) {
                 return R.fail(e.getMessage());
             }
-            log.error("保存当前季度数据异常" , e);
+            log.error("保存当前季度数据异常", e);
             return R.fail();
         }
     }
@@ -105,7 +111,7 @@
             if (e instanceof ServiceException) {
                 return R.fail(e.getMessage());
             }
-            log.error("保存数据异常" , e);
+            log.error("保存数据异常", e);
             return R.fail();
         }
         return R.ok();
@@ -117,7 +123,7 @@
      * @return R<CurrentFieldsAllVO>
      */
     @GetMapping("/fields-statics-all")
-    @ApiOperation(value = "字段统计-查看全部" , notes = "字段统计")
+    @ApiOperation(value = "字段统计-查看全部", notes = "字段统计")
     public R<CurrentFieldsAllVO> fieldsStaticsAll() {
         try {
             return R.ok(tbBasicDataService.fieldsStaticsAll());
@@ -125,7 +131,7 @@
             if (e instanceof ServiceException) {
                 return R.fail(e.getMessage());
             }
-            log.error("查看全部异常" , e);
+            log.error("查看全部异常", e);
             return R.fail();
         }
     }
@@ -144,7 +150,7 @@
             query.setQuarter(DateUtils.getNowQuarter());
             return R.ok(tbBasicDataService.scoreCalculatePage(query));
         } catch (Exception e) {
-            log.error("获取得分计算异常" , e);
+            log.error("获取得分计算异常", e);
             return R.fail();
         }
     }
@@ -157,7 +163,7 @@
      */
     @PostMapping("/score-calculate-detail")
     @ApiOperation("得分计算-查看详情")
-    @ApiImplicitParam(name = "areaName" , value = "部门名称" , required = false, dataType = "string" , paramType = "query" , dataTypeClass = String.class)
+    @ApiImplicitParam(name = "areaName", value = "部门名称", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class)
     public R<ScoreCalculateDetailVO> scoreCalculateDetail(
             @Validated @RequestBody ScoreCalculateDetailQuery query) {
         return R.ok(tbScoreService.scoreCalculateDetail(query));
@@ -170,7 +176,7 @@
      * @return R<Void>
      */
     @PostMapping("add-question")
-    @ApiOperation(value = "发现问题-添加问题" , notes = "发现问题")
+    @ApiOperation(value = "发现问题-添加问题", notes = "发现问题")
     public R<Void> addQuestion(@Validated @RequestBody QuestionDTO dto) {
         try {
             tbQuestionService.addQuestion(dto);
@@ -179,7 +185,7 @@
             if (e instanceof ServiceException) {
                 return R.fail(e.getMessage());
             }
-            log.error("添加问题异常" , e);
+            log.error("添加问题异常", e);
             return R.fail();
         }
     }
@@ -191,7 +197,7 @@
      * @return R<Void>
      */
     @PostMapping("/edit-question")
-    @ApiOperation(value = "发现问题-编辑问题" , notes = "发现问题")
+    @ApiOperation(value = "发现问题-编辑问题", notes = "发现问题")
     public R<Void> editQuestion(@Validated @RequestBody QuestionUpdDTO dto) {
         try {
             tbQuestionService.editQuestion(dto);
@@ -200,7 +206,7 @@
             if (e instanceof ServiceException) {
                 return R.fail(e.getMessage());
             }
-            log.error("编辑问题异常" , e);
+            log.error("编辑问题异常", e);
             return R.fail();
         }
     }
@@ -212,7 +218,7 @@
      * @return R<PageDTO < QuestionVO>>
      */
     @PostMapping("/page-question")
-    @ApiOperation(value = "发现问题-分页查询问题" , notes = "发现问题")
+    @ApiOperation(value = "发现问题-分页查询问题", notes = "发现问题")
     public R<PageDTO<QuestionVO>> pageQuestion(@Validated @RequestBody QuestionQuery dto) {
         return R.ok(tbQuestionService.pageQuestion(dto));
     }
@@ -224,10 +230,10 @@
      * @return R<QuestionDTO>
      */
     @GetMapping("/detail-question")
-    @ApiOperation(value = "发现问题-问题详情" , notes = "发现问题")
-    public R<QuestionDTO> detailQuestion(@RequestParam("id") Long id) {
+    @ApiOperation(value = "发现问题-问题详情", notes = "发现问题")
+    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));
     }
 
     /**
@@ -237,9 +243,17 @@
      * @return R<Void>
      */
     @DeleteMapping("/delete")
-    @ApiOperation(value = "发现问题-删除问题" , notes = "发现问题")
+    @ApiOperation(value = "发现问题-删除问题", notes = "发现问题")
     public R<Void> delete(@RequestParam("id") Long id) {
         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));
+    }
+
 }
diff --git a/finance-admin/src/main/java/com/finance/web/controller/api/TbDeptController.java b/finance-admin/src/main/java/com/finance/web/controller/api/TbDeptController.java
index 4fe02c4..616e3ea 100644
--- a/finance-admin/src/main/java/com/finance/web/controller/api/TbDeptController.java
+++ b/finance-admin/src/main/java/com/finance/web/controller/api/TbDeptController.java
@@ -67,8 +67,8 @@
     @ApiOperation("模板下载")
     public void download() {
         try {
-            //ArrayList<TbDept> list = new ArrayList<>();
-            //ExcelUtil.exportExcel(list, "部门导入模板", "部门导入模板", TbDept.class, "部门导入模板", response);
+            // ArrayList<TbDept> list = new ArrayList<>();
+            // ExcelUtil.exportExcel(list, "部门导入模板", "部门导入模板", TbDept.class, "部门导入模板", response);
             // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
             response.setContentType("application/vnd.ms-excel");
             response.setCharacterEncoding("utf-8");
@@ -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())
@@ -100,7 +100,7 @@
     @Transactional(rollbackFor = Exception.class)
     public R<Void> importExcel(@RequestPart("file") MultipartFile file) {
         try {
-            //tbDeptService.importExcel(file);
+            // tbDeptService.importExcel(file);
             InputStream inputStream = file.getInputStream();
             EasyExcel.read(inputStream, DeptExcel.class, new DeptImportListener(sysUserService))
                     .sheet().doRead();
diff --git a/finance-admin/src/main/java/com/finance/web/controller/service/ScreenService.java b/finance-admin/src/main/java/com/finance/web/controller/service/ScreenService.java
index d699985..acf53a9 100644
--- a/finance-admin/src/main/java/com/finance/web/controller/service/ScreenService.java
+++ b/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));
@@ -113,28 +118,29 @@
     public RiskAndTransferVO getRiskAndTransfer() throws Exception {
         String nowQuarter = DateUtils.getNowQuarter();
         RiskAndTransferVO riskAndTransferVO = new RiskAndTransferVO();
-        //查询转移支付规模总额
+        // 查询转移支付规模总额
         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()))
                 .reduce(Double::sum);
         riskAndTransferVO.setTransferPaymentScale(reduce.orElse(0D));
-        //查询风险等级设置
+        // 查询风险等级设置
         DataScreenConfigVO riskLevel = tbDataScreenConfigService.getRiskLevel();
         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)) {
@@ -145,24 +151,24 @@
                 riskCountVO.setHighRiskCount((int) count);
             }
         }
-        //TODO
-        riskCountVO.setNoRiskCount(50);
-        riskCountVO.setLowRiskCount(45);
-        riskCountVO.setMediumRiskCount(30);
-        riskCountVO.setHighRiskCount(80);
+        // TODO
+        // 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++);
@@ -235,7 +240,7 @@
 
     public DataAnalysisVO getDataAnalysis(String areaCode) throws Exception {
         DataAnalysisVO dataAnalysisVO = new DataAnalysisVO();
-        //查询得分排名
+        // 查询得分排名
         ScoreRankVO scoreRankVO = tbScoreService.queryRankAndScoreByAreaCode(areaCode);
         if (Objects.isNull(scoreRankVO)) {
             return dataAnalysisVO;
@@ -243,9 +248,10 @@
         dataAnalysisVO.setRank(scoreRankVO.getRank());
         dataAnalysisVO.setScore(scoreRankVO.getScore());
         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()
@@ -255,24 +261,16 @@
             return dataAnalysisVO;
         }
         dataAnalysisVO.setAreaName(user.getDeptName());
-        //查询风险得分
+        // 查询风险得分
         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));
-        //查询风险等级
-        List<TbDataScreenScore> dataScreenScoreList = tbDataScreenScoreService.selectRiskByQuarter(
-                nowQuarter,
-                riskLevel.getId(), areaCode);
-        for (TbDataScreenScore tbDataScreenScore : dataScreenScoreList) {
+
+        dataAnalysisVO.setYearScore(getYearScore(areaCode, 1));
+
+        dataAnalysisVO.setLastYearScore(getYearScore(areaCode, 2));
+        // 查询风险等级
+        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,58 +286,142 @@
                 }
             }
         }
-        //查询形式指标得分
-        List<ScoreDataVO> scoreDataVOList = new ArrayList<>();
-        handleDataIndicators(areaCode, scoreDataVOList);
-        dataAnalysisVO.setScoreDataList(scoreDataVOList);
-        //查询数据指标得分
-        List<ScoreRateDataVO> scoreRateDataVOList = new ArrayList<>();
-        handleDataIndicators(areaCode, scoreRateDataVOList, nowQuarter);
-        dataAnalysisVO.setScoreRateDataList(scoreRateDataVOList);
-        //查询大屏下方字段列表
+        // 查询四个指标下的三级指标
+        List<FieldAndScoreDataVO> voList =
+                tbBasicDataService.getFieldAndScoreData(areaCode, nowQuarter, 1);
+        List<FieldAndScoreDataVO> lastYearList =
+                tbBasicDataService.getFieldAndScoreData(areaCode, nowQuarter, 2);
+        // 查询四个指标下的三级指标
+        List<FieldAndScoreDataVO> allDeptVoList =
+                tbBasicDataService.getFieldAndScoreData(null, nowQuarter, 1);
+        // 查询形式指标得分
+        dataAnalysisVO.setScoreDataList(handleDataIndicators(voList, lastYearList));
+        // 查询数据指标得分
+        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);
         if (CollUtils.isNotEmpty(formalIndicatorsYear)) {
-            //形式指标一
+            // 形式指标一
             for (SubTypeEnum value : SubTypeEnum.values()) {
                 ScoreDataVO scoreDataVO = new ScoreDataVO();
                 scoreDataVO.setSubType(value);
diff --git a/finance-admin/src/main/resources/application-dev.yml b/finance-admin/src/main/resources/application-dev.yml
index ff11971..9a12672 100644
--- a/finance-admin/src/main/resources/application-dev.yml
+++ b/finance-admin/src/main/resources/application-dev.yml
@@ -166,7 +166,7 @@
   # 令牌密钥
   secret: abcdefghijklmnopqrstuvwxyz
   # 令牌有效期(默认30分钟)
-  expireTime: 120
+  expireTime: 720
 
 # MyBatis配置
 #mybatis:
diff --git a/finance-admin/src/test/java/com/finance/FinanceManageApplicationTest.java b/finance-admin/src/test/java/com/finance/FinanceManageApplicationTest.java
index f8f920a..b70cd26 100644
--- a/finance-admin/src/test/java/com/finance/FinanceManageApplicationTest.java
+++ b/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);
+    }
 }
 
diff --git a/finance-common/src/main/java/com/finance/common/core/domain/entity/SysUser.java b/finance-common/src/main/java/com/finance/common/core/domain/entity/SysUser.java
index 9b4c9d2..39c1ce6 100644
--- a/finance-common/src/main/java/com/finance/common/core/domain/entity/SysUser.java
+++ b/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")
diff --git a/finance-common/src/main/java/com/finance/common/enums/AreaLevelEnum.java b/finance-common/src/main/java/com/finance/common/enums/AreaLevelEnum.java
index 772e632..bddf836 100644
--- a/finance-common/src/main/java/com/finance/common/enums/AreaLevelEnum.java
+++ b/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) {
diff --git a/finance-common/src/main/java/com/finance/common/enums/BasicDataFieldEnum.java b/finance-common/src/main/java/com/finance/common/enums/BasicDataFieldEnum.java
index 6407504..f8abfc0 100644
--- a/finance-common/src/main/java/com/finance/common/enums/BasicDataFieldEnum.java
+++ b/finance-common/src/main/java/com/finance/common/enums/BasicDataFieldEnum.java
@@ -19,9 +19,9 @@
     BASIC_DATA_FIELD10(10L, "(一)一般公共预算-动用预算稳定调节基金-预算数"),
     BASIC_DATA_FIELD11(11L, "(一)一般公共预算-动用预算稳定调节基金-执行数"),
     BASIC_DATA_FIELD12(12L,
-            "(一)一般公共预算-综合财力 (本级收入+上级补助-上解+下级上解收入-补助下级支出)-预算数"),
+            "(一)一般公共预算-综合财力(本级收入+上级补助-上解+下级上解收入-补助下级支出)-预算数"),
     BASIC_DATA_FIELD13(13L,
-            "(一)一般公共预算-综合财力 (本级收入+上级补助-上解+下级上解收入-补助下级支出)-执行数"),
+            "(一)一般公共预算-综合财力(本级收入+上级补助-上解+下级上解收入-补助下级支出)-执行数"),
     BASIC_DATA_FIELD14(14L, "(一)一般公共预算-一般公共预算支出-预算数"),
     BASIC_DATA_FIELD15(15L, "(一)一般公共预算-一般公共预算支出-当期执行数"),
     BASIC_DATA_FIELD16(16L, "(一)一般公共预算-一般公共预算支出-上年同期执行数"),
@@ -29,9 +29,9 @@
     BASIC_DATA_FIELD18(18L, "(二)政府性基金预算-政府性基金预算收入-当期执行数"),
     BASIC_DATA_FIELD19(19L, "(二)政府性基金预算-政府性基金预算收入-上年同期执行数"),
     BASIC_DATA_FIELD20(20L,
-            "(二)政府性基金预算-可用财力 (本级收入+上级补助-上解+下级上解收入-补助下级支出)-预算数"),
+            "(二)政府性基金预算-可用财力(本级收入+上级补助-上解+下级上解收入-补助下级支出)-预算数"),
     BASIC_DATA_FIELD21(21L,
-            "(二)政府性基金预算-可用财力 (本级收入+上级补助-上解+下级上解收入-补助下级支出)-执行数"),
+            "(二)政府性基金预算-可用财力(本级收入+上级补助-上解+下级上解收入-补助下级支出)-执行数"),
     BASIC_DATA_FIELD22(22L, "(二)政府性基金预算-政府性基金预算支出-预算数"),
     BASIC_DATA_FIELD23(23L, "(二)政府性基金预算-政府性基金预算支出-当期执行数"),
     BASIC_DATA_FIELD24(24L, "(二)政府性基金预算-政府性基金预算支出-上年同期执行数"),
@@ -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;
diff --git a/finance-common/src/main/java/com/finance/common/enums/IndicatorItemEnum.java b/finance-common/src/main/java/com/finance/common/enums/IndicatorItemEnum.java
index 2533213..4eab6a7 100644
--- a/finance-common/src/main/java/com/finance/common/enums/IndicatorItemEnum.java
+++ b/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;
diff --git a/finance-common/src/main/java/com/finance/common/enums/QuestionTypeEnum.java b/finance-common/src/main/java/com/finance/common/enums/QuestionTypeEnum.java
new file mode 100644
index 0000000..3e223e1
--- /dev/null
+++ b/finance-common/src/main/java/com/finance/common/enums/QuestionTypeEnum.java
@@ -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;
+    }
+} 
\ No newline at end of file
diff --git a/finance-common/src/main/java/com/finance/common/utils/DateUtils.java b/finance-common/src/main/java/com/finance/common/utils/DateUtils.java
index 16bf656..742eb03 100644
--- a/finance-common/src/main/java/com/finance/common/utils/DateUtils.java
+++ b/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;
@@ -206,14 +207,14 @@
     public static Map<String, Date> getMonthDate(Date date) {
         Map<String, Date> map = new HashMap<>(2);
         Calendar cal = Calendar.getInstance();
-        //设置指定日期
+        // 设置指定日期
         cal.setTime(date);
-        //获取当月第一天日期
+        // 获取当月第一天日期
         int first = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
         cal.set(Calendar.DAY_OF_MONTH, first);
         Date firstDay = cal.getTime();
         map.put("first", firstDay);
-        //获取当月最后一天日期
+        // 获取当月最后一天日期
         int last = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
         cal.set(Calendar.DAY_OF_MONTH, last);
         Date lastDay = cal.getTime();
@@ -279,14 +280,14 @@
     public static Map<String, Date> getYearDate(Date date) {
         Map<String, Date> map = new HashMap<>(2);
         Calendar cal = Calendar.getInstance();
-        //设置指定日期
+        // 设置指定日期
         cal.setTime(date);
-        //获取本年第一天日期
+        // 获取本年第一天日期
         int first = cal.getActualMinimum(Calendar.DAY_OF_YEAR);
         cal.set(Calendar.DAY_OF_YEAR, first);
         Date firstDay = cal.getTime();
         map.put("first", firstDay);
-        //获取本年最后一天日期
+        // 获取本年最后一天日期
         int last = cal.getActualMaximum(Calendar.DAY_OF_YEAR);
         cal.set(Calendar.DAY_OF_YEAR, last);
         Date lastDay = cal.getTime();
@@ -376,7 +377,7 @@
      * @throws Exception 异常
      */
     public static String getNowQuarter() throws Exception {
-        //当前所在季度
+        // 当前所在季度
         Date date = new Date();
         char quarterOfYear = String.valueOf(getQuarterOfYear(date)).toCharArray()[0];
         String quarterOfYearStr = NumberChineseFormatter.numberCharToChinese(quarterOfYear, false);
@@ -409,13 +410,40 @@
         return DateUtils.toDate(startDate);
     }
 
-    //测试 getNowQuarter
+    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年四季度")));
diff --git a/finance-system/src/main/java/com/finance/system/domain/TbBasicDataField.java b/finance-system/src/main/java/com/finance/system/domain/TbBasicDataField.java
index 245b9c1..22c6232 100644
--- a/finance-system/src/main/java/com/finance/system/domain/TbBasicDataField.java
+++ b/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;
diff --git a/finance-system/src/main/java/com/finance/system/domain/TbQuestion.java b/finance-system/src/main/java/com/finance/system/domain/TbQuestion.java
index f503552..59d3fe2 100644
--- a/finance-system/src/main/java/com/finance/system/domain/TbQuestion.java
+++ b/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
diff --git a/finance-system/src/main/java/com/finance/system/dto/QuestionDTO.java b/finance-system/src/main/java/com/finance/system/dto/QuestionDTO.java
index 89b9ad4..c66d786 100644
--- a/finance-system/src/main/java/com/finance/system/dto/QuestionDTO.java
+++ b/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;
 }
diff --git a/finance-system/src/main/java/com/finance/system/dto/update/QuestionUpdDTO.java b/finance-system/src/main/java/com/finance/system/dto/update/QuestionUpdDTO.java
index 999c638..da1d945 100644
--- a/finance-system/src/main/java/com/finance/system/dto/update/QuestionUpdDTO.java
+++ b/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;
 }
diff --git a/finance-system/src/main/java/com/finance/system/dto/update/RiskLevelUpdDTO.java b/finance-system/src/main/java/com/finance/system/dto/update/RiskLevelUpdDTO.java
index 16e9f88..2491b0f 100644
--- a/finance-system/src/main/java/com/finance/system/dto/update/RiskLevelUpdDTO.java
+++ b/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 = "风险等级范围-高风险得分")
diff --git a/finance-system/src/main/java/com/finance/system/listener/BasicDataListener.java b/finance-system/src/main/java/com/finance/system/listener/BasicDataListener.java
index faba84a..660f01f 100644
--- a/finance-system/src/main/java/com/finance/system/listener/BasicDataListener.java
+++ b/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);
 
     }
 
diff --git a/finance-system/src/main/java/com/finance/system/mapper/TbBasicDataMapper.java b/finance-system/src/main/java/com/finance/system/mapper/TbBasicDataMapper.java
index 6133c4d..875b166 100644
--- a/finance-system/src/main/java/com/finance/system/mapper/TbBasicDataMapper.java
+++ b/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);
 }
diff --git a/finance-system/src/main/java/com/finance/system/mapper/TbScoreMapper.java b/finance-system/src/main/java/com/finance/system/mapper/TbScoreMapper.java
index 069d754..5fda4f8 100644
--- a/finance-system/src/main/java/com/finance/system/mapper/TbScoreMapper.java
+++ b/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);
 }
diff --git a/finance-system/src/main/java/com/finance/system/service/AsyncService.java b/finance-system/src/main/java/com/finance/system/service/AsyncService.java
index d228152..6121d87 100644
--- a/finance-system/src/main/java/com/finance/system/service/AsyncService.java
+++ b/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;
 }
diff --git a/finance-system/src/main/java/com/finance/system/service/ISysUserService.java b/finance-system/src/main/java/com/finance/system/service/ISysUserService.java
index 2b94552..418285f 100644
--- a/finance-system/src/main/java/com/finance/system/service/ISysUserService.java
+++ b/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);
 }
diff --git a/finance-system/src/main/java/com/finance/system/service/TbBasicDataConfigService.java b/finance-system/src/main/java/com/finance/system/service/TbBasicDataConfigService.java
index f3d5111..7be6af4 100644
--- a/finance-system/src/main/java/com/finance/system/service/TbBasicDataConfigService.java
+++ b/finance-system/src/main/java/com/finance/system/service/TbBasicDataConfigService.java
@@ -43,4 +43,6 @@
             BasicDataConfigQuery query);
 
     List<BasicDataConfigVO> getFixedRulesConfigList();
+
+    List<BasicDataConfigVO> getSubsractRulesConfigList();
 }
diff --git a/finance-system/src/main/java/com/finance/system/service/TbBasicDataService.java b/finance-system/src/main/java/com/finance/system/service/TbBasicDataService.java
index 6d3f918..164adf5 100644
--- a/finance-system/src/main/java/com/finance/system/service/TbBasicDataService.java
+++ b/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);
 }
diff --git a/finance-system/src/main/java/com/finance/system/service/TbScoreService.java b/finance-system/src/main/java/com/finance/system/service/TbScoreService.java
index 6c0b39e..4e43466 100644
--- a/finance-system/src/main/java/com/finance/system/service/TbScoreService.java
+++ b/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);
 }
diff --git a/finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java b/finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java
index 46451c7..0ec80e2 100644
--- a/finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java
+++ b/finance-system/src/main/java/com/finance/system/service/impl/AsyncServiceImpl.java
@@ -1,5 +1,6 @@
 package com.finance.system.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson2.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -7,20 +8,24 @@
 import com.finance.common.enums.BasicDataFieldEnum;
 import com.finance.common.enums.CalculateTypeEnum;
 import com.finance.common.enums.IndicatorItemEnum;
+import com.finance.common.enums.QuestionTypeEnum;
 import com.finance.common.enums.ShowStatusEnum;
 import com.finance.common.enums.ValueTypeEnum;
 import com.finance.common.exception.ServiceException;
 import com.finance.common.utils.CalculateUtil;
 import com.finance.common.utils.CollUtils;
+import com.finance.common.utils.DateUtils;
 import com.finance.common.utils.StringUtils;
 import com.finance.system.domain.TbBasicData;
 import com.finance.system.domain.TbBasicDataConfig;
 import com.finance.system.domain.TbBasicDataConfigDetail;
 import com.finance.system.domain.TbBasicDataField;
 import com.finance.system.domain.TbField;
+import com.finance.system.domain.TbQuestion;
 import com.finance.system.domain.TbScore;
 import com.finance.system.dto.CalculateItemDTO;
 import com.finance.system.mapper.TbBasicDataMapper;
+import com.finance.system.mapper.TbQuestionMapper;
 import com.finance.system.service.AsyncService;
 import com.finance.system.service.TbBasicDataCategoryService;
 import com.finance.system.service.TbBasicDataConfigDetailService;
@@ -31,6 +36,7 @@
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -56,6 +62,7 @@
     private final TbBasicDataCategoryService tbBasicDataCategoryService;
     private final TbBasicDataConfigDetailService tbBasicDataConfigDetailService;
     private final TbBasicDataMapper tbBasicDataMapper;
+    private final TbQuestionMapper tbQuestionMapper;
 
     @Async
     @Override
@@ -189,123 +196,349 @@
         // 待计算的基础数据字段
         Map<Long, TbBasicDataField> deptFieldsMap = fields.stream()
                 .collect(Collectors.toMap(TbBasicDataField::getFieldId, Function.identity()));
-        List<TbScore> scoreList = new ArrayList<>();
+        List<TbQuestion> list = tbQuestionMapper.selectList(
+                Wrappers.lambdaQuery(TbQuestion.class)
+                        .eq(TbQuestion::getQuarter, tbBasicData.getQuarter()));
+        String deptAreaCode = tbBasicData.getDeptAreaCode();
+        List<TbScore> scoreList = tbScoreService.lambdaQuery()
+                .eq(TbScore::getBasicDataId, tbBasicData.getId()).list();
         for (BasicDataConfigVO vo : fixedRulesConfigList) {
             double score = 0D;
-            // 1:财政经济形势-收入占GDP比重-地方一般公共预算收入占GDP的比重;
-            if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM1.getCode()) {
-                // 获取所需字段
-                TbBasicDataField provinceField = provinceFieldsMap.get(
-                        BasicDataFieldEnum.BASIC_DATA_FIELD2.getCode());
-                TbBasicDataField deptField = deptFieldsMap.get(
-                        BasicDataFieldEnum.BASIC_DATA_FIELD2.getCode());
-                score = getScore(deptField.getFieldValue(), tbBasicData.getCurrentGdp(),
-                        provinceField.getFieldValue(), provinceBasicData.getCurrentGdp(), vo);
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM2.getCode()) {
-                // 2:财政经济形势-收入执行率-地方一般公共预算收入执行进度(地方一般公共预算收入/年初预算或调整预算);
+            BigDecimal deptDividendValue;
+            BigDecimal deptDivisorValue;
+            BigDecimal provinceDividendValue;
+            BigDecimal provinceDivisorValue;
+            List<TbQuestion> questionList;
+            // 季度末时间
+            Date quarterDate = DateUtils.getQuarterDateEnd(tbBasicData.getQuarter());
+            BigDecimal month = BigDecimal.valueOf(
+                    Double.parseDouble(DateUtil.format(quarterDate, "MM")));
+            switch (Objects.requireNonNull(IndicatorItemEnum.getEnumByCode(vo.getId()))) {
+                case INDICATOR_ITEM1:
+                    // 1:财政经济形势-收入占GDP比重-地方一般公共预算收入占GDP的比重;
+                    // 获取所需字段
+                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD2);
+                    deptDivisorValue = BigDecimal.valueOf(
+                            Double.parseDouble(tbBasicData.getCurrentGdp()));
+                    provinceDividendValue = getProvinceBigDecimal(provinceFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD2);
+                    provinceDivisorValue = BigDecimal.valueOf(
+                            Double.parseDouble(provinceBasicData.getCurrentGdp()));
+                    score = getScore(deptDividendValue, deptDivisorValue,
+                            provinceDividendValue, provinceDivisorValue, vo);
+                    break;
+                case INDICATOR_ITEM2:
+                    // 2:财政经济形势-收入执行率-地方一般公共预算收入执行进度(地方一般公共预算收入/年初预算或调整预算);
+                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD2);
+                    deptDivisorValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD1);
 
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM3.getCode()) {
-                // 3:财政经济形势-收入执行率-政府性基金预算收入执行进度(政府性基金预算收入/年初预算或调整预算)
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM4.getCode()) {
-                // 4:财政经济形势-收入质量-税收收入占地方一般公共预算收入比重
-                // 获取所需字段
-                TbBasicDataField provinceField = provinceFieldsMap.get(
-                        BasicDataFieldEnum.BASIC_DATA_FIELD3.getCode());
-                TbBasicDataField deptField = deptFieldsMap.get(
-                        BasicDataFieldEnum.BASIC_DATA_FIELD3.getCode());
-                TbBasicDataField provinceField2 = provinceFieldsMap.get(
-                        BasicDataFieldEnum.BASIC_DATA_FIELD2.getCode());
-                TbBasicDataField deptField2 = deptFieldsMap.get(
-                        BasicDataFieldEnum.BASIC_DATA_FIELD2.getCode());
-                score = getScore(deptField.getFieldValue(), deptField2.getFieldValue(),
-                        provinceField.getFieldValue(), provinceField2.getFieldValue(), vo);
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM5.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM6.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM7.getCode()) {
-                TbField field = getFieldByFieldName(fieldList, "(一)一般公共预算",
-                        "上级补助收入", "",
-                        "执行数");
-
-                TbField field2 = getFieldByFieldName(fieldList, "(一)一般公共预算",
-                        "综合财力(本级收入+上级补助-上解+下级上解收入-补助下级支出)", "",
-                        "执行数");
-                if (Objects.nonNull(field) && Objects.nonNull(field2)) {
-                    TbBasicDataField provinceField = provinceFieldsMap.get(field.getId());
-                    TbBasicDataField deptField = deptFieldsMap.get(field.getId());
-                    TbBasicDataField provinceField2 = provinceFieldsMap.get(field2.getId());
-                    TbBasicDataField deptField2 = deptFieldsMap.get(field2.getId());
-                    score = getScore(deptField.getFieldValue(), deptField2.getFieldValue(),
-                            provinceField.getFieldValue(), provinceField2.getFieldValue(), vo);
-                }
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM8.getCode()) {
-                TbField field = getFieldByFieldName(fieldList, "(四)“三保”保障情况",
-                        "地方标准“三保”支出(以地方实际结构填列,含国标)", "保基本民生",
-                        "保基本民生");
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM9.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM10.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM11.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM12.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM13.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM14.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM15.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM16.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM17.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM18.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM19.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM20.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM21.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM22.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM23.getCode()) {
-
-            } else if (vo.getId().intValue() == IndicatorItemEnum.INDICATOR_ITEM24.getCode()) {
-
+                    score = getScore(deptDividendValue, deptDivisorValue, month,
+                            BigDecimal.valueOf(12D),
+                            vo);
+                    break;
+                case INDICATOR_ITEM3:
+                    // 3:财政经济形势-收入执行率-政府性基金预算收入执行进度(政府性基金预算收入/年初预算或调整预算)
+                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD18);
+                    deptDivisorValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD17);
+                    score = getScore(deptDividendValue, deptDivisorValue, month,
+                            BigDecimal.valueOf(12D),
+                            vo);
+                    break;
+                case INDICATOR_ITEM4:
+                    // 4:财政经济形势-收入质量-税收收入占地方一般公共预算收入比重
+                    // 获取所需字段
+                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD3);
+                    deptDivisorValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD2);
+                    provinceDividendValue = getProvinceBigDecimal(provinceFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD3);
+                    provinceDivisorValue = getProvinceBigDecimal(provinceFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD2);
+                    score = getScore(deptDividendValue, deptDivisorValue,
+                            provinceDividendValue, provinceDivisorValue, vo);
+                    break;
+                case INDICATOR_ITEM5:
+                    // 5: 财政经济形势-重大财税政策落实情况-减税降费落实情况
+                    questionList = getQuestList(list, deptAreaCode,
+                            QuestionTypeEnum.ENUM0);
+                    score = CollUtils.isNotEmpty(questionList) ? -5D : 0D;
+                    break;
+                case INDICATOR_ITEM6:
+                    // 6:财政经济形势-重大财税政策落实情况-其他重大政策落实情况
+                    questionList = getQuestList(list, deptAreaCode,
+                            QuestionTypeEnum.ENUM1);
+                    score = CollUtils.isNotEmpty(questionList) ? questionList.size() * -3D : 0D;
+                    break;
+                case INDICATOR_ITEM7:
+                    // 7:预算管理方面-转移支付-中央转移支付占地方可用财力比重
+                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD7);
+                    deptDivisorValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD13);
+                    provinceDividendValue = getProvinceBigDecimal(provinceFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD7);
+                    provinceDivisorValue = getProvinceBigDecimal(provinceFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD7);
+                    score = getScore2(deptDividendValue, deptDivisorValue,
+                            provinceDividendValue, provinceDivisorValue, vo);
+                    break;
+                case INDICATOR_ITEM8:
+                    // 8:预算管理方面-“三保”保障情况-“三保”年初预算保障情况
+                    BigDecimal aw = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD47);
+                    BigDecimal ap = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD40);
+                    BigDecimal az = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD50);
+                    BigDecimal aq = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD41);
+                    BigDecimal bc = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD53);
+                    BigDecimal ar = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD42);
+                    boolean res = aw.compareTo(ap) < 0 || (az.compareTo(aq) < 0 || (bc.compareTo(ar)
+                            < 0));
+                    score = res ? 0 : vo.getMaxScore();
+                    break;
+                case INDICATOR_ITEM9:
+                    BigDecimal au = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD45);
+                    BigDecimal r = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD13);
+                    BigDecimal divided = au.divide(r, 2, RoundingMode.HALF_UP);
+                    if (divided.compareTo(BigDecimal.valueOf(0.6D)) > 0) {
+                        BigDecimal add = BigDecimal.valueOf(0.6D).subtract(divided)
+                                .multiply(BigDecimal.valueOf(100D))
+                                .divide(BigDecimal.valueOf(4D), 2, RoundingMode.HALF_UP)
+                                .add(BigDecimal.valueOf(8));
+                        score = add.compareTo(BigDecimal.ZERO) >= 0 ? add.doubleValue() : 0D;
+                    } else {
+                        score = vo.getMaxScore();
+                    }
+                    break;
+                case INDICATOR_ITEM10:
+                    // 10:预算管理方面-“三保”保障情况-“三保”支出保障情况
+                    questionList = getQuestList(list, deptAreaCode, QuestionTypeEnum.ENUM2);
+                    score = CollUtils.isNotEmpty(questionList) ? 0D : vo.getMaxScore();
+                    break;
+                case INDICATOR_ITEM11:
+                    // 11:预算管理方面-强化预算约束-存量资金盘活
+                    questionList = getQuestList(list, deptAreaCode,
+                            QuestionTypeEnum.ENUM3);
+                    score = CollUtils.isNotEmpty(questionList) ? -3D : 0D;
+                    break;
+                case INDICATOR_ITEM12:
+                    // 12:预算管理方面-强化预算约束-不得无预算、超预算拨款
+                    questionList = getQuestList(list, deptAreaCode,
+                            QuestionTypeEnum.ENUM4);
+                    score = CollUtils.isNotEmpty(questionList) ? -3D : 0D;
+                    break;
+                case INDICATOR_ITEM13:
+                    // 13:预算执行方面-库款管理-库款保障水平
+                    BigDecimal currentData = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD35);
+                    BigDecimal part1;
+                    BigDecimal part2;
+                    if (currentData.compareTo(BigDecimal.valueOf(0.8D)) < 0) {
+                        BigDecimal add = currentData.subtract(BigDecimal.valueOf(0.8D))
+                                .divide(BigDecimal.valueOf(0.1D), 2, RoundingMode.HALF_UP)
+                                .multiply(BigDecimal.valueOf(0.6D))
+                                .add(BigDecimal.valueOf(4D));
+                        part1 = add.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : add;
+                    } else {
+                        part1 = BigDecimal.valueOf(4D);
+                    }
+                    BigDecimal first = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD36);
+                    BigDecimal second = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD37);
+                    BigDecimal third = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD38);
+                    part2 = first.compareTo(BigDecimal.valueOf(0.3D)) < 0
+                            || second.compareTo(BigDecimal.valueOf(0.3D)) < 0 || third.compareTo(
+                            BigDecimal.valueOf(0.3D)) < 0 ? BigDecimal.ZERO
+                            : BigDecimal.valueOf(2D);
+                    score = part1.add(part2).doubleValue();
+                    break;
+                case INDICATOR_ITEM14:
+                    // 14:预算执行方面-预算执行情况-一般公共预算支出执行率
+                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD15);
+                    deptDivisorValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD14);
+                    score = getScoreByMonth(deptDividendValue, deptDivisorValue, month, vo);
+                    break;
+                case INDICATOR_ITEM15:
+                    // 15:预算执行方面-预算执行情况-政府性基金预算支出执行率
+                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD23);
+                    deptDivisorValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD22);
+                    score = getScoreByMonth(deptDividendValue, deptDivisorValue, month, vo);
+                    break;
+                case INDICATOR_ITEM16:
+                    // 16:预算执行方面-中央直达资金-中央直达资金支付进度
+                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD11);
+                    BigDecimal divided1 = month.divide(BigDecimal.valueOf(12D), 2,
+                            RoundingMode.HALF_UP);
+                    if (deptDividendValue.compareTo(divided1) < 0) {
+                        BigDecimal add = deptDividendValue.subtract(divided1)
+                                .multiply(BigDecimal.valueOf(100D))
+                                .divide(BigDecimal.valueOf(5D), 2,
+                                        RoundingMode.HALF_UP)
+                                .add(BigDecimal.valueOf(vo.getMaxScore()));
+                        score = add.compareTo(BigDecimal.ZERO) < 0 ? 0D : add.doubleValue();
+                    } else {
+                        score = vo.getMaxScore();
+                    }
+                    break;
+                case INDICATOR_ITEM17:
+                    // 17:预算执行方面-中央直达资金-直达资金规范使用
+                    questionList = getQuestList(list, deptAreaCode,
+                            QuestionTypeEnum.ENUM5);
+                    score = CollUtils.isNotEmpty(questionList) ? 0D : vo.getMaxScore();
+                    break;
+                case INDICATOR_ITEM18:
+                    // 18:风险防控方面-暂付款管理-违规新增暂付款
+                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD57);
+                    score = deptDividendValue.compareTo(BigDecimal.ZERO) > 0 ? 0D
+                            : vo.getMaxScore();
+                    break;
+                case INDICATOR_ITEM19:
+                    // 19:风险防控方面-暂付款管理-暂付款累计余额
+                    BigDecimal bk = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD61);
+                    BigDecimal t = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD15);
+                    BigDecimal ab = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD23);
+                    BigDecimal add = t.add(ab.divide(month.multiply(
+                                    BigDecimal.valueOf(12D).multiply(BigDecimal.valueOf(0.05D))), 2,
+                            RoundingMode.HALF_UP));
+                    score = bk.compareTo(add) > 0 ? 0D : vo.getMaxScore();
+                    break;
+                case INDICATOR_ITEM20:
+                    // 20:风险防控方面-暂付款管理-暂付款消化
+                    deptDividendValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD59);
+                    deptDivisorValue = getBigDecimal(deptFieldsMap,
+                            BasicDataFieldEnum.BASIC_DATA_FIELD58);
+                    BigDecimal d1 = deptDividendValue.divide(deptDivisorValue, 2,
+                            RoundingMode.HALF_UP);
+                    BigDecimal d2 = month.divide(BigDecimal.valueOf(12D), 2,
+                            RoundingMode.HALF_UP);
+                    score = d1.compareTo(d2) < 0 ? d1.divide(d2, 2, RoundingMode.HALF_UP)
+                            .multiply(BigDecimal.valueOf(vo.getMaxScore())).doubleValue()
+                            : vo.getMaxScore();
+                    break;
+                case INDICATOR_ITEM21:
+                    // 21:风险防控方面-债务管理-法定债务率
+                    score = getTextFieldScore(deptFieldsMap, BasicDataFieldEnum.BASIC_DATA_FIELD74,
+                            vo);
+                    break;
+                case INDICATOR_ITEM22:
+                    // 22:风险防控方面-债务管理-隐性债务率
+                    score = getTextFieldScore(deptFieldsMap, BasicDataFieldEnum.BASIC_DATA_FIELD76,
+                            vo);
+                    break;
+                case INDICATOR_ITEM23:
+                    // 23:风险防控方面-债务管理-隐性债务化解
+                    questionList = getQuestList(list, deptAreaCode,
+                            QuestionTypeEnum.ENUM6);
+                    score = CollUtils.isNotEmpty(questionList) ? vo.getMaxScore() : -3D;
+                    break;
+                case INDICATOR_ITEM24:
+                    // 24:风险防控方面-债务管理-日常监督发现问题
+                    questionList = getQuestList(list, deptAreaCode,
+                            QuestionTypeEnum.ENUM7);
+                    if (CollUtils.isNotEmpty(questionList)) {
+                        score = -18D + questionList.size() * -1D;
+                    }
+                    break;
+                case INDICATOR_ITEM25:
+                    // 25:风险防控方面-日常监督发现问题
+                    questionList = getQuestList(list, deptAreaCode,
+                            QuestionTypeEnum.ENUM8);
+                    if (CollUtils.isNotEmpty(questionList)) {
+                        score = questionList.size() * -1D;
+                    }
+                    break;
+                default:
+                    // Handle default case if needed
+                    break;
             }
-            TbScore tbScore = new TbScore();
-            tbScore.setScore((double) score);
-            tbScore.setBasicDataId(tbBasicData.getId());
-            tbScore.setBasicDataConfigId(vo.getId());
-            scoreList.add(tbScore);
+            Optional<TbScore> scoreOpt = scoreList.stream()
+                    .filter(s -> s.getBasicDataConfigId().equals(vo.getId()))
+                    .findFirst();
+            if (scoreOpt.isPresent()) {
+                TbScore tbScore = scoreOpt.get();
+                tbScore.setScore(score);
+            } else {
+                TbScore tbScore = new TbScore();
+                tbScore.setScore(score);
+                tbScore.setBasicDataId(tbBasicData.getId());
+                tbScore.setBasicDataConfigId(vo.getId());
+                scoreList.add(tbScore);
+            }
         }
+        if (CollUtils.isNotEmpty(scoreList)) {
+            tbScoreService.saveOrUpdateBatch(scoreList);
+        }
+    }
+
+    private static List<TbQuestion> getQuestList(List<TbQuestion> list, String deptAreaCode,
+            QuestionTypeEnum type) {
+        return list.stream()
+                .filter(q -> q.getDeptAreaCode().equals(deptAreaCode) && q.getType()
+                        .equals(type))
+                .collect(Collectors.toList());
+    }
+
+    private BigDecimal getProvinceBigDecimal(Map<Long, TbBasicDataField> provinceFieldsMap,
+            BasicDataFieldEnum key) {
+        TbBasicDataField tbBasicDataField = provinceFieldsMap.get(key.getCode());
+        if (Objects.isNull(tbBasicDataField)) {
+            throw new ServiceException(
+                    String.format("四川省的字段【%s】的数据缺失,请修改后再试", key.getDesc()));
+        }
+        return BigDecimal.valueOf(Double.parseDouble(tbBasicDataField.getFieldValue()));
+    }
+
+    private BigDecimal getBigDecimal(Map<Long, TbBasicDataField> deptFieldsMap,
+            BasicDataFieldEnum key) {
+        TbBasicDataField tbBasicDataField = deptFieldsMap.get(key.getCode());
+        if (Objects.isNull(tbBasicDataField) || StringUtils.isBlank(
+                tbBasicDataField.getFieldValue())) {
+            throw new ServiceException(
+                    String.format("字段【%s】的数据缺失,请修改后再试", key.getDesc()));
+        }
+
+        return BigDecimal.valueOf(
+                Double.parseDouble(tbBasicDataField.getFieldValue().replace(",", "")));
     }
 
     /**
      * 通用计算公式获取得分
      *
-     * @param deptDividendValueStr     部门被除数字段值
-     * @param deptDivisorValueStr      部门除数字段值
-     * @param provinceDividendValueStr 省份被除数字段值
-     * @param provinceDivisorValueStr  省份除数字段值
-     * @param vo                       基础数据配置
+     * @param deptDividendValue     部门被除数
+     * @param deptDivisorValue      部门除数
+     * @param provinceDividendValue 省份被除数
+     * @param provinceDivisorValue  省份除数
+     * @param vo                    基础数据配置
      * @return 得分
      */
-    private Double getScore(String deptDividendValueStr, String deptDivisorValueStr,
-            String provinceDividendValueStr, String provinceDivisorValueStr, BasicDataConfigVO vo) {
+    private Double getScore(BigDecimal deptDividendValue, BigDecimal deptDivisorValue,
+            BigDecimal provinceDividendValue, BigDecimal provinceDivisorValue,
+            BasicDataConfigVO vo) {
         BigDecimal score = BigDecimal.ZERO;
-        BigDecimal provinceDividendValue = BigDecimal.valueOf(
-                Long.parseLong(provinceDividendValueStr));
-        BigDecimal provinceDivisorValue = BigDecimal.valueOf(
-                Long.parseLong(provinceDivisorValueStr));
-        BigDecimal deptDividendValue = BigDecimal.valueOf(
-                Long.parseLong(deptDividendValueStr));
-        BigDecimal deptDivisorValue = BigDecimal.valueOf(
-                Long.parseLong(deptDivisorValueStr));
         // 开始计算
         BigDecimal deptDivided = BigDecimal.ZERO;
 
@@ -325,6 +558,34 @@
             score = score.compareTo(BigDecimal.ZERO) >= 0 ? score : BigDecimal.ZERO;
         } else {
             score = BigDecimal.valueOf(vo.getMaxScore());
+        }
+        return score.doubleValue();
+    }
+
+    private Double getScore2(BigDecimal deptDividendValue, BigDecimal deptDivisorValue,
+            BigDecimal provinceDividendValue, BigDecimal provinceDivisorValue,
+            BasicDataConfigVO vo) {
+        BigDecimal score = BigDecimal.ZERO;
+        // 开始计算
+        BigDecimal deptDivided = BigDecimal.ZERO;
+
+        if (deptDivisorValue.compareTo(BigDecimal.ZERO) > 0) {
+            deptDivided = deptDividendValue.divide(deptDivisorValue, 2, RoundingMode.HALF_UP);
+        }
+        BigDecimal provinceDivided = BigDecimal.ZERO;
+
+        if (provinceDivisorValue.compareTo(BigDecimal.ZERO) > 0) {
+            provinceDivided = provinceDividendValue.divide(provinceDivisorValue, 2,
+                    RoundingMode.HALF_UP);
+        }
+        if (deptDivided.compareTo(provinceDivided) < 0) {
+
+            score = BigDecimal.valueOf(vo.getMaxScore());
+        } else {
+            score = deptDivided.subtract(provinceDivided)
+                    .multiply(BigDecimal.valueOf(100L))
+                    .add(BigDecimal.valueOf(vo.getMaxScore()));
+            score = score.compareTo(BigDecimal.ZERO) >= 0 ? score : BigDecimal.ZERO;
         }
         return score.doubleValue();
     }
@@ -391,4 +652,130 @@
         }
         return field;
     }
+
+    private Double getScoreByMonth(BigDecimal deptDividendValue, BigDecimal deptDivisorValue,
+            BigDecimal currentMonth, BasicDataConfigVO vo) {
+        double score;
+        BigDecimal divided1 = deptDividendValue.divide(deptDivisorValue, 2,
+                RoundingMode.HALF_UP);
+        BigDecimal divided2 = currentMonth.divide(BigDecimal.valueOf(12D), 2,
+                RoundingMode.HALF_UP);
+        if (divided1.compareTo(
+                currentMonth.divide(BigDecimal.valueOf(12D), 2, RoundingMode.HALF_UP))
+                < 0) {
+            BigDecimal add = divided1.subtract(divided2)
+                    .multiply(BigDecimal.valueOf(100D))
+                    .divide(BigDecimal.valueOf(5D), 2,
+                            RoundingMode.HALF_UP)
+                    .add(BigDecimal.valueOf(vo.getMaxScore()));
+            score = add.compareTo(BigDecimal.ZERO) < 0 ? 0D : add.doubleValue();
+        } else {
+            score = vo.getMaxScore();
+        }
+        return score;
+    }
+
+    private Double getTextFieldScore(Map<Long, TbBasicDataField> deptFieldsMap,
+            BasicDataFieldEnum key,
+            BasicDataConfigVO vo) {
+        double score = 0D;
+        TbBasicDataField tbBasicDataField = deptFieldsMap.get(
+                key.getCode());
+        if (Objects.isNull(tbBasicDataField) || StringUtils.isBlank(
+                tbBasicDataField.getFieldValue())) {
+            throw new ServiceException(String.format("字段【%s】的数据缺失,请修改后再试",
+                    key.getDesc()));
+        }
+        score = tbBasicDataField.getFieldValue().equals("绿") ? vo.getMaxScore()
+                : tbBasicDataField.getFieldValue().equals("黄") ? 6D
+                        : tbBasicDataField.getFieldValue().equals("橙") ? 3D : 0D;
+        return score;
+    }
+
+    @Override
+    public void subtractScoreWithFixedRules(String deptAreaCode) throws Exception {
+        String nowQuarter = DateUtils.getNowQuarter();
+        TbBasicData tbBasicData = tbBasicDataMapper.selectOne(
+                Wrappers.lambdaQuery(TbBasicData.class).eq(TbBasicData::getQuarter, nowQuarter)
+                        .eq(TbBasicData::getDeptAreaCode, deptAreaCode));
+        if (Objects.isNull(tbBasicData)) {
+            return;
+        }
+        List<TbScore> scoreList = tbScoreService.lambdaQuery()
+                .eq(TbScore::getBasicDataId, tbBasicData.getId()).list();
+        List<BasicDataConfigVO> fixedRulesConfigList = tbBasicDataConfigService.getSubsractRulesConfigList();
+        List<TbQuestion> list = tbQuestionMapper.selectList(
+                Wrappers.lambdaQuery(TbQuestion.class)
+                        .eq(TbQuestion::getQuarter, nowQuarter)
+                        .eq(TbQuestion::getDeptAreaCode, deptAreaCode));
+        List<TbQuestion> questionList;
+
+        for (BasicDataConfigVO vo : fixedRulesConfigList) {
+            double score = 0D;
+            switch (Objects.requireNonNull(IndicatorItemEnum.getEnumByCode(vo.getId()))) {
+                case INDICATOR_ITEM5:
+                    // 5: 财政经济形势-重大财税政策落实情况-减税降费落实情况
+                    questionList = getQuestList(list, deptAreaCode,
+                            QuestionTypeEnum.ENUM0);
+                    score = CollUtils.isNotEmpty(questionList) ? -5D : 0D;
+                    break;
+                case INDICATOR_ITEM6:
+                    // 6:财政经济形势-重大财税政策落实情况-其他重大政策落实情况
+                    questionList = getQuestList(list, deptAreaCode,
+                            QuestionTypeEnum.ENUM1);
+                    score = CollUtils.isNotEmpty(questionList) ? questionList.size() * -3D : 0D;
+                    break;
+                case INDICATOR_ITEM11:
+                    // 11:预算管理方面-强化预算约束-存量资金盘活
+                    questionList = getQuestList(list, deptAreaCode,
+                            QuestionTypeEnum.ENUM3);
+                    score = CollUtils.isNotEmpty(questionList) ? -3D : 0D;
+                    break;
+                case INDICATOR_ITEM12:
+                    // 12:预算管理方面-强化预算约束-不得无预算、超预算拨款
+                    questionList = getQuestList(list, deptAreaCode,
+                            QuestionTypeEnum.ENUM4);
+                    score = CollUtils.isNotEmpty(questionList) ? -3D : 0D;
+                    break;
+                case INDICATOR_ITEM23:
+                    // 23:风险防控方面-债务管理-隐性债务化解
+                    questionList = getQuestList(list, deptAreaCode,
+                            QuestionTypeEnum.ENUM6);
+                    score = CollUtils.isNotEmpty(questionList) ? vo.getMaxScore() : -3D;
+                    break;
+                case INDICATOR_ITEM24:
+                    // 24:风险防控方面-债务管理-日常监督发现问题
+                    questionList = getQuestList(list, deptAreaCode,
+                            QuestionTypeEnum.ENUM7);
+                    if (CollUtils.isNotEmpty(questionList)) {
+                        score = -18D + questionList.size() * -1D;
+                    }
+                case INDICATOR_ITEM25:
+                    // 25:风险防控方面-日常监督发现问题
+                    questionList = getQuestList(list, deptAreaCode,
+                            QuestionTypeEnum.ENUM8);
+                    if (CollUtils.isNotEmpty(questionList)) {
+                        score = questionList.size() * -1D;
+                    }
+                    break;
+
+            }
+            Optional<TbScore> scoreOpt = scoreList.stream()
+                    .filter(s -> s.getBasicDataConfigId().equals(vo.getId()))
+                    .findFirst();
+            if (scoreOpt.isPresent()) {
+                TbScore tbScore = scoreOpt.get();
+                tbScore.setScore(score);
+            } else {
+                TbScore tbScore = new TbScore();
+                tbScore.setScore(score);
+                tbScore.setBasicDataId(tbBasicData.getId());
+                tbScore.setBasicDataConfigId(vo.getId());
+                scoreList.add(tbScore);
+            }
+        }
+        if (CollUtils.isNotEmpty(scoreList)) {
+            tbScoreService.saveOrUpdateBatch(scoreList);
+        }
+    }
 }
diff --git a/finance-system/src/main/java/com/finance/system/service/impl/SysUserServiceImpl.java b/finance-system/src/main/java/com/finance/system/service/impl/SysUserServiceImpl.java
index 0bdf529..ce57ad9 100644
--- a/finance-system/src/main/java/com/finance/system/service/impl/SysUserServiceImpl.java
+++ b/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);
+    }
 }
diff --git a/finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataConfigServiceImpl.java b/finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataConfigServiceImpl.java
index 8d7d98d..2334a5b 100644
--- a/finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataConfigServiceImpl.java
+++ b/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)) {
-                c.setBasicDataCategory(tbBasicDataCategory2.getBasicDataCategoryName());
-                TbBasicDataCategory tbBasicDataCategory1 = configCategoryMap.get(
-                        tbBasicDataCategory2.getParentId());
-                if (Objects.nonNull(tbBasicDataCategory1)) {
-                    c.setBasicDataCategoryOne(tbBasicDataCategory1.getBasicDataCategoryName());
+                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());
+                    }
                 }
             }
-            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;
     }
diff --git a/finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataServiceImpl.java b/finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataServiceImpl.java
index 6c97002..984e34b 100644
--- a/finance-system/src/main/java/com/finance/system/service/impl/TbBasicDataServiceImpl.java
+++ b/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,42 +1148,45 @@
         // 保存基础数据动态字段数据
         List<TbBasicDataField> tbBasicDataFields =
                 BeanUtils.copyList(dto.getFields(), TbBasicDataField.class);
-
-        for (TbBasicDataField item : tbBasicDataFields) {
-            TbField tbField = fieldMap.get(item.getFieldId());
-            Integer numMax = tbField.getNumMax();
-            Integer numMin = tbField.getNumMin();
-            Integer textMaxNum = tbField.getTextMaxNum();
-            Integer textMinNum = tbField.getTextMinNum();
-            if (FieldTypeEnum.NUMBER.equals(tbField.getFieldType()) && Objects.nonNull(
-                    numMax) && Objects.nonNull(numMin)) {
-                double fieldValue = Double.parseDouble(item.getFieldValue());
-                if (fieldValue < numMin || fieldValue > numMax) {
-                    throw new ServiceException(
-                            String.format("字段%s的值不在范围%d-%d内", tbField.getFieldName(),
-                                    numMin, numMax));
-                }
-            }
-            if (FieldTypeEnum.TEXT.equals(tbField.getFieldType())
-                    && 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(),
-                                    textMinNum, textMaxNum));
-                }
-            }
-        }
-        tbBasicDataFields.forEach(
-                item -> {
-                    item.setBasicDataId(tbBasicData.getId());
+        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();
+                        Integer textMinNum = tbField.getTextMinNum();
+                        if (FieldTypeEnum.NUMBER.equals(tbField.getFieldType()) && Objects.nonNull(
+                                numMax) && Objects.nonNull(numMin)) {
+                            double fieldValue = Double.parseDouble(item.getFieldValue());
+                            if (fieldValue < numMin || fieldValue > numMax) {
+                                throw new ServiceException(
+                                        String.format("字段%s的值不在范围%d-%d内",
+                                                tbField.getFieldName(),
+                                                numMin, numMax));
+                            }
+                        }
+                        if (FieldTypeEnum.TEXT.equals(tbField.getFieldType())
+                                && 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(),
+                                                textMinNum, textMaxNum));
+                            }
+                        }
+                        item.setBasicDataId(tbBasicData.getId());
                         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);
+    }
 }
diff --git a/finance-system/src/main/java/com/finance/system/service/impl/TbDataScreenConfigServiceImpl.java b/finance-system/src/main/java/com/finance/system/service/impl/TbDataScreenConfigServiceImpl.java
index 8647d2e..6aaa352 100644
--- a/finance-system/src/main/java/com/finance/system/service/impl/TbDataScreenConfigServiceImpl.java
+++ b/finance-system/src/main/java/com/finance/system/service/impl/TbDataScreenConfigServiceImpl.java
@@ -63,20 +63,20 @@
         if (dto.areRiskLevelsDistinct()) {
             throw new ServiceException("得分范围不能重叠");
         }
-        //查询是否有该指标配置
+        // 查询是否有该指标配置
         TbDataScreenConfig tbDataScreenConfig = this.lambdaQuery()
                 .eq(TbDataScreenConfig::getType, DataScreenConfigEnum.RISK_LEVEL)
                 .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;
     }
 
@@ -99,11 +99,11 @@
         if (result) {
             throw new ServiceException("计算表达式有误,请修改");
         }
-        //参数校验
+        // 参数校验
         String numberCalculateFormulaStr = calculateItemList.stream()
                 .map(CalculateItemDTO::getContent)
                 .collect(Collectors.joining());
-        //校验表达式是否正确
+        // 校验表达式是否正确
         try {
             CalculateUtil.calculate(numberCalculateFormulaStr);
         } catch (Exception e) {
@@ -111,7 +111,7 @@
         }
     }
 
-    //表达式校验
+    // 表达式校验
     public boolean hasConsecutiveDuplicates(List<CalculateItemDTO> calculateItemList) {
         return IntStream.range(1, calculateItemList.size())
                 .anyMatch(i -> calculateItemList.get(i - 1).getValueType()
@@ -142,7 +142,7 @@
     public List<DataScreenConfigVO> editDataIndicatorsConfig(List<DataIndicatorsUpdDTO> dtoList) {
         List<DataScreenConfigVO> vosList = new ArrayList<>();
         for (DataIndicatorsUpdDTO dto : dtoList) {
-            //查询是否有该指标配置
+            // 查询是否有该指标配置
             TbDataScreenConfig tbDataScreenConfig = this.lambdaQuery()
                     .eq(TbDataScreenConfig::getType, DataScreenConfigEnum.DATA_INDICATORS)
                     .eq(TbDataScreenConfig::getSubType,
@@ -173,7 +173,7 @@
             List<FormalIndicatorsUpdDTO> dtoList) {
         List<DataScreenConfigVO> vosList = new ArrayList<>();
         for (FormalIndicatorsUpdDTO dto : dtoList) {
-            //查询是否有该指标配置
+            // 查询是否有该指标配置
             TbDataScreenConfig tbDataScreenConfig = this.lambdaQuery()
                     .eq(TbDataScreenConfig::getType, DataScreenConfigEnum.FORMAL_INDICATORS)
                     .eq(TbDataScreenConfig::getSubType,
diff --git a/finance-system/src/main/java/com/finance/system/service/impl/TbDeptServiceImpl.java b/finance-system/src/main/java/com/finance/system/service/impl/TbDeptServiceImpl.java
index f929d61..5b09cdc 100644
--- a/finance-system/src/main/java/com/finance/system/service/impl/TbDeptServiceImpl.java
+++ b/finance-system/src/main/java/com/finance/system/service/impl/TbDeptServiceImpl.java
@@ -84,11 +84,11 @@
     @Transactional(rollbackFor = Exception.class)
     public void importExcel(MultipartFile file) throws Exception {
         ImportParams importParams = new ImportParams();
-        //表格标题行数,默认0
+        // 表格标题行数,默认0
         importParams.setTitleRows(1);
-        //是否需要校验上传的Excel
+        // 是否需要校验上传的Excel
         importParams.setNeedVerify(true);
-        //使用自定义校验规则
+        // 使用自定义校验规则
         importParams.setVerifyHandler(deptVerifyHandler);
         InputStream inputStream = file.getInputStream();
         ExcelImportResult<DeptExcel> result = ExcelImportUtil.importExcelMore(inputStream,
@@ -147,19 +147,19 @@
         Date date = new Date();
         Date quarterStart = DateUtil.beginOfQuarter(date);
         Date quarterEnd = DateUtil.endOfQuarter(date);
-        //判断当前时间是否在季度初1-15号
+        // 判断当前时间是否在季度初1-15号
         Instant instant = quarterStart.toInstant();
         LocalDate quarterStartLocalDate = instant.atZone(ZoneId.systemDefault()).toLocalDate();
         LocalDate fifteenDaysLimit = quarterStartLocalDate.plusDays(14);
         LocalDate now = LocalDate.now();
-        //如果当前时间不在规定范围内:季度初1-15号
+        // 如果当前时间不在规定范围内:季度初1-15号
         if (now.isAfter(quarterStartLocalDate) || now.isBefore(fifteenDaysLimit)) {
-            //查询所有的部门
+            // 查询所有的部门
             List<SysUser> list = sysUserService.lambdaQuery()
                     .eq(SysUser::getUserType, UserTypeEnum.DEPARTMENT.getCode()).list();
             Set<String> deptAreaCodeList = list.stream().map(SysUser::getAreaCode)
                     .collect(Collectors.toSet());
-            //查询当前季度填报了数据的部门
+            // 查询当前季度填报了数据的部门
             List<TbBasicData> filledBasicData = tbBasicDataService.lambdaQuery()
                     .between(TbBasicData::getReportingTime, quarterStartLocalDate, fifteenDaysLimit)
                     .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED).list();
diff --git a/finance-system/src/main/java/com/finance/system/service/impl/TbQuestionServiceImpl.java b/finance-system/src/main/java/com/finance/system/service/impl/TbQuestionServiceImpl.java
index 335f6db..a99170e 100644
--- a/finance-system/src/main/java/com/finance/system/service/impl/TbQuestionServiceImpl.java
+++ b/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;
     }
 }
diff --git a/finance-system/src/main/java/com/finance/system/service/impl/TbScoreServiceImpl.java b/finance-system/src/main/java/com/finance/system/service/impl/TbScoreServiceImpl.java
index d293948..ed22d8b 100644
--- a/finance-system/src/main/java/com/finance/system/service/impl/TbScoreServiceImpl.java
+++ b/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;
@@ -60,7 +62,7 @@
 
     @Override
     public ScoreCalculateDetailVO scoreCalculateDetail(ScoreCalculateDetailQuery query) {
-        //查询计算类型
+        // 查询计算类型
         TbBasicDataConfig config = basicDataConfigService.getById(query.getId());
         if (Objects.isNull(config)) {
             throw new ServiceException("非法参数");
@@ -96,7 +98,7 @@
     @Override
     public ScoreCalculateDetailVO fieldsDetail(CalculateDetailQuery query,
             List<SysUser> countyList) {
-        //查询计算类型
+        // 查询计算类型
         TbBasicDataConfig config = basicDataConfigService.getById(query.getId());
         if (Objects.isNull(config)) {
             throw new ServiceException("非法参数");
@@ -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);
+    }
 }
diff --git a/finance-system/src/main/java/com/finance/system/vo/DataAnalysisVO.java b/finance-system/src/main/java/com/finance/system/vo/DataAnalysisVO.java
index a941a0f..79d5fee 100644
--- a/finance-system/src/main/java/com/finance/system/vo/DataAnalysisVO.java
+++ b/finance-system/src/main/java/com/finance/system/vo/DataAnalysisVO.java
@@ -20,7 +20,7 @@
 
     @ApiModelProperty("区划代码")
     private String areaCode;
-    
+
     @ApiModelProperty("得分")
     private Double score;
 
@@ -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;
 
 }
diff --git a/finance-system/src/main/java/com/finance/system/vo/DeptVO.java b/finance-system/src/main/java/com/finance/system/vo/DeptVO.java
index f4769d1..1304bea 100644
--- a/finance-system/src/main/java/com/finance/system/vo/DeptVO.java
+++ b/finance-system/src/main/java/com/finance/system/vo/DeptVO.java
@@ -1,18 +1,18 @@
 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
  * @date 2024/3/13
  */
 @Data
-@ApiModel(value="部门VO")
+@ApiModel(value = "部门VO")
 public class DeptVO implements Serializable {
 
     private static final long serialVersionUID = 459136043020691805L;
@@ -30,7 +30,7 @@
     private String areaCode;
 
     @ApiModelProperty(value = "级次(省、市、县)")
-    private String areaLevel;
+    private AreaLevelEnum areaLevel;
 
     @ApiModelProperty(value = "县级标志(不包含直辖市的区 0:否 1:是)")
     private DisabledEnum countyFlag;
diff --git a/finance-system/src/main/java/com/finance/system/vo/FieldAndScoreDataVO.java b/finance-system/src/main/java/com/finance/system/vo/FieldAndScoreDataVO.java
index ad2c0c5..5a74699 100644
--- a/finance-system/src/main/java/com/finance/system/vo/FieldAndScoreDataVO.java
+++ b/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;
 }
diff --git a/finance-system/src/main/java/com/finance/system/vo/QuestionVO.java b/finance-system/src/main/java/com/finance/system/vo/QuestionVO.java
index a73af62..ea6e626 100644
--- a/finance-system/src/main/java/com/finance/system/vo/QuestionVO.java
+++ b/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;
diff --git a/finance-system/src/main/java/com/finance/system/vo/RiskMapVO.java b/finance-system/src/main/java/com/finance/system/vo/RiskMapVO.java
index 24d12b4..611739b 100644
--- a/finance-system/src/main/java/com/finance/system/vo/RiskMapVO.java
+++ b/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;
 }
\ No newline at end of file
diff --git a/finance-system/src/main/resources/mapper/system/TbBasicDataMapper.xml b/finance-system/src/main/resources/mapper/system/TbBasicDataMapper.xml
index db7b384..0ab121e 100644
--- a/finance-system/src/main/resources/mapper/system/TbBasicDataMapper.xml
+++ b/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>
diff --git a/finance-system/src/main/resources/mapper/system/TbDataScreenScoreMapper.xml b/finance-system/src/main/resources/mapper/system/TbDataScreenScoreMapper.xml
index 35df15e..c63688a 100644
--- a/finance-system/src/main/resources/mapper/system/TbDataScreenScoreMapper.xml
+++ b/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">
diff --git a/finance-system/src/main/resources/mapper/system/TbScoreMapper.xml b/finance-system/src/main/resources/mapper/system/TbScoreMapper.xml
index f4d2eea..60c0875 100644
--- a/finance-system/src/main/resources/mapper/system/TbScoreMapper.xml
+++ b/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>

--
Gitblit v1.7.1