From d835d1b51f832889929cdf69010034a30ef44d02 Mon Sep 17 00:00:00 2001
From: Junjie <xjj@123>
Date: 星期四, 17 十月 2024 13:57:29 +0800
Subject: [PATCH] #

---
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java |  436 +++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 383 insertions(+), 53 deletions(-)

diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java
index e97a25f..58c11a3 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java
@@ -3,22 +3,32 @@
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.zy.asrs.common.utils.HttpHandler;
 import com.zy.asrs.framework.common.DateUtils;
 import com.zy.asrs.framework.common.SpringUtils;
 import com.zy.asrs.framework.exception.CoolException;
+import com.zy.asrs.wcs.common.ExecuteSupport;
+import com.zy.asrs.wcs.core.domain.param.ShuttleMoveLocParam;
+import com.zy.asrs.wcs.core.entity.BasLift;
 import com.zy.asrs.wcs.core.entity.BasShuttle;
 import com.zy.asrs.wcs.core.entity.Loc;
 import com.zy.asrs.wcs.core.model.NavigateNode;
 import com.zy.asrs.wcs.core.model.command.ShuttleCommand;
-import com.zy.asrs.wcs.core.model.enums.ShuttleCommandModeType;
-import com.zy.asrs.wcs.core.model.enums.ShuttleRunDirection;
+import com.zy.asrs.wcs.core.model.command.ShuttleRedisCommand;
+import com.zy.asrs.wcs.core.model.enums.*;
+import com.zy.asrs.wcs.core.service.BasLiftService;
 import com.zy.asrs.wcs.core.service.BasShuttleService;
 import com.zy.asrs.wcs.core.service.LocService;
+import com.zy.asrs.wcs.core.utils.LiftDispatcher;
 import com.zy.asrs.wcs.core.utils.NavigateUtils;
+import com.zy.asrs.wcs.core.utils.Utils;
 import com.zy.asrs.wcs.rcs.News;
 import com.zy.asrs.wcs.rcs.cache.OutputQueue;
+import com.zy.asrs.wcs.rcs.constant.DeviceRedisConstant;
 import com.zy.asrs.wcs.rcs.entity.DeviceDataLog;
+import com.zy.asrs.wcs.rcs.model.CommandResponse;
 import com.zy.asrs.wcs.rcs.model.enums.ShuttleProtocolStatusType;
 import com.zy.asrs.wcs.rcs.model.enums.SlaveType;
 import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol;
@@ -26,18 +36,21 @@
 import com.zy.asrs.wcs.rcs.thread.ShuttleThread;
 import com.zy.asrs.wcs.core.utils.RedisUtil;
 import com.zy.asrs.wcs.rcs.entity.Device;
+import com.zy.asrs.wcs.system.entity.Dict;
+import com.zy.asrs.wcs.system.service.DictService;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
 import java.text.MessageFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 @Slf4j
 @SuppressWarnings("all")
 public class SurayShuttleThread implements ShuttleThread {
 
-    private static final String API_URL = "http://127.0.0.1:8082";
+    private static String API_URL = "http://127.0.0.1:8082";
 
     private Device device;
     private RedisUtil redisUtil;
@@ -46,6 +59,7 @@
     public SurayShuttleThread(Device device,RedisUtil redisUtil) {
         this.device = device;
         this.redisUtil = redisUtil;
+        API_URL = "http://" + device.getIp() + ":" + device.getPort();
     }
 
     @Override
@@ -101,12 +115,22 @@
                 //----------璇诲彇鍥涘悜绌挎杞︾姸鎬�-----------
                 //灏忚溅璁惧鐘舵��
                 Integer deviceStatus = data.getInteger("deviceStatus");
+                if (deviceStatus == 255) {
+                    //绂荤嚎
+                    shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.OFFLINE);
+                }
+
+                if(deviceStatus != 4 || deviceStatus != 6 || deviceStatus != 7 || deviceStatus != 8 || deviceStatus != 255 || deviceStatus != -1) {
+                    shuttleProtocol.setMode(1);//鑷姩鐘舵��
+                }
+
                 shuttleProtocol.setDeviceStatus(deviceStatus);
                 //褰撳墠浜岀淮鐮�
                 shuttleProtocol.setCurrentCode(data.getString("groundCode") == null ? "0" : data.getString("groundCode"));
                 //鐢垫睜鐢甸噺
