Sfoglia il codice sorgente

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

chenshudong 3 giorni fa
parent
commit
48f5562ddb

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

@@ -441,4 +441,6 @@ public interface SeizureReportMapper {
441 441
     public List<ItemLargeScreenHomePageSeizureReportSqlDto> homePageSeizureReport(BaseLargeScreenQueryParamDto dto);
442 442
 
443 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 258
         List<SysDept> brigades = getBrigadesByStation(dto.getInspectStationId());
259
+        // 获取该站点下的所有科室
260
+        List<SysDept> departments = getDepartmentsByStation(dto.getInspectStationId());
259 261
 
260 262
         // 构建所有分组:先添加站级,再添加大队级
261 263
         List<SysDept> allGroups = new ArrayList<>();
262 264
         allGroups.add(stationDept); // 添加站级
263 265
         allGroups.addAll(brigades); // 添加大队级
266
+        allGroups.addAll(departments); // 添加科室级
264 267
 
265 268
         // 获取查获数量数据
266 269
         List<SeizureLargeScreenHomePageItemDto> seizureReportList = getSeizureDataForStation(dto.getDeptId(), dto.getStartDate(), dto.getEndDate());
@@ -288,6 +291,13 @@ public class SeizureDistributionService {
288 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 302
         List<GroupedBoxPlotDataDto> result = new ArrayList<>();
293 303
 
@@ -420,4 +430,44 @@ public class SeizureDistributionService {
420 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 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 685
         } else {
667 686
             GroupedBoxPlotDataDto firstGroup = boxPlotDataList.get(0);
668 687
             if (Objects.nonNull(firstGroup) && Objects.nonNull(firstGroup.getBoxPlotData())) {
@@ -681,6 +700,10 @@ public class ItemLargeScreenServiceImpl implements ItemLargeScreenService {
681 700
             // 有大队 ID,查询大队数据
682 701
             seizureReportList = seizureReportMapper.homePageSeizureReportBrigadeId(dto);
683 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 707
         } else {
685 708
             // 无大队 ID,查询全站数据
686 709
             seizureReportList = seizureReportMapper.homePageSeizureReport(dto);
@@ -704,6 +727,10 @@ public class ItemLargeScreenServiceImpl implements ItemLargeScreenService {
704 727
         for (LargeScreenHomePageUserInfoSqlDto userInfo : userInfoList) {
705 728
             BigDecimal totalQuantity = userSeizureMap.getOrDefault(userInfo.getUserId(), BigDecimal.ZERO);
706 729
 
730
+            if (lowerBound == null || upperBound == null) {
731
+                continue;
732
+            }
733
+
707 734
             // 判断是否为异常值
708 735
             if (totalQuantity.compareTo(lowerBound) < 0 || totalQuantity.compareTo(upperBound) > 0) {
709 736
                 ItemAbnormalSeizureDto abnormalDto = new ItemAbnormalSeizureDto();
@@ -759,6 +786,25 @@ public class ItemLargeScreenServiceImpl implements ItemLargeScreenService {
759 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 808
         } else {
763 809
             GroupedBoxPlotDataDto firstGroup = boxPlotDataList.get(0);
764 810
             if (Objects.nonNull(firstGroup) && Objects.nonNull(firstGroup.getBoxPlotData())) {
@@ -776,6 +822,10 @@ public class ItemLargeScreenServiceImpl implements ItemLargeScreenService {
776 822
             // 有大队 ID,查询大队数据
777 823
             seizureReportList = seizureReportMapper.homePageSeizureReportBrigadeId(dto);
778 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 829
         } else {
780 830
             // 无大队 ID,查询全站数据
781 831
             seizureReportList = seizureReportMapper.homePageSeizureReport(dto);
@@ -800,6 +850,10 @@ public class ItemLargeScreenServiceImpl implements ItemLargeScreenService {
800 850
         for (LargeScreenHomePageUserInfoSqlDto userInfo : userInfoList) {
801 851
             BigDecimal totalQuantity = userSeizureMap.getOrDefault(userInfo.getUserId(), BigDecimal.ZERO);
802 852
 
853
+            if (lowerBound == null || upperBound == null) {
854
+                continue;
855
+            }
856
+
803 857
             // 判断是否为异常值
804 858
             if (totalQuantity.compareTo(upperBound) > 0) {
805 859
                 // 显著高于

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

@@ -790,4 +790,21 @@
790 790
             and isr.inspect_brigade_id = #{inspectBrigadeId}
791 791
         </if>
792 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 810
 </mapper>

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

@@ -246,4 +246,12 @@ public interface SysUserMapper {
246 246
      * @return 用户信息列表
247 247
      */
248 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 336
      * @return 用户信息列表
337 337
      */
338 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 1202
     public List<LargeScreenHomePageUserInfoSqlDto> homePageUserInfoByBrigadeId(Long brigadeId) {
1203 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 1041
           and sr.role_key in ('banzuzhang', 'SecurityCheck')
1042 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 1046
         select su.user_id      userId,
1046 1047
                su.user_name    userName,
1047 1048
                su.nick_name    nickName,
@@ -1064,4 +1065,29 @@
1064 1065
           and sr.role_key in ('banzuzhang', 'SecurityCheck')
1065 1066
           and sd_dd.dept_id = #{brigadeId}
1066 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 1093
 </mapper>