Переглянути джерело

RFID业务逻辑开发完成

k 2 роки тому
батько
коміт
4d4cc0f8fd

+ 6 - 0
ruoyi-admin/src/main/java/com/ruoyi/init/StartService.java

@@ -42,6 +42,8 @@ public class StartService implements CommandLineRunner {
 
     /**
      * 自动接驳位任务
+     * 1.扫描有货的接驳位,如果标记是ASN则进行自动入库
+     * 2.扫描有货的接驳位,如果标记是SO则进行自动出库
      */
     public void autoTranSitTask() {
         autoTranSitTask.run();
@@ -49,6 +51,8 @@ public class StartService implements CommandLineRunner {
 
     /**
      * 自动RFID读取任务(墙外)
+     * 1.带有标签的人工叉车靠近RFID阅读器,开启自动门
+     * 2.带有标签的人工叉车离开RFID阅读器,关闭自动门
      */
     public void autoRfidReaderTask() {
         autoRfidReaderTask.run();
@@ -63,6 +67,8 @@ public class StartService implements CommandLineRunner {
 
     /**
      * 自动按钮盒监控任务
+     * 1.人工卸完货之后按下冲边按钮,触发冲边搬运任务
+     * 2.人工卸完货之后按下硫化按钮,触发硫化搬运任务
      */
     public void autoButtonBoxTask() {
         autoButtonBoxTask.run();

+ 14 - 4
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/test/RfidReaderTestController.java

@@ -8,6 +8,8 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 /**
  * @author JWK
  * @version 1.0
@@ -24,20 +26,28 @@ public class RfidReaderTestController {
 
     /**
      * 读取标签-读一次
+     *
+     * @param con true 墙外 | false 室内
      */
     @ApiOperation("读取标签")
     @PostMapping("/readTags")
-    public String[] readTags() {
-        return rfidReaderClient.readTags();
+    public List<String> readTags(boolean con) {
+        return con ? rfidReaderClient.readTagsOut() : rfidReaderClient.readTagsIn();
     }
 
     /**
      * 读取标签-循环读
+     *
+     * @param con true 墙外 | false 室内
      */
     @ApiOperation("读取标签-循环读")
     @PostMapping("/readTagsTest")
-    public void readTagsTest() {
-        rfidReaderClient.readTagsTest();
+    public void readTagsTest(boolean con) {
+        if (con) {
+            rfidReaderClient.readTagsOut();
+        } else {
+            rfidReaderClient.readTagsIn();
+        }
     }
 
 }

+ 6 - 0
warewms-ams/pom.xml

@@ -21,6 +21,12 @@
             <artifactId>ruoyi-common</artifactId>
         </dependency>
 
+        <!-- 系统模块-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-system</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>com.ruoyi</groupId>
             <artifactId>warewms-base</artifactId>

+ 75 - 0
warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/thread/AutoRfidReaderTask.java

@@ -2,10 +2,13 @@ package com.ruoyi.ams.agv.ndc.thread;
 
 import com.ruoyi.hard.modbus.tcp.AutoDoorClient;
 import com.ruoyi.hard.rfid.RFIDReaderClient;
+import com.ruoyi.system.service.ISysConfigService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 @Slf4j
 @Service
 public class AutoRfidReaderTask {
@@ -14,10 +17,82 @@ public class AutoRfidReaderTask {
     private RFIDReaderClient rfidReaderClient;
     @Autowired
     private AutoDoorClient autoDoorClient;
+    @Autowired
+    private ISysConfigService iSysConfigService;
+
+    /**
+     * redis-key(RFID标签ID,墙外)
+     */
+    public static final String REDIS_KEY_RFID_TAGID_OUT = "sys.rfid.tag.out";
+    /**
+     * redis-key(RFID标签ID,室内)
+     */
+    public static final String REDIS_KEY_RFID_TAGID_IN = "sys.rfid.tag.in";
+
+    /**
+     * 关门次数,每次关门会累加一次,但是开门会初始化为0
+     */
+    private int closeOutDoorNum = 10;
+    private int closeInDoorNum = 10;
+
+    /**
+     * 关门上限,因为大部分时间都是读不到标签的 所以关门的指令不能一直重复下发
+     */
+    private int closeDoorMax = 10;
 
+    /**
+     * RFID读取任务(墙外)
+     */
     public void run() {
+        String tagId = iSysConfigService.selectConfigByKey(REDIS_KEY_RFID_TAGID_OUT);
+        List<String> tagList = rfidReaderClient.readTagsOut();
+        execute(tagId, tagList, true);
     }
 
+
+    /**
+     * RFID读取任务(室内)
+     */
     public void run01() {
+        String tagId = iSysConfigService.selectConfigByKey(REDIS_KEY_RFID_TAGID_IN);
+        List<String> tagList = rfidReaderClient.readTagsIn();
+        execute(tagId, tagList, false);
+    }
+
+    /**
+     * 执行任务
+     *
+     * @param tagId     需要校验的标签ID
+     * @param tagList   RFID读取到的tagId
+     * @param isOutdoor 是否墙外的自动门
+     */
+    public void execute(String tagId, List<String> tagList, boolean isOutdoor) {
+        if (tagList == null) {
+            // 如果没有读到标签 关闭自动门
+            // 因为大部分时间都是读不到标签的 所以关门的指令不能一直重复下发
+            // 记录关门的次数 超过10次 就不再重复关门
+            if (isOutdoor ? closeOutDoorNum < 10 : closeInDoorNum < 10) {
+                autoDoorClient.sendClose(isOutdoor);
+            }
+            return;
+        }
+        boolean contains = tagList.contains(tagId);
+        // 如果读到标签 打开自动门
+        if (contains) {
+            autoDoorClient.sendOpen(isOutdoor);
+            if (isOutdoor) {
+                closeOutDoorNum = 0;
+            } else {
+                closeInDoorNum = 0;
+            }
+        } else {
+            // 如果没有读到标签 关闭自动门
+            // 因为大部分时间都是读不到标签的 所以关门的指令不能一直重复下发
+            // 记录关门的次数 超过10次 就不再重复关门
+            if (isOutdoor ? closeOutDoorNum < 10 : closeInDoorNum < 10) {
+                autoDoorClient.sendClose(isOutdoor);
+            }
+        }
+
     }
 }

+ 47 - 7
warewms-hard/src/main/java/com/ruoyi/hard/rfid/RFIDReaderClient.java

@@ -27,22 +27,42 @@ public class RFIDReaderClient {
 
     @Autowired(required = false)
     private RfidReaderTemplate rfidReaderTemplateFirst;
+    @Autowired(required = false)
+    private RfidReaderTemplate rfidReaderTemplateSecond;
 
 
-    public String[] readTags() {
+    /**
+     * 读取标签 墙外
+     *
+     * @return
+     */
+    public List<String> readTagsOut() {
         RfidReaderUtil rfidReaderUtil = rfidReaderTemplateFirst.getRfidReaderUtil();
         TagData[] tagData = rfidReaderUtil.readTags();
         if (tagData == null) {
-            log.error("读取标签为空!");
             return null;
-        } else {
-            List<String> tagIdList = Arrays.stream(tagData).map(v -> v.getTagID()).collect(Collectors.toList());
-            String[] strings = new String[tagIdList.size()];
-            return tagIdList.toArray(strings);
         }
+        return Arrays.stream(tagData).map(v -> v.getTagID()).collect(Collectors.toList());
     }
 
-    public void readTagsTest() {
+    /**
+     * 读取标签 室内
+     *
+     * @return
+     */
+    public List<String> readTagsIn() {
+        RfidReaderUtil rfidReaderUtil = rfidReaderTemplateSecond.getRfidReaderUtil();
+        TagData[] tagData = rfidReaderUtil.readTags();
+        if (tagData == null) {
+            return null;
+        }
+        return Arrays.stream(tagData).map(v -> v.getTagID()).collect(Collectors.toList());
+    }
+
+    /**
+     * 读取标签测试 墙外
+     */
+    public void readTagsOutTest() {
         RfidReaderUtil rfidReaderUtil = rfidReaderTemplateFirst.getRfidReaderUtil();
         for (; ; ) {
             TagData[] tagData = rfidReaderUtil.readTags();
@@ -58,4 +78,24 @@ public class RFIDReaderClient {
             }
         }
     }
+
+    /**
+     * 读取标签测试 室内
+     */
+    public void readTagsInTest() {
+        RfidReaderUtil rfidReaderUtil = rfidReaderTemplateSecond.getRfidReaderUtil();
+        for (; ; ) {
+            TagData[] tagData = rfidReaderUtil.readTags();
+            if (tagData == null) {
+                log.error("读取标签为空!");
+            } else {
+                List<String> tagIdList = Arrays.stream(tagData).map(v -> v.getTagID()).collect(Collectors.toList());
+                String[] strings = new String[tagIdList.size()];
+                String[] tagIds = tagIdList.toArray(strings);
+                System.out.println("--------------RFID读取标签--------------------");
+                Arrays.stream(tagIds).forEach(v -> System.out.println(v));
+                System.out.println("--------------RFID读取标签--------------------");
+            }
+        }
+    }
 }