wangxx дней назад: 5
Родитель
Сommit
ac6d433886

+ 2 - 2
airport-blocked/src/main/java/com/sundot/airport/blocked/dto/BlockedItemLocationDistributionDTO.java

@@ -8,10 +8,10 @@ import java.io.Serializable;
8
 import java.math.BigDecimal;
8
 import java.math.BigDecimal;
9
 
9
 
10
 /**
10
 /**
11
- * 查堵物品位置分布统计DTO(用于扇形图)
11
+ * 查堵物品位置分布统计DTO
12
  * 
12
  * 
13
  * @author wangxx
13
  * @author wangxx
14
- * @date 2026-04-15
14
+ * @date 2026-04-16
15
  */
15
  */
16
 @Data
16
 @Data
17
 @ApiModel("查堵物品位置分布统计")
17
 @ApiModel("查堵物品位置分布统计")

+ 142 - 0
airport-blocked/src/main/java/com/sundot/airport/blocked/mapper/BlockedDashboardMapper.java

@@ -5,20 +5,27 @@ import com.sundot.airport.blocked.dto.BlockedBrigadeCertificateDistributionDTO;
5
 import com.sundot.airport.blocked.dto.BlockedBrigadeRateStatsDTO;
5
 import com.sundot.airport.blocked.dto.BlockedBrigadeRateStatsDTO;
6
 import com.sundot.airport.blocked.dto.BlockedBrigadeStatsDTO;
6
 import com.sundot.airport.blocked.dto.BlockedBrigadeStatsDTO;
7
 import com.sundot.airport.blocked.dto.BlockedCertificateDistributionDTO;
7
 import com.sundot.airport.blocked.dto.BlockedCertificateDistributionDTO;
8
+import com.sundot.airport.blocked.dto.BlockedCertificateLevelDistributionDTO;
8
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeLuggageStatsDTO;
9
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeLuggageStatsDTO;
9
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeRateStatsDTO;
10
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeRateStatsDTO;
10
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeStatsDTO;
11
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeStatsDTO;
12
+import com.sundot.airport.blocked.dto.BlockedDailyBrigadeTerminalLuggageStatsDTO;
13
+import com.sundot.airport.blocked.dto.BlockedDailyBrigadeTerminalRateStatsDTO;
14
+import com.sundot.airport.blocked.dto.BlockedDailyBrigadeTerminalStatsDTO;
11
 import com.sundot.airport.blocked.dto.BlockedDailyLuggageStatsDTO;
15
 import com.sundot.airport.blocked.dto.BlockedDailyLuggageStatsDTO;
12
 import com.sundot.airport.blocked.dto.BlockedDailyRateStatsDTO;
16
 import com.sundot.airport.blocked.dto.BlockedDailyRateStatsDTO;
13
 import com.sundot.airport.blocked.dto.BlockedDailyStatsDTO;
17
 import com.sundot.airport.blocked.dto.BlockedDailyStatsDTO;
14
 import com.sundot.airport.blocked.dto.BlockedDashboardQueryDTO;
18
 import com.sundot.airport.blocked.dto.BlockedDashboardQueryDTO;
15
 import com.sundot.airport.blocked.dto.BlockedDifficultyDistributionDTO;
19
 import com.sundot.airport.blocked.dto.BlockedDifficultyDistributionDTO;
16
 import com.sundot.airport.blocked.dto.BlockedDiscriminationDistributionDTO;
20
 import com.sundot.airport.blocked.dto.BlockedDiscriminationDistributionDTO;
21
+import com.sundot.airport.blocked.dto.BlockedGenderDistributionDTO;
17
 import com.sundot.airport.blocked.dto.BlockedItemDistributionDTO;
22
 import com.sundot.airport.blocked.dto.BlockedItemDistributionDTO;
18
 import com.sundot.airport.blocked.dto.BlockedItemLocationDistributionDTO;
23
 import com.sundot.airport.blocked.dto.BlockedItemLocationDistributionDTO;
19
 import com.sundot.airport.blocked.dto.BlockedMissCheckReasonDistributionDTO;
24
 import com.sundot.airport.blocked.dto.BlockedMissCheckReasonDistributionDTO;
20
 import com.sundot.airport.blocked.dto.BlockedOperatingYearsDistributionDTO;
25
 import com.sundot.airport.blocked.dto.BlockedOperatingYearsDistributionDTO;
21
 import com.sundot.airport.blocked.dto.BlockedRankingDTO;
26
 import com.sundot.airport.blocked.dto.BlockedRankingDTO;
27
+import com.sundot.airport.blocked.dto.BlockedTerminalStatsDTO;
28
+import com.sundot.airport.blocked.dto.BlockedTimePeriodLuggageStatsDTO;
22
 import com.sundot.airport.blocked.dto.BlockedTimePeriodStatsDTO;
29
 import com.sundot.airport.blocked.dto.BlockedTimePeriodStatsDTO;
23
 import org.apache.ibatis.annotations.Mapper;
30
 import org.apache.ibatis.annotations.Mapper;
24
 import org.apache.ibatis.annotations.Param;
31
 import org.apache.ibatis.annotations.Param;
