From f5e49b2c04137fdc88c453cbe5d190cf7daab079 Mon Sep 17 00:00:00 2001
From: Junjie <DELL@qq.com>
Date: 星期二, 30 十二月 2025 15:39:53 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java |  135 +++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 125 insertions(+), 10 deletions(-)

diff --git a/src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java b/src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java
index 2df5438..9ac77c5 100644
--- a/src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java
@@ -1,6 +1,8 @@
 package com.zy.core.thread.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.common.DateUtils;
 import com.core.common.SpringUtils;
@@ -12,11 +14,10 @@
 import com.zy.asrs.service.BasDualCrnpService;
 import com.zy.asrs.utils.Utils;
 import com.zy.common.utils.RedisUtil;
+import com.zy.core.News;
 import com.zy.core.cache.MessageQueue;
 import com.zy.core.cache.OutputQueue;
-import com.zy.core.enums.CrnTaskModeType;
-import com.zy.core.enums.RedisKeyType;
-import com.zy.core.enums.SlaveType;
+import com.zy.core.enums.*;
 import com.zy.core.model.CommandResponse;
 import com.zy.core.model.Task;
 import com.zy.core.model.command.DualCrnCommand;
@@ -30,6 +31,8 @@
 
 import java.text.MessageFormat;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ThreadFactory;
@@ -51,6 +54,7 @@
     private volatile boolean closed = false;
     private ScheduledExecutorService readExecutor;
     private ScheduledExecutorService processExecutor;
+    private ScheduledExecutorService commandExecutor;
 
     public ZySiemensDualCrnThread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
         this.deviceConfig = deviceConfig;
@@ -102,11 +106,91 @@
                 if (task != null) {
                     step = task.getStep();
                 }
-                if (step == 2 && task != null) {
+
+                if (step == 2) {
+                    List<DualCrnCommand> commandList = (List<DualCrnCommand>) task.getData();
+                    DualCrnCommand command = commandList.get(0);
+
+                    HashMap<String, Object> map = new HashMap<>();
+                    map.put("commands", commandList);
+                    map.put("idx", 1);
+                    redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_.key + command.getTaskNo(), JSON.toJSONString(map, SerializerFeature.DisableCircularReferenceDetect), 60 * 60 * 24);
+                    sendCommand(command);
+                } else if (step == 3) {
                     sendCommand((DualCrnCommand) task.getData());
                 }
             } catch (Exception e) {
                 e.printStackTrace();
+            }
+        }, 0, 200, TimeUnit.MILLISECONDS);
+
+        commandExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
+            @Override
+            public Thread newThread(Runnable r) {
+                Thread t = new Thread(r);
+                t.setName("DualCrnCommand-" + deviceConfig.getDeviceNo());
+                t.setDaemon(true);
+                return t;
+            }
+        });
+        commandExecutor.scheduleAtFixedRate(() -> {
+            if (closed || Thread.currentThread().isInterrupted()) {
+                return;
+            }
+            try {
+                if(crnProtocol.getMode() != DualCrnModeType.AUTO.id) {
+                    return;
+                }
+
+                if(crnProtocol.getAlarm() != 0) {
+                    return;
+                }
+
+                //绛夊緟涓嬩竴涓换鍔�
+                Object wait = redisUtil.get(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo());
+                if (wait != null) {
+                    return;
+                }
+
+                if(crnProtocol.getTaskNo() > 0 && crnProtocol.getStatus() == DualCrnStatusType.IDLE.id) {
+                    Integer taskNo = crnProtocol.getTaskNo();
+                    Object commandObj = redisUtil.get(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo);
+                    if (commandObj == null) {
+                        News.error("鍙屽伐浣嶅爢鍨涙満锛屽伐浣�1绌洪棽绛夊緟涓嬪彂鍛戒护锛屼絾鏈壘鍒板懡浠ゃ�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", crnProtocol.getCrnNo(), taskNo);
+                        return;
+                    }
+
+                    JSONObject commandMap = JSON.parseObject(commandObj.toString());
+                    Integer idx = commandMap.getInteger("idx");
+                    List<DualCrnCommand> commandList = commandMap.getJSONArray("commands").toJavaList(DualCrnCommand.class);
+                    DualCrnCommand dualCommand = commandList.get(idx);
+                    idx++;
+                    commandMap.put("idx", idx);
+                    sendCommand(dualCommand);
+                    redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo, commandMap.toJSONString(), 60 * 60 * 24);
+                }
+
+                if(crnProtocol.getTaskNoTwo() > 0 && crnProtocol.getStatusTwo() == DualCrnStatusType.IDLE.id) {
+                    Integer taskNo = crnProtocol.getTaskNoTwo();
+                    Object commandObj = redisUtil.get(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo);
+                    if (commandObj == null) {
+                        News.error("鍙屽伐浣嶅爢鍨涙満锛屽伐浣�2绌洪棽绛夊緟涓嬪彂鍛戒护锛屼絾鏈壘鍒板懡浠ゃ�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", crnProtocol.getCrnNo(), taskNo);
+                        return;
+                    }
+
+                    JSONObject commandMap = JSON.parseObject(commandObj.toString());
+                    Integer idx = commandMap.getInteger("idx");
+                    List<DualCrnCommand> commandList = commandMap.getJSONArray("commands").toJavaList(DualCrnCommand.class);
+                    DualCrnCommand dualCommand = commandList.get(idx);
+                    idx++;
+                    commandMap.put("idx", idx);
+                    sendCommand(dualCommand);
+                    redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo, commandMap.toJSONString(), 60 * 60 * 24);
+                }
+
+            } catch (Exception e) {
+                e.printStackTrace();
+                log.error("DualCrnCommandThread Fail", e);
             }
         }, 0, 200, TimeUnit.MILLISECONDS);
     }