-                shuttleProtocol.setBatteryPower(data.getString("battery") == null ? "0%" : data.getString("battery"));
-
+                shuttleProtocol.setBatteryPower(data.getString("battery") == null ? "0" : data.getString("battery"));
+                //鏁呴殰
+                shuttleProtocol.setErrorCode(deviceStatus == 6 ? "1" : "0");
 
                 //鏄惁椤跺崌
                 shuttleProtocol.setHasLift(data.getInteger("palletStatus") == 1 ? true : false);
@@ -123,17 +147,19 @@
                 extend.setStatusDescription(data.getString("statusDescription"));//鐘舵�佹弿杩�
                 shuttleProtocol.setExtend(extend);//鎵╁睍瀛楁
 
+                //鏈�杩戜竴娆″湪绾挎椂闂�
+                shuttleProtocol.setLastOnlineTime(System.currentTimeMillis());
                 ///璇诲彇鍥涘悜绌挎杞︾姸鎬�-end
 
                 //灏忚溅澶勪簬蹇欑鐘舵�侊紝灏嗘爣璁扮疆涓簍rue
-                if (!shuttleProtocol.getIdle()) {
+                if (deviceStatus == 1 || deviceStatus == 2 || deviceStatus == 5) {
                     shuttleProtocol.setPakMk(true);
                 }
 
-//                if (shuttleProtocol.getProtocolStatusType() == null && shuttleProtocol.getDeviceStatus().intValue() == ShuttleDeviceStatusType.IDLE.id) {
-//                    //灏忚溅绌洪棽鐘舵�併�佸皬杞︿换鍔$姸鎬佷负鏈煡锛岃瀹氭浘绂荤嚎杩囷紝闇�瑕佸浣嶆垚绌洪棽
-//                    shuttleProtocol.setProtocolStatusType(ShuttleProtocolStatusType.IDLE);
-//                }
+                if (shuttleProtocol.getProtocolStatusType() == null && shuttleProtocol.getDeviceStatus().intValue() == 3) {
+                    //灏忚溅绌洪棽鐘舵�併�佸皬杞︿换鍔$姸鎬佷负鏈煡锛岃瀹氭浘绂荤嚎杩囷紝闇�瑕佸浣嶆垚绌洪棽
+                    shuttleProtocol.setProtocolStatusType(ShuttleProtocolStatusType.IDLE);
+                }
 
                 if (System.currentTimeMillis() - shuttleProtocol.getDeviceDataLog() > 1000 * 5) {
                     //閲囬泦鏃堕棿瓒呰繃5s锛屼繚瀛樹竴娆℃暟鎹褰�
@@ -150,6 +176,31 @@
 
                     //鏇存柊閲囬泦鏃堕棿
                     shuttleProtocol.setDeviceDataLog(System.currentTimeMillis());
+                }
+
+                //灏嗗洓鍚戠┛姊溅鐘舵�佷繚瀛樿嚦鏁版嵁搴�
+                BasShuttleService shuttleService = SpringUtils.getBean(BasShuttleService.class);
+                BasShuttle basShuttle = shuttleService.getOne(new LambdaQueryWrapper<BasShuttle>()
+                        .eq(BasShuttle::getShuttleNo, device.getDeviceNo())
+                        .eq(BasShuttle::getHostId, device.getHostId()));
+                if (basShuttle == null) {
+                    basShuttle = new BasShuttle();
+                    //鍥涘悜绌挎杞﹀彿
+                    basShuttle.setShuttleNo(Integer.valueOf(device.getDeviceNo()));
+                    basShuttle.setStatus(1);
+                    basShuttle.setDeleted(0);
+                    basShuttle.setHostId(device.getHostId());
+                    basShuttle.setDeviceId(device.getId().intValue());
+                    shuttleService.save(basShuttle);
+                }
+                //浠诲姟鍙�
+                basShuttle.setTaskNo(shuttleProtocol.getTaskNo().intValue());
+                //淇敼鏃堕棿
+                basShuttle.setUpdateTime(new Date());
+                //璁惧鐘舵��
+                basShuttle.setProtocol(JSON.toJSONString(shuttleProtocol));
+                if (shuttleService.updateById(basShuttle)) {
+                    OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), device.getDeviceNo()));
                 }
             } else {
                 OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆憑1}璇诲彇鍥涘悜绌挎杞︾姸鎬佷俊鎭け璐�", DateUtils.convert(new Date()), device.getDeviceNo()));