@@ -249,4 +256,139 @@ public interface BlockedDashboardMapper {
249
      * @return 大队证书分布统计列表
256
      * @return 大队证书分布统计列表
250
      */
257
      */
251
     List<BlockedBrigadeCertificateDistributionDTO> selectBrigadeCertificateDistribution(BlockedDashboardQueryDTO queryDTO);
258
     List<BlockedBrigadeCertificateDistributionDTO> selectBrigadeCertificateDistribution(BlockedDashboardQueryDTO queryDTO);
259
+
260
+    /**
261
+     * 查询两楼每日查堵走势(按大队)
262
+     * 
263
+     * @param queryDTO 查询参数
264
+     * @return 两楼每日查堵走势统计列表
265
+     */
266
+    List<BlockedDailyBrigadeTerminalStatsDTO> selectDailyBrigadeTerminalStats(BlockedDashboardQueryDTO queryDTO);
267
+
268
+    /**
269
+     * 查询两楼每日过检图像数(按大队)
270
+     * 
271
+     * @param queryDTO 查询参数
272
+     * @return 两楼每日过检图像数统计列表
273
+     */
274
+    List<BlockedDailyBrigadeTerminalLuggageStatsDTO> selectDailyBrigadeTerminalLuggageStats(BlockedDashboardQueryDTO queryDTO);
275
+
276
+    /**
277
+     * 查询两楼查堵数(包含行检,按大队)
278
+     * 数据来源:漏检统计表
279
+     * 先查大队数量,再查T1、T2数量
280
+     * 
281
+     * @param queryDTO 查询参数
282
+     * @return 两楼查堵数统计
283
+     */
284
+    BlockedTerminalStatsDTO selectTerminalBlockedStats(BlockedDashboardQueryDTO queryDTO);
285
+
286
+    /**
287
+     * 查询查堵时间段过检行李数(按大队)
288
+     * 数据源:每日各时间段过检行李数
289
+     * 维度(横轴):时间段
290
+     * 统计值(左坐标轴):过检行李数平均值
291
+     * 统计值(右坐标轴):时段查堵件数平均值
292
+     * 
293
+     * @param queryDTO 查询参数
294
+     * @return 时间段过检行李数统计列表
295
+     */
296
+    List<BlockedTimePeriodLuggageStatsDTO> selectTimePeriodLuggageStats(BlockedDashboardQueryDTO queryDTO);
297
+
298
+    /**
299
+     * 查询两楼每日查堵万分率(按大队)
300
+     * 数据源:各大队每日过检行李查堵数据收集表
301
+     * 按时间统计T2旅检万分率、T1旅检万分率、T1行检万分率、T2行检万分率
302
+     * 
303
+     * @param queryDTO 查询参数
304
+     * @return 两楼每日查堵万分率统计列表
305
+     */
306
+    List<BlockedDailyBrigadeTerminalRateStatsDTO> selectDailyBrigadeTerminalRateStats(BlockedDashboardQueryDTO queryDTO);
307
+
308
+    /**
309
+     * 查询查堵-主管分管次数分布(用于饼图)
310
+     * 
311
+     * @param queryDTO 查询参数
312
+     * @return 主管分管次数分布统计列表
313
+     */
314
+    List<BlockedRankingDTO> selectSupervisorDistribution(BlockedDashboardQueryDTO queryDTO);
315
+
316
+    /**
317
+     * 查询查堵-主管排行榜(大队维度,前10名)
318
+     * 数据源:漏检统计表
319
+     * 数据筛选:分管主管不为空
320
+     * 排行字段:分管主管
321
+     * 排行依据:统计记录总数
322
+     * 显示行数:显示前10行
323
+     * 
324
+     * @param queryDTO 查询参数
325
+     * @return 主管排行榜列表(前10名)
326
+     */
327
+    List<BlockedRankingDTO> selectBrigadeSupervisorRanking(BlockedDashboardQueryDTO queryDTO);
328
+
329
+    /**
330
+     * 查询查堵-班组排行榜(大队维度,前10名)
331
+     * 数据源:漏检统计表
332
+     * 数据筛选:分管班组长不为空
333
+     * 排行字段:分管班组长
334
+     * 排行依据:统计记录总数
335
+     * 显示行数:显示前10行
336
+     * 
337
+     * @param queryDTO 查询参数
338
+     * @return 班组排行榜列表(前10名)
339
+     */
340
+    List<BlockedRankingDTO> selectBrigadeTeamLeaderRanking(BlockedDashboardQueryDTO queryDTO);
341
+
342
+    /**
343
+     * 查询查堵-人员排行榜(大队维度,前10名)
344
+     * 数据源:漏检统计表
345
+     * 数据筛选:被回查人不为空
346
+     * 排行字段:被回查人
347
+     * 排行依据:统计记录总数
348
+     * 显示行数:显示前10行
349
+     * 
350
+     * @param queryDTO 查询参数
351
+     * @return 人员排行榜列表(前10名)
352
+     */
353
+    List<BlockedRankingDTO> selectBrigadeReviewedUserRanking(BlockedDashboardQueryDTO queryDTO);
354
+
355
+    /**
356
+     * 查询查堵男女比例(按大队)
357
+     * 数据源:漏检统计表
358
+     * 统计性别分布
359
+     * 
360
+     * @param queryDTO 查询参数
361
+     * @return 男女比例统计列表
362
+     */
363
+    List<BlockedGenderDistributionDTO> selectGenderDistribution(BlockedDashboardQueryDTO queryDTO);
364
+
365
+    /**
366
+     * 查询查堵人员证书级别分布(按大队)
367
+     * 数据源:漏检统计表
368
+     * 统计证书级别分布
369
+     * 
370
+     * @param queryDTO 查询参数
371
+     * @return 证书级别分布统计列表
372
+     */
373
+    List<BlockedCertificateLevelDistributionDTO> selectCertificateLevelDistribution(BlockedDashboardQueryDTO queryDTO);
374
+
375
+    /**
376
+     * 查询证书级别人员基数(分大队统计)
377
+     * 数据源:用户表(sys_user) + 部门表(sys_dept)
378
+     * 统计大队人员里面的人员证书级别构成
379
+     * 
380
+     * @param queryDTO 查询参数(大队ID必填)
381
+     * @return 证书级别人员基数统计列表
382
+     */
383
+    List<BlockedCertificateLevelDistributionDTO> selectBrigadePersonnelCertificateBase(BlockedDashboardQueryDTO queryDTO);
384
+
385
+    /**
386
+     * 查询查堵人员开机年限分布(用于饼图)
387
+     * 数据源:漏检统计表
388
+     * 统计字段:开机年限
389
+     * 
390
+     * @param queryDTO 查询参数
391
+     * @return 开机年限分布统计列表
392
+     */
393
+    List<BlockedOperatingYearsDistributionDTO> selectOperatingYearsDistribution(BlockedDashboardQueryDTO queryDTO);
252
 }
394
 }

+ 150 - 0
airport-blocked/src/main/java/com/sundot/airport/blocked/service/IBlockedDashboardService.java

@@ -5,9 +5,13 @@ import com.sundot.airport.blocked.dto.BlockedBrigadeCertificateDistributionDTO;
5
 import com.sundot.airport.blocked.dto.BlockedBrigadeRateStatsDTO;
5
 import com.sundot.airport.blocked.dto.BlockedBrigadeRateStatsDTO;
6
 import com.sundot.airport.blocked.dto.BlockedBrigadeStatsDTO;
6
 import com.sundot.airport.blocked.dto.BlockedBrigadeStatsDTO;
7
 import com.sundot.airport.blocked.dto.BlockedCertificateDistributionDTO;
7
 import com.sundot.airport.blocked.dto.BlockedCertificateDistributionDTO;
8
+import com.sundot.airport.blocked.dto.BlockedCertificateLevelDistributionDTO;
8
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeLuggageStatsDTO;
9
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeLuggageStatsDTO;
9
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeRateStatsDTO;
10
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeRateStatsDTO;
10
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeStatsDTO;
11
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeStatsDTO;
12
+import com.sundot.airport.blocked.dto.BlockedDailyBrigadeTerminalLuggageStatsDTO;
13
+import com.sundot.airport.blocked.dto.BlockedDailyBrigadeTerminalRateStatsDTO;
14
+import com.sundot.airport.blocked.dto.BlockedDailyBrigadeTerminalStatsDTO;
11
 import com.sundot.airport.blocked.dto.BlockedDailyLuggageStatsDTO;
15
 import com.sundot.airport.blocked.dto.BlockedDailyLuggageStatsDTO;
12
 import com.sundot.airport.blocked.dto.BlockedDailyRateStatsDTO;
16
 import com.sundot.airport.blocked.dto.BlockedDailyRateStatsDTO;
13
 import com.sundot.airport.blocked.dto.BlockedDailyStatsDTO;
17
 import com.sundot.airport.blocked.dto.BlockedDailyStatsDTO;
@@ -15,12 +19,15 @@ import com.sundot.airport.blocked.dto.BlockedDashboardQueryDTO;
15
 import com.sundot.airport.blocked.dto.BlockedDashboardResultDTO;
