Browse Source

1、优化定时任务批量更新设备状态方法,将离线告警推送拆分出来单独创建一个设备离线告警定时任务;
2、开发设备离线告警定时任务接口;
3、开发界面设备列表中设备状态更新接口;

james 3 weeks ago
parent
commit
0ec2688156

+ 5 - 2
service-iot/service-iot-api/src/main/java/com/usky/iot/RemoteIotTaskService.java

@@ -14,8 +14,11 @@ public interface RemoteIotTaskService {
     @GetMapping("/dataOverviewJobData")
     void dataOverviewJobData();
 
-    @GetMapping("/baseAlarmStatus")
-    void baseAlarmStatus();
+    @GetMapping("/deviceStatus")
+    void deviceStatus();
+
+    @GetMapping("/deviceOffLineAlarm")
+    void deviceOffLineAlarm();
 
     @GetMapping("/customInfoStatus")
     void customInfoStatus();

+ 7 - 2
service-iot/service-iot-api/src/main/java/com/usky/iot/factory/RemoteIotTaskFactory.java

@@ -32,8 +32,13 @@ public class RemoteIotTaskFactory implements FallbackFactory<RemoteIotTaskServic
             }
 
             @Override
-            public void baseAlarmStatus() {
-                throw new FeignBadRequestException(500,"定时同步设备状态和设备告警数据异常"+throwable.getMessage());
+            public void deviceStatus() {
+                throw new FeignBadRequestException(500,"定时同步设备状态异常"+throwable.getMessage());
+            }
+
+            @Override
+            public void deviceOffLineAlarm() {
+                throw new FeignBadRequestException(500,"定时同步设备离线告警数据异常"+throwable.getMessage());
             }
 
             @Override

+ 5 - 0
service-iot/service-iot-biz/pom.xml

@@ -19,6 +19,11 @@
             <artifactId>service-backend-api</artifactId>
             <version>0.0.1</version>
         </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>data-tsdb-proxy-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
         <dependency>
             <groupId>com.usky</groupId>
             <artifactId>data-transfer-api</artifactId>

+ 20 - 20
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/api/DeviceStatusApi.java

@@ -1,20 +1,20 @@
-package com.usky.iot.controller.api;
-
-import com.usky.iot.client.DeviceStatusClient;
-import com.usky.iot.service.BaseAlarmService;
-import io.swagger.annotations.Api;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-@Api(tags = "数据统一查询RPC")
-public class DeviceStatusApi implements DeviceStatusClient {
-
-    @Autowired
-    private BaseAlarmService baseAlarmService;
-
-    public void status(){
-        baseAlarmService.status();
-    }
-
-}
+//package com.usky.iot.controller.api;
+//
+//import com.usky.iot.client.DeviceStatusClient;
+//import com.usky.iot.service.DmpDeviceInfoService;
+//import io.swagger.annotations.Api;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.web.bind.annotation.RestController;
+//
+//@RestController
+//@Api(tags = "数据统一查询RPC")
+//public class DeviceStatusApi implements DeviceStatusClient {
+//
+//    @Autowired
+//    private DmpDeviceInfoService dmpDeviceInfoService;
+//
+//    public void status(){
+//        dmpDeviceInfoService.deviceStatus();
+//    }
+//
+//}

+ 7 - 2
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/api/ServiceIotTaskApi.java

@@ -34,8 +34,13 @@ public class ServiceIotTaskApi implements RemoteIotTaskService {
     }
 
     @Override
-    public void baseAlarmStatus() {
-        baseAlarmService.status();
+    public void deviceStatus() {
+        dmpDeviceInfoService.deviceStatus();
+    }
+
+    @Override
+    public void deviceOffLineAlarm() {
+        baseAlarmService.deviceOffLineAlarm();
     }
 
     @Override

+ 2 - 1
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/DeviceHttpController.java

@@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -42,7 +43,7 @@ public class DeviceHttpController {
 
     @GetMapping(value = "/status")
     public ApiResult<Void> status(){
-        baseAlarmService.status();
+        dmpDeviceInfoService.deviceStatus();
         return ApiResult.success();
     }
 

+ 11 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/DmpDeviceInfoController.java

@@ -8,6 +8,7 @@ import com.usky.backend.domain.*;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.common.core.utils.poi.ExcelUtil;
+import com.usky.demo.domain.LastInnerQueryVO;
 import com.usky.iot.domain.BaseFacilityDevice;
 import com.usky.iot.domain.DmpDeviceInfo;
 import com.usky.iot.service.DmpDeviceInfoService;
@@ -60,6 +61,16 @@ public class DmpDeviceInfoController {
         return ApiResult.success();
     }
 
+    /**
+     * 更新设备列表状态
+     * @param queryVO
+     * @return
+     */
+    @PostMapping("updateDeviceStatus")
+    public ApiResult<Void> updateDeviceStatus(@RequestBody LastInnerQueryVO queryVO){
+        dmpDeviceInfoService.updateDeviceStatus(queryVO);
+        return ApiResult.success();
+    }
 
     /**
      * 分页

+ 5 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/DmpDeviceStatus.java

@@ -56,4 +56,9 @@ public class DmpDeviceStatus implements Serializable {
      * 产品编码
      */
     private String productCode;
+
+    /**
+     * 设备uuid
+     */
+    private String deviceUuid;
 }

+ 3 - 2
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/BaseAlarmService.java

@@ -8,6 +8,7 @@ import com.usky.iot.service.vo.BaseAlarmListVO;
 import com.usky.iot.service.vo.BaseAlarmRequestVO;
 import com.usky.iot.service.vo.BaseAlarmResponeVO;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 import java.util.Map;
@@ -26,6 +27,8 @@ public interface BaseAlarmService extends CrudService<BaseAlarm> {
 
     CommonPage<BaseAlarm> page(BaseAlarmListVO baseAlarmListVO);
 
+    void deviceOffLineAlarm();
+
     CommonPage<BaseAlarmResponeVO> statistic_notoken(BaseAlarmRequestVO baseAlarmRequestVO);
 
     CommonPage<BaseAlarm> page_notoken(BaseAlarmListVO baseAlarmListVO);
@@ -36,8 +39,6 @@ public interface BaseAlarmService extends CrudService<BaseAlarm> {
 
     boolean add(BaseAlarm baseAlarm);
 
-    void status();
-
     /**
      * 综合云图-告警统计
      * @return

+ 5 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/DmpDeviceInfoService.java

@@ -3,6 +3,7 @@ package com.usky.iot.service;
 import com.usky.backend.domain.*;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.common.mybatis.core.CrudService;
+import com.usky.demo.domain.LastInnerQueryVO;
 import com.usky.iot.domain.DmpDeviceInfo;
 import com.usky.iot.service.vo.BaseFacilityDeviceVO;
 import com.usky.iot.service.vo.DmpDeviceInfoRequest;
@@ -33,6 +34,10 @@ public interface DmpDeviceInfoService extends CrudService<DmpDeviceInfo> {
 
     boolean checkNameUnique1(DmpDeviceInfo dmpDeviceInfo,Integer tenantId);
 
+    void deviceStatus();
+
+    void updateDeviceStatus(LastInnerQueryVO queryVO);
+
     CommonPage<DmpDeviceInfo> page(DmpDeviceInfoRequest dmpDeviceInfoRequest);
 
     CommonPage<DmpDeviceInfo> pageWhite(DmpDeviceInfoRequest dmpDeviceInfoRequest);

+ 7 - 1
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/BaseAlarmServiceImpl.java

@@ -14,6 +14,9 @@ import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.common.core.exception.BusinessException;
 import com.usky.common.security.utils.SecurityUtils;
+import com.usky.demo.RemoteTsdbProxyService;
+import com.usky.demo.domain.LastInnerQueryVO;
+import com.usky.demo.domain.LastInnerResultVO;
 import com.usky.iot.domain.*;
 import com.usky.iot.mapper.BaseAlarmMapper;
 import com.usky.iot.mapper.DmpDeviceTypeMapper;
@@ -69,6 +72,9 @@ public class BaseAlarmServiceImpl extends AbstractCrudService<BaseAlarmMapper, B
     @Autowired
     private DataQueryClient dataQueryClient;
 
+    @Autowired
+    private RemoteTsdbProxyService remoteTsdbProxyService;
+
     @Autowired
     private DmpDeviceStatusService dmpDeviceStatusService;
 
@@ -619,7 +625,7 @@ public class BaseAlarmServiceImpl extends AbstractCrudService<BaseAlarmMapper, B
     }
 
     @Override
-    public void status(){
+    public void deviceOffLineAlarm(){
         log.info("定时同步设备状态和设备告警数据 start");
         ApiResult<List<StatusVO>> resultList = dataQueryClient.status();
         List<StatusVO> list = resultList.getData();

+ 129 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/DmpDeviceInfoServiceImpl.java

@@ -7,6 +7,7 @@ import cn.afterturn.easypoi.excel.ExcelImportUtil;
 import cn.afterturn.easypoi.excel.entity.ExportParams;
 import cn.afterturn.easypoi.excel.entity.ImportParams;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateTime;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -28,6 +29,9 @@ import com.usky.common.core.exception.BusinessException;
 import com.usky.common.core.util.BeanMapperUtils;
 import com.usky.common.core.util.UUIDUtils;
 import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.demo.RemoteTsdbProxyService;
+import com.usky.demo.domain.LastInnerQueryVO;
+import com.usky.demo.domain.LastInnerResultVO;
 import com.usky.iot.domain.*;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.iot.mapper.DmpDeviceInfoMapper;
@@ -37,6 +41,7 @@ import com.usky.iot.service.DmpDeviceStatusService;
 import com.usky.iot.service.DmpProductAttributeService;
 import com.usky.iot.service.vo.*;
 import com.usky.transfer.RemoteTransferService;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -48,7 +53,9 @@ import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.text.DecimalFormat;
+import java.time.Instant;
 import java.time.LocalDateTime;
+import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -61,6 +68,7 @@ import java.util.stream.Collectors;
  * @author ya
  * @since 2022-10-08
  */
+@Slf4j
 @Service
 public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoMapper, DmpDeviceInfo> implements DmpDeviceInfoService {
     @Autowired
@@ -81,6 +89,9 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
     @Autowired
     private RemoteTransferService remoteTransferService;
 
+    @Autowired
+    private RemoteTsdbProxyService remoteTsdbProxyService;
+
     @Override
     public Map<String,Object> control(String productCode, String deviceUuid, String commandCode, String commandValue, String domain, Long userId, String userName){
         Integer tenantId;
@@ -155,6 +166,7 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
             dmpDeviceStatus.setDeviceStatus(2);
             dmpDeviceStatus.setLastOfflineTime(LocalDateTime.now());
             dmpDeviceStatus.setProductCode(dmpDeviceInfo.getProductCode());
+            dmpDeviceStatus.setDeviceUuid(dmpDeviceInfo.getDeviceUuid());
             dmpDeviceStatusService.save(dmpDeviceStatus);
         }else{
             throw new BusinessException("新增设备信息'" + dmpDeviceInfo.getDeviceId() + "'失败,无对应产品信息");
@@ -198,6 +210,122 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
         return null != one && !Objects.equals(one.getId(), id);
     }
 
+    @Override
+    public void deviceStatus(){
+//        log.info("定时同步设备状态和设备告警数据 start");
+//        ApiResult<List<StatusVO>> resultList = dataQueryClient.status();
+//        List<StatusVO> list = resultList.getData();
+//        if(CollectionUtils.isNotEmpty(list)){
+//            List<String> devList = new ArrayList<>();
+//            for(int i=0;i<list.size();i++){
+//                devList.add(list.get(i).getDeviceId());
+//            }
+//
+//            List<DmpDeviceInfo> devInfoList = new ArrayList<>();
+//            List<BaseAlarm> baseUnAlarmList = new ArrayList<>();
+////            List<BaseAlarm> baseAlarmList = new ArrayList<>();
+//            if(devList.size() > 0) {
+//                devInfoList = baseMapper.getDeviceInfoList(devList);
+//                baseUnAlarmList = baseMapper.getUnDeviceAlarmList(devList);
+////                baseAlarmList = baseMapper.getDeviceAlarmList(devList);
+//            }
+//
+//            if(CollectionUtils.isNotEmpty(devInfoList)){
+//                for(int i=0;i<list.size();i++){
+//                    String date =  list.get(i).getTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+//                    String currentDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+//                    LambdaUpdateWrapper<DmpDeviceStatus> updateWrapper = Wrappers.lambdaUpdate();
+//                    if(date.equals(currentDate)){
+//                        updateWrapper.set(DmpDeviceStatus::getDeviceStatus,1)  //设备在线
+//                                .set(DmpDeviceStatus::getLastOnlineTime,list.get(i).getTime())
+//                                .eq(DmpDeviceStatus::getDeviceId,list.get(i).getDeviceId())
+//                                .eq(DmpDeviceStatus::getProductCode,list.get(i).getProductCode());
+//                        //设备离线告警恢复在线自动默认处理
+//                        if(CollectionUtils.isNotEmpty(baseUnAlarmList)){
+//                            for(int j=0;j<baseUnAlarmList.size();j++){
+//                                if(list.get(i).getDeviceId().equals(baseUnAlarmList.get(j).getDeviceId()) && list.get(i).getProductCode().equals(baseUnAlarmList.get(j).getProductCode())){
+//                                    LambdaUpdateWrapper<BaseAlarm> updateWrapper1 = Wrappers.lambdaUpdate();
+//                                    updateWrapper1.set(BaseAlarm::getHandleStatus,1)
+//                                            .set(BaseAlarm::getHandleBy,"YT_admin")
+//                                            .set(BaseAlarm::getHandleTime,LocalDateTime.now())
+//                                            .eq(BaseAlarm::getDeviceId,list.get(i).getDeviceId())
+//                                            .eq(BaseAlarm::getHandleStatus,0)
+//                                            .eq(BaseAlarm::getProductCode,list.get(i).getProductCode());
+//                                    this.update(updateWrapper1);
+//                                    break;
+//                                }
+//                            }
+//                        }
+//
+//                    }else{
+//                        updateWrapper.set(DmpDeviceStatus::getDeviceStatus,2)  //设备离线
+//                                .set(DmpDeviceStatus::getLastOfflineTime,list.get(i).getTime())
+//                                .eq(DmpDeviceStatus::getDeviceId,list.get(i).getDeviceId())
+//                                .eq(DmpDeviceStatus::getProductCode,list.get(i).getProductCode());
+//
+//                        for(int j=0;j<devInfoList.size();j++){
+//                            if(list.get(i).getDeviceId().equals(devInfoList.get(j).getDeviceId()) && list.get(i).getProductCode().equals(devInfoList.get(j).getProductCode())){
+//                                int count = 0;
+//                                for(int k=0;k<baseUnAlarmList.size();k++){
+//                                    if(list.get(i).getDeviceId().equals(baseUnAlarmList.get(k).getDeviceId()) && list.get(i).getProductCode().equals(baseUnAlarmList.get(k).getProductCode())){
+//                                        count++;
+//                                    }
+//                                }
+//                                if(count == 0){
+//                                    BaseAlarm baseAlarm = new BaseAlarm();
+//                                    baseAlarm.setDeviceId(list.get(i).getDeviceId());
+//                                    baseAlarm.setAlarmTime(LocalDateTime.parse(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH"))+":00:00",DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+//                                    baseAlarm.setAlarmType("001");
+//                                    baseAlarm.setAlarmObject(devInfoList.get(j).getDeviceName());
+//                                    baseAlarm.setAlarmData("");
+//                                    baseAlarm.setAlarmAttribute("离线告警");
+//                                    baseAlarm.setAlarmContent("设备离线告警");
+//                                    baseAlarm.setAlarmGrade(1);
+//
+//                                    baseAlarm.setAlarmAddress(devInfoList.get(j).getInstallAddress());
+//                                    baseAlarm.setProductCode(devInfoList.get(j).getProductCode());
+//                                    this.add(baseAlarm);
+//                                }
+//                                break;
+//                            }
+//                        }
+//
+//                    }
+//                    dmpDeviceStatusService.update(updateWrapper);
+//                }
+//            }
+//
+//        }
+//        log.info("定时同步设备状态和设备告警数据 end");
+    }
+
+    @Override
+    public void updateDeviceStatus(LastInnerQueryVO queryVO){
+        List<LastInnerResultVO> list = remoteTsdbProxyService.last(queryVO);
+        if(CollectionUtils.isNotEmpty(list)){
+            for(int i=0;i<list.size();i++){
+                String deviceuuid = list.get(i).getDeviceuuid();
+                LocalDateTime lTime = Instant.ofEpochMilli(Long.valueOf(list.get(i).getMetrics().get("time").toString())).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
+                String date =  lTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+                String currentDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+                LambdaUpdateWrapper<DmpDeviceStatus> updateWrapper = Wrappers.lambdaUpdate();
+                if(date.equals(currentDate)){
+                    updateWrapper.set(DmpDeviceStatus::getDeviceStatus,1)  //设备在线
+                            .set(DmpDeviceStatus::getLastOnlineTime,lTime)
+                            .eq(DmpDeviceStatus::getDeviceUuid,deviceuuid);
+
+                }else{
+                    updateWrapper.set(DmpDeviceStatus::getDeviceStatus,2)  //设备离线
+                            .set(DmpDeviceStatus::getLastOnlineTime,lTime)
+                            .eq(DmpDeviceStatus::getDeviceUuid,deviceuuid);
+
+                }
+                dmpDeviceStatusService.update(updateWrapper);
+            }
+
+        }
+    }
+
     @Override
     public CommonPage<DmpDeviceInfo> page(DmpDeviceInfoRequest diRequest) {
         List<DmpDeviceInfo> list = new ArrayList<>();
@@ -637,6 +765,7 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
                 dmpDeviceStatus.setDeviceStatus(2);
                 dmpDeviceStatus.setLastOfflineTime(LocalDateTime.now());
                 dmpDeviceStatus.setProductCode(devList.get(i).getProductCode());
+                dmpDeviceStatus.setDeviceUuid(devList.get(i).getDeviceUuid());
                 dmpDeviceStatusList.add(dmpDeviceStatus);
             }else{
                 throw new BusinessException("新增设备信息'" + devList.get(i).getDeviceId() + "'失败,无对应产品信息");