@@ -173,7 +224,15 @@
 
     @Override
     public ShuttleProtocol getStatus() {
-        return this.shuttleProtocol;
+        return getStatus(true);
+    }
+
+    @Override
+    public ShuttleProtocol getStatus(boolean clone) {
+        if (this.shuttleProtocol == null) {
+            return null;
+        }
+        return clone ? this.shuttleProtocol.clone() : this.shuttleProtocol;
     }
 
     @Override
@@ -182,11 +241,22 @@
     }
 
     @Override
-    public synchronized boolean movePath(List<NavigateNode> nodes, Integer taskNo) {
+    public synchronized CommandResponse movePath(List<NavigateNode> nodes, Integer taskNo) {
+        CommandResponse response = new CommandResponse(false);
         try {
+            //榛樿鍦板浘姣嶈建鏂瑰悜x
+            String mapDirection = "x";
+            DictService dictService = SpringUtils.getBean(DictService.class);
+            Dict dict = dictService.getOne(new LambdaQueryWrapper<Dict>()
+                    .eq(Dict::getFlag, "direction_map")
+                    .eq(Dict::getStatus, 1));
+            if (dict != null) {
+                mapDirection = dict.getValue();
+            }
+
             String loginToken = requestLoginToken();
             if (loginToken == null) {
-                return false;
+                return response;
             }
 
             HashMap<String, Object> headers = new HashMap<>();
@@ -195,25 +265,37 @@
             ArrayList<HashMap<String, Object>> modes = new ArrayList<>();
             //鑾峰彇鍒嗘璺緞
             ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(nodes);
-            for (ArrayList<NavigateNode> sectionNodes : data) {
+            for (int idx = 0; idx < data.size(); idx++) {
+                ArrayList<NavigateNode> sectionNodes = data.get(idx);
+                boolean isRemoveFooterNode = false;//鏄惁鍓旈櫎灏捐妭鐐�
+                if (idx != data.size() - 1) {
+                    isRemoveFooterNode = true;//鍓旈櫎灏捐妭鐐�
+                }
+
                 boolean flag = true;
                 int oper;
                 //寮�濮嬭矾寰�
-                NavigateNode startPath = nodes.get(0);
-                if (ShuttleRunDirection.get(startPath.getDirection()) == ShuttleRunDirection.LEFT
+                NavigateNode startPath = sectionNodes.get(0);
+                //缁撴潫璺緞
+                NavigateNode targetPath = sectionNodes.get(sectionNodes.size() - 1);
+                if (mapDirection.equals("y") && ShuttleRunDirection.get(startPath.getDirection()) == ShuttleRunDirection.LEFT
                         || ShuttleRunDirection.get(startPath.getDirection()) == ShuttleRunDirection.RIGHT) {
                     //姣嶈建鏂瑰悜
                     oper = 5;
-                }else {
+                } else {
                     //瀛愯建鏂瑰悜
                     oper = 6;
                 }
 
-                for (NavigateNode node : sectionNodes) {
+                for (int i = 0; i < sectionNodes.size(); i++) {
+                    if (isRemoveFooterNode && i == sectionNodes.size() - 1) {
+                        continue;
+                    }
+                    NavigateNode node = sectionNodes.get(i);
                     HashMap<String, Object> map = new HashMap<>();
-                    map.put("nodexX", node.getX());
-                    map.put("nodexY", node.getY());
-                    map.put("nodexZ", node.getZ());
+                    map.put("nodeX", node.getX());
+                    map.put("nodeY", node.getY());
+                    map.put("nodeZ", node.getZ());
                     if (flag) {
                         map.put("oper", oper);
                         flag = false;
@@ -230,119 +312,191 @@
             param.put("taskId", taskNo);
             param.put("nodeNum", nodes.size());
             param.put("modes", modes);
-            String response = new HttpHandler.Builder()
+            String responseStr = new HttpHandler.Builder()
                     .setUri(API_URL)
                     .setPath("/RDS/runRoute")
                     .setHeaders(headers)
                     .setJson(JSON.toJSONString(param))
+                    .setTimeout(60, TimeUnit.SECONDS)
                     .build()
                     .doPost();
-            JSONObject jsonObject = JSON.parseObject(response);
+            JSONObject jsonObject = JSON.parseObject(responseStr);
             Integer code = jsonObject.getInteger("code");
+            System.out.println("璺緞涓嬪彂" + taskNo);
+            System.out.println(JSON.toJSONString(jsonObject));
+            System.out.println(JSON.toJSONString(param));
             if (code.equals(200)) {
-                return true;
+                System.out.println("璺緞涓嬪彂" + taskNo);
+                response.setResult(true);
+                response.setMessage(responseStr);
+                return response;
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
-        return false;
+        return response;
     }
 
     @Override
-    public synchronized boolean move(ShuttleCommand command) {
+    public synchronized CommandResponse move(ShuttleCommand command) {
+        CommandResponse response = new CommandResponse(false);
         try {
             String loginToken = requestLoginToken();
             if (loginToken == null) {
-                return false;
+                return response;
             }
 
             HashMap<String, Object> headers = new HashMap<>();
             headers.put("Authorization", "Bearer " + loginToken);
 
-            String response = new HttpHandler.Builder()
+            String responseStr = new HttpHandler.Builder()
                     .setUri(API_URL)
                     .setPath("/RDS/runOrder")
                     .setHeaders(headers)
                     .setJson(command.getBody())
+                    .setTimeout(60, TimeUnit.SECONDS)
                     .build()
                     .doPost();
-            JSONObject jsonObject = JSON.parseObject(response);
+            JSONObject jsonObject = JSON.parseObject(responseStr);
             Integer code = jsonObject.getInteger("code");
+            System.out.println(JSON.toJSONString(command.getBody()));
             if (code.equals(200)) {
-                return true;
+                this.shuttleProtocol.setSendTime(System.currentTimeMillis());//鎸囦护涓嬪彂鏃堕棿
+                response.setResult(true);
+                response.setMessage(responseStr);
+                return response;
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
-        return false;
+        return response;
     }
 
     @Override
-    public synchronized boolean lift(ShuttleCommand command) {
+    public synchronized CommandResponse lift(ShuttleCommand command) {
+        CommandResponse response = new CommandResponse(false);
         try {
             String loginToken = requestLoginToken();
             if (loginToken == null) {
-                return false;
+                return response;
             }
 
             HashMap<String, Object> headers = new HashMap<>();
             headers.put("Authorization", "Bearer " + loginToken);
 
-            String response = new HttpHandler.Builder()
+            String responseStr = new HttpHandler.Builder()
                     .setUri(API_URL)
                     .setPath("/RDS/actionOrder")
                     .setHeaders(headers)
                     .setJson(command.getBody())
+                    .setTimeout(60, TimeUnit.SECONDS)
                     .build()
                     .doPost();
-            JSONObject jsonObject = JSON.parseObject(response);
+            JSONObject jsonObject = JSON.parseObject(responseStr);
             Integer code = jsonObject.getInteger("code");
             if (code.equals(200)) {
-                return true;
+                this.shuttleProtocol.setSendTime(System.currentTimeMillis());//鎸囦护涓嬪彂鏃堕棿
+                response.setResult(true);
+                response.setMessage(responseStr);
+                return response;
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
-        return false;
+        return response;
     }
 
     @Override
-    public synchronized boolean charge(ShuttleCommand command) {
+    public synchronized CommandResponse charge(ShuttleCommand command) {
+        CommandResponse response = new CommandResponse(false);
         try {
             String loginToken = requestLoginToken();
             if (loginToken == null) {
-                return false;
+                return response;
             }
 
             HashMap<String, Object> headers = new HashMap<>();
             headers.put("Authorization", "Bearer " + loginToken);
 
-            String response = new HttpHandler.Builder()
+            String responseStr = new HttpHandler.Builder()
                     .setUri(API_URL)
                     .setPath("/RDS/actionOrder")
                     .setHeaders(headers)
                     .setJson(command.getBody())
+                    .setTimeout(60, TimeUnit.SECONDS)
                     .build()
                     .doPost();
-            JSONObject jsonObject = JSON.parseObject(response);
+            JSONObject jsonObject = JSON.parseObject(responseStr);
             Integer code = jsonObject.getInteger("code");
             if (code.equals(200)) {
-                return true;
+                this.shuttleProtocol.setSendTime(System.currentTimeMillis());//鎸囦护涓嬪彂鏃堕棿
+                response.setResult(true);
+                response.setMessage(responseStr);
+                return response;
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
-        return false;
+        return response;
     }
 
     @Override
-    public synchronized boolean reset(ShuttleCommand command) {
-        return false;
+    public synchronized CommandResponse reset(ShuttleCommand command) {
+        setSyncTaskNo(0);
+        setProtocolStatus(ShuttleProtocolStatusType.IDLE);
+        enableMoveLoc(null, false);
+        return new CommandResponse(true, JSON.toJSONString(command));
+    }
+
+    @Override
+    public CommandResponse updateLocation(ShuttleCommand command) {
+        CommandResponse response = new CommandResponse(false);
+        try {
+            String loginToken = requestLoginToken();
+            if (loginToken == null) {
+                return response;
+            }
+
+            HashMap<String, Object> headers = new HashMap<>();
+            headers.put("Authorization", "Bearer " + loginToken);
+
+            String responseStr = new HttpHandler.Builder()
+                    .setUri(API_URL)
+                    .setPath("/RDS/changeLocation")
+                    .setHeaders(headers)
+                    .setJson(command.getBody())
+                    .setTimeout(60, TimeUnit.SECONDS)
+                    .build()
+                    .doPost();
+            JSONObject jsonObject = JSON.parseObject(responseStr);
+            Integer code = jsonObject.getInteger("code");
+            if (code.equals(200)) {
+                this.shuttleProtocol.setSendTime(System.currentTimeMillis());//鎸囦护涓嬪彂鏃堕棿
+                response.setResult(true);
+                response.setMessage(responseStr);
+                return response;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return response;
     }
 
     @Override
     public boolean isIdle() {
-        if (this.shuttleProtocol.getIdle() == null
+        return this.isIdle(null);
+    }
+
+    @Override
+    public boolean isIdle(ExecuteSupport support) {
+        if (null != support) {
+            Boolean judgement = support.judgement();
+            if (judgement != null && !judgement) {
+                return true;
+            }
+        }
+
+        if (this.shuttleProtocol.getDeviceStatus() == null
                 || this.shuttleProtocol.getPakMk() == null
                 || this.shuttleProtocol.getErrorCode() == null
                 || this.shuttleProtocol.getProtocolStatus() == null
@@ -350,17 +504,46 @@
             return false;
         }
 
-        boolean res = this.shuttleProtocol.getIdle()
+        boolean res = (this.shuttleProtocol.getDeviceStatus() == 3 || this.shuttleProtocol.getDeviceStatus() == 11)
                 && this.shuttleProtocol.getPakMk()
                 && this.shuttleProtocol.getErrorCode().equals("0")
-                && this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id
+                && (this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id
+                || this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.WAITING.id
+                || this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.CHARGING_WAITING.id);
+        return res;
+    }
+
+    @Override
+    public boolean isDeviceIdle() {
+        return isDeviceIdle(null);
+    }
+
+    @Override
+    public boolean isDeviceIdle(ExecuteSupport support) {
+        if (null != support) {
+            Boolean judgement = support.judgement();
+            if (judgement != null && !judgement) {
+                return true;
+            }
+        }
+
+        if (this.shuttleProtocol.getDeviceStatus() == null
+                || this.shuttleProtocol.getPakMk() == null
+                || this.shuttleProtocol.getErrorCode() == null
+        ) {
+            return false;
+        }
+
+        boolean res = (this.shuttleProtocol.getDeviceStatus() == 3 || this.shuttleProtocol.getDeviceStatus() == 11)
+                && this.shuttleProtocol.getPakMk()
+                && this.shuttleProtocol.getErrorCode().equals("0")
                 ;
         return res;
     }
 
     @Override
     public boolean isRequireCharge() {
-        if (this.shuttleProtocol.getIdle() == null
+        if (this.shuttleProtocol.getDeviceStatus() == null
                 || this.shuttleProtocol.getPakMk() == null
                 || this.shuttleProtocol.getErrorCode() == null
                 || this.shuttleProtocol.getProtocolStatus() == null
@@ -368,7 +551,7 @@
             return false;
         }
 
-        boolean res = this.shuttleProtocol.getIdle()
+        boolean res = (this.shuttleProtocol.getDeviceStatus() == 3)
                 && this.shuttleProtocol.getPakMk()
                 && this.shuttleProtocol.getErrorCode().equals("0")
                 && this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id
@@ -382,7 +565,7 @@
                 if (shuttleService == null) {
                     return false;
                 }
-                BasShuttle basShuttle = shuttleService.getById(this.device.getDeviceNo());
+                BasShuttle basShuttle = shuttleService.getOne(new LambdaQueryWrapper<BasShuttle>().eq(BasShuttle::getDeviceId, this.device.getId()));
                 if (basShuttle == null) {
                     return false;
                 }
@@ -392,7 +575,6 @@
                 }
                 return Integer.valueOf(this.shuttleProtocol.getBatteryPower()) < chargeLine;
             } catch (Exception e) {
-                News.error("fail", e);
                 return false;
             }
         }
@@ -413,11 +595,127 @@
 
     @Override
     public boolean isChargingCompleted() {
+        Integer maxPower = 100;
+        DictService dictService = SpringUtils.getBean(DictService.class);
+        if (dictService != null) {
+            Dict chargeMaxValue = dictService.getOne(new LambdaQueryWrapper<Dict>()
+                    .eq(Dict::getFlag, "chargeMaxValue")
+                    .eq(Dict::getStatus, 1));
+            if (chargeMaxValue != null) {
+                maxPower = Integer.parseInt(chargeMaxValue.getValue());
+            }
+        }
+
+        if (this.shuttleProtocol.getBatteryPower() == null) {
+            return false;
+        }
+
+        if (Integer.valueOf(this.shuttleProtocol.getBatteryPower()) >= maxPower) {
+            return true;
+        }
         return false;
     }
 
     @Override
-    public ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed) {
+    public List<NavigateNode> getMoveAdvancePath() {
+        ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class);
+        ArrayList<NavigateNode> path = new ArrayList<>();
+        if (shuttleProtocol.getTaskNo() != 0) {
+            //瀛樺湪浠诲姟锛岃幏鍙栨寚浠�
+            Object object = redisUtil.get(DeviceRedisConstant.SHUTTLE_WORK_FLAG + shuttleProtocol.getTaskNo());
+            if (object != null) {
+                ShuttleRedisCommand redisCommand = null;
+                try {
+                    redisCommand = objectMapper.readValue(String.valueOf(object), ShuttleRedisCommand.class);
+                } catch (JsonProcessingException e) {
+                    return path;
+                }
+                List<NavigateNode> nodes = redisCommand.getAssignCommand().getNodes();//绌挎杞﹂璁¤矾寰�
+                if (nodes == null) {
+                    return path;
+                }
+                if (!nodes.isEmpty()) {
+                    path.addAll(nodes);
+                }
+            }
+        }
+        return path;
+    }
+
+    @Override
+    public int generateDeviceTaskNo(int taskNo, MotionCtgType motionCtgType) {
+        int deviceTaskNo = taskNo;
+        try {
+            deviceTaskNo = Utils.getTaskNo("SURAY_SHUTTLE");
+        } catch (Exception e) {
+            return taskNo;
+        }
+
+        switch (Objects.requireNonNull(MotionCtgType.get(String.valueOf(motionCtgType)))){
+            case SHUTTLE_MOVE://绌挎杞︾Щ鍔�
+            case SHUTTLE_MOVE_LIFT_PALLET://绌挎杞﹂《鍗囧苟绉诲姩
+            case SHUTTLE_MOVE_DOWN_PALLET://绌挎杞︾Щ鍔ㄥ苟鎵樼洏涓嬮檷
+            case SHUTTLE_MOVE_FROM_LIFT://鍑烘彁鍗囨満
+            case SHUTTLE_MOVE_TO_LIFT://杩涙彁鍗囨満
+                return deviceTaskNo;
+            default:
+                return taskNo;
+        }
+    }
+
+    @Override
+    public synchronized boolean setProtocolStatus(ShuttleProtocolStatusType status) {
+        this.shuttleProtocol.setProtocolStatus(status);
+        return true;
+    }
+
+    @Override
+    public synchronized boolean setSyncTaskNo(Integer taskNo) {
+        this.shuttleProtocol.setSyncTaskNo(taskNo);
+        return true;
+    }
+
+    @Override
+    public synchronized boolean setPakMk(boolean pakMk) {
+        this.shuttleProtocol.setPakMk(pakMk);
+        return true;
+    }
+
+    @Override
+    public boolean enableMoveLoc(ShuttleMoveLocParam param, boolean enable) {
+        if (enable) {
+            shuttleProtocol.setMoveLoc(true);//寮�鍚窇搴�
+            shuttleProtocol.setMoveType(param.getMoveType());
+            shuttleProtocol.setXStart(param.getStartX());
+            shuttleProtocol.setXTarget(param.getTargetX());
+            shuttleProtocol.setXCurrent(param.getStartX());
+            shuttleProtocol.setYStart(param.getStartY());
+            shuttleProtocol.setYTarget(param.getTargetY());
+            shuttleProtocol.setYCurrent(param.getStartY());
+        }else {
+            shuttleProtocol.setMoveLoc(false);
+            shuttleProtocol.setMoveType(0);
+            shuttleProtocol.setXStart(0);
+            shuttleProtocol.setXTarget(0);
+            shuttleProtocol.setXCurrent(0);
+            shuttleProtocol.setYStart(0);
+            shuttleProtocol.setYTarget(0);
+            shuttleProtocol.setYCurrent(0);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean requestWaiting() {
+        if (this.shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.IDLE)) {
+            this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WAITING);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes) {
         HashMap<String, Object> body = new HashMap<>();
         body.put("messageName", "runOrder");
         body.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
@@ -435,11 +733,23 @@
         body.put("nodeY", loc.getBay());
         body.put("nodeZ", loc.getLev());
 
+        //妫�娴嬬洰鏍囩偣鏄惁涓烘彁鍗囨満
+        BasLiftService basLiftService = SpringUtils.getBean(BasLiftService.class);
+        BasLift basLift = basLiftService.getOne(new LambdaQueryWrapper<BasLift>().eq(BasLift::getRow, loc.getRow())
+                .eq(BasLift::getBay, loc.getBay())
+                .eq(BasLift::getHostId, this.device.getHostId()));
+        if (basLift != null) {
+            LiftDispatcher liftDispatcher = SpringUtils.getBean(LiftDispatcher.class);
+            Integer realLev = liftDispatcher.getLiftLevOffset(basLift.getDeviceId().intValue(), loc.getLev());
+            body.put("nodeZ", realLev);
+        }
+
         ShuttleCommand command = new ShuttleCommand();
         command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo()));
         command.setBody(JSON.toJSONString(body));
         command.setMode(ShuttleCommandModeType.MOVE.id);
         command.setTargetLocNo(loc.getLocNo());
+        command.setTaskNo(taskNo);
         return command;
     }
 
@@ -456,6 +766,7 @@
         command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo()));
         command.setBody(JSON.toJSONString(body));
         command.setMode(lift ? ShuttleCommandModeType.PALLET_LIFT.id : ShuttleCommandModeType.PALLET_DOWN.id);
+        command.setTaskNo(taskNo);
         return command;
     }
 
@@ -472,6 +783,25 @@
         command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo()));
         command.setBody(JSON.toJSONString(body));
         command.setMode(charge ? ShuttleCommandModeType.CHARGE_OPEN.id : ShuttleCommandModeType.CHARGE_CLOSE.id);
+        command.setTaskNo(taskNo);
+        return command;
+    }
+
+    @Override
+    public ShuttleCommand getUpdateLocationCommand(Integer taskNo, String locNo) {
+        HashMap<String, Object> body = new HashMap<>();
+        body.put("messageName", "runOrder");
+        body.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+        body.put("deviceNo", Integer.parseInt(this.device.getDeviceNo()));
+
+        String coord = "(" + Utils.getRow(locNo) + "," + Utils.getBay(locNo) + "," + Utils.getLev(locNo) + ")";
+        body.put("coord", coord);
+
+        ShuttleCommand command = new ShuttleCommand();
+        command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo()));
+        command.setBody(JSON.toJSONString(body));
+        command.setMode(ShuttleCommandModeType.UPDATE_LOCATION.id);
+        command.setTaskNo(taskNo);
         return command;
     }
 

--
Gitblit v1.9.1