浏览代码

1.完成小程序查询异常告警事件接口
2.完成小程序首页异常设备数量查询修改
3.完成小程序处理设备异常告警事件
4.屏蔽子区域对应床/门字段放开

hxd 2 月之前
父节点
当前提交
f735df3400
共有 15 个文件被更改,包括 228 次插入13 次删除
  1. 6 0
      portal-service-application/src/main/java/com/hfln/portal/application/controller/wap/EventController.java
  2. 36 0
      portal-service-application/src/main/java/com/hfln/portal/application/controller/wap/StatsController.java
  3. 7 0
      portal-service-application/src/main/java/com/hfln/portal/application/controller/web/WebEventController.java
  4. 8 2
      portal-service-common/src/main/java/com/hfln/portal/common/dto/data/event/AlarmEventDTO.java
  5. 1 1
      portal-service-common/src/main/java/com/hfln/portal/common/dto/data/home/HomeInfoDTO.java
  6. 2 2
      portal-service-common/src/main/java/com/hfln/portal/common/request/room/SubRegionInfo.java
  7. 2 0
      portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/DeviceGateway.java
  8. 10 0
      portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/StatsGateway.java
  9. 18 4
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/DeviceGatewayImpl.java
  10. 83 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/StatsGatewayImpl.java
  11. 1 1
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/WebStatsGatewayImpl.java
  12. 3 1
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/AlarmEventService.java
  13. 4 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/DevInfoService.java
  14. 22 2
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/AlarmEventServiceImpl.java
  15. 25 0
      portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/DevInfoServiceImpl.java

+ 6 - 0
portal-service-application/src/main/java/com/hfln/portal/application/controller/wap/EventController.java

@@ -28,4 +28,10 @@ public class EventController {
     public ApiResult<Boolean> handleEvent(@PathVariable("eventListId") Long eventListId){
         return ApiResult.success(deviceGateway.handleEvent(eventListId));
     }
+
+    @GetMapping("/handleAlarmEvent/{alarmEventId}")
+    @Operation(summary = "小程序处理设备异常告警事件")
+    public ApiResult<Boolean> handleAlarmEvent(@PathVariable("alarmEventId") Long alarmEventId){
+        return ApiResult.success(deviceGateway.handleAlarmEvent(alarmEventId));
+    }
 }

+ 36 - 0
portal-service-application/src/main/java/com/hfln/portal/application/controller/wap/StatsController.java

@@ -0,0 +1,36 @@
+package com.hfln.portal.application.controller.wap;
+
+
+import cn.hfln.framework.catchlog.CatchAndLog;
+import cn.hfln.framework.dto.ApiResult;
+import com.hfln.portal.common.dto.data.event.AlarmEventDTO;
+import com.hfln.portal.common.request.event.AlarmEventParams;
+import com.hfln.portal.common.vo.PageRecord;
+import com.hfln.portal.domain.gateway.StatsGateway;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+@Slf4j
+@RestController
+@RequestMapping("/wap/stats")
+@CatchAndLog
+@Tag(name = "统计相关")
+public class StatsController {
+
+    @Autowired
+    private StatsGateway statsGateway;
+
+    @PostMapping("/alarmRetentionQuery")
+    @Operation(summary = "异常滞留统计查询")
+    public ApiResult<PageRecord<AlarmEventDTO>> alarmRetentionQuery(@Valid @RequestBody AlarmEventParams params) {
+        return ApiResult.success(statsGateway.alarmRetentionQuery(params));
+    }
+}

+ 7 - 0
portal-service-application/src/main/java/com/hfln/portal/application/controller/web/WebEventController.java

@@ -24,4 +24,11 @@ public class WebEventController {
     public ApiResult<Boolean> handleEvent(@RequestParam("eventListId") Long eventListId){
         return ApiResult.success(deviceGateway.handleEvent(eventListId));
     }
+
+
+    @GetMapping("/handleAlarmEvent")
+    @Operation(summary = "处理设备异常告警事件")
+    public ApiResult<Boolean> handleAlarmEvent(@RequestParam("alarmEventId") Long alarmEventId){
+        return ApiResult.success(deviceGateway.handleAlarmEvent(alarmEventId));
+    }
 }

+ 8 - 2
portal-service-common/src/main/java/com/hfln/portal/common/dto/data/event/AlarmEventDTO.java

@@ -1,13 +1,13 @@
 package com.hfln.portal.common.dto.data.event;
 
