From 4e005e4936039fca16bfd1679942daa416a21986 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 20 十一月 2025 14:27:47 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/network/entity/ZyRgvStatusEntity.java         |   11 
 src/main/webapp/components/WatchRgvCard.js                              |  188 ++++++++++
 src/main/java/com/zy/core/network/fake/ZyRgvFakeConnect.java            |  141 +++++++
 src/main/java/com/zy/asrs/entity/BasRgv.java                            |    2 
 src/main/java/com/zy/core/enums/RgvModeType.java                        |    6 
 src/main/java/com/zy/common/utils/NavigateUtils.java                    |   52 ++
 src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java           |    5 
 src/main/java/com/zy/core/thread/impl/ZyRgvThread.java                  |   51 ++
 src/main/java/com/zy/core/network/real/ZyStationRealConnect.java        |    9 
 src/main/java/com/zy/core/network/ZyCrnConnectDriver.java               |    6 
 src/main/java/com/zy/core/thread/impl/ZyStationThread.java              |    5 
 src/main/java/com/zy/core/network/fake/ZyCrnFakeConnect.java            |    2 
 src/main/java/com/zy/core/model/command/RgvCommand.java                 |   15 
 src/main/java/com/zy/core/network/real/ZyCrnRealConnect.java            |    7 
 src/main/java/com/zy/core/network/ZyRgvConnectDriver.java               |    7 
 src/main/webapp/views/watch/console.html                                |   73 ---
 src/main/java/com/zy/asrs/domain/param/RgvCommandMoveParam.java         |   12 
 src/main/java/com/zy/asrs/controller/RgvController.java                 |  159 ++++++++
 src/main/java/com/zy/asrs/domain/param/RgvCommandTransportParam.java    |   14 
 src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java                |   26 +
 src/main/java/com/zy/core/network/real/ZyRgvRealConnect.java            |  120 ++++++
 src/main/java/com/zy/asrs/domain/param/RgvCommandTaskCompleteParam.java |   10 
 src/main/java/com/zy/common/CodeBuilder.java                            |    4 
 src/main/java/com/zy/core/thread/RgvThread.java                         |    2 
 src/main/java/com/zy/core/network/ZyStationConnectDriver.java           |    6 
 src/main/java/com/zy/common/utils/NavigateSolution.java                 |   60 +++
 src/main/java/com/zy/core/enums/RgvTaskModeType.java                    |   46 ++
 27 files changed, 911 insertions(+), 128 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/RgvController.java b/src/main/java/com/zy/asrs/controller/RgvController.java
