mitao
2024-04-07 5980a5fed8092f9866cb2f6a8b74abb7d631c018
平台端 当前季度数据接口
24个文件已修改
12个文件已添加
1005 ■■■■■ 已修改文件
ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/HistoryDataController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BasePage.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/EasyExcelUtil.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataFieldDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/CurrentFieldsQueryDTO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionDTO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionQueryDTO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionUpdDto.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/handler/CustomerHandler.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/handler/SelectedSheetWriteHandler.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TbQuestionService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbQuestionServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/utils/FieldBuildUtil.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataCategoryVO.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataConfigDetailVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataConfigVO.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataFieldVO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataReportingVO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/CalculateVO.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsAllVO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsDetailVO.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsVO.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/DeptVO.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryDetailVO.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryVO.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldVO.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/QuestionVO.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TbBasicDataMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java
@@ -28,6 +28,11 @@
    private final TbBasicDataService tbBasicDataService;
    /**
     * 获取基础数据填报相关信息
     *
     * @return R<BasicDataReportingVO>
     */
    @ApiOperation("获取基础数据填报相关信息")
    @GetMapping("/basic-fields")
    public R<BasicDataReportingVO> getBasicFields() {
@@ -42,6 +47,11 @@
        }
    }
    /**
     * 保存当前季度数据
     * @param dto 当前季度基础数据数据传输对象
     * @return R<Void>
     */
    @PostMapping("/save-basic-data")
    @ApiOperation("保存当前季度数据")
    public R<Void> saveBasicData(@RequestBody BasicDataDTO dto) {
@@ -70,6 +80,11 @@
        }
    }
    /**
     * 基础数据导入
     * @param file file
     * @return R<Void>
     */
    @PostMapping("/import")
    @ApiOperation("基础数据导入")
    public R<Void> importBasicData(@RequestPart("file") MultipartFile file) {
@@ -85,6 +100,11 @@
        return R.ok();
    }
    /**
     * 得分计算分页查询
     * @param query 得分计算条件查询对象
     * @return R<PageDTO < ScoreVO>>
     */
    @PostMapping("/page-score")
    @ApiOperation("得分计算分页查询")
    public R<PageDTO<ScoreVO>> pageScore(@RequestBody ScoreQuery query) {
ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/HistoryDataController.java
@@ -37,16 +37,27 @@
    private final TbFieldService tbFieldService;
    private final TbScoreService tbScoreService;
    /**
     * 历史数据分页查询
     *
     * @param dto 历史数据查询传输对象
     * @return R<PageDTO < BasicDataVO>>
     */
    @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()));
                .page(new Page<>(dto.getPageNum(), dto.getPageSize()));
        return R.ok(PageDTO.of(page, BasicDataVO.class));
    }
    /**
     * 字段查看
     * @param id 基础数据id
     * @return R<BasicDataFieldVO>
     */
    @GetMapping("/history-fields")
    @ApiOperation("字段查看")
    @ApiImplicitParam(name = "id", value = "基础数据id", required = true, dataType = "int", paramType = "query", dataTypeClass = Long.class)
