From ba421d977e745d18a6264353c739bcaaf44c40d6 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期一, 08 四月 2024 18:39:41 +0800
Subject: [PATCH] 历史数据模块接口

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java       |   82 +++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbScoreMapper.java                      |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java       |  242 +++++++----
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbScoreService.java                    |    4 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbDeptController.java               |    3 
 ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/HistoryDataController.java     |   11 
 ruoyi-admin/src/main/resources/mybatis-config.xml                                          |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataConfigServiceImpl.java |    9 
 ruoyi-system/src/main/resources/mapper/system/TbBasicDataMapper.xml                        |   43 +-
 ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java  |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreCalculateQuery.java                 |   33 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/ScoreCalculateVO.java                       |   28 +
 ruoyi-system/src/main/resources/mapper/system/TbQuestionMapper.xml                         |   19 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldController.java              |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbQuestionService.java                 |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/query/SysUserQuery.java                        |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreCalculateDetailQuery.java           |   25 +
 ruoyi-system/src/main/resources/mapper/system/TbBasicDataConfigMapper.xml                  |   44 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/ScoreCalculateDetailVO.java                 |   22 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/ScoreDetailVO.java                          |   19 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbScoreServiceImpl.java           |   32 +
 ruoyi-admin-dept/src/main/resources/mybatis-config.xml                                     |    5 
 ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml                                  |    2 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java                           |   98 ++--
 ruoyi-system/src/main/java/com/ruoyi/system/query/HistoryDataQuery.java                    |   31 +
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataMapper.java                  |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java                |   12 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TbQuestion.java                         |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/query/QuestionQuery.java                       |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbQuestionServiceImpl.java        |    8 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataCategoryController.java  |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/query/HistoryFieldsQuery.java                  |   17 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataConfigService.java          |    5 
 ruoyi-admin-dept/src/main/resources/mybatis/mybatis-config.xml                             |    2 
 ruoyi-common/src/main/java/com/ruoyi/common/validate/HistoryGroup.java                     |    8 
 ruoyi-admin/src/main/resources/application.yml                                             |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsVO.java                        |    5 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataConfigController.java    |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldCategoryController.java      |    2 
 /dev/null                                                                                  |   31 -
 ruoyi-admin-dept/src/main/resources/application.yml                                        |    8 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/CalculateUtil.java                       |   11 
 ruoyi-system/src/main/java/com/ruoyi/system/query/CurrentFieldsQuery.java                  |   18 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/HistoryDataController.java          |  142 +++++++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataConfigMapper.java            |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsDetailVO.java                  |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/QuestionVO.java                             |    4 
 ruoyi-system/src/main/resources/mapper/system/TbScoreMapper.xml                            |   62 +-
 48 files changed, 839 insertions(+), 304 deletions(-)

diff --git a/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java b/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java
index 99a5d3e..f1b72e4 100644
--- a/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java
+++ b/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java
@@ -12,6 +12,7 @@
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -21,7 +22,7 @@
  */
 @Slf4j
 @RestController
