hecheng hace 3 años
padre
commit
785f25081e

+ 24 - 11
zd-modules/zd-airbottle/src/main/java/com/zd/airbottle/service/impl/AlarmRecordServiceImpl.java

@@ -28,13 +28,14 @@ import com.zd.system.api.laboratory.domain.RemoteLabHardware;
 import com.zd.system.api.message.RemoteMessageService;
 import com.zd.system.api.netty.RemoteNettyService;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.concurrent.BasicThreadFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.*;
-import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -101,7 +102,8 @@ public class AlarmRecordServiceImpl implements IAlarmRecordService {
         QpBottleStorageRVo storageRVo = storageService.getByElectronicTag(electronicTag);
         if (storageRVo != null) {
             if (hardware!=null){
-                R<Boolean> alarm = remoteNettyService.alarm(hardware);//RFID设备报警
+                //RFID设备报警
+                R<Boolean> alarm = remoteNettyService.alarm(hardware);
                 log.info("==================>{},{}",alarm.getCode(),alarm.getMsg());
             }
             Long id = storageRVo.getId();
@@ -110,13 +112,18 @@ public class AlarmRecordServiceImpl implements IAlarmRecordService {
             if (frid != null) {
                 return 1;
             }
-            sendAlarm(storageRVo);// 发送报警消息
+            // 发送报警消息
+            sendAlarm(storageRVo);
             redisService.setCacheObject(key, electronicTag, 300L, TimeUnit.SECONDS);
             alarmRecord.setAlarmTime(Calendar.getInstance().getTime())
                     .setMasterId(id)
                     .setType(1)
                     .setProductType(1);
             return alarmRecordMapper.insertAlarmRecord(alarmRecord);
+        }else {
+            if (hardware!=null){
+                log.info("==================>{},{}",alarmRecord.getElectronicTag(),"标签无数据");
+            }
         }
         return 0;
     }
@@ -129,12 +136,16 @@ public class AlarmRecordServiceImpl implements IAlarmRecordService {
             if (data != null && !data.isEmpty()) {
                 LabSubject labSubject = data.get(0);
                 String subjectName = labSubject.getName();
-                Long adminId = labSubject.getAdminId();//实验室负责人账号ID
-                String safeUserId = labSubject.getSafeUserId();//安全责任人ID
+                //实验室负责人账号ID
+                Long adminId = labSubject.getAdminId();
+                //安全责任人ID
+                String safeUserId = labSubject.getSafeUserId();
                 //触发声光报警
                 sendHardware(labSubject, subjectName);
-                sendWxMessage(storageRVo, labSubject);//发送微信模板消息
-                sendPhone(storageRVo, subjectName, adminId, safeUserId);//发送电话警报
+                //发送微信模板消息
+                sendWxMessage(storageRVo, labSubject);
+                //发送电话警报
+                sendPhone(storageRVo, subjectName, adminId, safeUserId);
             }
         }
     }
