Procházet zdrojové kódy

质控分析报告-质控活动

chenshudong před 1 měsícem
rodič
revize
398ee4aab8
23 změnil soubory, kde provedl 1416 přidání a 2 odebrání
  1. 68 0
      airport-admin/src/main/java/com/sundot/airport/web/controller/system/SysCheckAnalysisReportController.java
  2. 27 0
      airport-check/src/main/java/com/sundot/airport/check/mapper/CheckLargeScreenMapper.java
  3. 19 0
      airport-check/src/main/java/com/sundot/airport/check/service/ICheckLargeScreenService.java
  4. 417 2
      airport-check/src/main/java/com/sundot/airport/check/service/impl/CheckLargeScreenServiceImpl.java
  5. 57 0
      airport-check/src/main/resources/mapper/check/CheckLargeScreenMapper.xml
  6. 46 0
      airport-common/src/main/java/com/sundot/airport/common/core/domain/SysAnalysisReportCompareItemDto.java
  7. 44 0
      airport-common/src/main/java/com/sundot/airport/common/core/domain/SysAnalysisReportDateRangeDto.java
  8. 41 0
      airport-common/src/main/java/com/sundot/airport/common/core/domain/SysAnalysisReportParamDto.java
  9. 26 0
      airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckProblemCorrectionDto.java
  10. 51 0
      airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckProblemCorrectionItemDto.java
  11. 37 0
      airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckProblemDiscoveryDto.java
  12. 50 0
      airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckProblemDiscoveryItemDto.java
  13. 26 0
      airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckProblemDistributionDto.java
  14. 31 0
      airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckProblemDistributionItemDto.java
  15. 31 0
      airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckTaskDto.java
  16. 60 0
      airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckTaskItemDto.java
  17. 37 0
      airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckTaskTypeItemDto.java
  18. 34 0
      airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportDto.java
  19. 27 0
      airport-common/src/main/java/com/sundot/airport/common/enums/CheckTaskTypeEnum.java
  20. 28 0
      airport-common/src/main/java/com/sundot/airport/common/enums/CompareResultTypeEnum.java
  21. 28 0
      airport-common/src/main/java/com/sundot/airport/common/enums/CompareTypeEnum.java
  22. 28 0
      airport-common/src/main/java/com/sundot/airport/common/enums/DateRangeQueryTypeEnum.java
  23. 203 0
      airport-common/src/main/java/com/sundot/airport/common/utils/DateRangeQueryUtils.java

+ 68 - 0
airport-admin/src/main/java/com/sundot/airport/web/controller/system/SysCheckAnalysisReportController.java

@@ -0,0 +1,68 @@
1
+package com.sundot.airport.web.controller.system;
2
+
3
+import cn.hutool.core.util.StrUtil;
4
+import com.sundot.airport.check.service.ICheckLargeScreenService;
5
+import com.sundot.airport.common.core.controller.BaseController;
6
+import com.sundot.airport.common.core.domain.AjaxResult;
7
+import com.sundot.airport.common.core.domain.BaseLargeScreenQueryParamDto;
8
+import com.sundot.airport.common.core.domain.SysAnalysisReportDateRangeDto;
9
+import com.sundot.airport.common.core.domain.SysAnalysisReportParamDto;
10
+import com.sundot.airport.common.core.domain.SysCheckAnalysisReportCheckProblemDistributionDto;
11
+import com.sundot.airport.common.core.domain.SysCheckAnalysisReportDto;
12
+import com.sundot.airport.common.enums.DateRangeQueryTypeEnum;
13
+import com.sundot.airport.common.utils.DateRangeQueryUtils;
14
+import org.springframework.beans.factory.annotation.Autowired;
15
+import org.springframework.web.bind.annotation.GetMapping;
16
+import org.springframework.web.bind.annotation.PostMapping;
17
+import org.springframework.web.bind.annotation.RequestBody;
18
+import org.springframework.web.bind.annotation.RequestMapping;
19
+import org.springframework.web.bind.annotation.RestController;
20
+
21
+import java.util.ArrayList;
22
+import java.util.List;
23
+
24
+/**
25
+ * 质控分析报告
26
+ *
27
+ * @author ruoyi
28
+ */
29
+@RestController
30
+@RequestMapping("/system/analysisReport")
31
+public class SysCheckAnalysisReportController extends BaseController {
32
+
33
+    @Autowired
34
+    private ICheckLargeScreenService checkLargeScreenService;
35
+
36
+    /**
37
+     * 质控活动
38
+     */
39
+    @PostMapping("/check")
40
+    public AjaxResult checkAnalysisReport(@RequestBody SysAnalysisReportParamDto paramDto) {
41
+        List<SysAnalysisReportDateRangeDto> dateRangeList = new ArrayList<>();
42
+        if (StrUtil.equals(DateRangeQueryTypeEnum.YEAR.getCode(), paramDto.getDateRangeQueryType())) {
43
+            dateRangeList.add(DateRangeQueryUtils.getPreviousYearRange(paramDto.getYear()));
44
+            dateRangeList.add(DateRangeQueryUtils.getYearRange(paramDto.getYear(), null));
45
+        } else if (StrUtil.equals(DateRangeQueryTypeEnum.QUARTER.getCode(), paramDto.getDateRangeQueryType())) {
46
+            dateRangeList.add(DateRangeQueryUtils.getLastYearSameQuarterRange(paramDto.getYear(), paramDto.getQuarter()));
47
+            dateRangeList.add(DateRangeQueryUtils.getPreviousQuarterRange(paramDto.getYear(), paramDto.getQuarter()));
48
+            dateRangeList.add(DateRangeQueryUtils.getQuarterRange(paramDto.getYear(), paramDto.getQuarter(), null));
49
+        } else if (StrUtil.equals(DateRangeQueryTypeEnum.MONTH.getCode(), paramDto.getDateRangeQueryType())) {
50
+            dateRangeList.add(DateRangeQueryUtils.getLastYearSameMonthRange(paramDto.getYear(), paramDto.getMonth()));
51
+            dateRangeList.add(DateRangeQueryUtils.getPreviousMonthRange(paramDto.getYear(), paramDto.getMonth()));
52
+            dateRangeList.add(DateRangeQueryUtils.getMonthRange(paramDto.getYear(), paramDto.getMonth(), null));
53
+        }
54
+        paramDto.setDateRangeList(dateRangeList);
55
+        SysCheckAnalysisReportDto result = checkLargeScreenService.checkAnalysisReport(paramDto);
56
+        return success(result);
57
+    }
58
+
59
+    /**
60
+     * 质控活动-问题分布统计
61
+     */
62
+    @GetMapping("/checkProblemDistribution")
63
+    public AjaxResult checkAnalysisReportCheckProblemDistributionDto(BaseLargeScreenQueryParamDto paramDto) {
64
+        SysCheckAnalysisReportCheckProblemDistributionDto result = checkLargeScreenService.getCheckProblemDistribution(paramDto);
65
+        return success(result);
66
+    }
67
+
68
+}

+ 27 - 0
airport-check/src/main/java/com/sundot/airport/check/mapper/CheckLargeScreenMapper.java

@@ -17,7 +17,10 @@ import com.sundot.airport.check.domain.CheckLargeScreenProblemQueryParamDto;
17 17
 import com.sundot.airport.check.domain.CheckLargeScreenProblemTrendDto;
18 18
 import com.sundot.airport.check.domain.CheckTask;
19 19
 import com.sundot.airport.common.core.domain.BaseLargeScreenQueryParamDto;
20
+import com.sundot.airport.common.core.domain.SysCheckAnalysisReportCheckProblemCorrectionItemDto;
21
+import com.sundot.airport.common.core.domain.SysCheckAnalysisReportCheckProblemDistributionItemDto;
20 22
 
23
+import java.math.BigDecimal;
21 24
 import java.util.List;
22 25
 
23 26
 /**
@@ -259,4 +262,28 @@ public interface CheckLargeScreenMapper {
259 262
      */
260 263
     public Integer checkCorrectionCount(BaseLargeScreenQueryParamDto dto);
261 264
 
265
+    /**
266
+     * 问题发现总数
267
+     *
268
+     * @param dto 大屏查询参数
269
+     * @return 问题发现总数
270
+     */
271
+    public BigDecimal problemDistributionTotal(BaseLargeScreenQueryParamDto dto);
272
+
273
+    /**
274
+     * 问题分布统计
275
+     *
276
+     * @param dto 大屏查询参数
277
+     * @return 问题分布统计
278
+     */
279
+    public List<SysCheckAnalysisReportCheckProblemDistributionItemDto> problemDistributionStatistics(BaseLargeScreenQueryParamDto dto);
280
+
281
+    /**
282
+     * 问题整改统计
283
+     *
284
+     * @param dto 大屏查询参数
285
+     * @return 问题整改统计
286
+     */
287
+    public List<SysCheckAnalysisReportCheckProblemCorrectionItemDto> problemCorrectionStatistics(BaseLargeScreenQueryParamDto dto);
288
+
262 289
 }

+ 19 - 0
airport-check/src/main/java/com/sundot/airport/check/service/ICheckLargeScreenService.java

@@ -15,6 +15,9 @@ import com.sundot.airport.check.domain.CheckTask;
15 15
 import com.sundot.airport.common.core.domain.BaseLargeScreenQueryParamDto;
16 16
 import com.sundot.airport.common.core.domain.CheckLargeScreenHomePageItemDto;
17 17
 import com.sundot.airport.common.core.domain.CheckLargeScreenHomePageRankingDto;
18
+import com.sundot.airport.common.core.domain.SysAnalysisReportParamDto;
19
+import com.sundot.airport.common.core.domain.SysCheckAnalysisReportCheckProblemDistributionDto;
20
+import com.sundot.airport.common.core.domain.SysCheckAnalysisReportDto;
18 21
 import com.sundot.airport.common.core.domain.SysHomeReportDetailDto;
19 22
 import com.sundot.airport.common.core.domain.SysLargeScreenDetailDto;
20 23
 
@@ -203,4 +206,20 @@ public interface ICheckLargeScreenService {
203 206
      * @return 首页报表-巡检合格率数据
204 207
      */
205 208
     public SysHomeReportDetailDto checkData(BaseLargeScreenQueryParamDto dto);
209
+
210
+    /**
211
+     * 质控分析报告-质控活动
212
+     *
213
+     * @param paramDto 质控分析报告-质控活动查询参数
214
+     * @return 质控分析报告-质控活动
215
+     */
216
+    public SysCheckAnalysisReportDto checkAnalysisReport(SysAnalysisReportParamDto paramDto);
217
+
218
+    /**
219
+     * 质控分析报告-质控活动-问题分布统计
220
+     *
221
+     * @param paramDto 查询参数
222
+     * @return 质控分析报告-质控活动-问题分布统计
223
+     */
224
+    public SysCheckAnalysisReportCheckProblemDistributionDto getCheckProblemDistribution(BaseLargeScreenQueryParamDto paramDto);
206 225
 }

+ 417 - 2
airport-check/src/main/java/com/sundot/airport/check/service/impl/CheckLargeScreenServiceImpl.java