-@RequestMapping("/current-quarter")
+@RequestMapping("/current-quarter-dept")
 @RequiredArgsConstructor
 @Api(tags = "当前季度数据相关接口")
 public class CurrentQuarterController {
@@ -107,7 +108,7 @@
      */
     @PostMapping("/page-score")
     @ApiOperation("得分计算分页查询")
-    public R<PageDTO<ScoreVO>> pageScore(@RequestBody ScoreQuery query) {
+    public R<PageDTO<ScoreVO>> pageScore(@Validated @RequestBody ScoreQuery query) {
         try {
             return R.ok(tbBasicDataService.pageScore(query));
         } catch (Exception e) {
diff --git a/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/HistoryDataController.java b/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/HistoryDataController.java
index b20c23a..edad794 100644
--- a/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/HistoryDataController.java
+++ b/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/HistoryDataController.java
@@ -7,7 +7,7 @@
 import com.ruoyi.common.enums.ReportingStatusEnum;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.system.domain.TbBasicData;
-import com.ruoyi.system.dto.HistoryDataQueryDTO;
+import com.ruoyi.system.query.HistoryDataQuery;
 import com.ruoyi.system.query.HistoryScoreQuery;
 import com.ruoyi.system.service.TbBasicDataService;
 import com.ruoyi.system.service.TbFieldService;
@@ -20,6 +20,7 @@
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -28,7 +29,7 @@
  */
 @Slf4j
 @RestController
-@RequestMapping("/history-data")
+@RequestMapping("/history-data-dept")
 @RequiredArgsConstructor
 @Api(tags = "历史数据相关接口")
 public class HistoryDataController {
@@ -45,7 +46,7 @@
      */
     @PostMapping("/list")
     @ApiOperation("历史数据分页查询")
-    public R<PageDTO<BasicDataVO>> list(HistoryDataQueryDTO dto) {
+    public R<PageDTO<BasicDataVO>> list(@Validated @RequestBody HistoryDataQuery dto) {
         String areaCode = SecurityUtils.getLoginUser().getUser().getAreaCode();
         Page<TbBasicData> page = tbBasicDataService.lambdaQuery().eq(TbBasicData::getDeptAreaCode, areaCode)
                 .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED)
@@ -58,7 +59,7 @@
      * @param id 基础数据id
      * @return R<BasicDataFieldVO>
      */
-    @GetMapping("/history-fields")
+    @GetMapping("/fields")
     @ApiOperation("字段查看")
     @ApiImplicitParam(name = "id", value = "基础数据id", required = true, dataType = "int", paramType = "query", dataTypeClass = Long.class)
     public R<BasicDataFieldVO> getHistoryFields(@RequestParam("id") Long id) {
@@ -70,7 +71,7 @@
      * @param query 得分计算条件查询对象
      * @return R<PageDTO < ScoreVO>>
      */
-    @PostMapping("/history-score")
+    @PostMapping("/score")
     @ApiOperation("得分计算")
     public R<PageDTO<ScoreVO>> getHistoryScore(@RequestBody HistoryScoreQuery query) {
         return R.ok(tbScoreService.getHistoryScore(query));
diff --git a/ruoyi-admin-dept/src/main/resources/application.yml b/ruoyi-admin-dept/src/main/resources/application.yml
index 86cae4f..6c2ec50 100644
--- a/ruoyi-admin-dept/src/main/resources/application.yml
+++ b/ruoyi-admin-dept/src/main/resources/application.yml
@@ -122,12 +122,18 @@
 
 mybatis-plus:
   # 此处在多数据源中生效
-  config-location: classpath:/mybatis-config.xml
+  #  config-location: classpath:/mybatis-config.xml
   global-config:
     banner: false
     db-config:
       logic-not-delete-value: 0
       logic-delete-value: 1
+  configuration:
+    map-underscore-to-camel-case: true
+    default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+    cache-enabled: true
+    local-cache-scope: statement
   type-aliases-package: com.ruoyi.**.domain,com.ruoyi.**.vo
   # 指定Mapper文件位置
   mapper-locations: classpath*:mapper/**/*.xml
diff --git a/ruoyi-admin-dept/src/main/resources/mybatis-config.xml b/ruoyi-admin-dept/src/main/resources/mybatis-config.xml
index c9af85f..f7a8772 100644
--- a/ruoyi-admin-dept/src/main/resources/mybatis-config.xml
+++ b/ruoyi-admin-dept/src/main/resources/mybatis-config.xml
@@ -10,7 +10,7 @@
         <setting name="cacheEnabled" value="true"/>
         <!-- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。默认 false  -->
         <!-- <setting name="lazyLoadingEnabled" value="true"/> -->
-        <setting name="mapUnderscoreToCamelCase" value="false"/><!--是否将map下划线方式转为驼峰式命名-->
+        <setting name="mapUnderscoreToCamelCase" value="true"/><!--是否将map下划线方式转为驼峰式命名-->
         <!-- 当开启时,任何方法的调用都会加载该对象的所有属性。默认 false,可通过select标签的 fetchType来覆盖-->
         <!-- <setting name="aggressiveLazyLoading" value="false"/>-->
         <!--  Mybatis 创建具有延迟加载能力的对象所用到的代理工具,默认JAVASSIST -->
@@ -20,7 +20,8 @@
         <!-- STATEMENT级别的缓存,使一级缓存,只针对当前执行的这一statement有效 -->
         <!--<setting name="localCacheScope" value="STATEMENT"/>-->
         <setting name="localCacheScope" value="STATEMENT"/>
-        <setting name="mapUnderscoreToCamelCase" value="true" />
+        <!--开启枚举类自动转换-->
+        <setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
     </settings>
 
 </configuration>
diff --git a/ruoyi-admin-dept/src/main/resources/mybatis/mybatis-config.xml b/ruoyi-admin-dept/src/main/resources/mybatis/mybatis-config.xml
index 1e19c83..68a75af 100644
--- a/ruoyi-admin-dept/src/main/resources/mybatis/mybatis-config.xml
+++ b/ruoyi-admin-dept/src/main/resources/mybatis/mybatis-config.xml
@@ -15,8 +15,6 @@
         <setting name="logImpl"                  value="SLF4J"  />
         <!-- 使用驼峰命名法转换字段 -->
 <!--		 <setting name="mapUnderscoreToCamelCase" value="true"/>-->
-        <!--开启枚举类自动转换-->
-        <setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
 	</settings>
 	
 </configuration>
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java
index 978b174..bb27d80 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java
@@ -4,17 +4,18 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanUtils;
+import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.system.domain.TbQuestion;
-import com.ruoyi.system.dto.CurrentFieldsQueryDTO;
 import com.ruoyi.system.dto.QuestionDTO;
-import com.ruoyi.system.dto.QuestionQueryDTO;
 import com.ruoyi.system.dto.QuestionUpdDto;
+import com.ruoyi.system.query.CurrentFieldsQuery;
+import com.ruoyi.system.query.QuestionQuery;
+import com.ruoyi.system.query.ScoreCalculateDetailQuery;
+import com.ruoyi.system.query.ScoreCalculateQuery;
 import com.ruoyi.system.service.TbBasicDataService;
 import com.ruoyi.system.service.TbQuestionService;
-import com.ruoyi.system.vo.CurrentFieldsAllVO;
-import com.ruoyi.system.vo.CurrentFieldsDetailVO;
-import com.ruoyi.system.vo.CurrentFieldsVO;
-import com.ruoyi.system.vo.QuestionVO;
+import com.ruoyi.system.service.TbScoreService;
+import com.ruoyi.system.vo.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
@@ -36,16 +37,18 @@
 
     private final TbBasicDataService tbBasicDataService;
     private final TbQuestionService tbQuestionService;
+    private final TbScoreService tbScoreService;
 
     /**
-     * 获取基础数据填报相关信息
+     * 字段统计
      *
-     * @return R<BasicDataReportingVO>
+     * @return R<PageDTO < CurrentFieldsVO>>
      */
     @ApiOperation(value = "字段统计", notes = "字段统计")
     @PostMapping("/fields-statics")
-    public R<PageDTO<CurrentFieldsVO>> fieldsStatics(@Validated @RequestBody CurrentFieldsQueryDTO dto) {
+    public R<PageDTO<CurrentFieldsVO>> fieldsStatics(@Validated @RequestBody CurrentFieldsQuery dto) {
         try {
+            dto.setQuarter(DateUtils.getNowQuarter());
             return tbBasicDataService.fieldsStatics(dto);
         } catch (Exception e) {
             log.error("获取字段统计相关信息异常", e);
@@ -54,13 +57,13 @@
     }
 
     /**
-     * 查看详情
+     * 字段统计查看详情
      *
      * @param id 基础数据id
      * @return R<CurrentFieldsDetailVO>
      */
     @GetMapping("/fields-details")
-    @ApiOperation(value = "查看详情", notes = "字段统计")
+    @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 {
@@ -80,7 +83,7 @@
      * @return R<CurrentFieldsAllVO>
      */
     @GetMapping("/fields-statics-all")
-    @ApiOperation(value = "查看全部", notes = "字段统计")
+    @ApiOperation(value = "字段统计-查看全部", notes = "字段统计")
     public R<CurrentFieldsAllVO> fieldsStaticsAll() {
         try {
             return R.ok(tbBasicDataService.fieldsStaticsAll());
@@ -94,13 +97,44 @@
     }
 
     /**
+     * 得分计算
+     *
+     * @param query 当前季度/历史 数据 得分计算条件查询对象
+     * @return R<PageDTO < ScoreCalculateVO>>
+     */
+    @PostMapping("/score-calculate")
+    @ApiOperation("得分计算")
+    public R<PageDTO<ScoreCalculateVO>> scoreCalculate(@Validated @RequestBody ScoreCalculateQuery query) {
+        try {
+            query.setQuarter(DateUtils.getNowQuarter());
+            return R.ok(tbBasicDataService.scoreCalculatePage(query));
+        } catch (Exception e) {
+            log.error("获取得分计算异常", e);
+            return R.fail();
+        }
+    }
+
+    /**
+     * 得分计算查看详情
+     *
+     * @param query 得分计算详情条件查询对象
+     * @return R<ScoreCalculateDetailVO>
+     */
+    @PostMapping("/score-calculate-detail")
+    @ApiOperation("得分计算-查看详情")
+    @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));
+    }
+
+    /**
      * 添加问题
      *
      * @param dto 发现问题数据传输对象
      * @return R<Void>
      */
     @PostMapping("add-question")
-    @ApiOperation(value = "添加问题", notes = "发现问题")
+    @ApiOperation(value = "发现问题-添加问题", notes = "发现问题")
     public R<Void> addQuestion(@Validated @RequestBody QuestionDTO dto) {
         try {
             tbQuestionService.addQuestion(dto);
@@ -114,8 +148,14 @@
         }
     }
 
+    /**
+     * 编辑问题
+     *
+     * @param dto 发现问题编辑数据传输对象
+     * @return R<Void>
+     */
     @PostMapping("/edit-question")
-    @ApiOperation(value = "编辑问题", notes = "发现问题")
+    @ApiOperation(value = "发现问题-编辑问题", notes = "发现问题")
     public R<Void> editQuestion(@Validated @RequestBody QuestionUpdDto dto) {
         try {
             tbQuestionService.editQuestion(dto);
@@ -136,8 +176,8 @@
      * @return R<PageDTO < QuestionVO>>
      */
     @PostMapping("/page-question")
-    @ApiOperation(value = "分页查询问题", notes = "发现问题")
-    public R<PageDTO<QuestionVO>> pageQuestion(@RequestBody QuestionQueryDTO dto) {
+    @ApiOperation(value = "发现问题-分页查询问题", notes = "发现问题")
+    public R<PageDTO<QuestionVO>> pageQuestion(@Validated @RequestBody QuestionQuery dto) {
         return R.ok(tbQuestionService.pageQuestion(dto));
     }
 
@@ -148,14 +188,20 @@
      * @return R<QuestionDTO>
      */
     @GetMapping("/detail-question")
-    @ApiOperation(value = "问题详情", notes = "发现问题")
+    @ApiOperation(value = "发现问题-问题详情", notes = "发现问题")
     public R<QuestionDTO> detailQuestion(@RequestParam("id") Long id) {
         TbQuestion question = tbQuestionService.getById(id);
         return R.ok(BeanUtils.copyBean(question, QuestionDTO.class));
     }
 
+    /**
+     * 删除问题
+     *
+     * @param id 问题id
+     * @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();
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/HistoryDataController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/HistoryDataController.java
new file mode 100644
index 0000000..a7b738b
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/HistoryDataController.java
@@ -0,0 +1,142 @@
+package com.ruoyi.web.controller.api;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.basic.PageDTO;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.enums.ReportingStatusEnum;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.validate.HistoryGroup;
+import com.ruoyi.system.domain.TbBasicData;
+import com.ruoyi.system.query.CurrentFieldsQuery;
+import com.ruoyi.system.query.HistoryDataQuery;
+import com.ruoyi.system.query.ScoreCalculateDetailQuery;
+import com.ruoyi.system.query.ScoreCalculateQuery;
+import com.ruoyi.system.service.TbBasicDataService;
+import com.ruoyi.system.service.TbScoreService;
+import com.ruoyi.system.vo.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * @author mitao
+ * @date 2024/4/8
+ */
+@Slf4j
+@RestController
+@RequestMapping("/history-data")
+@RequiredArgsConstructor
+@Api(tags = "历史数据相关接口")
+public class HistoryDataController {
+    private final TbBasicDataService tbBasicDataService;
+    private final TbScoreService tbScoreService;
+
+    /**
+     * 历史数据分页查询
+     *
+     * @param dto 历史数据查询传输对象
+     * @return R<PageDTO < BasicDataVO>>
+     */
+    @PostMapping("/page-data")
+    @ApiOperation("历史数据分页查询")
+    public R<PageDTO<BasicDataVO>> pageData(@Validated @RequestBody HistoryDataQuery dto) {
+        Date startTime = dto.getStartTime();
+        Date endTime = dto.getEndTime();
+        boolean flag = Objects.nonNull(startTime) && Objects.nonNull(endTime);
+        Page<TbBasicData> page = tbBasicDataService.lambdaQuery()
+                .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED)
+                .between(flag, TbBasicData::getCreateTime, startTime, endTime)
+                .groupBy(TbBasicData::getQuarter)
+                .orderByDesc(TbBasicData::getCreateTime)
+                .page(new Page<>(dto.getPageNum(), dto.getPageSize()));
+        return R.ok(PageDTO.of(page, BasicDataVO.class));
+    }
+
+    /**
+     * 字段统计
+     *
+     * @return R<PageDTO < CurrentFieldsVO>>
+     */
+    @ApiOperation(value = "字段统计", notes = "字段统计")
+    @PostMapping("/fields-statics")
+    public R<PageDTO<CurrentFieldsVO>> historyFieldsStatics(@Validated({HistoryGroup.class}) @RequestBody CurrentFieldsQuery dto) {
+        try {
+            return tbBasicDataService.historyFieldsStatics(dto);
+        } catch (Exception e) {
+            log.error("获取字段统计相关信息异常", e);
+            return R.fail();
+        }
+    }
+
+    /**
+     * 查看详情
+     *
+     * @param id 基础数据id
+     * @return R<CurrentFieldsDetailVO>
+     */
+    @GetMapping("/fields-details")
+    @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);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("保存当前季度数据异常", e);
+            return R.fail();
+        }
+    }
+
+    /**
+     * 查看全部
+     *
+     * @return R<CurrentFieldsAllVO>
+     */
+    @GetMapping("/fields-statics-all")
+    @ApiOperation(value = "查看全部", notes = "字段统计")
+    @ApiImplicitParam(name = "quarter", value = "季度", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class)
+    public R<CurrentFieldsAllVO> fieldsStaticsAll(@RequestParam("quarter") String quarter) {
+        try {
+            return R.ok(tbBasicDataService.fieldsStaticsAll(quarter));
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("查看全部异常", e);
+            return R.fail();
+        }
+    }
+
+    /**
+     * 得分计算
+     *
+     * @param query 得分计算条件查询对象
+     * @return R<PageDTO < ScoreVO>>
+     */
+    @PostMapping("/score-calculate")
+    @ApiOperation("得分计算")
+    public R<PageDTO<ScoreCalculateVO>> scoreCalculate(@Validated({HistoryGroup.class}) @RequestBody ScoreCalculateQuery query) {
+        return R.ok(tbBasicDataService.scoreCalculatePage(query));
+    }
+
+    /**
+     * 得分计算查看详情
+     *
+     * @param query 得分计算详情条件查询对象
+     * @return R<ScoreCalculateDetailVO>
+     */
+    @PostMapping("/score-calculate-detail")
+    @ApiOperation("得分计算-查看详情")
+    public R<ScoreCalculateDetailVO> scoreCalculateDetail(@Validated @RequestBody ScoreCalculateDetailQuery query) {
+        return R.ok(tbScoreService.scoreCalculateDetail(query));
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataCategoryController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataCategoryController.java
index 8fca721..ff94666 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataCategoryController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataCategoryController.java
@@ -144,7 +144,7 @@
      */
     @PostMapping("/page")
     @ApiOperation("分页条件查询")
-    public R<PageDTO<BasicDataCategoryVO>> page(@RequestBody BasicDataCategoryQuery query) {
+    public R<PageDTO<BasicDataCategoryVO>> page(@Validated @RequestBody BasicDataCategoryQuery query) {
         try {
             return R.ok(tbBasicDataCategoryService.queryPage(query));
         } catch (Exception e) {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataConfigController.java
index 8d79f06..a095d17 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataConfigController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataConfigController.java
@@ -169,7 +169,7 @@
      */
     @PostMapping("/page")
     @ApiOperation("分页条件查询")
-    public R<PageDTO<BasicDataConfigVO>> page(@RequestBody BasicDataConfigQuery query) {
+    public R<PageDTO<BasicDataConfigVO>> page(@Validated @RequestBody BasicDataConfigQuery query) {
         try {
             PageDTO<BasicDataConfigVO> basicDataConfigVOPageDTO = tbBasicDataConfigService.queryPage(query);
             return R.ok(basicDataConfigVOPageDTO);
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbDeptController.java
index 3c05ff9..4454b26 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbDeptController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbDeptController.java
@@ -22,6 +22,7 @@
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -101,7 +102,7 @@
      */
     @PostMapping("/page")
     @ApiOperation("分页条件查询")
-    public R<PageDTO<DeptVO>> page(@RequestBody DeptQuery query) {
+    public R<PageDTO<DeptVO>> page(@Validated @RequestBody DeptQuery query) {
         try {
             return R.ok(tbDeptService.queryPage(query));
         } catch (Exception e) {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldCategoryController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldCategoryController.java
index 7205de3..96dd3dd 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldCategoryController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldCategoryController.java
@@ -82,7 +82,7 @@
      */
     @PostMapping("/page")
     @ApiOperation("分页条件查询")
-    public R<PageDTO<FieldCategoryVO>> page(@RequestBody FieldCategoryQuery query) {
+    public R<PageDTO<FieldCategoryVO>> page(@Validated @RequestBody FieldCategoryQuery query) {
         try {
             return R.ok(tbFieldCategoryService.queryPage(query));
         } catch (Exception e) {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldController.java
index f927e35..a2472cc 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldController.java
@@ -140,7 +140,7 @@
      */
     @PostMapping("/page")
     @ApiOperation("分页条件查询")
-    public R<PageDTO<FieldVO>> page(@RequestBody FieldQuery query) {
+    public R<PageDTO<FieldVO>> page(@Validated @RequestBody FieldQuery query) {
         try {
             return R.ok(tbFieldService.queryPage(query));
         } catch (Exception e) {
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 1fc858d..821b2c5 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -122,7 +122,13 @@
 
 mybatis-plus:
   # 此处在多数据源中生效
-  config-location: classpath:/mybatis-config.xml
+  #  config-location: classpath:/mybatis-config.xml
+  configuration:
+    map-underscore-to-camel-case: true
+    default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+    cache-enabled: true
+    local-cache-scope: statement
   global-config:
     banner: false
     db-config:
diff --git a/ruoyi-admin/src/main/resources/mybatis-config.xml b/ruoyi-admin/src/main/resources/mybatis-config.xml
index 7d487eb..f7a8772 100644
--- a/ruoyi-admin/src/main/resources/mybatis-config.xml
+++ b/ruoyi-admin/src/main/resources/mybatis-config.xml
@@ -10,7 +10,7 @@
         <setting name="cacheEnabled" value="true"/>
         <!-- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。默认 false  -->
         <!-- <setting name="lazyLoadingEnabled" value="true"/> -->
-        <setting name="mapUnderscoreToCamelCase" value="false"/><!--是否将map下划线方式转为驼峰式命名-->
+        <setting name="mapUnderscoreToCamelCase" value="true"/><!--是否将map下划线方式转为驼峰式命名-->
         <!-- 当开启时,任何方法的调用都会加载该对象的所有属性。默认 false,可通过select标签的 fetchType来覆盖-->
         <!-- <setting name="aggressiveLazyLoading" value="false"/>-->
         <!--  Mybatis 创建具有延迟加载能力的对象所用到的代理工具,默认JAVASSIST -->
@@ -20,6 +20,8 @@
         <!-- STATEMENT级别的缓存,使一级缓存,只针对当前执行的这一statement有效 -->
         <!--<setting name="localCacheScope" value="STATEMENT"/>-->
         <setting name="localCacheScope" value="STATEMENT"/>
+        <!--开启枚举类自动转换-->
+        <setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
     </settings>
 
 </configuration>
diff --git a/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml b/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml
index 9a8c670..10cf6b0 100644
--- a/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml
+++ b/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml
@@ -15,8 +15,6 @@
         <setting name="logImpl"                  value="SLF4J"  />
         <!-- 使用驼峰命名法转换字段 -->
 		 <setting name="mapUnderscoreToCamelCase" value="true"/>
-        <!--开启枚举类自动转换-->
-        <setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
 	</settings>
 	
 </configuration>
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/CalculateUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/CalculateUtil.java
index 300eb79..369136a 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/CalculateUtil.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/CalculateUtil.java
@@ -12,7 +12,7 @@
  * @date 2024/3/27
  */
 public class CalculateUtil {
-    public static Map<String,Integer> getFieldsAndValue(String rule) {
+    public static Map<String, Integer> getFieldsAndValue(String rule) {
         // 正则表达式模式,匹配形如 "fieldName:value" 的字符串
         Pattern pattern = Pattern.compile("\\b(\\w+)_(\\d+)\\b");
         Matcher matcher = pattern.matcher(rule);
@@ -21,11 +21,12 @@
         while (matcher.find()) {
             String fieldName = matcher.group(1);
             int value = Integer.parseInt(matcher.group(2));
-            map.put(fieldName+"_"+value, value);
+            map.put(fieldName + "_" + value, value);
         }
         return map;
     }
-    public static double calculate(String expression,Map<String,Object> value) {
+
+    public static double calculate(String expression, Map<String, Object> value) {
         expression = formatExpression(expression);
         // 创建 JEXL 引擎
         JexlEngine jexl = new JexlBuilder().create();
@@ -35,7 +36,7 @@
         // 创建上下文
         JexlContext context = new MapContext();
         for (Map.Entry<String, Object> stringObjectEntry : value.entrySet()) {
-            context.set(stringObjectEntry.getKey(),stringObjectEntry.getValue());
+            context.set(stringObjectEntry.getKey(), stringObjectEntry.getValue());
         }
         // 执行计算
         Object result = exp.evaluate(context);
@@ -51,7 +52,7 @@
                 .replaceAll("÷", "/")
                 .replaceAll("(", "(")
                 .replaceAll(")", ")")
-                .replaceAll("+","+")
+                .replaceAll("+", "+")
                 .replaceAll("-", "-");
     }
 }
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
index 01b986b..bee7671 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
@@ -1,5 +1,7 @@
 package com.ruoyi.common.utils;
 
+import org.apache.commons.lang3.time.DateFormatUtils;
+
 import java.lang.management.ManagementFactory;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -10,15 +12,12 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.commons.lang3.time.DateFormatUtils;
-
 /**
  * 时间工具类
- * 
+ *
  * @author ruoyi
  */
-public class DateUtils extends org.apache.commons.lang3.time.DateUtils
-{
+public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
     public static String YYYY = "yyyy";
 
     public static String YYYY_MM = "yyyy-MM";
@@ -30,63 +29,52 @@
     public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
 
     private static String[] parsePatterns = {
-            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", 
+            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
             "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
             "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
 
     /**
      * 获取当前Date型日期
-     * 
+     *
      * @return Date() 当前日期
      */
-    public static Date getNowDate()
-    {
+    public static Date getNowDate() {
         return new Date();
     }
 
     /**
      * 获取当前日期, 默认格式为yyyy-MM-dd
-     * 
+     *
      * @return String
      */
-    public static String getDate()
-    {
+    public static String getDate() {
         return dateTimeNow(YYYY_MM_DD);
     }
 
-    public static final String getTime()
-    {
+    public static final String getTime() {
         return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
     }
 
-    public static final String dateTimeNow()
-    {
+    public static final String dateTimeNow() {
         return dateTimeNow(YYYYMMDDHHMMSS);
     }
 
-    public static final String dateTimeNow(final String format)
-    {
+    public static final String dateTimeNow(final String format) {
         return parseDateToStr(format, new Date());
     }
 
-    public static final String dateTime(final Date date)
-    {
+    public static final String dateTime(final Date date) {
         return parseDateToStr(YYYY_MM_DD, date);
     }
 
-    public static final String parseDateToStr(final String format, final Date date)
-    {
+    public static final String parseDateToStr(final String format, final Date date) {
         return new SimpleDateFormat(format).format(date);
     }
 
-    public static final Date dateTime(final String format, final String ts)
-    {
-        try
-        {
+    public static final Date dateTime(final String format, final String ts) {
+        try {
             return new SimpleDateFormat(format).parse(ts);
-        }
-        catch (ParseException e)
-        {
+        } catch (ParseException e) {
             throw new RuntimeException(e);
         }
     }
@@ -94,8 +82,7 @@
     /**
      * 日期路径 即年/月/日 如2018/08/08
      */
-    public static final String datePath()
-    {
+    public static final String datePath() {
         Date now = new Date();
         return DateFormatUtils.format(now, "yyyy/MM/dd");
     }
@@ -103,8 +90,7 @@
     /**
      * 日期路径 即年/月/日 如20180808
      */
-    public static final String dateTime()
-    {
+    public static final String dateTime() {
         Date now = new Date();
         return DateFormatUtils.format(now, "yyyyMMdd");
     }
@@ -112,18 +98,13 @@
     /**
      * 日期型字符串转化为日期 格式
      */
-    public static Date parseDate(Object str)
-    {
-        if (str == null)
-        {
+    public static Date parseDate(Object str) {
+        if (str == null) {
             return null;
         }
-        try
-        {
+        try {
             return parseDate(str.toString(), parsePatterns);
-        }
-        catch (ParseException e)
-        {
+        } catch (ParseException e) {
             return null;
         }
     }
@@ -131,8 +112,7 @@
     /**
      * 获取服务器启动时间
      */
-    public static Date getServerStartDate()
-    {
+    public static Date getServerStartDate() {
         long time = ManagementFactory.getRuntimeMXBean().getStartTime();
         return new Date(time);
     }
@@ -140,20 +120,18 @@
     /**
      * 计算相差天数
      */
-    public static int differentDaysByMillisecond(Date date1, Date date2)
-    {
+    public static int differentDaysByMillisecond(Date date1, Date date2) {
         return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
     }
 
     /**
      * 计算时间差
      *
-     * @param endDate 最后时间
+     * @param endDate   最后时间
      * @param startTime 开始时间
      * @return 时间差(天/小时/分钟)
      */
-    public static String timeDistance(Date endDate, Date startTime)
-    {
+    public static String timeDistance(Date endDate, Date startTime) {
         long nd = 1000 * 24 * 60 * 60;
         long nh = 1000 * 60 * 60;
         long nm = 1000 * 60;
@@ -174,8 +152,7 @@
     /**
      * 增加 LocalDateTime ==> Date
      */
-    public static Date toDate(LocalDateTime temporalAccessor)
-    {
+    public static Date toDate(LocalDateTime temporalAccessor) {
         ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
         return Date.from(zdt.toInstant());
     }
@@ -183,8 +160,7 @@
     /**
      * 增加 LocalDate ==> Date
      */
-    public static Date toDate(LocalDate temporalAccessor)
-    {
+    public static Date toDate(LocalDate temporalAccessor) {
         LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
         ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
         return Date.from(zdt.toInstant());
@@ -250,6 +226,7 @@
         calendar.setTime(date);
         return calendar.get(Calendar.MONTH) / 3 + 1;
     }
+
     /**
      * 指定日期所在季度的第一天/最后一天时间
      *
@@ -374,4 +351,19 @@
         return LocalDate.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
     }
 
+    /**
+     * 获取当前季度字符串
+     *
+     * @return
+     * @throws Exception
+     */
+    public static String getNowQuarter() throws Exception {
+        //当前所在季度
+        Date date = new Date();
+        int quarterOfYear = getQuarterOfYear(date);
+        String quarterOfYearStr = null;
+        quarterOfYearStr = NumberDisplaceChineseUtil.numberToChinese(quarterOfYear);
+        LocalDate now = LocalDate.now();
+        return String.format("%s年%s季度", now.getYear(), quarterOfYearStr);
+    }
 }
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/validate/HistoryGroup.java b/ruoyi-common/src/main/java/com/ruoyi/common/validate/HistoryGroup.java
new file mode 100644
index 0000000..1ac9397
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/validate/HistoryGroup.java
@@ -0,0 +1,8 @@
+package com.ruoyi.common.validate;
+
+/**
+ * @author mitao
+ * @date 2024/4/8
+ */
+public interface HistoryGroup {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbQuestion.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbQuestion.java
index 81c05b5..f3aa3aa 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbQuestion.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbQuestion.java
@@ -37,6 +37,10 @@
     @TableField("content")
     private String content;
 
+    @ApiModelProperty(value = "季度")
+    @TableField("quarter")
+    private String quarter;
+
     @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)")
     @TableField("del_flag")
     @TableLogic
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/HistoryDataQueryDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/HistoryDataQueryDTO.java
deleted file mode 100644
index 6c3c98f..0000000
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/HistoryDataQueryDTO.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.ruoyi.system.dto;
-
-import com.ruoyi.common.core.domain.BasePage;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.util.Date;
-
-/**
- * @author mitao
- * @date 2024/4/3
- */
-@Data
-@ApiModel(value = "历史数据查询传输对象")
-@EqualsAndHashCode(callSuper = true)
-public class HistoryDataQueryDTO extends BasePage {
-
-    private static final long serialVersionUID = -4384424407387142261L;
-
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @ApiModelProperty("开始时间")
-    private Date startTime;
-
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @ApiModelProperty("结束时间")
-    private Date endTime;
-}
-
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataConfigMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataConfigMapper.java
index ce20c7a..35e7d83 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataConfigMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataConfigMapper.java
@@ -1,7 +1,11 @@
 package com.ruoyi.system.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.system.domain.TbBasicDataConfig;
+import com.ruoyi.system.query.ScoreCalculateQuery;
+import com.ruoyi.system.vo.ScoreCalculateVO;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -13,4 +17,5 @@
  */
 public interface TbBasicDataConfigMapper extends BaseMapper<TbBasicDataConfig> {
 
+    Page<ScoreCalculateVO> scoreCalculatePage(@Param("query") ScoreCalculateQuery query, @Param("page") Page<ScoreCalculateVO> page);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataMapper.java
index ee6f9fe..6203e47 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataMapper.java
@@ -3,7 +3,7 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.system.domain.TbBasicData;
-import com.ruoyi.system.dto.CurrentFieldsQueryDTO;
+import com.ruoyi.system.query.CurrentFieldsQuery;
 import com.ruoyi.system.vo.CurrentFieldsVO;
 import org.apache.ibatis.annotations.Param;
 
@@ -17,5 +17,5 @@
  */
 public interface TbBasicDataMapper extends BaseMapper<TbBasicData> {
 
-    Page<CurrentFieldsVO> fieldsStatics(@Param("page") Page<CurrentFieldsVO> page, @Param("dto") CurrentFieldsQueryDTO dto, @Param("nowQuarter") String nowQuarter);
+    Page<CurrentFieldsVO> fieldsStatics(@Param("page") Page<CurrentFieldsVO> page, @Param("dto") CurrentFieldsQuery dto);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbScoreMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbScoreMapper.java
index cc895cd..d8c74aa 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbScoreMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbScoreMapper.java
@@ -3,7 +3,9 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.system.domain.TbScore;
+import com.ruoyi.system.query.ScoreCalculateDetailQuery;
 import com.ruoyi.system.query.ScoreQuery;
+import com.ruoyi.system.vo.ScoreDetailVO;
 import com.ruoyi.system.vo.ScoreVO;
 import org.apache.ibatis.annotations.Param;
 
@@ -18,4 +20,6 @@
 public interface TbScoreMapper extends BaseMapper<TbScore> {
 
     Page<ScoreVO> pageScore(@Param("query") ScoreQuery query, @Param("page") Page<ScoreVO> page);
+
+    Page<ScoreDetailVO> scoreCalculateDetail(@Param("query") ScoreCalculateDetailQuery query, @Param("page") Page<ScoreDetailVO> page);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/CurrentFieldsQueryDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/CurrentFieldsQuery.java
similarity index 61%
copy from ruoyi-system/src/main/java/com/ruoyi/system/dto/CurrentFieldsQueryDTO.java
copy to ruoyi-system/src/main/java/com/ruoyi/system/query/CurrentFieldsQuery.java
index 3bf01f3..c4e2ae9 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/CurrentFieldsQueryDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/CurrentFieldsQuery.java
@@ -1,11 +1,14 @@
-package com.ruoyi.system.dto;
+package com.ruoyi.system.query;
 
 import com.ruoyi.common.core.domain.BasePage;
 import com.ruoyi.common.enums.ReportingStatusEnum;
+import com.ruoyi.common.validate.HistoryGroup;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
 
 /**
  * @author mitao
@@ -13,15 +16,24 @@
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "当前季度字段统计查询数据传输对象")
-public class CurrentFieldsQueryDTO extends BasePage {
+@ApiModel(value = "字段统计查询数据传输对象")
+public class CurrentFieldsQuery extends BasePage {
+
     private static final long serialVersionUID = 3808984599047049282L;
+
+    @ApiModelProperty(value = "季度", notes = "当前季度数据不传,历史数据必传")
+    @NotBlank(message = "季度不能为空", groups = {HistoryGroup.class})
+    private String quarter;
+
     @ApiModelProperty(value = "填报部门")
     private String areaName;
+
     @ApiModelProperty(value = "状态")
     private ReportingStatusEnum status;
+
     @ApiModelProperty(value = "负责人姓名")
     private String personInCharge;
+
     @ApiModelProperty(value = "负责人联系电话)")
     private String phoneNumber;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/HistoryDataQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/HistoryDataQuery.java
new file mode 100644
index 0000000..a9681c6
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/HistoryDataQuery.java
@@ -0,0 +1,31 @@
+package com.ruoyi.system.query;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * @author mitao
+ * @date 2024/4/3
+ */
+@Data
+@ApiModel(value = "历史数据条件查询对象")
+@EqualsAndHashCode(callSuper = true)
+public class HistoryDataQuery extends BasePage {
+
+    private static final long serialVersionUID = -4384424407387142261L;
+
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty("开始时间")
+    private Date startTime;
+
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty("结束时间")
+    private Date endTime;
+}
+
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/CurrentFieldsQueryDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/HistoryFieldsQuery.java
similarity index 69%
rename from ruoyi-system/src/main/java/com/ruoyi/system/dto/CurrentFieldsQueryDTO.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/query/HistoryFieldsQuery.java
index 3bf01f3..dde1032 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/CurrentFieldsQueryDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/HistoryFieldsQuery.java
@@ -1,4 +1,4 @@
-package com.ruoyi.system.dto;
+package com.ruoyi.system.query;
 
 import com.ruoyi.common.core.domain.BasePage;
 import com.ruoyi.common.enums.ReportingStatusEnum;
@@ -7,21 +7,32 @@
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import javax.validation.constraints.NotBlank;
+
 /**
  * @author mitao
  * @date 2024/4/7
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "当前季度字段统计查询数据传输对象")
-public class CurrentFieldsQueryDTO extends BasePage {
+@ApiModel(value = "历史数据字段统计条件查询对象")
+public class HistoryFieldsQuery extends BasePage {
+
     private static final long serialVersionUID = 3808984599047049282L;
+
+    @ApiModelProperty(value = "季度")
+    @NotBlank(message = "季度不能为空")
+    private String quarter;
+
     @ApiModelProperty(value = "填报部门")
     private String areaName;
+
     @ApiModelProperty(value = "状态")
     private ReportingStatusEnum status;
+
     @ApiModelProperty(value = "负责人姓名")
     private String personInCharge;
+
     @ApiModelProperty(value = "负责人联系电话)")
     private String phoneNumber;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionQueryDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/QuestionQuery.java
similarity index 74%
rename from ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionQueryDTO.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/query/QuestionQuery.java
index 66d08ad..3d87273 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionQueryDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/QuestionQuery.java
@@ -1,4 +1,4 @@
-package com.ruoyi.system.dto;
+package com.ruoyi.system.query;
 
 import com.ruoyi.common.core.domain.BasePage;
 import io.swagger.annotations.ApiModel;
@@ -12,8 +12,8 @@
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "发现问题分页数据传输对象")
-public class QuestionQueryDTO extends BasePage {
+@ApiModel(value = "发现问题分页条件查询对象")
+public class QuestionQuery extends BasePage {
     private static final long serialVersionUID = -7645166269898895715L;
     @ApiModelProperty("问题标题")
     private String title;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreCalculateDetailQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreCalculateDetailQuery.java
new file mode 100644
index 0000000..af6a8b0
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreCalculateDetailQuery.java
@@ -0,0 +1,25 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author mitao
+ * @date 2024/4/8
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("得分计算详情条件查询对象")
+public class ScoreCalculateDetailQuery extends BasePage {
+
+    private static final long serialVersionUID = -4875926880229775128L;
+
+    @ApiModelProperty(value = "计算类型id")
+    private Long id;
+
+    @ApiModelProperty(value = "部门名称")
+    private String areaName;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreCalculateQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreCalculateQuery.java
new file mode 100644
index 0000000..48fc202
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreCalculateQuery.java
@@ -0,0 +1,33 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import com.ruoyi.common.enums.FieldTypeEnum;
+import com.ruoyi.common.validate.HistoryGroup;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author mitao
+ * @date 2024/3/27
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("得分计算条件查询对象")
+public class ScoreCalculateQuery extends BasePage {
+
+    private static final long serialVersionUID = -1055887500656271053L;
+
+    @ApiModelProperty(value = "季度", notes = "当前季度数据不传,历史数据必传")
+    @NotBlank(message = "季度不能为空", groups = {HistoryGroup.class})
+    private String quarter;
+
+    @ApiModelProperty(value = "类型名称")
+    private String typeName;
+
+    @ApiModelProperty(value = "计算方式")
+    private FieldTypeEnum type;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/SysUserQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/SysUserQuery.java
index 8b44716..f0310c4 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/SysUserQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/SysUserQuery.java
@@ -9,6 +9,8 @@
 @ApiModel(value = "账户列表query")
 public class SysUserQuery extends BasePage {
 
+    private static final long serialVersionUID = 3174324251882921880L;
+
     @ApiModelProperty(value = "姓名")
     private String nickName;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataConfigService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataConfigService.java
index 6078ba6..8aa6f57 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataConfigService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataConfigService.java
@@ -1,5 +1,6 @@
 package com.ruoyi.system.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.system.domain.TbBasicDataConfig;
@@ -7,8 +8,10 @@
 import com.ruoyi.system.dto.ShowHideDTO;
 import com.ruoyi.system.dto.update.BasicDataConfigUpdateDTO;
 import com.ruoyi.system.query.BasicDataConfigQuery;
+import com.ruoyi.system.query.ScoreCalculateQuery;
 import com.ruoyi.system.vo.BasicDataConfigDetailVO;
 import com.ruoyi.system.vo.BasicDataConfigVO;
+import com.ruoyi.system.vo.ScoreCalculateVO;
 
 /**
  * <p>
@@ -31,4 +34,6 @@
     PageDTO<BasicDataConfigVO> queryPage(BasicDataConfigQuery query);
 
     void showHide(ShowHideDTO dto);
+
+    Page<ScoreCalculateVO> scoreCalculatePage(ScoreCalculateQuery query, Page<ScoreCalculateVO> page);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java
index 86bbc69..4756baa 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java
@@ -5,7 +5,8 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.system.domain.TbBasicData;
 import com.ruoyi.system.dto.BasicDataDTO;
-import com.ruoyi.system.dto.CurrentFieldsQueryDTO;
+import com.ruoyi.system.query.CurrentFieldsQuery;
+import com.ruoyi.system.query.ScoreCalculateQuery;
 import com.ruoyi.system.query.ScoreQuery;
 import com.ruoyi.system.vo.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -32,8 +33,13 @@
 
     R<CurrentFieldsDetailVO> fieldsDetails(Long id);
 
-    R<PageDTO<CurrentFieldsVO>> fieldsStatics(CurrentFieldsQueryDTO dto);
+    R<PageDTO<CurrentFieldsVO>> fieldsStatics(CurrentFieldsQuery dto) throws Exception;
 
-    CurrentFieldsAllVO fieldsStaticsAll();
+    CurrentFieldsAllVO fieldsStaticsAll() throws Exception;
 
+    R<PageDTO<CurrentFieldsVO>> historyFieldsStatics(CurrentFieldsQuery dto);
+
+    PageDTO<ScoreCalculateVO> scoreCalculatePage(ScoreCalculateQuery query);
+
+    CurrentFieldsAllVO fieldsStaticsAll(String quarter);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbQuestionService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbQuestionService.java
index fdf7f5f..1c90d7d 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbQuestionService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbQuestionService.java
@@ -4,8 +4,8 @@
 import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.system.domain.TbQuestion;
 import com.ruoyi.system.dto.QuestionDTO;
-import com.ruoyi.system.dto.QuestionQueryDTO;
 import com.ruoyi.system.dto.QuestionUpdDto;
+import com.ruoyi.system.query.QuestionQuery;
 import com.ruoyi.system.vo.QuestionVO;
 
 /**
@@ -18,9 +18,9 @@
  */
 public interface TbQuestionService extends IService<TbQuestion> {
 
-    void addQuestion(QuestionDTO dto);
+    void addQuestion(QuestionDTO dto) throws Exception;
 
     void editQuestion(QuestionUpdDto dto);
 
-    PageDTO<QuestionVO> pageQuestion(QuestionQueryDTO dto);
+    PageDTO<QuestionVO> pageQuestion(QuestionQuery dto);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbScoreService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbScoreService.java
index d5a6f47..4044bcc 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbScoreService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbScoreService.java
@@ -5,7 +5,9 @@
 import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.system.domain.TbScore;
 import com.ruoyi.system.query.HistoryScoreQuery;
+import com.ruoyi.system.query.ScoreCalculateDetailQuery;
 import com.ruoyi.system.query.ScoreQuery;
+import com.ruoyi.system.vo.ScoreCalculateDetailVO;
 import com.ruoyi.system.vo.ScoreVO;
 
 /**
@@ -21,4 +23,6 @@
     Page<ScoreVO> pageScore(ScoreQuery query, Page<ScoreVO> page);
 
     PageDTO<ScoreVO> getHistoryScore(HistoryScoreQuery query);
+
+    ScoreCalculateDetailVO scoreCalculateDetail(ScoreCalculateDetailQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataConfigServiceImpl.java
index 5a7ece4..c47c155 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataConfigServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataConfigServiceImpl.java
@@ -21,11 +21,13 @@
 import com.ruoyi.system.mapper.TbBasicDataConfigMapper;
 import com.ruoyi.system.mapper.TbFieldMapper;
 import com.ruoyi.system.query.BasicDataConfigQuery;
+import com.ruoyi.system.query.ScoreCalculateQuery;
 import com.ruoyi.system.service.TbBasicDataConfigDetailService;
 import com.ruoyi.system.service.TbBasicDataConfigService;
 import com.ruoyi.system.vo.BasicDataConfigDetailVO;
 import com.ruoyi.system.vo.BasicDataConfigVO;
 import com.ruoyi.system.vo.CalculateVO;
+import com.ruoyi.system.vo.ScoreCalculateVO;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -158,6 +160,11 @@
                 throw new ServiceException(String.format("字段“%s”已被隐藏,请重新配置后再次操作!", fieldNames));
             }
         }
-        this.lambdaUpdate().set( TbBasicDataConfig::getStatus, dto.getStatus()).eq(TbBasicDataConfig::getId, dto.getId()).update();
+        this.lambdaUpdate().set(TbBasicDataConfig::getStatus, dto.getStatus()).eq(TbBasicDataConfig::getId, dto.getId()).update();
+    }
+
+    @Override
+    public Page<ScoreCalculateVO> scoreCalculatePage(ScoreCalculateQuery query, Page<ScoreCalculateVO> page) {
+        return baseMapper.scoreCalculatePage(query, page);
     }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java
index cbb4220..0100e39 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java
@@ -15,12 +15,13 @@
 import com.ruoyi.common.utils.*;
 import com.ruoyi.system.domain.*;
 import com.ruoyi.system.dto.BasicDataDTO;
-import com.ruoyi.system.dto.CurrentFieldsQueryDTO;
 import com.ruoyi.system.handler.CustomerHandler;
 import com.ruoyi.system.handler.SelectedSheetWriteHandler;
 import com.ruoyi.system.listener.BasicDataListener;
 import com.ruoyi.system.mapper.TbBasicDataMapper;
 import com.ruoyi.system.mapper.TbDeptMapper;
+import com.ruoyi.system.query.CurrentFieldsQuery;
+import com.ruoyi.system.query.ScoreCalculateQuery;
 import com.ruoyi.system.query.ScoreQuery;
 import com.ruoyi.system.service.*;
 import com.ruoyi.system.utils.FieldBuildUtil;
@@ -84,10 +85,7 @@
         if (Objects.isNull(dept)) {
             throw new ServiceException(String.format("区划代码%s不存在", deptAreaCode));
         }
-        //当前所在季度
         Date date = new Date();
-        int quarterOfYear = DateUtils.getQuarterOfYear(date);
-        String quarterOfYearStr = NumberDisplaceChineseUtil.numberToChinese(quarterOfYear);
         Map<String, Date> quarterDate = DateUtils.getQuarterDate(date);
         //当前季度开始
         Date quarterStart = quarterDate.get("first");
@@ -98,16 +96,16 @@
         LocalDate quarterStartLocalDate = instant.atZone(ZoneId.systemDefault()).toLocalDate();
         LocalDate fifteenDaysLimit = quarterStartLocalDate.plusDays(15);
         LocalDate now = LocalDate.now();
-        vo.setQuarter(String.format("%s年%s季度",now.getYear(),quarterOfYearStr));
+        vo.setQuarter(DateUtils.getNowQuarter());
         vo.setStatus(ReportingStatusEnum.UNFILLED);
         //如果当前时间不在规定范围内:季度初1-15号
         if (now.isBefore(quarterStartLocalDate) || now.isAfter(fifteenDaysLimit)) {
-            return R.ok(vo,"请于季度初1-15号上传季度数据。");
+            return R.ok(vo, "请于季度初1-15号上传季度数据。");
         }
         //查询是否有当前季度的填报记录
         TbBasicData basicData = this.getOne(Wrappers.<TbBasicData>lambdaQuery()
                 .eq(TbBasicData::getDeptAreaCode, dept.getAreaCode())
-                .between(TbBasicData::getCreateTime, quarterStart,quarterEnd));
+                .between(TbBasicData::getCreateTime, quarterStart, quarterEnd));
         //查询需要填写的字段
         List<TbField> list = tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
         List<FieldsTreeVO> roots = new ArrayList<>();
@@ -122,7 +120,7 @@
         roots.add(fieldsTreeVO);
         roots.add(fieldsTreeVO2);
         if (CollUtils.isNotEmpty(list)) {
-            FieldBuildUtil.buildTreeFromTbFieldList(list,roots);
+            FieldBuildUtil.buildTreeFromTbFieldList(list, roots);
             FieldsTreeVO remark = new FieldsTreeVO();
             remark.setId(-3L);
             remark.setName("备注");
@@ -130,10 +128,10 @@
             vo.setFields(roots);
         }
         if (Objects.isNull(basicData)) {
-            vo.setQuarter(String.format("%s年%s季度",now.getYear(),quarterOfYearStr));
+            vo.setQuarter(DateUtils.getNowQuarter());
             vo.setStatus(ReportingStatusEnum.UNFILLED);
             return R.ok(vo);
-        }else {
+        } else {
             vo.setStatus(basicData.getStatus());
             //查询已填报数据 包含数据缺失和已填报
             List<TbBasicDataField> basicDataFields = tbBasicDataFieldService.lambdaQuery()
@@ -197,7 +195,7 @@
         Set<Long> fieldIds = fieldList.stream().map(TbField::getId).collect(Collectors.toSet());
         //用户填写的动态字段
         Set<Long> deptFieldIds = tbBasicDataFields.stream().map(TbBasicDataField::getFieldId).collect(Collectors.toSet());
-        boolean flag = deptFieldIds.containsAll(fieldIds) && (StringUtils.isNotEmpty(dto.getTransferPaymentScale())&& StringUtils.isNotEmpty(dto.getCurrentGdp()));
+        boolean flag = deptFieldIds.containsAll(fieldIds) && (StringUtils.isNotEmpty(dto.getTransferPaymentScale()) && StringUtils.isNotEmpty(dto.getCurrentGdp()));
         if (flag) {
             tbBasicData.setStatus(ReportingStatusEnum.FILLED);
             this.updateById(tbBasicData);
@@ -241,7 +239,8 @@
 
     /**
      * 根据字段名获取该字段下标
-     * @param list 表头
+     *
+     * @param list  表头
      * @param value 字段名
      * @return 下标
      */
@@ -257,10 +256,6 @@
     private List<List<Object>> dataList(List<TbField> list) throws Exception {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         String areaName = loginUser.getUser().getAreaName();
-
-        //当前所在季度
-        int quarterOfYear = DateUtils.getQuarterOfYear(new Date());
-        String quarterOfYearStr = NumberDisplaceChineseUtil.numberToChinese(quarterOfYear);
         List<List<Object>> excellist = new ArrayList<List<Object>>();
         List<List<String>> head = head(list);
         List<Object> columnNo = Lists.newArrayList("栏号");
@@ -268,7 +263,7 @@
             columnNo.add(String.valueOf(i));
         }
         excellist.add(columnNo);
-        excellist.add(Lists.newArrayList(areaName, String.format("%s季度",quarterOfYearStr)));
+        excellist.add(Lists.newArrayList(areaName, DateUtils.getNowQuarter()));
         return excellist;
     }
 
@@ -279,12 +274,12 @@
         headTitles.add(Lists.newArrayList("填报季度"));
         headTitles.add(Lists.newArrayList("转移支付规模"));
         headTitles.add(Lists.newArrayList("当期GDP"));
-        list.forEach(item ->{
+        list.forEach(item -> {
             String levelOneCategory = item.getLevelOneCategory();
             String levelTwoCategory = item.getLevelTwoCategory();
             String levelThreeCategory = item.getLevelThreeCategory();
             String fieldName = item.getFieldName();
-            headTitles.add(Lists.newArrayList(levelOneCategory,StringUtils.isBlank(levelTwoCategory) ? fieldName : levelTwoCategory, StringUtils.isBlank(levelThreeCategory) ? fieldName : levelThreeCategory, fieldName));
+            headTitles.add(Lists.newArrayList(levelOneCategory, StringUtils.isBlank(levelTwoCategory) ? fieldName : levelTwoCategory, StringUtils.isBlank(levelThreeCategory) ? fieldName : levelThreeCategory, fieldName));
         });
         headTitles.add(Lists.newArrayList("备注"));
         return headTitles;
@@ -297,9 +292,9 @@
         String areaCode = loginUser.getUser().getAreaCode();
         //查询需要填写的动态字段
         List<TbField> fieldList = tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
-        EasyExcel.read(file.getInputStream(), new BasicDataListener(this,fieldList,
-                tbFieldService,areaCode,tbBasicDataFieldService,tbBasicDataConfigService,
-                tbBasicDataConfigDetailService,tbScoreService)).sheet().doRead();
+        EasyExcel.read(file.getInputStream(), new BasicDataListener(this, fieldList,
+                tbFieldService, areaCode, tbBasicDataFieldService, tbBasicDataConfigService,
+                tbBasicDataConfigDetailService, tbScoreService)).sheet().doRead();
     }
 
     private void calculateScore(TbBasicData tbBasicData) {
@@ -388,13 +383,13 @@
         //查询是否有当前季度的填报记录
         TbBasicData basicData = this.getOne(Wrappers.<TbBasicData>lambdaQuery()
                 .eq(TbBasicData::getDeptAreaCode, areaCode)
-                .between(TbBasicData::getCreateTime, quarterStart,quarterEnd));
+                .between(TbBasicData::getCreateTime, quarterStart, quarterEnd));
         if (Objects.isNull(basicData)) {
             return PageDTO.empty(page);
         }
         query.setBasicDataId(basicData.getId());
         //查询对应的基础数据配置
-        Page<ScoreVO> pageVO = tbScoreService.pageScore(query,page);
+        Page<ScoreVO> pageVO = tbScoreService.pageScore(query, page);
         return PageDTO.of(pageVO);
     }
 
@@ -457,25 +452,14 @@
     }
 
     @Override
-    public R<PageDTO<CurrentFieldsVO>> fieldsStatics(CurrentFieldsQueryDTO dto) {
+    public R<PageDTO<CurrentFieldsVO>> fieldsStatics(CurrentFieldsQuery dto) throws Exception {
         Page<CurrentFieldsVO> page = new Page<>(dto.getPageNum(), dto.getPageSize());
-        //当前所在季度
-        Date date = new Date();
-        int quarterOfYear = DateUtils.getQuarterOfYear(date);
-        String quarterOfYearStr = null;
-        try {
-            quarterOfYearStr = NumberDisplaceChineseUtil.numberToChinese(quarterOfYear);
-            LocalDate now = LocalDate.now();
-            String nowQuarter = String.format("%s年%s季度", now.getYear(), quarterOfYearStr);
-            return R.ok(PageDTO.of(baseMapper.fieldsStatics(page, dto, nowQuarter)));
-        } catch (Exception e) {
-            log.error("查询失败", e);
-            return R.fail("查询失败");
-        }
+        String nowQuarter = DateUtils.getNowQuarter();
+        return R.ok(PageDTO.of(baseMapper.fieldsStatics(page, dto)));
     }
 
     @Override
-    public CurrentFieldsAllVO fieldsStaticsAll() {
+    public CurrentFieldsAllVO fieldsStaticsAll() throws Exception {
         CurrentFieldsAllVO vo = new CurrentFieldsAllVO();
         List<FieldsTreeVO> roots = new ArrayList<>();
         //获取表头
@@ -492,61 +476,147 @@
         currentGdp.setName("当期GDP");
         roots.add(area);
         roots.add(quarter);
+        roots.add(transferPaymentScale);
         roots.add(currentGdp);
+        //查询当前季度填写字段
+        List<TbField> fieldList = tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
+        FieldBuildUtil.buildTreeFromTbFieldList(fieldList, roots);
+        FieldsTreeVO remark = new FieldsTreeVO();
+        remark.setCategory(Boolean.FALSE);
+        remark.setName("备注");
+        roots.add(remark);
+        vo.setFields(roots);
+        String nowQuarter = DateUtils.getNowQuarter();
+        //查询上报的基础数据
+        List<TbBasicData> basicDataList = this.lambdaQuery()
+                .eq(TbBasicData::getQuarter, nowQuarter)
+                .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED)
+                .list();
+        if (CollUtils.isNotEmpty(basicDataList)) {
+            Set<String> areaCodeList = basicDataList.stream()
+                    .map(TbBasicData::getDeptAreaCode)
+                    .collect(Collectors.toSet());
+            Map<String, SysUser> userMap = sysUserService.lambdaQuery()
+                    .in(SysUser::getAreaCode, areaCodeList)
+                    .list()
+                    .stream()
+                    .collect(Collectors.toMap(SysUser::getAreaCode, e -> e));
+            Set<Long> basicDataIds = basicDataList.stream().map(TbBasicData::getId).collect(Collectors.toSet());
+            Map<Long, TbBasicDataField> basicDataFieldMap = tbBasicDataFieldService.lambdaQuery()
+                    .in(TbBasicDataField::getBasicDataId, basicDataIds).list().stream()
+                    .collect(Collectors.toMap(TbBasicDataField::getFieldId, e -> e));
+            //值
+            List<Object> result = new ArrayList<>();
+            for (TbBasicData tbBasicData : basicDataList) {
+                SysUser user = userMap.get(tbBasicData.getDeptAreaCode());
+                List<String> item = new ArrayList<>();
+                item.add(Objects.nonNull(user) ? user.getAreaName() : "");
+                item.add(tbBasicData.getQuarter());
+                item.add(tbBasicData.getTransferPaymentScale());
+                item.add(tbBasicData.getCurrentGdp());
+                for (TbField tbField : fieldList) {
+                    TbBasicDataField tbBasicDataField = basicDataFieldMap.get(tbField.getId());
+                    item.add(Objects.nonNull(tbBasicDataField) ? FieldBuildUtil.formatNumberWithCommas(tbBasicDataField.getFieldValue()) : "");
+                }
+                item.add(tbBasicData.getRemark());
+                result.add(item);
+            }
+            vo.setValue(result);
+        }
+        return vo;
+    }
+
+    @Override
+    public R<PageDTO<CurrentFieldsVO>> historyFieldsStatics(CurrentFieldsQuery dto) {
+        Page<CurrentFieldsVO> page = new Page<>(dto.getPageNum(), dto.getPageSize());
         //当前所在季度
-        Date date = new Date();
-        int quarterOfYear = DateUtils.getQuarterOfYear(date);
-        try {
-            //查询当前季度填写字段
-            List<TbField> fieldList = tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
-            FieldBuildUtil.buildTreeFromTbFieldList(fieldList, roots);
+        return R.ok(PageDTO.of(baseMapper.fieldsStatics(page, dto)));
+    }
+
+    @Override
+    public PageDTO<ScoreCalculateVO> scoreCalculatePage(ScoreCalculateQuery query) {
+        Page<ScoreCalculateVO> page = new Page<>(query.getPageNum(), query.getPageSize());
+        Page<ScoreCalculateVO> pageVO = tbBasicDataConfigService.scoreCalculatePage(query, page);
+        return PageDTO.of(pageVO);
+    }
+
+    @Override
+    public CurrentFieldsAllVO fieldsStaticsAll(String quarterStr) {
+        CurrentFieldsAllVO vo = new CurrentFieldsAllVO();
+        List<FieldsTreeVO> roots = new ArrayList<>();
+        //获取表头
+        FieldsTreeVO area = new FieldsTreeVO();
+        area.setCategory(Boolean.FALSE);
+        area.setName("地区");
+        FieldsTreeVO quarter = new FieldsTreeVO();
+        quarter.setCategory(Boolean.FALSE);
+        quarter.setName("填报季度");
+        FieldsTreeVO transferPaymentScale = new FieldsTreeVO();
+        transferPaymentScale.setName("转移支付规模");
+        FieldsTreeVO currentGdp = new FieldsTreeVO();
+        currentGdp.setCategory(Boolean.FALSE);
+        currentGdp.setName("当期GDP");
+        roots.add(area);
+        roots.add(quarter);
+        roots.add(transferPaymentScale);
+        roots.add(currentGdp);
+        List<TbBasicData> basicDataList = this.lambdaQuery()
+                .eq(TbBasicData::getQuarter, quarterStr)
+                .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED)
+                .list();
+        if (CollUtils.isNotEmpty(basicDataList)) {
+            throw new ServiceException("非法参数");
+        }
+        Long basicDataId = basicDataList.get(0).getId();
+        Set<Long> fieldIds = tbBasicDataFieldService.lambdaQuery()
+                .eq(TbBasicDataField::getBasicDataId, basicDataId)
+                .ne(TbBasicDataField::getFieldId, -1L)
+                .ne(TbBasicDataField::getFieldId, -2L)
+                .list().stream().map(TbBasicDataField::getFieldId).collect(Collectors.toSet());
+        List<TbField> fieldList = tbFieldService.lambdaQuery().in(TbField::getId, fieldIds).list();
+        if (CollUtils.isEmpty(fieldList)) {
             FieldsTreeVO remark = new FieldsTreeVO();
             remark.setCategory(Boolean.FALSE);
             remark.setName("备注");
             roots.add(remark);
             vo.setFields(roots);
-            String quarterOfYearStr = NumberDisplaceChineseUtil.numberToChinese(quarterOfYear);
-            String nowQuarter = String.format("%s年%s季度", LocalDate.now().getYear(), quarterOfYearStr);
-            //查询上报的基础数据
-            List<TbBasicData> basicDataList = this.lambdaQuery()
-                    .eq(TbBasicData::getQuarter, nowQuarter)
-                    .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED)
-                    .list();
-            if (CollUtils.isNotEmpty(basicDataList)) {
-                Set<String> areaCodeList = basicDataList.stream()
-                        .map(TbBasicData::getDeptAreaCode)
-                        .collect(Collectors.toSet());
-                Map<String, SysUser> userMap = sysUserService.lambdaQuery()
-                        .in(SysUser::getAreaCode, areaCodeList)
-                        .list()
-                        .stream()
-                        .collect(Collectors.toMap(SysUser::getAreaCode, e -> e));
-                Set<Long> basicDataIds = basicDataList.stream().map(TbBasicData::getId).collect(Collectors.toSet());
-                Map<Long, TbBasicDataField> basicDataFieldMap = tbBasicDataFieldService.lambdaQuery()
-                        .in(TbBasicDataField::getBasicDataId, basicDataIds).list().stream()
-                        .collect(Collectors.toMap(TbBasicDataField::getFieldId, e -> e));
-                //值
-                List<Object> result = new ArrayList<>();
-                for (TbBasicData tbBasicData : basicDataList) {
-                    SysUser user = userMap.get(tbBasicData.getDeptAreaCode());
-                    List<String> item = new ArrayList<>();
-                    item.add(Objects.nonNull(user) ? user.getAreaName() : "");
-                    item.add(tbBasicData.getQuarter());
-                    item.add(tbBasicData.getTransferPaymentScale());
-                    item.add(tbBasicData.getCurrentGdp());
-                    for (TbField tbField : fieldList) {
-                        TbBasicDataField tbBasicDataField = basicDataFieldMap.get(tbField.getId());
-                        item.add(Objects.nonNull(tbBasicDataField) ? FieldBuildUtil.formatNumberWithCommas(tbBasicDataField.getFieldValue()) : "");
-                    }
-                    item.add(tbBasicData.getRemark());
-                    result.add(item);
-                }
-                vo.setValue(result);
-            }
             return vo;
-        } catch (Exception e) {
-            log.error("查询失败", e);
-            throw new ServiceException("查询失败");
         }
+        FieldBuildUtil.buildTreeFromTbFieldList(fieldList, roots);
+        FieldsTreeVO remark = new FieldsTreeVO();
+        remark.setCategory(Boolean.FALSE);
+        remark.setName("备注");
+        roots.add(remark);
+        vo.setFields(roots);
+        Set<String> areaCodeList = basicDataList.stream()
+                .map(TbBasicData::getDeptAreaCode)
+                .collect(Collectors.toSet());
+        Map<String, SysUser> userMap = sysUserService.lambdaQuery()
+                .in(SysUser::getAreaCode, areaCodeList)
+                .list()
+                .stream()
+                .collect(Collectors.toMap(SysUser::getAreaCode, e -> e));
+        Set<Long> basicDataIds = basicDataList.stream().map(TbBasicData::getId).collect(Collectors.toSet());
+        Map<Long, TbBasicDataField> basicDataFieldMap = tbBasicDataFieldService.lambdaQuery()
+                .in(TbBasicDataField::getBasicDataId, basicDataIds).list().stream()
+                .collect(Collectors.toMap(TbBasicDataField::getFieldId, e -> e));
+        //值
+        List<Object> result = new ArrayList<>();
+        for (TbBasicData tbBasicData : basicDataList) {
+            SysUser user = userMap.get(tbBasicData.getDeptAreaCode());
+            List<String> item = new ArrayList<>();
+            item.add(Objects.nonNull(user) ? user.getAreaName() : "");
+            item.add(tbBasicData.getQuarter());
+            item.add(tbBasicData.getTransferPaymentScale());
+            item.add(tbBasicData.getCurrentGdp());
+            for (TbField tbField : fieldList) {
+                TbBasicDataField tbBasicDataField = basicDataFieldMap.get(tbField.getId());
+                item.add(Objects.nonNull(tbBasicDataField) ? FieldBuildUtil.formatNumberWithCommas(tbBasicDataField.getFieldValue()) : "");
+            }
+            item.add(tbBasicData.getRemark());
+            result.add(item);
+        }
+        vo.setValue(result);
+        return vo;
     }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbQuestionServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbQuestionServiceImpl.java
index d66f98e..761ed2e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbQuestionServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbQuestionServiceImpl.java
@@ -4,12 +4,13 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.common.utils.BeanUtils;
+import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.domain.TbQuestion;
 import com.ruoyi.system.dto.QuestionDTO;
-import com.ruoyi.system.dto.QuestionQueryDTO;
 import com.ruoyi.system.dto.QuestionUpdDto;
 import com.ruoyi.system.mapper.TbQuestionMapper;
+import com.ruoyi.system.query.QuestionQuery;
 import com.ruoyi.system.service.TbQuestionService;
 import com.ruoyi.system.vo.QuestionVO;
 import org.springframework.stereotype.Service;
@@ -26,8 +27,9 @@
 public class TbQuestionServiceImpl extends ServiceImpl<TbQuestionMapper, TbQuestion> implements TbQuestionService {
 
     @Override
-    public void addQuestion(QuestionDTO dto) {
+    public void addQuestion(QuestionDTO dto) throws Exception {
         TbQuestion tbQuestion = BeanUtils.copyBean(dto, TbQuestion.class);
+        tbQuestion.setQuarter(DateUtils.getNowQuarter());
         this.save(tbQuestion);
     }
 
@@ -38,7 +40,7 @@
     }
 
     @Override
-    public PageDTO<QuestionVO> pageQuestion(QuestionQueryDTO dto) {
+    public PageDTO<QuestionVO> pageQuestion(QuestionQuery dto) {
         Page<TbQuestion> page = this.lambdaQuery()
                 .like(StringUtils.isNotBlank(dto.getTitle()), TbQuestion::getTitle, dto.getTitle())
                 .page(new Page<>(dto.getPageNum(), dto.getPageSize()));
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbScoreServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbScoreServiceImpl.java
index 1b5cf69..0a9446b 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbScoreServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbScoreServiceImpl.java
@@ -3,14 +3,24 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.basic.PageDTO;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanUtils;
+import com.ruoyi.system.domain.TbBasicDataConfig;
 import com.ruoyi.system.domain.TbScore;
 import com.ruoyi.system.mapper.TbScoreMapper;
 import com.ruoyi.system.query.HistoryScoreQuery;
+import com.ruoyi.system.query.ScoreCalculateDetailQuery;
 import com.ruoyi.system.query.ScoreQuery;
+import com.ruoyi.system.service.TbBasicDataConfigService;
 import com.ruoyi.system.service.TbScoreService;
+import com.ruoyi.system.vo.ScoreCalculateDetailVO;
+import com.ruoyi.system.vo.ScoreDetailVO;
 import com.ruoyi.system.vo.ScoreVO;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+
+import java.util.Objects;
 
 /**
  * <p>
@@ -20,12 +30,15 @@
  * @author mitao
  * @since 2024-03-13
  */
+@Slf4j
 @Service
+@RequiredArgsConstructor
 public class TbScoreServiceImpl extends ServiceImpl<TbScoreMapper, TbScore> implements TbScoreService {
+    private final TbBasicDataConfigService basicDataConfigService;
 
     @Override
     public Page<ScoreVO> pageScore(ScoreQuery query, Page<ScoreVO> page) {
-        return baseMapper.pageScore(query,page);
+        return baseMapper.pageScore(query, page);
     }
 
     @Override
@@ -34,4 +47,21 @@
         Page<ScoreVO> scoreVOPage = baseMapper.pageScore(scoreQuery, new Page<>(query.getPageNum(), query.getPageSize()));
         return PageDTO.of(scoreVOPage);
     }
+
+    @Override
+    public ScoreCalculateDetailVO scoreCalculateDetail(ScoreCalculateDetailQuery query) {
+        //查询计算类型
+        TbBasicDataConfig config = basicDataConfigService.getById(query.getId());
+        if (Objects.isNull(config)) {
+            throw new ServiceException("非法参数");
+        }
+        ScoreCalculateDetailVO vo = new ScoreCalculateDetailVO();
+        vo.setTypeName(config.getTypeName());
+        vo.setCalculateType(config.getCalculateType());
+        Page<ScoreDetailVO> page = new Page<>(query.getPageNum(), query.getPageSize());
+
+        Page<ScoreDetailVO> pageVO = baseMapper.scoreCalculateDetail(query, page);
+        vo.setVo(PageDTO.of(pageVO));
+        return vo;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsDetailVO.java
index 3a74279..7af6de8 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsDetailVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsDetailVO.java
@@ -1,6 +1,7 @@
 package com.ruoyi.system.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.ruoyi.common.enums.ReportingStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -31,6 +32,7 @@
 
     @ApiModelProperty(value = "填报时间")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
+    @JsonInclude(JsonInclude.Include.ALWAYS)
     private Date createTime;
 
     @ApiModelProperty(value = "状态")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsVO.java
index 1fc2bba..d60c4c6 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsVO.java
@@ -1,6 +1,7 @@
 package com.ruoyi.system.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.ruoyi.common.enums.ReportingStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -14,12 +15,13 @@
  * @date 2024/4/7
  */
 @Data
-@ApiModel(value = "当前季度数据-字段统计视图对象")
+@ApiModel(value = "当前季度/历史 数据-字段统计视图对象")
 public class CurrentFieldsVO implements Serializable {
 
     private static final long serialVersionUID = 8678843789669990102L;
 
     @ApiModelProperty(value = "基础数据id")
+    @JsonInclude(JsonInclude.Include.ALWAYS)
     private Long id;
 
     @ApiModelProperty(value = "季度")
@@ -36,6 +38,7 @@
 
     @ApiModelProperty(value = "填报时间")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
+    @JsonInclude(JsonInclude.Include.ALWAYS)
     private Date createTime;
 
     @ApiModelProperty(value = "状态")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/QuestionVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/QuestionVO.java
index c5f5188..87eb6b9 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/QuestionVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/QuestionVO.java
@@ -1,7 +1,9 @@
 package com.ruoyi.system.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -10,6 +12,8 @@
  * @author mitao
  * @date 2024/4/7
  */
+@Data
+@ApiModel(value = "问题视图对象")
 public class QuestionVO implements Serializable {
 
     private static final long serialVersionUID = -7560198211729183682L;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ScoreCalculateDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ScoreCalculateDetailVO.java
new file mode 100644
index 0000000..617868c
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ScoreCalculateDetailVO.java
@@ -0,0 +1,22 @@
+package com.ruoyi.system.vo;
+
+import com.ruoyi.common.basic.PageDTO;
+import com.ruoyi.common.enums.CalculateTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author mitao
+ * @date 2024/4/8
+ */
+@Data
+@ApiModel(value = "问题视图对象")
+public class ScoreCalculateDetailVO {
+    @ApiModelProperty("得分记录")
+    PageDTO<ScoreDetailVO> vo;
+    @ApiModelProperty("类型名称")
+    private String typeName;
+    @ApiModelProperty("计算方式")
+    private CalculateTypeEnum calculateType;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ScoreCalculateVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ScoreCalculateVO.java
new file mode 100644
index 0000000..4c7cb39
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ScoreCalculateVO.java
@@ -0,0 +1,28 @@
+package com.ruoyi.system.vo;
+
+import com.ruoyi.common.enums.CalculateTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author mitao
+ * @date 2024/4/8
+ */
+@Data
+@ApiModel(value = "得分计算视图对象")
+public class ScoreCalculateVO implements Serializable {
+
+    private static final long serialVersionUID = -3494443292552087083L;
+
+    @ApiModelProperty(value = "计算类型id")
+    private Long id;
+
+    @ApiModelProperty("类型名称")
+    private String typeName;
+
+    @ApiModelProperty("计算方式")
+    private CalculateTypeEnum calculateType;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ScoreDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ScoreDetailVO.java
new file mode 100644
index 0000000..5372844
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ScoreDetailVO.java
@@ -0,0 +1,19 @@
+package com.ruoyi.system.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ScoreDetailVO {
+    @ApiModelProperty(value = "填报部门")
+    private String areaName;
+
+    @ApiModelProperty(value = "负责人姓名")
+    private String personInCharge;
+
+    @ApiModelProperty(value = "负责人联系电话)")
+    private String phoneNumber;
+
+    @ApiModelProperty("得分")
+    private Double score;
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/TbBasicDataConfigMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TbBasicDataConfigMapper.xml
index a18d386..7944fab 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TbBasicDataConfigMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TbBasicDataConfigMapper.xml
@@ -4,24 +4,42 @@
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.ruoyi.system.domain.TbBasicDataConfig">
-        <id column="id" property="id" />
-        <result column="basic_data_category_id" property="basicDataCategoryId" />
-        <result column="type_name" property="typeName" />
-        <result column="field_description" property="fieldDescription" />
-        <result column="calculate_type" property="calculateType" />
-        <result column="number_calculate_formula" property="numberCalculateFormula" />
-        <result column="field_id_str" property="fieldIdStr" />
-        <result column="status" property="status" />
-        <result column="del_flag" property="delFlag" />
-        <result column="create_by" property="createBy" />
-        <result column="create_time" property="createTime" />
-        <result column="update_by" property="updateBy" />
-        <result column="update_time" property="updateTime" />
+        <id column="id" property="id"/>
+        <result column="basic_data_category_id" property="basicDataCategoryId"/>
+        <result column="type_name" property="typeName"/>
+        <result column="field_description" property="fieldDescription"/>
+        <result column="calculate_type" property="calculateType"/>
+        <result column="number_calculate_formula" property="numberCalculateFormula"/>
+        <result column="field_id_str" property="fieldIdStr"/>
+        <result column="status" property="status"/>
+        <result column="del_flag" property="delFlag"/>
+        <result column="create_by" property="createBy"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_by" property="updateBy"/>
+        <result column="update_time" property="updateTime"/>
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
         id, basic_data_category_id, type_name, field_description, calculate_type, number_calculate_formula, field_id_str, status, del_flag, create_by, create_time, update_by, update_time
     </sql>
+    <select id="scoreCalculatePage" resultType="com.ruoyi.system.vo.ScoreCalculateVO">
+        SELECT tdc.id,
+        tdc.type_name,
+        tdc.calculate_type
+        FROM tb_score ts
+        LEFT JOIN tb_basic_data tbd ON ts.basic_data_id = tbd.id
+        LEFT JOIN tb_basic_data_config tdc ON ts.basic_data_config_id = tdc.id
+        <where>
+            tbd.`quarter` = #{query.quarter}
+            <if test="query.typeName !=null and query.typeName != ''">
+                AND tdc.type_name LIKE CONCAT('%',#{query.typeName},'%')
+            </if>
+            <if test="query.type !=null">
+                AND tdc.calculate_type LIKE CONCAT('%',#{query.type},'%')
+            </if>
+        </where>
+        GROUP BY tdc.type_name
+    </select>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TbBasicDataMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TbBasicDataMapper.xml
index b3738eb..3e4e7d0 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TbBasicDataMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TbBasicDataMapper.xml
@@ -4,18 +4,18 @@
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.ruoyi.system.domain.TbBasicData">
-        <id column="id" property="id" />
-        <result column="quarter" property="quarter" />
-        <result column="dept_area_code" property="deptAreaCode" />
-        <result column="transfer_payment_scale" property="transferPaymentScale" />
-        <result column="current_gdp" property="currentGdp" />
-        <result column="remark" property="remark" />
-        <result column="status" property="status" />
-        <result column="del_flag" property="delFlag" />
-        <result column="create_by" property="createBy" />
-        <result column="create_time" property="createTime" />
-        <result column="update_by" property="updateBy" />
-        <result column="update_time" property="updateTime" />
+        <id column="id" property="id"/>
+        <result column="quarter" property="quarter"/>
+        <result column="dept_area_code" property="deptAreaCode"/>
+        <result column="transfer_payment_scale" property="transferPaymentScale"/>
+        <result column="current_gdp" property="currentGdp"/>
+        <result column="remark" property="remark"/>
+        <result column="status" property="status"/>
+        <result column="del_flag" property="delFlag"/>
+        <result column="create_by" property="createBy"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_by" property="updateBy"/>
+        <result column="update_time" property="updateTime"/>
     </resultMap>
 
     <!-- 通用查询结果列 -->
@@ -24,6 +24,7 @@
     </sql>
     <select id="fieldsStatics" resultType="com.ruoyi.system.vo.CurrentFieldsVO">
         SELECT
+        tbd.id,
         su.area_name,
         IF(tbd.`quarter` IS NULL, CONCAT(YEAR(NOW()), '年',
         CASE
@@ -37,24 +38,22 @@
         tbd.create_time,
         COALESCE(tbd.`status`, 1) AS `status`
         FROM
-        (SELECT * FROM sys_user WHERE user_type = 2) su
+        (SELECT * FROM sys_user WHERE user_type = 2) AS su
         LEFT JOIN
-        (SELECT * FROM tb_basic_data WHERE `quarter` = #{nowQuarter}) tbd ON su.area_code = tbd.dept_area_code
+        (SELECT * FROM tb_basic_data WHERE `quarter` = #{dto.quarter}) AS tbd ON su.area_code = tbd.dept_area_code
         <where>
-            <if test="nowQuarter != null and nowQuarter !=''">
-                tbd.quarter LIKE CONCAT('%',#{nowQuarter},'%')
-            </if>
+            tbd.quarter = #{dto.quarter}
             <if test="dto.areaName != null and dto.areaName !=''">
-                su.area_name LIKE CONCAT('%',#{dto.areaName},'%')
+                AND su.area_name LIKE CONCAT('%',#{dto.areaName},'%')
             </if>
-            <if test="dto.status != null and dto.status !=''">
-                tbd.status = #{dto.status}
+            <if test="dto.status != null">
+                AND tbd.status = #{dto.status}
             </if>
             <if test="dto.personInCharge != null and dto.personInCharge !=''">
-                su.person_in_charge LIKE CONCAT('%',#{dto.personInCharge},'%')
+                AND su.person_in_charge LIKE CONCAT('%',#{dto.personInCharge},'%')
             </if>
             <if test="dto.phoneNumber != null and dto.phoneNumber != ''">
-                su.phone_number LIKE CONCAT('%',#{dto.phoneNumber},'%')
+                AND su.phone_number LIKE CONCAT('%',#{dto.phoneNumber},'%')
             </if>
         </where>
     </select>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TbQuestionMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TbQuestionMapper.xml
index 48e10cd..2ac0c79 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TbQuestionMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TbQuestionMapper.xml
@@ -4,19 +4,20 @@
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.ruoyi.system.domain.TbQuestion">
-        <id column="id" property="id" />
-        <result column="title" property="title" />
-        <result column="content" property="content" />
-        <result column="del_flag" property="delFlag" />
-        <result column="create_by" property="createBy" />
-        <result column="create_time" property="createTime" />
-        <result column="update_by" property="updateBy" />
-        <result column="update_time" property="updateTime" />
+        <id column="id" property="id"/>
+        <result column="title" property="title"/>
+        <result column="content" property="content"/>
+        <result column="del_flag" property="delFlag"/>
+        <result column="quarter" property="quarter"/>
+        <result column="create_by" property="createBy"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_by" property="updateBy"/>
+        <result column="update_time" property="updateTime"/>
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, title, content, del_flag, create_by, create_time, update_by, update_time
+        id, title, content, del_flag,`quarter`, create_by, create_time, update_by, update_time
     </sql>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TbScoreMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TbScoreMapper.xml
index da9b730..c2766c7 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TbScoreMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TbScoreMapper.xml
@@ -4,15 +4,15 @@
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.ruoyi.system.domain.TbScore">
-        <id column="id" property="id" />
-        <result column="basic_data_config_id" property="basicDataConfigId" />
-        <result column="basic_data_id" property="basicDataId" />
-        <result column="score" property="score" />
-        <result column="del_flag" property="delFlag" />
-        <result column="create_by" property="createBy" />
-        <result column="create_time" property="createTime" />
-        <result column="update_by" property="updateBy" />
-        <result column="update_time" property="updateTime" />
+        <id column="id" property="id"/>
+        <result column="basic_data_config_id" property="basicDataConfigId"/>
+        <result column="basic_data_id" property="basicDataId"/>
+        <result column="score" property="score"/>
+        <result column="del_flag" property="delFlag"/>
+        <result column="create_by" property="createBy"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_by" property="updateBy"/>
+        <result column="update_time" property="updateTime"/>
     </resultMap>
 
     <!-- 通用查询结果列 -->
@@ -21,23 +21,39 @@
     </sql>
     <select id="pageScore" resultType="com.ruoyi.system.vo.ScoreVO">
         SELECT
-            tbdc.type_name,
-            tbdc.calculate_type,
-            ts.score
+        tbdc.type_name,
+        tbdc.calculate_type,
+        ts.score
         FROM
-            tb_score ts
-                LEFT JOIN tb_basic_data tbd ON ts.basic_data_id = tbd.id
-                LEFT JOIN tb_basic_data_config tbdc ON ts.basic_data_config_id = tbdc.id
+        tb_score ts
+        LEFT JOIN tb_basic_data tbd ON ts.basic_data_id = tbd.id
+        LEFT JOIN tb_basic_data_config tbdc ON ts.basic_data_config_id = tbdc.id
         WHERE
-            1=1
-            AND tbd.id = #{query.basicDataId}
-            <if test="query.typeName !=null and query.typeName!=''">
-                AND tbdc.type_name like Concat('%',#{query.typeName},'%')
-            </if>
-            <if test="query.typeName !=null and query.typeName!=''">
-                AND tbdc.calculate_type = #{query.type}
-            </if>
+        1=1
+        AND tbd.id = #{query.basicDataId}
+        <if test="query.typeName !=null and query.typeName!=''">
+            AND tbdc.type_name like Concat('%',#{query.typeName},'%')
+        </if>
+        <if test="query.typeName !=null and query.typeName!=''">
+            AND tbdc.calculate_type = #{query.type}
+        </if>
 
     </select>
+    <select id="scoreCalculateDetail" resultType="com.ruoyi.system.vo.ScoreDetailVO">
+        SELECT
+        su.area_name,
+        ts.score,
+        su.person_in_charge,
+        su.phone_number
+        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>
+            ts.basic_data_config_id = #{query.id}
+            <if test="query.areaName != null and query.areaName != ''">
+                AND su.area_name LIKE CONCAT('%',#{query.areaName},'%')
+            </if>
+        </where>
+    </select>
 
 </mapper>

--
Gitblit v1.7.1