-import com.hfln.portal.common.vo.BaseVO;
+import com.hfln.portal.common.vo.BaseDto;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 @Data
 @EqualsAndHashCode(callSuper = true)
-public class AlarmEventDTO extends BaseVO {
+public class AlarmEventDTO extends BaseDto {
 
     /**
      * 告警表主键ID
@@ -22,6 +22,12 @@ public class AlarmEventDTO extends BaseVO {
     private Long devId;
 
     /**
+     * 设备名称
+     */
+    @Schema(description = "设备名称")
+    private String devName;
+
+    /**
      * 姿势
      */
     @Schema(description = "姿势 字典值 person_pose")

+ 1 - 1
portal-service-common/src/main/java/com/hfln/portal/common/dto/data/home/HomeInfoDTO.java

@@ -28,7 +28,7 @@ public class HomeInfoDTO extends BaseVO {
     @Schema(description = "设备数量")
     private Integer devNum;
 
-    @Schema(description = "告警数量")
+    @Schema(description = "异常设备数量")
     private Integer warnNum;
 
 

+ 2 - 2
portal-service-common/src/main/java/com/hfln/portal/common/request/room/SubRegionInfo.java

@@ -27,10 +27,10 @@ public class SubRegionInfo {
     @Schema(description = "屏蔽子区域Z结束")
     private BigDecimal stopZz;
 
-    @Schema(description = "默认0")
+    @Schema(description = "默认0, 是否为床: 0-不是,1-是")
     private Integer isLowSnr;
 
-    @Schema(description = "默认0 是否为门: 0-是,1-是")
+    @Schema(description = "默认0, 是否为门: 0-是,1-是")
     private Integer isDoor;
 
     @Schema(description = "人员进入时间 默认3")

+ 2 - 0
portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/DeviceGateway.java

@@ -31,6 +31,8 @@ public interface DeviceGateway {
 
     Boolean handleEvent(Long eventListId);
 
+    Boolean handleAlarmEvent(Long alarmEventId);
+
     Boolean webUpdateDevice(WebUpdateDeviceParams params);
 
     DeviceDTO updateDevice(UpdateDeviceParams params);

+ 10 - 0
portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/StatsGateway.java

@@ -0,0 +1,10 @@
+package com.hfln.portal.domain.gateway;
+
+import com.hfln.portal.common.dto.data.event.AlarmEventDTO;
+import com.hfln.portal.common.request.event.AlarmEventParams;
+import com.hfln.portal.common.vo.PageRecord;
+
+public interface StatsGateway {
+
+    PageRecord<AlarmEventDTO> alarmRetentionQuery(AlarmEventParams params);
+}

+ 18 - 4
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/DeviceGatewayImpl.java

@@ -154,11 +154,13 @@ public class DeviceGatewayImpl implements DeviceGateway {
             
             // 统计设备数量
             totalDevices++;
-            // 统计告警数量(dev_warn为1的设备)
-            if (devInfo.getDevWarn() != null && devInfo.getDevWarn() == 1) {
-                warningDevices++;
-            }
+            // 统计异常设备数量(异常事件表未处理的设备)
+           boolean hasWarning = alarmEventService.QueryAlarm(devInfo.getDevId());
+           if (hasWarning) {
+               warningDevices++;
+           }
         }
+
         
         homeInfoDTO.setDeviceList(deviceDTOs);
         // 设置设备总数
@@ -372,6 +374,18 @@ public class DeviceGatewayImpl implements DeviceGateway {
         return this.eventService.update(updateWrapper);
     }
 
+    @Override
+    public Boolean handleAlarmEvent(Long alarmEventId) {
+        //获取当前操作者手机号
+        String phone = (String) StpUtil.getSession().get(UserConstants.SA_USER_PHONE);
+
+        LambdaUpdateWrapper<AlarmEvent> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(AlarmEvent::getAlarmEventId, alarmEventId)
+                .set(AlarmEvent::getIsHandle, 1)
+                .set(AlarmEvent::getRemark, PhoneUtils.maskPhone(phone));
+        return this.alarmEventService.update(updateWrapper);
+    }
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)

+ 83 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/StatsGatewayImpl.java

@@ -0,0 +1,83 @@
+package com.hfln.portal.infrastructure.gateway.impl;
+
+import cn.dev33.satoken.stp.StpUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hfln.portal.common.constant.UserConstants;
+import com.hfln.portal.common.dto.data.event.AlarmEventDTO;
+import com.hfln.portal.common.request.event.AlarmEventParams;
+import com.hfln.portal.common.vo.PageRecord;
+import com.hfln.portal.domain.customer.util.CopyUtils;
+import com.hfln.portal.domain.gateway.StatsGateway;
+import com.hfln.portal.infrastructure.po.AlarmEvent;
+import com.hfln.portal.infrastructure.po.DevInfo;
+import com.hfln.portal.infrastructure.service.AlarmEventService;
+import com.hfln.portal.infrastructure.service.DevInfoService;
+import com.hfln.portal.infrastructure.service.DevShareService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+
+@Slf4j
+@Service
+public class StatsGatewayImpl implements StatsGateway {
+
+    @Autowired
+    private DevShareService devShareService;
+
+    @Autowired
+    private DevInfoService devInfoService;
+
+    @Autowired
+    private AlarmEventService alarmEventService;
+
+    @Override
+    public PageRecord<AlarmEventDTO> alarmRetentionQuery(AlarmEventParams params) {
+        // 1.从会话中获取当前用户的id
+        Long userId = StpUtil.getSession().getLong(UserConstants.SA_USER_ID);
+
+        // 2.根据userId获取用户自己设备与被分享设备的id
+            //2.1 获取用户被分享的设备id集合  sharedDevIds
+        Optional<List<Long>> sharedDevIds = devShareService.queryDeviceIdByUserId(userId);
+            //2.2 获取用户自己设备的id集合    devIds
+        List<Long> devIds = devInfoService.queryByUserId(userId);
+            //2.3 合并devIds和sharedDevIds
+        List<Long> allDevIds = Stream.concat(
+                Optional.ofNullable(devIds).orElseGet(Collections::emptyList).stream(),
+                sharedDevIds.orElseGet(Collections::emptyList).stream()
+        ).distinct()  //去重 + 顺序
+         .collect(Collectors.toList());
+
+        if (allDevIds.isEmpty()){
+            PageRecord<AlarmEventDTO> pr = new PageRecord<>();
+            pr.setPageNum(params.getPageNo());
+            pr.setPageSize(params.getPageSize());
+            pr.setRows(Collections.emptyList());
+            pr.setTotal(0L);
+            return pr;
+        }
+
+        // 3.分页查询设备
+        Page<AlarmEvent> page = alarmEventService.QueryAlarmEvent(params, allDevIds);
+
+        //转化为DTO
+        List<AlarmEventDTO> dtoList = CopyUtils.copyList(page.getRecords(), AlarmEventDTO.class);
+
+        //新增 填充devName
+        Map<Long, String> devIdNameMap = devInfoService.queryByIds(
+                dtoList.stream().map(AlarmEventDTO::getDevId).collect(Collectors.toSet())
+        ).stream().collect(Collectors.toMap(DevInfo::getDevId, DevInfo::getDevName));
+
+        dtoList.forEach(dto -> dto.setDevName(devIdNameMap.get(dto.getDevId())));
+
+        // 封装成 PageRecord 返回
+        return CopyUtils.copyPage(page, dtoList);
+    }
+}

+ 1 - 1
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/WebStatsGatewayImpl.java

@@ -111,7 +111,7 @@ public class WebStatsGatewayImpl implements WebStatsGateway {
             devIdList =  devInfoService.queryByTenantId(tenantId);
         }
 
-        Page<AlarmEvent> page = alarmEventService.queryAlarmEvent(params, devIdList);
+        Page<AlarmEvent> page = alarmEventService.QueryAlarmEvent(params, devIdList);
 
         //转化为DTO
         List<AlarmEventDTO> dtoList = CopyUtils.copyList(page.getRecords(), AlarmEventDTO.class);

+ 3 - 1
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/AlarmEventService.java

@@ -9,5 +9,7 @@ import java.util.List;
 
 public interface AlarmEventService extends IService<AlarmEvent> {
 
-        Page<AlarmEvent> queryAlarmEvent(AlarmEventParams params, List<Long> devIdList);
+        Page<AlarmEvent> QueryAlarmEvent(AlarmEventParams params, List<Long> devIdList);
+
+        boolean QueryAlarm(Long devId);
 }

+ 4 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/DevInfoService.java

@@ -6,6 +6,7 @@ import com.hfln.portal.common.request.device.DeviceBandingParams;
 import com.hfln.portal.common.request.device.DeviceListQueryReq;
 import com.hfln.portal.infrastructure.po.DevInfo;
 
+import java.util.Collection;
 import java.util.List;
 
 public interface DevInfoService extends IService<DevInfo> {
@@ -16,6 +17,7 @@ public interface DevInfoService extends IService<DevInfo> {
 
     List<DevInfo> queryDevices(Long userId,String deviceId);
 
+    List<DevInfo> queryByIds (Collection<Long> devIds);
 
     Boolean updateDevice(Object identifier, DeviceBandingParams request);
 
@@ -28,4 +30,6 @@ public interface DevInfoService extends IService<DevInfo> {
     DevInfo queryOneByClientId(String clientId);
 
     List<Long> queryByTenantId(Long tenantId);
+
+    List<Long> queryByUserId (Long userId);
 }

+ 22 - 2
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/AlarmEventServiceImpl.java

@@ -9,6 +9,8 @@ import com.hfln.portal.infrastructure.po.AlarmEvent;
 import com.hfln.portal.infrastructure.service.AlarmEventService;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Objects;
 
@@ -17,7 +19,7 @@ public class AlarmEventServiceImpl extends ServiceImpl<AlarmEventMapper, AlarmEv
 
 
     @Override
-    public Page<AlarmEvent> queryAlarmEvent(AlarmEventParams params, List<Long> devIdList) {
+    public Page<AlarmEvent> QueryAlarmEvent(AlarmEventParams params, List<Long> devIdList) {
         Page<AlarmEvent> page = new Page<>(params.getPageNo(), params.getPageSize());
 
         // 2. 构建查询条件
@@ -35,16 +37,34 @@ public class AlarmEventServiceImpl extends ServiceImpl<AlarmEventMapper, AlarmEv
             queryWrapper.lt(AlarmEvent::getCreateTime, params.getCreateTimeEnd().plusDays(1));
         }
 
+        //4.添加设备ID条件
         if (params.getDevId() != null) {
             queryWrapper.eq(AlarmEvent::getDevId, params.getDevId());
         }
 
+        //5.添加事件类型条件
         if (params.getEventType() != null) {
             queryWrapper.eq(AlarmEvent::getEventType, params.getEventType());
         }
 
-        // 4. 设置排序
+        // 6. 设置排序
         queryWrapper.orderByDesc(AlarmEvent::getCreateTime);
         return this.baseMapper.selectPage(page, queryWrapper);
     }
+
+    @Override
+    public boolean QueryAlarm(Long devId) {
+        LambdaQueryWrapper<AlarmEvent> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AlarmEvent::getDevId, devId)
+                .eq(AlarmEvent::getIsHandle, 0);
+
+        // 获取当天起始和结束时间
+        LocalDate today = LocalDate.now();
+        LocalDateTime startOfDay = today.atStartOfDay();
+        LocalDateTime endOfDay = today.plusDays(1).atStartOfDay().minusNanos(1);
+
+        queryWrapper.between(AlarmEvent::getCreateTime, startOfDay, endOfDay);
+
+        return this.baseMapper.selectCount(queryWrapper) > 0;
+    }
 }

+ 25 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/DevInfoServiceImpl.java

@@ -19,6 +19,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
 import java.time.LocalDateTime;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -83,6 +84,20 @@ public class DevInfoServiceImpl extends ServiceImpl<DevInfoMapper, DevInfo> impl
         return this.baseMapper.selectList(wrapper);
     }
 
+
+    @Override
+    public List<DevInfo> queryByIds(Collection<Long> devIds) {
+        if (CollectionUtils.isEmpty(devIds)) {
+            return Collections.emptyList();
+        }
+
+        // 使用 MyBatis-Plus 的 LambdaQueryWrapper 批量查询
+        return this.list(new LambdaQueryWrapper<DevInfo>()
+                .in(DevInfo::getDevId, devIds)
+                .eq(DevInfo::getIsDeleted, 0)  // 如果有逻辑删除字段,过滤掉已删除设备
+        );
+    }
+
     @Override
     public Boolean updateDevice(Object identifier, DeviceBandingParams request) {
         // 参数校验
@@ -220,5 +235,15 @@ public class DevInfoServiceImpl extends ServiceImpl<DevInfoMapper, DevInfo> impl
 
     }
 
+    @Override
+    public List<Long> queryByUserId(Long userId){
+        LambdaQueryWrapper<DevInfo> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(DevInfo::getUserId, userId)
+                .select(DevInfo::getDevId);
+
+        List<DevInfo> list = this.list(wrapper);
+        return list.stream().map(DevInfo::getDevId).collect(Collectors.toList());
+    }
+
 
 }