From 321d507a5670cb36c1550445c4795a76c9d7d226 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期三, 03 四月 2024 18:06:49 +0800
Subject: [PATCH] 部门端历史数据模块、字段查看模块返回数据层级关系处理

---
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbScoreMapper.java                     |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataFieldVO.java                      |   40 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/dto/HistoryDataQueryDTO.java                  |   31 +++
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java               |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java      |   58 +++++-
 ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataVO.java                           |   24 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbScoreService.java                   |    8 
 ruoyi-system/src/main/resources/mapper/system/TbBasicDataFieldMapper.xml                  |    1 
 ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/HistoryDataController.java    |   46 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldService.java                   |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/utils/FieldBuildUtil.java                     |  137 +++++++++++++++
 ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/listener/BasicDataListener.java               |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java          |   53 +++++
 ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreQuery.java                         |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/query/HistoryScoreQuery.java                  |   29 +++
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicData.java                       |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java                  |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldsTreeVO.java                          |   36 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbScoreServiceImpl.java          |   14 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataReportingVO.java                  |    7 
 21 files changed, 467 insertions(+), 44 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 d4c52a7..458aa5e 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
@@ -2,9 +2,7 @@
 
 import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.common.core.domain.R;
-import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.exception.ServiceException;
-import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.system.dto.BasicDataDTO;
 import com.ruoyi.system.query.ScoreQuery;
 import com.ruoyi.system.service.TbBasicDataService;