19
 import com.sundot.airport.blocked.dto.BlockedDashboardResultDTO;
16
 import com.sundot.airport.blocked.dto.BlockedDifficultyDistributionDTO;
20
 import com.sundot.airport.blocked.dto.BlockedDifficultyDistributionDTO;
17
 import com.sundot.airport.blocked.dto.BlockedDiscriminationDistributionDTO;
21
 import com.sundot.airport.blocked.dto.BlockedDiscriminationDistributionDTO;
22
+import com.sundot.airport.blocked.dto.BlockedGenderDistributionDTO;
18
 import com.sundot.airport.blocked.dto.BlockedItemDistributionDTO;
23
 import com.sundot.airport.blocked.dto.BlockedItemDistributionDTO;
19
 import com.sundot.airport.blocked.dto.BlockedItemLocationDistributionDTO;
24
 import com.sundot.airport.blocked.dto.BlockedItemLocationDistributionDTO;
20
 import com.sundot.airport.blocked.dto.BlockedMissCheckReasonDistributionDTO;
25
 import com.sundot.airport.blocked.dto.BlockedMissCheckReasonDistributionDTO;
21
 import com.sundot.airport.blocked.dto.BlockedOperatingYearsDistributionDTO;
26
 import com.sundot.airport.blocked.dto.BlockedOperatingYearsDistributionDTO;
22
 import com.sundot.airport.blocked.dto.BlockedRankingDTO;
27
 import com.sundot.airport.blocked.dto.BlockedRankingDTO;
23
 import com.sundot.airport.blocked.dto.BlockedRateResultDTO;
28
 import com.sundot.airport.blocked.dto.BlockedRateResultDTO;
29
+import com.sundot.airport.blocked.dto.BlockedTerminalStatsDTO;
30
+import com.sundot.airport.blocked.dto.BlockedTimePeriodLuggageStatsDTO;
24
 import com.sundot.airport.blocked.dto.BlockedTimePeriodStatsDTO;
31
 import com.sundot.airport.blocked.dto.BlockedTimePeriodStatsDTO;
25
 
32
 
26
 import java.util.List;
33
 import java.util.List;
@@ -240,4 +247,147 @@ public interface IBlockedDashboardService {
240
      * @return 大队证书分布统计列表
247
      * @return 大队证书分布统计列表
241
      */
248
      */
242
     List<BlockedBrigadeCertificateDistributionDTO> getBrigadeCertificateDistribution(BlockedDashboardQueryDTO queryDTO);
249
     List<BlockedBrigadeCertificateDistributionDTO> getBrigadeCertificateDistribution(BlockedDashboardQueryDTO queryDTO);
250
+
251
+    /**
252
+     * 查询两楼每日查堵走势(按大队)
253
+     * 数据来源:各大队每日过检行李查堵数据收集表
254
+     * 先查出来是哪个安检大队的,然后按日期统计以下四个字段:
255
+     * T1旅检查堵件数、T2旅检查堵件数、T1行检查堵件数、T2行检查堵件数
256
+     * 
257
+     * @param queryDTO 查询参数
258
+     * @return 两楼每日查堵走势统计列表
259
+     */
260
+    List<BlockedDailyBrigadeTerminalStatsDTO> getDailyBrigadeTerminalStats(BlockedDashboardQueryDTO queryDTO);
261
+
262
+    /**
263
+     * 查询两楼每日过检图像数(按大队)
264
+     * 数据来源:各大队每日过检行李查堵数据收集表
265
+     * 先查出来是哪个安检大队的,然后按日期统计以下四个字段:
266
+     * T2旅检过检行李数、T1旅检过检行李数、T1行检过检行李数、T2行检过检行李数
267
+     * 
268
+     * @param queryDTO 查询参数
269
+     * @return 两楼每日过检图像数统计列表
270
+     */
271
+    List<BlockedDailyBrigadeTerminalLuggageStatsDTO> getDailyBrigadeTerminalLuggageStats(BlockedDashboardQueryDTO queryDTO);
272
+
273
+    /**
274
+     * 查询两楼查堵数(包含行检,按大队)
275
+     * 数据来源:漏检统计表
276
+     * 先查大队数量,再查T1、T2数量
277
+     * 
278
+     * @param queryDTO 查询参数
279
+     * @return 两楼查堵数统计
280
+     */
281
+    BlockedTerminalStatsDTO getTerminalBlockedStats(BlockedDashboardQueryDTO queryDTO);
282
+
283
+    /**
284
+     * 查询查堵时间段过检行李数(按大队)
285
+     * 数据源:每日各时间段过检行李数
286
+     * 维度(横轴):时间段
287
+     * 统计值(左坐标轴):过检行李数平均值
288
+     * 统计值(右坐标轴):时段查堵件数平均值
289
+     * 
290
+     * @param queryDTO 查询参数
291
+     * @return 时间段过检行李数统计列表
292
+     */
293
+    List<BlockedTimePeriodLuggageStatsDTO> getTimePeriodLuggageStats(BlockedDashboardQueryDTO queryDTO);
294
+
295
+    /**
296
+     * 查询两楼每日查堵万分率(按大队)
297
+     * 数据源:各大队每日过检行李查堵数据收集表
298
+     * 按时间统计T2旅检万分率、T1旅检万分率、T1行检万分率、T2行检万分率
299
+     * 
300
+     * @param queryDTO 查询参数
301
+     * @return 两楼每日查堵万分率统计列表
302
+     */
303
+    List<BlockedDailyBrigadeTerminalRateStatsDTO> getDailyBrigadeTerminalRateStats(BlockedDashboardQueryDTO queryDTO);
304
+
305
+    /**
306
+     * 查询查堵-主管分管次数分布(用于饼图)
307
+     * 数据源:漏检统计表
308
+     * 统计字段:分管主管
309
+     * 
310
+     * @param queryDTO 查询参数
311
+     * @return 主管分管次数分布统计列表
312
+     */
313
+    List<BlockedRankingDTO> getSupervisorDistribution(BlockedDashboardQueryDTO queryDTO);
314
+
315
+    /**
316
+     * 查询查堵-主管排行榜(大队维度,前10名)
317
+     * 数据源:漏检统计表
318
+     * 数据筛选:分管主管不为空
319
+     * 排行字段:分管主管
320
+     * 排行依据:统计记录总数
321
+     * 显示行数:显示前10行
322
+     * 
323
+     * @param queryDTO 查询参数
324
+     * @return 主管排行榜列表(前10名)
325
+     */
326
+    List<BlockedRankingDTO> getBrigadeSupervisorRanking(BlockedDashboardQueryDTO queryDTO);
327
+
328
+    /**
329
+     * 查询查堵-班组排行榜(大队维度,前10名)
330
+     * 数据源:漏检统计表
331
+     * 数据筛选:分管班组长不为空
332
+     * 排行字段:分管班组长
333
+     * 排行依据:统计记录总数
334
+     * 显示行数:显示前10行
335
+     * 
336
+     * @param queryDTO 查询参数
337
+     * @return 班组排行榜列表(前10名)
338
+     */
339
+    List<BlockedRankingDTO> getBrigadeTeamLeaderRanking(BlockedDashboardQueryDTO queryDTO);
340
+
341
+    /**
342
+     * 查询查堵-人员排行榜(大队维度,前10名)
343
+     * 数据源:漏检统计表
344
+     * 数据筛选:被回查人不为空
345
+     * 排行字段:被回查人
346
+     * 排行依据:统计记录总数
347
+     * 显示行数:显示前10行
348
+     * 
349
+     * @param queryDTO 查询参数
350
+     * @return 人员排行榜列表(前10名)
351
+     */
352
+    List<BlockedRankingDTO> getBrigadeReviewedUserRanking(BlockedDashboardQueryDTO queryDTO);
353
+
354
+    /**
355
+     * 查询查堵男女比例(按大队)
356
+     * 数据源:漏检统计表
357
+     * 统计性别分布
358
+     * 
359
+     * @param queryDTO 查询参数
360
+     * @return 男女比例统计列表
361
+     */
362
+    List<BlockedGenderDistributionDTO> getGenderDistribution(BlockedDashboardQueryDTO queryDTO);
363
+
364
+    /**
365
+     * 查询查堵人员证书级别分布(按大队)
366
+     * 数据源:漏检统计表
367
+     * 统计证书级别分布
368
+     * 
369
+     * @param queryDTO 查询参数
370
+     * @return 证书级别分布统计列表
371
+     */
372
+    List<BlockedCertificateLevelDistributionDTO> getCertificateLevelDistribution(BlockedDashboardQueryDTO queryDTO);
373
+
374
+    /**
375
+     * 查询证书级别人员基数(分大队统计)
376
+     * 数据源:用户表(sys_user) + 部门表(sys_dept)
377
+     * 统计大队人员里面的人员证书级别构成
378
+     * 
379
+     * @param queryDTO 查询参数(大队ID必填)
380
+     * @return 证书级别人员基数统计列表
381
+     */
382
+    List<BlockedCertificateLevelDistributionDTO> getBrigadePersonnelCertificateBase(BlockedDashboardQueryDTO queryDTO);
383
+
384
+    /**
385
+     * 查询查堵人员开机年限分布(用于饼图)
386
+     * 数据源:漏检统计表
387
+     * 统计字段:开机年限
388
+     * 
389
+     * @param queryDTO 查询参数
390
+     * @return 开机年限分布统计列表
391
+     */
392
+    List<BlockedOperatingYearsDistributionDTO> getOperatingYearsDistribution(BlockedDashboardQueryDTO queryDTO);
243
 }
