From 5980a5fed8092f9866cb2f6a8b74abb7d631c018 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期日, 07 四月 2024 18:26:47 +0800
Subject: [PATCH] 平台端 当前季度数据接口

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java      |  163 +++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataFieldVO.java                      |    9 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldVO.java                               |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataConfigVO.java                     |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java      |  198 ++++++++++-
 ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataVO.java                           |    2 
 ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/HistoryDataController.java    |   18 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsAllVO.java                    |   25 +
 ruoyi-system/src/main/java/com/ruoyi/system/utils/FieldBuildUtil.java                     |   18 +
 ruoyi-system/src/main/resources/mapper/system/TbBasicDataMapper.xml                       |   36 ++
 ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java |   20 +
 ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionQueryDTO.java                     |   20 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java          |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/handler/CustomerHandler.java                  |   78 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryDetailVO.java                 |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbQuestionService.java                |   10 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionUpdDto.java                       |   28 +
 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BasePage.java                     |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataFieldDTO.java                    |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/DeptVO.java                                |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataCategoryVO.java                   |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataConfigDetailVO.java               |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataReportingVO.java                  |    9 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataMapper.java                 |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java               |   11 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbQuestionServiceImpl.java       |   27 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/CalculateVO.java                           |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionDTO.java                          |   24 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsVO.java                       |   43 ++
 ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryVO.java                       |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/CurrentFieldsQueryDTO.java                |   27 +
 ruoyi-common/src/main/java/com/ruoyi/common/utils/EasyExcelUtil.java                      |   49 ++
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java                  |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsDetailVO.java                 |   42 ++
 ruoyi-system/src/main/java/com/ruoyi/system/vo/QuestionVO.java                            |   30 +
 ruoyi-system/src/main/java/com/ruoyi/system/handler/SelectedSheetWriteHandler.java        |   47 ++
 36 files changed, 959 insertions(+), 46 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 458aa5e..99a5d3e 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
@@ -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) {
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 40ed183..b20c23a 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
@@ -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) {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java
new file mode 100644
index 0000000..978b174
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java
@@ -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();
+    }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BasePage.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BasePage.java
index b7d844c..fd3d0c2 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BasePage.java
+++ b/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() {
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/EasyExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/EasyExcelUtil.java
new file mode 100644
index 0000000..222222b
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/EasyExcelUtil.java
@@ -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);
+    }
+
+}
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 18a93aa..523b5fd 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,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;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataFieldDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataFieldDTO.java
index 9e40e64..6edebdd 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataFieldDTO.java
+++ b/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 = "字段值")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/CurrentFieldsQueryDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/CurrentFieldsQueryDTO.java
new file mode 100644
index 0000000..3bf01f3
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/CurrentFieldsQueryDTO.java
@@ -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;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionDTO.java
new file mode 100644
index 0000000..ef724ed
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionDTO.java
@@ -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;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionQueryDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionQueryDTO.java
new file mode 100644
index 0000000..66d08ad
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionQueryDTO.java
@@ -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;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionUpdDto.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionUpdDto.java
new file mode 100644
index 0000000..d22eedd
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/QuestionUpdDto.java
@@ -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;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/handler/CustomerHandler.java b/ruoyi-system/src/main/java/com/ruoyi/system/handler/CustomerHandler.java
new file mode 100644
index 0000000..6f8b0dd
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/handler/CustomerHandler.java
@@ -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;
+                }
+            }
+        }
+    }
+}
+
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/handler/SelectedSheetWriteHandler.java b/ruoyi-system/src/main/java/com/ruoyi/system/handler/SelectedSheetWriteHandler.java
new file mode 100644
index 0000000..d21bc69
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/handler/SelectedSheetWriteHandler.java
@@ -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);
+        }
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataMapper.java
index c04cc53..ee6f9fe 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbBasicDataMapper.java
@@ -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);
 }
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 983022e..86bbc69 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java
@@ -5,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();
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbQuestionService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbQuestionService.java
index 62dc2ee..fdf7f5f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbQuestionService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbQuestionService.java
@@ -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);
 }
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 301ee1b..cbb4220 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java
@@ -15,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("查询失败");
+        }
+    }
 }
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 12285e4..4534eac 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
@@ -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;
     }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbQuestionServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbQuestionServiceImpl.java
index c1e6adb..d66f98e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbQuestionServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbQuestionServiceImpl.java
@@ -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);
+    }
 }
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
index 47fbb5a..ccd45b3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/utils/FieldBuildUtil.java
+++ b/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; // 不满足条件时返回传入的值
+        }
+    }
 }
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataCategoryVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataCategoryVO.java
index eeb2db4..0dc0df9 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataCategoryVO.java
+++ b/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;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataConfigDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataConfigDetailVO.java
index 6b4f245..1d7e4f9 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataConfigDetailVO.java
+++ b/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 = "类型名称不能为空")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataConfigVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataConfigVO.java
index d2b32f4..4c628cb 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataConfigVO.java
+++ b/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;
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 6417359..74a88a7 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,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;
 
 }
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 71646a5..49117f9 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
@@ -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 = "字段")
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
index 9313a10..80a0642 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataVO.java
+++ b/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;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/CalculateVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/CalculateVO.java
index ca2e23d..7af94d0 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/CalculateVO.java
+++ b/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;
 }
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsAllVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsAllVO.java
new file mode 100644
index 0000000..9f8aab2
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsAllVO.java
@@ -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;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsDetailVO.java
new file mode 100644
index 0000000..3a74279
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsDetailVO.java
@@ -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;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsVO.java
new file mode 100644
index 0000000..1fc2bba
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/CurrentFieldsVO.java
@@ -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;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/DeptVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/DeptVO.java
index f897a53..205c52f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/DeptVO.java
+++ b/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;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryDetailVO.java
index 2acfb9f..e0fa685 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryDetailVO.java
+++ b/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;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryVO.java
index 9e04e0e..41a0f0d 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryVO.java
+++ b/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=隐藏)")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldVO.java
index 9672e7f..e7c8671 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldVO.java
+++ b/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;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/QuestionVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/QuestionVO.java
new file mode 100644
index 0000000..c5f5188
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/QuestionVO.java
@@ -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;
+
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/TbBasicDataMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TbBasicDataMapper.xml
index fb126df..b3738eb 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TbBasicDataMapper.xml
+++ b/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>

--
Gitblit v1.7.1