Forráskód Böngészése

对input模块进行了彻底重构。

zhuoning 3 éve
szülő
commit
41ce86f2ac
29 módosított fájl, 1254 hozzáadás és 83 törlés
  1. 2 2
      huimv-eartag2-platform/huimv-eartag2-common/src/main/java/com/huimv/eartag2/common/dao/repo/EartagDeviceRegisterRepo.java
  2. 4 0
      huimv-eartag2-platform/huimv-eartag2-common/src/main/java/com/huimv/eartag2/common/mq/Const.java
  3. 61 0
      huimv-eartag2-platform/huimv-eartag2-common/src/main/java/com/huimv/eartag2/common/vo/FarmAllStatusVo.java
  4. 56 0
      huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/controller/DeviceController.java
  5. 53 0
      huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/listener/ManageListener.java
  6. 11 0
      huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/service/IDeviceService.java
  7. 66 1
      huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/service/impl/DeviceServiceImpl.java
  8. 5 0
      huimv-eartag2-platform/huimv-eartag2-device/src/main/resources/application.properties
  9. 3 3
      huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/listener/EartagListener.java
  10. 30 2
      huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/service/impl/EartagServiceImpl.java
  11. 9 0
      huimv-eartag2-platform/huimv-eartag2-input/src/main/java/com/huimv/eartag2/controller/SendMessageController.java
  12. 211 49
      huimv-eartag2-platform/huimv-eartag2-input/src/main/java/com/huimv/eartag2/server/EartagServerHandler2.java
  13. 23 3
      huimv-eartag2-platform/huimv-eartag2-input/src/main/java/com/huimv/eartag2/service/IDataService.java
  14. 233 7
      huimv-eartag2-platform/huimv-eartag2-input/src/main/java/com/huimv/eartag2/service/impl/DataServiceImpl.java
  15. 6 1
      huimv-eartag2-platform/huimv-eartag2-input/src/main/resources/application.properties
  16. 6 1
      huimv-eartag2-platform/huimv-eartag2-manage/pom.xml
  17. 64 0
      huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/config/RestTemplateConfig.java
  18. 33 0
      huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/config/TopicRabbitMQConfig.java
  19. 5 5
      huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/controller/DeviceRegisterController.java
  20. 67 0
      huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/controller/TestController.java
  21. 52 0
      huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/listener/ManageListener.java
  22. 34 0
      huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/producer/ManageProducer.java
  23. 16 1
      huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/service/ICacheService.java
  24. 1 1
      huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/service/IDeviceRegisterService.java
  25. 11 0
      huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/service/IDeviceService.java
  26. 51 2
      huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/service/impl/CacheServiceImpl.java
  27. 58 5
      huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/service/impl/DeviceRegisterServiceImpl.java
  28. 74 0
      huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/service/impl/DeviceServiceImpl.java
  29. 9 0
      huimv-eartag2-platform/huimv-eartag2-manage/src/main/resources/application.properties

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