393
 }

+ 244 - 0
airport-blocked/src/main/java/com/sundot/airport/blocked/service/impl/BlockedDashboardServiceImpl.java

@@ -6,9 +6,13 @@ import com.sundot.airport.blocked.dto.BlockedBrigadeCertificateDistributionDTO;
6
 import com.sundot.airport.blocked.dto.BlockedBrigadeRateStatsDTO;
6
 import com.sundot.airport.blocked.dto.BlockedBrigadeRateStatsDTO;
7
 import com.sundot.airport.blocked.dto.BlockedBrigadeStatsDTO;
7
 import com.sundot.airport.blocked.dto.BlockedBrigadeStatsDTO;
8
 import com.sundot.airport.blocked.dto.BlockedCertificateDistributionDTO;
8
 import com.sundot.airport.blocked.dto.BlockedCertificateDistributionDTO;
9
+import com.sundot.airport.blocked.dto.BlockedCertificateLevelDistributionDTO;
9
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeLuggageStatsDTO;
10
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeLuggageStatsDTO;
10
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeRateStatsDTO;
11
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeRateStatsDTO;
11
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeStatsDTO;
12
 import com.sundot.airport.blocked.dto.BlockedDailyBrigadeStatsDTO;
13
+import com.sundot.airport.blocked.dto.BlockedDailyBrigadeTerminalLuggageStatsDTO;
14
+import com.sundot.airport.blocked.dto.BlockedDailyBrigadeTerminalRateStatsDTO;
15
+import com.sundot.airport.blocked.dto.BlockedDailyBrigadeTerminalStatsDTO;
12
 import com.sundot.airport.blocked.dto.BlockedDailyLuggageStatsDTO;
16
 import com.sundot.airport.blocked.dto.BlockedDailyLuggageStatsDTO;
13
 import com.sundot.airport.blocked.dto.BlockedDailyRateStatsDTO;
17
 import com.sundot.airport.blocked.dto.BlockedDailyRateStatsDTO;
14
 import com.sundot.airport.blocked.dto.BlockedDailyStatsDTO;
18
 import com.sundot.airport.blocked.dto.BlockedDailyStatsDTO;
@@ -16,12 +20,15 @@ import com.sundot.airport.blocked.dto.BlockedDashboardQueryDTO;
16
 import com.sundot.airport.blocked.dto.BlockedDashboardResultDTO;
20
 import com.sundot.airport.blocked.dto.BlockedDashboardResultDTO;
17
 import com.sundot.airport.blocked.dto.BlockedDifficultyDistributionDTO;
21
 import com.sundot.airport.blocked.dto.BlockedDifficultyDistributionDTO;
18
 import com.sundot.airport.blocked.dto.BlockedDiscriminationDistributionDTO;
22
 import com.sundot.airport.blocked.dto.BlockedDiscriminationDistributionDTO;
23
+import com.sundot.airport.blocked.dto.BlockedGenderDistributionDTO;
19
 import com.sundot.airport.blocked.dto.BlockedItemDistributionDTO;
24
 import com.sundot.airport.blocked.dto.BlockedItemDistributionDTO;
20
 import com.sundot.airport.blocked.dto.BlockedItemLocationDistributionDTO;
25
 import com.sundot.airport.blocked.dto.BlockedItemLocationDistributionDTO;
21
 import com.sundot.airport.blocked.dto.BlockedMissCheckReasonDistributionDTO;
26
 import com.sundot.airport.blocked.dto.BlockedMissCheckReasonDistributionDTO;
22
 import com.sundot.airport.blocked.dto.BlockedOperatingYearsDistributionDTO;
27
 import com.sundot.airport.blocked.dto.BlockedOperatingYearsDistributionDTO;
23
 import com.sundot.airport.blocked.dto.BlockedRankingDTO;
28
 import com.sundot.airport.blocked.dto.BlockedRankingDTO;
24
 import com.sundot.airport.blocked.dto.BlockedRateResultDTO;
29
 import com.sundot.airport.blocked.dto.BlockedRateResultDTO;
30
+import com.sundot.airport.blocked.dto.BlockedTerminalStatsDTO;
31
+import com.sundot.airport.blocked.dto.BlockedTimePeriodLuggageStatsDTO;
25
 import com.sundot.airport.blocked.dto.BlockedTimePeriodStatsDTO;
32
 import com.sundot.airport.blocked.dto.BlockedTimePeriodStatsDTO;
26
 import com.sundot.airport.blocked.mapper.BlockedDashboardMapper;