@@ -34,9 +32,7 @@
     @GetMapping("/basic-fields")
     public R<BasicDataReportingVO> getBasicFields() {
         try {
-            SysUser user = SecurityUtils.getLoginUser().getUser();
-            String areaCode = user.getAreaCode();
-            return tbBasicDataService.getBasicFields(areaCode);
+            return tbBasicDataService.getBasicFields();
         } catch (Exception e) {
             if (e instanceof ServiceException) {
                 return R.fail(e.getMessage());
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 f45555b..40ed183 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
@@ -1,10 +1,26 @@
 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.utils.SecurityUtils;
+import com.ruoyi.system.domain.TbBasicData;
+import com.ruoyi.system.dto.HistoryDataQueryDTO;
+import com.ruoyi.system.query.HistoryScoreQuery;
+import com.ruoyi.system.service.TbBasicDataService;
+import com.ruoyi.system.service.TbFieldService;
+import com.ruoyi.system.service.TbScoreService;
+import com.ruoyi.system.vo.BasicDataFieldVO;
+import com.ruoyi.system.vo.BasicDataVO;
+import com.ruoyi.system.vo.ScoreVO;
 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.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * @author mitao
@@ -17,4 +33,30 @@
 @Api(tags = "历史数据相关接口")
 public class HistoryDataController {
 
+    private final TbBasicDataService tbBasicDataService;
+    private final TbFieldService tbFieldService;
+    private final TbScoreService tbScoreService;
+
+    @PostMapping("/list")
+    @ApiOperation("历史数据分页查询")
+    public R<PageDTO<BasicDataVO>> list(HistoryDataQueryDTO dto) {
+        String areaCode = SecurityUtils.getLoginUser().getUser().getAreaCode();
+        Page<TbBasicData> page = tbBasicDataService.lambdaQuery().eq(TbBasicData::getDeptAreaCode, areaCode)
+                .eq(TbBasicData::getStatus, ReportingStatusEnum.FILLED)
+                .page(new Page<TbBasicData>(dto.getPageNum(), dto.getPageSize()));
+        return R.ok(PageDTO.of(page, BasicDataVO.class));
+    }
+
+    @GetMapping("/history-fields")
+    @ApiOperation("字段查看")
+    @ApiImplicitParam(name = "id", value = "基础数据id", required = true, dataType = "int", paramType = "query", dataTypeClass = Long.class)
+    public R<BasicDataFieldVO> getHistoryFields(@RequestParam("id") Long id) {
+        return R.ok(tbFieldService.getHistoryFields(id));
+    }
+
+    @PostMapping("/history-score")
+    @ApiOperation("得分计算")
+    public R<PageDTO<ScoreVO>> getHistoryScore(@RequestBody HistoryScoreQuery query) {
+        return R.ok(tbScoreService.getHistoryScore(query));
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicData.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicData.java
index c79f27a..3fd566a 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicData.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicData.java
@@ -26,7 +26,7 @@
 
     private static final long serialVersionUID = 1L;
 
-    @ApiModelProperty(value = "分类id")
+    @ApiModelProperty(value = "id")
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java
index 24a8b0f..18a93aa 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java
@@ -37,6 +37,10 @@
     @TableField("field_id")
     private Long fieldId;
 
+    @ApiModelProperty(value = "字段名", notes = "fieldId = -1 转移支付规模 fieldId = -2 当期GDP")
+    @TableField("field_name")
+    private String fieldName;
+
     @ApiModelProperty(value = "字段值")
     @TableField("field_value")
     private String fieldValue;
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
new file mode 100644
index 0000000..6c3c98f
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/HistoryDataQueryDTO.java
@@ -0,0 +1,31 @@
+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/listener/BasicDataListener.java b/ruoyi-system/src/main/java/com/ruoyi/system/listener/BasicDataListener.java
index d08192d..e94143e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/listener/BasicDataListener.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/listener/BasicDataListener.java
@@ -118,12 +118,14 @@
         TbBasicDataField transferPaymentScale = new TbBasicDataField();
         transferPaymentScale.setBasicDataId(tbBasicData.getId());
         transferPaymentScale.setFieldId(-1L);
+        transferPaymentScale.setFieldName("转移支付规模");
         transferPaymentScale.setFieldValue(tbBasicData.getTransferPaymentScale());
         fields.add(transferPaymentScale);
 
         TbBasicDataField currentGdp = new TbBasicDataField();
         currentGdp.setBasicDataId(tbBasicData.getId());
         currentGdp.setFieldId(-2L);
+        currentGdp.setFieldName("当期GDP");
         currentGdp.setFieldValue(tbBasicData.getCurrentGdp());
         fields.add(currentGdp);
         //遍历动态字段map
@@ -136,6 +138,7 @@
                 TbBasicDataField tbBasicDataField = new TbBasicDataField();
                 tbBasicDataField.setBasicDataId(tbBasicData.getId());
                 tbBasicDataField.setFieldId(field.getId());
+                tbBasicDataField.setFieldName(field.getFieldName());
                 tbBasicDataField.setFieldValue(value);
                 fields.add(tbBasicDataField);
             }
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 febcccb..cc895cd 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
@@ -7,8 +7,6 @@
 import com.ruoyi.system.vo.ScoreVO;
 import org.apache.ibatis.annotations.Param;
 
-import java.util.List;
-
 /**
  * <p>
  * 得分表 Mapper 接口
@@ -19,5 +17,5 @@
  */
 public interface TbScoreMapper extends BaseMapper<TbScore> {
 
-    List<ScoreVO> pageScore(@Param("query") ScoreQuery query, @Param("page") Page<ScoreVO> page);
+    Page<ScoreVO> pageScore(@Param("query") ScoreQuery query, @Param("page") Page<ScoreVO> page);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/HistoryScoreQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/HistoryScoreQuery.java
new file mode 100644
index 0000000..1d11d5e
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/HistoryScoreQuery.java
@@ -0,0 +1,29 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import com.ruoyi.common.enums.FieldTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author mitao
+ * @date 2024/3/27
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("得分计算条件查询对象")
+public class HistoryScoreQuery extends BasePage {
+
+    private static final long serialVersionUID = -1055887500656271053L;
+
+    @ApiModelProperty(value = "基础数据Id")
+    private Long basicDataId;
+    
+    @ApiModelProperty(value = "类型名称")
+    private String typeName;
+
+    @ApiModelProperty(value = "计算方式")
+    private FieldTypeEnum type;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreQuery.java
index d85f297..7216e28 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreQuery.java
@@ -17,12 +17,13 @@
 public class ScoreQuery extends BasePage {
 
     private static final long serialVersionUID = -3063606775652464607L;
+
     @ApiModelProperty(value = "类型名称")
     private String typeName;
 
     @ApiModelProperty(value = "计算方式")
     private FieldTypeEnum type;
 
-    @ApiModelProperty(value = "基础数据Id",hidden = true)
+    @ApiModelProperty(value = "基础数据Id",notes = "不用传",hidden = true)
     private Long basicDataId;
 }
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 3f33c57..983022e 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
@@ -20,7 +20,7 @@
  */
 public interface TbBasicDataService extends IService<TbBasicData> {
 
-    R<BasicDataReportingVO> getBasicFields(String deptAreaCode) throws Exception;
+    R<BasicDataReportingVO> getBasicFields() throws Exception;
 
     void saveBasicData(BasicDataDTO dto);
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldService.java
index b64309a..7b17094 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldService.java
@@ -7,6 +7,7 @@
 import com.ruoyi.system.dto.ShowHideDTO;
 import com.ruoyi.system.dto.update.FieldUpdateDTO;
 import com.ruoyi.system.query.FieldQuery;
+import com.ruoyi.system.vo.BasicDataFieldVO;
 import com.ruoyi.system.vo.FieldVO;
 
 /**
@@ -28,4 +29,6 @@
     String influencedData(Long id);
 
     void update(FieldUpdateDTO dto);
+
+    BasicDataFieldVO getHistoryFields(Long id);
 }
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 f6e8801..d5a6f47 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
@@ -2,11 +2,11 @@
 
 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.TbScore;
+import com.ruoyi.system.query.HistoryScoreQuery;
 import com.ruoyi.system.query.ScoreQuery;
 import com.ruoyi.system.vo.ScoreVO;
-
-import java.util.List;
 
 /**
  * <p>
@@ -18,5 +18,7 @@
  */
 public interface TbScoreService extends IService<TbScore> {
 
-    List<ScoreVO> pageScore(ScoreQuery query, Page<ScoreVO> page);
+    Page<ScoreVO> pageScore(ScoreQuery query, Page<ScoreVO> page);
+
+    PageDTO<ScoreVO> getHistoryScore(HistoryScoreQuery query);
 }
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 77e4182..301ee1b 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
@@ -22,8 +22,9 @@
 import com.ruoyi.system.mapper.TbDeptMapper;
 import com.ruoyi.system.query.ScoreQuery;
 import com.ruoyi.system.service.*;
+import com.ruoyi.system.utils.FieldBuildUtil;
 import com.ruoyi.system.vo.BasicDataReportingVO;
-import com.ruoyi.system.vo.FieldReportingVO;
+import com.ruoyi.system.vo.FieldsTreeVO;
 import com.ruoyi.system.vo.ScoreVO;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -62,7 +63,9 @@
     private final TbScoreService tbScoreService;
 
     @Override
-    public R<BasicDataReportingVO> getBasicFields(String deptAreaCode) throws Exception {
+    public R<BasicDataReportingVO> getBasicFields() throws Exception {
+        SysUser user = SecurityUtils.getLoginUser().getUser();
+        String deptAreaCode = user.getAreaCode();
         BasicDataReportingVO vo = new BasicDataReportingVO();
         //校验区划代码
         TbDept dept = tbDeptMapper.selectOne(Wrappers.<TbDept>lambdaQuery().eq(TbDept::getAreaCode, deptAreaCode));
@@ -95,9 +98,20 @@
                 .between(TbBasicData::getCreateTime, quarterStart,quarterEnd));
         //查询需要填写的字段
         List<TbField> list = tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
+        List<FieldsTreeVO> roots = new ArrayList<>();
+        FieldsTreeVO fieldsTreeVO = new FieldsTreeVO();
+        fieldsTreeVO.setId(-1L);
+        fieldsTreeVO.setName("转移支付规模");
+        fieldsTreeVO.setCategory(Boolean.FALSE);
+        FieldsTreeVO fieldsTreeVO2 = new FieldsTreeVO();
+        fieldsTreeVO2.setId(-2L);
+        fieldsTreeVO2.setName("当期GDP");
+        fieldsTreeVO2.setCategory(Boolean.FALSE);
+        roots.add(fieldsTreeVO);
+        roots.add(fieldsTreeVO2);
         if (CollUtils.isNotEmpty(list)) {
-            List<FieldReportingVO> fieldReportingVOS = BeanUtils.copyList(list, FieldReportingVO.class);
-            vo.setFields(fieldReportingVOS);
+            FieldBuildUtil.buildTreeFromTbFieldList(list,roots);
+            vo.setFields(roots);
         }
         if (Objects.isNull(basicData)) {
             vo.setQuarter(String.format("%s年%s季度",now.getYear(),quarterOfYearStr));
@@ -108,19 +122,26 @@
             //查询已填报数据 包含数据缺失和已填报
             List<TbBasicDataField> basicDataFields = tbBasicDataFieldService.lambdaQuery()
                     .eq(TbBasicDataField::getBasicDataId, basicData.getId()).list();
+
             if (CollUtils.isNotEmpty(basicDataFields)) {
                 Map<Long, TbBasicDataField> fieldMap = basicDataFields.stream()
                         .collect(Collectors.toMap(TbBasicDataField::getFieldId, Function.identity()));
-                vo.getFields().forEach(item -> {
-                    TbBasicDataField tbBasicDataField = fieldMap.get(item.getId());
-                    if (Objects.nonNull(tbBasicDataField)) {
-                        item.setValue(tbBasicDataField.getFieldValue());
-                    }
-                });
+                setFieldValues(vo.getFields(), fieldMap);
                 return R.ok(vo);
             }
         }
         return R.ok(vo);
+    }
+    public static void setFieldValues(List<FieldsTreeVO> fields, Map<Long, TbBasicDataField> fieldMap) {
+        for (FieldsTreeVO field : fields) {
+            TbBasicDataField tbBasicDataField = fieldMap.get(field.getId());
+            if (tbBasicDataField != null) {
+                field.setValue(tbBasicDataField.getFieldValue());
+            }
+            if (field.getChildren() != null && !field.getChildren().isEmpty()) {
+                setFieldValues(field.getChildren(), fieldMap);
+            }
+        }
     }
 
     @Override
@@ -138,9 +159,16 @@
         this.saveOrUpdate(tbBasicData);
         //保存基础数据动态字段数据
         List<TbBasicDataField> tbBasicDataFields = BeanUtils.copyList(dto.getFields(), TbBasicDataField.class);
-        tbBasicDataFields.forEach(item -> item.setBasicDataId(tbBasicData.getId()));
         //查询需要填写的动态字段
         List<TbField> fieldList = tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
+        Map<Long, TbField> fieldMap = fieldList.stream().collect(Collectors.toMap(TbField::getId, e -> e));
+        tbBasicDataFields.forEach(item -> {
+            item.setBasicDataId(tbBasicData.getId());
+            TbField tbField = fieldMap.get(item.getFieldId());
+            if (Objects.nonNull(tbField)) {
+                item.setFieldName(tbField.getFieldName());
+            }
+        });
         //添加固定字段 转移支付规模、当期GDP
         TbBasicDataField transferPaymentScale = new TbBasicDataField();
         transferPaymentScale.setBasicDataId(tbBasicData.getId());
@@ -215,6 +243,7 @@
         }
         return -1; // 返回-1表示未找到
     }
+
     private List<List<Object>> dataList(List<TbField> list) throws Exception {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         String areaName = loginUser.getUser().getAreaName();
@@ -250,6 +279,7 @@
         headTitles.add(Lists.newArrayList("备注"));
         return headTitles;
     }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void importBasicData(MultipartFile file) throws Exception {
@@ -261,6 +291,7 @@
                 tbFieldService,areaCode,tbBasicDataFieldService,tbBasicDataConfigService,
                 tbBasicDataConfigDetailService,tbScoreService)).sheet().doRead();
     }
+
     private void calculateScore(TbBasicData tbBasicData) {
         //计算得分
         List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery().eq(TbBasicDataConfig::getStatus, ShowStatusEnum.SHOW).list();
@@ -333,6 +364,7 @@
             }
         }
     }
+
     @Override
     public PageDTO<ScoreVO> pageScore(ScoreQuery query) {
         Page<ScoreVO> page = new Page<>(query.getPageNum(), query.getPageSize());
@@ -352,7 +384,7 @@
         }
         query.setBasicDataId(basicData.getId());
         //查询对应的基础数据配置
-        List<ScoreVO> vos = tbScoreService.pageScore(query,page);
-        return PageDTO.of(page, vos);
+        Page<ScoreVO> pageVO = tbScoreService.pageScore(query,page);
+        return PageDTO.of(pageVO);
     }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java
