Przeglądaj źródła

完善所有代码。

zhuoning 3 lat temu
rodzic
commit
843eb5cfd9
18 zmienionych plików z 609 dodań i 126 usunięć
  1. 3 3
      huimv-eartag2-platform/huimv-eartag2-common/src/main/java/com/huimv/eartag2/common/dao/entity/EartagDataEntity.java
  2. 4 0
      huimv-eartag2-platform/huimv-eartag2-common/src/main/java/com/huimv/eartag2/common/dao/repo/EartagDeviceEartagCountRepo.java
  3. 2 0
      huimv-eartag2-platform/huimv-eartag2-common/src/main/java/com/huimv/eartag2/common/dao/repo/EartagDeviceRegisterRepo.java
  4. 17 2
      huimv-eartag2-platform/huimv-eartag2-common/src/main/java/com/huimv/eartag2/common/utils/BizConst.java
  5. 0 2
      huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/listener/DeviceListener.java
  6. 1 1
      huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/service/impl/CacheServiceImpl.java
  7. 0 20
      huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/service/impl/DeviceServiceImpl.java
  8. 1 1
      huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/service/impl/EartagServiceImpl.java
  9. 5 17
      huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/listener/EartagListener.java
  10. 43 1
      huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/service/ICacheService.java
  11. 9 0
      huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/service/IDeviceService.java
  12. 3 3
      huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/service/IEartagService.java
  13. 177 10
      huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/service/impl/CacheServiceImpl.java
  14. 61 2
      huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/service/impl/DeviceServiceImpl.java
  15. 279 62
      huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/service/impl/EartagServiceImpl.java
  16. 2 0
      huimv-eartag2-platform/huimv-eartag2-input/src/main/java/com/huimv/eartag2/server/EartagServerHandler2.java
  17. 1 1
      huimv-eartag2-platform/huimv-eartag2-input/src/main/java/com/huimv/eartag2/service/impl/DataServiceImpl.java
  18. 1 1
      huimv-eartag2-platform/huimv-eartag2-process/src/main/java/com/huimv/eartag2/process/service/impl/EartagServiceImpl.java

+ 3 - 3
huimv-eartag2-platform/huimv-eartag2-common/src/main/java/com/huimv/eartag2/common/dao/entity/EartagDataEntity.java

