Kaynağa Gözat

首页-巡检

chenshudong 3 ay önce
ebeveyn
işleme
5886cd6e92

+ 59 - 0
airport-admin/src/main/java/com/sundot/airport/web/controller/check/CheckLargeScreenController.java

@@ -4,6 +4,7 @@ import com.sundot.airport.check.domain.CheckLargeScreenCommonDto;
4 4
 import com.sundot.airport.check.domain.CheckLargeScreenCorrectionDto;
5 5
 import com.sundot.airport.check.domain.CheckLargeScreenCorrectionPortraitDto;
6 6
 import com.sundot.airport.check.domain.CheckLargeScreenCorrectionQueryParamDto;
7
+import com.sundot.airport.check.domain.CheckLargeScreenHomePageDto;
7 8
 import com.sundot.airport.check.domain.CheckLargeScreenInspectionExecuteDto;
8 9
 import com.sundot.airport.check.domain.CheckLargeScreenPlanOverviewDto;
9 10
 import com.sundot.airport.check.domain.CheckLargeScreenPlanQueryParamDto;
@@ -15,6 +16,7 @@ import com.sundot.airport.check.service.ICheckLargeScreenService;
15 16
 import com.sundot.airport.common.core.controller.BaseController;
16 17
 import com.sundot.airport.common.core.domain.AjaxResult;
17 18
 import com.sundot.airport.common.core.domain.BaseLargeScreenQueryParamDto;
19
+import com.sundot.airport.common.core.domain.CheckLargeScreenHomePageRankingDto;
18 20
 import org.springframework.beans.factory.annotation.Autowired;
19 21
 import org.springframework.cache.annotation.Cacheable;
20 22
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -23,6 +25,7 @@ import org.springframework.web.bind.annotation.RequestHeader;
23 25
 import org.springframework.web.bind.annotation.RequestMapping;
24 26
 import org.springframework.web.bind.annotation.RestController;
25 27
 
28
+import java.math.BigDecimal;
26 29
 import java.util.List;
27 30
 
28 31
 /**
@@ -194,4 +197,60 @@ public class CheckLargeScreenController extends BaseController {
194 197
         return success(result);
195 198
     }
196 199
 
200
+    /**
201
+     * 首页
202
+     */
203
+//    @Cacheable(
204
+//            value = "statistics_check_homePage",
205
+//            keyGenerator = "statisticsKeyGenerator",
206
+//            unless = "!T(com.sundot.airport.common.cache.StatisticsCacheConditionUtil).isSuccess(#result) ||T(com.sundot.airport.common.cache.StatisticsCacheConditionUtil).isEmptyData(#result)"
207
+//    )
208
+    @GetMapping("/homePage")
209
+    public AjaxResult homePage(BaseLargeScreenQueryParamDto dto) {
210
+        CheckLargeScreenHomePageDto result = checkLargeScreenService.homePage(dto);
211
+        return success(result);
212
+    }
213
+
214
+    /**
215
+     * 首页-巡检-巡检合格率
216
+     */
217
+//    @Cacheable(
218
+//            value = "statistics_check_passRate",
219
+//            keyGenerator = "statisticsKeyGenerator",
220
+//            unless = "!T(com.sundot.airport.common.cache.StatisticsCacheConditionUtil).isSuccess(#result) ||T(com.sundot.airport.common.cache.StatisticsCacheConditionUtil).isEmptyData(#result)"
221
+//    )
222
+    @GetMapping("/checkPassRate")
223
+    public AjaxResult checkPassRate(BaseLargeScreenQueryParamDto dto) {
224
+        BigDecimal result = checkLargeScreenService.checkPassRate(dto);
225
+        return success(result);
226
+    }
227
+
228
+    /**
229
+     * 首页-巡检-巡检合格率排名
230
+     */
231
+//    @Cacheable(
232
+//            value = "statistics_check_ranking",
233
+//            keyGenerator = "statisticsKeyGenerator",
234
+//            unless = "!T(com.sundot.airport.common.cache.StatisticsCacheConditionUtil).isSuccess(#result) ||T(com.sundot.airport.common.cache.StatisticsCacheConditionUtil).isEmptyData(#result)"
235
+//    )
236
+    @GetMapping("/checkRanking")
237
+    public AjaxResult checkRanking(BaseLargeScreenQueryParamDto dto) {
238
+        CheckLargeScreenHomePageRankingDto result = checkLargeScreenService.checkRanking(dto);
239
+        return success(result);
240
+    }
241
+
242
+    /**
243
+     * 首页-巡检-今日巡检问题数
244
+     */
245
+//    @Cacheable(
246
+//            value = "statistics_check_correction_count",
247
+//            keyGenerator = "statisticsKeyGenerator",
248
+//            unless = "!T(com.sundot.airport.common.cache.StatisticsCacheConditionUtil).isSuccess(#result) ||T(com.sundot.airport.common.cache.StatisticsCacheConditionUtil).isEmptyData(#result)"
249
+//    )
250
+    @GetMapping("/checkCorrectionCount")
251
+    public AjaxResult checkCorrectionCount(BaseLargeScreenQueryParamDto dto) {
252
+        Integer result = checkLargeScreenService.checkCorrectionCount(dto);
253
+        return success(result);
254
+    }
255
+
197 256
 }

+ 154 - 0
airport-check/src/main/java/com/sundot/airport/check/domain/CheckLargeScreenHomePageCheckCorrectionSqlDto.java

@@ -0,0 +1,154 @@
1
+package com.sundot.airport.check.domain;
2
+
3
+import lombok.Data;
4
+
5
+/**
6
+ * 首页-巡检单
7
+ *
8
+ * @author ruoyi
9
+ * @date 2025-09-07
10
+ */
11
+@Data
12
+public class CheckLargeScreenHomePageCheckCorrectionSqlDto {
13
+
14
+    /**
15
+     * 主键
16
+     */
17
+    private Long id;
18
+
19
+    /**
20
+     * 检查单编码
21
+     */
22
+    private String documentCode;
23
+
24
+    /**
25
+     * 检查单名称
26
+     */
27
+    private String documentName;
28
+
29
+    /**
30
+     * 检查人ID
31
+     */
32
+    private Long checkerId;
33
+
34
+    /**
35
+     * 检查人名称
36
+     */
37
+    private String checkerName;
38
+
39
+    /**
40
+     * 检查时间
41
+     */
42
+    private String checkTime;
43
+
44
+    /**
45
+     * 检查级别
46
+     */
47
+    private String checkLevel;
48
+
49
+    /**
50
+     * 检查级别名称
51
+     */
52
+    private String checkLevelDesc;
53
+
54
+    /**
55
+     * 被检查级别
56
+     */
57
+    private String checkedLevel;
58
+
59
+    /**
60
+     * 被检查级别名称
61
+     */
62
+    private String checkedLevelDesc;
63
+
64
+    /**
65
+     * 被检查大队ID
66
+     */
67
+    private Long checkedBrigadeId;
68
+
69
+    /**
70
+     * 被检查大队名称
71
+     */
72
+    private String checkedBrigadeName;
73
+
74
+    /**
75
+     * 被检查科室ID
76
+     */
77
+    private Long checkedDepartmentId;
78
+
79
+    /**
80
+     * 被检查科室名称
81
+     */
82
+    private String checkedDepartmentName;
83
+
84
+    /**
85
+     * 被检查班组ID
86
+     */
87
+    private Long checkedTeamId;
88
+
89
+    /**
90
+     * 被检查班组名称
91
+     */
92
+    private String checkedTeamName;
93
+
94
+    /**
95
+     * 被检查人员ID
96
+     */
97
+    private Long checkedPersonnelId;
98
+
99
+    /**
100
+     * 被检查人员名称
101
+     */
102
+    private String checkedPersonnelName;
103
+
104
+    /**
105
+     * 被检查部门ID
106
+     */
107
+    private Long checkedDeptId;
108
+
109
+    /**
110
+     * 被检查部门名称
111
+     */
112
+    private String checkedDeptName;
113
+
114
+    /**
115
+     * 责任人ID
116
+     */
117
+    private Long responsibleUserId;
118
+
119
+    /**
120
+     * 责任人名称
121
+     */
122
+    private String responsibleUserName;
123
+
124
+    /**
125
+     * 流程状态(0=草稿,1=审核中,2=人工终止,3=归档)
126
+     */
127
+    private String processStatus;
128
+
129
+    /**
130
+     * 流程状态名称
131
+     */
132
+    private String processStatusDesc;
133
+
134
+    /**
135
+     * 实例ID
136
+     */
137
+    private Long instanceId;
138
+
139
+    /**
140
+     * 完成时间
141
+     */
142
+    private String completionTime;
143
+
144
+    /**
145
+     * 用户ID
146
+     */
147
+    private Long userId;
148
+
149
+    /**
150
+     * 用户名称
151
+     */
152
+    private String userName;
153
+
154
+}

+ 164 - 0
airport-check/src/main/java/com/sundot/airport/check/domain/CheckLargeScreenHomePageCheckRecordSqlDto.java