@@ -16,6 +16,8 @@ import com.sundot.airport.check.domain.CheckLargeScreenCorrectionQueryParamDto;
16 16
 import com.sundot.airport.check.domain.CheckLargeScreenHomePageCheckCorrectionSqlDto;
17 17
 import com.sundot.airport.check.domain.CheckLargeScreenHomePageCheckRecordSqlDto;
18 18
 import com.sundot.airport.check.domain.CheckLargeScreenHomePageDto;
19
+import com.sundot.airport.common.core.domain.CheckLargeScreenHomePageItemDto;
20
+import com.sundot.airport.common.core.domain.CheckLargeScreenHomePageRankingDto;
19 21
 import com.sundot.airport.check.domain.CheckLargeScreenInspectionExecuteDto;
20 22
 import com.sundot.airport.check.domain.CheckLargeScreenInspectionExecuteItemDto;
21 23
 import com.sundot.airport.check.domain.CheckLargeScreenInspectionExecuteUserDto;
@@ -29,9 +31,20 @@ import com.sundot.airport.check.mapper.CheckLargeScreenMapper;
29 31
 import com.sundot.airport.check.service.ICheckLargeScreenService;
30 32
 import com.sundot.airport.common.constant.CacheConstants;
31 33
 import com.sundot.airport.common.core.domain.BaseLargeScreenQueryParamDto;
32
-import com.sundot.airport.common.core.domain.CheckLargeScreenHomePageItemDto;
33
-import com.sundot.airport.common.core.domain.CheckLargeScreenHomePageRankingDto;
34
+import com.sundot.airport.common.core.domain.SysCheckAnalysisReportCheckProblemCorrectionDto;
35
+import com.sundot.airport.common.core.domain.SysCheckAnalysisReportCheckProblemCorrectionItemDto;
36
+import com.sundot.airport.common.core.domain.SysCheckAnalysisReportCheckProblemDistributionItemDto;
34 37
 import com.sundot.airport.common.core.domain.LargeScreenHomePageUserInfoSqlDto;
38
+import com.sundot.airport.common.core.domain.SysAnalysisReportCompareItemDto;
39
+import com.sundot.airport.common.core.domain.SysAnalysisReportDateRangeDto;
40
+import com.sundot.airport.common.core.domain.SysAnalysisReportParamDto;
41
+import com.sundot.airport.common.core.domain.SysCheckAnalysisReportCheckProblemDiscoveryDto;
42
+import com.sundot.airport.common.core.domain.SysCheckAnalysisReportCheckProblemDiscoveryItemDto;
43
+import com.sundot.airport.common.core.domain.SysCheckAnalysisReportCheckProblemDistributionDto;
44
+import com.sundot.airport.common.core.domain.SysCheckAnalysisReportCheckTaskDto;
45
+import com.sundot.airport.common.core.domain.SysCheckAnalysisReportCheckTaskItemDto;
46
+import com.sundot.airport.common.core.domain.SysCheckAnalysisReportCheckTaskTypeItemDto;
47
+import com.sundot.airport.common.core.domain.SysCheckAnalysisReportDto;
35 48
 import com.sundot.airport.common.core.domain.SysHomeReportDetailDto;
36 49
 import com.sundot.airport.common.core.domain.SysLargeScreenDetailDto;
37 50
 import com.sundot.airport.common.core.domain.entity.SysDept;
@@ -41,6 +54,9 @@ import com.sundot.airport.common.core.domain.entity.SysUser;
41 54
 import com.sundot.airport.common.core.redis.RedisCache;
42 55
 import com.sundot.airport.common.enums.CheckLargeScreenCorrectionTypeEnum;
43 56
 import com.sundot.airport.common.enums.CheckLevelEnum;
57
+import com.sundot.airport.common.enums.CheckTaskTypeEnum;
58
+import com.sundot.airport.common.enums.CompareResultTypeEnum;
59
+import com.sundot.airport.common.enums.CompareTypeEnum;
44 60
 import com.sundot.airport.common.enums.DeptType;
45 61
 import com.sundot.airport.common.enums.DeptTypeEnum;
46 62
 import com.sundot.airport.common.enums.HomePageQueryEnum;
@@ -2714,4 +2730,403 @@ public class CheckLargeScreenServiceImpl implements ICheckLargeScreenService {
2714 2730
         return result;
2715 2731
     }
2716 2732
 
