ソースを参照

异常查获数据接口【/abnormal-seizure-data】和【/abnormal-seizure-data-top3】

chenshudong 3 日 前
コミット
48f5562ddb

+ 2 - 0
airport-item/src/main/java/com/sundot/airport/item/mapper/SeizureReportMapper.java

@@ -441,4 +441,6 @@ public interface SeizureReportMapper {
441
     public List<ItemLargeScreenHomePageSeizureReportSqlDto> homePageSeizureReport(BaseLargeScreenQueryParamDto dto);
441
     public List<ItemLargeScreenHomePageSeizureReportSqlDto> homePageSeizureReport(BaseLargeScreenQueryParamDto dto);
442
 
442
 
443
     List<ItemLargeScreenHomePageSeizureReportSqlDto> homePageSeizureReportBrigadeId(BaseLargeScreenQueryParamDto dto);
443
     List<ItemLargeScreenHomePageSeizureReportSqlDto> homePageSeizureReportBrigadeId(BaseLargeScreenQueryParamDto dto);
444
+
445
+    List<ItemLargeScreenHomePageSeizureReportSqlDto> homePageSeizureReportDepartmentId(BaseLargeScreenQueryParamDto dto);
444
 }
446
 }

+ 50 - 0
airport-item/src/main/java/com/sundot/airport/item/service/SeizureDistributionService.java

@@ -256,11 +256,14 @@ public class SeizureDistributionService {
256
 
256
 
257
         // 获取该站点下的所有大队
257
         // 获取该站点下的所有大队
258
         List<SysDept> brigades = getBrigadesByStation(dto.getInspectStationId());
258
         List<SysDept> brigades = getBrigadesByStation(dto.getInspectStationId());
259
+        // 获取该站点下的所有科室
260
+        List<SysDept> departments = getDepartmentsByStation(dto.getInspectStationId());
259
 
261
 
260
         // 构建所有分组:先添加站级,再添加大队级
262
         // 构建所有分组:先添加站级,再添加大队级
261
         List<SysDept> allGroups = new ArrayList<>();
263
         List<SysDept> allGroups = new ArrayList<>();
262
         allGroups.add(stationDept); // 添加站级
264
         allGroups.add(stationDept); // 添加站级
263
         allGroups.addAll(brigades); // 添加大队级
265
         allGroups.addAll(brigades); // 添加大队级
266
+        allGroups.addAll(departments); // 添加科室级
264
 
267
 
265
         // 获取查获数量数据
268
         // 获取查获数量数据
266
         List<SeizureLargeScreenHomePageItemDto> seizureReportList = getSeizureDataForStation(dto.getDeptId(), dto.getStartDate(), dto.getEndDate());
269
         List<SeizureLargeScreenHomePageItemDto> seizureReportList = getSeizureDataForStation(dto.getDeptId(), dto.getStartDate(), dto.getEndDate());
@@ -288,6 +291,13 @@ public class SeizureDistributionService {
288
             groupedQuantities.put(dept.getDeptName(), deptQuantities);
291
             groupedQuantities.put(dept.getDeptName(), deptQuantities);
289
         }
292
         }
290
 
293
 
294
+        // 然后处理科室级数据
295
+        for (SysDept dept : departments) {
296
+            List<SeizureLargeScreenHomePageItemDto> departmentSeizureReportList = getSeizureDataForDepartment(dept.getDeptId(), dto.getStartDate(), dto.getEndDate());
297
+            List<BigDecimal> deptQuantities = departmentSeizureReportList.stream().map(SeizureLargeScreenHomePageItemDto::getQuantity).filter(Objects::nonNull).collect(Collectors.toList());
298
+            groupedQuantities.put(dept.getDeptName(), deptQuantities);
299
+        }
300
+
291
         // 为每个分组计算箱线图数据
301
         // 为每个分组计算箱线图数据
292
         List<GroupedBoxPlotDataDto> result = new ArrayList<>();
302
         List<GroupedBoxPlotDataDto> result = new ArrayList<>();
293
 
303
 
@@ -420,4 +430,44 @@ public class SeizureDistributionService {
420
             return lowerValue.add(upperValue.subtract(lowerValue).multiply(BigDecimal.valueOf(fraction)));
430
             return lowerValue.add(upperValue.subtract(lowerValue).multiply(BigDecimal.valueOf(fraction)));
421
         }