@@ -0,0 +1,164 @@
1
+package com.sundot.airport.check.domain;
2
+
3
+import lombok.Data;
4
+
5
+/**
6
+ * 首页-巡检单
7
+ *
8
+ * @author ruoyi
9
+ * @date 2025-09-07
10
+ */
11
+@Data
12
+public class CheckLargeScreenHomePageCheckRecordSqlDto {
13
+
14
+    /**
15
+     * 主键
16
+     */
17
+    private Long id;
18
+
19
+    /**
20
+     * 检查单编码
21
+     */
22
+    private String documentCode;
23
+
24
+    /**
25
+     * 检查单名称
26
+     */
27
+    private String documentName;
28
+
29
+    /**
30
+     * 检查人ID
31
+     */
32
+    private Long checkerId;
33
+
34
+    /**
35
+     * 检查人名称
36
+     */
37
+    private String checkerName;
38
+
39
+    /**
40
+     * 检查时间
41
+     */
42
+    private String checkTime;
43
+
44
+    /**
45
+     * 检查级别
46
+     */
47
+    private String checkLevel;
48
+
49
+    /**
50
+     * 检查级别名称
51
+     */
52
+    private String checkLevelDesc;
53
+
54
+    /**
55
+     * 被检查级别
56
+     */
57
+    private String checkedLevel;
58
+
59
+    /**
60
+     * 被检查级别名称
61
+     */
62
+    private String checkedLevelDesc;
63
+
64
+    /**
65
+     * 被检查大队ID
66
+     */
67
+    private Long checkedBrigadeId;
68
+
69
+    /**
70
+     * 被检查大队名称
71
+     */
72
+    private String checkedBrigadeName;
73
+
74
+    /**
75
+     * 被检查科室ID
76
+     */
77
+    private Long checkedDepartmentId;
78
+
79
+    /**
80
+     * 被检查科室名称
81
+     */
82
+    private String checkedDepartmentName;
83
+
84
+    /**
85
+     * 被检查班组ID
86
+     */
87
+    private Long checkedTeamId;
88
+
89
+    /**
90
+     * 被检查班组名称
91
+     */
92
+    private String checkedTeamName;
93
+
94
+    /**
95
+     * 被检查人员ID
96
+     */
97
+    private Long checkedPersonnelId;
98
+
99
+    /**
100
+     * 被检查人员名称
101
+     */
102
+    private String checkedPersonnelName;
103
+
104
+    /**
105
+     * 被检查部门ID
106
+     */
107
+    private Long checkedDeptId;
108
+
109
+    /**
110
+     * 被检查部门名称
111
+     */
112
+    private String checkedDeptName;
113
+
114
+    /**
115
+     * 责任人ID
116
+     */
117
+    private Long responsibleUserId;
118
+
119
+    /**
120
+     * 责任人名称
121
+     */
122
+    private String responsibleUserName;
123
+
124
+    /**
125
+     * 检查结果
126
+     */
127
+    private String checkResult;
128
+
129
+    /**
130
+     * 检查结果名称
131
+     */
132
+    private String checkResultDesc;
133
+
134
+    /**
135
+     * 得分等级
136
+     */
137
+    private String scoreLevel;
138
+
139
+    /**
140
+     * 得分等级名称
141
+     */
142
+    private String scoreLevelDesc;
143
+
144
+    /**
145
+     * 检查单状态(DRAFT=草稿;FORMAL=正式)
146
+     */
147
+    private String checkRecordStatus;
148
+
149
+    /**
150
+     * 检查单状态描述
151
+     */
152
+    private String checkRecordStatusDesc;
153
+
154
+    /**
155
+     * 用户ID
156
+     */
157
+    private Long userId;
158
+
159
+    /**
160
+     * 用户名称
161
+     */
162
+    private String userName;
163
+
164
+}

+ 123 - 0
airport-check/src/main/java/com/sundot/airport/check/domain/CheckLargeScreenHomePageDto.java

@@ -0,0 +1,123 @@
1
+package com.sundot.airport.check.domain;
2
+
3
+import com.sundot.airport.common.core.domain.CheckLargeScreenHomePageItemDto;
4
+import lombok.Data;
5
+
6
+import java.math.BigDecimal;
7
+import java.util.List;
8
+
9
+/**
10
+ * 首页
11
+ *
12
+ * @author ruoyi
13
+ * @date 2025-09-07
14
+ */
15
+@Data
16
+public class CheckLargeScreenHomePageDto {
17
+
18
+    /**
19
+     * 个人合格率
20
+     */
21
+    private BigDecimal personalPassRate;
22
+
23
+    /**
24
+     * 班组合格率
25
+     */
26
+    private BigDecimal teamPassRate;
27
+
28
+    /**
29
+     * 科室合格率
30
+     */
31
+    private BigDecimal departmentPassRate;
32
+
33
+    /**
34
+     * 大队合格率
35
+     */
36
+    private BigDecimal brigadePassRate;
37
+
38
+    /**
39
+     * 站合格率
40
+     */
41
+    private BigDecimal stationPassRate;
42
+
43
+    /**
44
+     * 已办数量
45
+     */
46
+    private Integer doneNumber;
47
+
48
+    /**
49
+     * 办理中数量
50
+     */
51
+    private Integer doingNumber;
52
+
53
+    /**
54
+     * 待办数量
55
+     */
56
+    private Integer toDoNumber;
57
+
58
+    /**
59
+     * 本站排名
60
+     */
61
+    private Integer stationRanking;
62
+
63
+    /**
64
+     * 本站总数
65
+     */
66
+    private Integer stationTotal;
67
+
68
+    /**
69
+     * 本大队排名
70
+     */
71
+    private Integer brigadeRanking;
72
+
73
+    /**
74
+     * 本大队总数
75
+     */
76
+    private Integer brigadeTotal;
77
+
78
+    /**
79
+     * 本科排名
80
+     */
81
+    private Integer departmentRanking;
82
+
83
+    /**
84
+     * 本科总数
85
+     */
86
+    private Integer departmentTotal;
87
+
88
+    /**
89
+     * 本班排名
90
+     */
91
+    private Integer teamRanking;
92
+
93
+    /**
94
+     * 本班总数
95
+     */
96
+    private Integer teamTotal;
97
+
98
+    /**
99
+     * 个人排行列表
100
+     */
101
+    private List<CheckLargeScreenHomePageItemDto> personalRankingList;
102
+
103
+    /**
104
+     * 班组排行列表
105
+     */
106
+    private List<CheckLargeScreenHomePageItemDto> teamRankingList;
107
+
108
+    /**
109
+     * 科室排行列表
110
+     */
111
+    private List<CheckLargeScreenHomePageItemDto> departmentRankingList;
112
+
113
+    /**
114
+     * 大队排行列表
115
+     */
116
+    private List<CheckLargeScreenHomePageItemDto> brigadeRankingList;
117
+
118
+    /**
119
+     * 站排行列表
120
+     */
121
+    private List<CheckLargeScreenHomePageItemDto> stationRankingList;
122
+
123
+}

+ 69 - 0
airport-check/src/main/java/com/sundot/airport/check/domain/CheckLargeScreenHomePageUserInfoSqlDto.java

@@ -0,0 +1,69 @@
1
+package com.sundot.airport.check.domain;
2
+
3
+import lombok.Data;
4
+
5
+/**
6
+ * 首页-用户信息
7
+ *
8
+ * @author ruoyi
9
+ * @date 2025-09-07
10
+ */
11
+@Data
12
+public class CheckLargeScreenHomePageUserInfoSqlDto {
13
+
14
+    /**
15
+     * 用户ID
16
+     */
17
+    private Long userId;
18
+
19
+    /**
20
+     * 用户账号
21
+     */
22
+    private String userName;
23
+
24
+    /**
25
+     * 用户昵称
26
+     */
27
+    private String nickName;
28
+
29
+    /**
30
+     * 班组ID
31
+     */
32
+    private Long teamId;
33
+
34
+    /**
35
+     * 班组名称
36
+     */
37
+    private String teamName;
38
+
39
+    /**
40
+     * 科室ID
41
+     */
42
+    private Long departmentId;
43
+
44
+    /**
45
+     * 科室名称
46
+     */
47
+    private String departmentName;
48
+
49
+    /**
50
+     * 大队ID
51
+     */
52
+    private Long brigadeId;
53
+
54
+    /**
55
+     * 大队名称
56
+     */
57
+    private String brigadeName;
58
+
59
+    /**
60
+     * 站ID
61
+     */
62
+    private Long stationId;
63
+
64
+    /**
65
+     * 站名称
66
+     */
67
+    private String stationName;
68
+
69
+}

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

@@ -5,6 +5,9 @@ import com.sundot.airport.check.domain.CheckLargeScreenCorrectionAssistDto;
5 5
 import com.sundot.airport.check.domain.CheckLargeScreenCorrectionDto;
6 6
 import com.sundot.airport.check.domain.CheckLargeScreenCorrectionPortraitSqlDto;
7 7
 import com.sundot.airport.check.domain.CheckLargeScreenCorrectionQueryParamDto;
8
+import com.sundot.airport.check.domain.CheckLargeScreenHomePageCheckCorrectionSqlDto;
9
+import com.sundot.airport.check.domain.CheckLargeScreenHomePageCheckRecordSqlDto;
10
+import com.sundot.airport.check.domain.CheckLargeScreenHomePageUserInfoSqlDto;
8 11
 import com.sundot.airport.check.domain.CheckLargeScreenInspectionExecuteDto;
9 12
 import com.sundot.airport.check.domain.CheckLargeScreenInspectionExecuteItemDto;
10 13
 import com.sundot.airport.check.domain.CheckLargeScreenInspectionExecuteUserDto;
@@ -14,6 +17,7 @@ import com.sundot.airport.check.domain.CheckLargeScreenProblemDto;
14 17
 import com.sundot.airport.check.domain.CheckLargeScreenProblemQueryParamDto;
15 18
 import com.sundot.airport.check.domain.CheckLargeScreenProblemTrendDto;
16 19
 import com.sundot.airport.check.domain.CheckTask;
20
+import com.sundot.airport.common.core.domain.BaseLargeScreenQueryParamDto;
17 21
 
18 22
 import java.util.List;
19 23
 
@@ -232,4 +236,35 @@ public interface CheckLargeScreenMapper {
232 236
      */
233 237
     public CheckLargeScreenCorrectionDto managementPromotionCorrection(CheckLargeScreenCorrectionQueryParamDto dto);
234 238
 
239
+    /**
240
+     * 首页-用户信息
241
+     *
242
+     * @return 首页-巡检单
243
+     */
244
+    public List<CheckLargeScreenHomePageUserInfoSqlDto> homePageUserInfo();
245
+
246
+    /**
247
+     * 首页-巡检单
248
+     *
249
+     * @param dto 查询参数
250
+     * @return 首页-巡检单
251
+     */
252
+    public List<CheckLargeScreenHomePageCheckRecordSqlDto> homePageCheckRecord(BaseLargeScreenQueryParamDto dto);
253
+
254
+    /**
255
+     * 首页-整改单
256
+     *
257
+     * @param dto 查询参数
258
+     * @return 首页-整改单
259
+     */
260
+    public List<CheckLargeScreenHomePageCheckCorrectionSqlDto> homePageCheckCorrection(BaseLargeScreenQueryParamDto dto);
261
+
262
+    /**
263
+     * 首页-巡检-今日巡检问题数
264
+     *
265
+     * @param dto 首页查询参数
266
+     * @return 首页-巡检-今日巡检问题数
267
+     */
268
+    public Integer checkCorrectionCount(BaseLargeScreenQueryParamDto dto);
269
+
235 270
 }

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

@@ -4,6 +4,7 @@ import com.sundot.airport.check.domain.CheckLargeScreenCommonDto;
4 4
 import com.sundot.airport.check.domain.CheckLargeScreenCorrectionDto;
5 5
 import com.sundot.airport.check.domain.CheckLargeScreenCorrectionPortraitDto;
6 6
 import com.sundot.airport.check.domain.CheckLargeScreenCorrectionQueryParamDto;
7
+import com.sundot.airport.check.domain.CheckLargeScreenHomePageDto;
7 8
 import com.sundot.airport.check.domain.CheckLargeScreenInspectionExecuteDto;
8 9
 import com.sundot.airport.check.domain.CheckLargeScreenPlanOverviewDto;
9 10
 import com.sundot.airport.check.domain.CheckLargeScreenPlanQueryParamDto;
@@ -12,6 +13,8 @@ import com.sundot.airport.check.domain.CheckLargeScreenProblemQueryParamDto;
12 13
 import com.sundot.airport.check.domain.CheckLargeScreenProblemTrendDto;
