Explorar o código

心跳流程修复完成。

zhuoning %!s(int64=3) %!d(string=hai) anos
pai
achega
9abb4d05ed

+ 1 - 10
huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/listener/DeviceListener.java

@@ -65,17 +65,8 @@ public class DeviceListener {
         JSONObject dataJo = (JSONObject) askMap.get("data");
         if(type.trim().equalsIgnoreCase("device-heartbeat")){
             //--(1)处理心跳数据
-            //--保存设备心跳流水数据(MySQL)
-
-            //保存心跳流水数据
-//            deviceService.saveDeviceHeartbeat(dataJo);
-            //发送心跳数据到MQ
-//            processProducer.sendHeartbeat(dataJo);
-            System.out.println("处理心跳");
-            System.out.println("askText>>"+askText);
             //{处理设备心跳数据}
-//            deviceService.handleDeviceHeartbeat(dataJo);
-            /////////////////////////////////////////////////////////////////////////////////////////////////////////
+            deviceService.handleDeviceHeartbeat(dataJo);
         }else if(type.trim().equalsIgnoreCase("device-temp")){
             //--(2)处理环境数据
             //{处理设备环境温度数据}

+ 80 - 31
huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/service/impl/DeviceServiceImpl.java

@@ -82,40 +82,33 @@ public class DeviceServiceImpl implements IDeviceService {
         //2、更新设备注册表(活动状态、活动更新时间,更新类型)
         //3、更新在线统计表(心跳数,心跳最早上传时间,最后一次上传时间)
         //4、更新总状态表表
+        //Step1:更新设备注册表[设置活动状态为1,设置活动状态更新时间]
+        //Step2:更新在线统计[心跳数+1,心跳第一次上传时间,心跳最后一次时间],预先判断该数据是否存在,如果不存在要先添加记录,如果存在就修改数据
+
 
-        //1、{保存设备心跳记录}
-        saveDeviceHeartbeat(dataJo);
-        //2、{更新设备注册表}
-//        updateDeviceRegister(dataJo);
-        //3、{更新在线统计表}
-//        updateDeviceOnline(dataJo);
-        //4、{更新总状态表}
-//        updateAllStatus(dataJo);
-        //--------------------------------------------------------------------------------------------
         System.out.println("dataJo>"+dataJo);
         String deviceCode = dataJo.getString("device");
         //{获取牧场id}
         String farmId = getFarmIdByDeviceCode(deviceCode);
-        System.out.println("## farmId>>"+farmId);
         String todayDateText = new com.huimv.eartag2.common.utils.DateUtil().getTodayDateText();
         java.sql.Date todayDate = new java.sql.Date(new java.util.Date().getTime());
         Timestamp nowTimestamp = new Timestamp(new java.util.Date().getTime());
 
-        //Step1:更新设备注册表[设置活动状态为1,设置活动状态更新时间]
-        //Step2:更新在线统计[心跳数+1,心跳第一次上传时间,心跳最后一次时间],预先判断该数据是否存在,如果不存在要先添加记录,如果存在就修改数据
-        String updateType="设备心跳";
-        //# 更新设备注册表 #
+        //1、{保存设备心跳记录}
+        saveDeviceHeartbeat(dataJo);
+
+         String updateType="设备心跳";
+        //2、{更新设备注册表}
         updateDeviceRegister(farmId, deviceCode,nowTimestamp,updateType);
-        //# 更新在线统计 #
-        updateDeviceOnlineCount(farmId, deviceCode,todayDateText,nowTimestamp,todayDate);
+        //3、{更新在线统计表}
+        updateDeviceOnlineCountWithHeartbeat(farmId, deviceCode,todayDateText,nowTimestamp,todayDate);
 
         //判断该设备编号是否存在缓存在线集合当中;
         Boolean isExist = cacheService.isExistDeviceOnlineSet(farmId, deviceCode, todayDateText);
-        System.out.println("# 处理心跳 isExist >>"+isExist);
         if (!isExist) {
-            System.out.println("## 心跳 2");
-            //# 更新总状态表 #
-            updateDeviceAllStatus(farmId, deviceCode,todayDateText,nowTimestamp,todayDate);
+            //4、{更新总状态表}
+//            updateDeviceAllStatus(farmId, deviceCode,todayDateText,nowTimestamp,todayDate);
+            updateEnvtempOfDeviceAllStatus(farmId, todayDateText,todayDate,nowTimestamp);
 
             //# 将新设备编号加入在线缓存 #
             cacheService.putDeviceToOnlineSet(farmId, deviceCode,todayDateText);
@@ -221,15 +214,43 @@ public class DeviceServiceImpl implements IDeviceService {
     }
 
     //更新在线状态
+    public void updateDeviceOnlineCountWithHeartbeat(String farmId, String deviceCode, String todayDateText, Timestamp nowTimestamp, java.sql.Date todayDate) throws ParseException {
+        String hashKey = BizConst.DEVICE_REGISTER_PREFIX+deviceCode;
+        //计算设备别名
+        String alias = (String)cacheService.getHashProperty(hashKey,"deviceAlias");
+        //读取在线日期
+        EartagDeviceOnlineEntity eartagDeviceOnlineEntity = eartagDeviceOnlineRepo.getDeviceOnline(deviceCode, todayDateText);
+        if (eartagDeviceOnlineEntity == null) {
+            Integer heartbeatTotal = 1;
+            Integer envtempTotal = 0;
+            Timestamp heartbeatFirstTime = nowTimestamp;
+            Timestamp heartbeatLastTime = nowTimestamp;
+            Timestamp envtempFirstTime = null;
+            Timestamp envtempLastTime = null;
+            //{计算耳标总数}
+//            Integer eartagTotal = eartagService.getEartagRegTotalByFarmId(farmId);
+            Integer eartagTotal = 0;
+            //{新建设备在线统计并创建缓存}
+            newDeviceOnline(deviceCode,alias,heartbeatTotal,envtempTotal,eartagTotal,todayDate,farmId,heartbeatFirstTime,heartbeatLastTime,envtempFirstTime,envtempLastTime);
+        }else{
+            eartagDeviceOnlineEntity.setAlias(alias);
+            int heartbeatTotal = eartagDeviceOnlineEntity.getHeartbeatTotal();
+            eartagDeviceOnlineEntity.setHeartbeatTotal(++heartbeatTotal);
+            if(eartagDeviceOnlineEntity.getHeartbeatFirstTime() == null){
+                eartagDeviceOnlineEntity.setHeartbeatFirstTime(nowTimestamp);
+            }
+            eartagDeviceOnlineEntity.setHeartbeatLastTime(nowTimestamp);
+            eartagDeviceOnlineRepo.saveAndFlush(eartagDeviceOnlineEntity);
+            //更新设备在线缓存数据
+            cacheService.putDeviceInOnline(deviceCode,eartagDeviceOnlineEntity);
+        }
+    }
+
+    //更新在线状态
     public void updateDeviceOnlineCount(String farmId, String deviceCode, String todayDateText, Timestamp nowTimestamp, java.sql.Date todayDate) throws ParseException {
-        //# 先判断今天在线记录是否存在 #
-        //# 更新数据表 #
-        //# 更新缓存 #
-        System.out.println("## 心跳 1.2/2.2");
         //
         EartagDeviceOnlineEntity deviceOnlineEntity = deviceOnlineRepo.getDeviceOnline(deviceCode,todayDateText);
         if(deviceOnlineEntity == null){
-            System.out.println("## 心跳 1.2.1/2.2.1");
             //不存在;
             EartagDeviceOnlineEntity newDeviceOnlineEntity = new EartagDeviceOnlineEntity();
             newDeviceOnlineEntity.setDeviceCode(deviceCode);
@@ -492,10 +513,6 @@ public class DeviceServiceImpl implements IDeviceService {
      * @Time        : 14:27
      */
     private void updateDeviceOnlineWithEnvtemp(String farmId, String deviceCode,String envtemp,java.sql.Date todayDate,Timestamp nowTimestamp) throws ParseException {
-        ///////////////////////////////////////////////
-        //Step1:更新数据库
-        //Step2:更新在线缓存
-        ///////////////////////////////////////////////
         String todayDateText = new com.huimv.eartag2.common.utils.DateUtil().getTodayDateText();
         String hashKey = BizConst.DEVICE_REGISTER_PREFIX+deviceCode;
         //计算设备别名
@@ -510,14 +527,18 @@ public class DeviceServiceImpl implements IDeviceService {
             Timestamp envtempFirstTime = nowTimestamp;
             Timestamp envtempLastTime = nowTimestamp;
             //{计算耳标总数}
-            Integer eartagTotal = eartagService.getEartagRegTotalByFarmId(farmId);
+//            Integer eartagTotal = eartagService.getEartagRegTotalByFarmId(farmId);
+            Integer eartagTotal = 0;
             //{新建设备在线统计并创建缓存}
             newDeviceOnline(deviceCode,alias,heartbeatTotal,envtempTotal,eartagTotal,envtemp,todayDate,farmId,heartbeatFirstTime,heartbeatLastTime,envtempFirstTime,envtempLastTime);
         }else{
-            int envtempTotal = eartagDeviceOnlineEntity.getEnvtempTotal();
             eartagDeviceOnlineEntity.setAlias(alias);
+            int envtempTotal = eartagDeviceOnlineEntity.getEnvtempTotal();
             eartagDeviceOnlineEntity.setEnvtempTotal(++envtempTotal);
             eartagDeviceOnlineEntity.setLastEnvtemp(envtemp);
+            if(eartagDeviceOnlineEntity.getEnvtempFirstTime() == null){
+                eartagDeviceOnlineEntity.setEnvtempFirstTime(nowTimestamp);
+            }
             eartagDeviceOnlineEntity.setEnvtempLastTime(nowTimestamp);
             eartagDeviceOnlineRepo.saveAndFlush(eartagDeviceOnlineEntity);
             //更新设备在线缓存数据
@@ -527,6 +548,34 @@ public class DeviceServiceImpl implements IDeviceService {
 
     /**
      * @Method      : newDeviceOnline
+     * @Description : 通过心跳创建在线统计记录
+     * @Params      : [deviceCode, alias, heartbeatTotal, envtempTotal, eartagTotal, todayDate, farmId, heartbeatFirstTime, heartbeatLastTime, envtempFirstTime, envtempLastTime]
+     * @Return      : void
+     * 
+     * @Author      : ZhuoNing
+     * @Date        : 2022/3/14       
+     * @Time        : 21:23
+     */
+    private void newDeviceOnline(String deviceCode, String alias, Integer heartbeatTotal, Integer envtempTotal, Integer eartagTotal, java.sql.Date todayDate, String farmId, Timestamp heartbeatFirstTime, Timestamp heartbeatLastTime, Timestamp envtempFirstTime, Timestamp envtempLastTime) {
+        EartagDeviceOnlineEntity newEartagDeviceOnlineEntity = new EartagDeviceOnlineEntity();
+        newEartagDeviceOnlineEntity.setDeviceCode(deviceCode);
+        newEartagDeviceOnlineEntity.setAlias(alias);
+        newEartagDeviceOnlineEntity.setHeartbeatTotal(heartbeatTotal);;
+        newEartagDeviceOnlineEntity.setEnvtempTotal(envtempTotal);
+        newEartagDeviceOnlineEntity.setEartagTotal(eartagTotal);
+        newEartagDeviceOnlineEntity.setAddDate(todayDate);
+        newEartagDeviceOnlineEntity.setFarmId(farmId);
+        newEartagDeviceOnlineEntity.setHeartbeatFirstTime(heartbeatFirstTime);
+        newEartagDeviceOnlineEntity.setHeartbeatLastTime(heartbeatLastTime);
+        newEartagDeviceOnlineEntity.setEnvtempFirstTime(envtempFirstTime);
+        newEartagDeviceOnlineEntity.setEnvtempLastTime(envtempLastTime);
+        eartagDeviceOnlineRepo.saveAndFlush(newEartagDeviceOnlineEntity);
+        //将新建的设备在线数据更新到设备在线缓存
+        cacheService.putDeviceInOnline(deviceCode,newEartagDeviceOnlineEntity);
+    }
+
+    /**
+     * @Method      : newDeviceOnline
      * @Description : 创建设备在线
      * @Params      : [farmId, deviceCode]
      * @Return      : void