new file mode 100644
index 0000000..cd2a285
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/RgvController.java
@@ -0,0 +1,159 @@
+package com.zy.asrs.controller;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.annotations.ManagerAuth;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.zy.asrs.domain.param.RgvCommandMoveParam;
+import com.zy.asrs.domain.param.RgvCommandTaskCompleteParam;
+import com.zy.asrs.domain.param.RgvCommandTransportParam;
+import com.zy.asrs.domain.vo.RgvStateTableVo;
+import com.zy.asrs.entity.BasRgv;
+import com.zy.asrs.entity.BasRgvErr;
+import com.zy.asrs.service.BasRgvService;
+import com.zy.asrs.service.BasRgvErrService;
+import com.zy.core.cache.MessageQueue;
+import com.zy.core.cache.OutputQueue;
+import com.zy.core.cache.SlaveConnection;
+import com.zy.core.enums.RgvModeType;
+import com.zy.core.enums.RgvStatusType;
+import com.zy.core.enums.SlaveType;
+import com.zy.core.model.Task;
+import com.zy.core.model.command.RgvCommand;
+import com.zy.core.model.protocol.RgvProtocol;
+import com.zy.core.thread.RgvThread;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+@Slf4j
+@RestController
+@RequestMapping("/rgv")
+public class RgvController {
+
+    @Autowired
+    private BasRgvService basRgvService;
+    @Autowired
+    private BasRgvErrService basRgvErrService;
+
+    @PostMapping("/table/rgv/state")
+    @ManagerAuth(memo = "RGV淇℃伅琛�")
+    public R rgvStateTable() {
+        List<RgvStateTableVo> list = new ArrayList<>();
+        List<BasRgv> rgvs = basRgvService.selectList(new EntityWrapper<BasRgv>().orderBy("rgv_no"));
+        for (BasRgv basRgv : rgvs) {
+            RgvStateTableVo vo = new RgvStateTableVo();
+            vo.setRgvNo(basRgv.getRgvNo());
+            list.add(vo);
+
+            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basRgv.getRgvNo());
+            if (rgvThread == null) {
+                continue;
+            }
+            RgvProtocol rgvProtocol = rgvThread.getStatus();
+            if (rgvProtocol == null) {
+                continue;
+            }
+
+            vo.setTaskNo(rgvProtocol.getTaskNo());
+            RgvModeType modeType = RgvModeType.get(rgvProtocol.getMode());
+            vo.setMode(modeType == null ? "" : modeType.desc);
+            RgvStatusType statusType = RgvStatusType.get(rgvProtocol.getStatus() == null ? null : rgvProtocol.getStatus());
+            vo.setStatus(statusType == null ? "" : statusType.desc);    
+            vo.setLoading(rgvProtocol.getLoaded() != null && rgvProtocol.getLoaded() == 1 ? "鏈夌墿" : "鏃犵墿");
+            vo.setTrackSiteNo(String.valueOf(rgvProtocol.getRgvPos()));
+
+            String deviceStatus = "";
+            if (modeType == RgvModeType.AUTO) {
+                deviceStatus = "AUTO";
+            }
+            if (rgvProtocol.getTaskNo() != null && rgvProtocol.getTaskNo() > 0) {
+                deviceStatus = "WORKING";
+            }
+            if(rgvProtocol.getAlarm() > 0) {
+                deviceStatus = "ERROR";
+            }
+            vo.setDeviceStatus(deviceStatus);
+
+            vo.setWarnCode(String.valueOf(rgvProtocol.getAlarm()));
+            if (rgvProtocol.getAlarm() != null && rgvProtocol.getAlarm() > 0) {
+                BasRgvErr err = basRgvErrService.selectById(rgvProtocol.getAlarm());
+                vo.setAlarm(err == null ? "鏈煡寮傚父" : err.getErrName());
+                vo.setDeviceStatus("ERROR");
+            }
+        }
+        return R.ok().add(list);
+    }
+
+    @PostMapping("/output/site")
+    @ManagerAuth(memo = "RGV鎶ユ枃鏃ュ織杈撳嚭")
+    public R rgvOutput() {
+        StringBuilder str = new StringBuilder();
+        String s;
+        int i = 0;
+        while ((s = OutputQueue.RGV.poll()) != null && i <= 10) {
+            str.append("\n").append(s);
+            i++;
+        }
+        return R.ok().add(str.toString());
+    }
+
+    @PostMapping("/command/transport")
+    public R rgvCommandTransport(@RequestBody RgvCommandTransportParam param) {
+        if (Cools.isEmpty(param) || param.getRgvNo() == null || param.getTargetPos() == null) {
+            return R.error("缂哄皯鍙傛暟");
+        }
+
+        Integer rgvNo = param.getRgvNo();
+        Integer sourcePos = param.getSourcePos();
+        Integer targetPos = param.getTargetPos();
+
+        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
+        if (rgvThread == null) {
+            return R.error("绾跨▼涓嶅瓨鍦�");
+        }
+
+        RgvCommand command = rgvThread.getTransportCommand(9999, rgvNo, sourcePos, targetPos);
+        MessageQueue.offer(SlaveType.Rgv, rgvNo, new Task(2, command));
+        return R.ok();
+    }
+
+    @PostMapping("/command/move")
+    public R rgvCommandMove(@RequestBody RgvCommandMoveParam param) {
+        if (Cools.isEmpty(param) || param.getRgvNo() == null || param.getTargetPos() == null) {
+            return R.error("缂哄皯鍙傛暟");
+        }
+
+        Integer rgvNo = param.getRgvNo();
+        Integer targetPos = param.getTargetPos();
+
+        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
+        if (rgvThread == null) {
+            return R.error("绾跨▼涓嶅瓨鍦�");
+        }
+
+        RgvCommand command = rgvThread.getMoveCommand(9999, rgvNo, targetPos);
+        MessageQueue.offer(SlaveType.Rgv, rgvNo, new Task(2, command));
+        return R.ok();
+    }
+
+    @PostMapping("/command/taskComplete")
+    public R rgvCommandTaskComplete(@RequestBody RgvCommandTaskCompleteParam param) {
+        if (Cools.isEmpty(param) || param.getRgvNo() == null) {
+            return R.error("缂哄皯鍙傛暟");
+        }
+
+        Integer rgvNo = param.getRgvNo();
+
+        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
+        if (rgvThread == null) {
+            return R.error("绾跨▼涓嶅瓨鍦�");
+        }
+
+        RgvCommand command = rgvThread.getResetCommand(rgvNo);
+        MessageQueue.offer(SlaveType.Rgv, rgvNo, new Task(2, command));
+        return R.ok();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/asrs/domain/param/RgvCommandMoveParam.java b/src/main/java/com/zy/asrs/domain/param/RgvCommandMoveParam.java
new file mode 100644
index 0000000..08c1649
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/param/RgvCommandMoveParam.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.domain.param;
+
+import lombok.Data;
+
+@Data
+public class RgvCommandMoveParam {
+
+    private Integer rgvNo;
+
+    private Integer targetPos;
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/param/RgvCommandTaskCompleteParam.java b/src/main/java/com/zy/asrs/domain/param/RgvCommandTaskCompleteParam.java
new file mode 100644
index 0000000..6a529f4
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/param/RgvCommandTaskCompleteParam.java
@@ -0,0 +1,10 @@
+package com.zy.asrs.domain.param;
+
+import lombok.Data;
+
+@Data
+public class RgvCommandTaskCompleteParam {
+
+    private Integer rgvNo;
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/param/RgvCommandTransportParam.java b/src/main/java/com/zy/asrs/domain/param/RgvCommandTransportParam.java
new file mode 100644
index 0000000..5f7cefe
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/param/RgvCommandTransportParam.java
@@ -0,0 +1,14 @@
+package com.zy.asrs.domain.param;
+
+import lombok.Data;
+
+@Data
+public class RgvCommandTransportParam {
+
+    private Integer rgvNo;
+
+    private Integer sourcePos;
+
+    private Integer targetPos;
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java b/src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java
new file mode 100644
index 0000000..fdccefe
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java
@@ -0,0 +1,26 @@
+package com.zy.asrs.domain.vo;
+
+import lombok.Data;
+
+@Data
+public class RgvStateTableVo {
+
+    private Integer rgvNo;
+
+    private Integer taskNo;
+
+    private String mode;
+
+    private String status;
+
+    private String loading;
+
+    private String trackSiteNo;
+
+    private String deviceStatus;
+
+    private String warnCode;
+
+    private String alarm;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/BasRgv.java b/src/main/java/com/zy/asrs/entity/BasRgv.java
index 04465d3..453395a 100644
--- a/src/main/java/com/zy/asrs/entity/BasRgv.java
+++ b/src/main/java/com/zy/asrs/entity/BasRgv.java
@@ -24,7 +24,7 @@
      * 缂栧彿
      */
     @ApiModelProperty(value= "缂栧彿")
-    @TableId(value = "rgv_no", type = IdType.AUTO)
+    @TableId(value = "rgv_no", type = IdType.INPUT)
     @TableField("rgv_no")
     private Integer rgvNo;
 
diff --git a/src/main/java/com/zy/common/CodeBuilder.java b/src/main/java/com/zy/common/CodeBuilder.java
index 8ca736f..40b463c 100644
--- a/src/main/java/com/zy/common/CodeBuilder.java
+++ b/src/main/java/com/zy/common/CodeBuilder.java
@@ -12,10 +12,10 @@
         CoolGenerator generator = new CoolGenerator();
         // mysql
         generator.sqlOsType = SqlOsType.MYSQL;
-        generator.url="localhost:3306/wcs";
+        generator.url="192.168.4.11:3306/wcs";
         generator.username="root";
         generator.password="root";
-        generator.table="asr_bas_devp";
+        generator.table="asr_bas_rgv_opt";
         // sqlserver
 //        generator.sqlOsType = SqlOsType.SQL_SERVER;
 //        generator.url="127.0.0.1:1433;databasename=tzskasrs";
diff --git a/src/main/java/com/zy/common/utils/NavigateSolution.java b/src/main/java/com/zy/common/utils/NavigateSolution.java
index b76e86f..0cd7bed 100644
--- a/src/main/java/com/zy/common/utils/NavigateSolution.java
+++ b/src/main/java/com/zy/common/utils/NavigateSolution.java
@@ -63,6 +63,51 @@
         return navigateNodeList;
     }
 
+    public List<List<NavigateNode>> getRgvTrackMap() {
+        BasMapService basMapService = SpringUtils.getBean(BasMapService.class);
+        BasMap basMap = basMapService.selectOne(new EntityWrapper<BasMap>().eq("lev", 1));
+        if (basMap == null) {
+            throw new CoolException("鍦板浘涓嶅瓨鍦�");
+        }
+
+        List<List<JSONObject>> dataList = JSON.parseObject(basMap.getData(), List.class);
+
+        List<List<NavigateNode>> navigateNodeList = new ArrayList<>();
+        for (int i = 0; i < dataList.size(); i++) {
+            List<JSONObject> row = dataList.get(i);
+            List<NavigateNode> navigateNodeRow = new ArrayList<>();
+            for (int j = 0; j < row.size(); j++) {
+                JSONObject map = row.get(j);
+                NavigateNode navigateNode = new NavigateNode(i, j);
+
+                String nodeType = map.getString("type");
+                if(nodeType == null) {
+                    navigateNode.setValue(MapNodeType.DISABLE.id);
+                }else if(nodeType.equals("rgv")){
+                    navigateNode.setValue(MapNodeType.NORMAL_PATH.id);
+                    JSONObject valueObj = JSON.parseObject(map.getString("value"));
+
+                    //RGV鏆備笉鎺у埗琛岃蛋鏂瑰悜锛岄粯璁や笂涓嬪乏鍙抽兘鍙蛋
+                    List<String> directionList = new ArrayList<>();
+                    directionList.add("top");
+                    directionList.add("bottom");
+                    directionList.add("left");
+                    directionList.add("right");
+                    navigateNode.setDirectionList(directionList);
+                }else {
+                    navigateNode.setValue(MapNodeType.DISABLE.id);
+                }
+
+                navigateNode.setNodeType(nodeType);
+                navigateNode.setNodeValue(map.getString("value"));
+                navigateNodeRow.add(navigateNode);
+            }
+            navigateNodeList.add(navigateNodeRow);
+        }
+
+        return navigateNodeList;
+    }
+
     public NavigateNode astarSearchJava(List<List<NavigateNode>> map, NavigateNode start, NavigateNode end) {
         // 娓呯悊涓婃鎼滅储鐨勭姸鎬侊紝闃叉澶嶇敤瀹炰緥瀵艰嚧璁板綍娈嬬暀
         this.Open.clear();
@@ -184,6 +229,21 @@
         return null;
     }
 
+    public NavigateNode findTrackSiteNoNavigateNode(List<List<NavigateNode>> map, int trackSiteNo) {
+        for(int x = 0; x < map.size(); x++) {
+            for(int y = 0; y < map.get(0).size(); y++) {
+                NavigateNode node = map.get(x).get(y);
+                if("rgv".equals(node.getNodeType())) {
+                    JSONObject valueObj = JSON.parseObject(node.getNodeValue());
+                    if(valueObj.getInteger("trackSiteNo") == trackSiteNo) {
+                        return node;
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
     //------------------A*鍚彂鍑芥暟------------------//
 
     //璁$畻閫氳繃鐜板湪鐨勭粨鐐圭殑浣嶇疆鍜屾渶缁堢粨鐐圭殑浣嶇疆璁$畻H鍊�(鏇煎搱椤挎硶锛氬潗鏍囧垎鍒彇宸�肩浉鍔�)
diff --git a/src/main/java/com/zy/common/utils/NavigateUtils.java b/src/main/java/com/zy/common/utils/NavigateUtils.java
index b0ff36d..e324def 100644
--- a/src/main/java/com/zy/common/utils/NavigateUtils.java
+++ b/src/main/java/com/zy/common/utils/NavigateUtils.java
@@ -66,4 +66,56 @@
         return fitlerList;
     }
 
+    public synchronized List<NavigateNode> calcByTrackSiteNo(Integer startTrackSiteNo, Integer endTrackSiteNo) {
+        NavigateSolution navigateSolution = new NavigateSolution();
+        List<List<NavigateNode>> rgvTrackMap = navigateSolution.getRgvTrackMap();
+
+        NavigateNode startNode = navigateSolution.findTrackSiteNoNavigateNode(rgvTrackMap, startTrackSiteNo);
+        if (startNode == null){
+            throw new CoolException("鏈壘鍒拌 璧风偣 瀵瑰簲鐨勮妭鐐�");
+        }
+
+        NavigateNode endNode = navigateSolution.findTrackSiteNoNavigateNode(rgvTrackMap, endTrackSiteNo);
+        if (endNode == null){
+            throw new CoolException("鏈壘鍒拌 缁堢偣 瀵瑰簲鐨勮妭鐐�");
+        }
+
+        NavigateNode res_node = navigateSolution.astarSearchJava(rgvTrackMap, startNode, endNode);
+        if (res_node == null) {
+            throw new CoolException("鏈壘鍒拌璺緞");
+        }
+
+        ArrayList<NavigateNode> list = new ArrayList<>();
+        // 浣跨敤 visited 闆嗗悎闃叉鐖堕摼鍑虹幇鐜鑷存寰幆锛屽悓鏃惰缃畨鍏ㄦ鏁颁笂闄�
+        HashSet<NavigateNode> visited = new HashSet<>();
+        int maxSteps = rgvTrackMap.size() * rgvTrackMap.get(0).size() + 5; // 瀹夊叏涓婇檺
+        int steps = 0;
+        while (res_node != null && visited.add(res_node) && steps++ < maxSteps) {
+            list.add(res_node);
+            res_node = res_node.getFather();//杩唬鎿嶄綔
+        }
+        if (steps >= maxSteps) {
+            throw new CoolException("璺緞鍥炴函瓒呭嚭瀹夊叏涓婇檺锛岀枒浼煎瓨鍦ㄧ埗閾惧惊鐜�");
+        }
+        Collections.reverse(list);
+        //灏嗘瘡涓妭鐐归噷闈㈢殑fatherNode鑷充负null(鏂逛究鍚庣画璁$畻鏃剁埗鑺傜偣杩囧瀵艰嚧鏄剧ず鐨勮妭鐐瑰お澶�)
+        for (NavigateNode navigateNode : list) {
+            //鐖惰妭鐐硅缃负null锛屼笉褰卞搷璁$畻缁撴灉锛屼笉褰卞搷鍚庣画鎿嶄綔銆�
+            //姝ゆ搷浣滀粎涓哄悗缁帓鏌ュ鐞嗘彁渚涜瑙夋柟渚裤��
+            navigateNode.setFather(null);
+        }
+
+        //鍘婚噸
+        HashSet<Integer> set = new HashSet<>();
+        List<NavigateNode> fitlerList = new ArrayList<>();
+        for(NavigateNode navigateNode : list){
+            JSONObject valuObject = JSON.parseObject(navigateNode.getNodeValue());
+            if(set.add(valuObject.getInteger("trackSiteNo"))){
+                fitlerList.add(navigateNode);
+            }
+        }
+
+        return fitlerList;
+    }
+
 }
diff --git a/src/main/java/com/zy/core/enums/RgvModeType.java b/src/main/java/com/zy/core/enums/RgvModeType.java
index be41de3..34b7ab4 100644
--- a/src/main/java/com/zy/core/enums/RgvModeType.java
+++ b/src/main/java/com/zy/core/enums/RgvModeType.java
@@ -3,9 +3,9 @@
 public enum RgvModeType {
 
     NONE(-1, "绂荤嚎"),
-    STOP(0, "鍏虫満"),
-    HAND(1, "鎵嬪姩"),
-    HALF_AUTO(2, "鍗婅嚜鍔�"),
+    HAND(0, "鎵嬪姩"),
+    COMPUTER(1, "鐢佃剳妯″紡"),
+    STOP(2, "鍋滄満"),
     AUTO(3, "鑷姩"),
     OTHER(100, "鍏跺畠"),
     ;
diff --git a/src/main/java/com/zy/core/enums/RgvTaskModeType.java b/src/main/java/com/zy/core/enums/RgvTaskModeType.java
new file mode 100644
index 0000000..3e0067a
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/RgvTaskModeType.java
@@ -0,0 +1,46 @@
+package com.zy.core.enums;
+
+public enum RgvTaskModeType {
+
+    NONE(0),    // 鏃�
+    FETCH(1),    // 鍙栬揣
+    PUT(2),    // 鏀捐揣
+    FETCH_PUT(3),    // 鍙栨斁璐�
+    X_MOVE(4),    // 绔欎綅绉昏浆
+//    Y_MOVE(5),    // 绔欎綅绉昏浆
+//    XY_MOVE(6),    // 绔欎綅绉昏浆
+    GO_ORIGIN(7),    // 鍥炲師鐐�
+//    BACK_ORIGIN(8),      // 鍥炲弽鍘熺偣
+//    CLEAR(9),       // 娓呴敊
+    ;
+
+    public Integer id;
+    RgvTaskModeType(Integer id) {
+        this.id = id;
+    }
+
+    public static RgvTaskModeType get(Integer id) {
+        if (null == id) {
+            return null;
+        }
+        for (RgvTaskModeType type : RgvTaskModeType.values()) {
+            if (type.id.equals(id)) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static RgvTaskModeType get(RgvTaskModeType type) {
+        if (null == type) {
+            return null;
+        }
+        for (RgvTaskModeType rgvTaskModeType : RgvTaskModeType.values()) {
+            if (rgvTaskModeType == type) {
+                return rgvTaskModeType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/src/main/java/com/zy/core/model/command/RgvCommand.java b/src/main/java/com/zy/core/model/command/RgvCommand.java
index 0ba0041..33d919e 100644
--- a/src/main/java/com/zy/core/model/command/RgvCommand.java
+++ b/src/main/java/com/zy/core/model/command/RgvCommand.java
@@ -5,15 +5,18 @@
 @Data
 public class RgvCommand {
 
-    private Integer rgvNo = 0;
+    private Integer rgvNo;
 
-    private Short ackFinish = 0;
+    // 浠诲姟瀹屾垚纭浣�
+    private Integer ackFinish = 0;
 
-    private Short taskNo = 0;
+    private Integer taskNo;
 
-    private Short taskMode = 0;
+    private Integer taskMode;
 
-    private Short targetPos = 0;
+    private Integer sourcePos;
+
+    private Integer targetPos;
     
-    private Short command = 0;
+    private Integer command;
 }
\ No newline at end of file
diff --git a/src/main/java/com/zy/core/network/ZyCrnConnectDriver.java b/src/main/java/com/zy/core/network/ZyCrnConnectDriver.java
index 1127b47..f006143 100644
--- a/src/main/java/com/zy/core/network/ZyCrnConnectDriver.java
+++ b/src/main/java/com/zy/core/network/ZyCrnConnectDriver.java
@@ -18,12 +18,10 @@
 public class ZyCrnConnectDriver implements ThreadHandler{
 
     private boolean connected = false;
-    private SiemensS7Net siemensNet;
     private DeviceConfig deviceConfig;
     private ZyCrnConnectApi zyCrnConnectApi;
 
-    public ZyCrnConnectDriver(SiemensS7Net siemensS7Net, DeviceConfig deviceConfig) {
-        this.siemensNet = siemensS7Net;
+    public ZyCrnConnectDriver(DeviceConfig deviceConfig) {
         this.deviceConfig = deviceConfig;
     }
 
@@ -46,7 +44,7 @@
     @Override
     public boolean connect() {
         if (deviceConfig.getFake() == 0) {
-            zyCrnConnectApi = new ZyCrnRealConnect(siemensNet, deviceConfig);
+            zyCrnConnectApi = new ZyCrnRealConnect(deviceConfig);
         }else {
             zyCrnConnectApi = new ZyCrnFakeConnect(deviceConfig);
         }
diff --git a/src/main/java/com/zy/core/network/ZyRgvConnectDriver.java b/src/main/java/com/zy/core/network/ZyRgvConnectDriver.java
index b9f6f9b..0bcfab7 100644
--- a/src/main/java/com/zy/core/network/ZyRgvConnectDriver.java
+++ b/src/main/java/com/zy/core/network/ZyRgvConnectDriver.java
@@ -1,6 +1,5 @@
 package com.zy.core.network;
 
-import HslCommunication.Profinet.Siemens.SiemensS7Net;
 import com.zy.asrs.entity.DeviceConfig;
 import com.zy.core.ThreadHandler;
 import com.zy.core.model.CommandResponse;
@@ -14,12 +13,10 @@
 @Slf4j
 public class ZyRgvConnectDriver implements ThreadHandler {
     private boolean connected = false;
-    private SiemensS7Net siemensNet;
     private DeviceConfig deviceConfig;
     private ZyRgvConnectApi zyRgvConnectApi;
 
-    public ZyRgvConnectDriver(SiemensS7Net siemensS7Net, DeviceConfig deviceConfig) {
-        this.siemensNet = siemensS7Net;
+    public ZyRgvConnectDriver(DeviceConfig deviceConfig) {
         this.deviceConfig = deviceConfig;
     }
 
@@ -41,7 +38,7 @@
     @Override
     public boolean connect() {
         if (deviceConfig.getFake() == 0) {
-            zyRgvConnectApi = new ZyRgvRealConnect(siemensNet, deviceConfig);
+            zyRgvConnectApi = new ZyRgvRealConnect(deviceConfig);
         } else {
             zyRgvConnectApi = new ZyRgvFakeConnect(deviceConfig);
         }
diff --git a/src/main/java/com/zy/core/network/ZyStationConnectDriver.java b/src/main/java/com/zy/core/network/ZyStationConnectDriver.java
index e4d1cec..b8d3520 100644
--- a/src/main/java/com/zy/core/network/ZyStationConnectDriver.java
+++ b/src/main/java/com/zy/core/network/ZyStationConnectDriver.java
@@ -19,12 +19,10 @@
 public class ZyStationConnectDriver implements ThreadHandler {
 
     private boolean connected = false;
-    private SiemensS7Net siemensNet;
     private DeviceConfig deviceConfig;
     private ZyStationConnectApi zyStationConnectApi;
 
-    public ZyStationConnectDriver(SiemensS7Net siemensS7Net, DeviceConfig deviceConfig) {
-        this.siemensNet = siemensS7Net;
+    public ZyStationConnectDriver(DeviceConfig deviceConfig) {
         this.deviceConfig = deviceConfig;
     }
 
@@ -46,7 +44,7 @@
     @Override
     public boolean connect() {
         if (deviceConfig.getFake() == 0) {
-            zyStationConnectApi = new ZyStationRealConnect(siemensNet, deviceConfig);
+            zyStationConnectApi = new ZyStationRealConnect(deviceConfig);
         } else {
             zyStationConnectApi = new ZyStationFakeConnect(deviceConfig);
         }
diff --git a/src/main/java/com/zy/core/network/entity/ZyRgvStatusEntity.java b/src/main/java/com/zy/core/network/entity/ZyRgvStatusEntity.java
index 0dc5d6c..8fedd26 100644
--- a/src/main/java/com/zy/core/network/entity/ZyRgvStatusEntity.java
+++ b/src/main/java/com/zy/core/network/entity/ZyRgvStatusEntity.java
@@ -5,6 +5,8 @@
 @Data
 public class ZyRgvStatusEntity {
 
+    private Integer rgvNo;
+
     private Integer mode;
 
     private Integer taskNo;
@@ -12,7 +14,14 @@
     private Integer status;
 
     private Integer rgvPos;
-    
+
+    /**
+     * 璧拌鍦ㄥ畾浣�
+     * 0 = 鍦ㄥ畾浣�
+     * 1 = 涓嶅湪瀹氫綅
+     */
+    public Integer walkPos;
+
     private Integer loaded;
 
     private Integer alarm;
diff --git a/src/main/java/com/zy/core/network/fake/ZyCrnFakeConnect.java b/src/main/java/com/zy/core/network/fake/ZyCrnFakeConnect.java
index 1a3be97..a91560b 100644
--- a/src/main/java/com/zy/core/network/fake/ZyCrnFakeConnect.java
+++ b/src/main/java/com/zy/core/network/fake/ZyCrnFakeConnect.java
@@ -141,7 +141,7 @@
         }
     }
 
-        private void sleep(long ms) {
+    private void sleep(long ms) {
         try {
             Thread.sleep(ms);
         } catch (InterruptedException e) {
diff --git a/src/main/java/com/zy/core/network/fake/ZyRgvFakeConnect.java b/src/main/java/com/zy/core/network/fake/ZyRgvFakeConnect.java
index b42a65c..eca22e9 100644
--- a/src/main/java/com/zy/core/network/fake/ZyRgvFakeConnect.java
+++ b/src/main/java/com/zy/core/network/fake/ZyRgvFakeConnect.java
@@ -1,15 +1,26 @@
 package com.zy.core.network.fake;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.core.common.SpringUtils;
 import com.zy.asrs.entity.DeviceConfig;
+import com.zy.common.model.NavigateNode;
+import com.zy.common.utils.NavigateUtils;
+import com.zy.core.enums.RgvModeType;
+import com.zy.core.enums.RgvStatusType;
+import com.zy.core.enums.RgvTaskModeType;
 import com.zy.core.model.CommandResponse;
 import com.zy.core.model.command.RgvCommand;
 import com.zy.core.network.api.ZyRgvConnectApi;
 import com.zy.core.network.entity.ZyRgvStatusEntity;
+import com.zy.core.network.entity.ZyStationStatusEntity;
+
+import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
 public class ZyRgvFakeConnect implements ZyRgvConnectApi {
+    
     private ZyRgvStatusEntity status;
     private final DeviceConfig deviceConfig;
     private final ExecutorService executor = Executors.newSingleThreadExecutor();
@@ -38,18 +49,124 @@
     @Override
     public CommandResponse sendCommand(RgvCommand command) {
         CommandResponse response = new CommandResponse(true);
-        executor.submit(() -> {
-            if (command.getTaskMode() != null && command.getTaskMode() == 1) {
-                status.setTaskNo((int) command.getTaskNo());
-                status.setStatus(1);
-                try { Thread.sleep(300); } catch (InterruptedException ignored) {}
-                status.setRgvPos((int) command.getTargetPos());
-                status.setStatus(0);
-            } else if (command.getTaskMode() != null && command.getTaskMode() == 0) {
-                status.setTaskNo(0);
-                status.setStatus(0);
-            }
-        });
+        if (command.getTaskMode() == RgvTaskModeType.FETCH_PUT.id) {
+            //鍙栨斁璐�
+            executor.submit(() -> commandTake(command));
+        } else if (command.getTaskMode() == RgvTaskModeType.X_MOVE.id) {
+            //绉诲姩
+            executor.submit(() -> commandMove(command));
+        }else if (command.getTaskMode() == RgvTaskModeType.NONE.id) {
+            //澶嶄綅
+            executor.submit(() -> commandTaskComplete(command));
+        }
         return response;
     }
+
+    private void commandTake(RgvCommand command) {
+        int taskNo = command.getTaskNo();
+        int taskMode = command.getTaskMode();
+        int sourcePos = command.getSourcePos();
+        int targetPos = command.getTargetPos();
+
+        NavigateUtils navigateUtils = SpringUtils.getBean(NavigateUtils.class);
+        if (navigateUtils == null) {
+            return;
+        }
+
+        List<NavigateNode> navigateNodes = null;
+        try {
+            navigateNodes = navigateUtils.calcByTrackSiteNo(status.getRgvPos(), sourcePos);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        if (navigateNodes == null) {
+            return;
+        }
+
+        List<NavigateNode> targetNavigateNodes = null;
+        try {
+            targetNavigateNodes = navigateUtils.calcByTrackSiteNo(sourcePos, targetPos);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        if (targetNavigateNodes == null) {
+            return;
+        }
+
+        status.setTaskNo(taskNo);
+        status.setStatus(RgvStatusType.FETCHING.id);
+        for (int i = 0; i < navigateNodes.size(); i++) {
+            NavigateNode navigateNode = navigateNodes.get(i);
+            JSONObject valueObject = JSON.parseObject(navigateNode.getNodeValue());
+            Integer currentTrackSiteNo = valueObject.getInteger("trackSiteNo");
+
+            status.setRgvPos(currentTrackSiteNo);
+            sleep(1000);
+        }
+
+        status.setStatus(RgvStatusType.PUTTING.id);
+        status.setLoaded(1);
+        sleep(1000);
+
+        for (int i = 0; i < targetNavigateNodes.size(); i++) {
+            NavigateNode navigateNode = targetNavigateNodes.get(i);
+            JSONObject valueObject = JSON.parseObject(navigateNode.getNodeValue());
+            Integer currentTrackSiteNo = valueObject.getInteger("trackSiteNo");
+
+            status.setRgvPos(currentTrackSiteNo);
+            sleep(1000);
+        }
+
+        sleep(1000);
+        status.setStatus(RgvStatusType.WAITING.id);
+    }
+
+    private void commandMove(RgvCommand command) {
+        int taskNo = command.getTaskNo();
+        int taskMode = command.getTaskMode();
+        int targetPos = command.getTargetPos();
+
+        NavigateUtils navigateUtils = SpringUtils.getBean(NavigateUtils.class);
+        if (navigateUtils == null) {
+            return;
+        }
+
+        List<NavigateNode> navigateNodes = null;
+        try {
+            navigateNodes = navigateUtils.calcByTrackSiteNo(status.getRgvPos(), targetPos);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        if (navigateNodes == null) {
+            return;
+        }
+
+        status.setTaskNo(taskNo);
+        status.setStatus(RgvStatusType.WORKING.id);
+        for (int i = 0; i < navigateNodes.size(); i++) {
+            NavigateNode navigateNode = navigateNodes.get(i);
+            JSONObject valueObject = JSON.parseObject(navigateNode.getNodeValue());
+            Integer currentTrackSiteNo = valueObject.getInteger("trackSiteNo");
+
+            status.setRgvPos(currentTrackSiteNo);
+            sleep(1000);
+        }
+        status.setStatus(RgvStatusType.WAITING.id);
+    }
+
+    private void commandTaskComplete(RgvCommand command) {
+        status.setTaskNo(0);
+        status.setStatus(RgvStatusType.IDLE.id);
+    }
+
+    private void sleep(long ms) {
+        try {
+            Thread.sleep(ms);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/com/zy/core/network/real/ZyCrnRealConnect.java b/src/main/java/com/zy/core/network/real/ZyCrnRealConnect.java
index 694ef52..059ebf8 100644
--- a/src/main/java/com/zy/core/network/real/ZyCrnRealConnect.java
+++ b/src/main/java/com/zy/core/network/real/ZyCrnRealConnect.java
@@ -2,6 +2,7 @@
 
 import HslCommunication.Core.Types.OperateResult;
 import HslCommunication.Core.Types.OperateResultExOne;
+import HslCommunication.Profinet.Siemens.SiemensPLCS;
 import HslCommunication.Profinet.Siemens.SiemensS7Net;
 import com.alibaba.fastjson.JSON;
 import com.core.common.DateUtils;
@@ -25,13 +26,13 @@
     private SiemensS7Net siemensNet;
     private DeviceConfig deviceConfig;
 
-    public ZyCrnRealConnect(SiemensS7Net siemensS7Net, DeviceConfig deviceConfig) {
-        this.siemensNet = siemensS7Net;
+    public ZyCrnRealConnect(DeviceConfig deviceConfig) {
         this.deviceConfig = deviceConfig;
     }
 
     public boolean connect() {
         boolean connected = false;
+        siemensNet = new SiemensS7Net(SiemensPLCS.S1200, deviceConfig.getIp());
         OperateResult connect = siemensNet.ConnectServer();
         if(connect.IsSuccess){
             connected = true;
@@ -220,7 +221,7 @@
                     null,    // 淇敼浜哄憳
                     null,    // 澶囨敞
                     JSON.toJSONString(command),    // 鎸囦护
-                    JSON.toJSONString(command),    // 绯荤粺鐘舵��
+                    JSON.toJSONString(getStatus()),    // 绯荤粺鐘舵��
                     1,    // 涓嬪彂鐘舵�亄0:鏈笅鍙�,1:宸蹭笅鍙憓
                     JSON.toJSONString(response)    // 鍝嶅簲
             );
diff --git a/src/main/java/com/zy/core/network/real/ZyRgvRealConnect.java b/src/main/java/com/zy/core/network/real/ZyRgvRealConnect.java
index f70729d..97a8ffc 100644
--- a/src/main/java/com/zy/core/network/real/ZyRgvRealConnect.java
+++ b/src/main/java/com/zy/core/network/real/ZyRgvRealConnect.java
@@ -1,38 +1,146 @@
 package com.zy.core.network.real;
 
+import HslCommunication.Core.Types.OperateResult;
+import HslCommunication.Core.Types.OperateResultExOne;
+import HslCommunication.Profinet.Siemens.SiemensPLCS;
 import HslCommunication.Profinet.Siemens.SiemensS7Net;
+
+import java.text.MessageFormat;
+import java.util.Date;
+
+import com.alibaba.fastjson.JSON;
+import com.core.common.DateUtils;
+import com.core.common.SpringUtils;
+import com.zy.asrs.entity.BasCrnpOpt;
+import com.zy.asrs.entity.BasRgv;
+import com.zy.asrs.entity.BasRgvOpt;
 import com.zy.asrs.entity.DeviceConfig;
+import com.zy.asrs.entity.DeviceDataLog;
+import com.zy.asrs.service.BasCrnpOptService;
+import com.zy.asrs.service.BasRgvOptService;
+import com.zy.asrs.service.BasRgvService;
+import com.zy.asrs.service.DeviceDataLogService;
+import com.zy.asrs.utils.Utils;
+import com.zy.core.News;
+import com.zy.core.cache.OutputQueue;
+import com.zy.core.enums.RgvStatusType;
 import com.zy.core.model.CommandResponse;
 import com.zy.core.model.command.RgvCommand;
+import com.zy.core.model.protocol.RgvProtocol;
 import com.zy.core.network.api.ZyRgvConnectApi;
 import com.zy.core.network.entity.ZyRgvStatusEntity;
 
 public class ZyRgvRealConnect implements ZyRgvConnectApi {
-    private final SiemensS7Net siemensNet;
-    private final DeviceConfig deviceConfig;
 
-    public ZyRgvRealConnect(SiemensS7Net siemensNet, DeviceConfig deviceConfig) {
-        this.siemensNet = siemensNet;
+    private SiemensS7Net siemensNet;
+    private DeviceConfig deviceConfig;
+
+    public ZyRgvRealConnect(DeviceConfig deviceConfig) {
         this.deviceConfig = deviceConfig;
     }
 
     @Override
     public boolean connect() {
-        return true;
+        boolean result = false;
+        siemensNet = new SiemensS7Net(SiemensPLCS.S1200, deviceConfig.getIp());
+        OperateResult connect = siemensNet.ConnectServer();
+        if(connect.IsSuccess){
+            result = true;
+            OutputQueue.RGV.offer(MessageFormat.format( "銆恵0}銆慠GV plc杩炴帴鎴愬姛 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getId(), deviceConfig.getIp(), deviceConfig.getPort()));
+            News.info("RGV plc杩炴帴鎴愬姛 ===>> [id:{}] [ip:{}] [port:{}]", deviceConfig.getId(), deviceConfig.getIp(), deviceConfig.getPort());
+        } else {
+            OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆慠GV plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getId(), deviceConfig.getIp(), deviceConfig.getPort()));
+            News.error("RGV plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", deviceConfig.getId(), deviceConfig.getIp(), deviceConfig.getPort());
+        }
+//        siemensNet.ConnectClose();
+        return result;
     }
 
     @Override
     public boolean disconnect() {
+        siemensNet.ConnectClose();
         return true;
     }
 
     @Override
     public ZyRgvStatusEntity getStatus() {
+        try {
+            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 30);
+            if (result.IsSuccess) {
+                ZyRgvStatusEntity zyRgvStatusEntity = new ZyRgvStatusEntity();
+                zyRgvStatusEntity.setRgvNo(deviceConfig.getDeviceNo());
+                zyRgvStatusEntity.setMode((int) siemensNet.getByteTransform().TransInt16(result.Content, 0));
+                zyRgvStatusEntity.setStatus((int) siemensNet.getByteTransform().TransInt16(result.Content, 2));
+                zyRgvStatusEntity.setTaskNo((int) siemensNet.getByteTransform().TransInt16(result.Content, 4));
+                // zyRgvStatusEntity.setStatus((int) siemensNet.getByteTransform().TransInt16(result.Content, 6));
+                zyRgvStatusEntity.setLoaded((int) siemensNet.getByteTransform().TransInt16(result.Content, 8));
+                zyRgvStatusEntity.setRgvPos((int) siemensNet.getByteTransform().TransInt16(result.Content, 10));
+                zyRgvStatusEntity.setWalkPos((int) siemensNet.getByteTransform().TransInt16(result.Content, 12));
+                zyRgvStatusEntity.setAlarm((int) siemensNet.getByteTransform().TransInt16(result.Content, 14));
+
+                OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛", DateUtils.convert(new Date()), deviceConfig.getDeviceNo()));
+
+                return zyRgvStatusEntity;
+            } else {
+                OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆戣鍙朢GV plc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getId(), deviceConfig.getIp(), deviceConfig.getPort()));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆戣鍙朢GV plc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getId(), deviceConfig.getIp(), deviceConfig.getPort()));
+        }
         return null;
     }
 
     @Override
     public CommandResponse sendCommand(RgvCommand command) {
-        return new CommandResponse(false, "not implemented");
+        CommandResponse response = new CommandResponse(false);
+        try {
+            if (null == command) {
+                response.setMessage("RGV鍐欏叆鍛戒护涓虹┖");
+                return response;
+            }   
+
+            short[] array = new short[5];
+            array[0] = command.getAckFinish().shortValue();
+            array[1] = command.getTaskNo().shortValue();
+            array[2] = command.getTaskMode().shortValue();
+            array[3] = command.getSourcePos().shortValue();
+            array[4] = command.getTargetPos().shortValue();
+            OperateResult result = siemensNet.Write("DB100.0", array);
+
+            if (result != null && result.IsSuccess) {
+                News.info("RGV 鍛戒护涓嬪彂[id:{}] >>>>> {}", deviceConfig.getDeviceNo(), JSON.toJSON(command));
+                OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆慬id:{1}] >>>>> 鍛戒护涓嬪彂锛� {2}", DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), JSON.toJSON(command)));
+                response.setResult(true);
+                return response;
+            } else {
+                OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆戝啓鍏GV plc鏁版嵁澶辫触 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getId(), deviceConfig.getIp(), deviceConfig.getPort()));
+                News.error("鍐欏叆RGV plc鏁版嵁澶辫触 ===>> [id:{}] [ip:{}] [port:{}]", deviceConfig.getId(), deviceConfig.getIp(), deviceConfig.getPort());
+                response.setMessage("鍐欏叆RGV plc鏁版嵁澶辫触");
+                return response;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            // 鏃ュ織璁板綍
+            BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
+            BasRgvOpt basRgvOpt = new BasRgvOpt(
+                    command.getTaskNo(),    // 浠诲姟鍙�
+                    command.getRgvNo(),    // RGV[闈炵┖]
+                    new Date(),    // 涓嬪彂鏃堕棿
+                    String.valueOf(command.getTaskMode()),    // 妯″紡
+                    String.valueOf(command.getSourcePos()), //婧愬簱浣�
+                    String.valueOf(command.getTargetPos()), //鐩爣搴撲綅
+                    null,    // 淇敼鏃堕棿
+                    null,    // 淇敼浜哄憳
+                    null,    // 澶囨敞
+                    JSON.toJSONString(command),    // 鎸囦护
+                    JSON.toJSONString(getStatus()),    // 绯荤粺鐘舵��
+                    1,    // 涓嬪彂鐘舵�亄0:鏈笅鍙�,1:宸蹭笅鍙憓
+                    JSON.toJSONString(response)    // 鍝嶅簲
+            );
+            bean.insert(basRgvOpt);
+        }
+        return response;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/zy/core/network/real/ZyStationRealConnect.java b/src/main/java/com/zy/core/network/real/ZyStationRealConnect.java
index d74bc5a..0399061 100644
--- a/src/main/java/com/zy/core/network/real/ZyStationRealConnect.java
+++ b/src/main/java/com/zy/core/network/real/ZyStationRealConnect.java
@@ -2,6 +2,7 @@
 
 import HslCommunication.Core.Types.OperateResult;
 import HslCommunication.Core.Types.OperateResultExOne;
+import HslCommunication.Profinet.Siemens.SiemensPLCS;
 import HslCommunication.Profinet.Siemens.SiemensS7Net;
 import lombok.extern.slf4j.Slf4j;
 
@@ -33,17 +34,17 @@
 
     private List<ZyStationStatusEntity> statusList;
     private List<ZyStationStatusEntity> barcodeStatusList;
-    private final SiemensS7Net siemensNet;
-    private final DeviceConfig deviceConfig;
+    private SiemensS7Net siemensNet;
+    private DeviceConfig deviceConfig;
 
-    public ZyStationRealConnect(SiemensS7Net siemensNet, DeviceConfig deviceConfig) {
-        this.siemensNet = siemensNet;
+    public ZyStationRealConnect(DeviceConfig deviceConfig) {
         this.deviceConfig = deviceConfig;
     }
 
     @Override
     public boolean connect() {
         boolean connected = false;
+        siemensNet = new SiemensS7Net(SiemensPLCS.S1200, deviceConfig.getIp());
         OperateResult connect = siemensNet.ConnectServer();
         if (connect.IsSuccess) {
             connected = true;
diff --git a/src/main/java/com/zy/core/thread/RgvThread.java b/src/main/java/com/zy/core/thread/RgvThread.java
index 9d0f2ac..39fda80 100644
--- a/src/main/java/com/zy/core/thread/RgvThread.java
+++ b/src/main/java/com/zy/core/thread/RgvThread.java
@@ -9,6 +9,8 @@
 
     RgvProtocol getStatus();
 
+    RgvCommand getTransportCommand(Integer taskNo, Integer rgvNo, Integer sourcePos, Integer targetPos);
+
     RgvCommand getMoveCommand(Integer taskNo, Integer rgvNo, Integer targetPos);
 
     RgvCommand getResetCommand(Integer rgvNo);
diff --git a/src/main/java/com/zy/core/thread/impl/ZyRgvThread.java b/src/main/java/com/zy/core/thread/impl/ZyRgvThread.java
index 130e0bc..6ce7e22 100644
--- a/src/main/java/com/zy/core/thread/impl/ZyRgvThread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZyRgvThread.java
@@ -3,13 +3,18 @@
 import HslCommunication.Profinet.Siemens.SiemensPLCS;
 import HslCommunication.Profinet.Siemens.SiemensS7Net;
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.common.DateUtils;
+import com.core.common.SpringUtils;
+import com.zy.asrs.entity.BasRgv;
 import com.zy.asrs.entity.DeviceConfig;
 import com.zy.asrs.entity.DeviceDataLog;
+import com.zy.asrs.service.BasRgvService;
 import com.zy.common.utils.RedisUtil;
 import com.zy.core.cache.MessageQueue;
 import com.zy.core.cache.OutputQueue;
 import com.zy.core.enums.RedisKeyType;
+import com.zy.core.enums.RgvTaskModeType;
 import com.zy.core.enums.SlaveType;
 import com.zy.core.model.CommandResponse;
 import com.zy.core.model.Task;
@@ -28,6 +33,7 @@
 @Data
 @Slf4j
 public class ZyRgvThread implements Runnable, RgvThread {
+
     private DeviceConfig deviceConfig;
     private RedisUtil redisUtil;
     private ZyRgvConnectDriver zyRgvConnectDriver;
@@ -72,7 +78,7 @@
             rgvProtocol = new RgvProtocol();
             rgvProtocol.setRgvNo(deviceConfig.getDeviceNo());
         }
-        rgvProtocol.setMode(-1);
+        rgvProtocol.setMode(0);
         rgvProtocol.setTaskNo(0);
         rgvProtocol.setStatus(-1);
         rgvProtocol.setRgvPos(0);
@@ -82,8 +88,7 @@
 
     @Override
     public boolean connect() {
-        SiemensS7Net siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200, deviceConfig.getIp());
-        zyRgvConnectDriver = new ZyRgvConnectDriver(siemensS7Net, deviceConfig);
+        zyRgvConnectDriver = new ZyRgvConnectDriver(deviceConfig);
         new Thread(zyRgvConnectDriver).start();
         DeviceConnectPool.put(SlaveType.Rgv, deviceConfig.getDeviceNo(), zyRgvConnectDriver);
         return true;
@@ -122,6 +127,18 @@
             redisUtil.set(RedisKeyType.DEVICE_LOG_KEY.key + System.currentTimeMillis(), deviceDataLog, 60 * 60 * 24);
             rgvProtocol.setDeviceDataLog(System.currentTimeMillis());
         }
+
+        BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class);
+        if (basRgvService != null) {
+            BasRgv basRgv = basRgvService.selectOne(new EntityWrapper<BasRgv>().eq("rgv_no", deviceConfig.getDeviceNo()));
+            if(basRgv == null) {
+                basRgv = new BasRgv();
+                basRgv.setRgvNo(deviceConfig.getDeviceNo());
+                basRgv.setStatus(1);
+                basRgv.setCreateTime(new Date());
+                basRgvService.insert(basRgv);
+            }
+        }
     }
 
     @Override
@@ -135,13 +152,25 @@
     }
 
     @Override
+    public RgvCommand getTransportCommand(Integer taskNo, Integer rgvNo, Integer sourcePos, Integer targetPos) {
+        RgvCommand cmd = new RgvCommand();
+        cmd.setRgvNo(rgvNo);
+        cmd.setTaskNo(taskNo);
+        cmd.setTaskMode(RgvTaskModeType.FETCH_PUT.id);
+        cmd.setSourcePos(sourcePos);
+        cmd.setTargetPos(targetPos);
+        cmd.setCommand(1);
+        return cmd;
+    }
+
+    @Override
     public RgvCommand getMoveCommand(Integer taskNo, Integer rgvNo, Integer targetPos) {
         RgvCommand cmd = new RgvCommand();
         cmd.setRgvNo(rgvNo);
-        cmd.setTaskNo(taskNo.shortValue());
-        cmd.setTaskMode((short) 1);
-        cmd.setTargetPos(targetPos.shortValue());
-        cmd.setCommand((short) 1);
+        cmd.setTaskNo(taskNo);
+        cmd.setTaskMode(RgvTaskModeType.X_MOVE.id);
+        cmd.setTargetPos(targetPos);
+        cmd.setCommand(1);
         return cmd;
     }
 
@@ -149,10 +178,10 @@
     public RgvCommand getResetCommand(Integer rgvNo) {
         RgvCommand cmd = new RgvCommand();
         cmd.setRgvNo(rgvNo);
-        cmd.setTaskNo((short) 0);
-        cmd.setAckFinish((short) 1);
-        cmd.setTaskMode((short) 0);
-        cmd.setCommand((short) 1);
+        cmd.setTaskNo(0);
+        cmd.setAckFinish(1);
+        cmd.setTaskMode(0);
+        cmd.setCommand(1);
         return cmd;
     }
 
diff --git a/src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java b/src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java
index e0d46c5..ee135e2 100644
--- a/src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java
@@ -1,7 +1,5 @@
 package com.zy.core.thread.impl;
 
-import HslCommunication.Profinet.Siemens.SiemensPLCS;
-import HslCommunication.Profinet.Siemens.SiemensS7Net;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.common.DateUtils;
@@ -109,8 +107,7 @@
 
     @Override
     public boolean connect() {
-        SiemensS7Net siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200, deviceConfig.getIp());
-        zyCrnConnectDriver = new ZyCrnConnectDriver(siemensS7Net, deviceConfig);
+        zyCrnConnectDriver = new ZyCrnConnectDriver(deviceConfig);
         new Thread(zyCrnConnectDriver).start();
         DeviceConnectPool.put(SlaveType.Crn, deviceConfig.getDeviceNo(), zyCrnConnectDriver);
         return true;
diff --git a/src/main/java/com/zy/core/thread/impl/ZyStationThread.java b/src/main/java/com/zy/core/thread/impl/ZyStationThread.java
index 5c0d73c..68cbd91 100644
--- a/src/main/java/com/zy/core/thread/impl/ZyStationThread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZyStationThread.java
@@ -1,7 +1,5 @@
 package com.zy.core.thread.impl;
 
-import HslCommunication.Profinet.Siemens.SiemensPLCS;
-import HslCommunication.Profinet.Siemens.SiemensS7Net;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.zy.asrs.entity.BasDevp;
@@ -143,8 +141,7 @@
 
     @Override
     public boolean connect() {
-        SiemensS7Net siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200, deviceConfig.getIp());
-        zyStationConnectDriver = new ZyStationConnectDriver(siemensS7Net, deviceConfig);
+        zyStationConnectDriver = new ZyStationConnectDriver(deviceConfig);
         new Thread(zyStationConnectDriver).start();
         DeviceConnectPool.put(SlaveType.Devp, deviceConfig.getDeviceNo(), zyStationConnectDriver);
         return true;
diff --git a/src/main/webapp/components/WatchRgvCard.js b/src/main/webapp/components/WatchRgvCard.js
new file mode 100644
index 0000000..18e6ba5
--- /dev/null
+++ b/src/main/webapp/components/WatchRgvCard.js
@@ -0,0 +1,188 @@
+Vue.component("watch-rgv-card", {
+  template: `
+    <div>
+        <div style="display: flex;margin-bottom: 10px;">
+            <div style="width: 100%;">RGV鐩戞帶</div>
+            <div style="width: 100%;text-align: right;display: flex;">
+              <el-input size="mini" v-model="searchRgvNo" placeholder="璇疯緭鍏GV鍙�"></el-input>
+              <el-button @click="getRgvStateInfo" size="mini">鏌ヨ</el-button>
+            </div>
+        </div>
+        <div style="margin-bottom: 10px;">
+            <div style="margin-bottom: 5px;">
+               <el-button v-if="showControl" @click="openControl" size="mini">鍏抽棴鎺у埗涓績</el-button>
+               <el-button v-else @click="openControl" size="mini">鎵撳紑鎺у埗涓績</el-button>
+            </div>
+            <div v-if="showControl" style="display: flex;justify-content: space-between;flex-wrap: wrap;">
+                <div style="margin-bottom: 10px;width: 33%;"><el-input size="mini" v-model="controlParam.rgvNo" placeholder="RGV鍙�"></el-input></div>
+                <div style="margin-bottom: 10px;width: 33%;"><el-input size="mini" v-model="controlParam.sourcePos" placeholder="婧愮偣"></el-input></div>
+                <div style="margin-bottom: 10px;width: 33%;"><el-input size="mini" v-model="controlParam.targetPos" placeholder="鐩爣鐐�"></el-input></div>
+                <div style="margin-bottom: 10px;"><el-button @click="controlCommandTransport()" size="mini">鍙栨斁璐�</el-button></div>
+                <div style="margin-bottom: 10px;"><el-button @click="controlCommandMove()" size="mini">绉诲姩</el-button></div>
+                <div style="margin-bottom: 10px;"><el-button @click="controlCommandTaskComplete()" size="mini">浠诲姟瀹屾垚</el-button></div>
+            </div>
+        </div>
+        <el-collapse v-model="activeNames">
+          <el-collapse-item v-for="(item) in rgvList" :name="item.rgvNo">
+            <template slot="title">
+                <div style="width: 100%;display: flex;">
+                   <div style="width: 50%;">{{ item.rgvNo }}鍙稲GV</div>
+                   <div style="width: 50%;text-align: right;">
+                      <el-tag v-if="item.deviceStatus === 'AUTO'" type="success" size="small">鑷姩</el-tag>
+                      <el-tag v-else-if="item.deviceStatus === 'WORKING'" size="small">浣滀笟涓�</el-tag>
+                      <el-tag v-else-if="item.deviceStatus === 'ERROR'" type="danger" size="small">鎶ヨ</el-tag>
+                      <el-tag v-else type="warning" size="small">绂荤嚎</el-tag>
+                   </div>
+                </div>
+            </template>
+            <el-descriptions border direction="vertical">
+                <el-descriptions-item label="缂栧彿">{{ item.rgvNo }}</el-descriptions-item>
+                <el-descriptions-item label="宸ヤ綔鍙�">{{ item.taskNo }}</el-descriptions-item>
+                <el-descriptions-item label="妯″紡">{{ item.mode }}</el-descriptions-item>
+                <el-descriptions-item label="鐘舵��">{{ item.status }}</el-descriptions-item>
+                <el-descriptions-item label="杞ㄩ亾浣�">{{ item.trackSiteNo }}</el-descriptions-item>
+                <el-descriptions-item label="鏄惁鏈夌墿">{{ item.loading }}</el-descriptions-item>
+                <el-descriptions-item label="鏁呴殰浠g爜">{{ item.warnCode }}</el-descriptions-item>
+                <el-descriptions-item label="鏁呴殰鎻忚堪">{{ item.alarm }}</el-descriptions-item>
+            </el-descriptions>
+          </el-collapse-item>
+        </el-collapse>
+    </div>
+    `,
+  props: ["param"],
+  data() {
+    return {
+      rgvList: [],
+      activeNames: "",
+      searchRgvNo: "",
+      showControl: true,
+      controlParam: {
+        rgvNo: "",
+        sourcePos: "",
+        targetPos: ""
+      }
+    };
+  },
+  created() {
+    setInterval(() => {
+      this.getRgvStateInfo();
+    }, 1000);
+  },
+  watch: {
+    param: {
+      handler(newVal) {
+        if (newVal && newVal.rgvNo != 0) {
+          this.activeNames = newVal.rgvNo;
+        }
+      },
+      deep: true,
+      immediate: true
+    },
+  },
+  methods: {
+    getRgvStateInfo() {
+      let that = this;
+      $.ajax({
+        url: baseUrl + "/rgv/table/rgv/state",
+        headers: {
+          token: localStorage.getItem("token"),
+        },
+        method: "post",
+        success: (res) => {
+          if (res.code == 200) {
+            let list = res.data || [];
+            if (that.searchRgvNo == "") {
+              that.rgvList = list;
+            } else {
+              let tmp = [];
+              list.forEach((item) => {
+                if (item.rgvNo == that.searchRgvNo) {
+                  tmp.push(item);
+                }
+              });
+              that.rgvList = tmp;
+            }
+          }
+        },
+      });
+    },
+    openControl() {
+      this.showControl = !this.showControl;
+    },
+    controlCommandTransport() {
+      let that = this;
+      $.ajax({
+        url: baseUrl + "/rgv/command/transport",
+        headers: {
+          token: localStorage.getItem("token"),
+        },
+        contentType: "application/json",
+        method: "post",
+        data: JSON.stringify(that.controlParam),
+        success: (res) => {
+          if (res.code == 200) {
+            that.$message({
+              message: res.msg,
+              type: "success",
+            });
+          } else {
+            that.$message({
+              message: res.msg,
+              type: "warning",
+            });
+          }
+        },
+      });
+    },
+    controlCommandMove() {
+      let that = this;
+      $.ajax({
+        url: baseUrl + "/rgv/command/move",
+        headers: {
+          token: localStorage.getItem("token"),
+        },
+        contentType: "application/json",
+        method: "post",
+        data: JSON.stringify(that.controlParam),
+        success: (res) => {
+          if (res.code == 200) {
+            that.$message({
+              message: res.msg,
+              type: "success",
+            });
+          } else {
+            that.$message({
+              message: res.msg,
+              type: "warning",
+            });
+          }
+        },
+      });
+    },
+    controlCommandTaskComplete() {
+      let that = this;
+      $.ajax({
+        url: baseUrl + "/rgv/command/taskComplete",
+        headers: {
+          token: localStorage.getItem("token"),
+        },
+        contentType: "application/json",
+        method: "post",
+        data: JSON.stringify(that.controlParam),
+        success: (res) => {
+          if (res.code == 200) {
+            that.$message({
+              message: res.msg,
+              type: "success",
+            });
+          } else {
+            that.$message({
+              message: res.msg,
+              type: "warning",
+            });
+          }
+        },
+      });
+    },
+  },
+});
\ No newline at end of file
diff --git a/src/main/webapp/views/watch/console.html b/src/main/webapp/views/watch/console.html
index 4b83614..1108d29 100644
--- a/src/main/webapp/views/watch/console.html
+++ b/src/main/webapp/views/watch/console.html
@@ -24,7 +24,9 @@
 						<el-tab-pane label="杈撻�佺珯" name="devp">
 							<devp-card :param="devpParam"></devp-card>
 						</el-tab-pane>
-						<el-tab-pane label="RGV" name="rgv">RGV</el-tab-pane>
+						<el-tab-pane label="RGV" name="rgv">
+							<watch-rgv-card :param="rgvParam"></watch-rgv-card>
+						</el-tab-pane>
 						<el-tab-pane label="鍦板浘閰嶇疆" name="mapSetting">
 							<map-setting-card :param="mapSettingParam"></map-setting-card>
 						</el-tab-pane>
@@ -75,6 +77,7 @@
 		<script src="../../components/WatchCrnCard.js"></script>
 		<script src="../../components/DevpCard.js"></script>
 		<script src="../../components/MapSettingCard.js"></script>
+		<script src="../../components/WatchRgvCard.js"></script>
 		<script>
 			var app = new Vue({
 				el: '#app',
@@ -94,6 +97,9 @@
 					},
 					devpParam: {
 						stationId: 0
+					},
+					rgvParam: {
+						rgvNo: 0
 					}
 				},
 				created() {
@@ -150,30 +156,8 @@
 						this.activateCard = 'crn';
 					},
 					openRgv(id) {
-						this.rgvWindow = true; //鎵撳紑RGV淇℃伅寮圭獥
-						$(".detailed").empty();
-						$('.detailed').append(id + '鍙稲GV');
-						$.ajax({
-							url: baseUrl + "/console/rgv/detail",
-							headers: {
-								'token': localStorage.getItem('token')
-							},
-							data: {
-								rgvNo: id
-							},
-							method: 'post',
-							success: function(res) {
-								for (var val in res.data) {
-									var find = $("#rgvWindow").find(":input[name='" + val + "']");
-									if (find[0].type === 'text') {
-										find.val(res.data[val]);
-									} else if (find[0].type === 'checkbox') {
-										find.attr("checked", res.data[val] === 'Y');
-									}
-								}
-							}
-
-						})
+						this.rgvParam.rgvNo = id;
+						this.activateCard = 'rgv';
 					},
 					openSite(id) {
 						this.devpParam.stationId = id;
@@ -303,38 +287,13 @@
 										let trackSiteNo = rgvs[i].trackSiteNo;
 										let trackSiteEl = $("#rgvTrackSiteNo-" + trackSiteNo);
 
-										let flag = false;
-										that.rgvPosition.forEach((item) => {
-											if (item.id == rgvs[i].rgvNo) {
-												if (item.trackSiteNo != trackSiteNo) {
-													flag = true
-												}
-											}
-										})
-
-										if (flag) {
-											let finalOffset = 0;
-											let targetPosition = trackSiteEl.parent().parent().position().left;
-											let rgvPosition = rgvEl.position().left;
-											let calcResult = targetPosition - rgvPosition
-											if (calcResult > 0) {
-												finalOffset = targetPosition + trackSiteEl.width();
-											}else {
-												finalOffset = targetPosition;
-											}
-
-											rgvEl.animate({left: finalOffset + "px"}, 500);
-
-											let position = []
-											that.rgvPosition.forEach((item) => {
-												if (item.id == rgvs[i].rgvNo) {
-													item.trackSiteNo = trackSiteNo
-												}
-												position.push(item)
-											})
-											that.rgvPosition = position
-										}
-
+										let parentLeft = rgvEl.offsetParent().offset().left;
+										let targetPosition = trackSiteEl.parent().parent().offset().left - parentLeft;
+										let rgvPosition = rgvEl.position().left;
+										let zoomFactor = that.mapSettingParam.zoom ? (that.mapSettingParam.zoom / 100) : 1;
+										if (zoomFactor <= 0) { zoomFactor = 1; }
+										let finalOffset = targetPosition / zoomFactor;
+										rgvEl.animate({left: finalOffset + "px"}, 500);
 									}
 								} else if (res.code === 403) {
 									parent.location.href = baseUrl + "/login";

--
Gitblit v1.9.1