13 14
 import com.sundot.airport.check.domain.CheckTask;
14 15
 import com.sundot.airport.common.core.domain.BaseLargeScreenQueryParamDto;
16
+import com.sundot.airport.common.core.domain.CheckLargeScreenHomePageItemDto;
17
+import com.sundot.airport.common.core.domain.CheckLargeScreenHomePageRankingDto;
15 18
 import com.sundot.airport.common.core.domain.SysLargeScreenDetailDto;
16 19
 
17 20
 import java.math.BigDecimal;
@@ -151,4 +154,44 @@ public interface ICheckLargeScreenService {
151 154
      * @return 工作画像-工作产出-巡检问题统计图
152 155
      */
153 156
     public List<CheckLargeScreenCommonDto> workOutputCheck(CheckLargeScreenCorrectionQueryParamDto dto);
157
+
158
+    /**
159
+     * 首页
160
+     *
161
+     * @param dto 首页查询参数
162
+     * @return 首页
163
+     */
164
+    public CheckLargeScreenHomePageDto homePage(BaseLargeScreenQueryParamDto dto);
165
+
166
+    /**
167
+     * 首页-巡检-巡检合格率
168
+     *
169
+     * @param dto 首页查询参数
170
+     * @return 首页-巡检-巡检合格率
171
+     */
172
+    public BigDecimal checkPassRate(BaseLargeScreenQueryParamDto dto);
173
+
174
+    /**
175
+     * 巡检合格率全量数据
176
+     *
177
+     * @param dto 查询参数
178
+     * @return 巡检合格率全量数据
179
+     */
180
+    public List<CheckLargeScreenHomePageItemDto> getCheckLargeScreenHomePageItemDtoList(BaseLargeScreenQueryParamDto dto);
181
+
182
+    /**
183
+     * 首页-巡检-巡检合格率排名
184
+     *
185
+     * @param dto 首页查询参数
186
+     * @return 首页-巡检-巡检合格率排名
187
+     */
188
+    public CheckLargeScreenHomePageRankingDto checkRanking(BaseLargeScreenQueryParamDto dto);
189
+
190
+    /**
191
+     * 首页-巡检-今日巡检问题数
192
+     *
193
+     * @param dto 首页查询参数
194
+     * @return 首页-巡检-今日巡检问题数
195
+     */
196
+    public Integer checkCorrectionCount(BaseLargeScreenQueryParamDto dto);
154 197
 }

+ 591 - 0
airport-check/src/main/java/com/sundot/airport/check/service/impl/CheckLargeScreenServiceImpl.java

@@ -13,6 +13,10 @@ import com.sundot.airport.check.domain.CheckLargeScreenCorrectionDto;
13 13
 import com.sundot.airport.check.domain.CheckLargeScreenCorrectionPortraitDto;
14 14
 import com.sundot.airport.check.domain.CheckLargeScreenCorrectionPortraitSqlDto;
15 15
 import com.sundot.airport.check.domain.CheckLargeScreenCorrectionQueryParamDto;
16
+import com.sundot.airport.check.domain.CheckLargeScreenHomePageCheckCorrectionSqlDto;
17
+import com.sundot.airport.check.domain.CheckLargeScreenHomePageCheckRecordSqlDto;
18
+import com.sundot.airport.check.domain.CheckLargeScreenHomePageDto;
19
+import com.sundot.airport.check.domain.CheckLargeScreenHomePageUserInfoSqlDto;
16 20
 import com.sundot.airport.check.domain.CheckLargeScreenInspectionExecuteDto;
17 21
 import com.sundot.airport.check.domain.CheckLargeScreenInspectionExecuteItemDto;
18 22
 import com.sundot.airport.check.domain.CheckLargeScreenInspectionExecuteUserDto;
@@ -24,16 +28,21 @@ import com.sundot.airport.check.domain.CheckLargeScreenProblemTrendDto;
24 28
 import com.sundot.airport.check.domain.CheckTask;
25 29
 import com.sundot.airport.check.mapper.CheckLargeScreenMapper;
26 30
 import com.sundot.airport.check.service.ICheckLargeScreenService;
31
+import com.sundot.airport.common.constant.CacheConstants;
27 32
 import com.sundot.airport.common.core.domain.BaseLargeScreenQueryParamDto;
33
+import com.sundot.airport.common.core.domain.CheckLargeScreenHomePageItemDto;
34
+import com.sundot.airport.common.core.domain.CheckLargeScreenHomePageRankingDto;
28 35
 import com.sundot.airport.common.core.domain.SysLargeScreenDetailDto;
29 36
 import com.sundot.airport.common.core.domain.entity.SysDept;
30 37
 import com.sundot.airport.common.core.domain.entity.SysDictData;
31 38
 import com.sundot.airport.common.core.domain.entity.SysRole;
32 39
 import com.sundot.airport.common.core.domain.entity.SysUser;
40
+import com.sundot.airport.common.core.redis.RedisCache;
33 41
 import com.sundot.airport.common.enums.CheckLargeScreenCorrectionTypeEnum;
34 42
 import com.sundot.airport.common.enums.CheckLevelEnum;
35 43
 import com.sundot.airport.common.enums.DeptType;
36 44
 import com.sundot.airport.common.enums.DeptTypeEnum;
45
+import com.sundot.airport.common.enums.MedalTypeEnum;
37 46
 import com.sundot.airport.common.enums.RoleTypeEnum;
38 47
 import com.sundot.airport.common.enums.SourceTypeEnum;
39 48
 import com.sundot.airport.common.exception.ServiceException;
@@ -41,16 +50,21 @@ import com.sundot.airport.common.utils.LargeScreenDateUtils;
41 50
 import com.sundot.airport.common.utils.SecurityUtils;
42 51
 import com.sundot.airport.common.utils.StringUtils;
43 52
 import com.sundot.airport.system.domain.BaseCheckCategory;
53
+import com.sundot.airport.system.domain.approval.ApprovalTask;
54
+import com.sundot.airport.system.enums.ProcessStatusEnum;
44 55
 import com.sundot.airport.system.service.IBaseCheckCategoryService;
45 56
 import com.sundot.airport.system.service.ISysDeptService;
46 57
 import com.sundot.airport.system.service.ISysDictDataService;
47 58
 import com.sundot.airport.system.service.ISysUserService;
59
+import com.sundot.airport.system.service.approval.ICheckApprovalService;
48 60
 import org.springframework.beans.factory.annotation.Autowired;
49 61
 import org.springframework.stereotype.Service;
50 62
 
51 63
 import java.math.BigDecimal;
52 64
 import java.math.RoundingMode;
53 65
 import java.util.*;
66
+import java.util.concurrent.TimeUnit;
67
+import java.util.concurrent.atomic.AtomicInteger;
54 68
 import java.util.stream.Collectors;
55 69
 