index feab17d..12285e4 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java
@@ -10,26 +10,26 @@
 import com.ruoyi.common.utils.BeanUtils;
 import com.ruoyi.common.utils.CollUtils;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.system.domain.TbBasicDataConfig;
-import com.ruoyi.system.domain.TbField;
-import com.ruoyi.system.domain.TbFieldCategory;
+import com.ruoyi.system.domain.*;
 import com.ruoyi.system.dto.FieldDTO;
 import com.ruoyi.system.dto.ShowHideDTO;
 import com.ruoyi.system.dto.update.FieldUpdateDTO;
+import com.ruoyi.system.mapper.TbBasicDataMapper;
 import com.ruoyi.system.mapper.TbFieldMapper;
 import com.ruoyi.system.query.FieldQuery;
 import com.ruoyi.system.service.TbBasicDataConfigService;
+import com.ruoyi.system.service.TbBasicDataFieldService;
 import com.ruoyi.system.service.TbFieldCategoryService;
 import com.ruoyi.system.service.TbFieldService;
+import com.ruoyi.system.utils.FieldBuildUtil;
+import com.ruoyi.system.vo.BasicDataFieldVO;
 import com.ruoyi.system.vo.FieldVO;
+import com.ruoyi.system.vo.FieldsTreeVO;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
@@ -47,6 +47,8 @@
 public class TbFieldServiceImpl extends ServiceImpl<TbFieldMapper, TbField> implements TbFieldService {
     private final TbFieldCategoryService tbFieldCategoryService;
     private final TbBasicDataConfigService tbBasicDataConfigService;
+    private final TbBasicDataMapper tbBasicDataMapper;
+    private final TbBasicDataFieldService tbBasicDataFieldService;
 
     @Override
     public void add(FieldDTO dto) {
@@ -152,4 +154,41 @@
         TbField tbField = BeanUtils.copyBean(dto, TbField.class);
         this.updateById(tbField);
     }
+
+    @Override
+    public BasicDataFieldVO getHistoryFields(Long id) {
+        // 从数据库中获取基本数据
+        TbBasicData basicData = tbBasicDataMapper.selectById(id);
+        if (Objects.isNull(basicData)) {
+            throw new ServiceException("非法参数");
+        }
+        BasicDataFieldVO vo = BeanUtils.copyBean(basicData, BasicDataFieldVO.class);
+        // 查询动态字段
+        List<TbBasicDataField> basicDataFields = tbBasicDataFieldService.lambdaQuery().eq(TbBasicDataField::getBasicDataId, basicData.getId()).list();
+        // 获取所有字段ID
+        Set<Long> fieldIds = basicDataFields.stream().map(TbBasicDataField::getFieldId).collect(Collectors.toSet());
+        // 根据字段ID查询字段信息并构建字段ID到字段对象的映射
+        Map<Long, TbField> fieldMap = this.lambdaQuery().in(!fieldIds.isEmpty(), TbField::getId, fieldIds).list().stream().collect(Collectors.toMap(TbField::getId, e -> e));
+        // 根节点
+        List<FieldsTreeVO> root = new ArrayList<>();
+        basicDataFields.stream().filter(item -> item.getFieldId()==-1).findFirst().ifPresent(item ->{
+            FieldsTreeVO fieldsTreeVO = new FieldsTreeVO();
+            fieldsTreeVO.setId(item.getFieldId());
+            fieldsTreeVO.setName("转移支付规模");
+            fieldsTreeVO.setValue(item.getFieldValue());
+            fieldsTreeVO.setCategory(Boolean.FALSE);
+            root.add(fieldsTreeVO);
+        });
+        basicDataFields.stream().filter(item -> item.getFieldId()==-2).findFirst().ifPresent(item ->{
+            FieldsTreeVO fieldsTreeVO = new FieldsTreeVO();
+            fieldsTreeVO.setId(item.getFieldId());
+            fieldsTreeVO.setName("当期GDP");
+            fieldsTreeVO.setValue(item.getFieldValue());
+            fieldsTreeVO.setCategory(Boolean.FALSE);
+            root.add(fieldsTreeVO);
+        });
+        FieldBuildUtil.buildTreeStructure(basicDataFields, fieldMap, root);
+        vo.setFields(root);
+        return vo;
+    }
 }
