Browse Source

扫描rfid

home 2 years ago
parent
commit
539c3faad5

+ 5 - 0
hx-common/common-websocket/src/main/java/com/fjhx/entity/SendEntity.java

@@ -1,6 +1,9 @@
 package com.fjhx.entity;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
 
@@ -10,6 +13,8 @@ public class SendEntity {
     /**
      * 消息创建时间
      */
+    @DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME)
+    @JsonFormat(pattern = DateUtil.PATTERN_DATETIME)
     private Date createTime;
 
     /**

+ 9 - 5
hx-common/common-websocket/src/main/java/com/fjhx/event/WebSocketOnMessageEvent.java

@@ -2,6 +2,7 @@ package com.fjhx.event;
 
 import com.alibaba.fastjson.JSONObject;
 import com.fjhx.service.WebSocketServer;
+import com.fjhx.utils.Assert;
 import lombok.Getter;
 import org.springframework.context.ApplicationEvent;
 
@@ -13,13 +14,11 @@ public class WebSocketOnMessageEvent extends ApplicationEvent {
 
     private final String userId;
     private final String message;
-    private final JSONObject messageJSONObject;
 
     public WebSocketOnMessageEvent(WebSocketServer source, String userId, String message) {
         super(source);
         this.userId = userId;
         this.message = message;
-        this.messageJSONObject = JSONObject.parseObject(message);
     }
 
     @Override
@@ -27,12 +26,17 @@ public class WebSocketOnMessageEvent extends ApplicationEvent {
         return (WebSocketServer) super.getSource();
     }
 
+    public JSONObject getMessageObj() {
+        return JSONObject.parseObject(message);
+    }
+
     /**
      * 消息类型
      */
-    public String getType() {
-        return messageJSONObject.getString("type");
+    public Integer getType() {
+        Integer type = getMessageObj().getInteger("type");
+        Assert.notEmpty(type, "消息类型不能为空");
+        return type;
     }
 
-
 }

+ 1 - 1
hx-common/common-websocket/src/main/java/com/fjhx/service/WebSocketServer.java