@@ -38,7 +38,7 @@ public class EartagDataEntity implements Serializable {
     private Integer envTemp;
 
     @Column(name = "env_temp1")
-    private Integer envTemp1;
+    private Float envTemp1;
 
     @Column(name = "act")
     private Integer act;
@@ -128,11 +128,11 @@ public class EartagDataEntity implements Serializable {
         return envTemp;
     }
 
-    public void setEnvTemp1(Integer envTemp1) {
+    public void setEnvTemp1(Float envTemp1) {
         this.envTemp1 = envTemp1;
     }
 
-    public Integer getEnvTemp1() {
+    public Float getEnvTemp1() {
         return envTemp1;
     }
 

+ 4 - 0
huimv-eartag2-platform/huimv-eartag2-common/src/main/java/com/huimv/eartag2/common/dao/repo/EartagDeviceEartagCountRepo.java

@@ -17,4 +17,8 @@ public interface EartagDeviceEartagCountRepo extends JpaRepository<EartagDeviceE
     //
     @Query(nativeQuery = true,value = "SELECT * FROM eartag_device_eartag_count WHERE earmark=?1 AND DATE_FORMAT(create_date,'%Y-%m-%d')=DATE_FORMAT(?2,'%Y-%m-%d')")
     List<EartagDeviceEartagCountEntity> getOnlineEartagDeviceByEarmarkAndAddDate(String earmark, String addDate);
+
+    //
+    @Query(nativeQuery = true,value = "SELECT * FROM eartag_device_eartag_count WHERE earmark=?1 AND device_code=?2 AND DATE_FORMAT(create_date,'%Y-%m-%d')=DATE_FORMAT(?3,'%Y-%m-%d')")
+    List<EartagDeviceEartagCountEntity> getEartagDeviceCount(String earmark, String deviceCode, String todayDateText);
 }

+ 2 - 0
huimv-eartag2-platform/huimv-eartag2-common/src/main/java/com/huimv/eartag2/common/dao/repo/EartagDeviceRegisterRepo.java

@@ -21,4 +21,6 @@ public interface EartagDeviceRegisterRepo extends JpaRepository<EartagDeviceRegi
     @Query(nativeQuery = true,value = "SELECT COUNT(*) total FROM eartag_device_register WHERE farm_id=?1 AND device_status=?2")
     List<Object[]> getDeviceCountByFarmIdAndLiveStatus(String farmId, Integer liveStatus);
 
+    @Query(nativeQuery = true,value = "SELECT device_code FROM eartag_device_register WHERE device_status=1")
+    List<Object[]> getDeviceCodeFromDeviceRegister();
 }

+ 17 - 2
huimv-eartag2-platform/huimv-eartag2-common/src/main/java/com/huimv/eartag2/common/utils/BizConst.java

@@ -9,6 +9,9 @@ package com.huimv.eartag2.common.utils;
  * @Create : 2020-12-25
  **/
 public class BizConst {
+    //耳标上一次运动量数值
+    public final static String EARTAG_LAST_ACT_PREFIX = "lastAct:earmark:";
+
     //所有设备注册信息都要加入缓存
 //    public final static String DEVICE_REGISTER_PREFIX = "device_register_";
     public final static String DEVICE_REGISTER_PREFIX = "hash:register:device:";
@@ -39,20 +42,29 @@ public class BizConst {
 //    public final static String SET_FARM_EARMARK_ONLINE_PREFIX = "set_farm_eartag_online_";
     public final static String SET_FARM_EARMARK_ONLINE_PREFIX = "set:onlineEartag:farm:";
 
+    //保存所有设备集合
+    public final static String SET_ALL_DEVICE_PREFIX = "set:all:deviceCode:";
+
     //牧场总状态表+牧场id
     public final static String FARM_ALL_STATUS_PREFIX = "allStatus:farm:";
 
     //设备总数
     public final static String FARM_DEVICE_TOTAL_PREFIX = "deviceTotal:farm:";
     //设备在线总数
-    public final static String FARM_DEVICE_TOTAL_ONLINE_PREFIX = "deviceTotal:online:farm:";
+//    public final static String FARM_DEVICE_TOTAL_ONLINE_PREFIX = "deviceTotal:online:farm:";
     //设备取消数量
     public final static String FARM_DEVICE_CANCEL_PREFIX = "deviceCancel:farm:";
 
     //耳标总数
     public final static String FARM_EARTAG_TOTAL_PREFIX = "eartagTotal:farm:";
     //耳标在线总数
-    public final static String FARM_EARTAG_TOTAL_ONLINE_PREFIX = "eartagTotal:online:farm:";
+//    public final static String FARM_EARTAG_TOTAL_ONLINE_PREFIX = "eartagTotal:online:farm:";
+
+    //耳标设备Hash
+    public final static String ONLINE_EARMARK_DEVICE_PREFIX = "hash:onlineTimes:earmark:device:";
+
+    //耳标最新流水
+    public final static String EARTAG_FLOW_PREFIX = "hash:eartag.flow:earmark:";
 
 
     public final static Integer CODE_DEVICE_ONLINE_NO_EXIST = 10001;
@@ -76,4 +88,7 @@ public class BizConst {
     public final static Integer CODE_ENVTEMP_FLOW_NO_EXIST = 10007;
     public final static String MSG_ENVTEMP_FLOW_NO_EXIST = "该设备暂无温度流水信息.";
 
+    public final static Integer CODE_DEVICE_CODE_EXIST = 10008;
+    public final static String MSG_DEVICE_CODE_EXIST = "该设备编号已经存在.";
+
 }

+ 0 - 2
huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/listener/DeviceListener.java

@@ -50,8 +50,6 @@ public class DeviceListener {
     public void processRawdata(Map RawMap) throws ParseException {
         System.out.println("<<<<<<<<<<<<<<< RawMap>>"+RawMap.toString());
         String askText = RawMap.get("askText").toString();
-//        System.out.println("askText>>"+askText);
-//        System.out.println(" >>>>>>>>>>>>>>>>>>>>>>>> 处理设备队列 >>>>>>>>>>>>>>>>>>>>>>>>");
         //本模块主要执行保存以下4类数据:(其他注册数据,在线数据,状态数据等都是由其他模块工程执行处理-process2模块工程)
         //--保存原始流水数据(原始流水表)
         //--保存设备心跳流水数据(设备心跳流水表)

+ 1 - 1
huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/service/impl/CacheServiceImpl.java

@@ -231,7 +231,7 @@ public class CacheServiceImpl implements ICacheService {
     public boolean isExistEartagOnlineSet(String farmId, String earmark, String todayDateText) {
 //        redisTemplate.opsForSet().add(BizConst.SET_FARM_DEVICE_ONLINE_PREFIX + farmId+"_"+todayDateText, earmark);
         String setKey = BizConst.SET_FARM_EARMARK_ONLINE_PREFIX + farmId+"_"+todayDateText;
-        System.out.println("## eartag.setKey .isExistEartagOnlineSet >>"+setKey+",earmark>>"+earmark);
+//        System.out.println("## eartag.setKey .isExistEartagOnlineSet >>"+setKey+",earmark>>"+earmark);
         return redisTemplate.opsForSet().isMember(setKey, earmark);
     }
 

+ 0 - 20
huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/service/impl/DeviceServiceImpl.java

@@ -421,26 +421,6 @@ public class DeviceServiceImpl implements IDeviceService {
         }else{
             //# 计算耳标总数(耳标注册表)
             EartarFarmAllStatusEntity farmAllStatusEntity = new EartarFarmAllStatusEntity();
-            //{获取处于工作状态的设备数量}
-//            Integer deviceTotal = getDeviceTotalByFarmIdFromDeviceRegister(farmId);
-            //设备在线数量
-//            Integer deviceOnlineSum = cacheService.getDeviceOnlineSum(farmId,todayDateText);
-//            deviceOnlineSum++;
-            //设备离线数量
-//            Integer deviceOfflineSum = 0;
-//            if(deviceTotal > deviceOnlineSum){
-//                deviceOfflineSum = deviceTotal - deviceOnlineSum;
-//            }
-            //{获取注销设备数量}
-//            Integer deviceCancelSum = getDeviceCancelTotalFromDeviceRegister(farmId);
-//            //耳标总数量
-//            Integer eartagTotal = eartagService.getEartagRegTotalByFarmId(farmId);
-//            //耳标在线数量
-//            Integer eartagOnlineSum = eartagService.getEartagOnelineTotal(farmId,todayDateText);
-            //设备在线率
-//            BigDecimal deviceRateBd= new BigDecimal(deviceOnlineSum).divide(new BigDecimal(deviceTotal),1,BigDecimal.ROUND_HALF_UP);
-            //耳标在线率
-//            BigDecimal eartagRateBd= new BigDecimal(eartagOnlineSum).divide(new BigDecimal(eartagTotal),1,BigDecimal.ROUND_HALF_UP);
             farmAllStatusEntity.setDeviceTotal(deviceTotal);
             farmAllStatusEntity.setDeviceOnline(deviceOnlineSum);
             farmAllStatusEntity.setDeviceOffline(deviceOfflineSum);

+ 1 - 1
huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/service/impl/EartagServiceImpl.java

@@ -116,7 +116,7 @@ public class EartagServiceImpl implements IEartagService {
         dataEntity.setEarTemp(Integer.parseInt(eartagJo.getString("earTemp")));
         dataEntity.setEarTemp1(eartagJo.getFloat("earTemp1"));
         dataEntity.setEnvTemp(Integer.parseInt(eartagJo.getString("envTemp")));
-        dataEntity.setEnvTemp1(Integer.parseInt(eartagJo.getString("envTemp")));
+        dataEntity.setEnvTemp1(eartagJo.getFloat("envTemp1"));
         dataEntity.setAct(Integer.parseInt(eartagJo.getString("act")));
         dataEntity.setAct1(Integer.parseInt(eartagJo.getString("act1")));
         dataEntity.setSignal1(Integer.parseInt(eartagJo.getString("signal")));

+ 5 - 17
huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/listener/EartagListener.java

@@ -48,34 +48,21 @@ public class EartagListener {
         System.out.println("<<<<<<<<<<<<<<< RawMap>>"+RawMap.toString());
         String askText = RawMap.get("askText").toString();
         System.out.println("<<<<<<<<<<<<<<<<<<<<<<< 处理耳标 <<<<<<<<<<<<<<<<<<<<<<<");
-//        System.out.println("askText>>"+askText);
         //本模块主要执行保存以下4类数据:(其他注册数据,在线数据,状态数据等都是由其他模块工程执行处理-process2模块工程)
         //--保存原始流水数据(原始流水表)
         //--保存设备心跳流水数据(设备心跳流水表)
         //--保存设备环境流水数据(设备温度流水表)
         //--保存耳标流水数据(耳标流水表)
 
-        //处理请求报文//
+        //{处理请求报文}
         Map askMap = handleAskText(askText);
         String type = askMap.get("type").toString();
         JSONObject dataJo = (JSONObject) askMap.get("data");
+        System.out.println("## dataJo>>"+dataJo);
         if(type.trim().equalsIgnoreCase("eartag")){
-        //--(3)处理耳标数据
-            //--保存耳标流水数据(MySQL)
-
-            //保存耳标流水数据
-//            eartagService.saveEartag(dataJo);
-            //发送耳标数据到MQ
-//            processProducer.sendEartag(dataJo);
             System.out.println("askText>>"+askText);
-            System.out.println("处理耳标数据");
-            //处理耳标数据
+            //{处理耳标数据}
             eartagService.handleEartag(dataJo);
-
-
-
-            /////////////////////////////////////////////////////////////////////////////////////////
-
         }
     }
 
@@ -134,7 +121,7 @@ public class EartagListener {
                 }
             }
             //计算运动量//
-            Integer act1Int = eartagService.countAct(dataArray[1], dataArray[6]);
+            Integer act1Int = eartagService.countAct(dataArray[2], dataArray[6]);
             //命令头
             dataJo.put("cmdHeader", dataArray[0]);
             //采集器id
@@ -148,6 +135,7 @@ public class EartagListener {
             dataJo.put("earTemp1", earTemp);
             //环境温度
             dataJo.put("envTemp", dataArray[5]);
+            dataJo.put("envTemp1", MathUtil.countEnvtemp(dataArray[5],2));
             //运动量
             dataJo.put("act", dataArray[6]);
             dataJo.put("act1", act1Int);

+ 43 - 1
huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/service/ICacheService.java

@@ -3,8 +3,12 @@ package com.huimv.eartag2.eartag.service;
 import com.huimv.eartag2.common.dao.entity.*;
 
 import java.text.ParseException;
+import java.util.Map;
 
 public interface ICacheService {
+    //
+    void putEartagDeviceOnlineCount(String earmark, String deviceCode, String todayDateText, EartagDeviceEartagCountEntity deviceEartagCountEntity);
+
     //证是否存在当天总状态数据
     Boolean isExistTodayFarmAllStatus(String deviceCode) throws ParseException;
 
@@ -41,8 +45,20 @@ public interface ICacheService {
 
     void putEartagToOnlineInSet(String farmId, String earmark, String todayDateText) throws ParseException;
 
+    void putDeviceTotal(Integer total, String farmId);
+
+    Integer getDeviceOnlineSum(String farmId, String todayDateText);
+
+    Integer getDeviceCancel(String farmId);
+
+    void putDeviceCancel(Integer total, String farmId);
+
+    Integer getEartagTotal(String farmId);
+
+    void putEartagTotal(Integer total, String farmId);
+
     //从缓存读取在线耳标数量
-    void getEartagOnlineTotalFromCache(String farmId, String todayDateText);
+    Integer getEartagOnlineTotalFromCache(String farmId, String todayDateText);
 
     //更新耳标注册消息缓存
     void putEartagRegister(String earmark, EartagEartagRegisterEntity eartagRegisterEntity);
@@ -52,4 +68,30 @@ public interface ICacheService {
 
     //
     Integer getDeviceTotal(String farmId);
+
+    //将耳标流水加入到缓存
+    void putEartagFlowToCache(String earmark, EartagDataEntity dataEntity);
+
+    //从缓存读取设备注册信息
+    Map<Object, Object> getDeviceRegister(String deviceCode);
+
+    //
+    public Map<Object, Object> getHashEntries(String hashKey);
+
+    //
+    public Object getHashKeyProperty(String hashKey, String fieldName);
+
+    void putHashKeyProperty(String hashKey, String fieldName, Object value);
+
+    //从缓存读取耳标设备关联数据
+    Map<Object, Object> getEartagDeviceOnlineCountEntries(String earmark, String deviceCode, String todayDateText);
+
+    //耳标设备在线次数关联自增
+    void countEartagDeviceOnlineTimes(String earmark, String deviceCode, int total, EartagDeviceEartagCountEntity deviceEartagCountEntity);
+
+    //获取上次耳标运动量数值
+    Object getEartagLastAct(String deviceCode);
+
+    //设置耳标上次运动数值
+    void putEartagAct(String earmark, String nowAct);
 }

+ 9 - 0
huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/service/IDeviceService.java

@@ -5,6 +5,15 @@ import com.alibaba.fastjson.JSONObject;
 import java.text.ParseException;
 
 public interface IDeviceService {
+    //计算处于不同生存状态的设备数量
+    Integer getDeviceSum(String farmId, Integer liveStatus);
+
+    //计算注销设备数量
+    int getDeviceCancelTotalFromDeviceRegister(String farmId);
+
+    //计算设备总数
+    int getDeviceTotalByFarmIdFromDeviceRegister(String farmId);
+
     String getFarmIdByDeviceCode(String deviceCode);
 
     //保存心跳数据

+ 3 - 3
huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/service/IEartagService.java

@@ -2,13 +2,13 @@ package com.huimv.eartag2.eartag.service;
 
 import com.alibaba.fastjson.JSONObject;
 
+import java.sql.Timestamp;
 import java.text.ParseException;
 
 public interface IEartagService {
     //计算运动量
-    Integer countAct(String deviceCode, String nowAct);
-    //保存耳标数据
-    void saveEartag(JSONObject dataJo);
+    Integer countAct(String earmark, String nowAct);
 
+    //
     void handleEartag(JSONObject dataJo) throws ParseException;
 }

+ 177 - 10
huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/service/impl/CacheServiceImpl.java

@@ -1,5 +1,7 @@
 package com.huimv.eartag2.eartag.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.huimv.eartag2.common.dao.entity.*;
 import com.huimv.eartag2.common.dao.repo.EartagDeviceRegisterRepo;
 import com.huimv.eartag2.common.utils.BizConst;
@@ -14,6 +16,7 @@ import org.springframework.stereotype.Service;
 import java.text.ParseException;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -34,6 +37,91 @@ public class CacheServiceImpl implements ICacheService {
     @Value("${redis.expire.eartag_online_set}")
     private Integer eartagOnlineSetExpire;
 
+    /**
+     * @Method      : getDeviceRegister
+     * @Description : 从缓存读取设备注册信息 Map<Object, Object> registerMap = cacheService.getDeviceRegister(deviceCode)
+     * @Params      : [deviceCode]
+     * @Return      : java.util.Map<java.lang.Object,java.lang.Object>
+     *
+     * @Author      : ZhuoNing
+     * @Date        : 2022/3/15
+     * @Time        : 10:43
+     */
+    @Override
+    public Map<Object, Object> getDeviceRegister(String deviceCode) {
+        String hashKey = BizConst.DEVICE_REGISTER_PREFIX+deviceCode;
+        Map<Object, Object> entriesMap = redisTemplate.opsForHash().entries(hashKey);
+        return entriesMap;
+    }
+
+    @Override
+    public Map<Object, Object> getHashEntries(String hashKey) {
+//        String hashKey = BizConst.DEVICE_REGISTER_PREFIX+deviceCode;
+        Map<Object, Object> entriesMap = redisTemplate.opsForHash().entries(hashKey);
+        return entriesMap;
+    }
+
+    @Override
+    public Object getHashKeyProperty(String hashKey, String fieldName) {
+        Object obj = redisTemplate.opsForHash().get(hashKey, fieldName);
+        return obj;
+    }
+
+    @Override
+    public void putHashKeyProperty(String hashKey, String fieldName, Object value){
+        redisTemplate.opsForHash().put(hashKey,fieldName,value);
+    }
+
+    @Override
+    public Map<Object, Object> getEartagDeviceOnlineCountEntries(String earmark, String deviceCode, String todayDateText) {
+//        String hashKey = BizConst.ONLINE_EARMARK_DEVICE_PREFIX+earmark+":"+deviceCode+":"+todayDateText;
+        String hashKey = BizConst.ONLINE_EARMARK_DEVICE_PREFIX+earmark+":"+deviceCode;
+        return getHashEntries(hashKey);
+    }
+
+    @Override
+    public void countEartagDeviceOnlineTimes(String earmark, String deviceCode, int total, EartagDeviceEartagCountEntity deviceEartagCountEntity) {
+        String hashKey = BizConst.ONLINE_EARMARK_DEVICE_PREFIX+earmark+":"+deviceCode;
+//        redisTemplate.opsForHash().increment(hashKey,"total",1);  // Error
+
+//        Integer total = (Integer) getHashKeyProperty(hashKey, "total");
+//        putHashKeyProperty(hashKey,"total",++total);
+        Map map = getHashEntries(hashKey);
+        if(map.size()>0){
+            putHashKeyProperty(hashKey,"total",total);
+        }else{
+            Map newMap = JSON.parseObject(JSONObject.toJSONString(deviceEartagCountEntity),Map.class);
+            redisTemplate.opsForHash().putAll(hashKey,newMap);
+        }
+    }
+
+    @Override
+    public Object getEartagLastAct(String earmark) {
+        String valuekey = BizConst.EARTAG_LAST_ACT_PREFIX+earmark;
+        return redisTemplate.opsForValue().get(valuekey);
+    }
+
+    @Override
+    public void putEartagAct(String earmark, String nowAct) {
+        String valuekey = BizConst.EARTAG_LAST_ACT_PREFIX+earmark;
+        redisTemplate.opsForValue().set(valuekey,nowAct);
+    }
+
+    @Override
+    public void putEartagDeviceOnlineCount(String earmark, String deviceCode, String todayDateText, EartagDeviceEartagCountEntity deviceEartagCountEntity){
+        //将实体类对象转成Map对象
+        Map map = JSON.parseObject(JSONObject.toJSONString(deviceEartagCountEntity),Map.class);
+//        Map map2 = (Map)JSONObject.parse(JSONObject.toJSONString(deviceEartagCountEntity));
+//        Map map3 = (Map)JSON.parse(JSONObject.toJSONString(deviceEartagCountEntity));
+//        Map map4 = (Map)JSON.parseObject(JSONObject.toJSONString(deviceEartagCountEntity));
+//        Map<String, Object> map = JSON.parseObject(JSONObject.toJSONString(deviceEartagCountEntity), new TypeReference<Map<String, Object>>(){} );
+
+        //        String hashKey = BizConst.ONLINE_EARMARK_DEVICE_PREFIX+earmark+":"+deviceCode+":"+todayDateText;
+        String hashKey = BizConst.ONLINE_EARMARK_DEVICE_PREFIX+earmark+":"+deviceCode;
+        redisTemplate.opsForHash().putAll(hashKey,map);
+    }
+
+
     @Override
     public Boolean isExistTodayFarmAllStatus(String deviceCode) throws ParseException {
         System.out.println("isExistTodayFarmAllStatus 2.deviceCode>>"+deviceCode);
@@ -138,13 +226,12 @@ public class CacheServiceImpl implements ICacheService {
         allStatusMap.put("updateTime",farmAllStatusEntity.getUpdateTime());
         allStatusMap.put("createDate",farmAllStatusEntity.getCreateDate());
 
-        System.out.println("allStatusMap>>"+allStatusMap.toString());
         redisTemplate.opsForHash().putAll(BizConst.FARM_ALL_STATUS_PREFIX+farmId, allStatusMap);
     }
 
     @Override
     public boolean isExistDeviceOnlineSet(String farmId, String deviceCode, String todayDateText) {
-        return redisTemplate.opsForSet().isMember(BizConst.SET_FARM_DEVICE_ONLINE_PREFIX + farmId+"_"+todayDateText, deviceCode);
+        return redisTemplate.opsForSet().isMember(BizConst.SET_FARM_DEVICE_ONLINE_PREFIX + farmId+":"+todayDateText, deviceCode);
     }
 
     /**
@@ -160,7 +247,7 @@ public class CacheServiceImpl implements ICacheService {
     @Override
     public void putDeviceToOnline(String farmId, String deviceCode, String todayDateText) {
         System.out.println("## 心跳 2.4");
-        String setKey = BizConst.SET_FARM_DEVICE_ONLINE_PREFIX + farmId+"_"+todayDateText;
+        String setKey = BizConst.SET_FARM_DEVICE_ONLINE_PREFIX + farmId+":"+todayDateText;
         redisTemplate.opsForSet().add(setKey, deviceCode);
         redisTemplate.expire(setKey,eartagOnlineSetExpire , TimeUnit.HOURS);
     }
@@ -219,21 +306,70 @@ public class CacheServiceImpl implements ICacheService {
     @Override
     public boolean isExistEartagOnlineSet(String farmId, String earmark, String todayDateText) {
 //        redisTemplate.opsForSet().add(BizConst.SET_FARM_DEVICE_ONLINE_PREFIX + farmId+"_"+todayDateText, earmark);
-        String setKey = BizConst.SET_FARM_EARMARK_ONLINE_PREFIX + farmId+"_"+todayDateText;
-        System.out.println("## eartag.setKey .isExistEartagOnlineSet >>"+setKey+",earmark>>"+earmark);
+        String setKey = BizConst.SET_FARM_EARMARK_ONLINE_PREFIX + farmId+":"+todayDateText;
+//        System.out.println("## eartag.setKey .isExistEartagOnlineSet >>"+setKey+",earmark>>"+earmark);
         return redisTemplate.opsForSet().isMember(setKey, earmark);
     }
 
     @Override
     public void putEartagToOnlineInSet(String farmId, String earmark, String todayDateText) throws ParseException {
-        String setKey = BizConst.SET_FARM_EARMARK_ONLINE_PREFIX + farmId+"_"+todayDateText;
-        System.out.println("## eartag.setKey .putEartagToOnlineInSet>>"+setKey+",earmark>>"+earmark);
+        String setKey = BizConst.SET_FARM_EARMARK_ONLINE_PREFIX + farmId+":"+todayDateText;
+//        System.out.println("## eartag.setKey .putEartagToOnlineInSet>>"+setKey+",earmark>>"+earmark);
         redisTemplate.opsForSet().add(setKey, earmark);
+        //设置25小时过期
         redisTemplate.expire(setKey,eartagOnlineSetExpire , TimeUnit.HOURS);
 //        Set<String> resultSet = redisTemplate.opsForSet().members(setKey);
 //        System.out.println("## "+setKey+">>"+resultSet.size()+" >>"+resultSet);
     }
 
+    @Override
+    public void putDeviceTotal(Integer total, String farmId) {
+        String valueKey = BizConst.FARM_DEVICE_TOTAL_PREFIX+farmId;
+        redisTemplate.opsForValue().set(valueKey,total);
+    }
+
+    @Override
+    public Integer getDeviceOnlineSum(String farmId, String todayDateText) {
+        String setKey = BizConst.SET_FARM_DEVICE_ONLINE_PREFIX + farmId+":"+todayDateText;
+        Set<String> resultSet = redisTemplate.opsForSet().members(setKey);
+        return resultSet.size();
+    }
+
+    @Override
+    public Integer getDeviceCancel(String farmId) {
+        String valueKey = BizConst.FARM_DEVICE_CANCEL_PREFIX+farmId;
+//        String value = (String) redisTemplate.opsForValue().get(valueKey);
+        Object obj = redisTemplate.opsForValue().get(valueKey);
+        if(obj == null){
+            return null;
+        }else{
+            return Integer.parseInt(String.valueOf(obj));
+        }
+    }
+
+    @Override
+    public void putDeviceCancel(Integer total, String farmId) {
+        String valueKey = BizConst.FARM_DEVICE_CANCEL_PREFIX+farmId;
+        redisTemplate.opsForValue().set(valueKey,total);
+    }
+
+    @Override
+    public Integer getEartagTotal(String farmId) {
+        String valueKey = BizConst.FARM_EARTAG_TOTAL_PREFIX+farmId;
+        Object obj = redisTemplate.opsForValue().get(valueKey);
+        if(obj != null){
+            return Integer.parseInt(String.valueOf(obj));
+        }else{
+            return null;
+        }
+    }
+
+    @Override
+    public void putEartagTotal(Integer total, String farmId) {
+        String valueKey = BizConst.FARM_EARTAG_TOTAL_PREFIX+farmId;
+        redisTemplate.opsForValue().set(valueKey,total);
+    }
+
     /**
      * @Method      : getEartagOnlineTotalFromCache
      * @Description : 返回集合缓存的数量;
@@ -245,9 +381,9 @@ public class CacheServiceImpl implements ICacheService {
      * @Time        : 10:55
      */
     @Override
-    public void getEartagOnlineTotalFromCache(String farmId, String todayDateText) {
-        String setKey = BizConst.SET_FARM_EARMARK_ONLINE_PREFIX + farmId+"_"+todayDateText;
-        redisTemplate.opsForSet().members(setKey).size();
+    public Integer getEartagOnlineTotalFromCache(String farmId, String todayDateText) {
+        String setKey = BizConst.SET_FARM_EARMARK_ONLINE_PREFIX + farmId+":"+todayDateText;
+        return redisTemplate.opsForSet().members(setKey).size();
     }
 
     /**
@@ -324,6 +460,37 @@ public class CacheServiceImpl implements ICacheService {
     }
 
     /**
+     * @Method      : putEartagFlowToCache
+     * @Description : 将最新的耳标流水保存到缓存中
+     * @Params      : [earmark, dataEntity]
+     * @Return      : void
+     * 
+     * @Author      : ZhuoNing
+     * @Date        : 2022/3/15       
+     * @Time        : 10:09
+     */
+    @Override
+    public void putEartagFlowToCache(String earmark, EartagDataEntity dataEntity) {
+        Map<String, String> map = new HashMap<>();
+        map.put("cmdHeader", dataEntity.getCmdHeader());
+        map.put("device", dataEntity.getDevice());
+        map.put("earmark", dataEntity.getEarmark());
+        map.put("bat", dataEntity.getBat().toString());
+        map.put("earTemp", dataEntity.getEarTemp().toString());
+        map.put("earTemp1", dataEntity.getEarTemp1().toString());
+        map.put("envTemp", dataEntity.getEnvTemp().toString());
+        map.put("envTemp1", dataEntity.getEnvTemp1().toString());
+        map.put("act", dataEntity.getAct().toString());
+        map.put("act1", dataEntity.getAct1().toString());
+        map.put("signal1", dataEntity.getSignal1().toString());
+        map.put("askTime", dataEntity.getAskTime());
+        map.put("other", dataEntity.getOther());
+        map.put("addTime", dataEntity.getAddTime().toString());
+        //为hash结构设置多个键值对(hmset)
+        redisTemplate.opsForHash().putAll(BizConst.EARTAG_FLOW_PREFIX+earmark, map);
+    }
+
+    /**
      * @Method : RegisterEntityToMap
      * @Description :
      * @Params : [deviceRegisterEntity]

+ 61 - 2
huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/service/impl/DeviceServiceImpl.java

@@ -11,6 +11,7 @@ import com.huimv.eartag2.common.dao.repo.EartagHeartbeatRepo;
 import com.huimv.eartag2.common.dao.repo.EartagRawRepo;
 //import com.huimv.eartag2.common.utils.DateUtil;
 //import com.huimv.eartag2.common.utils.MathUtil;
+import com.huimv.eartag2.eartag.service.ICacheService;
 import com.huimv.eartag2.eartag.service.IDeviceService;
 import com.huimv.eartag2.eartag.utils.DateUtil;
 import com.huimv.eartag2.eartag.utils.MathUtil;
@@ -22,6 +23,7 @@ import java.sql.Timestamp;
 import java.text.ParseException;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -47,12 +49,69 @@ public class DeviceServiceImpl implements IDeviceService {
     private EartagEnvRepo envRepo;
     @Autowired
     private EartagDeviceRegisterRepo deviceRegisterRepo;
+    @Autowired
+    private ICacheService cacheService;
+
+    //计算处于不同生存状态的设备数量
+    @Override
+    public Integer getDeviceSum(String farmId, Integer liveStatus){
+        //# 计算处于工作状态的设备总数(设备注册表)
+        List<Object[]> deviceRegList = deviceRegisterRepo.getDeviceCountByFarmIdAndLiveStatus(farmId,liveStatus);
+        Object[] deviceRegObj = (Object[]) deviceRegList.get(0);
+        //设备总数
+        return Integer.parseInt(deviceRegObj[0].toString());
+    }
+
+    //计算注销设备数量
+    @Override
+    public int getDeviceCancelTotalFromDeviceRegister(String farmId) {
+        //从缓存钟读取设备总数
+        Integer deviceCancel = cacheService.getDeviceCancel(farmId);
+        if(deviceCancel != null) {
+            return deviceCancel;
+        }else {
+            //注销状态
+            Integer liveStatus = 2;
+            List<Object[]> deviceCancelList = deviceRegisterRepo.getDeviceCountByFarmIdAndLiveStatus(farmId,liveStatus);
+            Object[] deviceRegObj = (Object[]) deviceCancelList.get(0);
+            Integer total = Integer.parseInt(deviceRegObj[0].toString());
+            //设置注销缓存
+            cacheService.putDeviceCancel(total,farmId);
+            //设备总数
+            return total;
+        }
+    }
 
+    //计算设备总数
+    @Override
+    public int getDeviceTotalByFarmIdFromDeviceRegister(String farmId){
+        //从缓存钟读取设备总数
+        Integer deviceTotal = cacheService.getDeviceTotal(farmId);
+        if(deviceTotal != null) {
+            return deviceTotal;
+        }else{
+            List<Object[]> deviceRegList = deviceRegisterRepo.getDeviceCountByFarmId(farmId);
+            Object[] deviceRegObj = (Object[]) deviceRegList.get(0);
+            Integer total = Integer.parseInt(deviceRegObj[0].toString());
+            //设置缓存
+            cacheService.putDeviceTotal(total,farmId);
+            //设备总数
+            return total;
+        }
+    }
 
     @Override
     public String getFarmIdByDeviceCode(String deviceCode) {
-        EartagDeviceRegisterEntity deviceRegisterEntity = deviceRegisterRepo.getDeviceRegister(deviceCode);
-        return deviceRegisterEntity.getFarmId();
+        //
+        String farmId = (String)cacheService.getFarmIdByDeviceCode(deviceCode);
+        if(farmId != null && farmId.trim().length()>0){
+            return farmId;
+        }else{
+            EartagDeviceRegisterEntity deviceRegisterEntity = deviceRegisterRepo.getDeviceRegister(deviceCode);
+            //{将设备注册信息保存到缓存中}
+            cacheService.putDeviceRegister(deviceCode,deviceRegisterEntity);
+            return deviceRegisterEntity.getFarmId();
+        }
     }
 
     /**

+ 279 - 62
huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/service/impl/EartagServiceImpl.java

@@ -1,14 +1,8 @@
 package com.huimv.eartag2.eartag.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
-import com.huimv.eartag2.common.dao.entity.EartagDataEntity;
-import com.huimv.eartag2.common.dao.entity.EartagEartagOnlineEntity;
-import com.huimv.eartag2.common.dao.entity.EartagEartagRegisterEntity;
-import com.huimv.eartag2.common.dao.entity.EartarFarmAllStatusEntity;
-import com.huimv.eartag2.common.dao.repo.EartagDataRepo;
-import com.huimv.eartag2.common.dao.repo.EartagEartagOnlineRepo;
-import com.huimv.eartag2.common.dao.repo.EartagEartagRegisterRepo;
-import com.huimv.eartag2.common.dao.repo.EartarFarmAllStatusRepo;
+import com.huimv.eartag2.common.dao.entity.*;
+import com.huimv.eartag2.common.dao.repo.*;
 import com.huimv.eartag2.common.utils.DateUtil;
 import com.huimv.eartag2.eartag.service.ICacheService;
 import com.huimv.eartag2.eartag.service.IDeviceService;
@@ -18,6 +12,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.sql.Time;
 import java.sql.Timestamp;
 import java.text.ParseException;
 import java.util.Date;
@@ -50,49 +46,192 @@ public class EartagServiceImpl implements IEartagService {
     private EartagEartagOnlineRepo eartagOnlineRepo;
     @Autowired
     private EartarFarmAllStatusRepo farmAllStatusRepo;
+    @Autowired
+    private EartarFarmAllStatusRepo eartagFarmAllStatusRepo;
+    @Autowired
+    private EartagDeviceEartagCountRepo deviceEartagCountRepo;
 
     @Override
     public void handleEartag(JSONObject dataJo) throws ParseException {
-        //保存耳标流水
-        saveEartag(dataJo);
-
         //设备编码
         String deviceCode = dataJo.getString("device");
-//        System.out.println("444 设备编号>>" + deviceCode);
         //耳标号
         String earmark = dataJo.getString("earmark");
-//        System.out.println("444 耳标号>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" + earmark);
-
-        //--保存设备注册数据(MySQL,Redis)
-        //--保存设备状态数据(MySQL,Redis)
         String todayDateText = new DateUtil().getTodayDateText();
         java.sql.Date todayDate = new java.sql.Date(new java.util.Date().getTime());
         Timestamp nowTimestamp = new Timestamp(new java.util.Date().getTime());
-
-//        System.out.println("## eartagOnlineSetExpire>>"+eartagOnlineSetExpire);
         //--设备在线统计表
         //--设备状态每日统计表
         //--设备和耳标总状态表
         //获取牧场id
         String farmId = deviceService.getFarmIdByDeviceCode(deviceCode);
+        //{保存耳标流水}
+        saveEartagFlow(dataJo,nowTimestamp);
 
-        //Step1:更新耳标注册数据
-        updateEartagRegister(earmark,deviceCode,nowTimestamp,farmId);
+        //{更新耳标注册数据}
+        updateEartagRegister(earmark,deviceCode,nowTimestamp,todayDate,farmId);
 
-        //Step2:更新耳标在线数据
+        //{更新耳标在线数据}
         updateEartagOnline(earmark,deviceCode,todayDateText,todayDate,nowTimestamp,dataJo,farmId);
 
+        //{更新耳标设备在线统计}
+        updateEartagDeviceOnlineCount(earmark,deviceCode,todayDateText,todayDate,farmId);
+
         //判断该设备编号是否存在牧场缓存在线集合当中;
         if (!cacheService.isExistEartagOnlineSet(farmId, earmark,todayDateText)) {
-
             //更新总状态数据
-            updateEartagOfAllStatus(earmark,deviceCode,todayDateText,farmId);
-
+            updateEartagPropertyOfAllStatus(farmId, todayDateText,todayDate,nowTimestamp);
             //将耳标号加入到耳标在线集合当中
             cacheService.putEartagToOnlineInSet(farmId, earmark,todayDateText);
         }
     }
 
+    //更新耳标设备在线次数
+    private void updateEartagDeviceOnlineCount(String earmark, String deviceCode, String todayDateText, java.sql.Date todayDate, String farmId) {
+        //从缓存读取耳标关联数据
+//        Map timesMap = cacheService.getEartagDeviceOnlineCountEntries(earmark,deviceCode,todayDateText);
+//        System.out.println("###################### timesMap>>"+timesMap);
+//        if(timesMap.size()==0){
+//            System.out.println("==0");
+//        }else{
+//            System.out.println("!=0");
+//        }
+        //{读取耳标设备关联统计}
+        List<EartagDeviceEartagCountEntity> deviceEartagCountEntityList = deviceEartagCountRepo.getEartagDeviceCount(earmark,deviceCode,todayDateText);
+        if(deviceEartagCountEntityList.size()==0){
+            Integer count = 1;
+            //{新建耳标设备关联统计}
+            newEartagDeviceCount(earmark,deviceCode,count,todayDateText,todayDate,farmId);
+        }else{
+            //更新次数
+            EartagDeviceEartagCountEntity deviceEartagCountEntity = deviceEartagCountEntityList.get(0);
+            int total = deviceEartagCountEntity.getTotal();
+            ++total;
+            deviceEartagCountEntity.setTotal(total);
+            deviceEartagCountRepo.saveAndFlush(deviceEartagCountEntity);
+            //缓存里计数+1
+            cacheService.countEartagDeviceOnlineTimes(earmark,deviceCode,total,deviceEartagCountEntity);
+        }
+    }
+
+    //新建耳标设备关联统计记录
+    private void newEartagDeviceCount(String earmark, String deviceCode, Integer count, String todayDateText, java.sql.Date todayDate, String farmId) {
+        EartagDeviceEartagCountEntity newDeviceEartagCountEntity = new EartagDeviceEartagCountEntity();
+        newDeviceEartagCountEntity.setDeviceCode(deviceCode);
+        newDeviceEartagCountEntity.setEarmark(earmark);
+        newDeviceEartagCountEntity.setTotal(count);
+        newDeviceEartagCountEntity.setCreateDate(todayDate);
+        newDeviceEartagCountEntity.setFarmId(farmId);
+        deviceEartagCountRepo.saveAndFlush(newDeviceEartagCountEntity);
+        //将数据保存到缓存中
+        cacheService.putEartagDeviceOnlineCount(earmark,deviceCode,todayDateText,newDeviceEartagCountEntity);
+    }
+
+    //更新设备环境信息
+    public void updateEartagPropertyOfAllStatus(String farmId, String todayDateText, java.sql.Date todayDate, Timestamp nowTimestamp) throws ParseException {
+        //{获取处于工作状态的设备数量}
+        Integer deviceTotal = deviceService.getDeviceTotalByFarmIdFromDeviceRegister(farmId);
+        //设备在线数量
+        Integer deviceOnlineSum = cacheService.getDeviceOnlineSum(farmId,todayDateText);
+        //设备离线数量
+        Integer deviceOfflineSum = 0;
+        if(deviceTotal > deviceOnlineSum){
+            deviceOfflineSum = deviceTotal - deviceOnlineSum;
+        }
+        //设备在线率
+        BigDecimal deviceRateBd= new BigDecimal(deviceOnlineSum).divide(new BigDecimal(deviceTotal),1,BigDecimal.ROUND_HALF_UP);
+        Float deviceOnlineRate = Float.parseFloat(deviceRateBd.toString());
+        //{获取注销设备数量}
+        Integer deviceCancelSum = deviceService.getDeviceCancelTotalFromDeviceRegister(farmId);
+        //耳标总数量 eartagService.
+        Integer eartagTotal = getEartagRegTotalByFarmId(farmId);
+        //耳标在线数量 eartagService.
+        Integer eartagOnlineSum = getEartagOnelineTotal(farmId,todayDateText);
+        eartagOnlineSum++;
+        //耳标在线率
+        BigDecimal eartagRateBd= new BigDecimal(eartagOnlineSum).divide(new BigDecimal(eartagTotal),1,BigDecimal.ROUND_HALF_UP);
+        Float eartagOnlineRate = Float.parseFloat(eartagRateBd.toString());
+        //
+        EartarFarmAllStatusEntity farmAllStatusEntity = eartagFarmAllStatusRepo.getOneByFarmIdAndCreateDate(farmId,todayDateText);
+        if(farmAllStatusEntity == null){
+            //{新建设备状态记录并更新缓存cache}
+            newFarmAllStatus(farmId,todayDate,nowTimestamp,deviceTotal,deviceOnlineSum,deviceOfflineSum,deviceCancelSum,deviceOnlineRate,eartagTotal,eartagOnlineSum,eartagOnlineRate);
+        }else{
+            //计算设备状态并更新缓存cache(在线数+1,离线数-1,计算设备在线率)
+            farmAllStatusEntity.setDeviceTotal(deviceTotal);
+            farmAllStatusEntity.setDeviceOnline(deviceOnlineSum);
+            farmAllStatusEntity.setDeviceOffline(deviceOfflineSum);
+            farmAllStatusEntity.setDeviceRate(deviceOnlineRate);
+            farmAllStatusEntity.setDeviceCancel(deviceCancelSum);
+            farmAllStatusEntity.setEartagTotal(eartagTotal);
+            farmAllStatusEntity.setEartagOnline(eartagOnlineSum);
+            farmAllStatusEntity.setEartagRate(eartagOnlineRate);
+            farmAllStatusEntity.setUpdateTime(nowTimestamp);
+            eartagFarmAllStatusRepo.saveAndFlush(farmAllStatusEntity);
+            //{同步更新牧场总状态缓存相关字段}
+            cacheService.flashAllStatusCache(farmId,farmAllStatusEntity);
+        }
+    }
+
+    //# 新建总状态记录 #
+    private void newFarmAllStatus(String farmId, java.sql.Date todayDate, Timestamp nowTimestamp, Integer deviceTotal, Integer deviceOnlineSum, Integer deviceOfflineSum, Integer deviceCancelSum, Float deviceOnlineRate, Integer eartagTotal, Integer eartagOnlineSum, Float eartagOnlineRate) {
+        Integer liveStatus = 1;
+        if(deviceService.getDeviceSum(farmId,liveStatus) == 0){
+            log.error("该牧场没有任何处于工作状态的采集器设备.");
+        }else{
+            //# 计算耳标总数(耳标注册表)
+            EartarFarmAllStatusEntity farmAllStatusEntity = new EartarFarmAllStatusEntity();
+            farmAllStatusEntity.setDeviceTotal(deviceTotal);
+            farmAllStatusEntity.setDeviceOnline(deviceOnlineSum);
+            farmAllStatusEntity.setDeviceOffline(deviceOfflineSum);
+            farmAllStatusEntity.setDeviceRate(deviceOnlineRate);
+            farmAllStatusEntity.setDeviceCancel(deviceCancelSum);
+            farmAllStatusEntity.setEartagTotal(eartagTotal);
+            farmAllStatusEntity.setEartagOnline(eartagOnlineSum);
+            farmAllStatusEntity.setEartagRate(eartagOnlineRate);
+            farmAllStatusEntity.setFarmId(farmId);
+            farmAllStatusEntity.setUpdateTime(nowTimestamp);
+            farmAllStatusEntity.setCreateDate(todayDate);
+            eartagFarmAllStatusRepo.saveAndFlush(farmAllStatusEntity);
+            //设置总状态缓存
+            cacheService.flashAllStatusCache(farmId,farmAllStatusEntity);
+        }
+    }
+
+    //
+    public Integer getEartagOnelineTotal(String farmId, String todayDateText) {
+        return cacheService.getEartagOnlineTotalFromCache(farmId,todayDateText);
+    }
+
+    //
+    public Integer getEartagRegTotalByFarmId(String farmId){
+        //从缓存读取耳标总数
+        Integer eartagTotal = cacheService.getEartagTotal(farmId);
+        if(eartagTotal != null){
+            return eartagTotal;
+        }else{
+//            List<Object[]> eartagRegList = eartagRegisterRepo.getEartagCountByFarmId(farmId);
+//            Object[] eartagRegObj = (Object[]) eartagRegList.get(0);
+//            Integer total = Integer.parseInt(eartagRegObj[0].toString());
+            ///
+            Integer liveStatus = 1;
+            //{读取处于工作状态的耳标总数}
+            Integer total = getEartagSum(farmId,liveStatus);
+            //设置耳标总数缓存
+            cacheService.putEartagTotal(total,farmId);
+            //处于工作状态的耳标总数
+            return total;
+        }
+    }
+
+    //计算处于不同生存状态的耳标数量
+    private Integer getEartagSum(String farmId,Integer liveStatus){
+        List<Object[]> eartagRegList = eartagRegisterRepo.getEartagCountByFarmId(farmId,liveStatus);
+        Object[] eartagRegObj = (Object[]) eartagRegList.get(0);
+        //处于工作状态的耳标总数
+        return Integer.parseInt(eartagRegObj[0].toString());
+    }
+
     //状态更新
     public void updateEartagOfAllStatus(String earmark, String deviceCode,String todayDateText, String farmId) {
         //# 判断设备和耳标总状态表是否存在
@@ -101,7 +240,7 @@ public class EartagServiceImpl implements IEartagService {
         EartarFarmAllStatusEntity farmAllStatusEntity = farmAllStatusRepo.getOneByFarmIdAndCreateDate(farmId,todayDateText);
         if(farmAllStatusEntity == null){
             //#获取耳标注册数量#
-            int eartagTotal =  getEartagRegTotalByFarmId(farmId);
+            int eartagTotal =  getEartagRegTotalByFarmId_1(farmId);
             //#总状态记录不存在;
             EartarFarmAllStatusEntity newFarmAllStatusEntity = new EartarFarmAllStatusEntity();
             newFarmAllStatusEntity.setEartagTotal(eartagTotal);
@@ -116,7 +255,7 @@ public class EartagServiceImpl implements IEartagService {
     }
 
     //获取耳标注册数量
-    public Integer getEartagRegTotalByFarmId(String farmId){
+    public Integer getEartagRegTotalByFarmId_1(String farmId){
         int eartagTotal = 0;
         List<Object[]> eartagRegList = eartagRegisterRepo.getEartagCountByFarmId(farmId);
         Object[] eartagRegObj = (Object[]) eartagRegList.get(0);
@@ -129,6 +268,46 @@ public class EartagServiceImpl implements IEartagService {
         //# 判断耳标在线统计数据是否存在
         //      存在,则更新上传记录数、最后上传时间、环境温度,耳根温度,并将上面数据更新到缓存数据中;
         //      不存在,则创建耳标在线记录,并更新到缓存数据中;
+        String envTemp = eartagJo.getString("envTemp1");
+        String earTemp = eartagJo.getString("earTemp1");
+        EartagEartagOnlineEntity eartagOnlineEntity = eartagOnlineRepo.getOneByEarmarkAndFarmId(earmark,todayDateText,farmId);
+        if(eartagOnlineEntity == null){
+            int total = 1;
+            //{新建耳标在线记录}
+            newEartagOnline(earmark,total,nowTimestamp,earTemp,envTemp,todayDate,farmId);
+        }else{
+            int total = eartagOnlineEntity.getTotal();
+            eartagOnlineEntity.setTotal(++total);
+            eartagOnlineEntity.setLastTime(nowTimestamp);
+            eartagOnlineEntity.setEnvTemp(envTemp);
+            eartagOnlineEntity.setEartagTemp(earTemp);
+            eartagOnlineRepo.saveAndFlush(eartagOnlineEntity);
+            //更新耳标在线统计
+            cacheService.putEartagOnlineCount(earmark,eartagOnlineEntity);
+        }
+    }
+
+    //新建耳标在线记录
+    private void newEartagOnline(String earmark, int total, Timestamp nowTimestamp, String earTemp, String envTemp, java.sql.Date todayDate, String farmId) {
+        EartagEartagOnlineEntity newEartagOnlineEntity = new EartagEartagOnlineEntity();
+        newEartagOnlineEntity.setEarmark(earmark);
+        newEartagOnlineEntity.setTotal(total);
+        newEartagOnlineEntity.setFirstTime(nowTimestamp);
+        newEartagOnlineEntity.setLastTime(nowTimestamp);
+        newEartagOnlineEntity.setEnvTemp(envTemp);
+        newEartagOnlineEntity.setEartagTemp(earTemp);
+        newEartagOnlineEntity.setAddDate(todayDate);
+        newEartagOnlineEntity.setFarmId(farmId);
+        eartagOnlineRepo.saveAndFlush(newEartagOnlineEntity);
+        //更新耳标在线统计
+        cacheService.putEartagOnlineCount(earmark,newEartagOnlineEntity);
+    }
+
+    //更新耳标在线数据
+    public void updateEartagOnline_old1(String earmark, String deviceCode, String todayDateText, java.sql.Date todayDate, Timestamp nowTimestamp, JSONObject eartagJo, String farmId) {
+        //# 判断耳标在线统计数据是否存在
+        //      存在,则更新上传记录数、最后上传时间、环境温度,耳根温度,并将上面数据更新到缓存数据中;
+        //      不存在,则创建耳标在线记录,并更新到缓存数据中;
         //耳根温度
         String earTemp =  eartagJo.getString("earTemp1");
         //环境温度
@@ -162,7 +341,52 @@ public class EartagServiceImpl implements IEartagService {
     }
 
     //更新耳标注册数据
-    public void updateEartagRegister(String earmark, String deviceCode, Timestamp nowTimestamp, String farmId) {
+    public void updateEartagRegister(String earmark, String deviceCode, Timestamp nowTimestamp, java.sql.Date todayDate, String farmId) {
+        //# 判断耳标注册表是否存在;
+        //      如果不存在就注册耳标;
+        //      如果存在就更新活动状态(active_status)和活动状态更新时间(active_time)
+        Integer registerType = 1;
+        Integer activeStatus = 1;
+        Integer liveStatus = 1;        //
+        EartagEartagRegisterEntity eartagRegisterEntity = eartagRegisterRepo.getOneByEarmark(earmark,farmId);
+        if(eartagRegisterEntity == null){
+           //{新建耳标注册信息}
+            newEartagRegister(earmark,nowTimestamp,deviceCode,registerType,activeStatus,liveStatus,todayDate,farmId);
+        }else{
+            eartagRegisterEntity.setLastTime(nowTimestamp);
+            eartagRegisterEntity.setLastDevice(deviceCode);
+            eartagRegisterEntity.setActiveStatus(activeStatus);
+            eartagRegisterEntity.setActiveTime(nowTimestamp);
+            eartagRegisterRepo.saveAndFlush(eartagRegisterEntity);
+            //更新耳标注册消息缓存
+            cacheService.putEartagRegister(earmark,eartagRegisterEntity);
+        }
+    }
+
+    //新建耳标注册信息
+    private void newEartagRegister(String earmark, Timestamp nowTimestamp, String deviceCode, Integer registerType, Integer activeStatus, Integer liveStatus, java.sql.Date todayDate, String farmId) {
+        //#创建耳标注册记录#
+        EartagEartagRegisterEntity newEartagRegisterEntity = new EartagEartagRegisterEntity();
+        newEartagRegisterEntity.setEarmark(earmark);
+        newEartagRegisterEntity.setFirstTime(nowTimestamp);
+        newEartagRegisterEntity.setLastTime(nowTimestamp);
+        newEartagRegisterEntity.setFirstDevice(deviceCode);
+        newEartagRegisterEntity.setBelongDevice(deviceCode);
+        newEartagRegisterEntity.setLastDevice(deviceCode);
+        newEartagRegisterEntity.setRegisterTime(nowTimestamp);
+        newEartagRegisterEntity.setRegisterType(registerType);
+        newEartagRegisterEntity.setFarmId(farmId);
+        newEartagRegisterEntity.setActiveStatus(activeStatus);
+        newEartagRegisterEntity.setActiveTime(nowTimestamp);
+        newEartagRegisterEntity.setLiveStatus(liveStatus);
+        newEartagRegisterEntity.setCreateDate(todayDate);
+        eartagRegisterRepo.saveAndFlush(newEartagRegisterEntity);
+        //{更新耳标注册消息缓存}
+        cacheService.putEartagRegister(earmark,newEartagRegisterEntity);
+    }
+
+    //更新耳标注册数据
+    public void updateEartagRegister_old(String earmark, String deviceCode, Timestamp nowTimestamp, String farmId) {
         //# 判断耳标注册表是否存在;
         //      如果不存在就注册耳标;
         //      如果存在就更新活动状态(active_status)和活动状态更新时间(active_time)
@@ -205,31 +429,40 @@ public class EartagServiceImpl implements IEartagService {
      * @Time : 15:25
      */
     @Override
-    public Integer countAct(String deviceCode, String nowAct) {
+    public Integer countAct(String earmark, String nowAct) {
         //读取hash
-        Object actObj = redisTemplate.opsForHash().get(deviceCode, "act");
-        if (actObj == null) {
-            //--初始化最新的redis记录
-            initRedisObj(deviceCode);
-            Object lastAct = redisTemplate.opsForHash().get(deviceCode, "act");
-            if (lastAct == null) {
-                log.error("#--- redis数据库有问题,请检查redis是否能正常连接 ---# ");
-                return 0;
-            }
+        Object lastActObj = cacheService.getEartagLastAct(earmark);
+        cacheService.putEartagAct(earmark,nowAct);
+        //
+//        Object testActObj = cacheService.getEartagLastAct(earmark);
+//        System.out.println("## TEST testActObj>>"+testActObj);
+        if (lastActObj != null) {
+            return Integer.parseInt(nowAct) - Integer.parseInt(lastActObj.toString());
+        }else{
+            //{初始化最新的redis记录}
+//            cacheService.putEartagAct(earmark,nowAct);
+            //第一次的运动量计数
+//            return Integer.parseInt(nowAct) - 0;
+            return 0;
+            //验证刚才初始化结果
+//            Object lastAct = cacheService.getEartagLastAct(earmark);
+//            if (lastAct == null) {
+//                log.error("#--- redis数据库有问题,请检查redis是否能正常连接 ---# ");
+//                return 0;
+//            }else{
+//                return Integer.parseInt(lastAct.toString());
+//            }
         }
-        Object lastAct = redisTemplate.opsForHash().get(deviceCode, "act");
-        Integer act1 = Integer.parseInt(nowAct) - Integer.parseInt(lastAct.toString());
-//        redisTemplate.opsForHash().put(deviceCode, "act1", act1);
-        return act1;
     }
 
     /**
      * @Author      : ZhuoNing
      * @Date        : 2022/2/9
      * @Time        : 14:33
+     * @param eartagJo
+     * @param nowTimestamp
      */
-    @Override
-    public void saveEartag(JSONObject eartagJo) {
+    public void saveEartagFlow(JSONObject eartagJo, Timestamp nowTimestamp) {
         EartagDataEntity dataEntity = new EartagDataEntity();
         dataEntity.setCmdHeader(eartagJo.getString("cmdHeader"));
         dataEntity.setDevice(eartagJo.getString("device"));
@@ -238,33 +471,17 @@ public class EartagServiceImpl implements IEartagService {
         dataEntity.setEarTemp(Integer.parseInt(eartagJo.getString("earTemp")));
         dataEntity.setEarTemp1(eartagJo.getFloat("earTemp1"));
         dataEntity.setEnvTemp(Integer.parseInt(eartagJo.getString("envTemp")));
-        dataEntity.setEnvTemp1(Integer.parseInt(eartagJo.getString("envTemp")));
+        dataEntity.setEnvTemp1(eartagJo.getFloat("envTemp1"));
         dataEntity.setAct(Integer.parseInt(eartagJo.getString("act")));
         dataEntity.setAct1(Integer.parseInt(eartagJo.getString("act1")));
         dataEntity.setSignal1(Integer.parseInt(eartagJo.getString("signal")));
         dataEntity.setAskTime(getAskTime(eartagJo.getString("askTime")));
         dataEntity.setOther(eartagJo.getString("other"));
-        dataEntity.setAddTime(new Timestamp(new Date().getTime()));
+        dataEntity.setAddTime(nowTimestamp);
         eartagDataRepo.saveAndFlush(dataEntity);
 
         //最新的耳标数据覆盖老数据
-        Map<String, String> map = new HashMap<>();
-        map.put("cmdHeader", dataEntity.getCmdHeader());
-        map.put("device", dataEntity.getDevice());
-        map.put("earmark", dataEntity.getEarmark());
-        map.put("bat", dataEntity.getBat().toString());
-        map.put("earTemp", dataEntity.getEarTemp().toString());
-        map.put("earTemp1", dataEntity.getEarTemp1().toString());
-        map.put("envTemp", dataEntity.getEnvTemp().toString());
-        map.put("envTemp1", dataEntity.getEnvTemp1().toString());
-        map.put("act", dataEntity.getAct().toString());
-        map.put("act1", dataEntity.getAct1().toString());
-        map.put("signal1", dataEntity.getSignal1().toString());
-        map.put("askTime", dataEntity.getAskTime());
-        map.put("other", dataEntity.getOther());
-        map.put("addTime", dataEntity.getAddTime().toString());
-        //为hash结构设置多个键值对(hmset)
-        redisTemplate.opsForHash().putAll(dataEntity.getDevice(), map);
+        cacheService.putEartagFlowToCache(dataEntity.getEarmark(),dataEntity);
     }
 
     //

+ 2 - 0
huimv-eartag2-platform/huimv-eartag2-input/src/main/java/com/huimv/eartag2/server/EartagServerHandler2.java

@@ -64,6 +64,8 @@ public class EartagServerHandler2 extends ChannelInboundHandlerAdapter {
             //--拆分粘包数据
             JSONArray askJa = getPerData(clientAskText);
             for (int a = 0; a < askJa.size(); a++) {
+                //先判断是否再所有牧场的集合当中,未登记都过滤掉;
+//                cacheService.isValidDevice(deviceCode);
                 //--处理客户端请求数据
                 String answer = eartagDataService.handleClientAsk(askJa.getString(a), ctx);
                 if (answer != null) {

+ 1 - 1
huimv-eartag2-platform/huimv-eartag2-input/src/main/java/com/huimv/eartag2/service/impl/DataServiceImpl.java

@@ -230,7 +230,7 @@ public class DataServiceImpl implements IDataService {
         dataEntity.setEarTemp(Integer.parseInt(eartagJo.getString("earTemp")));
         dataEntity.setEarTemp1(eartagJo.getFloat("earTemp1"));
         dataEntity.setEnvTemp(Integer.parseInt(eartagJo.getString("envTemp")));
-        dataEntity.setEnvTemp1(Integer.parseInt(eartagJo.getString("envTemp")));
+        dataEntity.setEnvTemp1(eartagJo.getFloat("envTemp1"));
         dataEntity.setAct(Integer.parseInt(eartagJo.getString("act")));
         dataEntity.setAct1(Integer.parseInt(eartagJo.getString("act1")));
         dataEntity.setSignal1(Integer.parseInt(eartagJo.getString("signal")));

+ 1 - 1
huimv-eartag2-platform/huimv-eartag2-process/src/main/java/com/huimv/eartag2/process/service/impl/EartagServiceImpl.java

@@ -74,7 +74,7 @@ public class EartagServiceImpl implements IEartagService {
         dataEntity.setEarTemp(Integer.parseInt(eartagJo.getString("earTemp")));
         dataEntity.setEarTemp1(eartagJo.getFloat("earTemp1"));
         dataEntity.setEnvTemp(Integer.parseInt(eartagJo.getString("envTemp")));
-        dataEntity.setEnvTemp1(Integer.parseInt(eartagJo.getString("envTemp")));
+        dataEntity.setEnvTemp1(eartagJo.getFloat("envTemp1"));
         dataEntity.setAct(Integer.parseInt(eartagJo.getString("act")));
         dataEntity.setAct1(Integer.parseInt(eartagJo.getString("act1")));
         dataEntity.setSignal1(Integer.parseInt(eartagJo.getString("signal")));