2733
+    /**
2734
+     * 质控分析报告-质控活动
2735
+     *
2736
+     * @param paramDto 质控分析报告-质控活动查询参数
2737
+     * @return 质控分析报告-质控活动
2738
+     */
2739
+    @Override
2740
+    public SysCheckAnalysisReportDto checkAnalysisReport(SysAnalysisReportParamDto paramDto) {
2741
+        SysCheckAnalysisReportDto result = new SysCheckAnalysisReportDto();
2742
+        result.setCheckTaskDto(getCheckTaskDto(paramDto));
2743
+        result.setCheckProblemDiscoveryDto(getCheckProblemDiscoveryDto(paramDto));
2744
+        result.setCheckProblemDistributionDto(getCheckProblemDistributionDto(paramDto));
2745
+        result.setCheckProblemCorrectionDto(getCheckProblemCorrectionDto(paramDto));
2746
+        return result;
2747
+    }
2748
+
2749
+    /**
2750
+     * 获取任务计划安排统计
2751
+     *
2752
+     * @param paramDto 质控分析报告-任务计划安排统计查询参数
2753
+     * @return 任务计划安排统计
2754
+     */
2755
+    private SysCheckAnalysisReportCheckTaskDto getCheckTaskDto(SysAnalysisReportParamDto paramDto) {
2756
+        SysCheckAnalysisReportCheckTaskDto checkTaskDto = new SysCheckAnalysisReportCheckTaskDto();
2757
+        List<SysCheckAnalysisReportCheckTaskItemDto> checkTaskItemDtoList = new ArrayList<>();
2758
+        paramDto.getDateRangeList().forEach(dateRange -> {
2759
+            CheckLargeScreenPlanQueryParamDto dto = new CheckLargeScreenPlanQueryParamDto();
2760
+            dto.setStartDate(dateRange.getStartDate());
2761
+            dto.setEndDate(dateRange.getEndDate());
2762
+            List<CheckTask> checkTaskList = checkLargeScreenMapper.planStatistics(dto);
2763
+            Map<String, Long> map = checkTaskList.stream().collect(Collectors.groupingBy(CheckTask::getCheckCategory, Collectors.counting()));
2764
+
2765
+            SysCheckAnalysisReportCheckTaskItemDto itemDtoSpecialTask = new SysCheckAnalysisReportCheckTaskItemDto();
2766
+            itemDtoSpecialTask.setStartDate(dateRange.getStartDate());
2767
+            itemDtoSpecialTask.setEndDate(dateRange.getEndDate());
2768
+            itemDtoSpecialTask.setDesc(dateRange.getDesc());
2769
+            itemDtoSpecialTask.setTag(dateRange.getTag());
2770
+            itemDtoSpecialTask.setTagDesc(dateRange.getTagDesc());
2771
+            itemDtoSpecialTask.setType(CheckTaskTypeEnum.SPECIAL_TASK.getCode());
2772
+            itemDtoSpecialTask.setTypeDesc(CheckTaskTypeEnum.SPECIAL_TASK.getDesc());
2773
+            itemDtoSpecialTask.setCount(map.get(CheckTaskTypeEnum.SPECIAL_TASK.getCode()) == null ? BigDecimal.ZERO : BigDecimal.valueOf(map.get(CheckTaskTypeEnum.SPECIAL_TASK.getCode())));
2774
+            checkTaskItemDtoList.add(itemDtoSpecialTask);
2775
+            SysCheckAnalysisReportCheckTaskItemDto itemDtoDailyTask = new SysCheckAnalysisReportCheckTaskItemDto();
2776
+            itemDtoDailyTask.setStartDate(dateRange.getStartDate());
2777
+            itemDtoDailyTask.setEndDate(dateRange.getEndDate());
2778
+            itemDtoDailyTask.setDesc(dateRange.getDesc());
2779
+            itemDtoDailyTask.setTag(dateRange.getTag());
2780
+            itemDtoDailyTask.setTagDesc(dateRange.getTagDesc());
2781
+            itemDtoDailyTask.setType(CheckTaskTypeEnum.DAILY_TASK.getCode());
2782
+            itemDtoDailyTask.setTypeDesc(CheckTaskTypeEnum.DAILY_TASK.getDesc());
2783
+            itemDtoDailyTask.setCount(map.get(CheckTaskTypeEnum.DAILY_TASK.getCode()) == null ? BigDecimal.ZERO : BigDecimal.valueOf(map.get(CheckTaskTypeEnum.DAILY_TASK.getCode())));
2784
+            checkTaskItemDtoList.add(itemDtoDailyTask);
2785
+        });
2786
+        checkTaskDto.setCheckTaskItemDtoList(checkTaskItemDtoList);
2787
+
2788
+        List<SysCheckAnalysisReportCheckTaskTypeItemDto> checkTaskTypeItemDtoList = new ArrayList<>();
2789
+        List<SysCheckAnalysisReportCheckTaskItemDto> specialTaskList = checkTaskItemDtoList.stream().filter(item -> CheckTaskTypeEnum.SPECIAL_TASK.getCode().equals(item.getType())).collect(Collectors.toList());
2790
+        List<SysCheckAnalysisReportCheckTaskItemDto> dailyTaskList = checkTaskItemDtoList.stream().filter(item -> CheckTaskTypeEnum.DAILY_TASK.getCode().equals(item.getType())).collect(Collectors.toList());
2791
+        BigDecimal specialTaskCurrentCount = specialTaskList.stream().filter(item -> CompareTypeEnum.CURRENT.getCode().equals(item.getTag())).findFirst().map(SysCheckAnalysisReportCheckTaskItemDto::getCount).orElse(BigDecimal.ZERO);
2792
+        BigDecimal specialTaskYearOnYearCount = specialTaskList.stream().filter(item -> CompareTypeEnum.YEAR_ON_YEAR.getCode().equals(item.getTag())).findFirst().map(SysCheckAnalysisReportCheckTaskItemDto::getCount).orElse(BigDecimal.ZERO);
2793
+        SysCheckAnalysisReportCheckTaskItemDto specialTaskRingRatioCheckTaskItemDto = specialTaskList.stream().filter(item -> CompareTypeEnum.RING_RATIO.getCode().equals(item.getTag())).findFirst().orElse(null);
2794
+        BigDecimal specialTaskRingRatioCount = specialTaskRingRatioCheckTaskItemDto != null ? specialTaskRingRatioCheckTaskItemDto.getCount() : BigDecimal.ZERO;
2795
+        BigDecimal dailyTaskCurrentCount = dailyTaskList.stream().filter(item -> CompareTypeEnum.CURRENT.getCode().equals(item.getTag())).findFirst().map(SysCheckAnalysisReportCheckTaskItemDto::getCount).orElse(BigDecimal.ZERO);
2796
+        BigDecimal dailyTaskYearOnYearCount = dailyTaskList.stream().filter(item -> CompareTypeEnum.YEAR_ON_YEAR.getCode().equals(item.getTag())).findFirst().map(SysCheckAnalysisReportCheckTaskItemDto::getCount).orElse(BigDecimal.ZERO);
2797
+        SysCheckAnalysisReportCheckTaskItemDto dailyTaskRingRatioCheckTaskItemDto = dailyTaskList.stream().filter(item -> CompareTypeEnum.RING_RATIO.getCode().equals(item.getTag())).findFirst().orElse(null);
2798
+        BigDecimal dailyTaskRingRatioCount = dailyTaskRingRatioCheckTaskItemDto != null ? dailyTaskRingRatioCheckTaskItemDto.getCount() : BigDecimal.ZERO;
2799
+
2800
+        SysCheckAnalysisReportCheckTaskTypeItemDto checkTaskTypeItemDtoSpecialTask = new SysCheckAnalysisReportCheckTaskTypeItemDto();
2801
+        checkTaskTypeItemDtoSpecialTask.setType(CheckTaskTypeEnum.SPECIAL_TASK.getCode());
2802
+        checkTaskTypeItemDtoSpecialTask.setTypeDesc(CheckTaskTypeEnum.SPECIAL_TASK.getDesc());
2803
+        checkTaskTypeItemDtoSpecialTask.setCount(specialTaskCurrentCount);
2804
+        List<SysAnalysisReportCompareItemDto> specialTaskItemDtoList = new ArrayList<>();
2805
+        checkTaskTypeItemDtoSpecialTask.setCompareItemDtoList(specialTaskItemDtoList);
2806
+        SysCheckAnalysisReportCheckTaskTypeItemDto checkTaskTypeItemDtoDailyTask = new SysCheckAnalysisReportCheckTaskTypeItemDto();
2807
+        checkTaskTypeItemDtoDailyTask.setType(CheckTaskTypeEnum.DAILY_TASK.getCode());
2808
+        checkTaskTypeItemDtoDailyTask.setTypeDesc(CheckTaskTypeEnum.DAILY_TASK.getDesc());
2809
+        checkTaskTypeItemDtoDailyTask.setCount(dailyTaskCurrentCount);
2810
+        List<SysAnalysisReportCompareItemDto> dailyTaskItemDtoList = new ArrayList<>();
2811
+        checkTaskTypeItemDtoDailyTask.setCompareItemDtoList(dailyTaskItemDtoList);
2812
+
2813
+        SysAnalysisReportCompareItemDto specialTaskYearOnYearItemDto = new SysAnalysisReportCompareItemDto();
2814
+        specialTaskYearOnYearItemDto.setCompareType(CompareTypeEnum.YEAR_ON_YEAR.getCode());
2815
+        specialTaskYearOnYearItemDto.setCompareTypeDesc(CompareTypeEnum.YEAR_ON_YEAR.getDesc());
2816
+        BigDecimal subtractSpecialTaskYearOnYear = specialTaskCurrentCount.subtract(specialTaskYearOnYearCount);
2817
+        if (subtractSpecialTaskYearOnYear.compareTo(BigDecimal.ZERO) > 0) {
2818
+            specialTaskYearOnYearItemDto.setCompareResultType(CompareResultTypeEnum.RISE.getCode());
2819
+            specialTaskYearOnYearItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.RISE.getDesc());
2820
+            specialTaskYearOnYearItemDto.setProportion(specialTaskYearOnYearCount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : subtractSpecialTaskYearOnYear.divide(specialTaskYearOnYearCount, 4, RoundingMode.HALF_UP));
2821
+            specialTaskYearOnYearItemDto.setProportionDesc(specialTaskYearOnYearItemDto.getProportion().compareTo(BigDecimal.ZERO) == 0 ? "--%" : specialTaskYearOnYearItemDto.getProportion().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%");
2822
+        } else if (subtractSpecialTaskYearOnYear.compareTo(BigDecimal.ZERO) < 0) {
2823
+            specialTaskYearOnYearItemDto.setCompareResultType(CompareResultTypeEnum.DECLINE.getCode());
2824
+            specialTaskYearOnYearItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.DECLINE.getDesc());
2825
+            specialTaskYearOnYearItemDto.setProportion(specialTaskYearOnYearCount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : subtractSpecialTaskYearOnYear.abs().divide(specialTaskYearOnYearCount, 4, RoundingMode.HALF_UP));
2826
+            specialTaskYearOnYearItemDto.setProportionDesc(specialTaskYearOnYearItemDto.getProportion().compareTo(BigDecimal.ZERO) == 0 ? "--%" : specialTaskYearOnYearItemDto.getProportion().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%");
2827
+        } else {
2828
+            specialTaskYearOnYearItemDto.setCompareResultType(CompareResultTypeEnum.RISE.getCode());
2829
+            specialTaskYearOnYearItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.RISE.getDesc());
2830
+            specialTaskYearOnYearItemDto.setProportion(BigDecimal.ZERO);
2831
+            specialTaskYearOnYearItemDto.setProportionDesc("0%");
2832
+        }
2833
+        specialTaskItemDtoList.add(specialTaskYearOnYearItemDto);
2834
+        if (specialTaskRingRatioCheckTaskItemDto != null) {
2835
+            SysAnalysisReportCompareItemDto specialTaskRingRatioItemDto = new SysAnalysisReportCompareItemDto();
2836
+            specialTaskRingRatioItemDto.setCompareType(CompareTypeEnum.RING_RATIO.getCode());
2837
+            specialTaskRingRatioItemDto.setCompareTypeDesc(CompareTypeEnum.RING_RATIO.getDesc());
2838
+            BigDecimal subtractSpecialTaskRingRatio = specialTaskCurrentCount.subtract(specialTaskRingRatioCount);
2839
+            if (subtractSpecialTaskRingRatio.compareTo(BigDecimal.ZERO) > 0) {
2840
+                specialTaskRingRatioItemDto.setCompareResultType(CompareResultTypeEnum.RISE.getCode());
2841
+                specialTaskRingRatioItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.RISE.getDesc());
2842
+                specialTaskRingRatioItemDto.setProportion(specialTaskRingRatioCount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : subtractSpecialTaskRingRatio.divide(specialTaskRingRatioCount, 4, RoundingMode.HALF_UP));
2843
+                specialTaskRingRatioItemDto.setProportionDesc(specialTaskRingRatioItemDto.getProportion().compareTo(BigDecimal.ZERO) == 0 ? "--%" : specialTaskRingRatioItemDto.getProportion().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%");
2844
+            } else if (subtractSpecialTaskRingRatio.compareTo(BigDecimal.ZERO) < 0) {
2845
+                specialTaskRingRatioItemDto.setCompareResultType(CompareResultTypeEnum.DECLINE.getCode());
2846
+                specialTaskRingRatioItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.DECLINE.getDesc());
2847
+                specialTaskRingRatioItemDto.setProportion(specialTaskRingRatioCount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : subtractSpecialTaskRingRatio.abs().divide(specialTaskRingRatioCount, 4, RoundingMode.HALF_UP));
2848
+                specialTaskRingRatioItemDto.setProportionDesc(specialTaskRingRatioItemDto.getProportion().compareTo(BigDecimal.ZERO) == 0 ? "--%" : specialTaskRingRatioItemDto.getProportion().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%");
2849
+            } else {
2850
+                specialTaskRingRatioItemDto.setCompareResultType(CompareResultTypeEnum.RISE.getCode());
2851
+                specialTaskRingRatioItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.RISE.getDesc());
2852
+                specialTaskRingRatioItemDto.setProportion(BigDecimal.ZERO);
2853
+                specialTaskRingRatioItemDto.setProportionDesc("0%");
2854
+            }
2855
+            specialTaskItemDtoList.add(specialTaskRingRatioItemDto);
2856
+        }
2857
+
2858
+        SysAnalysisReportCompareItemDto dailyTaskYearOnYearItemDto = new SysAnalysisReportCompareItemDto();
2859
+        dailyTaskYearOnYearItemDto.setCompareType(CompareTypeEnum.YEAR_ON_YEAR.getCode());
2860
+        dailyTaskYearOnYearItemDto.setCompareTypeDesc(CompareTypeEnum.YEAR_ON_YEAR.getDesc());
2861
+        BigDecimal subtractDailyTaskYearOnYear = dailyTaskCurrentCount.subtract(dailyTaskYearOnYearCount);
2862
+        if (subtractDailyTaskYearOnYear.compareTo(BigDecimal.ZERO) > 0) {
2863
+            dailyTaskYearOnYearItemDto.setCompareResultType(CompareResultTypeEnum.RISE.getCode());
2864
+            dailyTaskYearOnYearItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.RISE.getDesc());
2865
+            dailyTaskYearOnYearItemDto.setProportion(dailyTaskYearOnYearCount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : subtractDailyTaskYearOnYear.divide(dailyTaskYearOnYearCount, 4, RoundingMode.HALF_UP));
2866
+            dailyTaskYearOnYearItemDto.setProportionDesc(dailyTaskYearOnYearItemDto.getProportion().compareTo(BigDecimal.ZERO) == 0 ? "--%" : dailyTaskYearOnYearItemDto.getProportion().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%");
2867
+        } else if (subtractDailyTaskYearOnYear.compareTo(BigDecimal.ZERO) < 0) {
2868
+            dailyTaskYearOnYearItemDto.setCompareResultType(CompareResultTypeEnum.DECLINE.getCode());
2869
+            dailyTaskYearOnYearItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.DECLINE.getDesc());
2870
+            dailyTaskYearOnYearItemDto.setProportion(dailyTaskYearOnYearCount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : subtractDailyTaskYearOnYear.abs().divide(dailyTaskYearOnYearCount, 4, RoundingMode.HALF_UP));
2871
+            dailyTaskYearOnYearItemDto.setProportionDesc(dailyTaskYearOnYearItemDto.getProportion().compareTo(BigDecimal.ZERO) == 0 ? "--%" : dailyTaskYearOnYearItemDto.getProportion().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%");
2872
+        } else {
2873
+            dailyTaskYearOnYearItemDto.setCompareResultType(CompareResultTypeEnum.RISE.getCode());
2874
+            dailyTaskYearOnYearItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.RISE.getDesc());
2875
+            dailyTaskYearOnYearItemDto.setProportion(BigDecimal.ZERO);
2876
+            dailyTaskYearOnYearItemDto.setProportionDesc("0%");
2877
+        }
2878
+        dailyTaskItemDtoList.add(dailyTaskYearOnYearItemDto);
2879
+        if (dailyTaskRingRatioCheckTaskItemDto != null) {
2880
+            SysAnalysisReportCompareItemDto dailyTaskRingRatioItemDto = new SysAnalysisReportCompareItemDto();
2881
+            dailyTaskRingRatioItemDto.setCompareType(CompareTypeEnum.RING_RATIO.getCode());
2882
+            dailyTaskRingRatioItemDto.setCompareTypeDesc(CompareTypeEnum.RING_RATIO.getDesc());
2883
+            BigDecimal subtractDailyTaskRingRatio = dailyTaskCurrentCount.subtract(dailyTaskRingRatioCount);
2884
+            if (subtractDailyTaskRingRatio.compareTo(BigDecimal.ZERO) > 0) {
2885
+                dailyTaskRingRatioItemDto.setCompareResultType(CompareResultTypeEnum.RISE.getCode());
2886
+                dailyTaskRingRatioItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.RISE.getDesc());
2887
+                dailyTaskRingRatioItemDto.setProportion(dailyTaskRingRatioCount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : subtractDailyTaskRingRatio.divide(dailyTaskRingRatioCount, 4, RoundingMode.HALF_UP));
2888
+                dailyTaskRingRatioItemDto.setProportionDesc(dailyTaskRingRatioItemDto.getProportion().compareTo(BigDecimal.ZERO) == 0 ? "--%" : dailyTaskRingRatioItemDto.getProportion().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%");
2889
+            } else if (subtractDailyTaskRingRatio.compareTo(BigDecimal.ZERO) < 0) {
2890
+                dailyTaskRingRatioItemDto.setCompareResultType(CompareResultTypeEnum.DECLINE.getCode());
2891
+                dailyTaskRingRatioItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.DECLINE.getDesc());
2892
+                dailyTaskRingRatioItemDto.setProportion(dailyTaskRingRatioCount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : subtractDailyTaskRingRatio.abs().divide(dailyTaskRingRatioCount, 4, RoundingMode.HALF_UP));
2893
+                dailyTaskRingRatioItemDto.setProportionDesc(dailyTaskRingRatioItemDto.getProportion().compareTo(BigDecimal.ZERO) == 0 ? "--%" : dailyTaskRingRatioItemDto.getProportion().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%");
2894
+            } else {
2895
+                dailyTaskRingRatioItemDto.setCompareResultType(CompareResultTypeEnum.RISE.getCode());
2896
+                dailyTaskRingRatioItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.RISE.getDesc());
2897
+                dailyTaskRingRatioItemDto.setProportion(BigDecimal.ZERO);
2898
+                dailyTaskRingRatioItemDto.setProportionDesc("0%");
2899
+            }
2900
+            dailyTaskItemDtoList.add(dailyTaskRingRatioItemDto);
2901
+        }
2902
+        checkTaskTypeItemDtoList.add(checkTaskTypeItemDtoSpecialTask);
2903
+        checkTaskTypeItemDtoList.add(checkTaskTypeItemDtoDailyTask);
2904
+        checkTaskDto.setCheckTaskTypeItemDtoList(checkTaskTypeItemDtoList);
2905
+
2906
+        List<String> descResultList = new ArrayList<>();
2907
+        checkTaskTypeItemDtoList.forEach(checkTaskTypeItemDto -> {
2908
+            String descOne = checkTaskTypeItemDto.getTypeDesc() + ":发布" + checkTaskTypeItemDto.getCount() + "次,";
2909
+            List<String> descList = new ArrayList<>();
2910
+            checkTaskTypeItemDto.getCompareItemDtoList().forEach(item -> {
2911
+                descList.add(item.getCompareTypeDesc() + item.getCompareResultTypeDesc() + item.getProportionDesc());
2912
+            });
2913
+            String descTwo = String.join(",", descList);
2914
+            descResultList.add(descOne + descTwo);
2915
+        });
2916
+        String desc = String.join(";\n", descResultList);
2917
+        checkTaskDto.setDesc(desc);
2918
+
2919
+        return checkTaskDto;
2920
+    }
2921
+
2922
+    /**
2923
+     * 获取问题发现统计
2924
+     *
2925
+     * @param paramDto 质控分析报告-问题发现统计查询参数
2926
+     * @return 问题发现统计
2927
+     */
2928
+    private SysCheckAnalysisReportCheckProblemDiscoveryDto getCheckProblemDiscoveryDto(SysAnalysisReportParamDto paramDto) {
2929
+        SysCheckAnalysisReportCheckProblemDiscoveryDto checkProblemDiscoveryDto = new SysCheckAnalysisReportCheckProblemDiscoveryDto();
2930
+        List<SysCheckAnalysisReportCheckProblemDiscoveryItemDto> checkProblemDiscoveryItemDtoList = new ArrayList<>();
2931
+        paramDto.getDateRangeList().forEach(dateRange -> {
2932
+            CheckLargeScreenPlanQueryParamDto dto = new CheckLargeScreenPlanQueryParamDto();
2933
+            dto.setStartDate(dateRange.getStartDate());
2934
+            dto.setEndDate(dateRange.getEndDate());
2935
+            BigDecimal count = checkLargeScreenMapper.problemDistributionTotal(dto);
2936
+            SysCheckAnalysisReportCheckProblemDiscoveryItemDto checkProblemDiscoveryItemDto = new SysCheckAnalysisReportCheckProblemDiscoveryItemDto();
2937
+            checkProblemDiscoveryItemDto.setStartDate(dateRange.getStartDate());
2938
+            checkProblemDiscoveryItemDto.setEndDate(dateRange.getEndDate());
2939
+            checkProblemDiscoveryItemDto.setDesc(dateRange.getDesc());
2940
+            checkProblemDiscoveryItemDto.setTag(dateRange.getTag());
2941
+            checkProblemDiscoveryItemDto.setTagDesc(dateRange.getTagDesc());
2942
+            checkProblemDiscoveryItemDto.setCount(count);
2943
+            checkProblemDiscoveryItemDtoList.add(checkProblemDiscoveryItemDto);
2944
+        });
2945
+        checkProblemDiscoveryDto.setCheckProblemDiscoveryItemDtoList(checkProblemDiscoveryItemDtoList);
2946
+
2947
+        BigDecimal currentCount = checkProblemDiscoveryItemDtoList.stream().filter(item -> CompareTypeEnum.CURRENT.getCode().equals(item.getTag())).findFirst().map(SysCheckAnalysisReportCheckProblemDiscoveryItemDto::getCount).orElse(BigDecimal.ZERO);
2948
+        checkProblemDiscoveryDto.setCount(currentCount);
2949
+        BigDecimal yearOnYearCount = checkProblemDiscoveryItemDtoList.stream().filter(item -> CompareTypeEnum.YEAR_ON_YEAR.getCode().equals(item.getTag())).findFirst().map(SysCheckAnalysisReportCheckProblemDiscoveryItemDto::getCount).orElse(BigDecimal.ZERO);
2950
+        SysCheckAnalysisReportCheckProblemDiscoveryItemDto checkProblemDiscoveryRingRatioItemDto = checkProblemDiscoveryItemDtoList.stream().filter(item -> CompareTypeEnum.RING_RATIO.getCode().equals(item.getTag())).findFirst().orElse(null);
2951
+        BigDecimal ringRatioCount = checkProblemDiscoveryRingRatioItemDto != null ? checkProblemDiscoveryRingRatioItemDto.getCount() : BigDecimal.ZERO;
2952
+
2953
+        List<SysAnalysisReportCompareItemDto> compareItemDtoList = new ArrayList<>();
2954
+        checkProblemDiscoveryDto.setCompareItemDtoList(compareItemDtoList);
2955
+        SysAnalysisReportCompareItemDto yearOnYearItemDto = new SysAnalysisReportCompareItemDto();
2956
+        yearOnYearItemDto.setCompareType(CompareTypeEnum.YEAR_ON_YEAR.getCode());
2957
+        yearOnYearItemDto.setCompareTypeDesc(CompareTypeEnum.YEAR_ON_YEAR.getDesc());
2958
+        BigDecimal subtractYearOnYear = currentCount.subtract(yearOnYearCount);
2959
+        if (subtractYearOnYear.compareTo(BigDecimal.ZERO) > 0) {
2960
+            yearOnYearItemDto.setCompareResultType(CompareResultTypeEnum.RISE.getCode());
2961
+            yearOnYearItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.RISE.getDesc());
2962
+            yearOnYearItemDto.setProportion(yearOnYearCount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : subtractYearOnYear.divide(yearOnYearCount, 4, RoundingMode.HALF_UP));
2963
+            yearOnYearItemDto.setProportionDesc(yearOnYearItemDto.getProportion().compareTo(BigDecimal.ZERO) == 0 ? "--%" : yearOnYearItemDto.getProportion().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%");
2964
+        } else if (subtractYearOnYear.compareTo(BigDecimal.ZERO) < 0) {
2965
+            yearOnYearItemDto.setCompareResultType(CompareResultTypeEnum.DECLINE.getCode());
2966
+            yearOnYearItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.DECLINE.getDesc());
2967
+            yearOnYearItemDto.setProportion(yearOnYearCount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : subtractYearOnYear.abs().divide(yearOnYearCount, 4, RoundingMode.HALF_UP));
2968
+            yearOnYearItemDto.setProportionDesc(yearOnYearItemDto.getProportion().compareTo(BigDecimal.ZERO) == 0 ? "--%" : yearOnYearItemDto.getProportion().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%");
2969
+        } else {
2970
+            yearOnYearItemDto.setCompareResultType(CompareResultTypeEnum.RISE.getCode());
2971
+            yearOnYearItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.RISE.getDesc());
2972
+            yearOnYearItemDto.setProportion(BigDecimal.ZERO);
2973
+            yearOnYearItemDto.setProportionDesc("0%");
2974
+        }
2975
+        compareItemDtoList.add(yearOnYearItemDto);
2976
+        if (checkProblemDiscoveryRingRatioItemDto != null) {
2977
+            SysAnalysisReportCompareItemDto ringRatioItemDto = new SysAnalysisReportCompareItemDto();
2978
+            ringRatioItemDto.setCompareType(CompareTypeEnum.RING_RATIO.getCode());
2979
+            ringRatioItemDto.setCompareTypeDesc(CompareTypeEnum.RING_RATIO.getDesc());
2980
+            BigDecimal subtractSpecialTaskRingRatio = currentCount.subtract(ringRatioCount);
2981
+            if (subtractSpecialTaskRingRatio.compareTo(BigDecimal.ZERO) > 0) {
2982
+                ringRatioItemDto.setCompareResultType(CompareResultTypeEnum.RISE.getCode());
2983
+                ringRatioItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.RISE.getDesc());
2984
+                ringRatioItemDto.setProportion(ringRatioCount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : subtractSpecialTaskRingRatio.divide(ringRatioCount, 4, RoundingMode.HALF_UP));
2985
+                ringRatioItemDto.setProportionDesc(ringRatioItemDto.getProportion().compareTo(BigDecimal.ZERO) == 0 ? "--%" : ringRatioItemDto.getProportion().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%");
2986
+            } else if (subtractSpecialTaskRingRatio.compareTo(BigDecimal.ZERO) < 0) {
2987
+                ringRatioItemDto.setCompareResultType(CompareResultTypeEnum.DECLINE.getCode());
2988
+                ringRatioItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.DECLINE.getDesc());
2989
+                ringRatioItemDto.setProportion(ringRatioCount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : subtractSpecialTaskRingRatio.abs().divide(ringRatioCount, 4, RoundingMode.HALF_UP));
2990
+                ringRatioItemDto.setProportionDesc(ringRatioItemDto.getProportion().compareTo(BigDecimal.ZERO) == 0 ? "--%" : ringRatioItemDto.getProportion().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%");
2991
+            } else {
2992
+                ringRatioItemDto.setCompareResultType(CompareResultTypeEnum.RISE.getCode());
2993
+                ringRatioItemDto.setCompareResultTypeDesc(CompareResultTypeEnum.RISE.getDesc());
2994
+                ringRatioItemDto.setProportion(BigDecimal.ZERO);
2995
+                ringRatioItemDto.setProportionDesc("0%");
2996
+            }
2997
+            compareItemDtoList.add(ringRatioItemDto);
2998
+        }
2999
+
3000
+        String descOne = "共发现问题" + checkProblemDiscoveryDto.getCount() + "个,";
3001
+        List<String> descList = new ArrayList<>();
3002
+        checkProblemDiscoveryDto.getCompareItemDtoList().forEach(item -> descList.add(item.getCompareTypeDesc() + item.getCompareResultTypeDesc() + item.getProportionDesc()));
3003
+        String descTwo = String.join(",", descList);
3004
+        checkProblemDiscoveryDto.setDesc(descOne + descTwo);
3005
+        return checkProblemDiscoveryDto;
3006
+    }
3007
+
3008
+    /**
3009
+     * 获取问题分布统计
3010
+     *
3011
+     * @param paramDto 质控分析报告-问题分布统计查询参数
3012
+     * @return 问题分布统计
3013
+     */
3014
+    private SysCheckAnalysisReportCheckProblemDistributionDto getCheckProblemDistributionDto(SysAnalysisReportParamDto paramDto) {
3015
+        SysCheckAnalysisReportCheckProblemDistributionDto checkProblemDistributionDto = new SysCheckAnalysisReportCheckProblemDistributionDto();
3016
+        SysAnalysisReportDateRangeDto currentDateRangeDto = paramDto.getDateRangeList().stream().filter(dateRange -> StrUtil.equals(CompareTypeEnum.CURRENT.getCode(), dateRange.getTag())).findFirst().orElse(null);
3017
+        BaseLargeScreenQueryParamDto queryParamDto = new BaseLargeScreenQueryParamDto();
3018
+        queryParamDto.setStartDate(currentDateRangeDto.getStartDate());
3019
+        queryParamDto.setEndDate(currentDateRangeDto.getEndDate());
3020
+        List<SysCheckAnalysisReportCheckProblemDistributionItemDto> checkProblemDistributionItemDtoList = checkLargeScreenMapper.problemDistributionStatistics(queryParamDto);
3021
+        checkProblemDistributionDto.setCheckProblemDistributionItemDtoList(checkProblemDistributionItemDtoList);
3022
+        if (CollUtil.isEmpty(checkProblemDistributionItemDtoList)) {
3023
+            return null;
3024
+        }
3025
+
3026
+        StringBuilder desc = new StringBuilder();
3027
+        String formatOne = "当前安检质控中,%s类型问题的数量最多(%s件),是问题集中的主要类型";
3028
+        desc.append(String.format(formatOne, checkProblemDistributionItemDtoList.get(0).getName(), checkProblemDistributionItemDtoList.get(0).getTotal()));
3029
+        if (checkProblemDistributionItemDtoList.size() > 1) {
3030
+            List<String> list = new ArrayList<>();
3031
+            checkProblemDistributionItemDtoList = checkProblemDistributionItemDtoList.stream().skip(1).collect(Collectors.toList());
3032
+            checkProblemDistributionItemDtoList = checkProblemDistributionItemDtoList.stream().limit(2).collect(Collectors.toList());
3033
+            checkProblemDistributionItemDtoList.forEach(sysCheckAnalysisReportCheckProblemDistributionItemDto -> list.add(sysCheckAnalysisReportCheckProblemDistributionItemDto.getName() + "(" + sysCheckAnalysisReportCheckProblemDistributionItemDto.getTotal() + "件)"));
3034
+            String join = String.join("、", list);
3035
+            String formatTwo = ";其次是%s";
3036
+            desc.append(String.format(formatTwo, join));
3037
+        }
3038
+        checkProblemDistributionDto.setDesc(desc.length() == 0 ? null : desc.toString());
3039
+
3040
+        return checkProblemDistributionDto;
3041
+    }
3042
+
3043
+    /**
3044
+     * 获取问题整改统计
3045
+     *
3046
+     * @param paramDto 质控分析报告-问题整改统计查询参数
3047
+     * @return 问题整改统计
3048
+     */
3049
+    private SysCheckAnalysisReportCheckProblemCorrectionDto getCheckProblemCorrectionDto(SysAnalysisReportParamDto paramDto) {
3050
+        SysCheckAnalysisReportCheckProblemCorrectionDto checkProblemCorrectionDto = new SysCheckAnalysisReportCheckProblemCorrectionDto();
3051
+        List<SysCheckAnalysisReportCheckProblemCorrectionItemDto> checkProblemCorrectionItemDtoList = new ArrayList<>();
3052
+        SysAnalysisReportDateRangeDto currentDateRangeDto = paramDto.getDateRangeList().stream().filter(dateRange -> StrUtil.equals(CompareTypeEnum.CURRENT.getCode(), dateRange.getTag())).findFirst().orElse(null);
3053
+        BaseLargeScreenQueryParamDto queryParamDto = new BaseLargeScreenQueryParamDto();
3054
+        queryParamDto.setStartDate(currentDateRangeDto.getStartDate());
3055
+        queryParamDto.setEndDate(currentDateRangeDto.getEndDate());
3056
+        List<SysCheckAnalysisReportCheckProblemCorrectionItemDto> tempCheckProblemCorrectionItemDtoList = checkLargeScreenMapper.problemCorrectionStatistics(queryParamDto);
3057
+        if (CollUtil.isEmpty(tempCheckProblemCorrectionItemDtoList)) {
3058
+            return null;
3059
+        }
3060
+        Map<Long, SysCheckAnalysisReportCheckProblemCorrectionItemDto> deptMap = tempCheckProblemCorrectionItemDtoList.stream().collect(Collectors.toMap(SysCheckAnalysisReportCheckProblemCorrectionItemDto::getDeptId, item -> item, (oldValue, newValue) -> newValue));
3061
+
3062
+        SysCheckAnalysisReportCheckProblemCorrectionItemDto maxItemDto = tempCheckProblemCorrectionItemDtoList.stream()
3063
+                .filter(p -> p.getOnTimeCompletedCount() != null && p.getOnTimeCompletedCount().compareTo(BigDecimal.ZERO) > 0)
3064
+                .max(Comparator.comparing(SysCheckAnalysisReportCheckProblemCorrectionItemDto::getOnTimeCompletedCount))
3065
+                .orElse(null);
3066
+        if (ObjUtil.isNotNull(maxItemDto)) {
3067
+            String desc = maxItemDto.getDeptName() + "的按时整改率更高、整改更及时,是当时整改工作落实较好的科室";
3068
+            checkProblemCorrectionDto.setDesc(desc);
3069
+        }
3070
+
3071
+        List<SysDept> deptList = sysDeptService.selectAllDept(SecurityUtils.getLoginUser().getDeptId());
3072
+        Collections.reverse(deptList);
3073
+        SysDept station = deptList.stream().filter(x -> StrUtil.equals(DeptType.STATION.getCode(), x.getDeptType())).findFirst().orElse(null);
3074
+        SysDept deptQuery = new SysDept();
3075
+        deptQuery.setParentId(station.getDeptId());
3076
+        deptQuery.setDeptType(DeptType.DEPARTMENT.getCode());
3077
+        List<SysDept> sysDeptList = sysDeptService.selectDeptInfoAll(deptQuery);
3078
+        sysDeptList.forEach(dept -> {
3079
+            SysCheckAnalysisReportCheckProblemCorrectionItemDto itemDto = deptMap.get(dept.getDeptId());
3080
+            if (itemDto != null) {
3081
+                checkProblemCorrectionItemDtoList.add(itemDto);
3082
+            } else {
3083
+                SysCheckAnalysisReportCheckProblemCorrectionItemDto itemDtoZero = new SysCheckAnalysisReportCheckProblemCorrectionItemDto();
3084
+                itemDtoZero.setDeptId(dept.getDeptId());
3085
+                itemDtoZero.setDeptName(dept.getDeptName());
3086
+                itemDtoZero.setOnTimeCompletedCount(BigDecimal.ZERO);
3087
+                itemDtoZero.setOverTimeCompletedCount(BigDecimal.ZERO);
3088
+                itemDtoZero.setOnTimeUnfinishedCount(BigDecimal.ZERO);
3089
+                itemDtoZero.setOverTimeUnfinishedCount(BigDecimal.ZERO);
3090
+                itemDtoZero.setOtherCount(BigDecimal.ZERO);
3091
+                checkProblemCorrectionItemDtoList.add(itemDtoZero);
3092
+            }
3093
+        });
3094
+
3095
+        SysCheckAnalysisReportCheckProblemCorrectionItemDto totalItem = new SysCheckAnalysisReportCheckProblemCorrectionItemDto();
3096
+        totalItem.setDeptId(null);
3097
+        totalItem.setDeptName("总数");
3098
+        totalItem.setOnTimeCompletedCount(tempCheckProblemCorrectionItemDtoList.stream().map(SysCheckAnalysisReportCheckProblemCorrectionItemDto::getOnTimeCompletedCount).reduce(BigDecimal.ZERO, BigDecimal::add));
3099
+        totalItem.setOverTimeCompletedCount(tempCheckProblemCorrectionItemDtoList.stream().map(SysCheckAnalysisReportCheckProblemCorrectionItemDto::getOverTimeCompletedCount).reduce(BigDecimal.ZERO, BigDecimal::add));
3100
+        totalItem.setOnTimeUnfinishedCount(tempCheckProblemCorrectionItemDtoList.stream().map(SysCheckAnalysisReportCheckProblemCorrectionItemDto::getOnTimeUnfinishedCount).reduce(BigDecimal.ZERO, BigDecimal::add));
3101
+        totalItem.setOverTimeUnfinishedCount(tempCheckProblemCorrectionItemDtoList.stream().map(SysCheckAnalysisReportCheckProblemCorrectionItemDto::getOverTimeUnfinishedCount).reduce(BigDecimal.ZERO, BigDecimal::add));
3102
+        totalItem.setOtherCount(tempCheckProblemCorrectionItemDtoList.stream().map(SysCheckAnalysisReportCheckProblemCorrectionItemDto::getOtherCount).reduce(BigDecimal.ZERO, BigDecimal::add));
3103
+        checkProblemCorrectionItemDtoList.add(0, totalItem);
3104
+        checkProblemCorrectionDto.setCheckProblemCorrectionItemDtoList(checkProblemCorrectionItemDtoList);
3105
+
3106
+        return checkProblemCorrectionDto;
3107
+    }
3108
+
3109
+    /**
3110
+     * 质控分析报告-质控活动-问题分布统计
3111
+     *
3112
+     * @param paramDto 查询参数
3113
+     * @return 质控分析报告-质控活动-问题分布统计
3114
+     */
3115
+    @Override
3116
+    public SysCheckAnalysisReportCheckProblemDistributionDto getCheckProblemDistribution(BaseLargeScreenQueryParamDto paramDto) {
3117
+        SysCheckAnalysisReportCheckProblemDistributionDto checkProblemDistributionDto = new SysCheckAnalysisReportCheckProblemDistributionDto();
3118
+        List<SysCheckAnalysisReportCheckProblemDistributionItemDto> checkProblemDistributionItemDtoList = checkLargeScreenMapper.problemDistributionStatistics(paramDto);
3119
+        checkProblemDistributionDto.setCheckProblemDistributionItemDtoList(checkProblemDistributionItemDtoList);
3120
+        if (CollUtil.isEmpty(checkProblemDistributionItemDtoList)) {
3121
+            return null;
3122
+        }
3123
+
3124
+        StringBuilder desc = new StringBuilder();
3125
+        String formatOne = "%s类型问题占比最大";
3126
+        desc.append(String.format(formatOne, checkProblemDistributionItemDtoList.get(0).getName()));
3127
+        checkProblemDistributionDto.setDesc(desc.length() == 0 ? null : desc.toString());
3128
+
3129
+        return checkProblemDistributionDto;
3130
+    }
3131
+
2717 3132
 }