@@ -129,6 +213,7 @@
         crnProtocol.setForkPos(-1);
         crnProtocol.setLoaded(0);
         crnProtocol.setWalkPos(0);
+        crnProtocol.setLiftPos(0);
 
         //宸ヤ綅2
         crnProtocol.setTaskNoTwo(0);
@@ -138,6 +223,7 @@
         crnProtocol.setForkPosTwo(-1);
         crnProtocol.setLoadedTwo(0);
         crnProtocol.setWalkPosTwo(0);
+        crnProtocol.setLiftPosTwo(0);
 
         crnProtocol.setAlarm(0);
         crnProtocol.setXSpeed(0);
@@ -166,7 +252,6 @@
             OutputQueue.DUAL_CRN.offer(MessageFormat.format("銆恵0}銆戣鍙栧弻宸ヤ綅鍫嗗灈鏈簆lc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort()));
             return;
         }
-
         crnProtocol.setMode(crnStatus.getMode());
 
         //宸ヤ綅1
@@ -177,6 +262,8 @@
         crnProtocol.setForkPos(crnStatus.getForkPos());
         crnProtocol.setLoaded(crnStatus.getLoaded());
         crnProtocol.setWalkPos(crnStatus.getWalkPos());
+        crnProtocol.setLiftPos(crnStatus.getLiftPos());
+        crnProtocol.setTaskReceive(crnStatus.getTaskReceive());
 
         //宸ヤ綅2
         crnProtocol.setTaskNoTwo(crnStatus.getTaskNoTwo());
@@ -186,6 +273,8 @@
         crnProtocol.setForkPosTwo(crnStatus.getForkPosTwo());
         crnProtocol.setLoadedTwo(crnStatus.getLoadedTwo());
         crnProtocol.setWalkPosTwo(crnStatus.getWalkPosTwo());
+        crnProtocol.setLiftPosTwo(crnStatus.getLiftPosTwo());
+        crnProtocol.setTaskReceiveTwo(crnStatus.getTaskReceiveTwo());
 
         crnProtocol.setAlarm(crnStatus.getAlarm());
         crnProtocol.setTemp1(crnStatus.getTemp1());
@@ -272,10 +361,38 @@
         DualCrnCommand crnCommand = new DualCrnCommand();
         crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
         crnCommand.setTaskNo(taskNo.shortValue()); // 宸ヤ綔鍙�
-        crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE.id.shortValue()); // 浠诲姟妯″紡:  搴撲綅绉昏浆
+        crnCommand.setTaskMode(DualCrnTaskModeType.TRANSFER.id.shortValue()); // 浠诲姟妯″紡:  鍙栨斁璐�
         crnCommand.setSourcePosX((short) Utils.getRow(sourceLocNo));     // 婧愬簱浣嶆帓
         crnCommand.setSourcePosY((short) Utils.getBay(sourceLocNo));     // 婧愬簱浣嶅垪
         crnCommand.setSourcePosZ((short) Utils.getLev(sourceLocNo));     // 婧愬簱浣嶅眰