@@ -54,6 +65,11 @@
        return R.ok(tbFieldService.getHistoryFields(id));
    }
    /**
     * 得分计算
     * @param query 得分计算条件查询对象
     * @return R<PageDTO < ScoreVO>>
     */
    @PostMapping("/history-score")
    @ApiOperation("得分计算")
    public R<PageDTO<ScoreVO>> getHistoryScore(@RequestBody HistoryScoreQuery query) {
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java
New file
@@ -0,0 +1,163 @@
package com.ruoyi.web.controller.api;
import com.ruoyi.common.basic.PageDTO;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.BeanUtils;
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.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 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.*;
/**
 * @author mitao
 * @date 2024/3/19
 */
@Slf4j
@RestController
@RequestMapping("/current-quarter")
@RequiredArgsConstructor
@Api(tags = "当前季度数据相关接口")
public class CurrentQuarterController {
    private final TbBasicDataService tbBasicDataService;
    private final TbQuestionService tbQuestionService;
    /**
     * 获取基础数据填报相关信息
     *
     * @return R<BasicDataReportingVO>
     */
    @ApiOperation(value = "字段统计", notes = "字段统计")
    @PostMapping("/fields-statics")
    public R<PageDTO<CurrentFieldsVO>> fieldsStatics(@Validated @RequestBody CurrentFieldsQueryDTO dto) {
        try {
            return tbBasicDataService.fieldsStatics(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 = "字段统计")
    public R<CurrentFieldsAllVO> fieldsStaticsAll() {
        try {
            return R.ok(tbBasicDataService.fieldsStaticsAll());
        } catch (Exception e) {
            if (e instanceof ServiceException) {
                return R.fail(e.getMessage());
            }
            log.error("查看全部异常", e);
            return R.fail();
        }
    }
    /**
     * 添加问题
     *
     * @param dto 发现问题数据传输对象
     * @return R<Void>
     */
    @PostMapping("add-question")
    @ApiOperation(value = "添加问题", notes = "发现问题")
    public R<Void> addQuestion(@Validated @RequestBody QuestionDTO dto) {
        try {
            tbQuestionService.addQuestion(dto);
            return R.ok();
        } catch (Exception e) {
            if (e instanceof ServiceException) {
                return R.fail(e.getMessage());
            }
            log.error("添加问题异常", e);
            return R.fail();
        }
    }
    @PostMapping("/edit-question")
    @ApiOperation(value = "编辑问题", notes = "发现问题")
    public R<Void> editQuestion(@Validated @RequestBody QuestionUpdDto dto) {
        try {
            tbQuestionService.editQuestion(dto);
            return R.ok();
        } catch (Exception e) {
            if (e instanceof ServiceException) {
                return R.fail(e.getMessage());
            }
            log.error("编辑问题异常", e);
            return R.fail();
        }
    }
    /**
     * 分页查询问题
     *
     * @param dto 发现问题分页数据传输对象
     * @return R<PageDTO < QuestionVO>>
     */
    @PostMapping("/page-question")
    @ApiOperation(value = "分页查询问题", notes = "发现问题")
    public R<PageDTO<QuestionVO>> pageQuestion(@RequestBody QuestionQueryDTO dto) {
        return R.ok(tbQuestionService.pageQuestion(dto));
    }
    /**
     * 问题详情
     *
     * @param id id
     * @return R<QuestionDTO>
     */
    @GetMapping("/detail-question")
    @ApiOperation(value = "问题详情", notes = "发现问题")
    public R<QuestionDTO> detailQuestion(@RequestParam("id") Long id) {
        TbQuestion question = tbQuestionService.getById(id);
        return R.ok(BeanUtils.copyBean(question, QuestionDTO.class));
    }
    @DeleteMapping("/delete")
    @ApiOperation(value = "删除问题", notes = "发现问题")
    public R<Void> delete(@RequestParam("id") Long id) {
        tbQuestionService.removeById(id);
        return R.ok();
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BasePage.java
@@ -3,6 +3,7 @@
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.DecimalMin;
import java.io.Serializable;
/**
@@ -17,11 +18,13 @@
     * 分页参数,当前页码
     */
    @ApiModelProperty(value = "分页参数,当前页码")
    @DecimalMin(value = "1", message = "当前页码最小为1")
    private Integer pageNum = 1;
    /**
     * 分页参数,每页数量
     */
    @ApiModelProperty(value = "分页参数,每页数量,默认为10")
    @DecimalMin(value = "1", message = "每页数量最低为1")
    private Integer pageSize = 10;
    public Integer getPageNum() {
ruoyi-common/src/main/java/com/ruoyi/common/utils/EasyExcelUtil.java
New file
@@ -0,0 +1,49 @@
package com.ruoyi.common.utils;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
/**
 * @author mitao
 * @date 2024/4/2
 */
public class EasyExcelUtil {
    public static HorizontalCellStyleStrategy getStyleStrategy() {
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 背景设置为灰色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE1.getIndex());
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontHeightInPoints((short) 12);
        // 字体样式
        headWriteFont.setFontName("微软雅黑");
        headWriteCellStyle.setWriteFont(headWriteFont);
        //自动换行
        headWriteCellStyle.setWrapped(false);
        // 水平对齐方式
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        // 垂直对齐方式
        headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
//        contentWriteCellStyle.setFillPatternType(FillPatternType.SQUARES);
        // 背景白色
        contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
        WriteFont contentWriteFont = new WriteFont();
        // 字体大小
        contentWriteFont.setFontHeightInPoints((short) 12);
        // 字体样式
        contentWriteFont.setFontName("宋体");
        contentWriteCellStyle.setWriteFont(contentWriteFont);
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java
@@ -37,7 +37,7 @@
    @TableField("field_id")
    private Long fieldId;
    @ApiModelProperty(value = "字段名", notes = "fieldId = -1 转移支付规模 fieldId = -2 当期GDP")
    @ApiModelProperty(value = "字段名", notes = "fieldId = -1 转移支付规模 fieldId = -2 当期GDP fieldId = -3 备注")
    @TableField("field_name")
    private String fieldName;
ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataFieldDTO.java
@@ -12,7 +12,7 @@
@ApiModel(value = "当前季度基础数据字段数据传输对象")
public class BasicDataFieldDTO {
    @ApiModelProperty(value = "字段id")
    @ApiModelProperty(value = "字段id", notes = "转移支付规模=-1,当期GDP=-2,备注=-3")
    private Long fieldId;
    @ApiModelProperty(value = "字段值")
ruoyi-system/src/main/java/com/ruoyi/system/dto/CurrentFieldsQueryDTO.java
New file
@@ -0,0 +1,27 @@
package com.ruoyi.system.dto;
import com.ruoyi.common.core.domain.BasePage;
import com.ruoyi.common.enums.ReportingStatusEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * @author mitao
 * @date 2024/4/7
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "当前季度字段统计查询数据传输对象")
public class CurrentFieldsQueryDTO extends BasePage {
    private static final long serialVersionUID = 3808984599047049282L;
    @ApiModelProperty(value = "填报部门")
    private String areaName;
    @ApiModelProperty(value = "状态")
    private ReportingStatusEnum status;
    @ApiModelProperty(value = "负责人姓名")
    private String personInCharge;
    @ApiModelProperty(value = "负责人联系电话)")
    private String phoneNumber;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionDTO.java
New file
@@ -0,0 +1,24 @@
package com.ruoyi.system.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
 * @author mitao
 * @date 2024/4/7
 */
@Data
@ApiModel(value = "发现问题数据传输对象")
public class QuestionDTO implements Serializable {
    private static final long serialVersionUID = -8074469734465858811L;
    @ApiModelProperty(value = "问题标题")
    @NotBlank(message = "问题标题不能为空")
    private String title;
    @ApiModelProperty(value = "问题内容")
    @NotBlank(message = "问题内容不能为空")
    private String content;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionQueryDTO.java
New file
@@ -0,0 +1,20 @@
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;
/**
 * @author mitao
 * @date 2024/4/7
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "发现问题分页数据传输对象")
public class QuestionQueryDTO extends BasePage {
    private static final long serialVersionUID = -7645166269898895715L;
    @ApiModelProperty("问题标题")
    private String title;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionUpdDto.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.system.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
 * @author mitao
 * @date 2024/4/7
 */
@Data
@ApiModel(value = "发现问题编辑数据传输对象")
public class QuestionUpdDto implements Serializable {
    private static final long serialVersionUID = 6382858207794071957L;
    @ApiModelProperty(value = "id")
    @NotNull(message = "id不能为空")
    private Long id;
    @ApiModelProperty(value = "问题标题")
    @NotBlank(message = "问题标题不能为空")
    private String title;
    @ApiModelProperty(value = "问题内容")
    @NotBlank(message = "问题内容不能为空")
    private String content;
}
ruoyi-system/src/main/java/com/ruoyi/system/handler/CustomerHandler.java
New file
@@ -0,0 +1,78 @@
package com.ruoyi.system.handler;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.CellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.apache.poi.ss.usermodel.Cell;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CustomerHandler extends AbstractColumnWidthStyleStrategy {
    private static final int MAX_COLUMN_WIDTH = 255;
    //因为在自动列宽的过程中,有些设置地方让列宽显得紧凑,所以做出了个判断
    private static final int COLUMN_WIDTH = 20;
    private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap(8);
    public CustomerHandler() {
    }
    @Override
    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
        if (needSetWidth) {
            Map<Integer, Integer> maxColumnWidthMap = (Map) CACHE.get(writeSheetHolder.getSheetNo());
            if (maxColumnWidthMap == null) {
                maxColumnWidthMap = new HashMap(16);
                CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
            }
            Integer columnWidth = this.dataLength(cellDataList, cell, isHead);
            if (columnWidth >= 0) {
                if (columnWidth > MAX_COLUMN_WIDTH) {
                    columnWidth = MAX_COLUMN_WIDTH;
                } else {
                    if (columnWidth < COLUMN_WIDTH) {
                        columnWidth = columnWidth * 2;
                    }
                }
                Integer maxColumnWidth = (Integer) ((Map) maxColumnWidthMap).get(cell.getColumnIndex());
                if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
                    ((Map) maxColumnWidthMap).put(cell.getColumnIndex(), columnWidth);
                    writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
                }
            }
        }
    }
    private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) {
        if (isHead) {
            return cell.getStringCellValue().getBytes().length;
        } else {
            CellData cellData = (CellData) cellDataList.get(0);
            CellDataTypeEnum type = cellData.getType();
            if (type == null) {
                return -1;
            } else {
                switch (type) {
                    case STRING:
                        return cellData.getStringValue().getBytes().length;
                    case BOOLEAN:
                        return cellData.getBooleanValue().toString().getBytes().length;
                    case NUMBER:
                        return cellData.getNumberValue().toString().getBytes().length;
                    default:
                        return -1;
                }
            }
        }
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/handler/SelectedSheetWriteHandler.java
New file
@@ -0,0 +1,47 @@
package com.ruoyi.system.handler;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import lombok.Data;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.XSSFDataValidation;
import java.util.Map;
@Data
public class SelectedSheetWriteHandler implements SheetWriteHandler {
    private Map<Integer, String[]> selectedMap;
    public SelectedSheetWriteHandler(Map<Integer, String[]> selectedMap) {
        this.selectedMap = selectedMap;
    }
    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        //获取sheet页
        Sheet sheet = writeSheetHolder.getSheet();
        int firstRow = writeSheetHolder.getHead().get(0).size() + 1;
        ///开始设置下拉框
        DataValidationHelper helper = sheet.getDataValidationHelper();
        for (Map.Entry<Integer, String[]> entry : selectedMap.entrySet()) {
            /***起始行、终止行、起始列、终止列**/
            CellRangeAddressList addressList = new CellRangeAddressList(firstRow, firstRow, entry.getKey(), entry.getKey());
            /***设置下拉框数据**/
            DataValidationConstraint constraint = helper.createExplicitListConstraint(entry.getValue());
            DataValidation dataValidation = helper.createValidation(constraint, addressList);
            /***处理Excel兼容性问题**/
            if (dataValidation instanceof XSSFDataValidation) {
                dataValidation.setSuppressDropDownArrow(true);
                dataValidation.setShowErrorBox(true);
            } else {
                dataValidation.setSuppressDropDownArrow(false);
            }
            sheet.addValidationData(dataValidation);
        }
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataMapper.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.TbBasicData;
import com.ruoyi.system.dto.CurrentFieldsQueryDTO;
import com.ruoyi.system.vo.CurrentFieldsVO;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
@@ -13,4 +17,5 @@
 */
public interface TbBasicDataMapper extends BaseMapper<TbBasicData> {
    Page<CurrentFieldsVO> fieldsStatics(@Param("page") Page<CurrentFieldsVO> page, @Param("dto") CurrentFieldsQueryDTO dto, @Param("nowQuarter") String nowQuarter);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java
@@ -5,9 +5,9 @@
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.ScoreQuery;
import com.ruoyi.system.vo.BasicDataReportingVO;
import com.ruoyi.system.vo.ScoreVO;
import com.ruoyi.system.vo.*;
import org.springframework.web.multipart.MultipartFile;
/**
@@ -29,4 +29,11 @@
    void importBasicData(MultipartFile file) throws Exception;
    PageDTO<ScoreVO> pageScore(ScoreQuery query);
    R<CurrentFieldsDetailVO> fieldsDetails(Long id);
    R<PageDTO<CurrentFieldsVO>> fieldsStatics(CurrentFieldsQueryDTO dto);
    CurrentFieldsAllVO fieldsStaticsAll();
}
ruoyi-system/src/main/java/com/ruoyi/system/service/TbQuestionService.java
@@ -1,7 +1,12 @@
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
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.vo.QuestionVO;
/**
 * <p>
@@ -13,4 +18,9 @@
 */
public interface TbQuestionService extends IService<TbQuestion> {
    void addQuestion(QuestionDTO dto);
    void editQuestion(QuestionUpdDto dto);
    PageDTO<QuestionVO> pageQuestion(QuestionQueryDTO dto);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java
@@ -15,6 +15,7 @@
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;
@@ -23,9 +24,7 @@
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.FieldsTreeVO;
import com.ruoyi.system.vo.ScoreVO;
import com.ruoyi.system.vo.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -61,6 +60,19 @@
    private final TbBasicDataConfigService tbBasicDataConfigService;
    private final TbBasicDataConfigDetailService tbBasicDataConfigDetailService;
    private final TbScoreService tbScoreService;
    private final ISysUserService sysUserService;
    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(FieldBuildUtil.formatNumberWithCommas(tbBasicDataField.getFieldValue()));
            }
            if (field.getChildren() != null && !field.getChildren().isEmpty()) {
                setFieldValues(field.getChildren(), fieldMap);
            }
        }
    }
    @Override
    public R<BasicDataReportingVO> getBasicFields() throws Exception {
@@ -72,8 +84,8 @@
        if (Objects.isNull(dept)) {
            throw new ServiceException(String.format("区划代码%s不存在", deptAreaCode));
        }
        Date date = new Date();
        //当前所在季度
        Date date = new Date();
        int quarterOfYear = DateUtils.getQuarterOfYear(date);
        String quarterOfYearStr = NumberDisplaceChineseUtil.numberToChinese(quarterOfYear);
        Map<String, Date> quarterDate = DateUtils.getQuarterDate(date);
@@ -111,6 +123,10 @@
        roots.add(fieldsTreeVO2);
        if (CollUtils.isNotEmpty(list)) {
            FieldBuildUtil.buildTreeFromTbFieldList(list,roots);
            FieldsTreeVO remark = new FieldsTreeVO();
            remark.setId(-3L);
            remark.setName("备注");
            roots.add(remark);
            vo.setFields(roots);
        }
        if (Objects.isNull(basicData)) {
@@ -131,17 +147,6 @@
            }
        }
        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
@@ -176,10 +181,15 @@
        transferPaymentScale.setFieldValue(tbBasicData.getTransferPaymentScale());
        tbBasicDataFields.add(transferPaymentScale);
        TbBasicDataField currentGdp = new TbBasicDataField();
        transferPaymentScale.setBasicDataId(tbBasicData.getId());
        transferPaymentScale.setFieldId(-2L);
        transferPaymentScale.setFieldValue(tbBasicData.getCurrentGdp());
        currentGdp.setBasicDataId(tbBasicData.getId());
        currentGdp.setFieldId(-2L);
        currentGdp.setFieldValue(tbBasicData.getCurrentGdp());
        tbBasicDataFields.add(currentGdp);
        TbBasicDataField remark = new TbBasicDataField();
        remark.setBasicDataId(tbBasicData.getId());
        remark.setFieldId(-3L);
        remark.setFieldValue(tbBasicData.getRemark());
        tbBasicDataFields.add(remark);
        //将该基础数据的动态字段数据全部删除
        tbBasicDataFieldService.remove(Wrappers.<TbBasicDataField>lambdaQuery().eq(TbBasicDataField::getBasicDataId, tbBasicData.getId()));
        tbBasicDataFieldService.saveBatch(tbBasicDataFields);
@@ -387,4 +397,156 @@
        Page<ScoreVO> pageVO = tbScoreService.pageScore(query,page);
        return PageDTO.of(pageVO);
    }
    @Override
    public R<CurrentFieldsDetailVO> fieldsDetails(Long id) {
        // 从数据库中获取基本数据
        TbBasicData basicData = this.getById(id);
        if (Objects.isNull(basicData)) {
            throw new ServiceException("非法参数");
        }
        CurrentFieldsDetailVO vo = BeanUtils.copyBean(basicData, CurrentFieldsDetailVO.class);
        //查询用户信息
        sysUserService.lambdaQuery()
                .eq(SysUser::getAreaCode, basicData.getDeptAreaCode())
                .eq(SysUser::getUserType, UserTypeEnum.DEPARTMENT.getCode())
                .oneOpt()
                .ifPresent(item -> {
                    vo.setAreaName(item.getAreaName());
                    vo.setPhoneNumber(item.getPhoneNumber());
                    vo.setPersonInCharge(item.getPersonInCharge());
                });
        // 查询动态字段
        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 = tbFieldService.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);
        basicDataFields.stream().filter(item -> item.getFieldId() == -3).findFirst().ifPresent(item -> {
            FieldsTreeVO fieldsTreeVO = new FieldsTreeVO();
            fieldsTreeVO.setId(item.getFieldId());
            fieldsTreeVO.setName("备注");
            fieldsTreeVO.setValue(item.getFieldValue());
            fieldsTreeVO.setCategory(Boolean.FALSE);
            root.add(fieldsTreeVO);
        });
        vo.setFields(root);
        return R.ok(vo);
    }
    @Override
    public R<PageDTO<CurrentFieldsVO>> fieldsStatics(CurrentFieldsQueryDTO dto) {
        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("查询失败");
        }
    }
    @Override
    public CurrentFieldsAllVO fieldsStaticsAll() {
        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(currentGdp);
        //当前所在季度
        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);
            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("查询失败");
        }
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java
@@ -188,6 +188,12 @@
            root.add(fieldsTreeVO);
        });
        FieldBuildUtil.buildTreeStructure(basicDataFields, fieldMap, root);
        FieldsTreeVO fieldsTreeVO = new FieldsTreeVO();
        fieldsTreeVO.setId(-3L);
        fieldsTreeVO.setName("备注");
        fieldsTreeVO.setValue(vo.getRemark());
        fieldsTreeVO.setCategory(Boolean.FALSE);
        root.add(fieldsTreeVO);
        vo.setFields(root);
        return vo;
    }
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbQuestionServiceImpl.java
@@ -1,9 +1,17 @@
package com.ruoyi.system.service.impl;
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.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.service.TbQuestionService;
import com.ruoyi.system.vo.QuestionVO;
import org.springframework.stereotype.Service;
/**
@@ -17,4 +25,23 @@
@Service
public class TbQuestionServiceImpl extends ServiceImpl<TbQuestionMapper, TbQuestion> implements TbQuestionService {
    @Override
    public void addQuestion(QuestionDTO dto) {
        TbQuestion tbQuestion = BeanUtils.copyBean(dto, TbQuestion.class);
        this.save(tbQuestion);
    }
    @Override
    public void editQuestion(QuestionUpdDto dto) {
        TbQuestion tbQuestion = BeanUtils.copyBean(dto, TbQuestion.class);
        this.updateById(tbQuestion);
    }
    @Override
    public PageDTO<QuestionVO> pageQuestion(QuestionQueryDTO dto) {
        Page<TbQuestion> page = this.lambdaQuery()
                .like(StringUtils.isNotBlank(dto.getTitle()), TbQuestion::getTitle, dto.getTitle())
                .page(new Page<>(dto.getPageNum(), dto.getPageSize()));
        return PageDTO.of(page, QuestionVO.class);
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/utils/FieldBuildUtil.java
@@ -5,6 +5,7 @@
import com.ruoyi.system.domain.TbField;
import com.ruoyi.system.vo.FieldsTreeVO;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -33,7 +34,7 @@
                String levelThreeCategory = tbField.getLevelThreeCategory();
                Long id = tbField.getId();
                String fieldName = tbField.getFieldName();
                String fieldValue = item.getFieldValue();
                String fieldValue = formatNumberWithCommas(item.getFieldValue());
                FieldsTreeVO field = new FieldsTreeVO();
                field.setId(id);
                field.setName(fieldName);
@@ -134,4 +135,19 @@
            }
        }
    }
    /**
     * 数值类型格式化 数字类型字符串,每三位增加逗号
     *
     * @param fieldValue 整数类型的字符串
     * @return 格式化后的值
     */
    public static String formatNumberWithCommas(String fieldValue) {
        if (fieldValue != null && fieldValue.matches("\\d+")) {
            DecimalFormat df = new DecimalFormat("#,###");
            return df.format(Long.parseLong(fieldValue));
        } else {
            return fieldValue; // 不满足条件时返回传入的值
        }
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataCategoryVO.java
@@ -5,16 +5,20 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
 * @author mitao
 * @date 2024/3/18
 */
@Data
@ApiModel(value="基础数据分类视图对象")
public class BasicDataCategoryVO {
public class BasicDataCategoryVO implements Serializable {
    private static final long serialVersionUID = -1547151291021868164L;
    @ApiModelProperty(value = "基础数据分类id")
    private Integer id;
    private Long id;
    @ApiModelProperty(value = "基础数据分类名称")
    private String basicDataCategoryName;
ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataConfigDetailVO.java
@@ -22,7 +22,7 @@
    @ApiModelProperty(value = "id")
    @NotNull(message = "id不能为空")
    private Integer id;
    private Long id;
    @ApiModelProperty(value = "类型名称")
    @NotBlank(message = "类型名称不能为空")
ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataConfigVO.java
@@ -6,16 +6,20 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
 * @author mitao
 * @date 2024/3/18
 */
@Data
@ApiModel(value="基础数据视图对象")
public class BasicDataConfigVO {
public class BasicDataConfigVO implements Serializable {
    private static final long serialVersionUID = -1181996283443136774L;
    @ApiModelProperty(value = "基础数据配置id")
    private Integer id;
    private Long id;
    @ApiModelProperty(value = "类型名称")
    private String typeName;
ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataFieldVO.java
@@ -1,12 +1,13 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
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.Date;
import java.util.List;
/**
@@ -38,9 +39,11 @@
    private List<FieldsTreeVO> fields;
    @ApiModelProperty(value = "首次填报时间")
    private LocalDateTime createTime;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    private Date createTime;
    @ApiModelProperty(value = "填报完成时间",notes = "状态为已填报才展示")
    private LocalDateTime updateTime;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    private Date updateTime;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataReportingVO.java
@@ -1,12 +1,13 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
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.Date;
import java.util.List;
/**
@@ -29,10 +30,12 @@
    private ReportingStatusEnum status;
    @ApiModelProperty(value = "首次填报时间")
    private LocalDateTime createTime;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    private Date createTime;
    @ApiModelProperty(value = "填报完成时间",notes = "状态为已填报才展示")
    private LocalDateTime updateTime;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    private Date updateTime;
    //1:未填报 2:数据缺失 3:已填报
    @ApiModelProperty(value = "字段")
ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataVO.java
@@ -17,7 +17,7 @@
    private static final long serialVersionUID = -2405812660664664181L;
    @ApiModelProperty(value = "基础数据id")
    private Integer id;
    private Long id;
    @ApiModelProperty(value = "季度")
    private String quarter;
ruoyi-system/src/main/java/com/ruoyi/system/vo/CalculateVO.java
@@ -1,7 +1,5 @@
package com.ruoyi.system.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -15,12 +13,11 @@
    private static final long serialVersionUID = 4439552435460575151L;
    @ApiModelProperty(value = "id")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    private Integer id;
    @ApiModelProperty(value = "键")
    private String key;
    @ApiModelProperty(value = "值")
    private String value;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsAllVO.java
New file
@@ -0,0 +1,25 @@
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.List;
/**
 * @author mitao
 * @date 2024/4/7
 */
@Data
@ApiModel(value = "字段统计查看全部视图对象")
public class CurrentFieldsAllVO implements Serializable {
    private static final long serialVersionUID = -4726257158363163342L;
    @ApiModelProperty("表头")
    private List<FieldsTreeVO> fields;
    @ApiModelProperty("值")
    private List<Object> value;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsDetailVO.java
New file
@@ -0,0 +1,42 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
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.util.Date;
import java.util.List;
/**
 * @author mitao
 * @date 2024/3/19
 */
@Data
@ApiModel(value = "字段统计详情视图对象")
public class CurrentFieldsDetailVO implements Serializable {
    private static final long serialVersionUID = -4453903771078396720L;
    @ApiModelProperty(value = "填报部门")
    private String areaName;
    @ApiModelProperty(value = "负责人姓名")
    private String personInCharge;
    @ApiModelProperty(value = "负责人联系电话)")
    private String phoneNumber;
    @ApiModelProperty(value = "填报时间")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    private Date createTime;
    @ApiModelProperty(value = "状态")
    private ReportingStatusEnum status;
    @ApiModelProperty(value = "动态字段")
    private List<FieldsTreeVO> fields;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsVO.java
New file
@@ -0,0 +1,43 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
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.util.Date;
/**
 * @author mitao
 * @date 2024/4/7
 */
@Data
@ApiModel(value = "当前季度数据-字段统计视图对象")
public class CurrentFieldsVO implements Serializable {
    private static final long serialVersionUID = 8678843789669990102L;
    @ApiModelProperty(value = "基础数据id")
    private Long id;
    @ApiModelProperty(value = "季度")
    private String quarter;
    @ApiModelProperty(value = "填报部门")
    private String areaName;
    @ApiModelProperty(value = "负责人姓名")
    private String personInCharge;
    @ApiModelProperty(value = "负责人联系电话)")
    private String phoneNumber;
    @ApiModelProperty(value = "填报时间")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    private Date createTime;
    @ApiModelProperty(value = "状态")
    private ReportingStatusEnum status;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/DeptVO.java
@@ -5,16 +5,20 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
 * @author mitao
 * @date 2024/3/13
 */
@Data
@ApiModel(value="部门VO")
public class DeptVO {
public class DeptVO implements Serializable {
    private static final long serialVersionUID = 459136043020691805L;
    @ApiModelProperty(value = "部门id")
    private Integer userId;
    private Long userId;
    @ApiModelProperty(value = "部门地区")
    private String areaName;
ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryDetailVO.java
@@ -4,6 +4,7 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@@ -13,7 +14,10 @@
 */
@Data
@ApiModel(value="字段分类详情视图对象")
public class FieldCategoryDetailVO {
public class FieldCategoryDetailVO implements Serializable {
    private static final long serialVersionUID = -9032349498306349055L;
    @ApiModelProperty(value = "分类id")
    private Long id;
ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryVO.java
@@ -5,14 +5,20 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
 * @author mitao
 * @date 2024/3/14
 */
@Data
@ApiModel(value="字段分类视图对象")
public class FieldCategoryVO {
public class FieldCategoryVO implements Serializable {
    private static final long serialVersionUID = 6367532315341833784L;
    @ApiModelProperty(value = "分类id")
    private Long id;
    @ApiModelProperty(value = "状态(0=展示 1=隐藏)")
ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldVO.java
@@ -6,13 +6,17 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
 * @author mitao
 * @date 2024/3/15
 */
@Data
@ApiModel(value="字段视图对象")
public class FieldVO {
public class FieldVO implements Serializable {
    private static final long serialVersionUID = -8474307057802966503L;
    @ApiModelProperty(value = "字段id")
    private Long id;
ruoyi-system/src/main/java/com/ruoyi/system/vo/QuestionVO.java
New file
@@ -0,0 +1,30 @@
package com.ruoyi.system.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
/**
 * @author mitao
 * @date 2024/4/7
 */
public class QuestionVO implements Serializable {
    private static final long serialVersionUID = -7560198211729183682L;
    @ApiModelProperty(value = "问题id")
    private Long id;
    @ApiModelProperty(value = "问题标题")
    private String title;
    @ApiModelProperty(value = "问题内容")
    private String content;
    @ApiModelProperty(value = "填报时间")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    private Date createTime;
}
ruoyi-system/src/main/resources/mapper/system/TbBasicDataMapper.xml
@@ -22,5 +22,41 @@
    <sql id="Base_Column_List">
        id, quarter, dept_id, transfer_payment_scale, current_gdp, remark, status, del_flag, create_by, create_time, update_by, update_time
    </sql>
    <select id="fieldsStatics" resultType="com.ruoyi.system.vo.CurrentFieldsVO">
        SELECT
        su.area_name,
        IF(tbd.`quarter` IS NULL, CONCAT(YEAR(NOW()), '年',
        CASE
        WHEN MONTH(NOW()) BETWEEN 1 AND 3 THEN '一季度'
        WHEN MONTH(NOW()) BETWEEN 4 AND 6 THEN '二季度'
        WHEN MONTH(NOW()) BETWEEN 7 AND 9 THEN '三季度'
        ELSE '四季度'
        END), tbd.`quarter`) AS `quarter`,
        su.person_in_charge,
        su.phone_number,
        tbd.create_time,
        COALESCE(tbd.`status`, 1) AS `status`
        FROM
        (SELECT * FROM sys_user WHERE user_type = 2) su
        LEFT JOIN
        (SELECT * FROM tb_basic_data WHERE `quarter` = #{nowQuarter}) tbd ON su.area_code = tbd.dept_area_code
        <where>
            <if test="nowQuarter != null and nowQuarter !=''">
                tbd.quarter LIKE CONCAT('%',#{nowQuarter},'%')
            </if>
            <if test="dto.areaName != null and dto.areaName !=''">
                su.area_name LIKE CONCAT('%',#{dto.areaName},'%')
            </if>
            <if test="dto.status != null and dto.status !=''">
                tbd.status = #{dto.status}
            </if>
            <if test="dto.personInCharge != null and dto.personInCharge !=''">
                su.person_in_charge LIKE CONCAT('%',#{dto.personInCharge},'%')
            </if>
            <if test="dto.phoneNumber != null and dto.phoneNumber != ''">
                su.phone_number LIKE CONCAT('%',#{dto.phoneNumber},'%')
            </if>
        </where>
    </select>
</mapper>