+ 57 - 0
airport-check/src/main/resources/mapper/check/CheckLargeScreenMapper.xml

@@ -891,4 +891,61 @@
891 891
         </if>
892 892
     </select>
893 893
 
894
+    <select id="problemDistributionTotal" resultType="java.math.BigDecimal">
895
+        select count(cpi.id) total
896
+        from check_correction cc
897
+        inner join check_project_item cpi on (cpi.source_id = cc.id and cpi.type = 'CHECK_CORRECTION')
898
+        where 1 = 1
899
+        <if test="startDate != null and endDate != null">
900
+            and (cc.check_time >= #{startDate}
901
+            and cc.check_time <![CDATA[ < ]]> date_add(#{endDate} , interval 1 day))
902
+        </if>
903
+    </select>
904
+
905
+    <select id="problemDistributionStatistics"
906
+            resultType="com.sundot.airport.common.core.domain.SysCheckAnalysisReportCheckProblemDistributionItemDto">
907
+        select cpi.category_code_one code,
908
+        cpi.category_name_one name,
909
+        count(cpi.id) total
910
+        from check_correction cc
911
+        inner join check_project_item cpi on (cpi.source_id = cc.id and cpi.type = 'CHECK_CORRECTION')
912
+        where 1 = 1
913
+        <if test="startDate != null and endDate != null">
914
+            and (cc.check_time >= #{startDate}
915
+            and cc.check_time <![CDATA[ < ]]> date_add(#{endDate} , interval 1 day))
916
+        </if>
917
+        group by cpi.category_code_one, cpi.category_name_one
918
+        order by total desc
919
+    </select>
920
+
921
+    <select id="problemCorrectionStatistics"
922
+            resultType="com.sundot.airport.common.core.domain.SysCheckAnalysisReportCheckProblemCorrectionItemDto">
923
+        select temp.deptId deptId,
924
+        temp.deptName deptName,
925
+        ifnull(sum(case when temp.type = 'ON_TIME_COMPLETED' then 1 else 0 end), 0) onTimeCompletedCount,
926
+        ifnull(sum(case when temp.type = 'OVER_TIME_COMPLETED' then 1 else 0 end), 0) overTimeCompletedCount,
927
+        ifnull(sum(case when temp.type = 'ON_TIME_UNFINISHED' then 1 else 0 end), 0) onTimeUnfinishedCount,
928
+        ifnull(sum(case when temp.type = 'OVER_TIME_UNFINISHED' then 1 else 0 end), 0) overTimeUnfinishedCount,
929
+        ifnull(sum(case when temp.type = 'OTHER' then 1 else 0 end), 0) otherCount
930
+        from (select cc.checked_brigade_id deptId,
931
+        cc.checked_brigade_name deptName,
932
+        case
933
+        when cc.status = 'RECTIFIED' and cc.rectification_deadline >= cc.completion_time
934
+        then 'ON_TIME_COMPLETED'
935
+        when cc.status = 'RECTIFIED' and cc.rectification_deadline <![CDATA[ < ]]> cc.completion_time
936
+        then 'OVER_TIME_COMPLETED'
937
+        when cc.status = 'UNDER_RECTIFICATION' and CURRENT_DATE() <![CDATA[ <= ]]> cc.rectification_deadline
938
+        then 'ON_TIME_UNFINISHED'
939
+        when cc.status = 'UNDER_RECTIFICATION' and CURRENT_DATE() > cc.rectification_deadline
940
+        then 'OVER_TIME_UNFINISHED'
941
+        else 'OTHER' end type
942
+        from check_correction cc
943
+        where 1 = 1
944
+        <if test="startDate != null and endDate != null">
945
+            and (cc.check_time >= #{startDate}
946
+            and cc.check_time <![CDATA[ < ]]> date_add(#{endDate} , interval 1 day))
947
+        </if>) temp
948
+        group by temp.deptId, temp.deptName
949
+    </select>
950
+
894 951
 </mapper>

+ 46 - 0
airport-common/src/main/java/com/sundot/airport/common/core/domain/SysAnalysisReportCompareItemDto.java

@@ -0,0 +1,46 @@
1
+package com.sundot.airport.common.core.domain;
2
+
3
+import lombok.Data;
4
+
5
+import java.math.BigDecimal;
6
+
7
+/**
8
+ * 质控分析报告-同比/环比
9
+ *
10
+ * @author ruoyi
11
+ * @date 2025-01-06
12
+ */
13
+@Data
14
+public class SysAnalysisReportCompareItemDto {
15
+
16
+    /**
17
+     * YEAR_ON_YEAR=同比;RING_RATIO=环比
18
+     */
19
+    private String compareType;
20
+
21
+    /**
22
+     * 同比/环比
23
+     */
24
+    private String compareTypeDesc;
25
+
26
+    /**
27
+     * RISE=上升;DECLINE=下降;FLAT=持平
28
+     */
29
+    private String compareResultType;
30
+
31
+    /**
32
+     * 上升/下降/持平
33
+     */
34
+    private String compareResultTypeDesc;
35
+
36
+    /**
37
+     * 比例
38
+     */
39
+    private BigDecimal proportion;
40
+
41
+    /**
42
+     * 比例描述
43
+     */
44
+    private String proportionDesc;
45
+
46
+}

+ 44 - 0
airport-common/src/main/java/com/sundot/airport/common/core/domain/SysAnalysisReportDateRangeDto.java

@@ -0,0 +1,44 @@
1
+package com.sundot.airport.common.core.domain;
2
+
3
+import com.fasterxml.jackson.annotation.JsonFormat;
4
+import lombok.Data;
5
+
6
+import java.util.Date;
7
+
8
+/**
9
+ * 质控分析报告-时间段
10
+ *
11
+ * @author ruoyi
12
+ * @date 2025-01-06
13
+ */
14
+@Data
15
+public class SysAnalysisReportDateRangeDto {
16
+
17
+    /**
18
+     * 开始日期
19
+     */
20
+    @JsonFormat(pattern = "yyyy-MM-dd")
21
+    private Date startDate;
22
+
23
+    /**
24
+     * 结束日期
25
+     */
26
+    @JsonFormat(pattern = "yyyy-MM-dd")
27
+    private Date endDate;
28
+
29
+    /**
30
+     * 时间段描述
31
+     */
32
+    private String desc;
33
+
34
+    /**
35
+     * 时间段标识:时间段标识:CURRENT=当期,YEAR_ON_YEAR=同比,RING_RATIO=环比
36
+     */
37
+    private String tag;
38
+
39
+    /**
40
+     * 时间段标识名称
41
+     */
42
+    private String tagDesc;
43
+
44
+}

+ 41 - 0
airport-common/src/main/java/com/sundot/airport/common/core/domain/SysAnalysisReportParamDto.java

@@ -0,0 +1,41 @@
1
+package com.sundot.airport.common.core.domain;
2
+
3
+import lombok.Data;
4
+
5
+import java.util.List;
6
+
7
+/**
8
+ * 质控分析报告-质控活动接口入参
9
+ *
10
+ * @author ruoyi
11
+ * @date 2025-01-06
12
+ */
13
+@Data
14
+public class SysAnalysisReportParamDto {
15
+
16
+    /**
17
+     * 时间范围类型:YEAR=年份;QUARTER=季度;MONTH=月份
18
+     */
19
+    private String dateRangeQueryType;
20
+
21
+    /**
22
+     * 年份
23
+     */
24
+    private Integer year;
25
+
26
+    /**
27
+     * 季度
28
+     */
29
+    private Integer quarter;
30
+
31
+    /**
32
+     * 月份
33
+     */
34
+    private Integer month;
35
+
36
+    /**
37
+     * 时间段列表
38
+     */
39
+    private List<SysAnalysisReportDateRangeDto> dateRangeList;
40
+
41
+}

+ 26 - 0
airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckProblemCorrectionDto.java

@@ -0,0 +1,26 @@
1
+package com.sundot.airport.common.core.domain;
2
+
3
+import lombok.Data;
4
+
5
+import java.util.List;
6
+
7
+/**
8
+ * 问题整改统计
9
+ *
10
+ * @author ruoyi
11
+ * @date 2025-01-06
12
+ */
13
+@Data
14
+public class SysCheckAnalysisReportCheckProblemCorrectionDto {
15
+
16
+    /**
17
+     * 描述
18
+     */
19
+    private String desc;
20
+
21
+    /**
22
+     * 问题整改统计明细列表
23
+     */
24
+    private List<SysCheckAnalysisReportCheckProblemCorrectionItemDto> checkProblemCorrectionItemDtoList;
25
+
26
+}

+ 51 - 0
airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckProblemCorrectionItemDto.java

@@ -0,0 +1,51 @@
1
+package com.sundot.airport.common.core.domain;
2
+
3
+import lombok.Data;
4
+
5
+import java.math.BigDecimal;
6
+
7
+/**
8
+ * 问题整改统计明细
9
+ *
10
+ * @author ruoyi
11
+ * @date 2025-09-07
12
+ */
13
+@Data
14
+public class SysCheckAnalysisReportCheckProblemCorrectionItemDto {
15
+
16
+    /**
17
+     * 部门ID
18
+     */
19
+    private Long deptId;
20
+
21
+    /**
22
+     * 部门名称
23
+     */
24
+    private String deptName;
25
+
26
+    /**
27
+     * 按期已完成数量
28
+     */
29
+    private BigDecimal onTimeCompletedCount;
30
+
31
+    /**
32
+     * 超期已完成数量
33
+     */
34
+    private BigDecimal overTimeCompletedCount;
35
+
36
+    /**
37
+     * 按期整改中数量
38
+     */
39
+    private BigDecimal onTimeUnfinishedCount;
40
+
41
+    /**
42
+     * 超期整改中数量
43
+     */
44
+    private BigDecimal overTimeUnfinishedCount;
45
+
46
+    /**
47
+     * 其他数量
48
+     */
49
+    private BigDecimal otherCount;
50
+
51
+}

+ 37 - 0
airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckProblemDiscoveryDto.java

@@ -0,0 +1,37 @@
1
+package com.sundot.airport.common.core.domain;
2
+
3
+import lombok.Data;
4
+
5
+import java.math.BigDecimal;
6
+import java.util.List;
7
+
8
+/**
9
+ * 问题发现统计
10
+ *
11
+ * @author ruoyi
12
+ * @date 2025-01-06
13
+ */
14
+@Data
15
+public class SysCheckAnalysisReportCheckProblemDiscoveryDto {
16
+
17
+    /**
18
+     * 描述
19
+     */
20
+    private String desc;
21
+
22
+    /**
23
+     * 数量
24
+     */
25
+    private BigDecimal count;
26
+
27
+    /**
28
+     * 同比/环比
29
+     */
30
+    private List<SysAnalysisReportCompareItemDto> compareItemDtoList;
31
+
32
+    /**
33
+     * 问题发现统计明细列表
34
+     */
35
+    private List<SysCheckAnalysisReportCheckProblemDiscoveryItemDto> checkProblemDiscoveryItemDtoList;
36
+
37
+}

+ 50 - 0
airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckProblemDiscoveryItemDto.java

@@ -0,0 +1,50 @@
1
+package com.sundot.airport.common.core.domain;
2
+
3
+import com.fasterxml.jackson.annotation.JsonFormat;
4
+import lombok.Data;
5
+
6
+import java.math.BigDecimal;
7
+import java.util.Date;
8
+
9
+/**
10
+ * 问题发现统计明细
11
+ *
12
+ * @author ruoyi
13
+ * @date 2025-01-06
14
+ */
15
+@Data
16
+public class SysCheckAnalysisReportCheckProblemDiscoveryItemDto {
17
+
18
+    /**
19
+     * 开始日期
20
+     */
21
+    @JsonFormat(pattern = "yyyy-MM-dd")
22
+    private Date startDate;
23
+
24
+    /**
25
+     * 结束日期
26
+     */
27
+    @JsonFormat(pattern = "yyyy-MM-dd")
28
+    private Date endDate;
29
+
30
+    /**
31
+     * 时间段描述
32
+     */
33
+    private String desc;
34
+
35
+    /**
36
+     * 时间段标识:CURRENT=当期,YEAR_ON_YEAR=同比,RING_RATIO=环比
37
+     */
38
+    private String tag;
39
+
40
+    /**
41
+     * 时间段标识名称
42
+     */
43
+    private String tagDesc;
44
+
45
+    /**
46
+     * 数量
47
+     */
48
+    private BigDecimal count;
49
+
50
+}

+ 26 - 0
airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckProblemDistributionDto.java

@@ -0,0 +1,26 @@
1
+package com.sundot.airport.common.core.domain;
2
+
3
+import lombok.Data;
4
+
5
+import java.util.List;
6
+
7
+/**
8
+ * 问题分布统计
9
+ *
10
+ * @author ruoyi
11
+ * @date 2025-01-06
12
+ */
13
+@Data
14
+public class SysCheckAnalysisReportCheckProblemDistributionDto {
15
+
16
+    /**
17
+     * 描述
18
+     */
19
+    private String desc;
20
+
21
+    /**
22
+     * 问题分布统计明细列表
23
+     */
24
+    private List<SysCheckAnalysisReportCheckProblemDistributionItemDto> checkProblemDistributionItemDtoList;
25
+
26
+}

+ 31 - 0
airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckProblemDistributionItemDto.java

@@ -0,0 +1,31 @@
1
+package com.sundot.airport.common.core.domain;
2
+
3
+import lombok.Data;
4
+
5
+import java.math.BigDecimal;
6
+
7
+/**
8
+ * 问题分布统计明细
9
+ *
10
+ * @author ruoyi
11
+ * @date 2025-09-07
12
+ */
13
+@Data
14
+public class SysCheckAnalysisReportCheckProblemDistributionItemDto {
15
+
16
+    /**
17
+     * 编码
18
+     */
19
+    private String code;
20
+
21
+    /**
22
+     * 名称
23
+     */
24
+    private String name;
25
+
26
+    /**
27
+     * 总数
28
+     */
29
+    private BigDecimal total;
30
+
31
+}

+ 31 - 0
airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckTaskDto.java

@@ -0,0 +1,31 @@
1
+package com.sundot.airport.common.core.domain;
2
+
3
+import lombok.Data;
4
+
5
+import java.util.List;
6
+
7
+/**
8
+ * 任务计划安排统计
9
+ *
10
+ * @author ruoyi
11
+ * @date 2025-01-06
12
+ */
13
+@Data
14
+public class SysCheckAnalysisReportCheckTaskDto {
15
+
16
+    /**
17
+     * 描述
18
+     */
19
+    private String desc;
20
+
21
+    /**
22
+     * 专项任务/日常任务
23
+     */
24
+    private List<SysCheckAnalysisReportCheckTaskTypeItemDto> checkTaskTypeItemDtoList;
25
+
26
+    /**
27
+     * 任务计划安排统计明细列表
28
+     */
29
+    private List<SysCheckAnalysisReportCheckTaskItemDto> checkTaskItemDtoList;
30
+
31
+}

+ 60 - 0
airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckTaskItemDto.java

@@ -0,0 +1,60 @@
1
+package com.sundot.airport.common.core.domain;
2
+
3
+import com.fasterxml.jackson.annotation.JsonFormat;
4
+import lombok.Data;
5
+
6
+import java.math.BigDecimal;
7
+import java.util.Date;
8
+
9
+/**
10
+ * 任务计划安排统计明细
11
+ *
12
+ * @author ruoyi
13
+ * @date 2025-01-06
14
+ */
15
+@Data
16
+public class SysCheckAnalysisReportCheckTaskItemDto {
17
+
18
+    /**
19
+     * 开始日期
20
+     */
21
+    @JsonFormat(pattern = "yyyy-MM-dd")
22
+    private Date startDate;
23
+
24
+    /**
25
+     * 结束日期
26
+     */
27
+    @JsonFormat(pattern = "yyyy-MM-dd")
28
+    private Date endDate;
29
+
30
+    /**
31
+     * 时间段描述
32
+     */
33
+    private String desc;
34
+
35
+    /**
36
+     * 时间段标识:时间段标识:CURRENT=当期,YEAR_ON_YEAR=同比,RING_RATIO=环比
37
+     */
38
+    private String tag;
39
+
40
+    /**
41
+     * 时间段标识名称
42
+     */
43
+    private String tagDesc;
44
+
45
+    /**
46
+     * SPECIAL_TASK=专项任务;DAILY_TASK=日常任务
47
+     */
48
+    private String type;
49
+
50
+    /**
51
+     * 专项任务/日常任务
52
+     */
53
+    private String typeDesc;
54
+
55
+    /**
56
+     * 数量
57
+     */
58
+    private BigDecimal count;
59
+
60
+}

+ 37 - 0
airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportCheckTaskTypeItemDto.java

@@ -0,0 +1,37 @@
1
+package com.sundot.airport.common.core.domain;
2
+
3
+import lombok.Data;
4
+
5
+import java.math.BigDecimal;
6
+import java.util.List;
7
+
8
+/**
9
+ * 任务计划安排统计-专项任务/日常任务
10
+ *
11
+ * @author ruoyi
12
+ * @date 2025-01-06
13
+ */
14
+@Data
15
+public class SysCheckAnalysisReportCheckTaskTypeItemDto {
16
+
17
+    /**
18
+     * SPECIAL_TASK=专项任务;DAILY_TASK=日常任务
19
+     */
20
+    private String type;
21
+
22
+    /**
23
+     * 专项任务/日常任务
24
+     */
25
+    private String typeDesc;
26
+
27
+    /**
28
+     * 数量
29
+     */
30
+    private BigDecimal count;
31
+
32
+    /**
33
+     * 同比/环比
34
+     */
35
+    private List<SysAnalysisReportCompareItemDto> compareItemDtoList;
36
+
37
+}

+ 34 - 0
airport-common/src/main/java/com/sundot/airport/common/core/domain/SysCheckAnalysisReportDto.java

@@ -0,0 +1,34 @@
1
+package com.sundot.airport.common.core.domain;
2
+
3
+import lombok.Data;
4
+
5
+/**
6
+ * 质控活动
7
+ *
8
+ * @author ruoyi
9
+ * @date 2025-01-06
10
+ */
11
+@Data
12
+public class SysCheckAnalysisReportDto {
13
+
14
+    /**
15
+     * 任务计划安排统计
16
+     */
17
+    private SysCheckAnalysisReportCheckTaskDto checkTaskDto;
18
+
19
+    /**
20
+     * 问题发现统计
21
+     */
22
+    private SysCheckAnalysisReportCheckProblemDiscoveryDto checkProblemDiscoveryDto;
23
+
24
+    /**
25
+     * 问题分布统计
26
+     */
27
+    private SysCheckAnalysisReportCheckProblemDistributionDto checkProblemDistributionDto;
28
+
29
+    /**
30
+     * 问题整改统计
31
+     */
32
+    private SysCheckAnalysisReportCheckProblemCorrectionDto checkProblemCorrectionDto;
33
+
34
+}

+ 27 - 0
airport-common/src/main/java/com/sundot/airport/common/enums/CheckTaskTypeEnum.java

@@ -0,0 +1,27 @@
1
+package com.sundot.airport.common.enums;
2
+
3
+import lombok.AllArgsConstructor;
4
+import lombok.Getter;
5
+
6
+/**
7
+ * 任务类型枚举
8
+ */
9
+@Getter
10
+@AllArgsConstructor
11
+public enum CheckTaskTypeEnum {
12
+    SPECIAL_TASK("SPECIAL_TASK", "专项任务"),
13
+    DAILY_TASK("DAILY_TASK", "日常任务");
14
+
15
+    private final String code;
16
+    private final String desc;
17
+
18
+    public static CheckTaskTypeEnum getByCode(String code) {
19
+        for (CheckTaskTypeEnum itemEnum : values()) {
20
+            if (itemEnum.getCode().equals(code)) {
21
+                return itemEnum;
22
+            }
23
+        }
24
+        return null;
25
+    }
26
+
27
+}

+ 28 - 0
airport-common/src/main/java/com/sundot/airport/common/enums/CompareResultTypeEnum.java

@@ -0,0 +1,28 @@
1
+package com.sundot.airport.common.enums;
2
+
3
+import lombok.AllArgsConstructor;
4
+import lombok.Getter;
5
+
6
+/**
7
+ * 质控分析报告比较枚举
8
+ **/
9
+@Getter
10
+@AllArgsConstructor
11
+public enum CompareResultTypeEnum {
12
+    RISE("RISE", "上升"),
13
+    DECLINE("DECLINE", "下降"),
14
+    FLAT("FLAT", "持平");
15
+
16
+    private final String code;
17
+    private final String desc;
18
+
19
+    public static CompareResultTypeEnum getByCode(String code) {
20
+        for (CompareResultTypeEnum itemEnum : values()) {
21
+            if (itemEnum.getCode().equals(code)) {
22
+                return itemEnum;
23
+            }
24
+        }
25
+        return null;
26
+    }
27
+
28
+}

+ 28 - 0
airport-common/src/main/java/com/sundot/airport/common/enums/CompareTypeEnum.java

@@ -0,0 +1,28 @@
1
+package com.sundot.airport.common.enums;
2
+
3
+import lombok.AllArgsConstructor;
4
+import lombok.Getter;
5
+
6
+/**
7
+ * 质控分析报告比较枚举
8
+ **/
9
+@Getter
10
+@AllArgsConstructor
11
+public enum CompareTypeEnum {
12
+    YEAR_ON_YEAR("YEAR_ON_YEAR", "同比"),
13
+    RING_RATIO("RING_RATIO", "环比"),
14
+    CURRENT("CURRENT", "当期");
15
+
16
+    private final String code;
17
+    private final String desc;
18
+
19
+    public static CompareTypeEnum getByCode(String code) {
20
+        for (CompareTypeEnum itemEnum : values()) {
21
+            if (itemEnum.getCode().equals(code)) {
22
+                return itemEnum;
23
+            }
24
+        }
25
+        return null;
26
+    }
27
+
28
+}

+ 28 - 0
airport-common/src/main/java/com/sundot/airport/common/enums/DateRangeQueryTypeEnum.java

@@ -0,0 +1,28 @@
1
+package com.sundot.airport.common.enums;
2
+
3
+import lombok.AllArgsConstructor;
4
+import lombok.Getter;
5
+
6
+/**
7
+ * 质控分析报告时间范围类型枚举
8
+ **/
9
+@Getter
10
+@AllArgsConstructor
11
+public enum DateRangeQueryTypeEnum {
12
+    YEAR("YEAR", "年份"),
13
+    QUARTER("QUARTER", "季度"),
14
+    MONTH("MONTH", "月份");
15
+
16
+    private final String code;
17
+    private final String desc;
18
+
19
+    public static DateRangeQueryTypeEnum getByCode(String code) {
20
+        for (DateRangeQueryTypeEnum itemEnum : values()) {
21
+            if (itemEnum.getCode().equals(code)) {
22
+                return itemEnum;
23
+            }
24
+        }
25
+        return null;
26
+    }
27
+
28
+}

+ 203 - 0
airport-common/src/main/java/com/sundot/airport/common/utils/DateRangeQueryUtils.java

@@ -0,0 +1,203 @@
1
+package com.sundot.airport.common.utils;
2
+
3
+import cn.hutool.core.util.StrUtil;
4
+import com.sundot.airport.common.core.domain.SysAnalysisReportDateRangeDto;
5
+import com.sundot.airport.common.enums.CompareTypeEnum;
6
+import com.sundot.airport.common.exception.ServiceException;
7
+
8
+import java.time.LocalDate;
9
+import java.time.Year;
10
+
11
+/**
12
+ * 日期范围查询工具类(支持年份、月份、季度指定)
13
+ * 适用于 SysAnalysisReportDateRangeDto 对象生成
14
+ */
15
+public class DateRangeQueryUtils {
16
+
17
+    // ==================== 根据年份和月份查询 ====================
18
+
19
+    /**
20
+     * 根据指定年份和月份获取该月的起止日期
21
+     */
22
+    public static SysAnalysisReportDateRangeDto getMonthRange(int year, int month, String tag) {
23
+        LocalDate startDate = LocalDate.of(year, month, 1);
24
+        LocalDate endDate = startDate.withDayOfMonth(startDate.lengthOfMonth());
25
+        String desc = year + "年" + month + "月";
26
+        if (StrUtil.isEmpty(tag)) {
27
+            tag = CompareTypeEnum.CURRENT.getCode();
28
+        }
29
+        return buildDto(startDate, endDate, desc, tag);
30
+    }
31
+
32
+    /**
33
+     * 根据指定年份和月份获取上个月的起止日期
34
+     */
35
+    public static SysAnalysisReportDateRangeDto getPreviousMonthRange(int year, int month) {
36
+        LocalDate specifiedDate = LocalDate.of(year, month, 1);
37
+        LocalDate lastMonth = specifiedDate.minusMonths(1);
38
+        String tag = CompareTypeEnum.RING_RATIO.getCode();
39
+        return getMonthRange(lastMonth.getYear(), lastMonth.getMonthValue(), tag);
40
+    }
41
+
42
+    /**
43
+     * 根据指定年份和月份获取去年同月的起止日期
44
+     */
45
+    public static SysAnalysisReportDateRangeDto getLastYearSameMonthRange(int year, int month) {
46
+        String tag = CompareTypeEnum.YEAR_ON_YEAR.getCode();
47
+        return getMonthRange(year - 1, month, tag);
48
+    }
49
+
50
+    // ==================== 根据年份和季度查询 ====================
51
+
52
+    /**
53
+     * 根据指定年份和季度获取该季度的起止日期
54
+     * 季度划分:Q1(1-3月), Q2(4-6月), Q3(7-9月), Q4(10-12月)
55
+     */
56
+    public static SysAnalysisReportDateRangeDto getQuarterRange(int year, int quarter, String tag) {
57
+        LocalDate startDate, endDate;
58
+
59
+        switch (quarter) {
60
+            case 1:
61
+                startDate = LocalDate.of(year, 1, 1);
62
+                endDate = LocalDate.of(year, 3, 31);
63
+                break;
64
+            case 2:
65
+                startDate = LocalDate.of(year, 4, 1);
66
+                endDate = LocalDate.of(year, 6, 30);
67
+                break;
68
+            case 3:
69
+                startDate = LocalDate.of(year, 7, 1);
70
+                endDate = LocalDate.of(year, 9, 30);
71
+                break;
72
+            case 4:
73
+                startDate = LocalDate.of(year, 10, 1);
74
+                endDate = LocalDate.of(year, 12, 31);
75
+                break;
76
+            default:
77
+                throw new ServiceException("无效的季度: " + quarter + ",季度范围应为1-4");
78
+        }
79
+
80
+        String desc = year + "年第" + quarter + "季度";
81
+        if (StrUtil.isEmpty(tag)) {
82
+            tag = CompareTypeEnum.CURRENT.getCode();
83
+        }
84
+        return buildDto(startDate, endDate, desc, tag);
85
+    }
86
+
87
+    /**
88
+     * 根据指定年份和季度获取上一个季度的起止日期
89
+     */
90
+    public static SysAnalysisReportDateRangeDto getPreviousQuarterRange(int year, int quarter) {
91
+        int previousQuarter = quarter - 1;
92
+        int targetYear = year;
93
+
94
+        if (previousQuarter == 0) {
95
+            previousQuarter = 4;
96
+            targetYear = year - 1;
97
+        }
98
+
99
+        String tag = CompareTypeEnum.RING_RATIO.getCode();
100
+        return getQuarterRange(targetYear, previousQuarter, tag);
101
+    }
102
+
103
+    /**
104
+     * 根据指定年份和季度获取去年同季度的起止日期
105
+     */
106
+    public static SysAnalysisReportDateRangeDto getLastYearSameQuarterRange(int year, int quarter) {
107
+        String tag = CompareTypeEnum.YEAR_ON_YEAR.getCode();
108
+        return getQuarterRange(year - 1, quarter, tag);
109
+    }
110
+
111
+    // ==================== 根据年份查询 ====================
112
+
113
+    /**
114
+     * 根据指定年份获取该年度的起止日期
115
+     */
116
+    public static SysAnalysisReportDateRangeDto getYearRange(int year, String tag) {
117
+        LocalDate startDate = LocalDate.of(year, 1, 1);
118
+        LocalDate endDate = LocalDate.of(year, 12, 31);
119
+        String desc = year + "年";
120
+
121
+        if (StrUtil.isEmpty(tag)) {
122
+            tag = CompareTypeEnum.CURRENT.getCode();
123
+        }
124
+        return buildDto(startDate, endDate, desc, tag);
125
+    }
126
+
127
+    /**
128
+     * 根据指定年份获取上一年度的起止日期
129
+     */
130
+    public static SysAnalysisReportDateRangeDto getPreviousYearRange(int year) {
131
+        String tag = CompareTypeEnum.YEAR_ON_YEAR.getCode();
132
+        return getYearRange(year - 1, tag);
133
+    }
134
+
135
+    // ==================== 便捷方法(基于当前日期)====================
136
+
137
+    /**
138
+     * 获取当前月份范围(基于当前日期)
139
+     */
140
+    public static SysAnalysisReportDateRangeDto getCurrentMonthRange() {
141
+        LocalDate today = LocalDate.now();
142
+        String tag = CompareTypeEnum.CURRENT.getCode();
143
+        return getMonthRange(today.getYear(), today.getMonthValue(), tag);
144
+    }
145
+
146
+    /**
147
+     * 获取当前季度范围(基于当前日期)
148
+     */
149
+    public static SysAnalysisReportDateRangeDto getCurrentQuarterRange() {
150
+        LocalDate today = LocalDate.now();
151
+        int quarter = (today.getMonthValue() - 1) / 3 + 1;
152
+        String tag = CompareTypeEnum.CURRENT.getCode();
153
+        return getQuarterRange(today.getYear(), quarter, tag);
154
+    }
155
+
156
+    /**
157
+     * 获取当前年度范围(基于当前日期)
158
+     */
159
+    public static SysAnalysisReportDateRangeDto getCurrentYearRange() {
160
+        String tag = CompareTypeEnum.CURRENT.getCode();
161
+        return getYearRange(Year.now().getValue(), tag);
162
+    }
163
+
164
+    // ==================== 辅助方法 ====================
165
+
166
+    /**
167
+     * 构建 SysAnalysisReportDateRangeDto 对象
168
+     */
169
+    private static SysAnalysisReportDateRangeDto buildDto(LocalDate start, LocalDate end, String desc, String tag) {
170
+        SysAnalysisReportDateRangeDto dto = new SysAnalysisReportDateRangeDto();
171
+        dto.setStartDate(java.sql.Date.valueOf(start));
172
+        dto.setEndDate(java.sql.Date.valueOf(end));
173
+        dto.setDesc(desc);
174
+        dto.setTag(tag);
175
+        dto.setTagDesc(CompareTypeEnum.getByCode(tag).getDesc());
176
+        return dto;
177
+    }
178
+
179
+    /**
180
+     * 根据月份获取对应的季度
181
+     */
182
+    public static int getQuarterByMonth(int month) {
183
+        if (month < 1 || month > 12) {
184
+            throw new IllegalArgumentException("月份必须在1-12之间");
185
+        }
186
+        return (month - 1) / 3 + 1;
187
+    }
188
+
189
+    /**
190
+     * 验证季度是否有效
191
+     */
192
+    public static boolean isValidQuarter(int quarter) {
193
+        return quarter >= 1 && quarter <= 4;
194
+    }
195
+
196
+    /**
197
+     * 验证月份是否有效
198
+     */
199
+    public static boolean isValidMonth(int month) {
200
+        return month >= 1 && month <= 12;
201
+    }
202
+
203
+}