33
 import com.sundot.airport.blocked.mapper.BlockedDashboardMapper;
27
 import com.sundot.airport.blocked.service.IBlockedDashboardService;
34
 import com.sundot.airport.blocked.service.IBlockedDashboardService;
@@ -372,6 +379,14 @@ public class BlockedDashboardServiceImpl implements IBlockedDashboardService {
372
     @Override
379
     @Override
373
     public List<BlockedCertificateDistributionDTO> getCertificateDistribution(BlockedDashboardQueryDTO queryDTO) {
380
     public List<BlockedCertificateDistributionDTO> getCertificateDistribution(BlockedDashboardQueryDTO queryDTO) {
374
         List<BlockedCertificateDistributionDTO> resultList = blockedDashboardMapper.selectCertificateDistribution(queryDTO);
381
         List<BlockedCertificateDistributionDTO> resultList = blockedDashboardMapper.selectCertificateDistribution(queryDTO);
382
+        if (resultList != null && !resultList.isEmpty()) {
383
+            // 转换证书级别为中文
384
+            resultList.forEach(item -> {
385
+                if (item.getCertificateLevel() != null) {
386
+                    item.setCertificateLevel(convertCertificateLevel(item.getCertificateLevel()));
387
+                }
388
+            });
389
+        }
375
         return resultList != null ? resultList : Collections.emptyList();
390
         return resultList != null ? resultList : Collections.emptyList();
376
     }
391
     }
377
 
392
 
@@ -386,4 +401,233 @@ public class BlockedDashboardServiceImpl implements IBlockedDashboardService {
386
         List<BlockedBrigadeCertificateDistributionDTO> resultList = blockedDashboardMapper.selectBrigadeCertificateDistribution(queryDTO);
401
         List<BlockedBrigadeCertificateDistributionDTO> resultList = blockedDashboardMapper.selectBrigadeCertificateDistribution(queryDTO);
387
         return resultList != null ? resultList : Collections.emptyList();
402
         return resultList != null ? resultList : Collections.emptyList();
388
     }
403
     }