\ No newline at end of file
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 fd44836..1b5cf69 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
@@ -2,14 +2,15 @@
 
 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.utils.BeanUtils;
 import com.ruoyi.system.domain.TbScore;
 import com.ruoyi.system.mapper.TbScoreMapper;
+import com.ruoyi.system.query.HistoryScoreQuery;
 import com.ruoyi.system.query.ScoreQuery;
 import com.ruoyi.system.service.TbScoreService;
 import com.ruoyi.system.vo.ScoreVO;
 import org.springframework.stereotype.Service;
-
-import java.util.List;
 
 /**
  * <p>
@@ -23,7 +24,14 @@
 public class TbScoreServiceImpl extends ServiceImpl<TbScoreMapper, TbScore> implements TbScoreService {
 
     @Override
-    public List<ScoreVO> pageScore(ScoreQuery query, Page<ScoreVO> page) {
+    public Page<ScoreVO> pageScore(ScoreQuery query, Page<ScoreVO> page) {
         return baseMapper.pageScore(query,page);
     }
+
+    @Override
+    public PageDTO<ScoreVO> getHistoryScore(HistoryScoreQuery query) {
+        ScoreQuery scoreQuery = BeanUtils.copyBean(query, ScoreQuery.class);
+        Page<ScoreVO> scoreVOPage = baseMapper.pageScore(scoreQuery, new Page<>(query.getPageNum(), query.getPageSize()));
+        return PageDTO.of(scoreVOPage);
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/FieldBuildUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/FieldBuildUtil.java
new file mode 100644
index 0000000..47fbb5a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/FieldBuildUtil.java
@@ -0,0 +1,137 @@
+package com.ruoyi.system.utils;
+
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.domain.TbBasicDataField;
+import com.ruoyi.system.domain.TbField;
+import com.ruoyi.system.vo.FieldsTreeVO;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author mitao
+ * @date 2024/4/3
+ */
+public class FieldBuildUtil {
+    /**
+     * 构建基础数据字段树形层级
+     *
+     * @param basicDataFields 基础数据字段
+     * @param fieldMap        字段Map
+     * @param roots           返回的vo
+     */
+    public static void buildTreeStructure(List<TbBasicDataField> basicDataFields, Map<Long, TbField> fieldMap, List<FieldsTreeVO> roots) {
+        Map<String, FieldsTreeVO> levelTwoMap = new HashMap<>();
+        Map<String, FieldsTreeVO> levelThreeMap = new HashMap<>();
+
+        for (TbBasicDataField item : basicDataFields) {
+            TbField tbField = fieldMap.get(item.getFieldId());
+            if (tbField != null) {
+                String levelOneCategory = tbField.getLevelOneCategory();
+                String levelTwoCategory = tbField.getLevelTwoCategory();
+                String levelThreeCategory = tbField.getLevelThreeCategory();
+                Long id = tbField.getId();
+                String fieldName = tbField.getFieldName();
+                String fieldValue = item.getFieldValue();
+                FieldsTreeVO field = new FieldsTreeVO();
+                field.setId(id);
+                field.setName(fieldName);
+                field.setValue(fieldValue);
+                field.setCategory(Boolean.FALSE);
+                FieldsTreeVO levelOneField = null;
+                for (FieldsTreeVO root : roots) {
+                    if (root.getName().equals(levelOneCategory)) {
+                        levelOneField = root;
+                        break;
+                    }
+                }
+                if (levelOneField == null) {
+                    levelOneField = new FieldsTreeVO();
+                    levelOneField.setName(levelOneCategory);
+                    roots.add(levelOneField);
+                }
+
+                if (StringUtils.isNotBlank(levelTwoCategory)) {
+                    FieldsTreeVO levelTwoField = levelTwoMap.getOrDefault(levelTwoCategory, null);
+                    if (levelTwoField == null) {
+                        levelTwoField = new FieldsTreeVO();
+                        levelTwoField.setName(levelTwoCategory);
+                        levelTwoMap.put(levelTwoCategory, levelTwoField);
+                        levelOneField.getChildren().add(levelTwoField);
+                    }
+
+                    if (StringUtils.isNotBlank(levelThreeCategory)) {
+                        FieldsTreeVO levelThreeField = levelThreeMap.getOrDefault(levelThreeCategory, null);
+                        if (levelThreeField == null) {
+                            levelThreeField = new FieldsTreeVO();
+                            levelThreeField.setName(levelThreeCategory);
+                            levelThreeMap.put(levelThreeCategory, levelThreeField);
+                            levelTwoField.getChildren().add(levelThreeField);
+                        }
+                        levelThreeField.getChildren().add(field);
+                    } else {
+                        levelTwoField.getChildren().add(field);
+                    }
+                } else {
+                    levelOneField.getChildren().add(field);
+                }
+            }
+        }
+    }
+
+    /**
+     * 构建字段树形层级
+     *
+     * @param tbFieldList 字段列表
+     */
+    public static void buildTreeFromTbFieldList(List<TbField> tbFieldList, List<FieldsTreeVO> roots) {
+        Map<String, FieldsTreeVO> levelOneMap = new HashMap<>();
+        Map<String, FieldsTreeVO> levelTwoMap = new HashMap<>();
+
+        for (TbField tbField : tbFieldList) {
+            String levelOneCategory = tbField.getLevelOneCategory();
+            String levelTwoCategory = tbField.getLevelTwoCategory();
+            String levelThreeCategory = tbField.getLevelThreeCategory();
+            String fieldName = tbField.getFieldName();
+            Long id = tbField.getId();
+            FieldsTreeVO field = new FieldsTreeVO();
+            field.setId(id);
+            field.setName(fieldName);
+            field.setCategory(Boolean.FALSE);
+            FieldsTreeVO levelOneField = null;
+            for (FieldsTreeVO root : roots) {
+                if (root.getName().equals(levelOneCategory)) {
+                    levelOneField = root;
+                    break;
+                }
+            }
+            if (levelOneField == null) {
+                levelOneField = new FieldsTreeVO();
+                levelOneField.setName(levelOneCategory);
+                roots.add(levelOneField);
+            }
+
+            if (StringUtils.isNotBlank(levelTwoCategory)) {
+                FieldsTreeVO levelTwoField = levelTwoMap.getOrDefault(levelTwoCategory, null);
+                if (levelTwoField == null) {
+                    levelTwoField = new FieldsTreeVO();
+                    levelTwoField.setName(levelTwoCategory);
+                    levelOneField.getChildren().add(levelTwoField);
+                    levelTwoMap.put(levelTwoCategory, levelTwoField);
+                }
+
+                if (StringUtils.isNotBlank(levelThreeCategory)) {
+                    FieldsTreeVO levelThreeField = new FieldsTreeVO();
+                    levelThreeField.setName(levelThreeCategory);
+                    levelTwoField.getChildren().add(levelThreeField);
+                    levelThreeField.getChildren().add(field);
+                } else {
+                    levelTwoField.getChildren().add(field);
+                }
+            } else {
+                levelOneField.getChildren().add(field);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataFieldVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataFieldVO.java
index 85acebb..6417359 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataFieldVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataFieldVO.java
@@ -1,8 +1,46 @@
 package com.ruoyi.system.vo;
 
+import com.ruoyi.common.enums.ReportingStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
 /**
  * @author mitao
  * @date 2024/3/19
  */
-public class BasicDataFieldVO {
+@Data
+@ApiModel(value="字段统计填报视图对象")
+public class BasicDataFieldVO implements Serializable {
+
+    private static final long serialVersionUID = -4911170218076417743L;
+
+    @ApiModelProperty(value = "季度")
+    private String quarter;
+
+    @ApiModelProperty(value = "转移支付规模")
+    private String transferPaymentScale;
+
+    @ApiModelProperty(value = "当期GDP")
+    private String currentGdp;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "填报状态(1=未填报 2=数据缺失 3=已填报)")
+    private ReportingStatusEnum status;
+
+    @ApiModelProperty(value = "动态字段")
+    private List<FieldsTreeVO> fields;
+
+    @ApiModelProperty(value = "首次填报时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "填报完成时间",notes = "状态为已填报才展示")
+    private LocalDateTime updateTime;
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataReportingVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataReportingVO.java
index 21283ae..71646a5 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataReportingVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataReportingVO.java
@@ -7,7 +7,6 @@
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -32,10 +31,10 @@
     @ApiModelProperty(value = "首次填报时间")
     private LocalDateTime createTime;
 
-    @ApiModelProperty(value = "填报完成时间")
+    @ApiModelProperty(value = "填报完成时间",notes = "状态为已填报才展示")
     private LocalDateTime updateTime;
 
     //1:未填报 2:数据缺失 3:已填报
-    @ApiModelProperty(value = "动态字段")
-    private List<FieldReportingVO> fields = new ArrayList<>();
+    @ApiModelProperty(value = "字段")
+    private List<FieldsTreeVO> fields;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataVO.java
new file mode 100644
index 0000000..9313a10
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataVO.java
@@ -0,0 +1,24 @@
+package com.ruoyi.system.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author mitao
+ * @date 2024/4/3
+ */
+@Data
+@ApiModel(value="历史数据视图对象")
+public class BasicDataVO implements Serializable {
+
+    private static final long serialVersionUID = -2405812660664664181L;
+
+    @ApiModelProperty(value = "基础数据id")
+    private Integer id;
+
+    @ApiModelProperty(value = "季度")
+    private String quarter;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldsTreeVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldsTreeVO.java
new file mode 100644
index 0000000..a03ed3b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldsTreeVO.java
@@ -0,0 +1,36 @@
+package com.ruoyi.system.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author mitao
+ * @date 2024/4/3
+ */
+@Data
+@ApiModel(value="字段树形层级视图对象")
+public class FieldsTreeVO implements Serializable {
+
+    private static final long serialVersionUID = -3825263999732477730L;
+
+    @ApiModelProperty(value = "字段id")
+    private Long id;
+
+    @ApiModelProperty(value = "数据详情")
+    private String value;
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "是否为分类")
+    private Boolean category = Boolean.TRUE;
+
+    @ApiModelProperty(value = "字段列表")
+    private List<FieldsTreeVO> children = new ArrayList<>();
+
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/TbBasicDataFieldMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TbBasicDataFieldMapper.xml
index 98fad3b..edf56a6 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TbBasicDataFieldMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TbBasicDataFieldMapper.xml
@@ -7,6 +7,7 @@
         <id column="id" property="id" />
         <result column="basic_data_id" property="basicDataId" />
         <result column="field_id" property="fieldId" />
+        <result column="field_name" property="fieldName" />
         <result column="field_value" property="fieldValue" />
         <result column="del_flag" property="delFlag" />
         <result column="create_by" property="createBy" />

--
Gitblit v1.7.1