56 70
 /**
@@ -63,6 +77,9 @@ import java.util.stream.Collectors;
63 77
 public class CheckLargeScreenServiceImpl implements ICheckLargeScreenService {
64 78
 
65 79
     @Autowired
80
+    private RedisCache redisCache;
81
+
82
+    @Autowired
66 83
     private CheckLargeScreenMapper checkLargeScreenMapper;
67 84
 
68 85
     @Autowired
@@ -83,6 +100,9 @@ public class CheckLargeScreenServiceImpl implements ICheckLargeScreenService {
83 100
     @Autowired
84 101
     private ISysUserService sysUserService;
85 102
 
103
+    @Autowired
104
+    private ICheckApprovalService checkApprovalService;
105
+
86 106
     /**
87 107
      * 巡检计划-计划安排总览
88 108
      *
@@ -2009,4 +2029,575 @@ public class CheckLargeScreenServiceImpl implements ICheckLargeScreenService {
2009 2029
         return cal.getTime();
2010 2030
     }
2011 2031
 
2032
+    /**
2033
+     * 首页
2034
+     *
2035
+     * @param dto 首页查询参数
2036
+     * @return 首页
2037
+     */
2038
+    @Override
2039
+    public CheckLargeScreenHomePageDto homePage(BaseLargeScreenQueryParamDto dto) {
2040
+        if (ObjUtil.isNull(dto.getUserId()) && ObjUtil.isNull(dto.getDeptId())) {
2041
+            throw new ServiceException("用户ID和部门ID不能同时为空");
2042
+        }
2043
+
2044
+        // 默认筛选条件
2045
+        if (ObjUtil.isNull(dto.getStartDate()) && ObjUtil.isNull(dto.getEndDate()) && ObjUtil.isNull(dto.getSpecifiedDate())) {
2046
+            dto.setEndDate(LargeScreenDateUtils.getCurrentDate());
2047
+            dto.setStartDate(LargeScreenDateUtils.getDateBeforeYears(1));
2048
+        }
2049
+
2050
+        // 返回结果
2051
+        CheckLargeScreenHomePageDto result = new CheckLargeScreenHomePageDto();
2052
+
2053
+        // 全量数据
2054
+        List<CheckLargeScreenHomePageItemDto> itemListAll = getCheckLargeScreenHomePageItemDtoList(dto);
2055
+        if (CollUtil.isEmpty(itemListAll)) {
2056
+            return result;
2057
+        }
2058
+
2059
+        // 合格率+排序列表
2060
+        if (ObjUtil.isNotNull(dto.getUserId())) {
2061
+            SysUser sysUser = sysUserService.selectUserById(dto.getUserId());
2062
+            if (ObjUtil.isNull(sysUser.getDeptId())) {
2063
+                return result;
2064
+            }
2065
+            List<SysDept> deptList = sysDeptService.selectAllDept(sysUser.getDeptId());
2066
+            if (CollUtil.isEmpty(deptList)) {
2067
+                return result;
2068
+            }
2069
+            Collections.reverse(deptList);
2070
+            SysDept team = deptList.stream().filter(x -> StrUtil.equals(DeptType.TEAMS.getCode(), x.getDeptType())).findFirst().orElse(null);
2071
+            SysDept department = deptList.stream().filter(x -> StrUtil.equals(DeptType.MANAGER.getCode(), x.getDeptType())).findFirst().orElse(null);
2072
+            SysDept brigade = deptList.stream().filter(x -> StrUtil.equals(DeptType.BRIGADE.getCode(), x.getDeptType())).findFirst().orElse(null);
2073
+            SysDept station = deptList.stream().filter(x -> StrUtil.equals(DeptType.STATION.getCode(), x.getDeptType())).findFirst().orElse(null);
2074
+
2075
+            result.setPersonalPassRate(itemListAll.stream().filter(item -> ObjUtil.equals(item.getId(), dto.getUserId())).findFirst().map(CheckLargeScreenHomePageItemDto::getPassRate).orElse(BigDecimal.ONE));
2076
+            if (team != null) {
2077
+                result.setTeamPassRate(calculate(itemListAll, team.getDeptId()));
2078
+                result.setTeamRankingList(sort(itemListAll, team.getDeptId()));
2079
+                result.setTeamTotal(result.getTeamRankingList().size());
2080
+                result.setTeamRanking(result.getTeamRankingList().stream().filter(item -> ObjUtil.equals(item.getId(), dto.getUserId())).findFirst().map(CheckLargeScreenHomePageItemDto::getRank).orElse(0));
2081
+            }
2082
+            if (department != null) {
2083
+                result.setDepartmentPassRate(calculate(itemListAll, department.getDeptId()));
2084
+                result.setDepartmentRankingList(sort(itemListAll, department.getDeptId()));
2085
+                result.setDepartmentTotal(result.getDepartmentRankingList().size());
2086
+                result.setDepartmentRanking(result.getDepartmentRankingList().stream().filter(item -> ObjUtil.equals(item.getId(), dto.getUserId())).findFirst().map(CheckLargeScreenHomePageItemDto::getRank).orElse(0));
2087
+            }
2088
+            if (brigade != null) {
2089
+                result.setBrigadePassRate(calculate(itemListAll, brigade.getDeptId()));
2090
+                result.setBrigadeRankingList(sort(itemListAll, brigade.getDeptId()));
2091
+                result.setBrigadeTotal(result.getBrigadeRankingList().size());
2092
+                result.setBrigadeRanking(result.getBrigadeRankingList().stream().filter(item -> ObjUtil.equals(item.getId(), dto.getUserId())).findFirst().map(CheckLargeScreenHomePageItemDto::getRank).orElse(0));
2093
+            }
2094
+            if (station != null) {
2095
+                result.setStationPassRate(calculate(itemListAll, station.getDeptId()));
2096
+                result.setStationRankingList(sort(itemListAll, station.getDeptId()));
2097
+                result.setStationTotal(result.getStationRankingList().size());
2098
+                result.setStationRanking(result.getStationRankingList().stream().filter(item -> ObjUtil.equals(item.getId(), dto.getUserId())).findFirst().map(CheckLargeScreenHomePageItemDto::getRank).orElse(0));
2099
+            }
2100
+        } else {
2101
+            SysDept sysDept = sysDeptService.selectDeptById(dto.getDeptId());
2102
+            if (ObjUtil.isNull(sysDept)) {
2103
+                return result;
2104
+            }
2105
+            if (ObjUtil.equals(DeptType.TEAMS.getCode(), sysDept.getDeptType())) {
2106
+                SysDept teamDept = sysDept;
2107
+                result.setTeamPassRate(calculate(itemListAll, teamDept.getDeptId()));
2108
+                SysDept departmentDept = sysDeptService.selectDeptById(teamDept.getParentId());
2109
+                result.setDepartmentPassRate(calculate(itemListAll, departmentDept.getDeptId()));
2110
+                SysDept brigadeDept = sysDeptService.selectDeptById(departmentDept.getParentId());
2111
+                result.setBrigadePassRate(calculate(itemListAll, brigadeDept.getDeptId()));
2112
+                SysDept stationDept = sysDeptService.selectDeptById(brigadeDept.getParentId());
2113
+                result.setStationPassRate(calculate(itemListAll, stationDept.getDeptId()));
2114
+
2115
+                List<SysDept> deptList = sysDeptService.selectChildrenDeptById(stationDept.getDeptId());
2116
+                List<SysDept> departmentDeptList = deptList.stream().filter(item -> ObjUtil.equals(departmentDept.getDeptId(), item.getParentId())).collect(Collectors.toList());
2117
+                List<CheckLargeScreenHomePageItemDto> departmentRankingList = departmentDeptList.stream().map(item -> {
2118
+                    CheckLargeScreenHomePageItemDto itemDto = new CheckLargeScreenHomePageItemDto();
2119
+                    itemDto.setId(item.getDeptId());
2120
+                    itemDto.setName(item.getDeptName());
2121
+                    itemDto.setPassRate(calculate(itemListAll, item.getDeptId()));
2122
+                    return itemDto;
2123
+                }).collect(Collectors.toList());
2124
+                result.setDepartmentRankingList(processListBest(departmentRankingList));
2125
+                result.setDepartmentTotal(result.getDepartmentRankingList().size());
2126
+                result.setDepartmentRanking(result.getDepartmentRankingList().stream().filter(item -> ObjUtil.equals(item.getId(), teamDept.getDeptId())).findFirst().map(CheckLargeScreenHomePageItemDto::getRank).orElse(0));
2127
+
2128
+                List<SysDept> deptBrigadeList = sysDeptService.selectChildrenDeptById(brigadeDept.getDeptId());
2129
+                List<SysDept> brigadeDeptList = deptBrigadeList.stream().filter(item -> StrUtil.equals(DeptType.TEAMS.getCode(), item.getDeptType())).collect(Collectors.toList());
2130
+                List<CheckLargeScreenHomePageItemDto> brigadeRankingList = brigadeDeptList.stream().map(item -> {
2131
+                    CheckLargeScreenHomePageItemDto itemDto = new CheckLargeScreenHomePageItemDto();
2132
+                    itemDto.setId(item.getDeptId());
2133
+                    itemDto.setName(item.getDeptName());
2134
+                    itemDto.setPassRate(calculate(itemListAll, item.getDeptId()));
2135
+                    return itemDto;
2136
+                }).collect(Collectors.toList());
2137
+                result.setBrigadeRankingList(processListBest(brigadeRankingList));
2138
+                result.setBrigadeTotal(result.getBrigadeRankingList().size());
2139
+                result.setBrigadeRanking(result.getBrigadeRankingList().stream().filter(item -> ObjUtil.equals(item.getId(), teamDept.getDeptId())).findFirst().map(CheckLargeScreenHomePageItemDto::getRank).orElse(0));
2140
+
2141
+                List<SysDept> stationDeptList = deptList.stream().filter(item -> StrUtil.equals(DeptType.TEAMS.getCode(), item.getDeptType())).collect(Collectors.toList());
2142
+                List<CheckLargeScreenHomePageItemDto> stationRankingList = stationDeptList.stream().map(item -> {
2143
+                    CheckLargeScreenHomePageItemDto itemDto = new CheckLargeScreenHomePageItemDto();
2144
+                    itemDto.setId(item.getDeptId());
2145
+                    itemDto.setName(item.getDeptName());
2146
+                    itemDto.setPassRate(calculate(itemListAll, item.getDeptId()));
2147
+                    return itemDto;
2148
+                }).collect(Collectors.toList());
2149
+                result.setStationRankingList(processListBest(stationRankingList));
2150
+                result.setStationTotal(result.getStationRankingList().size());
2151
+                result.setStationRanking(result.getStationRankingList().stream().filter(item -> ObjUtil.equals(item.getId(), teamDept.getDeptId())).findFirst().map(CheckLargeScreenHomePageItemDto::getRank).orElse(0));
2152
+            } else if (ObjUtil.equals(DeptType.MANAGER.getCode(), sysDept.getDeptType())) {
2153
+                SysDept departmentDept = sysDept;
2154
+                result.setDepartmentPassRate(calculate(itemListAll, departmentDept.getDeptId()));
2155
+                SysDept brigadeDept = sysDeptService.selectDeptById(departmentDept.getParentId());
2156
+                result.setBrigadePassRate(calculate(itemListAll, brigadeDept.getDeptId()));
2157
+                SysDept stationDept = sysDeptService.selectDeptById(brigadeDept.getParentId());
2158
+                result.setStationPassRate(calculate(itemListAll, stationDept.getDeptId()));
2159
+
2160
+                List<SysDept> deptBrigadeList = sysDeptService.selectChildrenDeptById(brigadeDept.getDeptId());
2161
+                List<SysDept> brigadeDeptList = deptBrigadeList.stream().filter(item -> ObjUtil.equals(brigadeDept.getDeptId(), item.getParentId())).collect(Collectors.toList());
2162
+                List<CheckLargeScreenHomePageItemDto> brigadeRankingList = brigadeDeptList.stream().map(item -> {
2163
+                    CheckLargeScreenHomePageItemDto itemDto = new CheckLargeScreenHomePageItemDto();
2164
+                    itemDto.setId(item.getDeptId());
2165
+                    itemDto.setName(item.getDeptName());
2166
+                    itemDto.setPassRate(calculate(itemListAll, item.getDeptId()));
2167
+                    return itemDto;
2168
+                }).collect(Collectors.toList());
2169
+                result.setBrigadeRankingList(processListBest(brigadeRankingList));
2170
+                result.setBrigadeTotal(result.getStationRankingList().size());
2171
+                result.setBrigadeRanking(result.getStationRankingList().stream().filter(item -> ObjUtil.equals(item.getId(), departmentDept.getDeptId())).findFirst().map(CheckLargeScreenHomePageItemDto::getRank).orElse(0));
2172
+
2173
+                List<SysDept> deptList = sysDeptService.selectChildrenDeptById(stationDept.getDeptId());
2174
+                List<SysDept> stationDeptList = deptList.stream().filter(item -> StrUtil.equals(DeptType.MANAGER.getCode(), item.getDeptType())).collect(Collectors.toList());
2175
+                List<CheckLargeScreenHomePageItemDto> stationRankingList = stationDeptList.stream().map(item -> {
2176
+                    CheckLargeScreenHomePageItemDto itemDto = new CheckLargeScreenHomePageItemDto();
2177
+                    itemDto.setId(item.getDeptId());
2178
+                    itemDto.setName(item.getDeptName());
2179
+                    itemDto.setPassRate(calculate(itemListAll, item.getDeptId()));
2180
+                    return itemDto;
2181
+                }).collect(Collectors.toList());
2182
+                result.setStationRankingList(processListBest(stationRankingList));
2183
+                result.setStationTotal(result.getStationRankingList().size());
2184
+                result.setStationRanking(result.getStationRankingList().stream().filter(item -> ObjUtil.equals(item.getId(), departmentDept.getDeptId())).findFirst().map(CheckLargeScreenHomePageItemDto::getRank).orElse(0));
2185
+
2186
+                List<SysDept> teamDeptList = deptList.stream().filter(item -> ObjUtil.equals(departmentDept.getDeptId(), item.getParentId())).collect(Collectors.toList());
2187
+                List<CheckLargeScreenHomePageItemDto> teamRankingList = teamDeptList.stream().map(item -> {
2188
+                    CheckLargeScreenHomePageItemDto itemDto = new CheckLargeScreenHomePageItemDto();
2189
+                    itemDto.setId(item.getDeptId());
2190
+                    itemDto.setName(item.getDeptName());
2191
+                    itemDto.setPassRate(calculate(itemListAll, item.getDeptId()));
2192
+                    return itemDto;
2193
+                }).collect(Collectors.toList());
2194
+                result.setTeamRankingList(processListBest(teamRankingList));
2195
+            } else if (ObjUtil.equals(DeptType.BRIGADE.getCode(), sysDept.getDeptType())) {
2196
+                SysDept brigadeDept = sysDept;
2197
+                result.setBrigadePassRate(calculate(itemListAll, brigadeDept.getDeptId()));
2198
+                SysDept stationDept = sysDeptService.selectDeptById(brigadeDept.getParentId());
2199
+                result.setStationPassRate(calculate(itemListAll, stationDept.getDeptId()));
2200
+
2201
+                List<SysDept> deptList = sysDeptService.selectChildrenDeptById(stationDept.getDeptId());
2202
+                List<SysDept> stationDeptList = deptList.stream().filter(item -> ObjUtil.equals(stationDept.getDeptId(), item.getParentId())).collect(Collectors.toList());
2203
+                List<CheckLargeScreenHomePageItemDto> stationRankingList = stationDeptList.stream().map(item -> {
2204
+                    CheckLargeScreenHomePageItemDto itemDto = new CheckLargeScreenHomePageItemDto();
2205
+                    itemDto.setId(item.getDeptId());
2206
+                    itemDto.setName(item.getDeptName());
2207
+                    itemDto.setPassRate(calculate(itemListAll, item.getDeptId()));
2208
+                    return itemDto;
2209
+                }).collect(Collectors.toList());
2210
+                result.setStationRankingList(processListBest(stationRankingList));
2211
+                result.setStationTotal(result.getStationRankingList().size());
2212
+                result.setStationRanking(result.getStationRankingList().stream().filter(item -> ObjUtil.equals(item.getId(), brigadeDept.getDeptId())).findFirst().map(CheckLargeScreenHomePageItemDto::getRank).orElse(0));
2213
+
2214
+                List<SysDept> departmentDeptList = deptList.stream().filter(item -> ObjUtil.equals(brigadeDept.getDeptId(), item.getParentId())).collect(Collectors.toList());
2215
+                List<CheckLargeScreenHomePageItemDto> departmentRankingList = departmentDeptList.stream().map(item -> {
2216
+                    CheckLargeScreenHomePageItemDto itemDto = new CheckLargeScreenHomePageItemDto();
2217
+                    itemDto.setId(item.getDeptId());
2218
+                    itemDto.setName(item.getDeptName());
2219
+                    itemDto.setPassRate(calculate(itemListAll, item.getDeptId()));
2220
+                    return itemDto;
2221
+                }).collect(Collectors.toList());
2222
+                result.setDepartmentRankingList(processListBest(departmentRankingList));
2223
+            } else if (ObjUtil.equals(DeptType.STATION.getCode(), sysDept.getDeptType())) {
2224
+                SysDept stationDept = sysDept;
2225
+                result.setStationPassRate(calculate(itemListAll, stationDept.getDeptId()));
2226
+
2227
+                List<SysDept> deptList = sysDeptService.selectChildrenDeptById(stationDept.getDeptId());
2228
+                List<SysDept> brigadeDeptList = deptList.stream().filter(item -> StrUtil.equals(DeptType.BRIGADE.getCode(), item.getDeptType())).collect(Collectors.toList());
2229
+                List<CheckLargeScreenHomePageItemDto> brigadeRankingList = brigadeDeptList.stream().map(item -> {
2230
+                    CheckLargeScreenHomePageItemDto itemDto = new CheckLargeScreenHomePageItemDto();
2231
+                    itemDto.setId(item.getDeptId());
2232
+                    itemDto.setName(item.getDeptName());
2233
+                    itemDto.setPassRate(calculate(itemListAll, item.getDeptId()));
2234
+                    return itemDto;
2235
+                }).collect(Collectors.toList());
2236
+                result.setBrigadeRankingList(processListBest(brigadeRankingList));
2237
+
2238
+                List<SysDept> departmentDeptList = deptList.stream().filter(item -> StrUtil.equals(DeptType.MANAGER.getCode(), item.getDeptType())).collect(Collectors.toList());
2239
+                List<CheckLargeScreenHomePageItemDto> departmentRankingList = departmentDeptList.stream().map(item -> {
2240
+                    CheckLargeScreenHomePageItemDto itemDto = new CheckLargeScreenHomePageItemDto();
2241
+                    itemDto.setId(item.getDeptId());
2242
+                    itemDto.setName(item.getDeptName());
2243
+                    itemDto.setPassRate(calculate(itemListAll, item.getDeptId()));
2244
+                    return itemDto;
2245
+                }).collect(Collectors.toList());
2246
+                result.setDepartmentRankingList(processListBest(departmentRankingList));
2247
+
2248
+                List<SysDept> teamDeptList = deptList.stream().filter(item -> StrUtil.equals(DeptType.TEAMS.getCode(), item.getDeptType())).collect(Collectors.toList());
2249
+                List<CheckLargeScreenHomePageItemDto> teamRankingList = teamDeptList.stream().map(item -> {
2250
+                    CheckLargeScreenHomePageItemDto itemDto = new CheckLargeScreenHomePageItemDto();
2251
+                    itemDto.setId(item.getDeptId());
2252
+                    itemDto.setName(item.getDeptName());
2253
+                    itemDto.setPassRate(calculate(itemListAll, item.getDeptId()));
2254
+                    return itemDto;
2255
+                }).collect(Collectors.toList());
2256
+                List<CheckLargeScreenHomePageItemDto> teamRankingSortList = processListBest(teamRankingList);
2257
+                List<CheckLargeScreenHomePageItemDto> teamRankingSortLimitList = teamRankingSortList.stream().limit(5).peek(item -> {
2258
+                    SysDept sysDeptTeam = sysDeptService.selectDeptById(item.getId());
2259
+                    SysDept sysDeptDepartment = sysDeptService.selectDeptById(sysDeptTeam.getParentId());
2260
+                    if (ObjUtil.isNotNull(sysDeptDepartment)) {
2261
+                        item.setName(sysDeptDepartment.getDeptName() + sysDeptTeam.getDeptName());
2262
+                    }
2263
+                }).collect(Collectors.toList());
2264
+                result.setTeamRankingList(teamRankingSortLimitList);
2265
+            } else {
2266
+            }
2267
+        }
2268
+
2269
+        // 已办数量+办理中数量
2270
+        List<CheckLargeScreenHomePageCheckCorrectionSqlDto> checkCorrectionListAll = checkLargeScreenMapper.homePageCheckCorrection(dto);
2271
+        if (CollUtil.isEmpty(checkCorrectionListAll)) {
2272
+            return result;
2273
+        }
2274
+        if (ObjUtil.isNotNull(dto.getUserId())) {
2275
+            List<CheckLargeScreenHomePageCheckCorrectionSqlDto> checkCorrectionSqlDtoList = checkCorrectionListAll.stream().filter(item -> ObjUtil.equals(item.getUserId(), dto.getUserId())).collect(Collectors.toList());
2276
+            long total = checkCorrectionSqlDtoList.stream().map(CheckLargeScreenHomePageCheckCorrectionSqlDto::getId).distinct().count();
2277
+            long doneNumber = checkCorrectionSqlDtoList.stream().filter(item -> ObjUtil.equals(item.getProcessStatus(), ProcessStatusEnum.ARCHIVED.getCode())).map(CheckLargeScreenHomePageCheckCorrectionSqlDto::getId).distinct().count();
2278
+            long doingNumber = total - doneNumber;
2279
+            result.setDoneNumber((int) doneNumber);
2280
+            result.setDoingNumber((int) doingNumber);
2281
+        } else {
2282
+            SysDept sysDept = sysDeptService.selectDeptById(dto.getDeptId());
2283
+            if (ObjUtil.isNull(sysDept)) {
2284
+                return result;
2285
+            }
2286
+            List<SysUser> sysUserList = sysUserService.selectUserListByRoleKeyAndDeptId(Arrays.asList(RoleTypeEnum.banzuzhang.getCode(), RoleTypeEnum.SecurityCheck.getCode()), sysDept.getDeptId());
2287
+            List<Long> userIdList = sysUserList.stream().map(item -> item.getUserId()).collect(Collectors.toList());
2288
+            List<CheckLargeScreenHomePageCheckCorrectionSqlDto> checkCorrectionSqlDtoList = checkCorrectionListAll.stream().filter(item -> userIdList.contains(item.getUserId())).collect(Collectors.toList());
2289
+            long total = checkCorrectionSqlDtoList.stream().map(CheckLargeScreenHomePageCheckCorrectionSqlDto::getId).distinct().count();
2290
+            long doneNumber = checkCorrectionSqlDtoList.stream().filter(item -> ObjUtil.equals(item.getProcessStatus(), ProcessStatusEnum.ARCHIVED.getCode())).map(CheckLargeScreenHomePageCheckCorrectionSqlDto::getId).distinct().count();
2291
+            long doingNumber = total - doneNumber;
2292
+            result.setDoneNumber((int) doneNumber);
2293
+            result.setDoingNumber((int) doingNumber);
2294
+        }
2295
+
2296
+        // 待办数量
2297
+        try {
2298
+            List<ApprovalTask> approvalTaskList = checkApprovalService.getPendingTasks(SecurityUtils.getUserId());
2299
+            List<String> businessTypeList = Arrays.asList("PERSONAL_CHECK", "GROUP_CHECK", "SECTION_CHECK");
2300
+            long count = approvalTaskList.stream().filter(item -> businessTypeList.contains(item.getInstance().getBusinessType())).count();
2301
+            result.setToDoNumber((int) count);
2302
+        } catch (Exception e) {
2303
+            result.setToDoNumber(0);
2304
+        }
2305
+
2306
+        return result;
2307
+    }
2308
+
2309
+    /**
2310
+     * 计算部门通过率
2311
+     *
2312
+     * @param itemListAll 全量数据
2313
+     * @param deptId      部门ID
2314
+     * @return 部门通过率
2315
+     */
2316
+    private BigDecimal calculate(List<CheckLargeScreenHomePageItemDto> itemListAll, Long deptId) {
2317
+        if (CollUtil.isEmpty(itemListAll)) {
2318
+            return BigDecimal.ONE;
2319
+        }
2320
+        List<SysUser> sysUserList = sysUserService.selectUserListByRoleKeyAndDeptId(Arrays.asList(RoleTypeEnum.banzuzhang.getCode(), RoleTypeEnum.SecurityCheck.getCode()), deptId);
2321
+        List<Long> userIdList = sysUserList.stream().map(SysUser::getUserId).collect(Collectors.toList());
2322
+        List<CheckLargeScreenHomePageItemDto> itemDtoList = itemListAll.stream().filter(item -> userIdList.contains(item.getId())).collect(Collectors.toList());
2323
+        BigDecimal reduce = itemDtoList.stream().map(CheckLargeScreenHomePageItemDto::getPassRate).reduce(BigDecimal.ZERO, BigDecimal::add);
2324
+        return CollUtil.isEmpty(itemDtoList) ? BigDecimal.ONE : reduce.divide(new BigDecimal(itemDtoList.size()), 4, RoundingMode.HALF_UP);
2325
+    }
2326
+
2327
+    /**
2328
+     * 过滤并排序
2329
+     *
2330
+     * @param itemListAll 全量数据
2331
+     * @param deptId      部门ID
2332
+     * @return 过滤并排序后列表
2333
+     */
2334
+    private List<CheckLargeScreenHomePageItemDto> sort(List<CheckLargeScreenHomePageItemDto> itemListAll, Long deptId) {
2335
+        if (CollUtil.isEmpty(itemListAll)) {
2336
+            return Collections.emptyList();
2337
+        }
2338
+        List<SysUser> sysUserList = sysUserService.selectUserListByRoleKeyAndDeptId(Arrays.asList(RoleTypeEnum.banzuzhang.getCode(), RoleTypeEnum.SecurityCheck.getCode()), deptId);
2339
+        List<Long> userIdList = sysUserList.stream().map(SysUser::getUserId).collect(Collectors.toList());
2340
+        List<CheckLargeScreenHomePageItemDto> itemDtoList = itemListAll.stream().filter(item -> userIdList.contains(item.getId())).collect(Collectors.toList());
2341
+        return processListBest(itemDtoList);
2342
+    }
2343
+
2344
+    /**
2345
+     * 排序
2346
+     *
2347
+     * @param list 待排序列表
2348
+     * @return 排序后列表
2349
+     */
2350
+    public List<CheckLargeScreenHomePageItemDto> processListBest(List<CheckLargeScreenHomePageItemDto> list) {
2351
+        AtomicInteger index = new AtomicInteger(1);
2352
+        return list.stream().sorted(Comparator.comparing(CheckLargeScreenHomePageItemDto::getPassRate).reversed()).peek(item -> item.setRank(index.getAndIncrement())).collect(Collectors.toList());
2353
+    }
2354
+
2355
+    /**
2356
+     * 首页-巡检-巡检合格率
2357
+     *
2358
+     * @param dto 首页查询参数
2359
+     * @return 首页-巡检-巡检合格率
2360
+     */
2361
+    @Override
2362
+    public BigDecimal checkPassRate(BaseLargeScreenQueryParamDto dto) {
2363
+        if (ObjUtil.isNull(dto.getUserId()) && ObjUtil.isNull(dto.getDeptId())) {
2364
+            throw new ServiceException("用户ID和部门ID不能同时为空");
2365
+        }
2366
+
2367
+        // 默认筛选条件
2368
+        if (ObjUtil.isNull(dto.getStartDate()) && ObjUtil.isNull(dto.getEndDate()) && ObjUtil.isNull(dto.getSpecifiedDate())) {
2369
+            dto.setEndDate(LargeScreenDateUtils.getCurrentDate());
2370
+            dto.setStartDate(LargeScreenDateUtils.getDateBeforeYears(1));
2371
+        }
2372
+
2373
+        // 全量数据
2374
+        List<CheckLargeScreenHomePageItemDto> itemListAll = getCheckLargeScreenHomePageItemDtoList(dto);
2375
+        if (CollUtil.isEmpty(itemListAll)) {
2376
+            return BigDecimal.ONE;
2377
+        }
2378
+
2379
+        if (ObjUtil.isNotNull(dto.getUserId())) {
2380
+            return itemListAll.stream().filter(item -> ObjUtil.equals(item.getId(), dto.getUserId())).findFirst().map(CheckLargeScreenHomePageItemDto::getPassRate).orElse(BigDecimal.ONE);
2381
+        } else {
2382
+            SysDept sysDept = sysDeptService.selectDeptById(dto.getDeptId());
2383
+            if (ObjUtil.isNull(sysDept)) {
2384
+                throw new ServiceException("部门不存在");
2385
+            }
2386
+            return calculate(itemListAll, sysDept.getDeptId());
2387
+        }
2388
+    }
2389
+
2390
+    /**
2391
+     * 巡检合格率全量数据
2392
+     *
2393
+     * @param dto 查询参数
2394
+     * @return 巡检合格率全量数据
2395
+     */
2396
+    @Override
2397
+    public List<CheckLargeScreenHomePageItemDto> getCheckLargeScreenHomePageItemDtoList(BaseLargeScreenQueryParamDto dto) {
2398
+        List<CheckLargeScreenHomePageItemDto> result = new ArrayList<>();
2399
+        String key = CacheConstants.USER_CHECK_PASS_RATE_KEY + dto.getStartDate() + ":" + dto.getEndDate() + ":" + dto.getSpecifiedDate();
2400
+        List<CheckLargeScreenHomePageItemDto> cacheList = redisCache.getCacheList(key);
2401
+        if (CollUtil.isNotEmpty(cacheList)) {
2402
+            result.addAll(cacheList);
2403
+        } else {
2404
+            List<CheckLargeScreenHomePageUserInfoSqlDto> userInfoListAll = checkLargeScreenMapper.homePageUserInfo();
2405
+            if (CollUtil.isEmpty(userInfoListAll)) {
2406
+                return Collections.emptyList();
2407
+            }
2408
+            List<CheckLargeScreenHomePageCheckRecordSqlDto> checkRecordListAll = checkLargeScreenMapper.homePageCheckRecord(dto);
2409
+            if (CollUtil.isEmpty(checkRecordListAll)) {
2410
+                return Collections.emptyList();
2411
+            }
2412
+            userInfoListAll.forEach(userInfoSqlDto -> {
2413
+                CheckLargeScreenHomePageItemDto itemDto = new CheckLargeScreenHomePageItemDto();
2414
+                itemDto.setId(userInfoSqlDto.getUserId());
2415
+                itemDto.setName(userInfoSqlDto.getNickName());
2416
+                List<CheckLargeScreenHomePageCheckRecordSqlDto> brigadeList = checkRecordListAll.stream().filter(checkRecordSqlDto -> StrUtil.equals(checkRecordSqlDto.getCheckedLevel(), CheckLevelEnum.BRIGADE_LEVEL.getCode()) && ObjUtil.equals(userInfoSqlDto.getBrigadeId(), checkRecordSqlDto.getCheckedBrigadeId())).collect(Collectors.toList());
2417
+                long brigadeTotal = brigadeList.stream().map(CheckLargeScreenHomePageCheckRecordSqlDto::getId).distinct().count();
2418
+                long brigadeUnqualifiedNum = brigadeList.stream().filter(item -> ObjUtil.equals(userInfoSqlDto.getUserId(), item.getUserId())).map(CheckLargeScreenHomePageCheckRecordSqlDto::getId).distinct().count();
2419
+                long brigadeQualifiedNum = brigadeTotal - brigadeUnqualifiedNum;
2420
+                List<CheckLargeScreenHomePageCheckRecordSqlDto> departmentList = checkRecordListAll.stream().filter(checkRecordSqlDto -> StrUtil.equals(checkRecordSqlDto.getCheckedLevel(), CheckLevelEnum.DEPARTMENT_LEVEL.getCode()) && ObjUtil.equals(userInfoSqlDto.getDepartmentId(), checkRecordSqlDto.getCheckedDepartmentId())).collect(Collectors.toList());
2421
+                long departmentTotal = departmentList.stream().map(CheckLargeScreenHomePageCheckRecordSqlDto::getId).distinct().count();
2422
+                long departmentUnqualifiedNum = departmentList.stream().filter(item -> ObjUtil.equals(userInfoSqlDto.getUserId(), item.getUserId())).map(CheckLargeScreenHomePageCheckRecordSqlDto::getId).distinct().count();
2423
+                long departmentQualifiedNum = departmentTotal - departmentUnqualifiedNum;
2424
+                List<CheckLargeScreenHomePageCheckRecordSqlDto> teamList = checkRecordListAll.stream().filter(checkRecordSqlDto -> StrUtil.equals(checkRecordSqlDto.getCheckedLevel(), CheckLevelEnum.TEAM_LEVEL.getCode()) && ObjUtil.equals(userInfoSqlDto.getTeamId(), checkRecordSqlDto.getCheckedTeamId())).collect(Collectors.toList());
2425
+                long teamTotal = teamList.stream().map(CheckLargeScreenHomePageCheckRecordSqlDto::getId).distinct().count();
2426
+                long teamUnqualifiedNum = teamList.stream().filter(item -> ObjUtil.equals(userInfoSqlDto.getUserId(), item.getUserId())).map(CheckLargeScreenHomePageCheckRecordSqlDto::getId).distinct().count();
2427
+                long teamQualifiedNum = teamTotal - teamUnqualifiedNum;
2428
+                List<CheckLargeScreenHomePageCheckRecordSqlDto> personalList = checkRecordListAll.stream().filter(checkRecordSqlDto -> StrUtil.equals(checkRecordSqlDto.getCheckedLevel(), CheckLevelEnum.PERSONNEL_LEVEL.getCode()) && ObjUtil.equals(userInfoSqlDto.getUserId(), checkRecordSqlDto.getCheckedPersonnelId())).collect(Collectors.toList());
2429
+                long personalTotal = personalList.stream().map(CheckLargeScreenHomePageCheckRecordSqlDto::getId).distinct().count();
2430
+                long personalUnqualifiedNum = personalList.stream().filter(item -> ObjUtil.equals(userInfoSqlDto.getUserId(), item.getUserId())).map(CheckLargeScreenHomePageCheckRecordSqlDto::getId).distinct().count();
2431
+                long personalQualifiedNum = personalTotal - personalUnqualifiedNum;
2432
+                long total = personalTotal + teamTotal + departmentTotal + brigadeTotal;
2433
+                long qualifiedNum = brigadeQualifiedNum + departmentQualifiedNum + teamQualifiedNum + personalQualifiedNum;
2434
+                itemDto.setPassRate(total == 0 ? BigDecimal.ONE : new BigDecimal(qualifiedNum).divide(new BigDecimal(total), 4, RoundingMode.HALF_UP));
2435
+                result.add(itemDto);
2436
+            });
2437
+            redisCache.setCacheList(key, result);
2438
+            redisCache.expire(key, 6, TimeUnit.HOURS);
2439
+        }
2440
+        return result;
2441
+    }
2442
+
2443
+    /**
2444
+     * 首页-巡检-巡检合格率排名
2445
+     *
2446
+     * @param dto 首页查询参数
2447
+     * @return 首页-巡检-巡检合格率排名
2448
+     */
2449
+    @Override
2450
+    public CheckLargeScreenHomePageRankingDto checkRanking(BaseLargeScreenQueryParamDto dto) {
2451
+        if (ObjUtil.isNull(dto.getUserId()) && ObjUtil.isNull(dto.getDeptId())) {
2452
+            throw new ServiceException("用户ID和部门ID不能同时为空");
2453
+        }
2454
+
2455
+        CheckLargeScreenHomePageRankingDto result = new CheckLargeScreenHomePageRankingDto();
2456
+        result.setTotal(0);
2457
+        result.setRank(0);
2458
+
2459
+        // 默认筛选条件
2460
+        if (ObjUtil.isNull(dto.getStartDate()) && ObjUtil.isNull(dto.getEndDate()) && ObjUtil.isNull(dto.getSpecifiedDate())) {
2461
+            dto.setEndDate(LargeScreenDateUtils.getCurrentDate());
2462
+            dto.setStartDate(LargeScreenDateUtils.getDateBeforeYears(1));
2463
+        }
2464
+
2465
+        // 全量数据
2466
+        List<CheckLargeScreenHomePageItemDto> itemListAll = getCheckLargeScreenHomePageItemDtoList(dto);
2467
+        if (CollUtil.isEmpty(itemListAll)) {
2468
+            return result;
2469
+        }
2470
+
2471
+        if (ObjUtil.isNotNull(dto.getUserId())) {
2472
+            SysUser sysUser = sysUserService.selectUserById(dto.getUserId());
2473
+            if (ObjUtil.isNull(sysUser.getDeptId())) {
2474
+                return result;
2475
+            }
2476
+            result.setId(sysUser.getUserId());
2477
+            result.setName(sysUser.getNickName());
2478
+            List<SysDept> deptList = sysDeptService.selectAllDept(sysUser.getDeptId());
2479
+            if (CollUtil.isEmpty(deptList)) {
2480
+                return result;
2481
+            }
2482
+            Collections.reverse(deptList);
2483
+            SysDept station = deptList.stream().filter(x -> StrUtil.equals(DeptType.STATION.getCode(), x.getDeptType())).findFirst().orElse(null);
2484
+            result.setPassRate(itemListAll.stream().filter(item -> ObjUtil.equals(item.getId(), dto.getUserId())).findFirst().map(CheckLargeScreenHomePageItemDto::getPassRate).orElse(BigDecimal.ONE));
2485
+            if (station != null) {
2486
+                List<CheckLargeScreenHomePageItemDto> sort = sort(itemListAll, station.getDeptId());
2487
+                result.setRankingList(sort);
2488
+                result.setTotal(sort.size());
2489
+                result.setRank(sort.stream().filter(item -> ObjUtil.equals(item.getId(), dto.getUserId())).findFirst().map(CheckLargeScreenHomePageItemDto::getRank).orElse(0));
2490
+            }
2491
+        } else {
2492
+            SysDept sysDept = sysDeptService.selectDeptById(dto.getDeptId());
2493
+            if (ObjUtil.isNull(sysDept)) {
2494
+                return result;
2495
+            }
2496
+            result.setId(sysDept.getDeptId());
2497
+            result.setName(sysDept.getDeptName());
2498
+            if (ObjUtil.equals(DeptType.TEAMS.getCode(), sysDept.getDeptType())) {
2499
+                SysDept teamDept = sysDept;
2500
+                result.setPassRate(calculate(itemListAll, teamDept.getDeptId()));
2501
+                SysDept departmentDept = sysDeptService.selectDeptById(teamDept.getParentId());
2502
+                SysDept brigadeDept = sysDeptService.selectDeptById(departmentDept.getParentId());
2503
+                SysDept stationDept = sysDeptService.selectDeptById(brigadeDept.getParentId());
2504
+
2505
+                List<SysDept> deptList = sysDeptService.selectChildrenDeptById(stationDept.getDeptId());
2506
+                List<SysDept> stationDeptList = deptList.stream().filter(item -> StrUtil.equals(DeptType.TEAMS.getCode(), item.getDeptType())).collect(Collectors.toList());
2507
+                List<CheckLargeScreenHomePageItemDto> stationRankingList = stationDeptList.stream().map(item -> {
2508
+                    CheckLargeScreenHomePageItemDto itemDto = new CheckLargeScreenHomePageItemDto();
2509
+                    itemDto.setId(item.getDeptId());
2510
+                    itemDto.setName(item.getDeptName());
2511
+                    itemDto.setPassRate(calculate(itemListAll, item.getDeptId()));
2512
+                    return itemDto;
2513
+                }).collect(Collectors.toList());
2514
+                List<CheckLargeScreenHomePageItemDto> itemDtoList = processListBest(stationRankingList);
2515
+                result.setRankingList(itemDtoList);
2516
+                result.setTotal(itemDtoList.size());
2517
+                result.setRank(itemDtoList.stream().filter(item -> ObjUtil.equals(item.getId(), teamDept.getDeptId())).findFirst().map(CheckLargeScreenHomePageItemDto::getRank).orElse(0));
2518
+            } else if (ObjUtil.equals(DeptType.MANAGER.getCode(), sysDept.getDeptType())) {
2519
+                SysDept departmentDept = sysDept;
2520
+                result.setPassRate(calculate(itemListAll, departmentDept.getDeptId()));
2521
+                SysDept brigadeDept = sysDeptService.selectDeptById(departmentDept.getParentId());
2522
+                SysDept stationDept = sysDeptService.selectDeptById(brigadeDept.getParentId());
2523
+
2524
+                List<SysDept> deptList = sysDeptService.selectChildrenDeptById(stationDept.getDeptId());
2525
+                List<SysDept> stationDeptList = deptList.stream().filter(item -> StrUtil.equals(DeptType.MANAGER.getCode(), item.getDeptType())).collect(Collectors.toList());
2526
+                List<CheckLargeScreenHomePageItemDto> stationRankingList = stationDeptList.stream().map(item -> {
2527
+                    CheckLargeScreenHomePageItemDto itemDto = new CheckLargeScreenHomePageItemDto();
2528
+                    itemDto.setId(item.getDeptId());
2529
+                    itemDto.setName(item.getDeptName());
2530
+                    itemDto.setPassRate(calculate(itemListAll, item.getDeptId()));
2531
+                    return itemDto;
2532
+                }).collect(Collectors.toList());
2533
+                List<CheckLargeScreenHomePageItemDto> itemDtoList = processListBest(stationRankingList);
2534
+                result.setRankingList(itemDtoList);
2535
+                result.setTotal(itemDtoList.size());
2536
+                result.setRank(itemDtoList.stream().filter(item -> ObjUtil.equals(item.getId(), departmentDept.getDeptId())).findFirst().map(CheckLargeScreenHomePageItemDto::getRank).orElse(0));
2537
+            } else if (ObjUtil.equals(DeptType.BRIGADE.getCode(), sysDept.getDeptType())) {
2538
+                SysDept brigadeDept = sysDept;
2539
+                result.setPassRate(calculate(itemListAll, brigadeDept.getDeptId()));
2540
+                SysDept stationDept = sysDeptService.selectDeptById(brigadeDept.getParentId());
2541
+
2542
+                List<SysDept> deptList = sysDeptService.selectChildrenDeptById(stationDept.getDeptId());
2543
+                List<SysDept> stationDeptList = deptList.stream().filter(item -> ObjUtil.equals(stationDept.getDeptId(), item.getParentId())).collect(Collectors.toList());
2544
+                List<CheckLargeScreenHomePageItemDto> stationRankingList = stationDeptList.stream().map(item -> {
2545
+                    CheckLargeScreenHomePageItemDto itemDto = new CheckLargeScreenHomePageItemDto();
2546
+                    itemDto.setId(item.getDeptId());
2547
+                    itemDto.setName(item.getDeptName());
2548
+                    itemDto.setPassRate(calculate(itemListAll, item.getDeptId()));
2549
+                    return itemDto;
2550
+                }).collect(Collectors.toList());
2551
+                List<CheckLargeScreenHomePageItemDto> itemDtoList = processListBest(stationRankingList);
2552
+                result.setRankingList(itemDtoList);
2553
+                result.setTotal(itemDtoList.size());
2554
+                result.setRank(itemDtoList.stream().filter(item -> ObjUtil.equals(item.getId(), brigadeDept.getDeptId())).findFirst().map(CheckLargeScreenHomePageItemDto::getRank).orElse(0));
2555
+            }
2556
+        }
2557
+
2558
+        // 奖牌类型处理
2559
+        if (result.getTotal() != 0 && result.getRank() != 0) {
2560
+            // 后三名:最后一名哭脸红,倒数第二名哭脸橙,倒数第三名哭脸黄
2561
+            int positionFromEnd = result.getTotal() - result.getRank() + 1;
2562
+            if (result.getRank() == 1) {
2563
+                result.setMedalType(MedalTypeEnum.GOLD.getCode());
2564
+                result.setMedalTypeDesc(MedalTypeEnum.GOLD.getDesc());
2565
+            } else if (result.getRank() == 2) {
2566
+                result.setMedalType(MedalTypeEnum.SILVER.getCode());
2567
+                result.setMedalTypeDesc(MedalTypeEnum.SILVER.getDesc());
2568
+            } else if (result.getRank() == 3) {
2569
+                result.setMedalType(MedalTypeEnum.BRONZE.getCode());
2570
+                result.setMedalTypeDesc(MedalTypeEnum.BRONZE.getDesc());
2571
+            } else if (positionFromEnd == 1) {
2572
+                result.setMedalType(MedalTypeEnum.CRY_RED.getCode());
2573
+                result.setMedalTypeDesc(MedalTypeEnum.CRY_RED.getDesc());
2574
+            } else if (positionFromEnd == 2) {
2575
+                result.setMedalType(MedalTypeEnum.CRY_ORANGE.getCode());
2576
+                result.setMedalTypeDesc(MedalTypeEnum.CRY_ORANGE.getDesc());
2577
+            } else if (positionFromEnd == 3) {
2578
+                result.setMedalType(MedalTypeEnum.CRY_YELLOW.getCode());
2579
+                result.setMedalTypeDesc(MedalTypeEnum.CRY_YELLOW.getDesc());
2580
+            }
2581
+        }
2582
+        return result;
2583
+    }
2584
+
2585
+    /**
2586
+     * 首页-巡检-今日巡检问题数
2587
+     *
2588
+     * @param dto 首页查询参数
2589
+     * @return 首页-巡检-今日巡检问题数
2590
+     */
2591
+    @Override
2592
+    public Integer checkCorrectionCount(BaseLargeScreenQueryParamDto dto) {
2593
+        // 默认筛选条件
2594
+        if (ObjUtil.isNull(dto.getUserId())) {
2595
+            dto.setUserId(SecurityUtils.getUserId());
2596
+        }
2597
+        if (ObjUtil.isNull(dto.getStartDate()) && ObjUtil.isNull(dto.getEndDate()) && ObjUtil.isNull(dto.getSpecifiedDate())) {
2598
+            dto.setSpecifiedDate(LargeScreenDateUtils.getCurrentDate());
2599
+        }
2600
+        return checkLargeScreenMapper.checkCorrectionCount(dto);
2601
+    }
2602
+
2012 2603
 }

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

