From dd3fb4ab39ede8427e3f106fc5c654ea6562365c Mon Sep 17 00:00:00 2001
From: Junjie <xjj@123>
Date: 星期六, 13 四月 2024 11:40:08 +0800
Subject: [PATCH] #

---
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java |  159 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 139 insertions(+), 20 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..0d02e5c 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,14 +3,18 @@
 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.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.command.ShuttleRedisCommand;
 import com.zy.asrs.wcs.core.model.enums.ShuttleCommandModeType;
 import com.zy.asrs.wcs.core.model.enums.ShuttleRunDirection;
 import com.zy.asrs.wcs.core.service.BasShuttleService;
@@ -18,6 +22,7 @@
 import com.zy.asrs.wcs.core.utils.NavigateUtils;
 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.enums.ShuttleProtocolStatusType;
 import com.zy.asrs.wcs.rcs.model.enums.SlaveType;
@@ -32,6 +37,7 @@
 import java.text.MessageFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 @Slf4j
 @SuppressWarnings("all")
@@ -101,12 +107,17 @@
                 //----------璇诲彇鍥涘悜绌挎杞︾姸鎬�-----------
                 //灏忚溅璁惧鐘舵��
                 Integer deviceStatus = data.getInteger("deviceStatus");
+                if (deviceStatus == 255) {
+                    //绂荤嚎
+                    shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.OFFLINE);
+                }
                 shuttleProtocol.setDeviceStatus(deviceStatus);
                 //褰撳墠浜岀淮鐮�
                 shuttleProtocol.setCurrentCode(data.getString("groundCode") == null ? "0" : data.getString("groundCode"));
                 //鐢垫睜鐢甸噺
                 shuttleProtocol.setBatteryPower(data.getString("battery") == null ? "0%" : data.getString("battery"));
-
+                //鏁呴殰
+                shuttleProtocol.setErrorCode(deviceStatus == 6 ? "1" : "0");
 
                 //鏄惁椤跺崌
                 shuttleProtocol.setHasLift(data.getInteger("palletStatus") == 1 ? true : false);
@@ -126,14 +137,14 @@
                 ///璇诲彇鍥涘悜绌挎杞︾姸鎬�-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 +161,30 @@
 
                     //鏇存柊閲囬泦鏃堕棿
                     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());
+                    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()));
@@ -195,25 +230,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);
+                NavigateNode startPath = sectionNodes.get(0);
+                //缁撴潫璺緞
+                NavigateNode targetPath = sectionNodes.get(sectionNodes.size() - 1);
                 if (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;
@@ -227,7 +274,7 @@
             param.put("messageName", "runRoute");
             param.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
             param.put("deviceNo", device.getDeviceNo());
-            param.put("taskId", taskNo);
+            param.put("taskId", generateDeviceTaskNo(taskNo));
             param.put("nodeNum", nodes.size());
             param.put("modes", modes);
             String response = new HttpHandler.Builder()
@@ -235,6 +282,7 @@
                     .setPath("/RDS/runRoute")
                     .setHeaders(headers)
                     .setJson(JSON.toJSONString(param))
+                    .setTimeout(60, TimeUnit.SECONDS)
                     .build()
                     .doPost();
             JSONObject jsonObject = JSON.parseObject(response);
@@ -264,6 +312,7 @@
                     .setPath("/RDS/runOrder")
                     .setHeaders(headers)
                     .setJson(command.getBody())
+                    .setTimeout(60, TimeUnit.SECONDS)
                     .build()
                     .doPost();
             JSONObject jsonObject = JSON.parseObject(response);
@@ -293,6 +342,7 @@
                     .setPath("/RDS/actionOrder")
                     .setHeaders(headers)
                     .setJson(command.getBody())
+                    .setTimeout(60, TimeUnit.SECONDS)
                     .build()
                     .doPost();
             JSONObject jsonObject = JSON.parseObject(response);
@@ -322,6 +372,7 @@
                     .setPath("/RDS/actionOrder")
                     .setHeaders(headers)
                     .setJson(command.getBody())
+                    .setTimeout(60, TimeUnit.SECONDS)
                     .build()
                     .doPost();
             JSONObject jsonObject = JSON.parseObject(response);
@@ -342,7 +393,17 @@
 
     @Override
     public boolean isIdle() {
-        if (this.shuttleProtocol.getIdle() == null
+        return this.isIdle(null);
+    }
+
+    @Override
+    public boolean isIdle(ExecuteSupport support) {
+        if (null != support) {
+            if (!support.judgement()) {
+                return false;
+            }
+        }
+        if (this.shuttleProtocol.getDeviceStatus() == null
                 || this.shuttleProtocol.getPakMk() == null
                 || this.shuttleProtocol.getErrorCode() == null
                 || this.shuttleProtocol.getProtocolStatus() == null
@@ -350,17 +411,33 @@
             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)
+                ;
+        return res;
+    }
+
+    @Override
+    public boolean isDeviceIdle() {
+        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 +445,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
@@ -413,7 +490,49 @@
 
     @Override
     public boolean isChargingCompleted() {
+        if (this.shuttleProtocol.getBatteryPower() == null) {
+            return false;
+        }
+
+        if (Integer.valueOf(this.shuttleProtocol.getBatteryPower()) >= 100) {
+            return true;
+        }
         return false;
+    }
+
+    @Override
+    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) {
+        int no = taskNo % 255;
+        if (no <= 1) {
+            no = 2;
+        }
+        return no;
     }
 
     @Override
@@ -422,7 +541,7 @@
         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()));
-        body.put("taskId", taskNo);
+        body.put("taskId", generateDeviceTaskNo(taskNo));
 
         LocService locService = SpringUtils.getBean(LocService.class);
         Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>()

--
Gitblit v1.9.1