404
+
405
+    /**
406
+     * 查询两楼每日查堵走势(按大队)
407
+     * 数据来源:各大队每日过检行李查堵数据收集表
408
+     * 先查出来是哪个安检大队的,然后按日期统计以下四个字段:
409
+     * T1旅检查堵件数、T2旅检查堵件数、T1行检查堵件数、T2行检查堵件数
410
+     * 
411
+     * @param queryDTO 查询参数
412
+     * @return 两楼每日查堵走势统计列表
413
+     */
414
+    @Override
415
+    public List<BlockedDailyBrigadeTerminalStatsDTO> getDailyBrigadeTerminalStats(BlockedDashboardQueryDTO queryDTO) {
416
+        List<BlockedDailyBrigadeTerminalStatsDTO> resultList = blockedDashboardMapper.selectDailyBrigadeTerminalStats(queryDTO);
417
+        return resultList != null ? resultList : Collections.emptyList();
418
+    }
419
+
420
+    /**
421
+     * 查询两楼每日过检图像数(按大队)
422
+     * 数据来源:各大队每日过检行李查堵数据收集表
423
+     * 先查出来是哪个安检大队的,然后按日期统计以下四个字段:
424
+     * T2旅检过检行李数、T1旅检过检行李数、T1行检过检行李数、T2行检过检行李数
425
+     * 
426
+     * @param queryDTO 查询参数
427
+     * @return 两楼每日过检图像数统计列表
428
+     */
429
+    @Override
430
+    public List<BlockedDailyBrigadeTerminalLuggageStatsDTO> getDailyBrigadeTerminalLuggageStats(BlockedDashboardQueryDTO queryDTO) {
431
+        List<BlockedDailyBrigadeTerminalLuggageStatsDTO> resultList = blockedDashboardMapper.selectDailyBrigadeTerminalLuggageStats(queryDTO);
432
+        return resultList != null ? resultList : Collections.emptyList();
433
+    }
434
+
435
+    /**
436
+     * 查询两楼查堵数(包含行检,按大队)
437
+     * 数据来源:漏检统计表
438
+     * 先查大队数量,再查T1、T2数量
439
+     * 
440
+     * @param queryDTO 查询参数
441
+     * @return 两楼查堵数统计
442
+     */
443
+    @Override
444
+    public BlockedTerminalStatsDTO getTerminalBlockedStats(BlockedDashboardQueryDTO queryDTO) {
445
+        return blockedDashboardMapper.selectTerminalBlockedStats(queryDTO);
446
+    }
447
+
448
+    /**
449
+     * 查询查堵时间段过检行李数(按大队)
450
+     * 数据源:每日各时间段过检行李数
451
+     * 维度(横轴):时间段
452
+     * 统计值(左坐标轴):过检行李数平均值
453
+     * 统计值(右坐标轴):时段查堵件数平均值
454
+     * 
455
+     * @param queryDTO 查询参数
456
+     * @return 时间段过检行李数统计列表
457
+     */
458
+    @Override
459
+    public List<BlockedTimePeriodLuggageStatsDTO> getTimePeriodLuggageStats(BlockedDashboardQueryDTO queryDTO) {
460
+        List<BlockedTimePeriodLuggageStatsDTO> resultList = blockedDashboardMapper.selectTimePeriodLuggageStats(queryDTO);
461
+        return resultList != null ? resultList : Collections.emptyList();
462
+    }
463
+
464
+    /**
465
+     * 查询两楼每日查堵万分率(按大队)
466
+     * 数据源:各大队每日过检行李查堵数据收集表
467
+     * 按时间统计T2旅检万分率、T1旅检万分率、T1行检万分率、T2行检万分率
468
+     * 
469
+     * @param queryDTO 查询参数
470
+     * @return 两楼每日查堵万分率统计列表
471
+     */
472
+    @Override
473
+    public List<BlockedDailyBrigadeTerminalRateStatsDTO> getDailyBrigadeTerminalRateStats(BlockedDashboardQueryDTO queryDTO) {
474
+        List<BlockedDailyBrigadeTerminalRateStatsDTO> resultList = blockedDashboardMapper.selectDailyBrigadeTerminalRateStats(queryDTO);
475
+        return resultList != null ? resultList : Collections.emptyList();
476
+    }
477
+
478
+    /**
479
+     * 查询查堵-主管排行榜(大队维度,前10名)
480
+     * 数据源:漏检统计表
481
+     * 数据筛选:分管主管不为空
482
+     * 排行字段:分管主管
483
+     * 排行依据:统计记录总数
484
+     * 显示行数:显示前10行
485
+     * 
486
+     * @param queryDTO 查询参数
487
+     * @return 主管排行榜列表(前10名)
488
+     */
489
+    @Override
490
+    public List<BlockedRankingDTO> getBrigadeSupervisorRanking(BlockedDashboardQueryDTO queryDTO) {
491
+        List<BlockedRankingDTO> resultList = blockedDashboardMapper.selectBrigadeSupervisorRanking(queryDTO);
492
+        return resultList != null ? resultList : Collections.emptyList();
493
+    }
494
+
495
+    /**
496
+     * 查询查堵-班组排行榜(大队维度,前10名)
497
+     * 数据源:漏检统计表
498
+     * 数据筛选:分管班组长不为空
499
+     * 排行字段:分管班组长
500
+     * 排行依据:统计记录总数
501
+     * 显示行数:显示前10行
502
+     * 
503
+     * @param queryDTO 查询参数
504
+     * @return 班组排行榜列表(前10名)
505
+     */
506
+    @Override
507
+    public List<BlockedRankingDTO> getBrigadeTeamLeaderRanking(BlockedDashboardQueryDTO queryDTO) {
508
+        List<BlockedRankingDTO> resultList = blockedDashboardMapper.selectBrigadeTeamLeaderRanking(queryDTO);
509
+        return resultList != null ? resultList : Collections.emptyList();
510
+    }
511
+
512
+    /**
513
+     * 查询查堵-人员排行榜(大队维度,前10名)
514
+     * 数据源:漏检统计表
515
+     * 数据筛选:被回查人不为空
516
+     * 排行字段:被回查人
517
+     * 排行依据:统计记录总数
518
+     * 显示行数:显示前10行
519
+     * 
520
+     * @param queryDTO 查询参数
521
+     * @return 人员排行榜列表(前10名)
522
+     */
523
+    @Override
524
+    public List<BlockedRankingDTO> getBrigadeReviewedUserRanking(BlockedDashboardQueryDTO queryDTO) {
525
+        List<BlockedRankingDTO> resultList = blockedDashboardMapper.selectBrigadeReviewedUserRanking(queryDTO);
526
+        return resultList != null ? resultList : Collections.emptyList();
527
+    }
528
+
529
+    /**
530
+     * 查询查堵男女比例(按大队)
531
+     * 数据源:漏检统计表
532
+     * 统计性别分布
533
+     * 
534
+     * @param queryDTO 查询参数
535
+     * @return 男女比例统计列表
536
+     */
537
+    @Override
538
+    public List<BlockedGenderDistributionDTO> getGenderDistribution(BlockedDashboardQueryDTO queryDTO) {
539
+        List<BlockedGenderDistributionDTO> resultList = blockedDashboardMapper.selectGenderDistribution(queryDTO);
540
+        return resultList != null ? resultList : Collections.emptyList();
541
+    }
542
+
543
+    /**
544
+     * 查询查堵人员证书级别分布(按大队)
545
+     * 数据源:漏检统计表
546
+     * 统计证书级别分布
547
+     * 
548
+     * @param queryDTO 查询参数
549
+     * @return 证书级别分布统计列表
550
+     */
551
+    @Override
552
+    public List<BlockedCertificateLevelDistributionDTO> getCertificateLevelDistribution(BlockedDashboardQueryDTO queryDTO) {
553
+        List<BlockedCertificateLevelDistributionDTO> resultList = blockedDashboardMapper.selectCertificateLevelDistribution(queryDTO);
554
+        return resultList != null ? resultList : Collections.emptyList();
555
+    }
556
+
557
+    /**
558
+     * 查询证书级别人员基数(分大队统计)
559
+     * 数据源:用户表(sys_user) + 部门表(sys_dept)
560
+     * 统计大队人员里面的人员证书级别构成
561
+     * 
562
+     * @param queryDTO 查询参数(大队ID必填)
563
+     * @return 证书级别人员基数统计列表
564
+     */
565
+    @Override
566
+    public List<BlockedCertificateLevelDistributionDTO> getBrigadePersonnelCertificateBase(BlockedDashboardQueryDTO queryDTO) {
567
+        List<BlockedCertificateLevelDistributionDTO> resultList = blockedDashboardMapper.selectBrigadePersonnelCertificateBase(queryDTO);
568
+        if (resultList != null && !resultList.isEmpty()) {
569
+            // 转换证书级别为中文
570
+            resultList.forEach(item -> {
571
+                if (item.getCertificateLevel() != null) {
572
+                    item.setCertificateLevel(convertCertificateLevel(item.getCertificateLevel()));
573
+                }
574
+            });
575
+        }
576
+        return resultList != null ? resultList : Collections.emptyList();
577
+    }
578
+
579
+    /**
580
+     * 查询查堵-主管分管次数分布(用于饼图)
581
+     * 数据源:漏检统计表
582
+     * 统计字段:分管主管
583
+     * 
584
+     * @param queryDTO 查询参数
585
+     * @return 主管分管次数分布统计列表
586
+     */
587
+    @Override
588
+    public List<BlockedRankingDTO> getSupervisorDistribution(BlockedDashboardQueryDTO queryDTO) {
589
+        List<BlockedRankingDTO> resultList = blockedDashboardMapper.selectSupervisorDistribution(queryDTO);
590
+        return resultList != null ? resultList : Collections.emptyList();
591
+    }
592
+
593
+    /**
594
+     * 查询查堵人员开机年限分布(用于饼图)
595
+     * 数据源:漏检统计表
596
+     * 统计字段:开机年限
597
+     * 
598
+     * @param queryDTO 查询参数
599
+     * @return 开机年限分布统计列表
600
+     */
601
+    @Override
602
+    public List<BlockedOperatingYearsDistributionDTO> getOperatingYearsDistribution(BlockedDashboardQueryDTO queryDTO) {
603
+        List<BlockedOperatingYearsDistributionDTO> resultList = blockedDashboardMapper.selectOperatingYearsDistribution(queryDTO);
604
+        return resultList != null ? resultList : Collections.emptyList();
605
+    }
606
+
607
+    /**
608
+     * 转换证书级别代码为中文
609
+     * LEVEL_FIVE -> 初级
610
+     * LEVEL_FOUR -> 中级
611
+     * LEVEL_ONE/LEVEL_TWO/LEVEL_THREE -> 高级
612
+     * 
613
+     * @param levelCode 级别代码
614
+     * @return 中文级别名称
615
+     */
616
+    private String convertCertificateLevel(String levelCode) {
617
+        if (levelCode == null) {
618
+            return "";
619
+        }
620
+        switch (levelCode) {
621
+            case "LEVEL_FIVE":
622
+                return "初级";
623
+            case "LEVEL_FOUR":
624
+                return "中级";
625
+            case "LEVEL_ONE":
626
+            case "LEVEL_TWO":
627
+            case "LEVEL_THREE":
628
+                return "高级";
629
+            default:
630
+                return levelCode;
631
+        }
632
+    }
389
 }
633
 }

+ 273 - 0
airport-blocked/src/main/resources/mapper/blocked/BlockedDashboardMapper.xml

@@ -474,6 +474,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
474
             AND review_date &gt;= #{startTime}
474
             AND review_date &gt;= #{startTime}
475
             AND review_date &lt;= #{endTime}
475
             AND review_date &lt;= #{endTime}
476
         </if>
476
         </if>
477
+        <if test="brigadeId != null">
478
+            AND brigade_id = #{brigadeId}
479
+        </if>
477
         GROUP BY difficulty_level
480
         GROUP BY difficulty_level
478
         ORDER BY count DESC
481
         ORDER BY count DESC
479
     </select>
482
     </select>