+        crnCommand.setDestinationPosX((short) Utils.getRow(targetLocNo));     // 鐩爣搴撲綅鎺�
+        crnCommand.setDestinationPosY((short) Utils.getBay(targetLocNo));     // 鐩爣搴撲綅鍒�
+        crnCommand.setDestinationPosZ((short) Utils.getLev(targetLocNo));     // 鐩爣搴撲綅灞�
+        crnCommand.setStation(station.shortValue());//宸ヤ綅
+        crnCommand.setCommand((short) 1);     // 浠诲姟纭
+        return crnCommand;
+    }
+
+    @Override
+    public DualCrnCommand getPickCommand(String targetLocNo, Integer taskNo, Integer crnNo, Integer station) {
+        DualCrnCommand crnCommand = new DualCrnCommand();
+        crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
+        crnCommand.setTaskNo(taskNo.shortValue()); // 宸ヤ綔鍙�
+        crnCommand.setTaskMode(DualCrnTaskModeType.PICK.id.shortValue()); // 浠诲姟妯″紡:  鍙栬揣
+        crnCommand.setDestinationPosX((short) Utils.getRow(targetLocNo));     // 鐩爣搴撲綅鎺�
+        crnCommand.setDestinationPosY((short) Utils.getBay(targetLocNo));     // 鐩爣搴撲綅鍒�
+        crnCommand.setDestinationPosZ((short) Utils.getLev(targetLocNo));     // 鐩爣搴撲綅灞�
+        crnCommand.setStation(station.shortValue());//宸ヤ綅
+        crnCommand.setCommand((short) 1);     // 浠诲姟纭
+        return crnCommand;
+    }
+
+    @Override
+    public DualCrnCommand getPutCommand(String targetLocNo, Integer taskNo, Integer crnNo, Integer station) {
+        DualCrnCommand crnCommand = new DualCrnCommand();
+        crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
+        crnCommand.setTaskNo(taskNo.shortValue()); // 宸ヤ綔鍙�
+        crnCommand.setTaskMode(DualCrnTaskModeType.PUT.id.shortValue()); // 浠诲姟妯″紡:  鏀捐揣
         crnCommand.setDestinationPosX((short) Utils.getRow(targetLocNo));     // 鐩爣搴撲綅鎺�
         crnCommand.setDestinationPosY((short) Utils.getBay(targetLocNo));     // 鐩爣搴撲綅鍒�
         crnCommand.setDestinationPosZ((short) Utils.getLev(targetLocNo));     // 鐩爣搴撲綅灞�
@@ -289,8 +406,7 @@
         DualCrnCommand crnCommand = new DualCrnCommand();
         crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
         crnCommand.setTaskNo(taskNo.shortValue()); // 宸ヤ綔鍙�
-        crnCommand.setAckFinish((short) 0);  // 浠诲姟瀹屾垚纭浣�
-        crnCommand.setTaskMode(CrnTaskModeType.CRN_MOVE.id.shortValue()); // 浠诲姟妯″紡:  鍫嗗灈鏈虹Щ鍔�
+        crnCommand.setTaskMode(DualCrnTaskModeType.MOVE.id.shortValue()); // 浠诲姟妯″紡:  鍫嗗灈鏈虹Щ鍔�
         crnCommand.setDestinationPosX((short) Utils.getRow(targetLocNo));     // 鐩爣搴撲綅鎺�
         crnCommand.setDestinationPosY((short) Utils.getBay(targetLocNo));     // 鐩爣搴撲綅鍒�
         crnCommand.setDestinationPosZ((short) Utils.getLev(targetLocNo));     // 鐩爣搴撲綅灞�
@@ -303,8 +419,7 @@
         DualCrnCommand crnCommand = new DualCrnCommand();
         crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
         crnCommand.setTaskNo((short) 0); // 宸ヤ綔鍙�
-        crnCommand.setAckFinish((short) 1);  // 浠诲姟瀹屾垚纭浣�
-        crnCommand.setTaskMode(CrnTaskModeType.NONE.id.shortValue()); // 浠诲姟妯″紡
+        crnCommand.setTaskMode(DualCrnTaskModeType.CONFIRM.id.shortValue()); // 浠诲姟妯″紡:  纭
         crnCommand.setSourcePosX((short)0);     // 婧愬簱浣嶆帓
         crnCommand.setSourcePosY((short)0);     // 婧愬簱浣嶅垪
         crnCommand.setSourcePosZ((short)0);     // 婧愬簱浣嶅眰

--
Gitblit v1.9.1