431
         }
422
     }
432
     }
433
+
434
+    /**
435
+     * 获取指定站点下的所有科室
436
+     *
437
+     * @param stationDeptId 站点部门ID
438
+     * @return 大队列表
439
+     */
440
+    private List<SysDept> getDepartmentsByStation(Long stationDeptId) {
441
+        if (stationDeptId == null) {
442
+            return Collections.emptyList();
443
+        }
444
+
445
+        // 查询站点下的所有子部门
446
+        List<SysDept> childrenDepts = sysDeptService.selectChildrenDeptById(stationDeptId);
447
+
448
+        // 过滤出大队级别的部门
449
+        return childrenDepts.stream()
450
+                .filter(dept -> DeptTypeEnum.MANAGER.getCode().equals(dept.getDeptType()))
451
+                .collect(Collectors.toList());
452
+    }
453
+
454
+    /**
455
+     * 获取指定科室的查获数据(科室级别)
456
+     *
457
+     * @param departmentId 科室ID
458
+     * @param startDate 开始日期
459
+     * @param endDate   结束日期
460
+     * @return 科室级别查获数据列表
461
+     */
462
+    private List<SeizureLargeScreenHomePageItemDto> getSeizureDataForDepartment(Long departmentId, Date startDate, Date endDate) {
463
+        if (departmentId == null) {
464
+            return Collections.emptyList();
465
+        }
466
+        // 创建查询参数
467
+        BaseLargeScreenQueryParamDto dto = new BaseLargeScreenQueryParamDto();
468
+        dto.setInspectDepartmentId(departmentId);
469
+        dto.setStartDate(startDate);
470
+        dto.setEndDate(DateUtils.addDays(endDate, 1));
471
+        return seizureReportService.getSeizureLargeScreenHomePinspectBrigadeIdList(dto);
472
+    }
423
 }
473
 }

+ 54 - 0
airport-item/src/main/java/com/sundot/airport/item/service/impl/ItemLargeScreenServiceImpl.java

@@ -663,6 +663,25 @@ public class ItemLargeScreenServiceImpl implements ItemLargeScreenService {
663
                     upperBound = boxPlotData.getUpperBound();
663
                     upperBound = boxPlotData.getUpperBound();
664
                 }
664
                 }
665
             }
665
             }