@@ -530,4 +533,274 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
530
         ORDER BY totalCount DESC
533
         ORDER BY totalCount DESC
531
     </select>
534
     </select>
532
 
535
 
536
+    <!-- 查询两楼每日查堵走势(按大队) -->
537
+    <select id="selectDailyBrigadeTerminalStats" resultType="com.sundot.airport.blocked.dto.BlockedDailyBrigadeTerminalStatsDTO">
538
+        SELECT 
539
+            stat_date as statDate,
540
+            COALESCE(SUM(t1_travel_blocked_count), 0) as t1TravelBlockedCount,
541
+            COALESCE(SUM(t2_travel_blocked_count), 0) as t2TravelBlockedCount,
542
+            COALESCE(SUM(t1_walk_blocked_count), 0) as t1WalkBlockedCount,
543
+            COALESCE(SUM(t2_walk_blocked_count), 0) as t2WalkBlockedCount
544
+        FROM blocked_luggage_statistics_daily
545
+        WHERE del_flag = '0'
546
+        <if test="brigadeId != null">
547
+            AND brigade_id = #{brigadeId}
548
+        </if>
549
+        <if test="startTime != null and endTime != null">
550
+            AND stat_date &gt;= #{startTime}
551
+            AND stat_date &lt;= #{endTime}
552
+        </if>
553
+        GROUP BY stat_date
554
+        ORDER BY stat_date ASC
555
+    </select>
556
+
557
+    <!-- 查询两楼每日过检图像数(按大队) -->
558
+    <select id="selectDailyBrigadeTerminalLuggageStats" resultType="com.sundot.airport.blocked.dto.BlockedDailyBrigadeTerminalLuggageStatsDTO">
559
+        SELECT 
560
+            stat_date as statDate,
561
+            COALESCE(SUM(t1_travel_luggage_count), 0) as t1TravelBagCount,
562
+            COALESCE(SUM(t2_travel_luggage_count), 0) as t2TravelBagCount,
563
+            COALESCE(SUM(t1_walk_luggage_count), 0) as t1WalkBagCount,
564
+            COALESCE(SUM(t2_walk_luggage_count), 0) as t2WalkBagCount
565
+        FROM blocked_luggage_statistics_daily
566
+        WHERE del_flag = '0'
567
+        <if test="brigadeId != null">
568
+            AND brigade_id = #{brigadeId}
569
+        </if>
570
+        <if test="startTime != null and endTime != null">
571
+            AND stat_date &gt;= #{startTime}
572
+            AND stat_date &lt;= #{endTime}
573
+        </if>
574
+        GROUP BY stat_date
575
+        ORDER BY stat_date ASC
576
+    </select>
577
+
578
+    <!-- 查询两楼查堵数(包含行检,按大队) -->
579
+    <select id="selectTerminalBlockedStats" resultType="com.sundot.airport.blocked.dto.BlockedTerminalStatsDTO">
580
+        SELECT 
581
+            COUNT(1) as totalBlockedCount,
582
+            COALESCE(SUM(CASE WHEN terminal_id = 1 THEN 1 ELSE 0 END), 0) as t1BlockedCount,
583
+            COALESCE(SUM(CASE WHEN terminal_id = 2 THEN 1 ELSE 0 END), 0) as t2BlockedCount
584
+        FROM blocked_miss_check_statistics
585
+        WHERE del_flag = '0'
586
+        <if test="brigadeId != null">
587
+            AND brigade_id = #{brigadeId}
588
+        </if>
589
+        <if test="startTime != null and endTime != null">
590
+            AND review_date &gt;= #{startTime}
591
+            AND review_date &lt;= #{endTime}
592
+        </if>
593
+    </select>
594
+
595
+    <!-- 查询查堵时间段过检行李数(按大队) -->
596
+    <select id="selectTimePeriodLuggageStats" resultType="com.sundot.airport.blocked.dto.BlockedTimePeriodLuggageStatsDTO">
597
+        SELECT 
598
+            time_period as timePeriod,
599
+            ROUND(AVG(total_luggage_count), 2) as avgLuggageCount,
600
+            ROUND(AVG(total_blocked_count), 2) as avgBlockedCount
601
+        FROM blocked_luggage_piece_daily
602
+        WHERE del_flag = '0'
603
+        <if test="brigadeId != null">
604
+            AND brigade_id = #{brigadeId}
605
+        </if>
606
+        <if test="startTime != null and endTime != null">
607
+            AND stat_date &gt;= #{startTime}
608
+            AND stat_date &lt;= #{endTime}
609
+        </if>
610
+        GROUP BY time_period
611
+        ORDER BY time_period ASC
612
+    </select>
613
+
614
+    <!-- 查询两楼每日查堵万分率(按大队) -->
615
+    <select id="selectDailyBrigadeTerminalRateStats" resultType="com.sundot.airport.blocked.dto.BlockedDailyBrigadeTerminalRateStatsDTO">
616
+        SELECT 
617
+            stat_date as statDate,
618
+            COALESCE(AVG(t1_travel_block_rate), 0) as t1TravelBlockRate,
619
+            COALESCE(AVG(t2_travel_block_rate), 0) as t2TravelBlockRate,
620
+            COALESCE(AVG(t1_walk_block_rate), 0) as t1WalkBlockRate,
621
+            COALESCE(AVG(t2_walk_block_rate), 0) as t2WalkBlockRate
622
+        FROM blocked_luggage_statistics_daily
623
+        WHERE del_flag = '0'
624
+        <if test="brigadeId != null">
625
+            AND brigade_id = #{brigadeId}
626
+        </if>
627
+        <if test="startTime != null and endTime != null">
628
+            AND stat_date &gt;= #{startTime}
629
+            AND stat_date &lt;= #{endTime}
630
+        </if>
631
+        GROUP BY stat_date
632
+        ORDER BY stat_date ASC
633
+    </select>
634
+
635
+    <!-- 查询查堵-主管排行榜(大队维度,前10名) -->
636
+    <select id="selectBrigadeSupervisorRanking" resultType="com.sundot.airport.blocked.dto.BlockedRankingDTO">
637
+        SELECT 
638
+            supervisor_name as name,
639
+            supervisor_id as id,
640
+            COUNT(1) as totalCount
641
+        FROM blocked_miss_check_statistics
642
+        WHERE del_flag = '0'
643
+        AND supervisor_name IS NOT NULL
644
+        AND supervisor_name != ''
645
+        <if test="brigadeId != null">
646
+            AND brigade_id = #{brigadeId}
647
+        </if>
648
+        <if test="startTime != null and endTime != null">
649
+            AND review_date &gt;= #{startTime}
650
+            AND review_date &lt;= #{endTime}
651
+        </if>
652
+        GROUP BY supervisor_id, supervisor_name
653
+        ORDER BY totalCount DESC
654
+        LIMIT 10
655
+    </select>
656
+
657
+    <!-- 查询查堵-班组排行榜(大队维度,前10名) -->
658
+    <select id="selectBrigadeTeamLeaderRanking" resultType="com.sundot.airport.blocked.dto.BlockedRankingDTO">
659
+        SELECT 
660
+            team_leader_name as name,
661
+            team_leader_id as id,
662
+            COUNT(1) as totalCount
663
+        FROM blocked_miss_check_statistics
664
+        WHERE del_flag = '0'
665
+        AND team_leader_name IS NOT NULL
666
+        AND team_leader_name != ''
667
+        <if test="brigadeId != null">
668
+            AND brigade_id = #{brigadeId}
669
+        </if>
670
+        <if test="startTime != null and endTime != null">
671
+            AND review_date &gt;= #{startTime}
672
+            AND review_date &lt;= #{endTime}
673
+        </if>
674
+        GROUP BY team_leader_id, team_leader_name
675
+        ORDER BY totalCount DESC
676
+        LIMIT 10
677
+    </select>
678
+
679
+    <!-- 查询查堵-人员排行榜(大队维度,前10名) -->
680
+    <select id="selectBrigadeReviewedUserRanking" resultType="com.sundot.airport.blocked.dto.BlockedRankingDTO">
681
+        SELECT 
682
+            reviewed_user_name as name,
683
+            reviewed_user_id as id,
684
+            COUNT(1) as totalCount
685
+        FROM blocked_miss_check_statistics
686
+        WHERE del_flag = '0'
687
+        AND reviewed_user_name IS NOT NULL
688
+        AND reviewed_user_name != ''
689
+        <if test="brigadeId != null">
690
+            AND brigade_id = #{brigadeId}
691
+        </if>
692
+        <if test="startTime != null and endTime != null">
693
+            AND review_date &gt;= #{startTime}
694
+            AND review_date &lt;= #{endTime}
695
+        </if>
696
+        GROUP BY reviewed_user_id, reviewed_user_name
697
+        ORDER BY totalCount DESC
698
+        LIMIT 10
699
+    </select>
700
+
701
+    <!-- 查询查堵男女比例(按大队) -->
702
+    <select id="selectGenderDistribution" resultType="com.sundot.airport.blocked.dto.BlockedGenderDistributionDTO">
703
+        SELECT 
704
+            gender as gender,
705
+            COUNT(1) as count,
706
+            ROUND(COUNT(1) * 100.0 / SUM(COUNT(1)) OVER(), 2) as percentage
707
+        FROM blocked_miss_check_statistics
708
+        WHERE del_flag = '0'
709
+        AND gender IS NOT NULL
710
+        AND gender != ''
711
+        <if test="brigadeId != null">
712
+            AND brigade_id = #{brigadeId}
713
+        </if>
714
+        <if test="startTime != null and endTime != null">
715
+            AND review_date &gt;= #{startTime}
716
+            AND review_date &lt;= #{endTime}
717
+        </if>
718
+        GROUP BY gender
719
+        ORDER BY count DESC
720
+    </select>
721
+
722
+    <!-- 查询查堵人员证书级别分布(按大队) -->
723
+    <select id="selectCertificateLevelDistribution" resultType="com.sundot.airport.blocked.dto.BlockedCertificateLevelDistributionDTO">
724
+        SELECT 
725
+            certificate_level as certificateLevel,
726
+            COUNT(1) as count,
727
+            ROUND(COUNT(1) * 100.0 / SUM(COUNT(1)) OVER(), 2) as percentage
728
+        FROM blocked_miss_check_statistics
729
+        WHERE del_flag = '0'
730
+        AND certificate_level IS NOT NULL
731
+        AND certificate_level != ''
732
+        <if test="brigadeId != null">
733
+            AND brigade_id = #{brigadeId}
734
+        </if>
735
+        <if test="startTime != null and endTime != null">
736
+            AND review_date &gt;= #{startTime}
737
+            AND review_date &lt;= #{endTime}
738
+        </if>
739
+        GROUP BY certificate_level
740
+        ORDER BY count DESC
741
+    </select>
742
+
743
+    <!-- 查询证书级别人员基数(分大队统计) -->
744
+    <select id="selectBrigadePersonnelCertificateBase" resultType="com.sundot.airport.blocked.dto.BlockedCertificateLevelDistributionDTO">
745
+        SELECT 
746
+            u.qualification_level as certificateLevel,
747
+            COUNT(DISTINCT u.user_id) as count,
748
+            ROUND(COUNT(DISTINCT u.user_id) * 100.0 / SUM(COUNT(DISTINCT u.user_id)) OVER(), 2) as percentage
749
+        FROM sys_user u
750
+        INNER JOIN sys_dept d ON u.dept_id = d.dept_id
751
+        WHERE u.del_flag = '0'
752
+        AND u.status = '0'
753
+        AND u.qualification_level IS NOT NULL
754
+        AND u.qualification_level != ''
755
+        AND d.dept_type = 'BRIGADE'
756
+        <if test="brigadeId != null">
757
+            AND d.dept_id = #{brigadeId}
758
+        </if>
759
+        GROUP BY u.qualification_level
760
+        ORDER BY count DESC
761
+    </select>
762
+
763
+    <!-- 查询查堵-主管分管次数分布(用于饼图) -->
764
+    <select id="selectSupervisorDistribution" resultType="com.sundot.airport.blocked.dto.BlockedRankingDTO">
765
+        SELECT 
766
+            supervisor_name as name,
767
+            supervisor_id as id,
768
+            COUNT(1) as totalCount,
769
+            ROUND(COUNT(1) * 100.0 / SUM(COUNT(1)) OVER(), 2) as percentage
770
+        FROM blocked_miss_check_statistics
771
+        WHERE del_flag = '0'
772
+        AND supervisor_name IS NOT NULL
773
+        AND supervisor_name != ''
774
+        <if test="brigadeId != null">
775
+            AND brigade_id = #{brigadeId}
776
+        </if>
777
+        <if test="startTime != null and endTime != null">
778
+            AND review_date &gt;= #{startTime}
779
+            AND review_date &lt;= #{endTime}
780
+        </if>
781
+        GROUP BY supervisor_id, supervisor_name
782
+        ORDER BY totalCount DESC
783
+    </select>
784
+
785
+    <!-- 查询查堵人员开机年限分布(用于饼图) -->
786
+    <select id="selectOperatingYearsDistribution" resultType="com.sundot.airport.blocked.dto.BlockedOperatingYearsDistributionDTO">
787
+        SELECT 
788
+            machine_operating_years as operatingYears,
789
+            COUNT(1) as count,
790
+            ROUND(COUNT(1) * 100.0 / SUM(COUNT(1)) OVER(), 2) as percentage
791
+        FROM blocked_miss_check_statistics
792
+        WHERE del_flag = '0'
793
+        AND machine_operating_years IS NOT NULL
794
+        AND machine_operating_years != ''
795
+        <if test="brigadeId != null">
796
+            AND brigade_id = #{brigadeId}
797
+        </if>
798
+        <if test="startTime != null and endTime != null">
799
+            AND review_date &gt;= #{startTime}
800
+            AND review_date &lt;= #{endTime}
801
+        </if>
802
+        GROUP BY machine_operating_years
803
+        ORDER BY count DESC
804
+    </select>
805
+
533
 </mapper>
806
 </mapper>