@@ -152,7 +163,7 @@ public class AlarmRecordServiceImpl implements IAlarmRecordService {
                 laboratoryService.controlByInside(hardware.getId(), "01");
                 // 控制响铃时长
                 if (hardware.getRingTime() != null) {
-                    ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
+                    ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1, new BasicThreadFactory.Builder().namingPattern("alarm-pool-%d").daemon(true).build());
                     executorService.schedule(() -> laboratoryService.controlByInside(hardware.getId(), "00"), hardware.getRingTime(), TimeUnit.SECONDS);
                 }
             } else {
@@ -185,8 +196,10 @@ public class AlarmRecordServiceImpl implements IAlarmRecordService {
     }
 
     private void sendWxMessage(QpBottleStorageRVo storageRVo, LabSubject labSubject) {
-        Long adminId = labSubject.getAdminId();//实验室负责人账号ID
-        String safeUserId = labSubject.getSafeUserId();//安全责任人ID
+        //实验室负责人账号ID
+        Long adminId = labSubject.getAdminId();
+        //安全责任人ID
+        String safeUserId = labSubject.getSafeUserId();
         Long ownerId = storageRVo.getOwnerId();
         ArrayList<Long> userIds = new ArrayList<>();
         userIds.add(ownerId);
@@ -230,7 +243,7 @@ public class AlarmRecordServiceImpl implements IAlarmRecordService {
     }
 
     @Override
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public void remoteAdd(InventoryTag tag) {
         insertAlarmRecord(new AlarmRecord().setElectronicTag(tag.getEpc()),tag.getRemoteLabHardware());
     }

+ 19 - 4
zd-modules/zd-netty/src/main/java/com/zd/netty/sdk/DeJuRFIDListenerService.java

@@ -2,6 +2,9 @@ package com.zd.netty.sdk;
 
 import com.gg.reader.api.dal.GClient;
 import com.gg.reader.api.dal.GServer;
+import com.gg.reader.api.protocol.gx.MsgBaseInventoryEpc;
+import com.gg.reader.api.protocol.gx.MsgBaseSetBaseband;
+import com.gg.reader.api.protocol.gx.MsgBaseSetPower;
 import com.gg.reader.api.protocol.gx.MsgBaseStop;
 import com.zd.common.core.enums.HardwareOperate;
 import com.zd.common.core.exception.ServiceException;
@@ -77,15 +80,27 @@ public class DeJuRFIDListenerService implements IService {
      */
     private void subscribeServerHandler(GServer server, RemoteLabHardware hardware) {
         server.onGClientConnected = (client, serialNumber) -> {
-            log.info(client.getName() + "---监听成功");
             client.setSendHeartBeat(true);//开启心跳检测Tcp连接状态
             client.setPrint(true);
             subscribeTcpHandler(client, hardware);//订阅Tcp断连上报
-            DeJuRFIDService.setPower(hardware, client);
-            DeJuRFIDService.setInventory(hardware, client);
-            DeJuRFIDService.setSession(hardware,client);
+            MsgBaseSetBaseband msgBaseSetBaseband = DeJuRFIDService.setSession(hardware, client);
+            if (0 != msgBaseSetBaseband.getRtCode()) {
+                log.error("Session configuration error.");
+               disconnect(hardware);
+            }
+            MsgBaseSetPower msgBaseSetPower = DeJuRFIDService.setPower(hardware, client);
+            if (0 != msgBaseSetPower.getRtCode()) {
+                log.error("Power configuration error.");
+                disconnect(hardware);
+            }
+            MsgBaseInventoryEpc msgBaseInventoryEpc = DeJuRFIDService.setInventory(hardware, client);
+            if (0 != msgBaseInventoryEpc.getRtCode()) {
+                log.error("Inventory epc error.");
+                disconnect(hardware);
+            }
             DeJuRFIDService.subscribeHandler(client, hardware);
             remoteLaboratoryService.update(HardwareOperate.OPEN, hardware.getIpAddress());
+            log.info(client.getName() + "---监听成功");
         };
     }
 

+ 37 - 24
zd-modules/zd-netty/src/main/java/com/zd/netty/sdk/DeJuRFIDService.java

@@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
+import java.io.File;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ScheduledExecutorService;
@@ -24,11 +25,14 @@ public class DeJuRFIDService implements IService {
 
     private static final ISendService sendService = SpringUtils.getBean("sendService");
 
-    private static final Map<String, GClient> clientMap = new ConcurrentHashMap<>();
+    private static final Map<String, GClient> CLIENT_MAP = new ConcurrentHashMap<>();
 
     static AtomicBoolean isAlarm = new AtomicBoolean();
 
-    public static final Integer PORT=8160;
+    public static final Integer PORT = 8160;
+
+    private static final String HTTP_SEPARATOR = ":";
+    private static final Integer TIME_OUT = 2000;
 
     private static final ScheduledExecutorService scheduledExecutorService = SpringUtils.getBean("scheduledExecutorService");
 
@@ -40,15 +44,15 @@ public class DeJuRFIDService implements IService {
     private static void open(RemoteLabHardware hardware) {
         GClient client;
         String ipAddress = hardware.getIpAddress();
-        if (clientMap.containsKey(ipAddress)) {
-            client = clientMap.get(ipAddress);
+        if (CLIENT_MAP.containsKey(ipAddress)) {
+            client = CLIENT_MAP.get(ipAddress);
         } else {
             client = new GClient();
-            clientMap.put(ipAddress, client);
+            CLIENT_MAP.put(ipAddress, client);
         }
-        if (client.openTcp(ipAddress + ":"+PORT, 2000)) {
+        if (client.openTcp(ipAddress + HTTP_SEPARATOR+ PORT, TIME_OUT)) {
             // 订阅标签上报事件
-            subscribeHandler(client,hardware);
+            subscribeHandler(client, hardware);
             // 功率配置, 将4个天线功率都设置为30dBm.
             MsgBaseSetPower msgBaseSetPower = setPower(hardware, client);
             if (0 != msgBaseSetPower.getRtCode()) {
@@ -123,13 +127,24 @@ public class DeJuRFIDService implements IService {
         return msgBaseSetPower;
     }
 
-    public static MsgBaseSetBaseband setSession(RemoteLabHardware hardware, GClient client){
-        MsgBaseGetBaseband msgBaseGetBaseband=new MsgBaseGetBaseband();
-        MsgBaseSetBaseband msgBaseSetBaseband=new MsgBaseSetBaseband();
+    public static MsgBaseSetBaseband setSession(RemoteLabHardware hardware, GClient client) {
+        MsgBaseGetBaseband msgBaseGetBaseband = new MsgBaseGetBaseband();
+        MsgBaseSetBaseband msgBaseSetBaseband = new MsgBaseSetBaseband();
         client.sendSynMsg(msgBaseGetBaseband);
-        if (0==msgBaseGetBaseband.getRtCode()){
-            msgBaseSetBaseband.setSession(hardware.getSessionIndex());
-            client.sendSynMsg(msgBaseSetBaseband);
+        if (0 == msgBaseGetBaseband.getRtCode()) {
+            int session = msgBaseGetBaseband.getSession();
+            log.info("Session index is:==============》{}", session);
+            if (session != hardware.getSessionIndex()) {
+                msgBaseSetBaseband.setSession(hardware.getSessionIndex());
+                client.sendSynMsg(msgBaseSetBaseband);
+                if (0 != msgBaseSetBaseband.getRtCode()) {
+                    log.info("Session epc error.");
+                } else {
+                    log.info("Session epc success.");
+                }
+            } else {
+                msgBaseSetBaseband.setRtCode((byte) 0);
+            }
         }
         return msgBaseSetBaseband;
     }
@@ -151,9 +166,9 @@ public class DeJuRFIDService implements IService {
     public void alarm(RemoteLabHardware hardware) {
         //灯带设置
         String ipAddress = hardware.getIpAddress();
-        if (clientMap.containsKey(ipAddress)){
-            GClient client = clientMap.get(ipAddress);
-            log.info("报警状态:==============》{}",isAlarm.get());
+        if (CLIENT_MAP.containsKey(ipAddress)) {
+            GClient client = CLIENT_MAP.get(ipAddress);
+            log.info("报警状态:==============》{}", isAlarm.get());
             if (!isAlarm.get()) {
                 scheduledExecutorService.execute(() -> {
                     isAlarm.set(true);
@@ -165,8 +180,8 @@ public class DeJuRFIDService implements IService {
 
     public static void close(RemoteLabHardware hardware) {
         String ipAddress = hardware.getIpAddress();
-        if (clientMap.containsKey(ipAddress)) {
-            GClient client = clientMap.get(ipAddress);
+        if (CLIENT_MAP.containsKey(ipAddress)) {
+            GClient client = CLIENT_MAP.get(ipAddress);
             changeGpo(0, client, 0);
             MsgBaseStop msg = new MsgBaseStop();
             // 停止读卡,空闲态
@@ -174,7 +189,7 @@ public class DeJuRFIDService implements IService {
             String result = msg.getRtCode() == 0 ? "成功" : "失败";
             log.info("客户端停止读卡{}", result);
             client.close();
-            clientMap.remove(ipAddress);
+            CLIENT_MAP.remove(ipAddress);
         }
     }
 
@@ -185,7 +200,7 @@ public class DeJuRFIDService implements IService {
         client.sendSynMsg(msgAppSetGpo);
         String status = state == 1 ? "start" : "stop";
         if (0 == msgAppSetGpo.getRtCode()) {
-            log.info("============》灯带{}成功.",status);
+            log.info("============》灯带{}成功.", status);
             if (state == 1) {
                 stopGpo(client, delayTime);
             } else {
@@ -211,14 +226,12 @@ public class DeJuRFIDService implements IService {
     /**
      * 订阅6c标签信息上报
      *
-     * @param client 客户端
+     * @param client   客户端
      * @param hardware 设备数据
      */
     public static void subscribeHandler(GClient client, RemoteLabHardware hardware) {
         String ipAddress = hardware.getIpAddress();
-        if (!clientMap.containsKey(ipAddress)){
-            clientMap.put(ipAddress,client);
-        }
+        CLIENT_MAP.computeIfAbsent(ipAddress, f -> client);
         client.onTagEpcLog = (s, logBaseEpcInfo) -> {
             if (logBaseEpcInfo.getResult() == 0) {
                 log.info("===========》{}", logBaseEpcInfo.getEpc());