666
+        } else if (dto.getInspectDepartmentId() != null) {
667
+            // 根据 id 获取部门信息
668
+            SysDept dept = sysDeptService.selectDeptById(dto.getInspectDepartmentId());
669
+            if (Objects.isNull(dept)) {
670
+                return Collections.emptyList();
671
+            }
672
+
673
+            // 查找匹配的分组数据
674
+            Optional<GroupedBoxPlotDataDto> matchedGroup = boxPlotDataList.stream()
675
+                    .filter(grouped -> Objects.equals(grouped.getGroupName(), dept.getDeptName()))
676
+                    .findFirst();
677
+
678
+            if (matchedGroup.isPresent()) {
679
+                BoxPlotDataDto boxPlotData = matchedGroup.get().getBoxPlotData();
680
+                if (Objects.nonNull(boxPlotData)) {
681
+                    lowerBound = boxPlotData.getLowerBound();
682
+                    upperBound = boxPlotData.getUpperBound();
683
+                }
684
+            }
666
         } else {
685
         } else {
667
             GroupedBoxPlotDataDto firstGroup = boxPlotDataList.get(0);
686
             GroupedBoxPlotDataDto firstGroup = boxPlotDataList.get(0);
668
             if (Objects.nonNull(firstGroup) && Objects.nonNull(firstGroup.getBoxPlotData())) {
687
             if (Objects.nonNull(firstGroup) && Objects.nonNull(firstGroup.getBoxPlotData())) {
@@ -681,6 +700,10 @@ public class ItemLargeScreenServiceImpl implements ItemLargeScreenService {
681
             // 有大队 ID,查询大队数据
700
             // 有大队 ID,查询大队数据
682
             seizureReportList = seizureReportMapper.homePageSeizureReportBrigadeId(dto);
701
             seizureReportList = seizureReportMapper.homePageSeizureReportBrigadeId(dto);
683
             userInfoList = sysUserService.homePageUserInfoByBrigadeId(dto.getInspectBrigadeId());
702
             userInfoList = sysUserService.homePageUserInfoByBrigadeId(dto.getInspectBrigadeId());
703
+        } else if (dto.getInspectDepartmentId() != null) {
704
+            // 有科室 ID,查询科室数据
705
+            seizureReportList = seizureReportMapper.homePageSeizureReportDepartmentId(dto);
706
+            userInfoList = sysUserService.homePageUserInfoByDepartmentId(dto.getInspectDepartmentId());
684
         } else {
707
         } else {
685
             // 无大队 ID,查询全站数据
708
             // 无大队 ID,查询全站数据
686
             seizureReportList = seizureReportMapper.homePageSeizureReport(dto);
709
             seizureReportList = seizureReportMapper.homePageSeizureReport(dto);
@@ -704,6 +727,10 @@ public class ItemLargeScreenServiceImpl implements ItemLargeScreenService {
704
         for (LargeScreenHomePageUserInfoSqlDto userInfo : userInfoList) {
727
         for (LargeScreenHomePageUserInfoSqlDto userInfo : userInfoList) {
705
             BigDecimal totalQuantity = userSeizureMap.getOrDefault(userInfo.getUserId(), BigDecimal.ZERO);
728
             BigDecimal totalQuantity = userSeizureMap.getOrDefault(userInfo.getUserId(), BigDecimal.ZERO);
706
 
729
 
730
+            if (lowerBound == null || upperBound == null) {
731
+                continue;
732
+            }
733
+
707
             // 判断是否为异常值
734
             // 判断是否为异常值
708
             if (totalQuantity.compareTo(lowerBound) < 0 || totalQuantity.compareTo(upperBound) > 0) {
735
             if (totalQuantity.compareTo(lowerBound) < 0 || totalQuantity.compareTo(upperBound) > 0) {
709
                 ItemAbnormalSeizureDto abnormalDto = new ItemAbnormalSeizureDto();
736
                 ItemAbnormalSeizureDto abnormalDto = new ItemAbnormalSeizureDto();
@@ -759,6 +786,25 @@ public class ItemLargeScreenServiceImpl implements ItemLargeScreenService {
759
                     upperBound = boxPlotData.getUpperBound();
786
                     upperBound = boxPlotData.getUpperBound();
760
                 }
787
                 }
761
             }
788
             }
789
+        } else if (dto.getInspectDepartmentId() != null) {
790
+            // 根据 id 获取部门信息
791
+            SysDept dept = sysDeptService.selectDeptById(dto.getInspectDepartmentId());
792
+            if (Objects.isNull(dept)) {
793
+                return result;
794
+            }
795
+
796
+            // 查找匹配的分组数据
797
+            Optional<GroupedBoxPlotDataDto> matchedGroup = boxPlotDataList.stream()
798
+                    .filter(grouped -> Objects.equals(grouped.getGroupName(), dept.getDeptName()))
799
+                    .findFirst();
800
+
801
+            if (matchedGroup.isPresent()) {
802
+                BoxPlotDataDto boxPlotData = matchedGroup.get().getBoxPlotData();
803
+                if (Objects.nonNull(boxPlotData)) {
804
+                    lowerBound = boxPlotData.getLowerBound();
805
+                    upperBound = boxPlotData.getUpperBound();
806
+                }
807
+            }
762
         } else {
808
         } else {
763
             GroupedBoxPlotDataDto firstGroup = boxPlotDataList.get(0);
809
             GroupedBoxPlotDataDto firstGroup = boxPlotDataList.get(0);
764
             if (Objects.nonNull(firstGroup) && Objects.nonNull(firstGroup.getBoxPlotData())) {
810
             if (Objects.nonNull(firstGroup) && Objects.nonNull(firstGroup.getBoxPlotData())) {
@@ -776,6 +822,10 @@ public class ItemLargeScreenServiceImpl implements ItemLargeScreenService {
776
             // 有大队 ID,查询大队数据
822
             // 有大队 ID,查询大队数据
777
             seizureReportList = seizureReportMapper.homePageSeizureReportBrigadeId(dto);
823
             seizureReportList = seizureReportMapper.homePageSeizureReportBrigadeId(dto);
778
             userInfoList = sysUserService.homePageUserInfoByBrigadeId(dto.getInspectBrigadeId());
824
             userInfoList = sysUserService.homePageUserInfoByBrigadeId(dto.getInspectBrigadeId());
825
+        } else if (dto.getInspectDepartmentId() != null) {
826
+            // 有科室 ID,查询科室数据
827
+            seizureReportList = seizureReportMapper.homePageSeizureReportDepartmentId(dto);
828
+            userInfoList = sysUserService.homePageUserInfoByDepartmentId(dto.getInspectDepartmentId());
779
         } else {
829
         } else {
780
             // 无大队 ID,查询全站数据
830
             // 无大队 ID,查询全站数据
781
             seizureReportList = seizureReportMapper.homePageSeizureReport(dto);
831
             seizureReportList = seizureReportMapper.homePageSeizureReport(dto);
@@ -800,6 +850,10 @@ public class ItemLargeScreenServiceImpl implements ItemLargeScreenService {
800
         for (LargeScreenHomePageUserInfoSqlDto userInfo : userInfoList) {
850
         for (LargeScreenHomePageUserInfoSqlDto userInfo : userInfoList) {
801
             BigDecimal totalQuantity = userSeizureMap.getOrDefault(userInfo.getUserId(), BigDecimal.ZERO);
851
             BigDecimal totalQuantity = userSeizureMap.getOrDefault(userInfo.getUserId(), BigDecimal.ZERO);
802
 
852
 
853
+            if (lowerBound == null || upperBound == null) {
854
+                continue;
855
+            }
856
+
803
             // 判断是否为异常值
857
             // 判断是否为异常值
804
             if (totalQuantity.compareTo(upperBound) > 0) {
858
             if (totalQuantity.compareTo(upperBound) > 0) {
805
                 // 显著高于
859
                 // 显著高于

+ 17 - 0
airport-item/src/main/resources/mapper/item/SeizureReportMapper.xml

@@ -790,4 +790,21 @@
790
             and isr.inspect_brigade_id = #{inspectBrigadeId}
790
             and isr.inspect_brigade_id = #{inspectBrigadeId}
791
         </if>
791
         </if>
792
     </select>
792
     </select>
793
+
794
+    <select id="homePageSeizureReportDepartmentId"
795
+            resultType="com.sundot.airport.item.domain.ItemLargeScreenHomePageSeizureReportSqlDto">
796
+        select isr.inspect_user_id userId,
797
+        isr.inspect_user_name userName,
798
+        isi.quantity quantity
799
+        from item_seizure_record isr
800
+        left join item_seizure_items isi on isr.id = isi.record_id
801
+        where 1 = 1
802
+        and isr.process_status = 3
803
+        <if test="startDate != null and endDate != null">
804
+            AND isr.create_time BETWEEN #{startDate} AND #{endDate}
805
+        </if>
806
+        <if test="inspectDepartmentId != null">
807
+            and isr.inspect_department_id = #{inspectDepartmentId}
808
+        </if>
809
+    </select>
793
 </mapper>
810
 </mapper>

+ 8 - 0
airport-system/src/main/java/com/sundot/airport/system/mapper/SysUserMapper.java

@@ -246,4 +246,12 @@ public interface SysUserMapper {
246
      * @return 用户信息列表
246
      * @return 用户信息列表
247
      */
247
      */
248
     public List<LargeScreenHomePageUserInfoSqlDto> homePageUserInfoByBrigadeId(@Param("brigadeId") Long brigadeId);
248
     public List<LargeScreenHomePageUserInfoSqlDto> homePageUserInfoByBrigadeId(@Param("brigadeId") Long brigadeId);
249
+
250
+    /**
251
+     * 首页 - 用户信息(按科室 ID 筛选)
252
+     *
253
+     * @param departmentId 科室 ID
254
+     * @return 用户信息列表
255
+     */
256
+    public List<LargeScreenHomePageUserInfoSqlDto> homePageUserInfoByDepartmentId(@Param("departmentId") Long departmentId);
249
 }
257
 }

+ 8 - 0
airport-system/src/main/java/com/sundot/airport/system/service/ISysUserService.java

@@ -336,4 +336,12 @@ public interface ISysUserService {
336
      * @return 用户信息列表
336
      * @return 用户信息列表
337
      */
337
      */
338
     public List<LargeScreenHomePageUserInfoSqlDto> homePageUserInfoByBrigadeId(Long brigadeId);
338
     public List<LargeScreenHomePageUserInfoSqlDto> homePageUserInfoByBrigadeId(Long brigadeId);
339
+
340
+    /**
341
+     * 首页 - 用户信息(按科室 ID 筛选)
342
+     *
343
+     * @param departmentId 科室 ID
344
+     * @return 用户信息列表
345
+     */
346
+    public List<LargeScreenHomePageUserInfoSqlDto> homePageUserInfoByDepartmentId(Long departmentId);
339
 }
347
 }

+ 5 - 0
airport-system/src/main/java/com/sundot/airport/system/service/impl/SysUserServiceImpl.java

@@ -1202,4 +1202,9 @@ public class SysUserServiceImpl implements ISysUserService {
1202
     public List<LargeScreenHomePageUserInfoSqlDto> homePageUserInfoByBrigadeId(Long brigadeId) {
1202
     public List<LargeScreenHomePageUserInfoSqlDto> homePageUserInfoByBrigadeId(Long brigadeId) {
1203
         return userMapper.homePageUserInfoByBrigadeId(brigadeId);
1203
         return userMapper.homePageUserInfoByBrigadeId(brigadeId);
1204
     }
1204
     }
1205
+
1206
+    @Override
1207
+    public List<LargeScreenHomePageUserInfoSqlDto> homePageUserInfoByDepartmentId(Long departmentId) {
1208
+        return userMapper.homePageUserInfoByDepartmentId(departmentId);
1209
+    }
1205
 }
1210
 }

+ 27 - 1
airport-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -1041,7 +1041,8 @@
1041
           and sr.role_key in ('banzuzhang', 'SecurityCheck')
1041
           and sr.role_key in ('banzuzhang', 'SecurityCheck')
1042
     </select>
1042
     </select>
1043
 
1043
 
1044
-    <select id="homePageUserInfoByBrigadeId" resultType="com.sundot.airport.common.core.domain.LargeScreenHomePageUserInfoSqlDto">
1044
+    <select id="homePageUserInfoByBrigadeId"
1045
+            resultType="com.sundot.airport.common.core.domain.LargeScreenHomePageUserInfoSqlDto">
1045
         select su.user_id      userId,
1046
         select su.user_id      userId,
1046
                su.user_name    userName,
1047
                su.user_name    userName,
1047
                su.nick_name    nickName,
1048
                su.nick_name    nickName,
@@ -1064,4 +1065,29 @@
1064
           and sr.role_key in ('banzuzhang', 'SecurityCheck')
1065
           and sr.role_key in ('banzuzhang', 'SecurityCheck')
1065
           and sd_dd.dept_id = #{brigadeId}
1066
           and sd_dd.dept_id = #{brigadeId}
1066
     </select>
1067
     </select>
1068
+
1069
+    <select id="homePageUserInfoByDepartmentId"
1070
+            resultType="com.sundot.airport.common.core.domain.LargeScreenHomePageUserInfoSqlDto">
1071
+        select su.user_id      userId,
1072
+               su.user_name    userName,
1073
+               su.nick_name    nickName,
1074
+               sd_bz.dept_id   teamId,
1075
+               sd_bz.dept_name teamName,
1076
+               sd_ks.dept_id   departmentId,
1077
+               sd_ks.dept_name departmentName,
1078
+               sd_dd.dept_id   brigadeId,
1079
+               sd_dd.dept_name brigadeName,
1080
+               sd_zj.dept_id   stationId,
1081
+               sd_zj.dept_name stationName
1082
+        from sys_user su
1083
+                 inner join sys_user_role sur on sur.user_id = su.user_id
1084
+                 inner join sys_role sr on sr.role_id = sur.role_id
1085
+                 inner join sys_dept sd_bz on sd_bz.dept_id = su.dept_id
1086
+                 inner join sys_dept sd_ks on sd_ks.dept_id = sd_bz.parent_id
1087
+                 inner join sys_dept sd_dd on sd_dd.dept_id = sd_ks.parent_id
1088
+                 inner join sys_dept sd_zj on sd_zj.dept_id = sd_dd.parent_id
1089
+        where 1 = 1
1090
+          and sr.role_key in ('banzuzhang', 'SecurityCheck')
1091
+          and sd_ks.dept_id = #{departmentId}
1092
+    </select>
1067
 </mapper>
1093
 </mapper>