@@ -8,14 +8,14 @@ import org.springframework.data.jpa.repository.Query;
 import java.util.List;
 
 public interface EartagDeviceRegisterRepo extends JpaRepository<EartagDeviceRegisterEntity, Integer>, JpaSpecificationExecutor<EartagDeviceRegisterEntity> {
-    @Query(nativeQuery = true,value = "SELECT * FROM eartag_device_register WHERE device_code=?1")
+    @Query(nativeQuery = true,value = "SELECT * FROM eartag_device_register WHERE device_code=?1 LIMIT 1")
     EartagDeviceRegisterEntity getDeviceRegister(String deviceCode);
 
     @Query(nativeQuery = true,value = "SELECT * FROM eartag_device_register WHERE id=?1")
     EartagDeviceRegisterEntity getDeviceRegisterByRowId(String id);
 
 
-    @Query(nativeQuery = true,value = "SELECT COUNT(*) total FROM eartag_device_register WHERE farm_id=?1 AND device_status=1")
+    @Query(nativeQuery = true,value = "SELECT COUNT(*) total FROM eartag_device_register WHERE farm_id=?1 AND (device_status=1 OR device_status=0)")
     List<Object[]> getDeviceCountByFarmId(String farmId);
 
     @Query(nativeQuery = true,value = "SELECT COUNT(*) total FROM eartag_device_register WHERE farm_id=?1 AND device_status=?2")

+ 4 - 0
huimv-eartag2-platform/huimv-eartag2-common/src/main/java/com/huimv/eartag2/common/mq/Const.java

@@ -37,4 +37,8 @@ public class Const {
     public final static String ROUTING_KEY_ASK_EARTAG = "topic.askEartag.routeKey";
     public final static String QUEUE_ASK_EARTAG = "topic.askEartag.queue";
 
+    public final static String QUEUE_SYNC_DEVICE_REGISTER = "topic.syncDeviceRegister.queue";
+    public final static String EXCHANGE_SYNC_DEVICE_REGISTER = "topic.syncDeviceRegister.exchange";
+    public final static String ROUTING_KEY_SYNC_DEVICE_REGISTER = "topic.syncDeviceRegister.routeKey";
+
 }

+ 61 - 0
huimv-eartag2-platform/huimv-eartag2-common/src/main/java/com/huimv/eartag2/common/vo/FarmAllStatusVo.java

@@ -0,0 +1,61 @@
+package com.huimv.eartag2.common.vo;
+
+import java.sql.Date;
+import java.sql.Timestamp;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+public class FarmAllStatusVo {
+    private String farmId;
+    private String todayDateText;
+    private java.sql.Date todayDate;
+    private Timestamp nowTimestamp;
+
+    public String getFarmId() {
+        return farmId;
+    }
+
+    public void setFarmId(String farmId) {
+        this.farmId = farmId;
+    }
+
+    public String getTodayDateText() {
+        return todayDateText;
+    }
+
+    public void setTodayDateText(String todayDateText) {
+        this.todayDateText = todayDateText;
+    }
+
+    public Date getTodayDate() {
+        return todayDate;
+    }
+
+    public void setTodayDate(Date todayDate) {
+        this.todayDate = todayDate;
+    }
+
+    public Timestamp getNowTimestamp() {
+        return nowTimestamp;
+    }
+
+    public void setNowTimestamp(Timestamp nowTimestamp) {
+        this.nowTimestamp = nowTimestamp;
+    }
+
+    @Override
+    public String toString() {
+        return "FarmAllStatusVo{" +
+                "farmId='" + farmId + '\'' +
+                ", todayDateText='" + todayDateText + '\'' +
+                ", todayDate=" + todayDate +
+                ", nowTimestamp=" + nowTimestamp +
+                '}';
+    }
+}

+ 56 - 0
huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/controller/DeviceController.java

@@ -0,0 +1,56 @@
+package com.huimv.eartag2.device.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.huimv.eartag2.common.vo.FarmAllStatusVo;
+import com.huimv.eartag2.device.service.IDeviceService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@RestController
+@Slf4j
+@RequestMapping(value = "/deviceController")
+public class DeviceController {
+    @Autowired
+    private IDeviceService deviceService;
+
+//    @GetMapping(value = "/updateFarmAllStatus")
+//    public String updateFarmAllStatus(String farmId, String todayDateText, java.sql.Date todayDate, Timestamp nowTimestamp) throws ParseException {
+//        System.out.println("# farmId>>"+farmId);
+//        System.out.println("# todayDateText>>"+todayDateText);
+//        System.out.println("# todayDate>>"+todayDate);
+//        System.out.println("# nowTimestamp>>"+nowTimestamp);
+//        //{更新总状态}
+//        deviceService.updateEnvtempOfDeviceAllStatus(farmId, todayDateText, todayDate, nowTimestamp);
+//        return "ok";
+//    }
+
+    @PostMapping(value = "/updateFarmAllStatus")
+    public String updateFarmAllStatus(@RequestBody FarmAllStatusVo farmAllStatusVo) throws ParseException {
+        String farmId = farmAllStatusVo.getFarmId();
+        String todayDateText = farmAllStatusVo.getTodayDateText();
+        java.sql.Date todayDate = farmAllStatusVo.getTodayDate();
+        Timestamp nowTimestamp = farmAllStatusVo.getNowTimestamp();
+        System.out.println("farmId>>"+farmId);
+        System.out.println("todayDateText>>"+todayDateText);
+        System.out.println("todayDate>>"+todayDate);
+        System.out.println("nowTimestamp>>"+nowTimestamp);
+        //{更新牧场状态}
+        deviceService.updateEnvtempOfDeviceAllStatus(farmId,todayDateText,todayDate,nowTimestamp);
+        return "ok";
+    }
+}

+ 53 - 0
huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/listener/ManageListener.java

@@ -0,0 +1,53 @@
+package com.huimv.eartag2.device.listener;
+
+import com.alibaba.fastjson.JSONObject;
+import com.huimv.eartag2.common.mq.Const;
+import com.huimv.eartag2.device.service.IDeviceService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.Map;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@Component
+@Slf4j
+public class ManageListener {
+    @Autowired
+    private IDeviceService deviceService;
+    /**
+     * @Method      : processSyncDeviceRegister
+     * @Description : 监听处理同步设备注册信息队列
+     * @Params      : [map]
+     * @Return      : void
+     *
+     * @Author      : ZhuoNing
+     * @Date        : 2022/3/22
+     * @Time        : 16:03
+     */
+    @RabbitListener(queues = Const.QUEUE_SYNC_DEVICE_REGISTER)
+    @RabbitHandler
+    public void processSyncDeviceRegister(Map map) throws ParseException {
+        System.out.println("3.");
+        JSONObject deviceRegisterJo = JSONObject.parseObject(map.get("deviceRegister").toString()) ;
+        System.out.println("deviceRegisterJo>>"+deviceRegisterJo.toJSONString());
+//        System.out.println("同步设备注册信息>>"+deviceRegisterJo);
+        //{计算有效设备总数并存储到缓存}
+        deviceService.countEffectiveDeviceTotal(deviceRegisterJo);
+        System.out.println("4.");
+
+        //{计算设备和耳标总状态}
+        deviceService.countFarmAllStatus(deviceRegisterJo);
+        System.out.println("5.");
+    }
+}

+ 11 - 0
huimv-eartag2-platform/huimv-eartag2-device/src/main/java/com/huimv/eartag2/device/service/IDeviceService.java

@@ -3,9 +3,12 @@ package com.huimv.eartag2.device.service;
 import com.alibaba.fastjson.JSONObject;
 
 import java.sql.Date;
+import java.sql.Timestamp;
 import java.text.ParseException;
 
 public interface IDeviceService {
+    void remoteProcessFarmAllStatus(String farmId) throws ParseException;
+
     //保存心跳数据
     void saveDeviceHeartbeat(JSONObject dataJo, Date todayDate);
     //保存设备温度数据
@@ -19,7 +22,15 @@ public interface IDeviceService {
     //处理设备环境温度数据
     void handleDeviceEnvtemp(JSONObject dataJo) throws ParseException;
 
+    //更新设备环境信息
+    void updateEnvtempOfDeviceAllStatus(String farmId, String todayDateText, Date todayDate, Timestamp nowTimestamp) throws ParseException;
+
     //根据设备编码获取牧场id
     String getFarmIdByDeviceCode(String deviceCode);
 
+    //
+    void countEffectiveDeviceTotal(JSONObject deviceRegisterJo);
+
+    //
+    void countFarmAllStatus(JSONObject deviceRegisterJo) throws ParseException;
 }

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

@@ -7,6 +7,7 @@ import com.huimv.eartag2.common.dao.repo.*;
 //import com.huimv.eartag2.process.utils.DateUtil;
 //import com.huimv.eartag2.process.utils.MathUtil;
 import com.huimv.eartag2.common.utils.BizConst;
+import com.huimv.eartag2.common.vo.FarmAllStatusVo;
 import com.huimv.eartag2.device.service.ICacheService;
 import com.huimv.eartag2.device.service.IDeviceService;
 import com.huimv.eartag2.device.service.IEartagService;
@@ -14,7 +15,9 @@ import com.huimv.eartag2.device.utils.DateUtil;
 import com.huimv.eartag2.device.utils.MathUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
 
 import java.math.BigDecimal;
 import java.sql.Timestamp;
@@ -63,6 +66,12 @@ public class DeviceServiceImpl implements IDeviceService {
     private EartagDeviceOnlineRepo eartagDeviceOnlineRepo;
     @Autowired
     private EartagEartagRegisterRepo eartagRegisterRepo;
+    @Value("${service.farmAllStatus.host}")
+    private String serviceFarmAllStatusHost;
+    @Value("${service.farmAllStatus.ip}")
+    private String serviceFarmAllStatusIp;
+    @Value("${service.farmAllStatus.url}")
+    private String serviceFarmAllStatusUrl;
 
     /**
      * @Method      : handleDeviceHeartbeat
@@ -115,7 +124,6 @@ public class DeviceServiceImpl implements IDeviceService {
             cacheService.putDeviceToOnlineSet(farmId, deviceCode,todayDateText);
         }
         System.out.println("## END 心跳.");
-        //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     }
 
     //更新总状态
@@ -287,6 +295,7 @@ public class DeviceServiceImpl implements IDeviceService {
         EartagDeviceRegisterEntity deviceRegisterEntity = deviceRegisterRepo.getDeviceRegister(deviceCode);
         if (deviceRegisterEntity != null) {
             //设备注册数据存在
+            deviceRegisterEntity.setDeviceStatus(1);
             deviceRegisterEntity.setActiveStatus(1);
             deviceRegisterEntity.setActiveTime(nowTimestamp);
             deviceRegisterEntity.setUpdateType(updateType);
@@ -367,9 +376,11 @@ public class DeviceServiceImpl implements IDeviceService {
     }
 
     //更新设备环境信息
+    @Override
     public void updateEnvtempOfDeviceAllStatus(String farmId, String todayDateText, java.sql.Date todayDate, Timestamp nowTimestamp) throws ParseException {
         //{获取处于工作状态的设备数量}
         Integer deviceTotal = getDeviceTotalByFarmIdFromDeviceRegister(farmId);
+        System.out.println("## deviceTotal>>"+deviceTotal);
         //设备在线数量
         Integer deviceOnlineSum = cacheService.getDeviceOnlineSum(farmId,todayDateText);
         deviceOnlineSum++;
@@ -378,6 +389,8 @@ public class DeviceServiceImpl implements IDeviceService {
         if(deviceTotal > deviceOnlineSum){
             deviceOfflineSum = deviceTotal - deviceOnlineSum;
         }
+        System.out.println("## deviceOnlineSum>>"+deviceOnlineSum);
+
         //设备在线率
         BigDecimal deviceRateBd= new BigDecimal(deviceOnlineSum).divide(new BigDecimal(deviceTotal),1,BigDecimal.ROUND_HALF_UP);
         Float deviceOnlineRate = Float.parseFloat(deviceRateBd.toString());
@@ -609,6 +622,58 @@ public class DeviceServiceImpl implements IDeviceService {
         }
         return deviceRegisterEntity.getFarmId();
     }
+
+    @Override
+    public void countEffectiveDeviceTotal (JSONObject deviceRegisterJo) {
+        String farmId = deviceRegisterJo.getString("farmId");
+        //{}
+        Integer effectiveDeviceTotal = getEffectiveDeviceSum(farmId);
+        System.out.println("## effectiveDeviceTotal>>"+effectiveDeviceTotal);
+        //{设置设备总数}
+        cacheService.putDeviceTotal(effectiveDeviceTotal,farmId);
+    }
+
+    @Override
+    public void countFarmAllStatus(JSONObject deviceRegisterJo) throws ParseException {
+        String farmId = deviceRegisterJo.getString("farmId");
+        //{}
+//        remoteProcessFarmAllStatus(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());
+        //{更新牧场总状态}
+        updateEnvtempOfDeviceAllStatus(farmId,todayDateText,todayDate,nowTimestamp);
+    }
+
+    @Override
+    public void remoteProcessFarmAllStatus(String farmId) throws ParseException {
+        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());
+
+        RestTemplate restTemplate = new RestTemplate();
+
+        String url = "http://" + serviceFarmAllStatusHost + ":" + serviceFarmAllStatusIp + serviceFarmAllStatusUrl;
+        System.out.println("## url>>"+url);
+
+        FarmAllStatusVo farmAllStatusVo = new FarmAllStatusVo();
+        farmAllStatusVo.setFarmId(farmId);
+        farmAllStatusVo.setTodayDateText(todayDateText);
+        farmAllStatusVo.setTodayDate(todayDate);
+        farmAllStatusVo.setNowTimestamp(nowTimestamp);
+        //{}
+        String result = restTemplate.postForObject(url,farmAllStatusVo,String.class);
+        System.out.println("result>>"+result);
+    }
+
+    public Integer getEffectiveDeviceSum(String farmId){
+        List<Object[]> deviceRegisterList = deviceRegisterRepo.getDeviceCountByFarmId(farmId);
+        Object[] deviceRegObj = (Object[]) deviceRegisterList.get(0);
+        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+deviceRegObj[0].toString());
+        //设备总数
+        return Integer.parseInt(deviceRegObj[0].toString());
+    }
+
     /**
      * @Method      : saveDeviceHeartbeat
      * @Description : 保存设备心跳数据

+ 5 - 0
huimv-eartag2-platform/huimv-eartag2-device/src/main/resources/application.properties

@@ -1 +1,6 @@
 spring.profiles.active=dev
+
+service.farmAllStatus.url=/deviceController/updateFarmAllStatus
+service.farmAllStatus.host=192.168.1.68
+service.farmAllStatus.ip=8092
+

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

@@ -34,12 +34,12 @@ public class EartagListener {
 
     /**
      * @Method      : processRawdata
-     * @Description : 
+     * @Description :
      * @Params      : [RawMap]
      * @Return      : void
-     * 
+     *
      * @Author      : ZhuoNing
-     * @Date        : 2022/3/12       
+     * @Date        : 2022/3/12
      * @Time        : 17:53
      */
     @RabbitListener(queues = Const.QUEUE_ASK_EARTAG)

+ 30 - 2
huimv-eartag2-platform/huimv-eartag2-eartag/src/main/java/com/huimv/eartag2/eartag/service/impl/EartagServiceImpl.java

@@ -50,6 +50,8 @@ public class EartagServiceImpl implements IEartagService {
     private EartarFarmAllStatusRepo eartagFarmAllStatusRepo;
     @Autowired
     private EartagDeviceEartagCountRepo deviceEartagCountRepo;
+    @Autowired
+    private EartagDeviceRegisterRepo deviceRegisterRepo;
 
     @Override
     public void handleEartag(JSONObject dataJo) throws ParseException {
@@ -68,10 +70,13 @@ public class EartagServiceImpl implements IEartagService {
         //{保存耳标流水}
         saveEartagFlow(dataJo,nowTimestamp,todayDate,farmId);
 
-        //{更新耳标注册数据}
+        //{更新设备注册信息}
+        updateDeviceRegister(deviceCode,nowTimestamp,todayDate,farmId);
+
+        //{更新耳标注册信息}
         updateEartagRegister(earmark,deviceCode,nowTimestamp,todayDate,farmId);
 
-        //{更新耳标在线数据}
+        //{更新耳标在线信息}
         updateEartagOnline(earmark,deviceCode,todayDateText,todayDate,nowTimestamp,dataJo,farmId);
 
         //{更新耳标设备在线统计}
@@ -86,6 +91,29 @@ public class EartagServiceImpl implements IEartagService {
         }
     }
 
+    /**
+     * @Method      : updateDeviceRegister
+     * @Description : 更新设备注册状态信息
+     * @Params      : [deviceCode, nowTimestamp, todayDate, farmId]
+     * @Return      : void
+     * 
+     * @Author      : ZhuoNing
+     * @Date        : 2022/3/22       
+     * @Time        : 14:06
+     */
+    private void updateDeviceRegister(String deviceCode, Timestamp nowTimestamp, java.sql.Date todayDate, String farmId) {
+        EartagDeviceRegisterEntity deviceRegisterEntity = deviceRegisterRepo.getDeviceRegister(deviceCode);
+        if(deviceRegisterEntity == null){
+            log.error("(updateDeviceRegister).deviceRegisterEntity=null <-- deviceCode>>"+deviceCode);
+        }
+        deviceRegisterEntity.setLastTime(nowTimestamp);
+        deviceRegisterEntity.setActiveStatus(1);
+        deviceRegisterEntity.setActiveTime(nowTimestamp);
+        deviceRegisterEntity.setUpdateType("耳标");
+        deviceRegisterEntity.setDeviceStatus(1);
+        deviceRegisterRepo.saveAndFlush(deviceRegisterEntity);
+    }
+
     //更新耳标设备在线次数
     private void updateEartagDeviceOnlineCount(String earmark, String deviceCode, String todayDateText, java.sql.Date todayDate, String farmId) {
         //从缓存读取耳标关联数据

+ 9 - 0
huimv-eartag2-platform/huimv-eartag2-input/src/main/java/com/huimv/eartag2/controller/SendMessageController.java

@@ -1,6 +1,7 @@
 package com.huimv.eartag2.controller;
 
 import com.alibaba.fastjson.JSONObject;
+import com.huimv.eartag2.service.IDeviceService;
 import org.springframework.amqp.rabbit.core.RabbitTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -24,6 +25,8 @@ import java.util.UUID;
 public class SendMessageController {
     @Autowired
     RabbitTemplate rabbitTemplate;  //使用RabbitTemplate,这提供了接收/发送等等方法
+    @Autowired
+    private IDeviceService deviceService;
 
     @GetMapping("/sendDirectMessage")
     public String sendDirectMessage() {
@@ -160,4 +163,10 @@ public class SendMessageController {
         return "ok";
     }
 
+    @GetMapping("/getDeviceCodeByChipId")
+    public String getDeviceCodeByChipId(String chipId) {
+        String deviceCode = deviceService.getDeviceCodeByChipId(chipId);
+        System.out.println(">>deviceCode>>"+deviceCode);
+        return deviceCode;
+    }
 }

+ 211 - 49
huimv-eartag2-platform/huimv-eartag2-input/src/main/java/com/huimv/eartag2/server/EartagServerHandler2.java

@@ -1,6 +1,7 @@
 package com.huimv.eartag2.server;
 
 import com.alibaba.fastjson.JSONArray;
+import com.huimv.eartag2.common.mq.Const;
 import com.huimv.eartag2.service.IDataService;
 import com.huimv.eartag2.service.IDeviceService;
 import com.huimv.eartag2.utils.DateUtil2;
@@ -13,8 +14,13 @@ import io.netty.channel.ChannelInboundHandlerAdapter;
 import io.netty.util.CharsetUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
 
+import java.text.ParseException;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -31,83 +37,239 @@ import java.util.regex.Pattern;
 @Slf4j
 public class EartagServerHandler2 extends ChannelInboundHandlerAdapter {
     @Autowired
-    private IDataService eartagDataService;
+    private IDataService dataService;
     @Autowired
     private DateUtil2 dateUtil;
     @Autowired
     private RegexUtil regexUtil;
-    @Autowired
-    private IDeviceService deviceService;
+    @Value("${data.input.flow}")
+    private Integer dataInputFlow;
 
     @Override
     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
         ByteBuf data = (ByteBuf) msg;
         String clientAskText = data.toString(CharsetUtil.UTF_8);
 //        clientAskText = clientAskText.replaceAll("\r","").replaceAll("\n","");
-        System.out.println("### 服务端接收数据 >>"+clientAskText);
-
-        //test-saveRawData()
-        deviceService.saveRawData(clientAskText);
-
+        System.out.println("### 服务端接收数据 >>" + clientAskText);
+        //TEST-saveRawData()
+//        deviceService.saveRawData(clientAskText);
         //{}
         int countPlus = regexUtil.countPlus(clientAskText);
-        if(countPlus < 4){
-            System.out.println("当前数据为不完整数据,故丢弃.>>"+clientAskText);
-        }else{
+        if (countPlus < 4) {
+            System.out.println("当前数据为不完整数据,故丢弃.>>" + clientAskText);
+        } else {
             //--处理客户端请求数据
-//            System.out.println("000拆分粘包之前数据 clientAskText>>"+clientAskText);
             //{拆分粘包数据}
             JSONArray askJa = getPerData(clientAskText);
             for (int a = 0; a < askJa.size(); a++) {
-                //先判断是否再所有牧场的集合当中,未登记都过滤掉;
-//                cacheService.isValidDevice(deviceCode);
-                //{处理客户端请求数据}
-                String answer = eartagDataService.handleClientAsk(askJa.getString(a), ctx);
-                System.out.println("## 返回应答>>"+answer);
-                if (answer != null) {
-                    log.info("###应答响应>>" + answer + "\n");
-                    ctx.writeAndFlush(Unpooled.copiedBuffer(answer.getBytes()));
+                String askText = askJa.getString(a);
+                System.out.println("## Test dataInputFlow>>"+dataInputFlow);
+                if (dataInputFlow == 1) {
+                    //{处理请求内容}
+                    handleAskText(askText, ctx);
                 } else {
-                    log.info("###应答数据>>" + answer + ",不需要应答。\n");
+                    //{处理请求内容2}
+                    handleAskText2(askText, ctx);
                 }
             }
         }
     }
 
-//    @Override
-    public void channelRead_old1(ChannelHandlerContext ctx, Object msg) throws Exception {
-        ByteBuf data = (ByteBuf) msg;
-        String clientAskText = data.toString(CharsetUtil.UTF_8);
-        System.out.println("### 服务端接收数据 >>"+clientAskText);
-        if(clientAskText.length() <=18){
-            System.out.println("当前数据为不完整数据,故丢弃.>>"+clientAskText);
-        }else{
-            //--处理客户端请求数据
-//            String answer = eartagDataService.handleClientAsk(clientAskText, ctx);
-////            String answer = eartagDataService.handleClientAsk(clientAsk, ctx);
-//            if (answer != null) {
-//                log.info("###应答响应>>" + answer + "\n");
-//                ctx.writeAndFlush(Unpooled.copiedBuffer(answer.getBytes()));
-//            } else {
-//                log.info("###应答数据>>" + answer + ",不需要应答。\n");
-//            }
-//            System.out.println("000拆分粘包之前数据 clientAskText>>"+clientAskText);
-//            --拆分粘包数据
-            JSONArray askJa = getPerData(clientAskText);
-            for (int a = 0; a < askJa.size(); a++) {
-                //--处理客户端请求数据
-                String answer = eartagDataService.handleClientAsk(askJa.getString(a), ctx);
-//            String answer = eartagDataService.handleClientAsk(clientAsk, ctx);
-                if (answer != null) {
-                    log.info("###应答响应>>" + answer + "\n");
+    /**
+     * @Method      : handleAskText2
+     * @Description : 
+     * @Params      : [askText, ctx]
+     * @Return      : void
+     * 
+     * @Author      : ZhuoNing
+     * @Date        : 2022/3/23       
+     * @Time        : 18:08
+     */
+    private void handleAskText2(String askText, ChannelHandlerContext ctx) throws ParseException {
+        String[] dataArray = askText.split("\\+");
+        String cmdHeader = dataArray[0];
+        //芯片id/设备编码
+        String idCode = dataArray[1];
+        String cmd = dataArray[2];
+        Map map = new HashMap();
+        map.put("askText", askText);
+        if (cmdHeader.trim().equalsIgnoreCase("hm")) {
+            //采集器应答数据
+            if (cmd.trim().equalsIgnoreCase("0")) {
+                //不需要处理
+                System.out.println("==>1");
+            } else if (cmd.trim().equalsIgnoreCase("1")) {
+                System.out.println("==>2");
+                //处理获取设备编码命令
+                //{读取设备编码}
+                String deviceCode = dataService.getDeviceCodeByChipId(idCode);
+                log.info("芯片id>>"+idCode+" ,deviceCode>>"+deviceCode);
+                if(deviceCode != null){
+                    System.out.println("==>2.1");
+                    String answer = "hm+1+0+" + deviceCode + "+123+8+end";
+                    log.info("##获取设备编码-应答数据>>" + answer);
                     ctx.writeAndFlush(Unpooled.copiedBuffer(answer.getBytes()));
-                } else {
-                    log.info("###应答数据>>" + answer + ",不需要应答。\n");
+                    System.out.println("==>2.2");
+                }else{
+                    log.error("检测到未注册的非法采集器设备,已舍弃请求.");
                 }
+                System.out.println("==>3");
+            } else if (cmd.trim().equalsIgnoreCase("2")) {
+                System.out.println("==>3");
+                //处理服务器时间命令
+                String answer = "hm+2+" + dateUtil.getNowText() + "+4+end";
+                log.info("##获取服务器时间-应答数据>>" + answer);
+                ctx.writeAndFlush(Unpooled.copiedBuffer(answer.getBytes()));
+                System.out.println("==>3.1");
+            } else if (cmd.trim().equalsIgnoreCase("3")) {
+                System.out.println("==>4");
+                //处理心跳包命令
+                //{设备心跳应答}
+                String answer = "hm+3+6+end";
+                log.info("##心跳包-应答数据>>" + answer);
+                ctx.writeAndFlush(Unpooled.copiedBuffer(answer.getBytes()));
+                System.out.println("==>4.1");
+                //{发送到耳标处理消息队列}
+                dataService.sendDeviceMQ(map);
+                System.out.println("==>4.2");
+            } else if (cmd.trim().equalsIgnoreCase("4")) {
+                System.out.println("==>5");
+                //处理设备环境温度命令
+                //{设备环境温度应答}
+                String answer = "hm+4+7+end";
+                log.info("##环境温度-应答数据>>" + answer);
+                ctx.writeAndFlush(Unpooled.copiedBuffer(answer.getBytes()));
+                System.out.println("==>5.1");
+                //{发送到耳标处理消息队列}
+                dataService.sendDeviceMQ(map);
+                System.out.println("==>5.2");
+            } else {
+                System.out.println("==>6");
+                log.error("##当前数据为非法数据>>" + askText);
+            }
+        } else if (cmdHeader.trim().equalsIgnoreCase("zj")) {
+            System.out.println("==>7");
+            //耳标应答数据(不需要应答)
+            if(cmd.trim().equalsIgnoreCase("ffffffffffffffff") || cmd.trim().equalsIgnoreCase("0000000000000000")){
+                log.error("舍弃掉未配置耳标号的耳标,"+askText+"");
+            }else{
+                //{发送到耳标处理消息队列}
+                dataService.sendEartagMQ(map);
+            }
+            System.out.println("==>7.1");
+        } else {
+            System.out.println("==>8");
+            log.error("##当前请求数据为非法数据>>" + askText);
+        }
+    }
+
+    /**
+     * @Method : handleAskText
+     * @Description : 处理请求内容
+     * @Params : [askText, ctx]
+     * @Return : void
+     * @Author : ZhuoNing
+     * @Date : 2022/3/23
+     * @Time : 17:36
+     */
+    private void handleAskText(String askText, ChannelHandlerContext ctx) throws ParseException {
+        String[] dataArray = askText.split("\\+");
+        String cmdHeader = dataArray[0];
+        //芯片id/设备编码
+        String idCode = dataArray[1];
+        String cmd = dataArray[2];
+        //{先判断是否已经注册,未注册的非法设备都过滤掉}
+        boolean validStatus= dataService.isValidDevice(cmdHeader, idCode, cmd);
+        System.out.println("## validStatus>>"+validStatus);
+        if (validStatus) {
+            System.out.println("-->1");
+            //{处理应答}
+            String answer = dataService.getDeviceAnswer(cmdHeader, cmd, idCode);
+            System.out.println("-->2");
+            if (answer != null) {
+                System.out.println("-->2.1");
+                log.info("###应答响应>>" + answer + "\n");
+                ctx.writeAndFlush(Unpooled.copiedBuffer(answer.getBytes()));
+                System.out.println("-->2.2");
+            } else {
+                System.out.println("-->2.3");
+                log.info("###应答数据>>" + answer + ",不需要应答。\n");
             }
+            System.out.println("-->3");
+            //{发送消息异步处理}
+            dataService.sendBizMQ(cmdHeader, cmd, askText);
+            System.out.println("-->4");
         }
     }
 
+    //    @Override
+//    public void channelRead_old2(ChannelHandlerContext ctx, Object msg) throws Exception {
+//        ByteBuf data = (ByteBuf) msg;
+//        String clientAskText = data.toString(CharsetUtil.UTF_8);
+////        clientAskText = clientAskText.replaceAll("\r","").replaceAll("\n","");
+//        System.out.println("### 服务端接收数据 >>" + clientAskText);
+//        //TEST-saveRawData()
+////        deviceService.saveRawData(clientAskText);
+//        //{}
+//        int countPlus = regexUtil.countPlus(clientAskText);
+//        if (countPlus < 4) {
+//            System.out.println("当前数据为不完整数据,故丢弃.>>" + clientAskText);
+//        } else {
+//            //--处理客户端请求数据
+////            System.out.println("000拆分粘包之前数据 clientAskText>>"+clientAskText);
+//            //{拆分粘包数据}
+//            JSONArray askJa = getPerData(clientAskText);
+//            for (int a = 0; a < askJa.size(); a++) {
+//                //先判断是否再所有牧场的集合当中,未登记都过滤掉;
+////                cacheService.isValidDevice(deviceCode);
+//
+//                //{处理客户端请求数据}
+//                String answer = dataService.handleClientAsk(askJa.getString(a));
+//                System.out.println("## 返回应答>>" + answer);
+//                if (answer != null) {
+//                    log.info("###应答响应>>" + answer + "\n");
+//                    ctx.writeAndFlush(Unpooled.copiedBuffer(answer.getBytes()));
+//                } else {
+//                    log.info("###应答数据>>" + answer + ",不需要应答。\n");
+//                }
+//            }
+//        }
+//    }
+
+    //    @Override
+//    public void channelRead_old1(ChannelHandlerContext ctx, Object msg) throws Exception {
+//        ByteBuf data = (ByteBuf) msg;
+//        String clientAskText = data.toString(CharsetUtil.UTF_8);
+//        System.out.println("### 服务端接收数据 >>" + clientAskText);
+//        if (clientAskText.length() <= 18) {
+//            System.out.println("当前数据为不完整数据,故丢弃.>>" + clientAskText);
+//        } else {
+//            //--处理客户端请求数据
+////            String answer = eartagDataService.handleClientAsk(clientAskText, ctx);
+//////            String answer = eartagDataService.handleClientAsk(clientAsk, ctx);
+////            if (answer != null) {
+////                log.info("###应答响应>>" + answer + "\n");
+////                ctx.writeAndFlush(Unpooled.copiedBuffer(answer.getBytes()));
+////            } else {
+////                log.info("###应答数据>>" + answer + ",不需要应答。\n");
+////            }
+////            System.out.println("000拆分粘包之前数据 clientAskText>>"+clientAskText);
+////            --拆分粘包数据
+//            JSONArray askJa = getPerData(clientAskText);
+//            for (int a = 0; a < askJa.size(); a++) {
+//                //--处理客户端请求数据
+//                String answer = dataService.handleClientAsk(askJa.getString(a), ctx);
+////            String answer = eartagDataService.handleClientAsk(clientAsk, ctx);
+//                if (answer != null) {
+//                    log.info("###应答响应>>" + answer + "\n");
+//                    ctx.writeAndFlush(Unpooled.copiedBuffer(answer.getBytes()));
+//                } else {
+//                    log.info("###应答数据>>" + answer + ",不需要应答。\n");
+//                }
+//            }
+//        }
+//    }
+
     //拆分粘包数据
     public JSONArray getPerData(String text) {
         String key = "end";

+ 23 - 3
huimv-eartag2-platform/huimv-eartag2-input/src/main/java/com/huimv/eartag2/service/IDataService.java

@@ -1,10 +1,30 @@
 package com.huimv.eartag2.service;
 
-import io.netty.channel.ChannelHandlerContext;
-
 import java.text.ParseException;
+import java.util.Map;
 
 public interface IDataService {
     //
-    String handleClientAsk(String receiveData, ChannelHandlerContext ctx) throws ParseException;
+    String handleClientAsk(String receiveData) throws ParseException;
+
+    //解析客户端请求
+    Map parseDeviceAsk(String askText) throws ParseException;
+
+    //判断设备有效性
+    boolean isValidDevice(String cmdHeader, String idCode, String cmd);
+
+    //获取设备应答
+    String getDeviceAnswer(String cmdHeader, String cmd, String idCode) throws ParseException;
+
+    //发送消息
+    void sendBizMQ(String cmdHeader, String cmd, String askText);
+
+    //发送设备消息
+    void sendEartagMQ(Map map);
+
+    //
+    String getDeviceCodeByChipId(String idCode);
+
+    //发送耳标消息
+    void sendDeviceMQ(Map map);
 }

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

@@ -10,6 +10,7 @@ import com.huimv.eartag2.common.dao.repo.EartagDataRepo;
 import com.huimv.eartag2.common.dao.repo.EartagEnvRepo;
 import com.huimv.eartag2.common.dao.repo.EartagHeartbeatRepo;
 import com.huimv.eartag2.common.dao.repo.EartagRawRepo;
+import com.huimv.eartag2.common.mq.Const;
 import com.huimv.eartag2.producer.Producer;
 import com.huimv.eartag2.service.IDataService;
 import com.huimv.eartag2.service.IDeviceService;
@@ -21,7 +22,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.amqp.rabbit.core.RabbitTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.core.ValueOperations;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -69,7 +69,226 @@ public class DataServiceImpl implements IDataService {
 
     //处理接收数据
     @Override
-    public String handleClientAsk(String askText, ChannelHandlerContext ctx) throws ParseException {
+    public String handleClientAsk(String askText) throws ParseException {
+//        System.out.println("000拆分粘包之后数据>>"+askText);
+        //--对接收的上报数据解析
+        String answer = parseAskText2(askText);
+
+        //--将原始数据保存到rabbitMQ(重构之后代码)
+        producer.sendClientAsk2(askText);
+
+        return answer;
+    }
+
+    @Override
+    public Map parseDeviceAsk(String askText) throws ParseException {
+        Map resultMap = new HashMap();
+        log.info("#开始解析Ask请求数据>>" + askText.trim().replace("\n", ""));
+        String[] dataArray = askText.split("\\+");
+        String cmdHeader = dataArray[0];
+        String answer = null;
+        if (cmdHeader.trim().equalsIgnoreCase("hm")) {
+            //采集器原始数据
+            //芯片id/设备编码
+            String idCode = dataArray[1];
+            String cmd = dataArray[2];
+            //采集器应答数据
+            if (cmd.trim().equalsIgnoreCase("0")) {
+                //不需要处理
+//                answer = null;
+                resultMap.put("clientType", "device");
+                resultMap.put("answerStatus", false);
+                resultMap.put("answerText", null);
+                resultMap.put("mqStatus", false);
+                resultMap.put("askText", askText);
+                return resultMap;
+            } else if (cmd.trim().equalsIgnoreCase("1")) {
+                //获取设备编码
+                //{读取设备编码}
+                String deviceCode = getDeviceCodeByChipId(idCode);
+                if (deviceCode == null) {
+                    log.error("异常:该芯片ID[" + idCode + "]未获取到设备编码,该设备为非法未注册设备.");
+                    resultMap.put("validStatus",false);
+                }else {
+                    answer = "hm+1+0+" + deviceCode + "+123+8+end";
+                    log.info("##获取设备编码-应答数据>>" + answer);
+//                resultMap.put("chipId", idCode);
+//                resultMap.put("deviceCode", deviceCode);
+                    resultMap.put("validStatus",true);
+                    resultMap.put("clientType", "device");
+                    resultMap.put("answerStatus", true);
+                    resultMap.put("answerText", answer);
+                    resultMap.put("mqStatus", false);
+                    resultMap.put("askText", askText);
+                }
+                return resultMap;
+            } else if (cmd.trim().equalsIgnoreCase("2")) {
+                //获取服务器时间命令
+//                answer = "hm+2+0+"+dateUtil.getNowText()+"+4+end";
+                answer = "hm+2+" + dateUtil.getNowText() + "+4+end";
+                log.info("##获取服务器时间-应答数据>>" + answer);
+                resultMap.put("validStatus",true);
+                resultMap.put("clientType", "device");
+                resultMap.put("answerStatus", true);
+                resultMap.put("answerText", answer);
+                resultMap.put("mqStatus", false);
+                resultMap.put("askText", askText);
+                return resultMap;
+
+            } else if (cmd.trim().equalsIgnoreCase("3")) {
+                //心跳包命令
+//                heartbeatMap = new HashMap();
+//                answer = "hm+3+0+6+end";
+                answer = "hm+3+6+end";
+                log.info("##心跳包-应答数据>>" + answer);
+                resultMap.put("validStatus",true);
+                resultMap.put("clientType", "device");
+                resultMap.put("answerStatus", true);
+                resultMap.put("answerText", answer);
+                resultMap.put("mqStatus", true);
+                resultMap.put("askText", askText);
+                return resultMap;
+            } else if (cmd.trim().equalsIgnoreCase("4")) {
+                //环境温度-设备、数值、上传时间
+//                answer = "hm+4+0+7+end";
+                answer = "hm+4+7+end";
+                log.info("##环境温度-应答数据>>" + answer);
+                resultMap.put("validStatus",true);
+                resultMap.put("clientType", "device");
+                resultMap.put("answerStatus", true);
+                resultMap.put("answerText", answer);
+                resultMap.put("mqStatus", true);
+                resultMap.put("askText", askText);
+                return resultMap;
+            } else {
+                log.error("##当前数据为非法数据>>" + askText);
+                resultMap.put("validStatus",false);
+                resultMap.put("clientType", "device");
+                resultMap.put("answerStatus", false);
+                resultMap.put("answerText", null);
+                resultMap.put("mqStatus", false);
+                return resultMap;
+            }
+//            return answer;
+        } else if (cmdHeader.trim().equalsIgnoreCase("zj")) {
+            //耳标应答数据(不需要应答)
+            answer = null;
+            resultMap.put("validStatus",true);
+            resultMap.put("clientType", "eartag");
+            resultMap.put("answerStatus", false);
+            resultMap.put("answerText", null);
+            resultMap.put("mqStatus", true);
+            resultMap.put("askText", askText);
+            return resultMap;
+        } else {
+            log.error("##当前请求数据为非法数据>>" + askText);
+            resultMap.put("validStatus",false);
+            resultMap.put("clientType", "不清楚设备类型");
+            resultMap.put("answerStatus", false);
+            resultMap.put("answerText", null);
+            resultMap.put("mqStatus", false);
+            return resultMap;
+        }
+    }
+
+    @Override
+    public boolean isValidDevice(String cmdHeader, String idCode, String cmd) {
+        if (cmdHeader.trim().equalsIgnoreCase("hm") && cmd.trim().equalsIgnoreCase("1")) {
+            //{读取设备编码}
+            String deviceCode = getDeviceCodeByChipId(idCode);
+            log.info("芯片id>>"+idCode+", 设备编码>>"+deviceCode);
+            if(deviceCode == null){
+                return false;
+            }else{
+                return true;
+            }
+        }else{
+            return true;
+        }
+    }
+
+    @Override
+    public String getDeviceAnswer(String cmdHeader, String cmd, String idCode) throws ParseException {
+        String answer = null;
+        if (cmdHeader.trim().equalsIgnoreCase("hm")) {
+            //采集器应答数据
+            if (cmd.trim().equalsIgnoreCase("0")) {
+                //获取目标服务器的通信地址和端口号(不需要处理)
+                answer = null;
+            } else if (cmd.trim().equalsIgnoreCase("1")) {
+                //{读取设备编码}
+                String deviceCode = getDeviceCodeByChipId(idCode);
+                answer = "hm+1+0+" + deviceCode + "+123+8+end";
+                log.info("##获取设备编码-应答数据>>" + answer);
+            } else if (cmd.trim().equalsIgnoreCase("2")) {
+                //获取服务器时间命令
+                answer = "hm+2+" + dateUtil.getNowText() + "+4+end";
+                log.info("##获取服务器时间-应答数据>>" + answer);
+            } else if (cmd.trim().equalsIgnoreCase("3")) {
+                //心跳包命令
+                answer = "hm+3+6+end";
+                log.info("##心跳包-应答数据>>" + answer);
+            } else if (cmd.trim().equalsIgnoreCase("4")) {
+                //环境温度-设备、数值、上传时间
+                answer = "hm+4+7+end";
+                log.info("##环境温度-应答数据>>" + answer);
+            } else {
+                log.error("##当前数据为非法数据>>");
+            }
+            return answer;
+        } else if (cmdHeader.trim().equalsIgnoreCase("zj")) {
+            //耳标应答数据(不需要应答)
+           return null;
+        } else {
+            log.error("##当前请求数据为非法数据>>");
+            return null;
+        }
+    }
+
+    /**
+     * @Method      : sendBizMQ
+     * @Description : 注意:askText中第三位cmd对于耳标数据而言是耳标号,对于设备而言是命令。
+     * @Params      : [cmdHeader, cmd, askText]
+     * @Return      : void
+     * 
+     * @Author      : ZhuoNing
+     * @Date        : 2022/3/23       
+     * @Time        : 17:20
+     */
+    @Override
+    public void sendBizMQ(String cmdHeader, String cmd, String askText) {
+        askText = askText.replaceAll("\r","").replaceAll("\n","");
+        Map map = new HashMap();
+        map.put("askText",askText);
+        System.out.println("-->3.1");
+        if (cmdHeader.trim().equalsIgnoreCase("hm") && (cmd.trim().equalsIgnoreCase("3") || cmd.trim().equalsIgnoreCase("4"))) {
+            System.out.println("-->3.2");
+            //发送到设备处理消息队列
+            rabbitTemplate.convertAndSend(Const.EXCHANGE_ASK_DEVICE, Const.ROUTING_KEY_ASK_DEVICE, map);
+            System.out.println("## --> 发送设备处理模块.");
+        } else if (cmdHeader.trim().equalsIgnoreCase("zj")) {
+            System.out.println("-->3.3");
+            //{发送消息}
+            if(cmd.trim().equalsIgnoreCase("ffffffffffffffff") || cmd.trim().equalsIgnoreCase("0000000000000000")){
+                log.error("舍弃掉未配置耳标号的耳标,"+askText+"");
+            }else{
+                System.out.println("-->3.4");
+                //发送到耳标处理消息队列
+                rabbitTemplate.convertAndSend(Const.EXCHANGE_ASK_EARTAG, Const.ROUTING_KEY_ASK_EARTAG, map);
+                System.out.println("## --> 发送耳标处理模块.");
+            }
+        }
+        System.out.println("-->3.5");
+    }
+
+    @Override
+    public void sendEartagMQ(Map map) {
+        //发送到耳标处理消息队列
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ASK_EARTAG, Const.ROUTING_KEY_ASK_EARTAG, map);
+    }
+
+
+    public String handleClientAsk_1(String askText) throws ParseException {
 //        System.out.println("000拆分粘包之后数据>>"+askText);
         //--对接收的上报数据解析
         String answer = parseAskText2(askText);
@@ -282,7 +501,8 @@ public class DataServiceImpl implements IDataService {
     }
 
     /* 根本设备id获取设备编码 */
-    private String getDeviceCode(String chipId) {
+    @Override
+    public String getDeviceCodeByChipId(String chipId) {
 //        ValueOperations ops = redisTemplate.opsForValue();
 //        ops.set("deviceCode", "202007239999869");
 //        String deviceCode = (String) ops.get("deviceCode");
@@ -303,6 +523,12 @@ public class DataServiceImpl implements IDataService {
         return deviceCode;
     }
 
+    @Override
+    public void sendDeviceMQ(Map map) {
+        //发送到耳标处理消息队列
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ASK_DEVICE, Const.ROUTING_KEY_ASK_DEVICE, map);
+    }
+
     /**
      * 解析接收数据
      */
@@ -322,8 +548,8 @@ public class DataServiceImpl implements IDataService {
                 answer = null;
             } else if (cmd.trim().equalsIgnoreCase("1")) {
                 //获取设备编码
-                /* 读取设备编码 */
-                String deviceCode = getDeviceCode(idCode);
+                //{读取设备编码}
+                String deviceCode = getDeviceCodeByChipId(idCode);
                 answer = "hm+1+0+" + deviceCode + "+123+8+end";
                 log.info("##获取设备编码-应答数据>>" + answer);
             } else if (cmd.trim().equalsIgnoreCase("2")) {
@@ -377,7 +603,7 @@ public class DataServiceImpl implements IDataService {
             } else if (cmd.trim().equalsIgnoreCase("1")) {
                 //获取设备编码
                 /* 读取设备编码 */
-                String deviceCode = getDeviceCode(device);
+                String deviceCode = getDeviceCodeByChipId(device);
                 answer = "hm+1+0+" + deviceCode + "+123+8+end";
                 log.info("##获取设备编码-应答数据>>" + answer);
             } else if (cmd.trim().equalsIgnoreCase("2")) {
@@ -569,7 +795,7 @@ public class DataServiceImpl implements IDataService {
             } else if (cmd.trim().equalsIgnoreCase("1")) {
                 //获取设备编码
                 /* 读取设备编码 */
-                String deviceCode = getDeviceCode(device);
+                String deviceCode = getDeviceCodeByChipId(device);
                 answer = "hm+1+0+" + deviceCode + "+123+8+end";
                 log.info("##获取设备编码-应答数据>>" + answer);
             } else if (cmd.trim().equalsIgnoreCase("2")) {

+ 6 - 1
huimv-eartag2-platform/huimv-eartag2-input/src/main/resources/application.properties

@@ -3,7 +3,9 @@ spring.profiles.active=dev
 #开启健康监控
 management.endpoints.web.exposure.include=*
 
-###################################################配置undertow取代tomcat
+#########################################################
+###             配置undertow取代tomcat                ###
+#########################################################
 # 是否打开 undertow 日志,默认为 false
 server.undertow.accesslog.enabled=false
 # 设置访问日志所在目录
@@ -20,3 +22,6 @@ server.undertow.max-http-post-size=0
 #########################################################
 management.security.enabled=false
 
+# 数据处理流程
+data.input.flow=2
+

+ 6 - 1
huimv-eartag2-platform/huimv-eartag2-manage/pom.xml

@@ -49,13 +49,18 @@
                 </exclusion>
             </exclusions>
         </dependency>
-
         <!-- 添加 Undertow 容器 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-undertow</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.5</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 64 - 0
huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/config/RestTemplateConfig.java

@@ -0,0 +1,64 @@
+package com.huimv.eartag2.manage.config;
+
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@Configuration
+public class RestTemplateConfig {
+    @Bean
+    public RestTemplate restTemplate() {
+        return new RestTemplate(httpRequestFactory());
+    }
+
+    @Bean
+    public ClientHttpRequestFactory httpRequestFactory() {
+        return new HttpComponentsClientHttpRequestFactory(httpClient());
+    }
+
+    @Bean
+    public HttpClient httpClient() {
+        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
+                .register("http", PlainConnectionSocketFactory.getSocketFactory())
+                .register("https", SSLConnectionSocketFactory.getSocketFactory())
+                .build();
+        PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(registry);
+        //最大连接数
+        poolingHttpClientConnectionManager.setMaxTotal(200);
+        //最大路由数
+        poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100);
+        //定义不活动的时间
+        poolingHttpClientConnectionManager.setValidateAfterInactivity(2000);
+        RequestConfig requestConfig = RequestConfig.custom()
+                //服务器返回数据的时间,超时抛出read timeout
+                .setSocketTimeout(65000)
+                //连接上服务器的时间,超时抛出connect timeout
+                .setConnectTimeout(5000)
+                //从连接池中获取的超时时间,超时未拿到连接会报错ConnectionTimeoutException:Timeout waiting for connection from pool
+                .setConnectionRequestTimeout(1000)
+                .build();
+        return HttpClientBuilder.create()
+                .setDefaultRequestConfig(requestConfig)
+                .setConnectionManager(poolingHttpClientConnectionManager)
+                .build();
+    }
+}

+ 33 - 0
huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/config/TopicRabbitMQConfig.java

@@ -0,0 +1,33 @@
+package com.huimv.eartag2.manage.config;
+
+import com.huimv.eartag2.common.mq.Const;
+import org.springframework.amqp.core.Binding;
+import org.springframework.amqp.core.BindingBuilder;
+import org.springframework.amqp.core.Queue;
+import org.springframework.amqp.core.TopicExchange;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@Configuration
+public class TopicRabbitMQConfig {
+    @Bean
+    public Queue syncDeviceRegisterQueue() {
+        return new Queue(Const.QUEUE_SYNC_DEVICE_REGISTER);
+    }
+    @Bean
+    TopicExchange syncDeviceRegisterExchange() {
+        return new TopicExchange(Const.EXCHANGE_SYNC_DEVICE_REGISTER);
+    }
+    @Bean
+    Binding bindingHeartbeatExchangeMessage() {
+        return BindingBuilder.bind(syncDeviceRegisterQueue()).to(syncDeviceRegisterExchange()).with(Const.ROUTING_KEY_SYNC_DEVICE_REGISTER);
+    }
+}

+ 5 - 5
huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/controller/DeviceRegisterController.java

@@ -76,7 +76,7 @@ public class DeviceRegisterController {
     }
 
     @GetMapping("/removeDevice")
-    public Result remove(@RequestParam(value = "ids",required = true) String ids){
+    public Result removeDevice(@RequestParam(value = "ids",required = true) String ids){
         //{移除设备}
         return deviceRegisterService.removeDevice(ids);
     }
@@ -100,12 +100,12 @@ public class DeviceRegisterController {
     }
 
     @GetMapping("/setDeviceStatus")
-    public Result cancelDevice(@RequestParam(value = "id",required = true) Integer id,
+    public Result setDeviceStatus(@RequestParam(value = "id",required = true) Integer id,
                                @RequestParam(value = "deviceStatus",required = true) Integer deviceStatus){
-        log.info("(cancelDevice).id>>"+id);
-        log.info("(cancelDevice).deviceStatus>>"+deviceStatus);
+        log.info("(setDeviceStatus).id>>"+id);
+        log.info("(setDeviceStatus).deviceStatus>>"+deviceStatus);
         //{注销设备}
-        return deviceRegisterService.cancelDevice(id,deviceStatus);
+        return deviceRegisterService.setDeviceStatus(id,deviceStatus);
     }
 
 }

+ 67 - 0
huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/controller/TestController.java

@@ -0,0 +1,67 @@
+package com.huimv.eartag2.manage.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.huimv.eartag2.common.mq.Const;
+import com.huimv.eartag2.manage.producer.ManageProducer;
+import com.huimv.eartag2.manage.service.IDeviceService;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.ParseException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@RestController
+@RequestMapping("/test")
+public class TestController {
+    @Autowired
+    private IDeviceService deviceService;
+    @Autowired
+    RabbitTemplate rabbitTemplate;  //使用RabbitTemplate,这提供了接收/发送等等方法
+    @Autowired
+    private ManageProducer producer;
+
+    //
+    @PostMapping("/testRemoteProcessFarmAllStatus")
+    public void testRemoteProcessFarmAllStatus() throws ParseException {
+        deviceService.remoteProcessFarmAllStatus("101");
+    }
+
+    @PostMapping("/testSendMq")
+    public void testSendMq() throws ParseException {
+        System.out.println("2.");
+        Map map = new HashMap();
+        map.put("deviceRegister","{\"activeStatus\":0,\"chipId\":\"30\",\"createDate\":1647878400000,\"deviceAlias\":\"\",\"deviceCode\":\"30\",\"deviceStatus\":0,\"farmId\":\"101\",\"id\":52,\"location\":\"\",\"registerTime\":1647955296670,\"remark\":\"\"}");
+//        map.put("deviceRegister","123");
+
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_SYNC_DEVICE_REGISTER, Const.ROUTING_KEY_SYNC_DEVICE_REGISTER, map);
+        System.out.println("同步设备注册信息 >>"+map.toString());
+        System.out.println("2.1");
+//        return "ok";
+    }
+
+
+    @PostMapping("/testSendMq2")
+    public void testSendMq2() throws ParseException {
+        String msg = "{\"activeStatus\":0,\"chipId\":\"30\",\"createDate\":1647878400000,\"deviceAlias\":\"\",\"deviceCode\":\"30\",\"deviceStatus\":0,\"farmId\":\"101\",\"id\":52,\"location\":\"\",\"registerTime\":1647955296670,\"remark\":\"\"}";
+        producer.sendSyncDeviceRegister(msg);
+//        producer.sendSyncDeviceRegister("456");
+    }
+    //
+//    @PostMapping("/testRemoteProcessFarmAllStatus2")
+//    public void testRemoteProcessFarmAllStatus2() throws ParseException {
+//        deviceService.remoteProcessFarmAllStatus2("101");
+//    }
+}

+ 52 - 0
huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/listener/ManageListener.java

@@ -0,0 +1,52 @@
+package com.huimv.eartag2.manage.listener;
+
+import com.alibaba.fastjson.JSONObject;
+import com.huimv.eartag2.common.mq.Const;
+import com.huimv.eartag2.manage.service.IDeviceService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.Map;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@Component
+@Slf4j
+public class ManageListener {
+    @Autowired
+    private IDeviceService deviceService;
+    /**
+     * @Method      : processSyncDeviceRegister
+     * @Description : 监听处理同步设备注册信息队列
+     * @Params      : [map]
+     * @Return      : void
+     *
+     * @Author      : ZhuoNing
+     * @Date        : 2022/3/22
+     * @Time        : 16:03
+     */
+//    @RabbitListener(queues = Const.QUEUE_SYNC_DEVICE_REGISTER)
+//    @RabbitHandler
+    public void processSyncDeviceRegister(Map map) throws ParseException {
+        System.out.println("3.");
+        JSONObject deviceRegisterJo = JSONObject.parseObject(map.get("deviceRegister").toString()) ;
+//        System.out.println("同步设备注册信息>>"+deviceRegisterJo);
+        //{计算有效设备总数并存储到缓存}
+        deviceService.countEffectiveDeviceTotal(deviceRegisterJo);
+        System.out.println("4.");
+
+        //{计算设备和耳标总状态}
+        deviceService.countFarmAllStatus(deviceRegisterJo);
+        System.out.println("5.");
+    }
+}

+ 34 - 0
huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/producer/ManageProducer.java

@@ -0,0 +1,34 @@
+package com.huimv.eartag2.manage.producer;
+
+import com.alibaba.fastjson.JSONObject;
+import com.huimv.eartag2.common.mq.Const;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@Component
+public class ManageProducer {
+    @Autowired
+    RabbitTemplate rabbitTemplate;  //使用RabbitTemplate,这提供了接收/发送等等方法
+
+    //处理同步设备注册相关信息
+    public String sendSyncDeviceRegister(String deviceRegister) {
+        Map map = new HashMap();
+        map.put("deviceRegister",deviceRegister);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_SYNC_DEVICE_REGISTER, Const.ROUTING_KEY_SYNC_DEVICE_REGISTER, map);
+        System.out.println("同步设备注册信息 >>"+map.toString());
+        return "ok";
+    }
+
+}

+ 16 - 1
huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/service/ICacheService.java

@@ -1,7 +1,7 @@
 package com.huimv.eartag2.manage.service;
 
+import com.huimv.eartag2.common.dao.entity.EartagDeviceRegisterEntity;
 import com.huimv.eartag2.common.dao.entity.EartarFarmAllStatusEntity;
-import com.huimv.eartag2.common.utils.Result;
 
 import java.util.List;
 import java.util.Map;
@@ -32,4 +32,19 @@ public interface ICacheService {
 
     //将芯片ID加入到缓存中
     void putChipIdToCache(String chipId, String deviceCode);
+
+    //将设备编码加入到设备注册当中
+    void putDeviceRegister(String deviceCode, EartagDeviceRegisterEntity deviceRegisterEntity);
+
+    //删除设备注册信息
+    void deleteDeviceRegister(String deviceCode);
+
+    //设置设备总数
+    void putDeviceTotal(Integer effectiveDeviceTotal, String farmId);
+
+    //从集合set当中删除设备编号
+    void deleteDeviceCodeSetCache(String deviceCode);
+
+    //删除芯片ID缓存
+    void deleteChipIdHashCache(String chipId);
 }

+ 1 - 1
huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/service/IDeviceRegisterService.java

@@ -21,5 +21,5 @@ public interface IDeviceRegisterService {
     Result removeBatchDevice(String ids);
 
     //注销设备
-    Result cancelDevice(Integer id, Integer deviceStatus);
+    Result setDeviceStatus(Integer id, Integer deviceStatus);
 }

+ 11 - 0
huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/service/IDeviceService.java

@@ -1,5 +1,6 @@
 package com.huimv.eartag2.manage.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.huimv.eartag2.common.utils.Result;
 
 import java.text.ParseException;
@@ -26,6 +27,10 @@ public interface IDeviceService {
     //查询设备关联的在线耳标统计
     Result listDeviceEartagOnlineCountByDeviceCode(String deviceCode) throws ParseException;
 
+    void remoteProcessFarmAllStatus(String farmId) throws ParseException;
+
+    void remoteProcessFarmAllStatus2(String farmId) throws ParseException;
+
     //查询在线设备
     Result listOnlineDevice(String farmId, String deviceCode, String alias, String addDate, Integer pageNo, Integer pageSize) throws ParseException;
 
@@ -46,4 +51,10 @@ public interface IDeviceService {
 
     //单个耳标指定
     Result listDeviceOnlineCountByDeviceCodeInPager(String deviceCode, String startDate, String endDate, Integer pageNo, Integer pageSize) throws ParseException;
+
+    //同步设备注册信息
+    void countEffectiveDeviceTotal(JSONObject deviceRegister);
+
+    //计算总状态信息
+    void countFarmAllStatus(JSONObject deviceRegisterJo) throws ParseException;
 }

+ 51 - 2
huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/service/impl/CacheServiceImpl.java

@@ -2,17 +2,20 @@ package com.huimv.eartag2.manage.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.huimv.eartag2.common.dao.entity.EartagDeviceRegisterEntity;
 import com.huimv.eartag2.common.dao.entity.EartarFarmAllStatusEntity;
 import com.huimv.eartag2.common.utils.BizConst;
 import com.huimv.eartag2.manage.service.ICacheService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @Project : huimv.shiwan
@@ -23,9 +26,12 @@ import java.util.Set;
  * @Create : 2020-12-25
  **/
 @Service
+@Slf4j
 public class CacheServiceImpl implements ICacheService {
     @Autowired
     private RedisTemplate redisTemplate;
+    @Value("${cache.chipIdExpire}")
+    private Integer chipIdExpire;
 
     @Override
     public Map getFarmAllStatusByFarmId(String farmId) {
@@ -70,7 +76,7 @@ public class CacheServiceImpl implements ICacheService {
     @Override
     public boolean isExistDeviceCode(String deviceCode) {
         String setKey = BizConst.SET_ALL_DEVICE_PREFIX;
-        System.out.println("## setKey>>"+setKey+", deviceCode>>"+deviceCode);
+//        log.info("## setKey>>"+setKey+", deviceCode>>"+deviceCode);
         return redisTemplate.opsForSet().isMember(setKey, deviceCode);
     }
 
@@ -104,5 +110,48 @@ public class CacheServiceImpl implements ICacheService {
         String hashKey = chipId;
         //
         redisTemplate.opsForHash().put(key,hashKey,deviceCode);
+//        redisTemplate.expire(key,chipIdExpire , TimeUnit.HOURS);
+    }
+
+    @Override
+    public void putDeviceRegister(String deviceCode, EartagDeviceRegisterEntity deviceRegisterEntity) {
+        String key = BizConst.DEVICE_REGISTER_PREFIX+deviceCode;
+        System.out.println("## <putDeviceRegister>.key>>"+key);
+        Map map = JSON.parseObject(JSONObject.toJSONString(deviceRegisterEntity),Map.class);
+        redisTemplate.opsForHash().putAll(key,map);
+    }
+
+    @Override
+    public void deleteDeviceRegister(String deviceCode) {
+        String key = BizConst.DEVICE_REGISTER_PREFIX+deviceCode;
+        Object obj = redisTemplate.opsForHash().entries(key);
+        if(obj == null){
+            log.error("##Error 该key["+key+"]的缓存不存在.");
+        }else{
+            redisTemplate.delete(key);
+        }
+    }
+
+    @Override
+    public void putDeviceTotal(Integer effectiveDeviceTotal, String farmId) {
+        String valueKey = BizConst.FARM_DEVICE_TOTAL_PREFIX+farmId;
+        redisTemplate.opsForValue().set(valueKey,effectiveDeviceTotal);
+        // TEST
+//        Object obj = redisTemplate.opsForValue().get(valueKey);
+//        System.out.println("TEST value>>"+obj.toString());
+    }
+
+    @Override
+    public void deleteDeviceCodeSetCache(String deviceCode) {
+        String setKey = BizConst.SET_ALL_DEVICE_PREFIX;
+//        redisTemplate.opsForSet().add(setKey,deviceCode);
+        redisTemplate.opsForSet().remove(setKey, deviceCode);
+    }
+
+    @Override
+    public void deleteChipIdHashCache(String chipId) {
+        String key = BizConst.CHIP_DEVICE_PREFIX;
+        String hashKey = chipId;
+        redisTemplate.opsForHash().delete(key,hashKey);
     }
 }

+ 58 - 5
huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/service/impl/DeviceRegisterServiceImpl.java

@@ -1,11 +1,13 @@
 package com.huimv.eartag2.manage.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.huimv.eartag2.common.dao.entity.EartagDeviceRegisterEntity;
 import com.huimv.eartag2.common.dao.repo.EartagDeviceRegisterRepo;
 import com.huimv.eartag2.common.utils.BizConst;
 import com.huimv.eartag2.common.utils.DateUtil;
 import com.huimv.eartag2.common.utils.Result;
 import com.huimv.eartag2.common.utils.ResultCode;
+import com.huimv.eartag2.manage.producer.ManageProducer;
 import com.huimv.eartag2.manage.service.ICacheService;
 import com.huimv.eartag2.manage.service.IDeviceRegisterService;
 import lombok.extern.slf4j.Slf4j;
@@ -39,6 +41,8 @@ public class DeviceRegisterServiceImpl implements IDeviceRegisterService {
     private EartagDeviceRegisterRepo deviceRegisterRepo;
     @Autowired
     private ICacheService cacheService;
+    @Autowired
+    private com.huimv.eartag2.manage.producer.ManageProducer producer;
 
     @Override
     public Result addDevice(String chipId, String deviceCode, Integer deviceStatus, Integer activeStatus, String deviceAlias, String location, String remark, String farmId) throws ParseException {
@@ -62,10 +66,11 @@ public class DeviceRegisterServiceImpl implements IDeviceRegisterService {
         deviceRegisterEntity.setRemark(remark.trim());
         deviceRegisterEntity.setCreateDate(new java.sql.Date(todayDate.getTime()));
         deviceRegisterRepo.saveAndFlush(deviceRegisterEntity);
-        //加入缓存
-        cacheService.putAllDeviceSet(deviceCode);
-        //加入缓存
-        cacheService.putChipIdToCache(chipId,deviceCode);
+
+        System.out.println("1.");
+        //{设置工作状态}
+        setDeviceWorkStatus(deviceRegisterEntity);
+        System.out.println("1.1");
         return new Result(ResultCode.SUCCESS);
     }
 
@@ -73,6 +78,7 @@ public class DeviceRegisterServiceImpl implements IDeviceRegisterService {
     public Result editDevice(String chipId, String deviceCode, Integer deviceStatus, Integer activeStatus, String deviceAlias, String location, String remark, Integer id) {
         //
         EartagDeviceRegisterEntity deviceRegisterEntity = deviceRegisterRepo.getById(id);
+        Integer lastDeviceStatus = deviceRegisterEntity.getDeviceStatus();
 //        deviceRegisterEntity.setChipId(chipId);
 //        deviceRegisterEntity.setDeviceCode(deviceCode);
         deviceRegisterEntity.setDeviceStatus(deviceStatus);
@@ -81,6 +87,17 @@ public class DeviceRegisterServiceImpl implements IDeviceRegisterService {
         deviceRegisterEntity.setLocation(location);
         deviceRegisterEntity.setRemark(remark);
         deviceRegisterRepo.saveAndFlush(deviceRegisterEntity);
+
+        //设置注销状态
+        if((lastDeviceStatus == 0 || lastDeviceStatus == 1) && deviceStatus == 2){
+            //{设置注销状态}
+            setDeviceCancelStatus(deviceRegisterEntity);
+        }
+        //设置工作状态
+        if(lastDeviceStatus == 2 && (deviceStatus == 1 || deviceStatus == 0)){
+            //{设置工作状态}
+            setDeviceWorkStatus(deviceRegisterEntity);
+        }
         return new Result(ResultCode.SUCCESS);
     }
 
@@ -162,7 +179,7 @@ public class DeviceRegisterServiceImpl implements IDeviceRegisterService {
     }
 
     @Override
-    public Result cancelDevice(Integer id, Integer deviceStatus) {
+    public Result setDeviceStatus(Integer id, Integer deviceStatus) {
         //
         EartagDeviceRegisterEntity deviceRegisterEntity = deviceRegisterRepo.getById(id);
         if(deviceRegisterEntity == null){
@@ -171,9 +188,45 @@ public class DeviceRegisterServiceImpl implements IDeviceRegisterService {
         }
         deviceRegisterEntity.setDeviceStatus(deviceStatus);
         deviceRegisterRepo.saveAndFlush(deviceRegisterEntity);
+        String deviceCode = deviceRegisterEntity.getDeviceCode();
+        //操作缓存
+        if(deviceStatus==1){
+            //{设置工作状态}
+            setDeviceWorkStatus(deviceRegisterEntity);
+        }else if(deviceStatus==2){
+            //{设置注销状态}
+            setDeviceCancelStatus(deviceRegisterEntity);
+        }
         return new Result(ResultCode.SUCCESS);
     }
 
+    //设置工作状态
+    private void setDeviceWorkStatus(EartagDeviceRegisterEntity deviceRegisterEntity) {
+        String deviceCode = deviceRegisterEntity.getDeviceCode();
+        String chipId = deviceRegisterEntity.getChipId();
+        //设置设备注册信息缓存
+        cacheService.putDeviceRegister(deviceCode,deviceRegisterEntity);
+        //{将该设备编号加入到集合Set当中}
+        cacheService.putAllDeviceSet(deviceCode);
+        //{将芯片ID和设备编码加入缓存}
+        cacheService.putChipIdToCache(chipId,deviceCode);
+
+        //{异步处理-设备注册信息}
+        producer.sendSyncDeviceRegister(JSONObject.toJSONString(deviceRegisterEntity));
+    }
+
+    //设置注销状态
+    private void setDeviceCancelStatus(EartagDeviceRegisterEntity deviceRegisterEntity) {
+        String deviceCode = deviceRegisterEntity.getDeviceCode();
+        String chipId = deviceRegisterEntity.getChipId();
+        //删除设备注册消息
+        cacheService.deleteDeviceRegister(deviceCode);
+        //{从集合Set当中删除设备编号}
+        cacheService.deleteDeviceCodeSetCache(deviceCode);
+        //{删除芯片ID缓存}
+        cacheService.deleteChipIdHashCache(chipId);
+    }
+
     @Override
     public Result removeDevice(String ids) {
         String[] idArray = ids.split(",");

+ 74 - 0
huimv-eartag2-platform/huimv-eartag2-manage/src/main/java/com/huimv/eartag2/manage/service/impl/DeviceServiceImpl.java

@@ -7,6 +7,7 @@ import com.huimv.eartag2.common.dao.entity.*;
 import com.huimv.eartag2.common.dao.repo.*;
 //import com.huimv.eartag2.common.service.IDevice;
 import com.huimv.eartag2.common.utils.*;
+import com.huimv.eartag2.common.vo.FarmAllStatusVo;
 import com.huimv.eartag2.manage.service.ICacheService;
 import com.huimv.eartag2.manage.service.IDeviceService;
 import lombok.extern.slf4j.Slf4j;
@@ -15,6 +16,9 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.data.domain.*;
 import org.springframework.data.jpa.domain.Specification;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
 
 import javax.persistence.criteria.*;
 
@@ -23,6 +27,7 @@ import java.sql.Date;
 import java.sql.Timestamp;
 import java.text.ParseException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -39,6 +44,12 @@ import java.util.Map;
 public class DeviceServiceImpl implements IDeviceService {
     @Value("${device.online.access_mode}")
     private String deviceOnlineAccessMode;
+    @Value("${service.farmAllStatus.host}")
+    private String serviceFarmAllStatusHost;
+    @Value("${service.farmAllStatus.ip}")
+    private String serviceFarmAllStatusIp;
+    @Value("${service.farmAllStatus.url}")
+    private String serviceFarmAllStatusUrl;
     @Autowired
     private ICacheService cacheService;
     @Autowired
@@ -390,6 +401,68 @@ public class DeviceServiceImpl implements IDeviceService {
         return new Result(ResultCode.SUCCESS, outDataJo);
     }
 
+    @Override
+    public void countEffectiveDeviceTotal (JSONObject deviceRegisterJo) {
+        String farmId = deviceRegisterJo.getString("farmId");
+        //{}
+        Integer effectiveDeviceTotal = getEffectiveDeviceSum(farmId);
+        System.out.println("## effectiveDeviceTotal>>"+effectiveDeviceTotal);
+        //{设置设备总数}
+        cacheService.putDeviceTotal(effectiveDeviceTotal,farmId);
+    }
+
+    @Override
+    public void countFarmAllStatus(JSONObject deviceRegisterJo) throws ParseException {
+        String farmId = deviceRegisterJo.getString("farmId");
+        //{}
+        remoteProcessFarmAllStatus(farmId);
+    }
+
+    @Override
+    public void remoteProcessFarmAllStatus(String farmId) throws ParseException {
+        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());
+
+        RestTemplate restTemplate = new RestTemplate();
+
+        String url = "http://" + serviceFarmAllStatusHost + ":" + serviceFarmAllStatusIp + serviceFarmAllStatusUrl;
+        System.out.println("## url>>"+url);
+
+        FarmAllStatusVo farmAllStatusVo = new FarmAllStatusVo();
+        farmAllStatusVo.setFarmId(farmId);
+        farmAllStatusVo.setTodayDateText(todayDateText);
+        farmAllStatusVo.setTodayDate(todayDate);
+        farmAllStatusVo.setNowTimestamp(nowTimestamp);
+        //{}
+        String result = restTemplate.postForObject(url,farmAllStatusVo,String.class);
+        System.out.println("result>>"+result);
+    }
+
+    @Override
+    public void remoteProcessFarmAllStatus2(String farmId) throws ParseException {
+        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());
+
+        RestTemplate restTemplate = new RestTemplate();
+        String host = "192.168.1.30";
+        String port = "8092";
+        String service = "/deviceController/updateFarmAllStatus";
+        String url = "http://" + host + ":" + port + service+"?farmId="+farmId+"&todayDateText="+todayDateText+"&todayDate="+todayDate+"&nowTimestamp="+nowTimestamp;
+        System.out.println("## url>>"+url);
+        //{}
+        String result = restTemplate.getForObject(url,String.class);
+        System.out.println("result>>"+result);
+    }
+
+    public Integer getEffectiveDeviceSum(String farmId){
+        List<Object[]> deviceRegisterList = deviceRegisterRepo.getDeviceCountByFarmId(farmId);
+        Object[] deviceRegObj = (Object[]) deviceRegisterList.get(0);
+        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+deviceRegObj[0].toString());
+        //设备总数
+        return Integer.parseInt(deviceRegObj[0].toString());
+    }
     /**
      * @Method : listOnlineDevice
      * @Description :
@@ -617,6 +690,7 @@ public class DeviceServiceImpl implements IDeviceService {
     private Result listDeviceOnlineFromCache(String farmId, String todayDate) {
 
 
+
         return null;
     }
 

+ 9 - 0
huimv-eartag2-platform/huimv-eartag2-manage/src/main/resources/application.properties

@@ -3,6 +3,13 @@ spring.profiles.active=dev
 # mysql:/cache:
 device.online.access_mode=mysql
 
+# 添加机器和设备过期时间
+cache.chipIdExpire=48
+
+#
+service.farmAllStatus.url=/deviceController/updateFarmAllStatus
+service.farmAllStatus.host=192.168.1.68
+service.farmAllStatus.ip=8092
 
 ###################################################配置undertow取代tomcat
 # 是否打开 undertow 日志,默认为 false
@@ -27,3 +34,5 @@ server.undertow.max-http-post-size=0
 
 
 
+
+