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