@@ -784,4 +784,133 @@
784 784
         </if>) temp
785 785
     </select>
786 786
 
787
+    <select id="homePageUserInfo" resultType="com.sundot.airport.check.domain.CheckLargeScreenHomePageUserInfoSqlDto">
788
+        select su.user_id      userId,
789
+               su.user_name    userName,
790
+               su.nick_name    nickName,
791
+               sd_bz.dept_id   teamId,
792
+               sd_bz.dept_name teamName,
793
+               sd_ks.dept_id   departmentId,
794
+               sd_ks.dept_name departmentName,
795
+               sd_dd.dept_id   brigadeId,
796
+               sd_dd.dept_name brigadeName,
797
+               sd_zj.dept_id   stationId,
798
+               sd_zj.dept_name stationName
799
+        from sys_user su
800
+                 inner join sys_user_role sur on sur.user_id = su.user_id
801
+                 inner join sys_role sr on sr.role_id = sur.role_id
802
+                 inner join sys_dept sd_bz on sd_bz.dept_id = su.dept_id
803
+                 inner join sys_dept sd_ks on sd_ks.dept_id = sd_bz.parent_id
804
+                 inner join sys_dept sd_dd on sd_dd.dept_id = sd_ks.parent_id
805
+                 inner join sys_dept sd_zj on sd_zj.dept_id = sd_dd.parent_id
806
+        where 1 = 1
807
+          and sr.role_key in ('banzuzhang', 'SecurityCheck')
808
+    </select>
809
+
810
+    <select id="homePageCheckRecord"
811
+            resultType="com.sundot.airport.check.domain.CheckLargeScreenHomePageCheckRecordSqlDto">
812
+        select cr.id id,
813
+        cr.document_code documentCode,
814
+        cr.document_name documentName,
815
+        cr.checker_id checkerId,
816
+        cr.checker_name checkerName,
817
+        date_format(cr.check_time, '%Y-%m-%d %H:%i:%s') checkTime,
818
+        cr.check_level checkLevel,
819
+        cr.check_level_desc checkLevelDesc,
820
+        cr.checked_level checkedLevel,
821
+        cr.checked_level_desc checkedLevelDesc,
822
+        cr.checked_brigade_id checkedBrigadeId,
823
+        cr.checked_brigade_name checkedBrigadeName,
824
+        cr.checked_department_id checkedDepartmentId,
825
+        cr.checked_department_name checkedDepartmentName,
826
+        cr.checked_team_id checkedTeamId,
827
+        cr.checked_team_name checkedTeamName,
828
+        cr.checked_personnel_id checkedPersonnelId,
829
+        cr.checked_personnel_name checkedPersonnelName,
830
+        cr.checked_dept_id checkedDeptId,
831
+        cr.checked_dept_name checkedDeptName,
832
+        cr.responsible_user_id responsibleUserId,
833
+        cr.responsible_user_name responsibleUserName,
834
+        cr.check_result checkResult,
835
+        cr.check_result_desc checkResultDesc,
836
+        cpi.score_level scoreLevel,
837
+        cpi.score_level_desc scoreLevelDesc,
838
+        cr.check_record_status checkRecordStatus,
839
+        cr.check_record_status_desc checkRecordStatusDesc,
840
+        cu.user_id userId,
841
+        cu.user_name userName
842
+        from check_record cr
843
+        left join check_project_item cpi on (cpi.source_id = cr.id and cpi.type = 'CHECK_RECORDS')
844
+        left join check_user cu on (cu.source_id = cpi.id and cu.type = 'INSPECT_RECORDS_INSPECTION_ITEM_DETAILS')
845
+        where 1 = 1
846
+        <if test="specifiedDate != null">
847
+            and DATE(cr.check_time) = DATE(#{specifiedDate})
848
+        </if>
849
+        <if test="startDate != null and endDate != null">
850
+            and (cr.check_time >= #{startDate}
851
+            and cr.check_time <![CDATA[ < ]]> date_add(#{endDate} , interval 1 day))
852
+        </if>
853
+    </select>
854
+
855
+    <select id="homePageCheckCorrection"
856
+            resultType="com.sundot.airport.check.domain.CheckLargeScreenHomePageCheckCorrectionSqlDto">
857
+        select cc.id id,
858
+        cc.document_code documentCode,
859
+        cc.document_name documentName,
860
+        cc.checker_id checkerId,
861
+        cc.checker_name checkerName,
862
+        date_format(cc.check_time, '%Y-%m-%d %H:%i:%s') checkTime,
863
+        cc.check_level checkLevel,
864
+        cc.check_level_desc checkLevelDesc,
865
+        cc.checked_level checkedLevel,
866
+        cc.checked_level_desc checkedLevelDesc,
867
+        cc.checked_brigade_id checkedBrigadeId,
868
+        cc.checked_brigade_name checkedBrigadeName,
869
+        cc.checked_department_id checkedDepartmentId,
870
+        cc.checked_department_name checkedDepartmentName,
871
+        cc.checked_team_id checkedTeamId,
872
+        cc.checked_team_name checkedTeamName,
873
+        cc.checked_personnel_id checkedPersonnelId,
874
+        cc.checked_personnel_name checkedPersonnelName,
875
+        cc.checked_dept_id checkedDeptId,
876
+        cc.checked_dept_name checkedDeptName,
877
+        cc.responsible_user_id responsibleUserId,
878
+        cc.responsible_user_name responsibleUserName,
879
+        cc.process_status processStatus,
880
+        cc.process_status_desc processStatusDesc,
881
+        cc.instance_id instanceId,
882
+        date_format(cc.completion_time, '%Y-%m-%d %H:%i:%s') completionTime,
883
+        cu.user_id userId,
884
+        cu.user_name userName
885
+        from check_correction cc
886
+        left join check_project_item cpi on (cpi.source_id = cc.id and cpi.type = 'CHECK_CORRECTION')
887
+        left join check_user cu
888
+        on (cu.source_id = cpi.id and cu.type = 'PROBLEM_RECTIFICATION_INSPECTION_ITEM_DETAILS')
889
+        where 1 = 1
890
+        <if test="specifiedDate != null">
891
+            and DATE(cc.check_time) = DATE(#{specifiedDate})
892
+        </if>
893
+        <if test="startDate != null and endDate != null">
894
+            and (cc.check_time >= #{startDate}
895
+            and cc.check_time <![CDATA[ < ]]> date_add(#{endDate} , interval 1 day))
896
+        </if>
897
+    </select>
898
+
899
+    <select id="checkCorrectionCount"
900
+            resultType="java.lang.Integer">
901
+        select count(1)
902
+        from check_correction cc
903
+        where 1 = 1
904
+        <if test="userId != null">
905
+            and cc.checker_id = #{userId}
906
+        </if>
907
+        <if test="specifiedDate != null">
908
+            and DATE(cc.check_time) = DATE(#{specifiedDate})
909
+        </if>
910
+        <if test="startDate != null and endDate != null">
911
+            and (cc.check_time >= #{startDate}
912
+            and cc.check_time <![CDATA[ < ]]> date_add(#{endDate} , interval 1 day))
913
+        </if>
914
+    </select>
915
+
787 916
 </mapper>

+ 5 - 0
airport-common/src/main/java/com/sundot/airport/common/constant/CacheConstants.java

@@ -45,4 +45,9 @@ public class CacheConstants {
45 45
      * 用户信息缓存
46 46
      */
47 47
     public static final String USER_INFO_KEY = "user_info:";
48
+
49
+    /**
50
+     * 用户巡检合格率全量数据缓存
51
+     */
52
+    public static final String USER_CHECK_PASS_RATE_KEY = "user_check_pass_rate:";
48 53
 }

+ 36 - 0
airport-common/src/main/java/com/sundot/airport/common/core/domain/CheckLargeScreenHomePageItemDto.java

@@ -0,0 +1,36 @@
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 CheckLargeScreenHomePageItemDto {
15
+
16
+    /**
17
+     * 主键
18
+     */
19
+    private Long id;
20
+
21
+    /**
22
+     * 名称
23
+     */
24
+    private String name;
25
+
26
+    /**
27
+     * 合格率
28
+     */
29
+    private BigDecimal passRate;
30
+
31
+    /**
32
+     * 名次
33
+     */
34
+    private Integer rank;
35
+
36
+}

+ 54 - 0
airport-common/src/main/java/com/sundot/airport/common/core/domain/CheckLargeScreenHomePageRankingDto.java

@@ -0,0 +1,54 @@
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
+ * 首页巡检合格率排名DTO
10
+ */
11
+@Data
12
+public class CheckLargeScreenHomePageRankingDto {
13
+
14
+    /**
15
+     * ID
16
+     */
17
+    private Long id;
18
+
19
+    /**
20
+     * 名称
21
+     */
22
+    private String name;
23
+
24
+    /**
25
+     * 排名
26
+     */
27
+    private Integer rank;
28
+
29
+    /**
30
+     * 总数
31
+     */
32
+    private Integer total;
33
+
34
+    /**
35
+     * 奖牌类型(1-金牌,2-银牌,3-铜牌,4-哭脸红,5-哭脸橙,6-哭脸黄)
36
+     */
37
+    private Integer medalType;
38
+
39
+    /**
40
+     * 奖牌类型描述
41
+     */
42
+    private String medalTypeDesc;
43
+
44
+    /**
45
+     * 合格率
46
+     */
47
+    private BigDecimal passRate;
48
+
49
+    /**
50
+     * 排行列表
51
+     */
52
+    private List<CheckLargeScreenHomePageItemDto> rankingList;
53
+
54
+}

+ 34 - 0
airport-common/src/main/java/com/sundot/airport/common/enums/MedalTypeEnum.java

@@ -0,0 +1,34 @@
1
+package com.sundot.airport.common.enums;
2
+
3
+import lombok.Getter;
4
+
5
+/**
6
+ * 奖牌类型枚举
7
+ */
8
+@Getter
9
+public enum MedalTypeEnum {
10
+
11
+    GOLD(1, "金牌"),
12
+    SILVER(2, "银牌"),
13
+    BRONZE(3, "铜牌"),
14
+    CRY_RED(4, "哭脸红"),
15
+    CRY_ORANGE(5, "哭脸橙"),
16
+    CRY_YELLOW(6, "哭脸黄");
17
+
18
+    private final Integer code;
19
+    private final String desc;
20
+
21
+    MedalTypeEnum(Integer code, String desc) {
22
+        this.code = code;
23
+        this.desc = desc;
24
+    }
25
+
26
+    public static MedalTypeEnum getByCode(Integer code) {
27
+        for (MedalTypeEnum medalType : values()) {
28
+            if (medalType.getCode().equals(code)) {
29
+                return medalType;
30
+            }
31
+        }
32
+        return null;
33
+    }
34
+}