mitao
2024-04-03 321d507a5670cb36c1550445c4795a76c9d7d226
部门端历史数据模块、字段查看模块返回数据层级关系处理
16个文件已修改
5个文件已添加
511 ■■■■■ 已修改文件
ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/HistoryDataController.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicData.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/HistoryDataQueryDTO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/listener/BasicDataListener.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbScoreMapper.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/HistoryScoreQuery.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreQuery.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TbScoreService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbScoreServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/utils/FieldBuildUtil.java 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataFieldVO.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataReportingVO.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataVO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldsTreeVO.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TbBasicDataFieldMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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());
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));
    }
}
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;
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;
ruoyi-system/src/main/java/com/ruoyi/system/dto/HistoryDataQueryDTO.java
New file
@@ -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;
}
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);
            }
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);
}
ruoyi-system/src/main/java/com/ruoyi/system/query/HistoryScoreQuery.java
New file
@@ -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;
}
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;
}
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);
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);
}
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);
}
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);
    }
}
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;
    }
}
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);
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/utils/FieldBuildUtil.java
New file
@@ -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);
            }
        }
    }
}
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;
}
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;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataVO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldsTreeVO.java
New file
@@ -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<>();
}
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" />