@@ -68,7 +68,7 @@ public class WebSocketServer {
      */
     @OnMessage
     public void onMessage(String message) {
-        // 发布建立关闭连接事件
+        // 推送消息事件
         applicationContext.publishEvent(new WebSocketOnMessageEvent(this, userId, message));
     }
 

+ 20 - 0
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/constants/InstructTypeConstant.java

@@ -0,0 +1,20 @@
+package com.fjhx.constants;
+
+public interface InstructTypeConstant {
+
+    /**
+     * 开始并返回所有数据
+     */
+    Integer INSTRUCT_TYPE_1 = 1;
+
+    /**
+     * 开始并返回去重数据
+     */
+    Integer INSTRUCT_TYPE_2 = 2;
+
+    /**
+     * 关闭
+     */
+    Integer INSTRUCT_TYPE_3 = 3;
+
+}

+ 21 - 0
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/constants/RabbitConstant.java

@@ -0,0 +1,21 @@
+package com.fjhx.constants;
+
+public interface RabbitConstant {
+
+    /**
+     * 交换机
+     */
+    String RFID_EXCHANGE = "rfid_exchange";
+
+    /**
+     * 指令路由器
+     */
+    String INSTRUCTIONS_ROUTING_KEY = "instructions_routingKey";
+    
+
+    /**
+     * rfid数据队列
+     */
+    String RFID_DATA_QUEUE = "rfid_data_queue";
+
+}

+ 52 - 0
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/enums/WebSocketOnMessageTypeEnum.java

@@ -0,0 +1,52 @@
+package com.fjhx.enums;
+
+import com.fjhx.utils.Assert;
+import lombok.Getter;
+
+import java.util.HashMap;
+
+/**
+ * 质检状态
+ */
+@Getter
+public enum WebSocketOnMessageTypeEnum {
+
+    HANDHELD_MACHINE_RFID_SCANNING(1, "一体机rfid扫描"),
+    HANDHELD_MACHINE_RFID_CLOSE_SCANNING(2, "一体机关闭rfid扫描")
+
+    ;
+
+    private final Integer type;
+    private final String name;
+
+    private static final HashMap<Integer, WebSocketOnMessageTypeEnum> map = new HashMap<>();
+
+    WebSocketOnMessageTypeEnum(Integer type, String name) {
+        this.type = type;
+        this.name = name;
+    }
+
+    static {
+        for (WebSocketOnMessageTypeEnum value : WebSocketOnMessageTypeEnum.values()) {
+            map.put(value.getType(), value);
+        }
+    }
+
+    /**
+     * 根据type获取枚举
+     */
+    public static WebSocketOnMessageTypeEnum get(Integer type) {
+        WebSocketOnMessageTypeEnum webSocketOnMessageTypeEnum = map.get(type);
+        Assert.notEmpty(webSocketOnMessageTypeEnum, "未知type类型");
+        return webSocketOnMessageTypeEnum;
+    }
+
+    /**
+     * 根据type值获取枚举
+     */
+    public static String getName(Integer type) {
+        return map.get(type).getName();
+    }
+
+
+}

+ 8 - 6
hx-service/pom.xml

@@ -61,12 +61,6 @@
 
             <dependency>
                 <groupId>com.fjhx</groupId>
-                <artifactId>common-flow-api</artifactId>
-                <version>${hx.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.fjhx</groupId>
                 <artifactId>service-flow-api</artifactId>
                 <version>${hx.version}</version>
             </dependency>
@@ -113,6 +107,14 @@
                 <version>${hx.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-amqp</artifactId>
+                <version>2.7.1</version>
+            </dependency>
+
+
+
         </dependencies>
     </dependencyManagement>
 

+ 5 - 0
hx-service/storage-restructure/pom.xml

@@ -48,6 +48,11 @@
             <artifactId>common-websocket</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 58 - 0
hx-service/storage-restructure/src/main/java/com/fjhx/listener/RfidDataListener.java

@@ -0,0 +1,58 @@
+package com.fjhx.listener;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fjhx.service.WebSocketServer;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
+import org.springframework.retry.annotation.Backoff;
+import org.springframework.retry.annotation.EnableRetry;
+import org.springframework.retry.annotation.Retryable;
+import org.springframework.stereotype.Component;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * rabbitmq队列监听工具
+ */
+
+@Slf4j
+@EnableRetry
+@Component
+public class RfidDataListener implements ChannelAwareMessageListener {
+
+    /**
+     * 监听rfid数据队列
+     */
+    @RabbitHandler
+    @RabbitListener(
+            queues = {
+                    "rfid_data_queue"
+            }
+    )
+    @Retryable(value = {Exception.class}, backoff = @Backoff(delay = 3000, multiplier = 1))
+    @Override
+    public void onMessage(Message message, Channel channel) throws Exception {
+        try {
+            String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+            JSONObject jsonObject = JSONObject.parseObject(msg);
+
+            log.info(msg);
+
+            String userId = jsonObject.getString("userId");
+            WebSocketServer.sendInfo(userId, jsonObject.toJSONString());
+
+            // 手动签收消息,通知mq服务器端删除该消息
+            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+        } catch (Exception e) {
+            e.printStackTrace();
+            // 丢弃该消息
+            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
+            throw e;
+        }
+    }
+
+}

+ 113 - 17
hx-service/storage-restructure/src/main/java/com/fjhx/listener/WebSocketEventListener.java

@@ -1,37 +1,133 @@
 package com.fjhx.listener;
 
 import com.alibaba.fastjson.JSONObject;
-import com.fjhx.entity.SendEntity;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.fjhx.constants.InstructTypeConstant;
+import com.fjhx.constants.RabbitConstant;
+import com.fjhx.enums.WebSocketOnMessageTypeEnum;
 import com.fjhx.event.WebSocketOnMessageEvent;
-import com.fjhx.event.WebSocketOnOpenEvent;
-import com.fjhx.event.WebSocketUserOfflineEvent;
-import com.fjhx.service.WebSocketServer;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.tool.utils.ThreadUtil;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.core.MessageBuilder;
+import org.springframework.amqp.core.MessageProperties;
+import org.springframework.amqp.rabbit.connection.CorrelationData;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
 @Component
 public class WebSocketEventListener {
 
+    @Resource
+    private RabbitTemplate rabbitTemplate;
+
+    private RabbitTemplate.ConfirmCallback confirmCallback;
+
+
     @EventListener
-    public void eventListener(WebSocketOnOpenEvent webSocketOnOpenEvent) {
-        WebSocketServer webSocketServer = webSocketOnOpenEvent.getSource();
-        webSocketServer.sendMessage("后端返回:连接成功");
+    public void onMessageListener(WebSocketOnMessageEvent event) {
+
+        String message = event.getMessage();
+
+        JSONObject data = JSONObject.parseObject(message);
+
+        switch (WebSocketOnMessageTypeEnum.get(event.getType())) {
+            case HANDHELD_MACHINE_RFID_SCANNING:
+                handheldMachineRfidScanning(data, event.getUserId(), InstructTypeConstant.INSTRUCT_TYPE_2);
+                break;
+            case HANDHELD_MACHINE_RFID_CLOSE_SCANNING:
+                handheldMachineRfidScanning(data, event.getUserId(), InstructTypeConstant.INSTRUCT_TYPE_3);
+                break;
+        }
     }
 
-    @EventListener
-    public void eventListener(WebSocketOnMessageEvent webSocketOnMessageEvent) {
-        WebSocketServer webSocketServer = webSocketOnMessageEvent.getSource();
-        webSocketServer.sendMessage(webSocketOnMessageEvent.getMessage());
+    /**
+     * 一体机rfid扫描
+     */
+    private void handheldMachineRfidScanning(JSONObject data, String userId, Integer instructType) {
+        Integer plcCode = data.getInteger("plcCode");
+        Integer door = data.getInteger("door");
+        Integer inOut = data.getInteger("inOut");
+
+        JSONObject sendData = new JSONObject();
+        List<String> ips = new ArrayList<>();
+
+        // 赋值ip地址
+        if (plcCode == 1 && door == 1 && inOut == 1) {
+            ips.add("192.168.5.11");
+        } else if (plcCode == 1 && door == 1 && inOut == 2) {
+            ips.add("192.168.5.16");
+        } else if (plcCode == 1 && door == 2 && inOut == 1) {
+            ips.add("192.168.5.15");
+        } else if (plcCode == 2 && door == 1 && inOut == 1) {
+            ips.add("192.168.5.41");
+        } else if (plcCode == 2 && door == 2 && inOut == 2) {
+            ips.add("192.168.5.42");
+        } else {
+            return;
+        }
 
-        JSONObject jsonObject = webSocketOnMessageEvent.getMessageJSONObject();
-        WebSocketServer.sendInfo(jsonObject.getString("toUserId"), jsonObject.getString("contentText"));
+        sendData.put("ips", ips);
+        sendData.put("userId", userId);
+        sendData.put("busUuid", userId);
+        sendData.put("instructType", instructType);
+
+        // 封装消息
+        Message message = MessageBuilder.withBody(sendData.toJSONString().getBytes())
+                .setContentType(MessageProperties.CONTENT_TYPE_JSON)
+                .setContentEncoding("UTF-8")
+                .build();
+
+        sendRabbit(message, 0);
     }
 
-    @EventListener
-    public void eventListener(WebSocketUserOfflineEvent webSocketUserOfflineEvent) {
-        SendEntity sendEntity = webSocketUserOfflineEvent.getSendEntity();
 
-        System.out.println("用户:" + sendEntity.getUserId() + "不在线");
+    /**
+     * 发送消息到rabbitMq
+     *
+     * @param message 消息体
+     * @param i       重试次数
+     */
+    private void sendRabbit(Message message, int i) {
+        int j = ++i;
+
+        // 发送消息
+        this.rabbitTemplate.setMandatory(true);
+        this.rabbitTemplate.setConfirmCallback(getConfirmCallback(j, message));
+        this.rabbitTemplate.convertAndSend(RabbitConstant.RFID_EXCHANGE, RabbitConstant.INSTRUCTIONS_ROUTING_KEY,
+                message, new CorrelationData(IdWorker.getIdStr()));
     }
 
+    /**
+     * 获取回调方法
+     */
+    private synchronized RabbitTemplate.ConfirmCallback getConfirmCallback(int j, Message message) {
+
+        if (confirmCallback == null) {
+            confirmCallback = (CorrelationData correlationData, boolean ack, String cause) -> {
+                // 重试机制
+                if (!ack) {
+                    if (j < 3) {
+                        ThreadUtil.sleep(j * 300L);
+                        sendRabbit(message, j);
+                        log.error("rabbitMqCallback:一体机开启出入库rfid扫描消息推送重试,次数:" + j);
+                    } else {
+                        log.error("rabbitMqCallback:一体机开启出入库rfid扫描消息推送失败");
+                    }
+                } else {
+                    log.info("rabbitMqCallback:success");
+                }
+            };
+        }
+
+        return confirmCallback;
+    }
+
+
 }