From 20429fd1425ed5a3dfdfd493b9fdb1dcf7236fd8 Mon Sep 17 00:00:00 2001
From: LSH
Date: 星期四, 28 十二月 2023 15:18:04 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/entity/BasRgv.java                     |  184 ++
 src/main/java/com/zy/core/enums/RgvModeType.java                 |   43 
 src/main/resources/mapper/BasRgvErrMapper.xml                    |   16 
 src/main/java/com/zy/asrs/service/BasRgvErrService.java          |    8 
 src/main/resources/mapper/BasRgvOptMapper.xml                    |   27 
 src/main/java/com/zy/core/enums/RouteCollectCountType.java       |   42 
 src/main/java/com/zy/asrs/service/BasRgvService.java             |    8 
 src/main/java/com/zy/asrs/domain/enums/RgvStatusType.java        |   43 
 src/main/java/com/zy/asrs/mapper/BasRgvErrMapper.java            |   12 
 src/main/webapp/static/css/rgv.css                               |  252 +++
 src/main/resources/mapper/BasRgvMapMapper.xml                    |   17 
 src/main/java/com/zy/asrs/domain/param/RgvOperatorParam.java     |   25 
 src/main/java/com/zy/core/model/RgvSlave.java                    |   60 
 src/main/webapp/views/index.html                                 |    1 
 src/main/java/com/zy/core/enums/SlaveType.java                   |    1 
 src/main/java/com/zy/core/cache/OutputQueue.java                 |    2 
 src/main/java/com/zy/core/MainProcess.java                       |   19 
 src/main/java/com/zy/asrs/entity/BasRgvMap.java                  |   85 +
 src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java           |   37 
 src/main/java/com/zy/core/model/command/RgvCommand.java          |  129 +
 src/main/java/com/zy/asrs/entity/BasRgvErr.java                  |  102 +
 src/main/java/com/zy/asrs/service/BasRgvOptService.java          |    8 
 src/main/java/com/zy/core/enums/RgvStatusType.java               |   45 
 src/main/java/com/zy/asrs/controller/RgvController.java          |  323 ++++
 src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java         |   50 
 src/main/java/com/zy/asrs/service/impl/BasRgvErrServiceImpl.java |   12 
 src/main/java/com/zy/asrs/utils/RouteUtils.java                  |  285 +++
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java      |  569 +++++++
 src/main/java/com/zy/asrs/mapper/BasRgvMapper.java               |   12 
 src/main/java/com/zy/asrs/domain/vo/RgvMsgTableVo.java           |   62 
 src/main/webapp/static/js/console.map.js                         |    2 
 src/main/webapp/views/rgv.html                                   |  581 +++++++
 src/main/java/com/zy/asrs/service/impl/BasRgvServiceImpl.java    |   12 
 src/main/java/com/zy/asrs/mapper/BasRgvMapMapper.java            |   12 
 src/main/java/com/zy/core/ServerBootstrap.java                   |   12 
 src/main/resources/mapper/WrkMastStaMapper.xml                   |   99 +
 src/main/java/com/zy/core/properties/SlaveProperties.java        |    3 
 src/main/java/com/zy/core/thread/RgvThread.java                  |  465 ++++++
 src/main/java/com/zy/asrs/entity/WrkMastSta.java                 |  176 ++
 src/main/resources/mapper/BasRgvMapper.xml                       |   24 
 src/main/java/com/zy/asrs/mapper/BasRgvOptMapper.java            |   12 
 src/main/java/com/zy/asrs/entity/BasRgvOpt.java                  |  230 +++
 src/main/java/com/zy/core/model/protocol/RgvProtocol.java        |  210 ++
 src/main/resources/application.yml                               |   59 
 src/main/java/com/zy/asrs/service/impl/BasRgvOptServiceImpl.java |   12 
 src/main/java/com/zy/core/enums/RgvTaskModeType.java             |   46 
 46 files changed, 4,424 insertions(+), 10 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..bb6cee0
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/RgvController.java
@@ -0,0 +1,323 @@
+package com.zy.asrs.controller;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.annotations.ManagerAuth;
+import com.core.common.R;
+import com.core.exception.CoolException;
+import com.zy.asrs.domain.enums.RgvStatusType;
+import com.zy.asrs.domain.param.RgvOperatorParam;
+import com.zy.asrs.domain.vo.RgvMsgTableVo;
+import com.zy.asrs.domain.vo.RgvStateTableVo;
+import com.zy.asrs.entity.BasRgv;
+import com.zy.asrs.entity.BasRgvErr;
+import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.mapper.BasRgvErrMapper;
+import com.zy.asrs.service.BasRgvService;
+import com.zy.asrs.service.LocMastService;
+import com.zy.asrs.service.WrkMastService;
+import com.zy.asrs.service.impl.MainServiceImpl;
+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.RgvTaskModeType;
+import com.zy.core.enums.SlaveType;
+import com.zy.core.model.RgvSlave;
+import com.zy.core.model.Task;
+import com.zy.core.model.command.RgvCommand;
+import com.zy.core.model.protocol.RgvProtocol;
+import com.zy.core.properties.SlaveProperties;
+import com.zy.core.thread.RgvThread;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * RGV鎺ュ彛
+ * Created by vincent on 2020-06-01
+ */
+@Slf4j
+@RestController
+@RequestMapping("/rgv")
+public class RgvController {
+
+    @Autowired
+    private SlaveProperties slaveProperties;
+    @Autowired
+    private WrkMastService wrkMastService;
+    @Autowired
+    private BasRgvErrMapper basRgvErrMapper;
+    @Autowired
+    private BasRgvService basRgvService;
+    @Autowired
+    private MainServiceImpl mainService;
+    @Autowired
+    private LocMastService locMastService;
+
+    @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());   //  RGV鍙�
+            list.add(vo);
+            // 鑾峰彇RGV淇℃伅
+            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basRgv.getRgvNo());
+            if (rgvThread == null) {
+                continue;
+            }
+            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+            if (rgvProtocol == null) {
+                continue;
+            }
+            vo.setStatusType(rgvProtocol.modeType.desc);   //  妯″紡鐘舵��
+            vo.setStatus(rgvProtocol.getStatusType().desc);     //  鐘舵��
+            vo.setWorkNo1(rgvProtocol.getTaskNo1());  //  宸ヤ綅1浠诲姟鍙�
+            vo.setStatus1(rgvProtocol.getStatusType1().desc);  // 宸ヤ綅1鐘舵��
+            vo.setLoading1(rgvProtocol.getLoaded1()==1?"鏈夌墿":"鏃犵墿");  // 宸ヤ綅1鏈夌墿
+            vo.setRgvPos(rgvProtocol.getRgvPos());
+            vo.setWalkPos(rgvProtocol.getWalkPos()==1?"涓嶅湪瀹氫綅":"鍦ㄥ畾浣�");
+            vo.setWorkNo2(rgvProtocol.getTaskNo2());  //  宸ヤ綅2浠诲姟鍙�
+            vo.setStatus2(rgvProtocol.getStatusType2().desc);  // 宸ヤ綅2鐘舵��
+            vo.setLoading2(rgvProtocol.getLoaded2()==1?"鏈夌墿":"鏃犵墿");  // 宸ヤ綅2鏈夌墿
+
+            vo.setWarnCode(String.valueOf(rgvProtocol.getAlarm()));
+            if (rgvProtocol.getAlarm() > 0) {
+                BasRgvErr rgvErr = basRgvErrMapper.selectById(rgvProtocol.getAlarm());
+                vo.setAlarm(rgvErr==null?"鏈煡寮傚父":rgvErr.getErrName());
+            }
+        }
+        return R.ok().add(list);
+    }
+
+    @PostMapping("/table/rgv/msg")
+    @ManagerAuth(memo = "RGV鏁版嵁琛�")
+    public R rgvMsgTable(){
+        List<RgvMsgTableVo> list = new ArrayList<>();
+        List<BasRgv> rgvs = basRgvService.selectList(new EntityWrapper<BasRgv>().orderBy("rgv_no"));
+        for (BasRgv basRgv : rgvs) {
+            // 琛ㄦ牸琛�
+            RgvMsgTableVo vo = new RgvMsgTableVo();
+            vo.setRgvNo(basRgv.getRgvNo());   //  RGV鍙�
+            list.add(vo);
+            // 鑾峰彇RGV淇℃伅
+            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basRgv.getRgvNo());
+            if (rgvThread == null) {
+                continue;
+            }
+            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+            if (rgvProtocol == null) {
+                continue;
+            }
+
+            vo.setWorkNo(rgvProtocol.getTaskNo1());  //  浠诲姟鍙�
+            if (rgvProtocol.getTaskNo1()>0) {
+                WrkMast wrkMast = wrkMastService.selectById(rgvProtocol.getTaskNo1());
+                if (wrkMast != null) {
+                    vo.setStatus(RgvStatusType.process(wrkMast.getIoType()).getDesc());   //  妯″紡鐘舵��
+                    vo.setSourceStaNo(wrkMast.getSourceStaNo$());    //  婧愮珯
+                    vo.setStaNo(wrkMast.getStaNo$());   //  鐩爣绔�
+                    vo.setSourceLocNo(wrkMast.getSourceLocNo());    //  婧愬簱浣�
+                    vo.setLocNo(wrkMast.getLocNo());    //  鐩爣搴撲綅
+                }
+            } else {
+                vo.setStatus(rgvProtocol.modeType.equals(RgvModeType.AUTO)? rgvProtocol.modeType.desc: RgvModeType.HAND.desc);   //  妯″紡鐘舵��
+            }
+            vo.setXspeed(rgvProtocol.getXSpeed());  //  璧拌閫熷害锛坢/min)
+            vo.setXdistance(rgvProtocol.getXDistance());  //  璧拌璺濈(Km)
+            vo.setXduration(rgvProtocol.getXDuration());    //  璧拌鏃堕暱(H)
+        }
+        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());
+    }
+
+    /****************************************************************/
+    /************************** 鎵嬪姩鎿嶄綔 ******************************/
+    /****************************************************************/
+
+    @ManagerAuth(memo = "鍙栨斁璐�")
+    @PostMapping("/operator/put")
+    public R rgvFetchPut(RgvOperatorParam param){
+        RgvCommand command = new RgvCommand();
+        command.setRgvNo(param.getRgvNo()); // RGV缂栧彿
+        command.setAckFinish1((short) 0);  // 浠诲姟瀹屾垚纭浣�
+        command.setTaskNo1((short) 0); // 宸ヤ綔鍙�
+        command.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 浠诲姟妯″紡: 鍙栨斁璐�
+        command.setSourceStaNo1(param.getSourceStaNo1()); // 婧愮珯
+        command.setDestinationStaNo1(param.getStaNo1());  // 鐩爣绔�
+        command.setAckFinish2((short) 0);  // 浠诲姟瀹屾垚纭浣�
+        command.setTaskNo2((short) 0); // 宸ヤ綔鍙�
+        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 浠诲姟妯″紡: 鍙栨斁璐�
+        command.setSourceStaNo2(param.getSourceStaNo2()); // 婧愮珯
+        command.setDestinationStaNo2(param.getStaNo2());  // 鐩爣绔�
+        command.setCommand((short) 0);
+
+        return rgvControl(command)? R.ok(): R.error();
+    }
+
+    @ManagerAuth(memo = "鍙栬揣")
+    @PostMapping("/operator/take")
+    public R rgvFetch(RgvOperatorParam param){
+        RgvCommand command = new RgvCommand();
+        command.setRgvNo(param.getRgvNo()); // RGV缂栧彿
+        command.setAckFinish1((short) 0);  // 浠诲姟瀹屾垚纭浣�
+        command.setTaskNo1((short) 0); // 宸ヤ綔鍙�
+        command.setTaskMode1(RgvTaskModeType.FETCH); // 浠诲姟妯″紡: 鍙栬揣
+        command.setSourceStaNo1(param.getSourceStaNo1()); // 婧愮珯
+        command.setDestinationStaNo1(param.getStaNo1());  // 鐩爣绔�
+        command.setAckFinish2((short) 0);  // 浠诲姟瀹屾垚纭浣�
+        command.setTaskNo2((short) 0); // 宸ヤ綔鍙�
+        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 浠诲姟妯″紡: 鍙栨斁璐�
+        command.setSourceStaNo2(param.getSourceStaNo2()); // 婧愮珯
+        command.setDestinationStaNo2(param.getStaNo2());  // 鐩爣绔�
+        command.setCommand((short) 0);
+
+        return rgvControl(command)? R.ok(): R.error();
+    }
+
+    @ManagerAuth(memo = "鏀捐揣")
+    @PostMapping("/operator/stockMove")
+    public R rgvPut(RgvOperatorParam param){
+        RgvCommand command = new RgvCommand();
+        command.setRgvNo(param.getRgvNo()); // RGV缂栧彿
+        command.setAckFinish1((short) 0);  // 浠诲姟瀹屾垚纭浣�
+        command.setTaskNo1((short) 0); // 宸ヤ綔鍙�
+        command.setTaskMode1(RgvTaskModeType.PUT); // 浠诲姟妯″紡: 鏀捐揣
+        command.setSourceStaNo1(param.getSourceStaNo1()); // 婧愮珯
+        command.setDestinationStaNo1(param.getStaNo1());  // 鐩爣绔�
+        command.setAckFinish2((short) 0);  // 浠诲姟瀹屾垚纭浣�
+        command.setTaskNo2((short) 0); // 宸ヤ綔鍙�
+        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 浠诲姟妯″紡: 鍙栨斁璐�
+        command.setSourceStaNo2(param.getSourceStaNo2()); // 婧愮珯
+        command.setDestinationStaNo2(param.getStaNo2());  // 鐩爣绔�
+        command.setCommand((short) 0);
+
+        return rgvControl(command)? R.ok(): R.error();
+    }
+
+    @ManagerAuth(memo = "浠诲姟瀹屾垚")
+    @PostMapping("/operator/taskComplete")
+    public R rgvTaskComplete(RgvOperatorParam param){
+        RgvCommand command = new RgvCommand();
+        command.setRgvNo(param.getRgvNo()); // RGV缂栧彿
+        command.setAckFinish1((short) 1);  // 浠诲姟瀹屾垚纭浣�
+        command.setTaskNo1((short) 0); // 宸ヤ綔鍙�
+        command.setTaskMode1(RgvTaskModeType.NONE); // 浠诲姟妯″紡
+        command.setSourceStaNo1((short) 0); // 婧愮珯
+        command.setDestinationStaNo1((short) 0);  // 鐩爣绔�
+        command.setAckFinish2((short) 1);  // 浠诲姟瀹屾垚纭浣�
+        command.setTaskNo2((short) 0); // 宸ヤ綔鍙�
+        command.setTaskMode2(RgvTaskModeType.NONE); // 浠诲姟妯″紡
+        command.setSourceStaNo2((short) 0); // 婧愮珯
+        command.setDestinationStaNo2((short) 0);  // 鐩爣绔�
+        command.setCommand((short) 0);
+
+        return rgvControl(command)? R.ok(): R.error();
+    }
+
+    @ManagerAuth(memo = "娓呴櫎鍛戒护")
+    @PostMapping("/operator/clearCommand")
+    public R rgvClearCommand(RgvOperatorParam param){
+        if (param.getRgvNo() == null) {
+            throw new CoolException("璇烽�夋嫨RGV鍙�");
+        }
+        RgvCommand command = new RgvCommand();
+        command.setRgvNo(param.getRgvNo()); // RGV缂栧彿
+        command.setAckFinish1((short) 0);  // 浠诲姟瀹屾垚纭浣�
+        command.setTaskNo1((short) 0); // 宸ヤ綔鍙�
+        command.setTaskMode1(RgvTaskModeType.NONE); // 浠诲姟妯″紡
+        command.setSourceStaNo1((short) 0); // 婧愮珯
+        command.setDestinationStaNo1((short) 0);  // 鐩爣绔�
+        command.setAckFinish2((short) 0);  // 浠诲姟瀹屾垚纭浣�
+        command.setTaskNo2((short) 0); // 宸ヤ綔鍙�
+        command.setTaskMode2(RgvTaskModeType.NONE); // 浠诲姟妯″紡
+        command.setSourceStaNo2((short) 0); // 婧愮珯
+        command.setDestinationStaNo2((short) 0);  // 鐩爣绔�
+        command.setCommand((short) 0);
+
+        return rgvControl(command)? R.ok(): R.error();
+    }
+
+    @ManagerAuth(memo = "鎵嬪姩澶嶄綅")
+    @PostMapping("/operator/handleReset")
+    public R handleReset(RgvOperatorParam param) throws Exception {
+        if (param.getRgvNo() == null) {
+            throw new CoolException("璇烽�夋嫨RGV");
+        }
+        // 鑾峰彇RGV缂撳瓨
+        for (RgvSlave rgv : slaveProperties.getRgv()) {
+            // 鑾峰彇RGV淇℃伅
+            if (param.getRgvNo().equals(rgv.getId())) {
+                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
+                if (rgvThread == null) {
+                    throw new CoolException("RGV涓嶅湪绾�");
+                }
+                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+                if (rgvProtocol == null) {
+                    throw new CoolException("RGV涓嶅湪绾�");
+                }
+                RgvCommand Command = new RgvCommand();
+                Command.setRgvNo(rgv.getId()); // RGV缂栧彿
+                Command.setTaskMode1(RgvTaskModeType.NONE);
+                Command.setAckFinish1((short) 0);  // 浠诲姟瀹屾垚纭浣�
+                Command.setAckFinish2((short) 0);  // 浠诲姟瀹屾垚纭浣�
+                Command.setCommand((short) 0);  // 浠诲姟瀹屾垚纭浣�
+                // 寤舵椂鍙戦��
+                Thread.sleep(1000L);
+                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(2, Command))) {
+                    return R.ok();
+                } else {
+                    throw new CoolException("鍛戒护涓嬪彂澶辫触");
+                }
+
+            }
+        }
+        return R.error();
+    }
+
+    private boolean rgvControl(RgvCommand command){
+        if (command.getRgvNo() == null) {
+            throw new CoolException("璇烽�夋嫨RGV");
+        }
+        for (RgvSlave rgv : slaveProperties.getRgv()) {
+            // 鑾峰彇RGV淇℃伅
+            if (command.getRgvNo().equals(rgv.getId())) {
+                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
+                if (rgvThread == null) {
+                    throw new CoolException("RGV涓嶅湪绾�");
+                }
+                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+                if (rgvProtocol == null) {
+                    throw new CoolException("RGV涓嶅湪绾�");
+                }
+                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(2, command))) {
+                    return true;
+                } else {
+                    throw new CoolException("鍛戒护涓嬪彂澶辫触");
+                }
+            }
+        }
+        return false;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/asrs/domain/enums/RgvStatusType.java b/src/main/java/com/zy/asrs/domain/enums/RgvStatusType.java
new file mode 100644
index 0000000..ee4e2ce
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/enums/RgvStatusType.java
@@ -0,0 +1,43 @@
+package com.zy.asrs.domain.enums;
+
+/**
+ * RGV鐘舵�佹灇涓�
+ */
+public enum RgvStatusType {
+
+    // 鍏ュ簱
+    MACHINE_PAKIN("鍏ュ簱"),
+    // 鍑哄簱
+    MACHINE_PAKOUT("鍑哄簱"),
+    // 寮傚父
+    MACHINE_ERROR("寮傚父"),
+    // 鑷姩
+    MACHINE_AUTO("鑷姩"),
+    // 闈炶嚜鍔�/鎵嬪姩
+    MACHINE_UN_AUTO("闈炶嚜鍔�"),
+    ;
+
+    private String desc;
+    RgvStatusType(String desc){
+        this.desc = desc;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+    public static RgvStatusType process(Integer ioType){
+        if (ioType>100) {
+            return MACHINE_PAKOUT;
+        } else if (ioType < 100 && ioType!=3 && ioType!=6 && ioType!=11) {
+            return MACHINE_PAKIN;
+        } else {
+            return MACHINE_ERROR;
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/param/RgvOperatorParam.java b/src/main/java/com/zy/asrs/domain/param/RgvOperatorParam.java
new file mode 100644
index 0000000..3b0881f
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/param/RgvOperatorParam.java
@@ -0,0 +1,25 @@
+package com.zy.asrs.domain.param;
+
+import lombok.Data;
+
+/**
+ * Created by vincent on 2020-06-02
+ */
+@Data
+public class RgvOperatorParam {
+
+    // RGV鍙�
+    private Integer rgvNo;
+
+    // 宸ヤ綅1婧愮珯
+    private Short sourceStaNo1;
+
+    // 宸ヤ綅1鐩爣绔�
+    private Short staNo1;
+
+    // 宸ヤ綅2婧愮珯
+    private Short sourceStaNo2;
+
+    // 宸ヤ綅2鐩爣绔�
+    private Short staNo2;
+}
diff --git a/src/main/java/com/zy/asrs/domain/vo/RgvMsgTableVo.java b/src/main/java/com/zy/asrs/domain/vo/RgvMsgTableVo.java
new file mode 100644
index 0000000..10191ba
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/vo/RgvMsgTableVo.java
@@ -0,0 +1,62 @@
+package com.zy.asrs.domain.vo;
+
+import com.zy.asrs.utils.Utils;
+import lombok.Data;
+
+/**
+ * Created by vincent on 2020-06-02
+ */
+@Data
+public class RgvMsgTableVo {
+
+        // RGV鍙�
+    private Integer rgvNo;
+
+    // 宸ヤ綔鍙�
+    private Short workNo = 0;
+
+    // 鐘舵��
+    private String status = "-";
+
+    // 婧愮珯
+    private String sourceStaNo = "-";
+
+    // 鐩爣绔�
+    private String staNo = "-";
+
+    // 婧愬簱浣�
+    private String sourceLocNo = "-";
+
+    // 鐩爣搴撲綅
+    private String locNo = "-";
+
+    // 寮傚父
+    private String error = "";
+
+    // 鍘熺偣
+    private String origin = "";
+
+    // 鍛戒护
+    private String command = "";
+
+    // 璧拌閫熷害锛坢/min)
+    private Float xspeed = 0.0F;
+
+    // 璧拌璺濈(Km)
+    private Float xdistance = 0.0F;
+
+    // 璧拌鏃堕暱(H)
+    private Float xduration = 0.0F;
+
+    public void setXspeed(Float xspeed) {
+        this.xspeed = Utils.scale(xspeed);
+    }
+
+    public void setXdistance(Float xdistance) {
+        this.xdistance = Utils.scale(xdistance);
+    }
+
+    public void setXduration(Float xduration) {
+        this.xduration = Utils.scale(xduration);
+    }
+}
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..6329714
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java
@@ -0,0 +1,50 @@
+package com.zy.asrs.domain.vo;
+
+import lombok.Data;
+
+/**
+ * Created by vincent on 2020-06-02
+ */
+@Data
+public class RgvStateTableVo {
+
+    // RGV鍙�
+    private Integer RgvNo;
+
+    // 妯″紡
+    private String statusType = "-";
+
+    // 鐘舵��
+    private String status = "-";
+
+    // 浠诲姟鍙�
+    private Short workNo1 = 0;
+
+    // 鐘舵��
+    private String status1 = "-";
+
+    // 鏈夌墿
+    private String loading1 = "-";
+
+    // RGV浣嶇疆
+    private Short RgvPos = 0;
+
+    // 璧拌瀹氫綅
+    private String walkPos = "-";
+
+    // 浠诲姟鍙�
+    private Short workNo2 = 0;
+
+    // 鐘舵��
+    private String status2 = "-";
+
+    // 鏈夌墿
+    private String loading2 = "-";
+
+    //寮傚父
+    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
new file mode 100644
index 0000000..6cbfd58
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/BasRgv.java
@@ -0,0 +1,184 @@
+package com.zy.asrs.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.core.common.Cools;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Data
+@TableName("asr_bas_rgv")
+public class BasRgv implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * RGV缂栧彿
+     */
+    @ApiModelProperty(value= "RGV缂栧彿")
+    @TableId(value = "rgv_no", type = IdType.INPUT)
+    @TableField("rgv_no")
+    private Integer rgvNo;
+
+    /**
+     * 鍙叆
+     */
+    @ApiModelProperty(value= "鍙叆")
+    @TableField("in_enable")
+    private String inEnable;
+
+    /**
+     * 鍙嚭
+     */
+    @ApiModelProperty(value= "鍙嚭")
+    @TableField("out_enable")
+    private String outEnable;
+
+    /**
+     * 浣滀笟鎬�
+     */
+    @ApiModelProperty(value= "浣滀笟鎬�")
+    @TableField("rgv_sts")
+    private Integer rgvSts;
+
+    /**
+     * 浠诲姟鍙�
+     */
+    @ApiModelProperty(value= "浠诲姟鍙�")
+    @TableField("wrk_no1")
+    private Integer wrkNo1;
+
+    /**
+     * 鍫嗗灈鏈哄彿
+     */
+    @ApiModelProperty(value= "鍫嗗灈鏈哄彿")
+    @TableField("wrk_no2")
+    private Integer wrkNo2;
+
+    /**
+     * 閿欒鐮�
+     */
+    @ApiModelProperty(value= "閿欒鐮�")
+    @TableField("rgv_err")
+    private Long rgvErr;
+
+    /**
+     * 鏍囪
+     */
+    @ApiModelProperty(value= "鏍囪")
+    @TableField("pak_mk")
+    private String pakMk;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 绂佺敤  
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 绂佺敤  ")
+    private Integer status;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    @TableField("create_by")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @TableField("create_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("update_by")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("update_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public BasRgv() {}
+
+    public BasRgv(Integer rgvNo, String inEnable, String outEnable, Integer rgvSts, Integer wrkNo1, Integer wrkNo2, Long rgvErr, String pakMk, Integer status, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo) {
+        this.rgvNo = rgvNo;
+        this.inEnable = inEnable;
+        this.outEnable = outEnable;
+        this.rgvSts = rgvSts;
+        this.wrkNo1 = wrkNo1;
+        this.wrkNo2 = wrkNo2;
+        this.rgvErr = rgvErr;
+        this.pakMk = pakMk;
+        this.status = status;
+        this.createBy = createBy;
+        this.createTime = createTime;
+        this.updateBy = updateBy;
+        this.updateTime = updateTime;
+        this.memo = memo;
+    }
+
+//    BasRgv basRgv = new BasRgv(
+//            null,    // RGV缂栧彿[闈炵┖]
+//            null,    // 鍙叆
+//            null,    // 鍙嚭
+//            null,    // 浣滀笟鎬�
+//            null,    // 浠诲姟鍙�
+//            null,    // 鍫嗗灈鏈哄彿
+//            null,    // 閿欒鐮�
+//            null,    // 鏍囪
+//            null,    // 鐘舵��
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 娣诲姞鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null    // 澶囨敞
+//    );
+
+    public String getStatus$(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return "姝e父";
+            case 0:
+                return "绂佺敤";
+            default:
+                return String.valueOf(this.status);
+        }
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/BasRgvErr.java b/src/main/java/com/zy/asrs/entity/BasRgvErr.java
new file mode 100644
index 0000000..a6ebd2b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/BasRgvErr.java
@@ -0,0 +1,102 @@
+package com.zy.asrs.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.core.common.Cools;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Data
+@TableName("asr_bas_rgv_err")
+public class BasRgvErr implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 寮傚父鐮�
+     */
+    @ApiModelProperty(value= "寮傚父鐮�")
+    @TableId(value = "error_code", type = IdType.INPUT)
+    @TableField("error_code")
+    private Long errorCode;
+
+    /**
+     * 寮傚父
+     */
+    @ApiModelProperty(value= "寮傚父")
+    @TableField("err_name")
+    private String errName;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("modi_user")
+    private Long modiUser;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("modi_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date modiTime;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    @TableField("appe_user")
+    private Long appeUser;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @TableField("appe_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date appeTime;
+
+    public BasRgvErr() {}
+
+    public BasRgvErr(Long errorCode, String errName, Long modiUser, Date modiTime, Long appeUser, Date appeTime) {
+        this.errorCode = errorCode;
+        this.errName = errName;
+        this.modiUser = modiUser;
+        this.modiTime = modiTime;
+        this.appeUser = appeUser;
+        this.appeTime = appeTime;
+    }
+
+//    BasRgvErr basRgvErr = new BasRgvErr(
+//            null,    // 寮傚父鐮乕闈炵┖]
+//            null,    // 寮傚父
+//            null,    // 淇敼浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null,    // 娣诲姞浜哄憳
+//            null    // 娣诲姞鏃堕棿
+//    );
+
+    public String getModiTime$(){
+        if (Cools.isEmpty(this.modiTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.modiTime);
+    }
+
+    public String getAppeTime$(){
+        if (Cools.isEmpty(this.appeTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appeTime);
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/BasRgvMap.java b/src/main/java/com/zy/asrs/entity/BasRgvMap.java
new file mode 100644
index 0000000..190dec9
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/BasRgvMap.java
@@ -0,0 +1,85 @@
+package com.zy.asrs.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@TableName("asr_bas_rgv_map")
+public class BasRgvMap implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * RGV缂栧彿
+     */
+    @ApiModelProperty(value= "RGV缂栧彿")
+    @TableId(value = "rgv_no", type = IdType.INPUT)
+    @TableField("rgv_no")
+    private Integer rgvNo;
+
+    /**
+     * 寮�濮嬭寖鍥�
+     */
+    @ApiModelProperty(value= "寮�濮嬭寖鍥�")
+    @TableField("start_route")
+    private Integer startRoute;
+
+    /**
+     * 缁撴潫鑼冨洿
+     */
+    @ApiModelProperty(value= "缁撴潫鑼冨洿")
+    @TableField("end_route")
+    private Integer endRoute;
+
+    /**
+     * 褰撳墠浣嶇疆
+     */
+    @ApiModelProperty(value= "褰撳墠浣嶇疆")
+    @TableField("now_route")
+    private Integer nowRoute;
+
+    /**
+     * 鐘舵��
+     */
+    @ApiModelProperty(value= "鐘舵��")
+    @TableField("rgv_status")
+    private Integer rgvStatus;
+
+    /**
+     * 閿�-寮�濮�-浣嶇疆
+     */
+    @ApiModelProperty(value= "閿�-寮�濮�-浣嶇疆")
+    @TableField("lock_start_route")
+    private Integer lockStartRoute;
+
+    /**
+     * 閿�-缁撴潫-浣嶇疆
+     */
+    @ApiModelProperty(value= "閿�-缁撴潫-浣嶇疆")
+    @TableField("lock_end_route")
+    private Integer lockEndRoute;
+
+    public BasRgvMap() {}
+
+    public BasRgvMap(Integer rgvNo, Integer startRoute, Integer endRoute, Integer nowRoute, Integer rgvStatus, Integer lockStartRoute, Integer lockEndRoute) {
+        this.rgvNo = rgvNo;
+        this.startRoute = startRoute;
+        this.endRoute = endRoute;
+        this.nowRoute = nowRoute;
+        this.rgvStatus = rgvStatus;
+        this.lockStartRoute = lockStartRoute;
+        this.lockEndRoute = lockEndRoute;
+    }
+
+    public Integer getRgvNoOther(){
+        return 3-this.rgvNo;
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/BasRgvOpt.java b/src/main/java/com/zy/asrs/entity/BasRgvOpt.java
new file mode 100644
index 0000000..6c257a2
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/BasRgvOpt.java
@@ -0,0 +1,230 @@
+package com.zy.asrs.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.core.common.Cools;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Data
+@TableName("asr_bas_rgv_opt")
+public class BasRgvOpt implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    /**
+     * 浠诲姟鍙�1
+     */
+    @ApiModelProperty(value= "浠诲姟鍙�1")
+    @TableField("wrk_no1")
+    private Integer wrkNo1;
+
+    /**
+     * 浠诲姟鍙�2
+     */
+    @ApiModelProperty(value= "浠诲姟鍙�2")
+    @TableField("wrk_no2")
+    private Integer wrkNo2;
+
+    /**
+     * 绌挎杞�
+     */
+    @ApiModelProperty(value= "绌挎杞�")
+    @TableField("rgv_no")
+    private Integer rgvNo;
+
+    /**
+     * 涓嬪彂鏃堕棿
+     */
+    @ApiModelProperty(value= "涓嬪彂鏃堕棿")
+    @TableField("send_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date sendTime;
+
+    /**
+     * 浣滀笟
+     */
+    @ApiModelProperty(value= "浣滀笟")
+    private String mode;
+
+    /**
+     * 婧愭帓
+     */
+    @ApiModelProperty(value= "婧愭帓")
+    @TableField("source_row")
+    private Integer sourceRow;
+
+    /**
+     * 婧愬垪
+     */
+    @ApiModelProperty(value= "婧愬垪")
+    @TableField("source_bay")
+    private Integer sourceBay;
+
+    /**
+     * 婧愬眰
+     */
+    @ApiModelProperty(value= "婧愬眰")
+    @TableField("source_lev")
+    private Integer sourceLev;
+
+    /**
+     * 婧愮珯
+     */
+    @ApiModelProperty(value= "婧愮珯")
+    @TableField("source_sta")
+    private Integer sourceSta;
+
+    /**
+     * 鐩爣鎺�
+     */
+    @ApiModelProperty(value= "鐩爣鎺�")
+    @TableField("pos_row")
+    private Integer posRow;
+
+    /**
+     * 鐩爣鍒�
+     */
+    @ApiModelProperty(value= "鐩爣鍒�")
+    @TableField("pos_bay")
+    private Integer posBay;
+
+    /**
+     * 鐩爣灞�
+     */
+    @ApiModelProperty(value= "鐩爣灞�")
+    @TableField("pos_lev")
+    private Integer posLev;
+
+    /**
+     * 鐩爣绔�
+     */
+    @ApiModelProperty(value= "鐩爣绔�")
+    @TableField("pos_sta")
+    private Integer posSta;
+
+    /**
+     * 鍝嶅簲缁撴灉 1: 姝e父  0: 澶辫触  
+     */
+    @ApiModelProperty(value= "鍝嶅簲缁撴灉 1: 姝e父  0: 澶辫触  ")
+    private Integer response;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("update_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("update_by")
+    private Long updateBy;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public BasRgvOpt() {}
+
+    public BasRgvOpt(Integer wrkNo1, Integer wrkNo2, Integer rgvNo, Date sendTime, String mode, Integer sourceRow, Integer sourceBay, Integer sourceLev, Integer sourceSta, Integer posRow, Integer posBay, Integer posLev, Integer posSta, Integer response, Date updateTime, Long updateBy, String memo) {
+        this.wrkNo1 = wrkNo1;
+        this.wrkNo2 = wrkNo2;
+        this.rgvNo = rgvNo;
+        this.sendTime = sendTime;
+        this.mode = mode;
+        this.sourceRow = sourceRow;
+        this.sourceBay = sourceBay;
+        this.sourceLev = sourceLev;
+        this.sourceSta = sourceSta;
+        this.posRow = posRow;
+        this.posBay = posBay;
+        this.posLev = posLev;
+        this.posSta = posSta;
+        this.response = response;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+        this.memo = memo;
+    }
+
+    public BasRgvOpt(Integer wrkNo1, Integer wrkNo2, Integer rgvNo, Date sendTime, String mode, Integer sourceSta, Integer posSta, Integer sourceRow, Integer posRow, Integer response, Date updateTime, Long updateBy) {
+        this.wrkNo1 = wrkNo1;
+        this.wrkNo2 = wrkNo2;
+        this.rgvNo = rgvNo;
+        this.sendTime = sendTime;
+        this.mode = mode;
+        this.sourceSta = sourceSta;
+        this.posSta = posSta;
+        this.sourceRow = sourceRow;
+        this.posRow = posRow;
+        this.response = response;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+    }
+
+//    BasRgvOpt basRgvOpt = new BasRgvOpt(
+//            null,    // ID[闈炵┖]
+//            null,    // 浠诲姟鍙�
+//            null,    // 绌挎杞�
+//            null,    // 涓嬪彂鏃堕棿
+//            null,    // 浣滀笟
+//            null,    // 婧愭帓
+//            null,    // 婧愬垪
+//            null,    // 婧愬眰
+//            null,    // 婧愮珯
+//            null,    // 鐩爣鎺�
+//            null,    // 鐩爣鍒�
+//            null,    // 鐩爣灞�
+//            null,    // 鐩爣绔�
+//            null,    // 鍝嶅簲缁撴灉
+//            null,    // 淇敼鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null    // 澶囨敞
+//    );
+
+    public String getSendTime$(){
+        if (Cools.isEmpty(this.sendTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.sendTime);
+    }
+
+    public String getResponse$(){
+        if (null == this.response){ return null; }
+        switch (this.response){
+            case 1:
+                return "姝e父";
+            case 0:
+                return "澶辫触";
+            default:
+                return String.valueOf(this.response);
+        }
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/WrkMastSta.java b/src/main/java/com/zy/asrs/entity/WrkMastSta.java
new file mode 100644
index 0000000..f3a2b96
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/WrkMastSta.java
@@ -0,0 +1,176 @@
+package com.zy.asrs.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.core.common.Cools;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Data
+@TableName("asr_wrk_mast_sta")
+public class WrkMastSta implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 宸ヤ綔鍙�
+     */
+    @ApiModelProperty(value= "宸ヤ綔鍙�")
+    @TableField("wrk_no")
+    private Long wrkNo;
+
+    /**
+     * 宸ヤ綔妗e紑濮嬩綅缃�
+     */
+    @ApiModelProperty(value= "宸ヤ綔妗e紑濮嬩綅缃�")
+    @TableField("wrk_start")
+    private Integer wrkStart;
+
+    /**
+     * 宸ヤ綔妗g粨鏉熶綅缃�
+     */
+    @ApiModelProperty(value= "宸ヤ綔妗g粨鏉熶綅缃�")
+    @TableField("wrk_end")
+    private Integer wrkEnd;
+
+    /**
+     * 灏忚溅鎺ヨ揣浣嶇疆
+     */
+    @ApiModelProperty(value= "灏忚溅鎺ヨ揣浣嶇疆")
+    @TableField("sta_start")
+    private Integer staStart;
+
+    /**
+     * 灏忚溅鏀捐揣浣嶇疆
+     */
+    @ApiModelProperty(value= "灏忚溅鏀捐揣浣嶇疆")
+    @TableField("sta_end")
+    private Integer staEnd;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @TableField("create_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("update_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 绫诲瀷 0:闈炵┖  1:绌烘澘
+     */
+    @ApiModelProperty(value= "绫诲瀷 1:婊$増  2:绌烘澘")
+    private Integer type;
+
+    /**
+     * 宸ヤ綔鐘舵�� 0锛氬垵濮� 1锛氱瓑寰呭皬杞﹀彇 2锛氱瓑寰呭皬杞︽斁 3锛氬畬鎴�
+     */
+    @ApiModelProperty(value= "宸ヤ綔鐘舵�� 0锛氬垵濮� 1锛氱瓑寰呭皬杞﹀彇 2锛氱瓑寰呭皬杞︽斁 3锛氬畬鎴�")
+    @TableField("wrk_sts")
+    private Integer wrkSts;
+
+    /**
+     * 琛屽彿
+     */
+    @ApiModelProperty(value= "琛屽彿")
+    @TableField("line_number")
+    private Integer lineNumber;
+
+    /**
+     * 宸ヤ綔绫诲瀷
+     */
+    @ApiModelProperty(value= "宸ヤ綔绫诲瀷  1:鍙栵紙鍙犵洏锛�  2锛氭斁 3锛氬彇鏀� 4锛氭媶鐩�")
+    @TableField("wrk_type")
+    private Integer wrkType;
+
+    /**
+     * 宸ヤ綔绫诲瀷
+     */
+    @ApiModelProperty(value= "宸ヤ綔绫诲瀷")
+    @TableField("wrk_crn")
+    private Integer wrkCrn;
+
+    /**
+     * 鏍囪鏃堕棿
+     */
+    @ApiModelProperty(value= "鏍囪鏃堕棿")
+    @TableField("bign_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date bignTime;
+
+    public WrkMastSta() {}
+
+    public WrkMastSta(Long wrkNo, Integer wrkStart, Integer wrkEnd, Integer staStart, Integer staEnd, Date createTime, Date updateTime, Integer type, Integer wrkSts, Integer lineNumber, Integer wrkType, Date bignTime) {
+        this.wrkNo = wrkNo;
+        this.wrkStart = wrkStart;
+        this.wrkEnd = wrkEnd;
+        this.staStart = staStart;
+        this.staEnd = staEnd;
+        this.createTime = createTime;
+        this.updateTime = updateTime;
+        this.type = type;
+        this.wrkSts = wrkSts;
+        this.lineNumber = lineNumber;
+        this.wrkType = wrkType;
+        this.bignTime = bignTime;
+    }
+
+//    WrkMastSta wrkMastSta = new WrkMastSta(
+//            null,    // 宸ヤ綔鍙穂闈炵┖]
+//            null,    // 宸ヤ綔妗e紑濮嬩綅缃甗闈炵┖]
+//            null,    // 宸ヤ綔妗g粨鏉熶綅缃甗闈炵┖]
+//            null,    // 灏忚溅鎺ヨ揣浣嶇疆[闈炵┖]
+//            null,    // 灏忚溅鏀捐揣浣嶇疆[闈炵┖]
+//            null,    // 娣诲姞鏃堕棿
+//            null,    // 淇敼鏃堕棿
+//            null,    // 绫诲瀷 0:闈炵┖  1:绌烘澘[闈炵┖]
+//            null,    // 宸ヤ綔鐘舵�� 0锛氬垵濮� 1锛氱瓑寰呭皬杞﹀彇 2锛氱瓑寰呭皬杞︽斁 3锛氬畬鎴怺闈炵┖]
+//            null,    // 琛屽彿[闈炵┖]
+//            null,    // 宸ヤ綔绫诲瀷[闈炵┖]
+//            null    // 鏍囪鏃堕棿
+//    );
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+    public String getBignTime$(){
+        if (Cools.isEmpty(this.bignTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.bignTime);
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/BasRgvErrMapper.java b/src/main/java/com/zy/asrs/mapper/BasRgvErrMapper.java
new file mode 100644
index 0000000..b21d5af
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/BasRgvErrMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.BasRgvErr;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BasRgvErrMapper extends BaseMapper<BasRgvErr> {
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/BasRgvMapMapper.java b/src/main/java/com/zy/asrs/mapper/BasRgvMapMapper.java
new file mode 100644
index 0000000..9f6ffa2
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/BasRgvMapMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.BasRgvMap;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BasRgvMapMapper extends BaseMapper<BasRgvMap> {
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/BasRgvMapper.java b/src/main/java/com/zy/asrs/mapper/BasRgvMapper.java
new file mode 100644
index 0000000..b426ee2
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/BasRgvMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.BasRgv;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BasRgvMapper extends BaseMapper<BasRgv> {
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/BasRgvOptMapper.java b/src/main/java/com/zy/asrs/mapper/BasRgvOptMapper.java
new file mode 100644
index 0000000..97fbeb1
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/BasRgvOptMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.BasRgvOpt;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BasRgvOptMapper extends BaseMapper<BasRgvOpt> {
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java b/src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java
new file mode 100644
index 0000000..da34693
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java
@@ -0,0 +1,37 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.WrkMastSta;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface WrkMastStaMapper extends BaseMapper<WrkMastSta> {
+
+    /*
+    * 鑾峰彇鎵�鏈変换鍔℃暟閲�
+    * */
+    Integer selectAllWrkCount(@Param("type")Integer type);
+    Integer selectAllWrkStsCount(@Param("type")Integer type,@Param("wrkSts")Integer wrkSts);
+
+    /*
+    * 鑾峰彇鎵�鏈夊彲鎵ц浠诲姟
+    * */
+    List<WrkMastSta> selectAllWrkMastStaList(@Param("type")Integer type);
+
+    /*
+    * 鏌ヨ鎸囧畾宸ヤ綔鍙蜂换鍔�
+    * */
+    WrkMastSta selectByWrkNo(@Param("workNo") Integer workNo);
+
+    /*
+    * 鏌ヨ涓嶅共娑夌殑鍙墽琛屼换鍔�
+    * */
+    WrkMastSta selectNoInterfere(@Param("staStarts") List<Integer> staStarts, @Param("staEnds") List<Integer> staEnds);
+    List<WrkMastSta> selectNoInterfereList(@Param("staStarts") List<Integer> staStarts, @Param("staEnds") List<Integer> staEnds);
+
+}
diff --git a/src/main/java/com/zy/asrs/service/BasRgvErrService.java b/src/main/java/com/zy/asrs/service/BasRgvErrService.java
new file mode 100644
index 0000000..a434c73
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/BasRgvErrService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.asrs.entity.BasRgvErr;
+
+public interface BasRgvErrService extends IService<BasRgvErr> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/BasRgvOptService.java b/src/main/java/com/zy/asrs/service/BasRgvOptService.java
new file mode 100644
index 0000000..29dd8eb
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/BasRgvOptService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.asrs.entity.BasRgvOpt;
+
+public interface BasRgvOptService extends IService<BasRgvOpt> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/BasRgvService.java b/src/main/java/com/zy/asrs/service/BasRgvService.java
new file mode 100644
index 0000000..29dac13
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/BasRgvService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.asrs.entity.BasRgv;
+
+public interface BasRgvService extends IService<BasRgv> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/BasRgvErrServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasRgvErrServiceImpl.java
new file mode 100644
index 0000000..bd4b40d
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/BasRgvErrServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.zy.asrs.entity.BasRgvErr;
+import com.zy.asrs.mapper.BasRgvErrMapper;
+import com.zy.asrs.service.BasRgvErrService;
+import org.springframework.stereotype.Service;
+
+@Service("basRgvErrService")
+public class BasRgvErrServiceImpl extends ServiceImpl<BasRgvErrMapper, BasRgvErr> implements BasRgvErrService {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/BasRgvOptServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasRgvOptServiceImpl.java
new file mode 100644
index 0000000..fb27c6c
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/BasRgvOptServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.zy.asrs.entity.BasRgvOpt;
+import com.zy.asrs.mapper.BasRgvOptMapper;
+import com.zy.asrs.service.BasRgvOptService;
+import org.springframework.stereotype.Service;
+
+@Service("basRgvOptService")
+public class BasRgvOptServiceImpl extends ServiceImpl<BasRgvOptMapper, BasRgvOpt> implements BasRgvOptService {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/BasRgvServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasRgvServiceImpl.java
new file mode 100644
index 0000000..0fbdc7c
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/BasRgvServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.zy.asrs.entity.BasRgv;
+import com.zy.asrs.mapper.BasRgvMapper;
+import com.zy.asrs.service.BasRgvService;
+import org.springframework.stereotype.Service;
+
+@Service("basRgvService")
+public class BasRgvServiceImpl extends ServiceImpl<BasRgvMapper, BasRgv> implements BasRgvService {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index a60bbd1..45fc16e 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -8,10 +8,9 @@
 import com.core.common.DateUtils;
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.*;
-import com.zy.asrs.mapper.BasCrnErrorMapper;
-import com.zy.asrs.mapper.WaitPakinMapper;
-import com.zy.asrs.mapper.WrkMastMapper;
+import com.zy.asrs.mapper.*;
 import com.zy.asrs.service.*;
+import com.zy.asrs.utils.RouteUtils;
 import com.zy.asrs.utils.Utils;
 import com.zy.asrs.utils.VersionUtils;
 import com.zy.common.model.LocTypeDto;
@@ -27,17 +26,17 @@
 import com.zy.core.cache.MessageQueue;
 import com.zy.core.cache.SlaveConnection;
 import com.zy.core.enums.*;
-import com.zy.core.model.CrnSlave;
-import com.zy.core.model.DevpSlave;
-import com.zy.core.model.LedSlave;
-import com.zy.core.model.Task;
+import com.zy.core.model.*;
 import com.zy.core.model.command.CrnCommand;
 import com.zy.core.model.command.LedCommand;
+import com.zy.core.model.command.RgvCommand;
 import com.zy.core.model.protocol.CrnProtocol;
+import com.zy.core.model.protocol.RgvProtocol;
 import com.zy.core.model.protocol.StaProtocol;
 import com.zy.core.properties.SlaveProperties;
 import com.zy.core.thread.BarcodeThread;
 import com.zy.core.thread.LedThread;
+import com.zy.core.thread.RgvThread;
 import com.zy.core.thread.SiemensDevpThread;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -87,6 +86,12 @@
     private BasErrLogService basErrLogService;
     @Autowired
     private BasCrnErrorMapper basCrnErrorMapper;
+    @Autowired
+    private WrkMastStaMapper wrkMastStaMapper;
+    @Autowired
+    private BasRgvService basRgvService;
+    @Autowired
+    private BasRgvMapMapper basRgvMapMapper;
 
     @Value("${wms.url}")
     private String wmsUrl;
@@ -2126,4 +2131,554 @@
             }
         }
     }
+
+    /*
+     * 灏忚溅鍦板浘鏇存柊  鏇存柊閿�
+     * */
+    public synchronized boolean rgvMapUpdate(BasRgvMap basRgvMapCurrent,Integer staStart,Integer staEnd){
+
+//        List<Integer> integers = RouteUtils.RouteMapCurrentFar(basRgvMapCurrent.getNowRoute(),staStart,staEnd, basRgvMapCurrent.getLockStartRoute());
+        //鏇存柊褰撳墠灏忚溅閿�
+        try{
+            Integer farCurrentStaNo = RouteUtils.RouteIndexFarMas(basRgvMapCurrent.getNowRoute(), staStart, staEnd, basRgvMapCurrent.getLockStartRoute());//鑾峰彇鏈�杩滅珯鐐�
+            Integer fallMerge = RouteUtils.RouteIndexFarMas(basRgvMapCurrent.getRgvNo(), farCurrentStaNo); //鑾峰彇鍚堝苟骞叉秹椤�
+            basRgvMapCurrent.setLockEndRoute(fallMerge);
+            basRgvMapMapper.updateById(basRgvMapCurrent);
+
+            //鏇存柊鍙︿竴鍙板皬杞﹀湴鍥�
+            Integer rgvNoOther = basRgvMapCurrent.getRgvNoOther();
+            BasRgvMap basRgvMapOther = basRgvMapMapper.selectById(rgvNoOther);
+            List<Integer> integers = RouteUtils.RouteMapCurrentFar(fallMerge, basRgvMapCurrent.getLockStartRoute());
+            Integer lockEndRoute = RouteUtils.RouteMapOtherFarStnNo(integers, basRgvMapCurrent.getLockStartRoute());//鍙︿竴鍙板皬杞﹀彲娲诲姩鏈�杩滀綅缃�
+            basRgvMapOther.setStartRoute(lockEndRoute);
+            basRgvMapMapper.updateById(basRgvMapOther);
+            return true;
+        }catch (Exception e){
+            log.error("灏忚溅鍦板浘鏇存柊鍑洪敊锛�");
+            return false;
+        }
+    }
+
+    /*
+     * 鍒锋柊鍦板浘鏁版嵁
+     * */
+    public synchronized void refreshRgvMap() {
+        try{
+            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
+                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
+                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+                if (rgvProtocol == null) {
+                    continue;
+                }
+                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
+                if (basRgv == null) {
+                    log.error("{}鍙稲GV灏氭湭鍦ㄦ暟鎹簱杩涜缁存姢锛�", rgvSlave.getId());
+                    continue;
+                }
+
+                // 鍙湁褰揜GV绌洪棽銆佽嚜鍔�,宸ヤ綅涓�鏃犵墿//rgv鍙敤
+                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
+                        && rgvProtocol.getModeType() == RgvModeType.AUTO
+                        && rgvProtocol.getLoaded1()==0  //鐜板満淇敼锛氬彔鐩樻満锛屼笉婊¢兘绠楁棤鐗╋紝鎬庝箞鍒ゆ柇闇�瑕佽窡鐢垫帶瀵规帴
+                        && (rgvProtocol.getTaskNo1()==0 || rgvProtocol.getTaskNo1()==9999)
+                        && (rgvProtocol.getTaskNo2()==0 || rgvProtocol.getTaskNo2()==9999)
+                ) {
+                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
+                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
+                    rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
+                }
+            }
+        }catch (Exception e){
+            log.error("4109琛屾墽琛屽皬杞﹀垵濮嬪寲浠诲姟涓嬪彂澶辫触");
+            log.error("4109琛�"+e);
+        }
+    }
+
+
+    /**
+     *  瀹屾垚灏忚溅浠诲姟
+     */
+    public synchronized void rgvCompleteWrkMastSta() {
+        try{
+            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
+                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
+                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+                if (rgvProtocol == null) {
+                    continue;
+                }
+                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
+                if (basRgv == null) {
+                    log.error("{}鍙稲GV灏氭湭鍦ㄦ暟鎹簱杩涜缁存姢锛�", rgvSlave.getId());
+                    continue;
+                }
+
+                // 鍙湁褰揜GV绛夊緟WCS纭銆佽嚜鍔�
+                if (rgvProtocol.getStatusType() == RgvStatusType.WAITING
+                        && rgvProtocol.getModeType() == RgvModeType.AUTO
+                ) {
+                    log.info("{}鍙峰皬杞︾瓑寰厀cs纭锛岀姸鎬亄}锛屽弬鏁皗}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol);
+                    if (rgvProtocol.getTaskNo1()!=0){
+                        if (rgvProtocol.getTaskNo1()==9999){
+                            boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
+                            if (!rgvComplete){
+                                log.error("灏忚溅澶嶄綅澶辫触锛屽皬杞﹀彿{}锛�",rgvProtocol.getRgvNo());
+                            }
+                            BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
+                            basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
+                            rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
+                            break;
+                        }
+                        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo1().intValue());
+                        if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getType()!=1 || wrkMastSta.getWrkSts()!=1){
+                            log.error("鏈煡鍒板皬杞︽墽琛屼换鍔℃垨鑰呮墽琛屼换鍔$姸鎬佷笉绗﹀悎锛�"+wrkMastSta);
+                            continue;
+                        }
+                        boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
+                        if (!rgvComplete){
+                            log.error("灏忚溅澶嶄綅澶辫触锛屽皬杞﹀彿{}锛�",rgvProtocol.getRgvNo());
+                            break;
+                        }
+                        wrkMastSta.setWrkSts(3);
+                        wrkMastStaMapper.updateById(wrkMastSta);
+                        BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
+                        basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
+                        rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
+                    }else if (rgvProtocol.getTaskNo2()!=0){
+                        if (rgvProtocol.getTaskNo2()==9999){
+                            boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
+                            if (!rgvComplete){
+                                log.error("灏忚溅澶嶄綅澶辫触锛屽皬杞﹀彿{}锛�",rgvProtocol.getRgvNo());
+                            }
+                            BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
+                            basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
+                            rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
+                            break;
+                        }
+                        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo2().intValue());
+                        if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getType()!=2){
+                            log.error("鏈煡鍒板皬杞︽墽琛屼换鍔℃垨鑰呮墽琛屼换鍔$姸鎬佷笉绗﹀悎锛�"+wrkMastSta);
+                            continue;
+                        }
+                        boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
+                        if (!rgvComplete){
+                            log.error("灏忚溅澶嶄綅澶辫触锛屽皬杞﹀彿{}锛�",rgvProtocol.getRgvNo());
+                            break;
+                        }
+                        wrkMastSta.setWrkSts(3);
+                        wrkMastStaMapper.updateById(wrkMastSta);
+                        BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
+                        basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
+                        rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
+                    }else {
+                        log.error("灏忚溅澶嶄綅澶辫触锛屽皬杞﹀彿{},绛夊緟wcs纭浣嗘槸娌℃湁宸ヤ綔鍙凤紒",rgvProtocol.getRgvNo());
+                    }
+                }
+            }
+        }catch (Exception e){
+            log.error("灏忚溅澶嶄綅绾跨▼鎶ラ敊锛�"+e);
+        }
+    }
+    /**
+     * 鎵ц灏忚溅鎼繍浠诲姟
+     */
+    public synchronized void rgvRunWrkMastFullSta() {
+        try{
+            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
+                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
+                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+                if (rgvProtocol == null) {
+                    continue;
+                }
+                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
+                if (basRgv == null) {
+                    log.error("{}鍙稲GV灏氭湭鍦ㄦ暟鎹簱杩涜缁存姢锛�", rgvSlave.getId());
+                    continue;
+                }
+
+                // 鍙湁褰揜GV绌洪棽銆佽嚜鍔�,宸ヤ綅涓�鏃犵墿//rgv鍙敤
+                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
+                        && rgvProtocol.getModeType() == RgvModeType.AUTO
+                        && rgvProtocol.getLoaded1()==0
+                ) {
+                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
+                    if (basRgvMap == null) {
+                        log.error("{}鍙稲GV灏氭湭鍦ㄦ暟鎹簱鍦板浘涓繘琛岀淮鎶わ紒", rgvProtocol.getRgvNo());
+                        continue;
+                    }
+                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
+                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //鏇存柊灏忚溅褰撳墠浣嶇疆绔欑偣鍙�
+                    List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);
+                    for (WrkMastSta wrkMastSta : wrkMastStaList){
+                        if (wrkMastSta.getType()!=1 || wrkMastSta.getWrkType()!=3){//1:婊$増   3锛氬彇鏀�
+                            continue;
+                        }
+                        boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta);
+                        if (sign){
+                            boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd());
+                            if (signMap){
+                                wrkMastSta.setWrkSts(1);
+                                try{
+                                    wrkMastStaMapper.updateById(wrkMastSta);
+                                }catch (Exception e){
+                                    log.error("鏇存柊灏忚溅浠诲姟澶辫触");
+                                }
+                                return;
+                            }else {
+                                log.error("3864琛岋紝璐х墿鎼繍浠诲姟锛氬伐浣滃彿{}鎵�灞炰换鍔′笅鍙戝悗鍦板浘鍚屾澶辫触",wrkMastSta.getWrkNo());
+                            }
+                        } else {
+                            log.error("宸ヤ綔鍙穥}鎵�灞炰换鍔′笅鍙戝け璐�",wrkMastSta.getWrkNo());
+                        }
+                        break;
+                    }
+                }
+            }
+        }catch (Exception e){
+            log.error("3875琛屾墽琛屽皬杞︽惉杩愪换鍔′笅鍙戝け璐�");
+            log.error("3875琛�"+e);
+        }
+    }
+    /**
+     * 鎵ц灏忚溅鎼繍浠诲姟
+     */
+    public synchronized void rgvRunWrkMastEmptyStaPut() {//鏀�
+        try{
+            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
+                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
+                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+                if (rgvProtocol == null) {
+                    continue;
+                }
+                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
+                if (basRgv == null) {
+                    log.error("{}鍙稲GV灏氭湭鍦ㄦ暟鎹簱杩涜缁存姢锛�", rgvSlave.getId());
+                    continue;
+                }
+
+                // 鍙湁褰揜GV绌洪棽銆佽嚜鍔�,宸ヤ綅浜屾湁鐗�//rgv鍙敤
+                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
+                        && rgvProtocol.getModeType() == RgvModeType.AUTO
+                        && rgvProtocol.getLoaded2()==1  //鐜板満淇敼锛氬彔鐩樻満锛屼笉婊¢兘绠楁棤鐗╋紝鎬庝箞鍒ゆ柇闇�瑕佽窡鐢垫帶瀵规帴
+                ) {
+                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
+                    if (basRgvMap == null) {
+                        log.error("{}鍙稲GV灏氭湭鍦ㄦ暟鎹簱鍦板浘涓繘琛岀淮鎶わ紒", rgvProtocol.getRgvNo());
+                        continue;
+                    }
+                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //鏇存柊灏忚溅褰撳墠浣嶇疆绔欑偣鍙�
+                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());//鑾峰彇娲诲姩鑼冨洿
+                    List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);//鏌ヨ鍙墽琛屼换鍔�
+                    for (WrkMastSta wrkMastSta : wrkMastStaList){
+                        if (wrkMastSta.getType()!=2 || (wrkMastSta.getWrkType()!=2 && wrkMastSta.getWrkType()!=4)){// 2:绌烘澘  2:鏀� 4锛氭媶鐩�
+                            continue;
+                        }
+                        boolean sign = false;
+                        if (wrkMastSta.getStaStart()==0 && wrkMastSta.getStaEnd()!=0){//鏀�
+                            sign = rgvPutEmpty(rgvProtocol.getRgvNo(),wrkMastSta);
+                        }else {
+                            continue;
+                        }
+                        if (sign){
+                            boolean signMap = rgvMapUpdate(basRgvMap, basRgvMap.getStartRoute(), wrkMastSta.getStaEnd());
+                            if (signMap){
+                                wrkMastSta.setWrkSts(2);
+                                try{
+                                    wrkMastStaMapper.updateById(wrkMastSta);
+                                }catch (Exception e){
+                                    log.error("鏇存柊灏忚溅浠诲姟澶辫触");
+                                }
+                                return;
+                            }else {
+                                log.error("3857琛岋紝璐х墿鎼繍浠诲姟锛氬伐浣滃彿{}鎵�灞炰换鍔′笅鍙戝悗鍦板浘鍚屾澶辫触",wrkMastSta.getWrkNo());
+                            }
+                        }else {
+                            log.error("宸ヤ綔鍙穥}鎵�灞炰换鍔′笅鍙戝け璐�",wrkMastSta.getWrkNo());
+                        }
+                        break;
+                    }
+                }
+            }
+        }catch (Exception e){
+            log.error("3933琛屾墽琛屽皬杞︽斁绌烘澘浠诲姟涓嬪彂澶辫触");
+            log.error("3933琛�"+e);
+        }
+    }
+
+    public synchronized void rgvRunWrkMastEmptyStaTake() {//鍙�
+        try{
+            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
+                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
+                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+                if (rgvProtocol == null) {
+                    continue;
+                }
+                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
+                if (basRgv == null) {
+                    log.error("{}鍙稲GV灏氭湭鍦ㄦ暟鎹簱杩涜缁存姢锛�", rgvSlave.getId());
+                    continue;
+                }
+
+                // 鍙湁褰揜GV绌洪棽銆佽嚜鍔�,宸ヤ綅浜屾棤鐗�//rgv鍙敤
+                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
+                        && rgvProtocol.getModeType() == RgvModeType.AUTO
+                        && rgvProtocol.getLoaded2()==0  //鐜板満淇敼锛氬彔鐩樻満锛屼笉婊¢兘绠楁棤鐗╋紝鎬庝箞鍒ゆ柇闇�瑕佽窡鐢垫帶瀵规帴
+                ) {
+                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
+                    if (basRgvMap == null) {
+                        log.error("{}鍙稲GV灏氭湭鍦ㄦ暟鎹簱鍦板浘涓繘琛岀淮鎶わ紒", rgvProtocol.getRgvNo());
+                        continue;
+                    }
+                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
+                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //鏇存柊灏忚溅褰撳墠浣嶇疆绔欑偣鍙�
+                    List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);
+                    for (WrkMastSta wrkMastSta : wrkMastStaList){
+                        if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=1){// 2:绌烘澘  1:鍙�
+                            continue;
+                        }
+                        boolean sign = false;
+                        if (wrkMastSta.getStaEnd()==0 && wrkMastSta.getStaStart()!=0){//鍙�
+                            sign = rgvTakeEmpty(rgvProtocol.getRgvNo(),wrkMastSta);
+                        } else {
+                            continue;
+                        }
+                        if (sign){
+                            boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), basRgvMap.getStartRoute());
+                            if (signMap){
+                                wrkMastSta.setWrkSts(1);
+                                try{
+                                    wrkMastStaMapper.updateById(wrkMastSta);
+                                }catch (Exception e){
+                                    log.error("鏇存柊灏忚溅浠诲姟澶辫触");
+                                }
+                                return;
+                            }else {
+                                log.error("3879琛岋紝璐х墿鎼繍浠诲姟锛氬伐浣滃彿{}鎵�灞炰换鍔′笅鍙戝悗鍦板浘鍚屾澶辫触",wrkMastSta.getWrkNo());
+                            }
+                        }else {
+                            log.error("宸ヤ綔鍙穥}鎵�灞炰换鍔′笅鍙戝け璐�",wrkMastSta.getWrkNo());
+                        }
+                        break;
+                    }
+                }
+            }
+        }catch (Exception e){
+            log.error("3989琛屾墽琛屽皬杞﹀彇绌烘澘浠诲姟涓嬪彂澶辫触");
+            log.error("3989琛�"+e);
+        }
+    }
+
+    /*
+     * 鏈変换鍔′絾鏈墽琛�  姝ゆ椂闇�瑕佽皟鏁村皬杞︿綅缃�
+     * */
+    public synchronized void rgvRunWrkMastEmptyStaAvoidance() {
+        try{
+            Integer integer = wrkMastStaMapper.selectAllWrkStsCount(null,0);//鏌ヨ鐘舵�佷负0鐨勪换鍔�
+            if (integer==0){
+                return;
+            }
+            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
+                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
+                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+                if (rgvProtocol == null) {
+                    continue;
+                }
+                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
+                if (basRgv == null) {
+                    log.error("{}鍙稲GV灏氭湭鍦ㄦ暟鎹簱杩涜缁存姢锛�", rgvSlave.getId());
+                    continue;
+                }
+
+                // 鍙湁褰揜GV绌洪棽銆佽嚜鍔�,宸ヤ綅涓�鏃犵墿//rgv鍙敤
+                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
+                        && rgvProtocol.getModeType() == RgvModeType.AUTO
+                        && rgvProtocol.getLoaded1()==0  //鐜板満淇敼锛氬彔鐩樻満锛屼笉婊¢兘绠楁棤鐗╋紝鎬庝箞鍒ゆ柇闇�瑕佽窡鐢垫帶瀵规帴
+                        && rgvProtocol.getTaskNo1()==0
+                        && rgvProtocol.getTaskNo2()==0
+                ) {
+                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
+                    if (rgvProtocol.getRgvPosI().equals(basRgvMap.getStartRoute())){
+                        continue;
+                    }
+                    rgvAvoidanceXY(rgvProtocol.getRgvNo());
+                    rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
+                }
+            }
+        }catch (Exception e){
+            log.error("4109琛屾墽琛屽皬杞﹀垵濮嬪寲浠诲姟涓嬪彂澶辫触");
+            log.error("4109琛�"+e);
+        }
+    }
+
+    /*
+     * 灏忚溅XY绉诲姩  閬胯
+     * */
+    public synchronized boolean rgvAvoidanceXY(Integer rgvId){
+        try{
+            //  鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
+            RgvCommand rgvCommand = new RgvCommand();
+            rgvCommand.setRgvNo(rgvId); // RGV缂栧彿
+            rgvCommand.setAckFinish1((short) 0);  // 宸ヤ綅1浠诲姟瀹屾垚纭浣�
+            rgvCommand.setTaskNo1((short)9999); // 宸ヤ綅1宸ヤ綔鍙�
+            rgvCommand.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 宸ヤ綅1浠诲姟妯″紡:  鍥炲師鐐�
+            rgvCommand.setCommand((short) 1);   //宸ヤ綅1浠诲姟纭
+            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(9, rgvCommand))) {
+                //step=2,宸ヤ綅1銆�2鍐欎换鍔★紱   step=4锛屽伐浣�1鍐欎换鍔★紱     step=5锛屽伐浣�2鍐欎换鍔�   step=9锛屽洖鍘熺偣 9999浠诲姟鍙�
+                log.error("RGV鍛戒护涓嬪彂澶辫触锛孯GV鍙�={}锛屼换鍔℃暟鎹�={}", rgvId, JSON.toJSON(rgvCommand));
+                return false;
+            } else {
+                return true;
+            }
+        }catch (Exception e){
+            return false;
+
+        }
+    }
+
+
+    /*
+     * 灏忚溅鍙栬揣鑷冲伐浣嶄换鍔�
+     * */
+    public synchronized boolean rgvTakeFullAll(Integer rgvId,WrkMastSta wrkMastSta){
+        try{
+            //  鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
+            RgvCommand rgvCommand = new RgvCommand();
+            rgvCommand.setRgvNo(rgvId); // RGV缂栧彿
+            rgvCommand.setAckFinish1((short) 0);  // 宸ヤ綅1浠诲姟瀹屾垚纭浣�
+            rgvCommand.setTaskNo1(wrkMastSta.getWrkNo().shortValue()); // 宸ヤ綅1宸ヤ綔鍙�
+            rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 宸ヤ綅1浠诲姟妯″紡:  鍙栨斁璐�
+            rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue());   //宸ヤ綅1璧风偣
+            rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue());   //宸ヤ綅1鐩爣绔欑偣
+            rgvCommand.setCommand((short) 1);   //宸ヤ綅1浠诲姟纭
+            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(4, rgvCommand))) {
+                //step=2,宸ヤ綅1銆�2鍐欎换鍔★紱   step=4锛屽伐浣�1鍐欎换鍔★紱     step=5锛屽伐浣�2鍐欎换鍔�
+                log.error("RGV鍛戒护涓嬪彂澶辫触锛孯GV鍙�={}锛屼换鍔℃暟鎹�={}", rgvId, JSON.toJSON(rgvCommand));
+                return false;
+            } else {
+                return true;
+            }
+        }catch (Exception e){
+            return false;
+        }
+    }
+
+    /*
+     * 灏忚溅鍙栬揣鑷冲伐浣嶄换鍔�
+     * */
+    public synchronized boolean rgvTakeFull(Integer rgvId,WrkMastSta wrkMastSta){
+        try{
+            //  鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
+            RgvCommand rgvCommand = new RgvCommand();
+            rgvCommand.setRgvNo(rgvId); // RGV缂栧彿
+            rgvCommand.setAckFinish1((short) 0);  // 宸ヤ綅1浠诲姟瀹屾垚纭浣�
+            rgvCommand.setTaskNo1(wrkMastSta.getWrkNo().shortValue()); // 宸ヤ綅1宸ヤ綔鍙�
+            rgvCommand.setTaskMode1(RgvTaskModeType.FETCH); // 宸ヤ綅1浠诲姟妯″紡:  鍙栬揣
+            rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue());   //宸ヤ綅1璧风偣
+            rgvCommand.setCommand((short) 1);   //宸ヤ綅1浠诲姟纭
+            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(4, rgvCommand))) {
+                //step=2,宸ヤ綅1銆�2鍐欎换鍔★紱   step=4锛屽伐浣�1鍐欎换鍔★紱     step=5锛屽伐浣�2鍐欎换鍔�
+                log.error("RGV鍛戒护涓嬪彂澶辫触锛孯GV鍙�={}锛屼换鍔℃暟鎹�={}", rgvId, JSON.toJSON(rgvCommand));
+                return false;
+            } else {
+                return true;
+            }
+        }catch (Exception e){
+            return false;
+        }
+    }
+
+    /*
+     * 灏忚溅鏀捐揣鑷宠緭閫佺嚎浠诲姟
+     * */
+    public synchronized boolean rgvPutFull(Integer rgvId,WrkMastSta wrkMastSta){
+        try{
+            //  鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
+            RgvCommand rgvCommand = new RgvCommand();
+            rgvCommand.setRgvNo(rgvId); // RGV缂栧彿
+            rgvCommand.setAckFinish1((short) 0);  // 宸ヤ綅1浠诲姟瀹屾垚纭浣�
+            rgvCommand.setTaskNo1(wrkMastSta.getWrkNo().shortValue()); // 宸ヤ綅1宸ヤ綔鍙�
+            rgvCommand.setTaskMode1(RgvTaskModeType.PUT); // 宸ヤ綅1浠诲姟妯″紡:  鏀捐揣
+            rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue());   //宸ヤ綅1鐩爣绔欑偣
+            rgvCommand.setCommand((short) 1);   //宸ヤ綅1浠诲姟纭
+            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(4, rgvCommand))) {
+                //step=2,宸ヤ綅1銆�2鍐欎换鍔★紱   step=4锛屽伐浣�1鍐欎换鍔★紱     step=5锛屽伐浣�2鍐欎换鍔�
+                log.error("RGV鍛戒护涓嬪彂澶辫触锛孯GV鍙�={}锛屼换鍔℃暟鎹�={}", rgvId, JSON.toJSON(rgvCommand));
+                return false;
+            } else {
+                return true;
+            }
+        }catch (Exception e){
+            return false;
+        }
+    }
+
+    /*
+     * 灏忚溅鍙栫┖鏉胯嚦宸ヤ綅浠诲姟
+     * */
+    public synchronized boolean rgvTakeEmpty(Integer rgvId,WrkMastSta wrkMastSta){
+        try{
+            //  鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
+            RgvCommand rgvCommand = new RgvCommand();
+            rgvCommand.setRgvNo(rgvId); // RGV缂栧彿
+            rgvCommand.setAckFinish2((short) 0);  // 宸ヤ綅2浠诲姟瀹屾垚纭浣�
+            rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 宸ヤ綅2宸ヤ綔鍙�
+            rgvCommand.setTaskMode2(RgvTaskModeType.FETCH); // 宸ヤ綅2浠诲姟妯″紡:  鍙栬揣
+            rgvCommand.setSourceStaNo2(wrkMastSta.getStaStart().shortValue());   //宸ヤ綅2璧风偣
+            rgvCommand.setCommand((short) 2);   //宸ヤ綅2浠诲姟纭
+            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(5, rgvCommand))) {
+                //step=2,宸ヤ綅1銆�2鍐欎换鍔★紱   step=4锛屽伐浣�1鍐欎换鍔★紱     step=5锛屽伐浣�2鍐欎换鍔�
+                log.error("RGV鍛戒护涓嬪彂澶辫触锛孯GV鍙�={}锛屼换鍔℃暟鎹�={}", rgvId, JSON.toJSON(rgvCommand));
+                return false;
+            } else {
+                return true;
+            }
+        }catch (Exception e){
+            return false;
+        }
+    }
+
+    /*
+     * 灏忚溅鏀剧┖鏉胯嚦杈撻�佺嚎浠诲姟
+     * */
+    public synchronized boolean rgvPutEmpty(Integer rgvId,WrkMastSta wrkMastSta){
+        try{
+            //  鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
+            RgvCommand rgvCommand = new RgvCommand();
+            rgvCommand.setRgvNo(rgvId); // RGV缂栧彿
+            rgvCommand.setAckFinish2((short) 0);  // 宸ヤ綅2浠诲姟瀹屾垚纭浣�
+            rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 宸ヤ綅2宸ヤ綔鍙�
+            rgvCommand.setTaskMode2(RgvTaskModeType.PUT); // 宸ヤ綅2浠诲姟妯″紡:  鏀捐揣
+            rgvCommand.setDestinationStaNo2(wrkMastSta.getStaEnd().shortValue());   //宸ヤ綅2鐩爣绔欑偣
+            rgvCommand.setCommand((short) 2);   //宸ヤ綅2浠诲姟纭
+            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(5, rgvCommand))) {
+                //step=2,宸ヤ綅1銆�2鍐欎换鍔★紱   step=4锛屽伐浣�1鍐欎换鍔★紱     step=5锛屽伐浣�2鍐欎换鍔�
+                log.error("RGV鍛戒护涓嬪彂澶辫触锛孯GV鍙�={}锛屼换鍔℃暟鎹�={}", rgvId, JSON.toJSON(rgvCommand));
+                return false;
+            } else {
+                return true;
+            }
+        }catch (Exception e){
+            return false;
+        }
+    }
+
+    /*
+     * 灏忚溅澶嶄綅
+     * */
+    public synchronized boolean rgvComplete(Integer rgvId){
+        try{
+            //  鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
+            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(3, new RgvCommand()))) {
+                //step=2,宸ヤ綅1銆�2鍐欎换鍔★紱   step=4锛屽伐浣�1鍐欎换鍔★紱     step=5锛屽伐浣�2鍐欎换鍔�
+                log.error("RGV鍛戒护涓嬪彂澶辫触锛孯GV鍙�={}",rgvId);
+                return false;
+            } else {
+                log.info("RGV鍛戒护涓嬪彂鎴愬姛锛孯GV鍙�={}",rgvId);
+                return true;
+            }
+        }catch (Exception e){
+            log.error("RGV鍛戒护涓嬪彂澶辫触锛孯GV鍙�={}銆傚紓甯革細"+e,rgvId);
+            return false;
+        }
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/utils/RouteUtils.java b/src/main/java/com/zy/asrs/utils/RouteUtils.java
new file mode 100644
index 0000000..acfdf6d
--- /dev/null
+++ b/src/main/java/com/zy/asrs/utils/RouteUtils.java
@@ -0,0 +1,285 @@
+package com.zy.asrs.utils;
+
+import com.zy.core.enums.RouteCollectCountType;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static java.util.stream.Collectors.toList;
+
+/**
+ * Created by Monkey D. Luffy on 2023/7/18
+ */
+public class RouteUtils {
+
+    public static final List<Integer> MERGE_STA_NO_One = new ArrayList<Integer>() {{
+//        add(116);add(117);
+    }};
+
+    public static final List<Integer> MERGE_STA_NO_TWO = new ArrayList<Integer>() {{
+//        add(116);add(117);
+    }};
+
+    public static final List<Integer> MERGE_STA_NO_THREE = new ArrayList<Integer>() {{
+//        add(116);add(117);
+    }};
+
+    public static final List<Integer> MERGE_STA_NO_FOUR = new ArrayList<Integer>() {{
+//        add(116);add(117);
+    }};
+
+//    姝e簭
+    public static final List<Integer> TRACK_POSITION_POSITIVE_SEQUENCE = new ArrayList<Integer>() {{
+        add(161);add(157);add(153);add(149);add(124);add(119);add(113);add(999);;add(112);add(107);add(106);add(101);add(100);
+    }};
+//    鍙嶅簭
+    public static final List<Integer> TRACK_POSITION_REVERSE_SEQUENCE = new ArrayList<Integer>() {{
+        add(100);add(101);add(106);add(107);add(112);add(999);add(113);add(119);add(124);add(149);add(153);add(157);add(161);
+    }};
+
+    public static String zerofill(String msg, Integer count){
+        if (msg.length() == count){
+            return msg;
+        } else if (msg.length() > count){
+            return msg.substring(0, 16);
+        } else {
+            StringBuilder msgBuilder = new StringBuilder(msg);
+            for (int i = 0; i<count-msg.length(); i++){
+                msgBuilder.insert(0,"0");
+            }
+            return msgBuilder.toString();
+        }
+    }
+    /*
+     * 鑾峰彇骞叉秹鏈�杩滅珯鐐�
+     * */
+    public static Integer RouteIndexFarMas(int rgvNo,Integer staNo){
+        List<Integer> staFall = new ArrayList<>();
+        if (MERGE_STA_NO_One.contains(staNo)){
+            staFall = MERGE_STA_NO_One;
+        }else if (MERGE_STA_NO_TWO.contains(staNo)){
+            staFall = MERGE_STA_NO_TWO;
+        }else if (MERGE_STA_NO_THREE.contains(staNo)){
+            staFall = MERGE_STA_NO_THREE;
+        }else if (MERGE_STA_NO_FOUR.contains(staNo)){
+            staFall = MERGE_STA_NO_FOUR;
+        }else {
+            return staNo;
+        }
+
+        int indexNo = 0;
+        if (rgvNo==1){
+            indexNo=staFall.size()-1;
+        }
+        return staFall.get(indexNo);
+    }
+
+
+    // 鑾峰彇褰撳墠灏忚溅鏈璧扮殑璺嚎闆嗗悎
+    public static List<Integer> getRoute(Integer groupStart,Integer groupEnd){
+        boolean sign = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(groupStart) < TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(groupEnd);
+        List<Integer> result = new ArrayList<>();
+        List<Integer> groupRoute = new ArrayList<>();
+        if (sign){
+            groupRoute = TRACK_POSITION_POSITIVE_SEQUENCE;
+        }else {
+            groupRoute = TRACK_POSITION_REVERSE_SEQUENCE;
+        }
+        if (groupRoute.contains(groupStart) && groupRoute.contains(groupEnd)) {
+            sign = false;
+            for (Integer route : groupRoute) {
+                if (route.equals(groupStart)){
+                    sign=true;
+                }
+                if (route.equals(groupEnd)){
+                    result.add(route);
+                    break;
+                }
+                if (sign){
+                    result.add(route);
+                }
+            }
+        }else {
+            return null;
+        }
+        return result;
+    }
+
+    /*
+    * 鑾峰彇鏈�杩滅珯鐐�
+    * */
+    public static Integer RouteIndexFarMas(Integer a,Integer b,Integer c,Integer d){
+        int ia = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(a);
+        int ib = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(b);
+        int ic = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(c);
+        int id = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(d);
+        if (id==0){
+            if (ia>ib){
+                if (ia>ic){
+                    return a;
+                }else {
+                    return c;
+                }
+            }else {
+                if (ib>ic){
+                    return b;
+                }else {
+                    return c;
+                }
+            }
+        }else {
+            if (ia<ib){
+                if (ia<ic){
+                    return a;
+                }else {
+                    return c;
+                }
+            }else {
+                if (ib<ic){
+                    return b;
+                }else {
+                    return c;
+                }
+            }
+        }
+    }
+
+    public static Integer[] RouteIndexFarArr(Integer a,Integer b,Integer c,Integer d){
+        int ia = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(a);
+        int ib = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(b);
+        int ic = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(c);
+        int id = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(d);
+        return new Integer[]{ia,ib,ic,id};
+    }
+
+    /*
+     * a  灏忚溅褰撳墠浣嶇疆
+     * b  灏忚溅浠诲姟寮�濮嬩綅缃�
+     * c  灏忚溅浠诲姟缁撴潫浣嶇疆
+     * d  灏忚溅鍒濆浣嶇疆
+     * 鑾峰彇鏈�澶ц矾寰勫樊鍊�
+     * */
+    public static List<Integer>  RouteMapCurrentFar(Integer a,Integer b,Integer c,Integer d){
+        Integer farStn = RouteIndexFarMas(a, b, c, d);
+        return getRouteIntersection(TRACK_POSITION_POSITIVE_SEQUENCE,getRoute(farStn, d), RouteCollectCountType.DIFFERENCESET);
+    }
+
+    public static List<Integer>  RouteMapCurrentFar(Integer farStn,Integer d){
+        return getRouteIntersection(TRACK_POSITION_POSITIVE_SEQUENCE,getRoute(farStn, d), RouteCollectCountType.DIFFERENCESET);
+    }
+
+    /*
+    * 鍙︿竴鍙板皬杞︽渶杩滀綅缃�
+    * */
+    public static Integer RouteMapOtherFarStnNo(List<Integer> routeDIFF,Integer d){
+        int id = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(d);
+        if (id==0){
+            return routeDIFF.get(0);
+        }else {
+            int size = routeDIFF.size();
+            return routeDIFF.get(size-1);
+        }
+    }
+
+    //鏄惁鏈変氦闆�
+    public static boolean getRouteBoolean(List<Integer> groupCurrent,List<Integer> groupOther){
+        for (Integer positionCurrent : groupCurrent){
+            for (Integer positionOther : groupOther){
+                if (positionCurrent.equals(positionOther)){
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    //闆嗗悎杩愮畻
+    public static List<Integer> getRouteIntersection(List<Integer> groupCurrent, List<Integer> groupOther, RouteCollectCountType routeCollectCountType){
+        switch (routeCollectCountType){
+            case INTERSECTION:
+                //浜ら泦
+                return groupCurrent.stream().filter(item -> groupOther.contains(item)).collect(toList());
+            case DIFFERENCESET:
+                //宸泦
+                return groupCurrent.stream().filter(item -> !groupOther.contains(item)).collect(toList());
+            case UNION:
+                //骞堕泦
+                groupCurrent.addAll(groupOther);
+                return groupCurrent;
+            case DEDUPLICATIONUNION:
+                //鍘婚噸骞堕泦
+                groupCurrent.addAll(groupOther);
+                return groupCurrent.stream().distinct().collect(toList());
+            default:
+                return null;
+        }
+    }
+
+    /*
+    * a  灏忚溅褰撳墠浣嶇疆
+    * b  灏忚溅浠诲姟寮�濮嬩綅缃�
+    * c  灏忚溅浠诲姟缁撴潫浣嶇疆
+    * sign  鍙︿竴涓皬杞︾┖闂叉爣璁�
+    * */
+    public static boolean RouteAutoBoolean(Integer a,Integer b,Integer c,Integer aa,Integer bb,Integer cc,boolean idleOther){
+        List<Integer> routeCurrent = getRouteIntersection(getRoute(a, c), getRoute(b, c), RouteCollectCountType.DEDUPLICATIONUNION);//骞堕泦
+        List<Integer> routeOther = getRouteIntersection(getRoute(aa, cc), getRoute(bb, cc), RouteCollectCountType.DEDUPLICATIONUNION);//
+        return !getRouteBoolean(routeCurrent, routeOther);  //鏄惁鏈変氦闆�
+    }
+
+    public static List<Integer> RouteAutoBoolean(Integer a,Integer b,Integer c){
+        return getRouteIntersection(getRoute(a, c), getRoute(b, c), RouteCollectCountType.DEDUPLICATIONUNION);
+    }
+
+
+
+    public static void main(String[] arge){
+        List<Integer> routeCurrent = getRoute(100, 124);  //鑾峰彇褰撳墠灏忚溅璺緞
+        List<Integer> routeOther = getRoute(149, 161);  //鑾峰彇鍏跺畠灏忚溅璺緞
+        System.out.println("褰撳墠灏忚溅璺緞:\t"+routeCurrent);
+        System.out.println("鍏跺畠灏忚溅璺緞:\t"+routeOther);
+
+        boolean routeBoolean = getRouteBoolean(routeCurrent, routeOther);  //鏄惁鏈変氦闆�
+        System.out.println("鏄惁鏈変氦闆�:\t"+routeBoolean);
+
+        List<Integer> routeIntersection = getRouteIntersection(routeCurrent, routeOther, RouteCollectCountType.INTERSECTION);//浜ら泦
+        System.out.println("璺緞浜ら泦锛歕t"+routeIntersection);
+
+        List<Integer> routeIntersection1 = getRouteIntersection(routeCurrent, routeOther, RouteCollectCountType.DIFFERENCESET);//宸泦
+        System.out.println("璺緞宸泦锛歕t"+routeIntersection1);
+
+        List<Integer> routeIntersection2 = getRouteIntersection(routeCurrent, routeOther, RouteCollectCountType.UNION);//骞堕泦
+        System.out.println("璺緞骞堕泦锛歕t"+routeIntersection2);
+
+        List<Integer> routeIntersection3 = getRouteIntersection(routeCurrent, routeOther, RouteCollectCountType.DEDUPLICATIONUNION);//鍘婚噸骞堕泦
+        System.out.println("璺緞鍘婚噸骞堕泦锛歕t"+routeIntersection3);
+
+        /*
+         * a  灏忚溅褰撳墠浣嶇疆
+         * b  灏忚溅浠诲姟寮�濮嬩綅缃�
+         * c  灏忚溅浠诲姟缁撴潫浣嶇疆
+         * sign  鍙︿竴涓皬杞︾┖闂叉爣璁�
+         * */
+        System.out.println("鏄惁鏈変氦闆嗭細\t"+RouteAutoBoolean(100,101,124,149,161,153,true));   //鏄惁鏈変氦闆�  true鏃犱氦闆�  false鏈変氦闆�
+
+        /*
+         * a  灏忚溅褰撳墠浣嶇疆
+         * b  灏忚溅浠诲姟寮�濮嬩綅缃�
+         * c  灏忚溅浠诲姟缁撴潫浣嶇疆
+         * d  灏忚溅鍒濆浣嶇疆
+         * 鑾峰彇鏈�澶ц矾寰勫樊鍊�
+         * */
+        List<Integer> routeDIFF = RouteMapCurrentFar(100,101,124,149);
+        System.out.println("褰撳墠璺緞鏈�澶ч泦鍚堬細\t"+ routeDIFF);
+
+        Integer routeFarOther= RouteMapOtherFarStnNo(routeDIFF,124);
+        System.out.println("鍙︿竴鍙板皬杞︽渶杩滅珯鐐癸細\t"+routeFarOther);
+
+
+        Integer[] integers = RouteIndexFarArr(100,101,124,149);
+        for (Integer integer:integers){
+            System.out.println(integer);
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/core/MainProcess.java b/src/main/java/com/zy/core/MainProcess.java
index e328fc6..f60a85a 100644
--- a/src/main/java/com/zy/core/MainProcess.java
+++ b/src/main/java/com/zy/core/MainProcess.java
@@ -44,7 +44,10 @@
                     }
 
                     // 婕旂ず
-                    mainService.crnDemoOfLocMove1();
+//                    mainService.crnDemoOfLocMove1();
+                    //鍒锋柊RGV鍦板浘
+                    mainService.refreshRgvMap();
+
                     // 鍏ュ嚭搴撴ā寮忓垏鎹㈠嚱鏁�
 //                    mainService.ioConvert();
                     // 鍏ュ簱  ===>> 鍏ュ簱绔欏埌鍫嗗灈鏈虹珯锛屾牴鎹潯鐮佹壂鎻忕敓鎴愬叆搴撳伐浣滄。
@@ -84,6 +87,20 @@
 //                        i = 0;
 //                    }
 
+                    /////////////////////////////////////RGV璋冨害/////////////////////////////////////
+//
+                    //瀹屾垚灏忚溅浠诲姟
+                    mainService.rgvCompleteWrkMastSta();
+                    //鎵ц灏忚溅璐х墿鎼繍浠诲姟
+                    mainService.rgvRunWrkMastFullSta();
+                    //鎵ц灏忚溅绌烘澘鎼繍浠诲姟
+                    mainService.rgvRunWrkMastEmptyStaPut();//鏀�
+                    mainService.rgvRunWrkMastEmptyStaTake();//鍙�
+                    mainService.rgvRunWrkMastEmptyStaAvoidance();//閬胯
+
+
+                    /////////////////////////////////////RGV璋冨害/////////////////////////////////////
+
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
diff --git a/src/main/java/com/zy/core/ServerBootstrap.java b/src/main/java/com/zy/core/ServerBootstrap.java
index d0c0cc7..8e6f4b4 100644
--- a/src/main/java/com/zy/core/ServerBootstrap.java
+++ b/src/main/java/com/zy/core/ServerBootstrap.java
@@ -7,6 +7,7 @@
 import com.zy.core.model.CrnSlave;
 import com.zy.core.model.DevpSlave;
 import com.zy.core.model.LedSlave;
+import com.zy.core.model.RgvSlave;
 import com.zy.core.properties.SlaveProperties;
 import com.zy.core.thread.*;
 import lombok.extern.slf4j.Slf4j;
@@ -52,6 +53,10 @@
         for (Slave crn : slaveProperties.getCrn()) {
             MessageQueue.init(SlaveType.Crn, crn);
         }
+        // 鍒濆鍖朢gv灏忚溅mq
+        for (Slave rgv : slaveProperties.getRgv()) {
+            MessageQueue.init(SlaveType.Rgv, rgv);
+        }
         // 鍒濆鍖栬緭閫佺嚎mq
         for (Slave devp : slaveProperties.getDevp()) {
             MessageQueue.init(SlaveType.Devp, devp);
@@ -82,6 +87,13 @@
             new Thread((Runnable) crnThread).start();
             SlaveConnection.put(SlaveType.Crn, crn.getId(), crnThread);
         }
+        // 鍒濆鍖栫┛姊溅绾跨▼
+        log.info("鍒濆鍖朢GV绾跨▼...................................................");
+        for (RgvSlave rgv : slaveProperties.getRgv()) {
+            RgvThread rgvThread = new RgvThread(rgv);
+            new Thread((Runnable) rgvThread).start();
+            SlaveConnection.put(SlaveType.Rgv, rgv.getId(), rgvThread);
+        }
         // 鍒濆鍖栬緭閫佺嚎绾跨▼
         News.info("鍒濆鍖栬緭閫佺嚎绾跨▼...................................................");
         for (DevpSlave devp : slaveProperties.getDevp()) {
diff --git a/src/main/java/com/zy/core/cache/OutputQueue.java b/src/main/java/com/zy/core/cache/OutputQueue.java
index 63205e7..65df862 100644
--- a/src/main/java/com/zy/core/cache/OutputQueue.java
+++ b/src/main/java/com/zy/core/cache/OutputQueue.java
@@ -15,4 +15,6 @@
     public static ArrayBlockingQueue<String> DEVP = new ArrayBlockingQueue<>(32);
     // 鏉$爜鍣ㄨ緭鍑烘棩蹇�
     public static ArrayBlockingQueue<JSONObject> BARCODE = new ArrayBlockingQueue<>(32);
+    // rgv杈撳嚭鏃ュ織
+    public static ArrayBlockingQueue<String> RGV = new ArrayBlockingQueue<>(32);
 }
diff --git a/src/main/java/com/zy/core/enums/RgvModeType.java b/src/main/java/com/zy/core/enums/RgvModeType.java
new file mode 100644
index 0000000..f1dbe1e
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/RgvModeType.java
@@ -0,0 +1,43 @@
+package com.zy.core.enums;
+
+public enum RgvModeType {
+
+    NONE(-1, "绂荤嚎"),
+    STOP(0, "缁翠慨"),
+    HAND(1, "鎵嬪姩"),
+    HALF_AUTO(2, "鍗婅嚜鍔�"),
+    AUTO(3, "鑷姩"),
+    AUTO2(100, "鍏跺畠"),
+    ;
+
+    public Integer id;
+    public String desc;
+    RgvModeType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static RgvModeType get(Short id) {
+        if (null == id) {
+            return null;
+        }
+        for (RgvModeType type : RgvModeType.values()) {
+            if (type.id.equals(id.intValue())) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static RgvModeType get(RgvModeType type) {
+        if (null == type) {
+            return null;
+        }
+        for (RgvModeType rgvModeType : RgvModeType.values()) {
+            if (rgvModeType == type) {
+                return rgvModeType;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/zy/core/enums/RgvStatusType.java b/src/main/java/com/zy/core/enums/RgvStatusType.java
new file mode 100644
index 0000000..52a3179
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/RgvStatusType.java
@@ -0,0 +1,45 @@
+package com.zy.core.enums;
+
+public enum RgvStatusType {
+
+    NONE(-1, "绂荤嚎"),
+    IDLE(0, "绌洪棽"),
+    WORKING(1, "浣滀笟涓�"),
+    SOS(2, "鎶ヨ"),
+    FETCHING(11, "鍙栬揣涓�"),
+    PUTTING(12, "鏀捐揣涓�"),
+    WAITING(90, "浠诲姟瀹屾垚绛夊緟WCS纭"),
+    FETCHWAITING(91, "鍙栬揣浠诲姟瀹屾垚绛夊緟WCS纭"),
+    ;
+
+    public Integer id;
+    public String desc;
+    RgvStatusType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static RgvStatusType get(Short id) {
+        if (null == id) {
+            return null;
+        }
+        for (RgvStatusType type : RgvStatusType.values()) {
+            if (type.id.equals(id.intValue())) {
+                return type;
+            }
+        }
+        return NONE;
+    }
+
+    public static RgvStatusType get(RgvStatusType type) {
+        if (null == type) {
+            return null;
+        }
+        for (RgvStatusType rgvStatusType : RgvStatusType.values()) {
+            if (rgvStatusType == type) {
+                return rgvStatusType;
+            }
+        }
+        return null;
+    }
+}
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..290b43d
--- /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(Short id) {
+        if (null == id) {
+            return null;
+        }
+        for (RgvTaskModeType type : RgvTaskModeType.values()) {
+            if (type.id.equals(id.intValue())) {
+                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/enums/RouteCollectCountType.java b/src/main/java/com/zy/core/enums/RouteCollectCountType.java
new file mode 100644
index 0000000..518b771
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/RouteCollectCountType.java
@@ -0,0 +1,42 @@
+package com.zy.core.enums;
+
+public enum RouteCollectCountType {
+
+    INTERSECTION(0, "浜ら泦"),   // 浜ら泦
+    DIFFERENCESET(1, "宸泦"),   // 宸泦
+    UNION(2, "骞堕泦"),  //骞堕泦
+    DEDUPLICATIONUNION(3, "鍘婚噸骞堕泦"),  //鍘婚噸骞堕泦
+    ;
+
+    public Integer id;
+    public String desc;
+    RouteCollectCountType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static RouteCollectCountType get(Short id) {
+        if (null == id) {
+            return null;
+        }
+        for (RouteCollectCountType type : RouteCollectCountType.values()) {
+            if (type.id.equals(id.intValue())) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static RouteCollectCountType get(RouteCollectCountType type) {
+        if (null == type) {
+            return null;
+        }
+        for (RouteCollectCountType crnLiftPosType : RouteCollectCountType.values()) {
+            if (crnLiftPosType == type) {
+                return crnLiftPosType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/src/main/java/com/zy/core/enums/SlaveType.java b/src/main/java/com/zy/core/enums/SlaveType.java
index 56330fe..7f64d13 100644
--- a/src/main/java/com/zy/core/enums/SlaveType.java
+++ b/src/main/java/com/zy/core/enums/SlaveType.java
@@ -8,6 +8,7 @@
     Led,
     Scale,
     Car,
+    Rgv
     ;
 
     public static SlaveType findInstance(String s){
diff --git a/src/main/java/com/zy/core/model/RgvSlave.java b/src/main/java/com/zy/core/model/RgvSlave.java
new file mode 100644
index 0000000..5e6df0b
--- /dev/null
+++ b/src/main/java/com/zy/core/model/RgvSlave.java
@@ -0,0 +1,60 @@
+package com.zy.core.model;
+
+import com.zy.core.Slave;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by vincent on 2020/8/10
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class RgvSlave extends Slave {
+
+    private Integer rack;
+
+    private Integer slot;
+
+    private Integer offset;
+
+    private Boolean demo;
+
+    // RGV鍏ュ簱婧愮珯鐐�
+    private List<RgvStn> rgvInSStn = new ArrayList<>();
+
+    // RGV鍑哄簱婧愮珯鐐�
+    private List<RgvStn> rgvOutSStn = new ArrayList<>();
+
+    // RGV鍙犵洏
+    private List<RgvStn> rgvEmptyInSStn = new ArrayList<>();
+
+    // RGV绌烘澘鍏ュ簱
+    private List<RgvStn> rgvEmptyOutSStn = new ArrayList<>();
+
+    // RGV鍑哄簱鐩爣绔欑偣
+    private List<RgvStn> rgvDestStn = new ArrayList<>();
+
+    @Data
+    public static class RgvStn {
+
+        // 杈撻�佺嚎plc缂栧彿
+        private Integer devpPlcId;
+
+        // RGV绔欑偣缂栧彿
+        private Integer staNo;
+
+//        // 鎺�
+//        private Integer row;
+//
+//        // 鍒�
+//        private Integer bay;
+//
+//        // 灞�
+//        private Integer lev;
+
+    }
+
+}
diff --git a/src/main/java/com/zy/core/model/command/RgvCommand.java b/src/main/java/com/zy/core/model/command/RgvCommand.java
new file mode 100644
index 0000000..5be8072
--- /dev/null
+++ b/src/main/java/com/zy/core/model/command/RgvCommand.java
@@ -0,0 +1,129 @@
+package com.zy.core.model.command;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.zy.core.enums.RgvTaskModeType;
+import lombok.Data;
+
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * 鍫嗗灈鏈哄懡浠ゆ姤鏂�
+ * Created by vincent on 2020/8/11
+ */
+@Data
+public class RgvCommand {
+
+    // Rgv缂栧彿
+    private Integer rgvNo = 0;
+
+    // 宸ヤ綅1浠诲姟瀹屾垚纭浣�
+    private Short ackFinish1 = 0;
+
+    // 宸ヤ綅1浠诲姟鍙�
+    private Short taskNo1 = 0;
+
+    /**
+     * 浠诲姟妯″紡锛�
+     * 0 = 鏃�
+     * 1 = 鍙栬揣
+     * 2 = 鏀捐揣
+     * 3 = 鍙栨斁璐�
+     */
+    private Short taskMode1 = 0;
+
+    @JSONField(serialize = false)
+    private RgvTaskModeType taskModeType1;
+
+    /*
+    宸ヤ綅1婧愮珯
+     */
+    private Short sourceStaNo1 = 0;
+
+    /*
+    宸ヤ綅1鐩爣绔�
+     */
+    private Short destinationStaNo1 = 0;
+
+    //////////////////////     宸ヤ綅2瀹氫箟   //////////////////////////////////////////////////
+    // 宸ヤ綅1浠诲姟瀹屾垚纭浣�
+    private Short ackFinish2 = 0;
+
+    // 宸ヤ綅2浠诲姟鍙�
+    private Short taskNo2 = 0;
+
+    /**
+     * 浠诲姟妯″紡锛�
+     * 0 = 鏃�
+     * 1 = 鍙栬揣
+     * 2 = 鏀捐揣
+     * 3 = 鍙栨斁璐�
+     */
+    private Short taskMode2 = 0;
+
+    @JSONField(serialize = false)
+    private RgvTaskModeType taskModeType2;
+
+    /*
+    宸ヤ綅1婧愮珯
+     */
+    private Short sourceStaNo2 = 0;
+
+    /*
+    宸ヤ綅1鐩爣绔�
+     */
+    private Short destinationStaNo2 = 0;
+    ///////////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * 浠诲姟妯″紡锛�
+     * 0 = 鏈‘璁�
+     * 1 = 宸ヤ綅1浠诲姟纭
+     * 2 = 宸ヤ綅2浠诲姟纭
+     * 3 = 宸ヤ綅1銆�2浠诲姟鍚屾椂纭
+     */
+    private Short command = 0;
+
+    public void setTaskMode1(Short taskMode1){
+        this.taskMode1 = taskMode1;
+        this.taskModeType1 = RgvTaskModeType.get(taskModeType1);
+    }
+
+    public void setTaskMode1(RgvTaskModeType type1) {
+        this.taskModeType1 = type1;
+        this.taskMode1 = RgvTaskModeType.get(type1).id.shortValue();
+    }
+
+    public void setTaskMode2(Short taskMode2){
+        this.taskMode2 = taskMode2;
+        this.taskModeType2 = RgvTaskModeType.get(taskModeType2);
+    }
+
+    public void setTaskMode2(RgvTaskModeType type2) {
+        this.taskModeType2 = type2;
+        this.taskMode2 = RgvTaskModeType.get(type2).id.shortValue();
+    }
+
+    public static void main(String[] args) {
+        Date date = new Date();
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+
+        System.out.println(cal.get(Calendar.YEAR));
+        //榛樿浠�0-11
+        System.out.println(cal.get(Calendar.MONTH)+1);
+        System.out.println(cal.get(Calendar.DATE));
+        int hour = cal.get(Calendar.HOUR_OF_DAY);
+        System.out.println("鏃�");
+        System.out.println(hour);
+        int minute = cal.get(Calendar.MINUTE);
+        System.out.println("鍒�");
+        System.out.println(minute);
+        int second = cal.get(Calendar.SECOND);
+        System.out.println("绉�");
+        System.out.println(second);
+        int mm = cal.get(Calendar.DAY_OF_WEEK) - 1; // 鏄熸湡锛�0(鏃�)锝�6(鍏�)
+        System.out.println("绀兼嫓");
+        System.out.println(mm);
+    }
+}
diff --git a/src/main/java/com/zy/core/model/protocol/RgvProtocol.java b/src/main/java/com/zy/core/model/protocol/RgvProtocol.java
new file mode 100644
index 0000000..d952086
--- /dev/null
+++ b/src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -0,0 +1,210 @@
+package com.zy.core.model.protocol;
+
+import com.zy.asrs.entity.BasRgv;
+import com.zy.core.enums.RgvModeType;
+import com.zy.core.enums.RgvStatusType;
+import lombok.Data;
+
+/**
+ * Created by vincent on 2020/8/7
+ */
+@Data
+public class RgvProtocol {
+
+    private Integer RgvNo;
+
+    /**
+     * 1 = 鎵嬪姩妯″紡
+     * 2 = 鑷姩妯″紡
+     * 3 = 鐢佃剳妯″紡
+     */
+    public Short mode;
+
+    public RgvModeType modeType;
+
+    /**
+     * RGV褰撳墠鐘舵��
+     * 0锛氱┖闂诧紝鏃犱换鍔�
+     * 1锛氫綔涓氫腑
+     * 2锛氭姤璀�
+     */
+    public Short status;
+
+    /**
+     * 鐘舵�佹灇涓�
+     */
+    public RgvStatusType statusType;
+
+    /**
+     * 宸ヤ綅1浠诲姟鍙�
+     */
+    public Short taskNo1 = 0;
+
+    /**
+     * RGV宸ヤ綅1褰撳墠鐘舵��
+     * 0锛氱┖闂诧紝鏃犱换鍔�
+     * 11锛氬彇璐т腑
+     * 12锛氭斁璐т腑
+     * 10锛氫换鍔″畬鎴愮瓑寰匴CS纭
+     */
+    public Short status1;
+
+    /**
+     * 鐘舵�佹灇涓�
+     */
+    public RgvStatusType statusType1;
+
+    /**
+     * 宸ヤ綅1鏈夌墿
+     */
+    public Short loaded1;
+
+    /**
+     * RGV褰撳墠浣嶇疆
+     */
+    public Short RgvPos;
+
+    /**
+     * 璧拌鍦ㄥ畾浣�
+     * 0 = 鍦ㄥ畾浣�
+     * 1 = 涓嶅湪瀹氫綅
+     */
+    public Short walkPos;
+
+    //////////////////////     宸ヤ綅2瀹氫箟   //////////////////////////////////////////////////
+    /**
+     * 宸ヤ綅2浠诲姟鍙�
+     */
+    public Short taskNo2 = 0;
+
+    /**
+     * RGV宸ヤ綅2褰撳墠鐘舵��
+     * 0锛氱┖闂诧紝鏃犱换鍔�
+     * 11锛氬彇璐т腑
+     * 12锛氭斁璐т腑
+     * 10锛氫换鍔″畬鎴愮瓑寰匴CS纭
+     */
+    public Short status2;
+
+    /**
+     * 鐘舵�佹灇涓�
+     */
+    public RgvStatusType statusType2;
+
+    /**
+     * 宸ヤ綅2鏈夌墿
+     */
+    public Short loaded2;
+    ///////////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * 寮傚父鐮�
+     */
+    public Short alarm;
+
+    /**
+     * 蹇冭烦鎸囦护 1-2姣忕鍒囨崲涓�娆�
+     */
+    public Short heart;
+
+    private Short temp1;
+
+    private Short temp2;
+
+    private Short temp3;
+
+    private Short temp4;
+
+    private Short temp5;
+
+    /**
+     * X琛岃蛋琛岄�熷害m/min
+     */
+    private Float xSpeed;
+
+    /**
+     * 鍫嗗灈鏈虹疮璁¤蛋琛岃窛绂籯m
+     */
+    public Float xDistance;
+
+    /**
+     * 鍫嗗灈鏈虹疮璁¤蛋琛屾椂闀縣
+     */
+    public Float xDuration;
+
+    public void setMode(Short mode) {
+        this.mode = mode;
+        this.modeType = RgvModeType.get(mode);
+    }
+
+    public void setMode(RgvModeType type) {
+        this.modeType = type;
+        this.mode = RgvModeType.get(type).id.shortValue();
+    }
+
+    public void setStatus(Short status){
+        this.status = status;
+        this.statusType = RgvStatusType.get(status);
+    }
+
+    public void setStatus(RgvStatusType type){
+        this.statusType = type;
+        this.status = RgvStatusType.get(type).id.shortValue();
+    }
+
+    public void setStatus1(Short status1){
+        this.status1 = status1;
+        this.statusType1 = RgvStatusType.get(status1);
+    }
+
+    public void setStatus1(RgvStatusType type1){
+        this.statusType1 = type1;
+        this.status1 = RgvStatusType.get(type1).id.shortValue();
+    }
+
+    public void setStatus2(Short status2){
+        this.status2 = status2;
+        this.statusType2 = RgvStatusType.get(status2);
+    }
+
+    public void setStatus2(RgvStatusType type2){
+        this.statusType2 = type2;
+        this.status2 = RgvStatusType.get(type2).id.shortValue();
+    }
+
+    /**
+     * 鏈�杩戜竴娆″叆鍑哄簱绫诲瀷
+     *       I:鍏ュ簱
+     *       O:鍑哄簱
+     */
+    private String lastIo = "I";
+
+
+    public BasRgv toSqlModel(BasRgv basRgv){
+        if (alarm!=null) {
+            basRgv.setRgvErr(alarm.longValue());
+        }
+        basRgv.setWrkNo1(taskNo1.intValue());
+        basRgv.setWrkNo2(taskNo2.intValue());
+        return basRgv;
+    }
+
+    public void setxSpeed(Short xSpeed) {
+        this.xSpeed = Float.valueOf(xSpeed);
+    }
+
+    public void setxDistance(Short xDistance) {
+        this.xDistance = Float.valueOf(xDistance);
+    }
+
+    public void setxDuration(Short xDuration) {
+        this.xDuration = Float.valueOf(xDuration);
+    }
+
+    public Integer getRgvPosI(){
+        //闇�瑕佹牴鎹幇鍦烘敼閫�  鏍规嵁璇诲埌鐨勫�艰幏鍙栧搴旂珯鐐逛綅缃�
+        if (RgvPos==null) return 0;
+        return RgvPos.intValue();
+    }
+
+}
diff --git a/src/main/java/com/zy/core/properties/SlaveProperties.java b/src/main/java/com/zy/core/properties/SlaveProperties.java
index b2e19a4..52badea 100644
--- a/src/main/java/com/zy/core/properties/SlaveProperties.java
+++ b/src/main/java/com/zy/core/properties/SlaveProperties.java
@@ -4,6 +4,7 @@
 import com.zy.core.model.CrnSlave;
 import com.zy.core.model.DevpSlave;
 import com.zy.core.model.LedSlave;
+import com.zy.core.model.RgvSlave;
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
@@ -42,4 +43,6 @@
 
     private List<Slave> car = new ArrayList<>();
 
+    private List<RgvSlave> rgv = new ArrayList<>();
+
 }
diff --git a/src/main/java/com/zy/core/thread/RgvThread.java b/src/main/java/com/zy/core/thread/RgvThread.java
new file mode 100644
index 0000000..6c259f9
--- /dev/null
+++ b/src/main/java/com/zy/core/thread/RgvThread.java
@@ -0,0 +1,465 @@
+package com.zy.core.thread;
+
+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;
+import com.core.common.SpringUtils;
+import com.zy.asrs.entity.BasRgv;
+import com.zy.asrs.entity.BasRgvOpt;
+import com.zy.asrs.service.BasRgvOptService;
+import com.zy.asrs.service.BasRgvService;
+import com.zy.core.ThreadHandler;
+import com.zy.core.cache.MessageQueue;
+import com.zy.core.cache.OutputQueue;
+import com.zy.core.enums.RgvStatusType;
+import com.zy.core.enums.RgvTaskModeType;
+import com.zy.core.enums.SlaveType;
+import com.zy.core.model.RgvSlave;
+import com.zy.core.model.Task;
+import com.zy.core.model.command.RgvCommand;
+import com.zy.core.model.protocol.RgvProtocol;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+import java.text.MessageFormat;
+import java.util.Date;
+
+/**
+ * RGV绾跨▼
+ * Created by vincent on 2022/11/29
+ */
+@Data
+@Slf4j
+public class RgvThread implements Runnable, ThreadHandler {
+
+    private SiemensS7Net siemensNet;
+    private RgvSlave slave;
+    private RgvProtocol rgvProtocol;
+    /**
+     * 宸ヤ綅1澶嶄綅淇″彿
+     */
+    private boolean resetFlag1 = false;
+    /**
+     * 宸ヤ綅2澶嶄綅淇″彿
+     */
+    private boolean resetFlag2 = false;
+
+    public RgvThread(RgvSlave slave) {
+        this.slave = slave;
+    }
+
+    @Override
+    @SuppressWarnings("InfiniteLoopStatement")
+    public void run() {
+        this.connect();
+        while (true) {
+            try {
+                int step = 1;
+                Task task = MessageQueue.poll(SlaveType.Rgv, slave.getId());
+                if (task != null) {
+                    step = task.getStep();
+                }
+                switch (step) {
+                    // 璇绘暟鎹�
+                    case 1:
+                        readStatus();
+                        break;
+                    // 宸ヤ綅1銆�2鍐欏叆鏁版嵁
+                    case 2:
+                        write((RgvCommand) task.getData());
+                        break;
+                    //宸ヤ綅1鍐欏叆鏁版嵁
+                    case 4:
+                        write1((RgvCommand) task.getData());
+                        break;
+                    //宸ヤ綅2鍐欏叆鏁版嵁
+                    case 5:
+                        write2((RgvCommand) task.getData());
+                        break;
+                    // 澶嶄綅
+                    case 3:
+                        RgvCommand command = (RgvCommand) task.getData();
+                        if (null == command) {
+                            command = new RgvCommand();
+                        }
+                        command.setRgvNo(slave.getId()); // RGV缂栧彿
+                        command.setTaskNo1((short) 0); // 宸ヤ綔鍙�
+                        command.setAckFinish1((short) 1);  // 浠诲姟瀹屾垚纭浣�
+                        command.setTaskMode1(RgvTaskModeType.NONE); // 浠诲姟妯″紡
+                        command.setSourceStaNo1((short)0);     // 婧愮珯
+                        command.setDestinationStaNo1((short)0);     // 鐩爣绔�
+                        command.setTaskNo2((short) 0); // 宸ヤ綔鍙�
+                        command.setAckFinish2((short) 1);  // 浠诲姟瀹屾垚纭浣�
+                        command.setTaskMode2(RgvTaskModeType.NONE); // 浠诲姟妯″紡
+                        command.setSourceStaNo2((short)0);     // 婧愮珯
+                        command.setDestinationStaNo2((short)0);     // 鐩爣绔�
+                        command.setCommand((short)0);
+                        write(command);
+                        break;
+                    // 鍥炲師鐐�  閬胯
+                    case 9:
+                        RgvCommand commandAvoidanceXY = (RgvCommand) task.getData();
+                        if (null == commandAvoidanceXY) {
+                            commandAvoidanceXY = new RgvCommand();
+                        }
+                        commandAvoidanceXY.setRgvNo(slave.getId()); // RGV缂栧彿
+                        commandAvoidanceXY.setTaskNo1((short) 9999); // 宸ヤ綔鍙�
+                        commandAvoidanceXY.setAckFinish1((short) 1);  // 浠诲姟瀹屾垚纭浣�
+                        commandAvoidanceXY.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 浠诲姟妯″紡
+                        commandAvoidanceXY.setSourceStaNo1((short)0);     // 婧愮珯
+                        commandAvoidanceXY.setDestinationStaNo1((short)0);     // 鐩爣绔�
+                        commandAvoidanceXY.setTaskNo2((short) 0); // 宸ヤ綔鍙�
+                        commandAvoidanceXY.setAckFinish2((short) 1);  // 浠诲姟瀹屾垚纭浣�
+                        commandAvoidanceXY.setTaskMode2(RgvTaskModeType.GO_ORIGIN); // 浠诲姟妯″紡
+                        commandAvoidanceXY.setSourceStaNo2((short)0);     // 婧愮珯
+                        commandAvoidanceXY.setDestinationStaNo2((short)0);     // 鐩爣绔�
+                        commandAvoidanceXY.setCommand((short)0);
+                        write(commandAvoidanceXY);
+                        break;
+                    default:
+                        break;
+                }
+                Thread.sleep(500);
+            } catch (Exception e) {
+//                e.printStackTrace();
+            }
+
+        }
+    }
+
+    /**
+     * 鍒濆鍖朢GV鐘舵��
+     */
+    private void initRgv() {
+        if (null == rgvProtocol) {
+            rgvProtocol = new RgvProtocol();
+        }
+        rgvProtocol.setMode((short) -1);
+        rgvProtocol.setStatus((short)-1);
+        rgvProtocol.setTaskNo1((short)0);
+        rgvProtocol.setStatus1((short)-1);
+        rgvProtocol.setLoaded1((short)0);
+        rgvProtocol.setWalkPos((short)0);
+        rgvProtocol.setRgvPos((short)0);
+        rgvProtocol.setTaskNo2((short)0);
+        rgvProtocol.setStatus2((short)-1);
+        rgvProtocol.setLoaded2((short)0);
+        rgvProtocol.setAlarm((short)0);
+        rgvProtocol.setxSpeed((short) 0);
+        rgvProtocol.setxDistance((short) 0);
+        rgvProtocol.setxDuration((short) 0);
+    }
+
+    @Override
+    public boolean connect() {
+        boolean result = false;
+        siemensNet = new SiemensS7Net(SiemensPLCS.S1200, slave.getIp());
+        siemensNet.setRack(slave.getRack().byteValue());
+        siemensNet.setSlot(slave.getSlot().byteValue());
+        OperateResult connect = siemensNet.ConnectServer();
+        if(connect.IsSuccess){
+            result = true;
+            OutputQueue.RGV.offer(MessageFormat.format( "銆恵0}銆慠GV plc杩炴帴鎴愬姛 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
+            log.info("RGV plc杩炴帴鎴愬姛 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
+        } else {
+            OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆慠GV plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
+            log.error("RGV plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
+            initRgv();
+        }
+//        siemensNet.ConnectClose();
+        return result;
+    }
+
+    /**
+     * 璇诲彇鐘舵��
+     */
+    private void readStatus(){
+        try {
+            OperateResultExOne<byte[]> result = siemensNet.Read("DB1.0", (short) 34);
+            if (result.IsSuccess) {
+                if (null == rgvProtocol) {
+                    rgvProtocol = new RgvProtocol();
+                    rgvProtocol.setRgvNo(slave.getId());
+                }
+                rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0));
+                rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 2));
+                rgvProtocol.setTaskNo1(siemensNet.getByteTransform().TransInt16(result.Content, 4));
+                rgvProtocol.setStatus1(siemensNet.getByteTransform().TransInt16(result.Content, 6));
+                rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransInt16(result.Content, 8));
+                rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt16(result.Content, 10));
+                rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 12));
+                rgvProtocol.setTaskNo2(siemensNet.getByteTransform().TransInt16(result.Content, 14));
+                rgvProtocol.setStatus2(siemensNet.getByteTransform().TransInt16(result.Content, 16));
+                rgvProtocol.setLoaded2(siemensNet.getByteTransform().TransInt16(result.Content, 18));
+                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 20));
+                rgvProtocol.setHeart(siemensNet.getByteTransform().TransInt16(result.Content, 22));
+                rgvProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 24));
+                rgvProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 26));
+                rgvProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 28));
+                rgvProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 30));
+                rgvProtocol.setTemp5(siemensNet.getByteTransform().TransInt16(result.Content, 32));
+//                rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 28));
+//                rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 40));
+//                rgvProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 48));
+
+                OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛", DateUtils.convert(new Date()), slave.getId()));
+
+                // 宸ヤ綅1澶嶄綅淇″彿
+                if (rgvProtocol.getStatusType1().equals(RgvStatusType.WAITING)
+                        || rgvProtocol.getStatusType1().equals(RgvStatusType.FETCHWAITING)) {
+                    if (resetFlag1) {
+                        RgvCommand rgvCommand = new RgvCommand();
+                        rgvCommand.setAckFinish1((short)1);
+                        if (write(rgvCommand)) {
+                            resetFlag1 = false;
+                        }
+                    }
+                }
+
+                // 宸ヤ綅2澶嶄綅淇″彿
+                if (rgvProtocol.getStatusType2().equals(RgvStatusType.WAITING)
+                        || rgvProtocol.getStatusType2().equals(RgvStatusType.FETCHWAITING)) {
+                    if (resetFlag2) {
+                        RgvCommand rgvCommand = new RgvCommand();
+                        rgvCommand.setAckFinish2((short)1);
+                        if (write(rgvCommand)) {
+                            resetFlag2 = false;
+                        }
+                    }
+                }
+
+                try {
+                    // 鏍规嵁瀹炴椂淇℃伅鏇存柊鏁版嵁搴�
+                    BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class);
+                    BasRgv basRgv = new BasRgv();
+                    basRgv.setRgvNo(slave.getId());
+                    basRgv.setRgvSts((int)rgvProtocol.getMode());
+                    if (!basRgvService.updateById(rgvProtocol.toSqlModel(basRgv))){
+                        log.error("RGV plc鏁版嵁搴撴洿鏂板け璐� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
+                    }
+                } catch (Exception ignore){
+                    System.out.println(ignore);
+                }
+
+            } else {
+                initRgv();
+                OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆戣鍙朢GV plc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
+                log.error("璇诲彇RGV plc鐘舵�佷俊鎭け璐� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆戣鍙朢GV plc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            log.error("璇诲彇RGV plc鐘舵�佷俊鎭け璐� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+            initRgv();
+        }
+    }
+
+    /**
+     * 宸ヤ綅1銆�2鍚屾椂鍐欏叆鏁版嵁
+     */
+    private boolean write(RgvCommand command) throws InterruptedException {
+        if (null == command) {
+            log.error("RGV鍐欏叆鍛戒护涓虹┖");
+            return false;
+        }
+//        convertRow(command);
+        command.setRgvNo(slave.getId());
+        short[] array = new short[11];
+        array[0] = command.getAckFinish1();
+        array[1] = command.getTaskNo1();
+        array[2] = command.getTaskMode1();
+        array[3] = command.getSourceStaNo1();
+        array[4] = command.getDestinationStaNo1();
+        array[5] = command.getAckFinish2();
+        array[6] = command.getTaskNo2();
+        array[7] = command.getTaskMode2();
+        array[8] = command.getSourceStaNo2();
+        array[9] = command.getDestinationStaNo2();
+        array[10] = command.getCommand();
+        OperateResult result = siemensNet.Write("DB100.0", array);
+
+        if (command.getAckFinish1() == 0 && command.getAckFinish2() == 0) {
+            short commandFinish = 3;  //宸ヤ綅1銆�2浠诲姟鍚屾椂鍐欏叆
+            Thread.sleep(100L);
+            result = siemensNet.Write("DB100.20", commandFinish);
+        }
+
+        try {
+            // 鏃ュ織璁板綍
+            BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
+            BasRgvOpt basRgvOpt = new BasRgvOpt(
+                    command.getTaskNo1().intValue(),
+                    command.getTaskNo2().intValue(),
+                    command.getRgvNo(),
+                    new Date(),
+                    command.getTaskModeType1().toString(),
+                    command.getSourceStaNo1().intValue(),
+                    command.getDestinationStaNo1().intValue(),
+                    command.getSourceStaNo2().intValue(),
+                    command.getDestinationStaNo2().intValue(),
+                    null,
+                    new Date(),
+                    null
+            );
+            bean.insert(basRgvOpt);
+        } catch (Exception ignore) {}
+
+        if (result != null && result.IsSuccess) {
+            Thread.sleep(200);
+            this.readStatus();
+            log.info("RGV 鍛戒护涓嬪彂[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
+            OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆慬id:{1}] >>>>> 鍛戒护涓嬪彂锛� {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
+            return true;
+        } else {
+            OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆戝啓鍏GV plc鏁版嵁澶辫触 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            log.error("鍐欏叆RGV plc鏁版嵁澶辫触 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+            return false;
+        }
+    }
+
+    /**
+     * 宸ヤ綅1鍐欏叆鏁版嵁
+     */
+    private boolean write1(RgvCommand command) throws InterruptedException {
+        if (null == command) {
+            log.error("RGV鍐欏叆鍛戒护涓虹┖");
+            return false;
+        }
+
+        siemensNet.Write("DB100.20", command.getCommand());
+
+        command.setRgvNo(slave.getId());
+        short[] array = new short[5];
+        array[0] = command.getAckFinish1();
+        array[1] = command.getTaskNo1();
+        array[2] = command.getTaskMode1();
+        array[3] = command.getSourceStaNo1();
+        array[4] = command.getDestinationStaNo1();
+        siemensNet.Write("DB100.20", command.getCommand());
+
+        OperateResult result = siemensNet.Write("DB100.0", array);
+
+        if (command.getAckFinish1() == 0) {
+            short commandFinish = 1;  //宸ヤ綅1浠诲姟鍐欏叆
+            Thread.sleep(100L);
+            result = siemensNet.Write("DB100.20", commandFinish);
+        }
+
+        try {
+            // 鏃ュ織璁板綍
+            BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
+            BasRgvOpt basRgvOpt = new BasRgvOpt(
+                    command.getTaskNo1().intValue(),
+                    command.getTaskNo2().intValue(),
+                    command.getRgvNo(),
+                    new Date(),
+                    command.getTaskModeType1().toString(),
+                    command.getSourceStaNo1().intValue(),
+                    command.getDestinationStaNo1().intValue(),
+                    command.getSourceStaNo2().intValue(),
+                    command.getDestinationStaNo2().intValue(),
+                    null,
+                    new Date(),
+                    null
+            );
+            bean.insert(basRgvOpt);
+        } catch (Exception ignore) {}
+
+        if (result != null && result.IsSuccess) {
+            Thread.sleep(200);
+            this.readStatus();
+            log.info("RGV 宸ヤ綅1鍛戒护涓嬪彂[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
+            OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆慬id:{1}] >>>>> 宸ヤ綅1鍛戒护涓嬪彂锛� {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
+            return true;
+        } else {
+            OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆戝啓鍏GV plc宸ヤ綅1鏁版嵁澶辫触 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            log.error("鍐欏叆RGV plc宸ヤ綅1鏁版嵁澶辫触 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+            return false;
+        }
+    }
+
+    /**
+     * 宸ヤ綅2鍐欏叆鏁版嵁
+     */
+    private boolean write2(RgvCommand command) throws InterruptedException {
+        if (null == command) {
+            log.error("RGV鍐欏叆鍛戒护涓虹┖");
+            return false;
+        }
+
+        command.setRgvNo(slave.getId());
+        short[] array = new short[6];
+        array[0] = command.getAckFinish2();
+        array[1] = command.getTaskNo2();
+        array[2] = command.getTaskMode2();
+        array[3] = command.getSourceStaNo2();
+        array[4] = command.getDestinationStaNo2();
+        array[5] = command.getCommand();
+
+        OperateResult result = siemensNet.Write("DB100.10", array);
+
+        if (command.getAckFinish2() == 0) {
+            short commandFinish = 2;  //宸ヤ綅2浠诲姟鍐欏叆
+            Thread.sleep(100L);
+            result = siemensNet.Write("DB100.20", commandFinish);
+        }
+
+        try {
+            // 鏃ュ織璁板綍
+            BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
+            BasRgvOpt basRgvOpt = new BasRgvOpt(
+                    command.getTaskNo1().intValue(),
+                    command.getTaskNo2().intValue(),
+                    command.getRgvNo(),
+                    new Date(),
+                    command.getTaskModeType1().toString(),
+                    command.getSourceStaNo1().intValue(),
+                    command.getDestinationStaNo1().intValue(),
+                    command.getSourceStaNo2().intValue(),
+                    command.getDestinationStaNo2().intValue(),
+                    null,
+                    new Date(),
+                    null
+            );
+            bean.insert(basRgvOpt);
+        } catch (Exception ignore) {}
+
+        if (result != null && result.IsSuccess) {
+            Thread.sleep(200);
+            this.readStatus();
+            log.info("RGV 宸ヤ綅2鍛戒护涓嬪彂[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
+            OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆慬id:{1}] >>>>> 宸ヤ綅2鍛戒护涓嬪彂锛� {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
+            return true;
+        } else {
+            OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆戝啓鍏GV plc宸ヤ綅2鏁版嵁澶辫触 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            log.error("鍐欏叆RGV plc宸ヤ綅2鏁版嵁澶辫触 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+            return false;
+        }
+    }
+
+    @Override
+    public void close() {
+        siemensNet.ConnectClose();
+    }
+
+    /******************************************************************************************/
+    /**************************************** 娴嬭瘯涓撶敤 *****************************************/
+    /*****************************************************************************************/
+    public static void main(String[] args) throws InterruptedException {
+        RgvSlave slave = new RgvSlave();
+        slave.setId(1);
+        slave.setIp("192.168.6.9");
+        slave.setRack(0);
+        slave.setSlot(0);
+        RgvThread rgvThread = new RgvThread(slave);
+        rgvThread.connect();
+        rgvThread.readStatus();
+        System.out.println(JSON.toJSONString(rgvThread.rgvProtocol));
+        Thread.sleep(3000L);
+
+    }
+
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 9b7d942..6bd3e0b 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,5 +1,5 @@
 server:
-  port: 9090
+  port: 9091
   servlet:
     context-path: /@pom.build.finalName@
 
@@ -140,6 +140,63 @@
       row: 23
       bay: 1
       lev: 1
+
+  # RGV绌挎杞�1
+  rgv[0]:
+    id: 1
+    ip: 192.168.4.250
+    port: 502
+    rack: 0
+    slot: 0
+    #RGV鍏ュ簱婧愮珯鐐�
+    rgvInSStn[0]:
+      devpPlcId: ${wcs-slave.devp[0].id}
+      staNo: 100
+    rgvInSStn[1]:
+      devpPlcId: ${wcs-slave.devp[0].id}
+      staNo: 101
+    #RGV鍑哄簱婧愮珯鐐�
+    rgvOutSStn[0]:
+      devpPlcId: ${wcs-slave.devp[0].id}
+      staNo: 110
+    rgvOutSStn[1]:
+      devpPlcId: ${wcs-slave.devp[0].id}
+      staNo: 112
+    #RGV鐩爣绔欑偣
+    rgvDestStn[0]:
+      devpPlcId: ${wcs-slave.devp[0].id}
+      staNo: 102
+    rgvDestStn[1]:
+      devpPlcId: ${wcs-slave.devp[0].id}
+      staNo: 103
+  # RGV绌挎杞�2
+  rgv[1]:
+    id: 2
+    ip: 192.168.4.250
+    port: 502
+    rack: 0
+    slot: 0
+    #RGV鍏ュ簱婧愮珯鐐�
+    rgvInSStn[0]:
+      devpPlcId: ${wcs-slave.devp[0].id}
+      staNo: 100
+    rgvInSStn[1]:
+      devpPlcId: ${wcs-slave.devp[0].id}
+      staNo: 101
+    #RGV鍑哄簱婧愮珯鐐�
+    rgvOutSStn[0]:
+      devpPlcId: ${wcs-slave.devp[0].id}
+      staNo: 110
+    rgvOutSStn[1]:
+      devpPlcId: ${wcs-slave.devp[0].id}
+      staNo: 112
+    #RGV鐩爣绔欑偣
+    rgvDestStn[0]:
+      devpPlcId: ${wcs-slave.devp[0].id}
+      staNo: 102
+    rgvDestStn[1]:
+      devpPlcId: ${wcs-slave.devp[0].id}
+      staNo: 103
   # 杈撻�佺嚎1
   devp[0]:
     id: 1
diff --git a/src/main/resources/mapper/BasRgvErrMapper.xml b/src/main/resources/mapper/BasRgvErrMapper.xml
new file mode 100644
index 0000000..c3eb284
--- /dev/null
+++ b/src/main/resources/mapper/BasRgvErrMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.mapper.BasRgvErrMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasRgvErr">
+        <result column="error_code" property="errorCode" />
+        <result column="err_name" property="errName" />
+        <result column="modi_user" property="modiUser" />
+        <result column="modi_time" property="modiTime" />
+        <result column="appe_user" property="appeUser" />
+        <result column="appe_time" property="appeTime" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/BasRgvMapMapper.xml b/src/main/resources/mapper/BasRgvMapMapper.xml
new file mode 100644
index 0000000..a4f5bae
--- /dev/null
+++ b/src/main/resources/mapper/BasRgvMapMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.mapper.BasRgvMapMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasRgvMap">
+        <result column="rgv_no" property="rgvNo" />
+        <result column="start_route" property="startRoute" />
+        <result column="end_route" property="endRoute" />
+        <result column="now_route" property="nowRoute" />
+        <result column="rgv_status" property="rgvStatus" />
+        <result column="lock_start_route" property="lockStartRoute" />
+        <result column="lock_end_route" property="lockEndRoute" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/BasRgvMapper.xml b/src/main/resources/mapper/BasRgvMapper.xml
new file mode 100644
index 0000000..a826fab
--- /dev/null
+++ b/src/main/resources/mapper/BasRgvMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.mapper.BasRgvMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasRgv">
+        <result column="rgv_no" property="rgvNo" />
+        <result column="in_enable" property="inEnable" />
+        <result column="out_enable" property="outEnable" />
+        <result column="rgv_sts" property="rgvSts" />
+        <result column="wrk_no1" property="wrkNo1" />
+        <result column="wrk_no2" property="wrkNo2" />
+        <result column="rgv_err" property="rgvErr" />
+        <result column="pak_mk" property="pakMk" />
+        <result column="status" property="status" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="memo" property="memo" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/BasRgvOptMapper.xml b/src/main/resources/mapper/BasRgvOptMapper.xml
new file mode 100644
index 0000000..febd94a
--- /dev/null
+++ b/src/main/resources/mapper/BasRgvOptMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.mapper.BasRgvOptMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasRgvOpt">
+        <result column="id" property="id" />
+        <result column="wrk_no" property="wrkNo" />
+        <result column="rgv_no" property="rgvNo" />
+        <result column="send_time" property="sendTime" />
+        <result column="mode" property="mode" />
+        <result column="source_row" property="sourceRow" />
+        <result column="source_bay" property="sourceBay" />
+        <result column="source_lev" property="sourceLev" />
+        <result column="source_sta" property="sourceSta" />
+        <result column="pos_row" property="posRow" />
+        <result column="pos_bay" property="posBay" />
+        <result column="pos_lev" property="posLev" />
+        <result column="pos_sta" property="posSta" />
+        <result column="response" property="response" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="memo" property="memo" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/WrkMastStaMapper.xml b/src/main/resources/mapper/WrkMastStaMapper.xml
new file mode 100644
index 0000000..12ec111
--- /dev/null
+++ b/src/main/resources/mapper/WrkMastStaMapper.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.mapper.WrkMastStaMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.WrkMastSta">
+        <id column="id" property="id" />
+        <result column="wrk_no" property="wrkNo" />
+        <result column="wrk_start" property="wrkStart" />
+        <result column="wrk_end" property="wrkEnd" />
+        <result column="sta_start" property="staStart" />
+        <result column="sta_end" property="staEnd" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="type" property="type" />
+        <result column="wrk_sts" property="wrkSts" />
+        <result column="line_number" property="lineNumber" />
+        <result column="wrk_type" property="wrkType" />
+        <result column="bign_time" property="bignTime" />
+
+    </resultMap>
+
+    <select id="selectAllWrkMastStaList" resultMap="BaseResultMap">
+        select * from asr_wrk_mast_sta
+        where 1=1
+        and wrk_sts=0
+        <if test="type!=null">
+            and type = #{type}
+        </if>
+        order by line_number,id
+    </select>
+
+    <select id="selectByWrkNo" resultMap="BaseResultMap">
+        select top 1 * from asr_wrk_mast_sta
+        where 1=1
+        and wrk_no = #{wrkNo}
+    </select>
+
+    <select id="selectNoInterfere" resultMap="BaseResultMap">
+        select top 1 * from asr_wrk_mast_sta
+        where 1=1
+        and (sta_start in
+        <foreach item="item" collection="staStarts" index="index" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+        or sta_start = 0
+        )
+        and (sta_end in
+        <foreach item="item" collection="staEnds" index="index" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+        or sta_end = 0
+        )
+        and wrk_sts=0
+        order by line_number,id
+    </select>
+
+    <select id="selectNoInterfereList" resultMap="BaseResultMap">
+        select * from asr_wrk_mast_sta
+        where 1=1
+        and (sta_start in
+        <foreach item="item" collection="staStarts" index="index" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+        or sta_start = 0
+        )
+        and (sta_end in
+        <foreach item="item" collection="staEnds" index="index" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+        or sta_end = 0
+        )
+        and wrk_sts=0
+        order by line_number,id
+    </select>
+
+    <select id="selectAllWrkCount" resultType="java.lang.Integer">
+        select count(1) from asr_wrk_mast_sta
+        where 1=1
+        <if test="type!=null">
+            and type = #{type}
+        </if>
+    </select>
+
+    <select id="selectAllWrkStsCount" resultType="java.lang.Integer">
+        select count(1) from asr_wrk_mast_sta
+        where 1=1
+        <if test="type!=null">
+            and type = #{type}
+        </if>
+        <if test="wrkSts!=null">
+            and wrk_sts = #{wrkSts}
+        </if>
+    </select>
+
+
+
+
+</mapper>
diff --git a/src/main/webapp/static/css/rgv.css b/src/main/webapp/static/css/rgv.css
new file mode 100644
index 0000000..bd49d5b
--- /dev/null
+++ b/src/main/webapp/static/css/rgv.css
@@ -0,0 +1,252 @@
+body {
+    background-color: #6CA7A8;
+}
+.button-window {
+    float: left;
+    width: 100%;
+    height: 100%;
+    padding: 10px;
+    border-radius: 5px;
+    box-shadow: 0 0 3px rgba(0 0 0 .3);
+}
+/* -------------------- 绗竴妯″潡 -------------------- */
+.log-board {
+    background-color: #fff;
+    border-radius: 5px;
+    box-shadow: 0 0 3px rgba(0,0,0,.3);
+    height: 28%;
+}
+
+/* 宸� */
+.command-log {
+    float: left;
+    height: 100%;
+    width: 20%;
+    text-align: center;
+}
+.command-log h2 {
+    padding: 10px;
+}
+.rgv-command-item {
+    padding: 4px 0;
+}
+.rgv-command-item label {
+    font-size: 20px;
+    font-weight: bold;
+    vertical-align: middle;
+}
+.rgv-command-item span {
+    display: inline-block;
+    width: 20px;
+    height: 20px;
+    background-color: #2e9926;
+    border-radius: 5px;
+    vertical-align: middle;
+}
+.rgv-command-item input {
+    vertical-align: middle;
+    outline: none;
+    width: 60%;
+}
+
+/* 鍙� */
+.rgv-state {
+    float: left;
+    height: 100%;
+    width: 100%;
+    overflow: auto;
+}
+/* 鍫嗗灈鏈虹姸鎬佽〃 */
+#rgv-state-table {
+    font-size: 12px;
+    border-collapse: collapse;
+    margin: 0 auto;
+    text-align: center;
+}
+#rgv-state-table td, #rgv-state-table th {
+    border: 1px solid #cad9ea;
+    color: #666;
+    height: 25px;
+}
+#rgv-state-table thead th {
+    background-color: #CCE8EB;
+    width: 300px;
+}
+#rgv-state-table tr:nth-child(odd) {
+    background: #fff;
+}
+#rgv-state-table tr:nth-child(even) {
+    background: #F5FAFA;
+}
+
+/* -------------------- 绗簩妯″潡 -------------------- */
+.rgv-msg {
+    /*overflow: auto;*/
+    margin-top: 10px;
+    height: 23%;
+    background-color: #fff;
+    border-radius: 5px;
+    box-shadow: 0 0 3px rgba(0,0,0,.3);
+}
+/* 鍫嗗灈鏈虹姸鎬佷俊鎭〃 */
+#rgv-msg-table {
+    font-size: 12px;
+    border-collapse: collapse;
+    margin: 0 auto;
+    text-align: center;
+}
+#rgv-msg-table td, #rgv-msg-table th {
+    border: 1px solid #f1f1f1;
+    color: #666;
+    height: 30px;
+}
+#rgv-msg-table thead th {
+    background-color: #fff;
+    width: 400px;
+}
+#rgv-msg-table tr:nth-child(odd) {
+    background: #fff;
+}
+#rgv-msg-table tr:nth-child(even) {
+    background: #fff;
+}
+
+/* -------------------- 绗笁妯″潡 -------------------- */
+.rgv-operation {
+    position: relative;
+    margin-top: 10px;
+    height: 25%;
+    background-color: #fff;
+    border-radius: 5px;
+    box-shadow: 0 0 3px rgba(0,0,0,.3);
+}
+
+/* 浠诲姟璁惧閫夋嫨妗� */
+.task-select {
+    height: 50%;
+    overflow: hidden;
+    padding: 20px 0 10px 20px;
+}
+.operator-item {
+    display: inline-block;
+    height: 100%;
+    width: 20%;
+    text-align: center;
+    position: relative;
+    vertical-align: middle;
+    padding: 10px 0px 10px 50px;
+}
+.operator-item .select-title {
+    display: inline-block;
+    position: absolute;
+    top: -11px;
+    left: 50%;
+    transform: translate(-50%, 0);
+    background-color: #fff;
+    color: #2e95d3;
+    font-size: 12px;
+    border: 1px solid #8d8d8d;
+    border-radius: 5px;
+    padding: 5px;
+    z-index: 999;
+}
+.operator-item .select-container {
+    padding: 10px 0;
+    height: 100%;
+    border: 1px solid #8d8d8d;
+    border-radius: 5px;
+}
+#rgv-select .select-container label {
+    display: inline-block;
+    padding: 0 20px;
+    vertical-align: middle; margin-top:-2px; margin-bottom:1px;
+
+}
+.select-container input {
+    display: inline-block;
+    font-size: 12px;
+    vertical-align: middle; margin-top:-2px; margin-bottom:1px;
+}
+.select-container-item {
+    display: inline-block;
+    margin: 0px auto;
+    padding: 0;
+}
+.select-container-item input {
+    height: 20px;
+    border: 1px solid #8D8D8D;
+    border-radius: 3px;
+    width: 80px;
+    outline: none;
+}
+
+/* 浠诲姟浣滀笟閫夋嫨妗� */
+.task-operator {
+    height: 50%;
+    overflow: hidden;
+    padding: 0 20px 10px 20px;
+}
+.task-operator fieldset {
+    padding: 15px 20px 5px 50px;
+    border-width: 1px;
+    border-style: solid;
+    height: 100%;
+}
+.task-operator legend {
+    margin-left: 20px;
+    padding: 0 10px;
+    font-size: 16px;
+    font-weight: 300;
+}
+button.item {
+    border: 1px solid #333;
+    font-size: 13px;
+    padding: 1px 1px 1px 1px;
+    width: 100px;
+    height: 40px;
+    outline: none;
+    cursor: pointer;
+    color: #333;
+    background-color: transparent;
+    margin-right: 5px;
+    border-radius: 5px;
+}
+button.item:hover {
+    background-color: #333;
+    color: #fff;
+}
+
+/* 鎵嬪姩鎿嶄綔閬僵 */
+.rgv-operation-shade {
+    position: absolute;
+    height: 100%;
+    width: 100%;
+    z-index: 1000;
+    text-align: center;
+    padding: 80px 0;
+}
+.rgv-operation-shade-span {
+    font-size: xx-large;
+    font-weight: bold;
+    color: red;
+}
+
+/* -------------------- 绗洓妯″潡 -------------------- */
+.rgv-output-board {
+    margin-top: 10px;
+    height: 15%;
+    background-color: #fff;
+    border-radius: 5px;
+    box-shadow: 0 0 3px rgba(0,0,0,.3);
+}
+#rgv-output {
+    border-left: none;
+    border-right: none;
+    border-top: 1px solid #9d9d9d;
+    border-bottom: 1px solid #333;
+    width: 100%;
+    height: 100%;
+    overflow: auto;
+    resize:none;
+    color: #666;
+}
diff --git a/src/main/webapp/static/js/console.map.js b/src/main/webapp/static/js/console.map.js
index a8f3682..f6d7d2b 100644
--- a/src/main/webapp/static/js/console.map.js
+++ b/src/main/webapp/static/js/console.map.js
@@ -683,7 +683,7 @@
                 "height": 19
             }, {
                 "type": "stn",
-                "id": "site-1",
+                "id": "site-999",
                 "text": "澶囩敤PGV銆丷GV缁翠慨鍖�",
                 "top": 642,
                 "left": 283,
diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html
index a5d29ea..18a8c03 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -24,6 +24,7 @@
             <li><a id="console" onclick="nav(this.id)" class="nav-select" href="#">涓绘帶鍥�</a></li>
             <li><a id="pipeline" onclick="nav(this.id)" class="nav-unselect" href="#">杈撻�佽澶�</a></li>
             <li><a id="crn" onclick="nav(this.id)" class="nav-unselect" href="#">鍫嗗灈鏈�</a></li>
+            <li><a id="rgv" onclick="nav(this.id)" class="nav-unselect" href="#">RGV</a></li>
         </ul>
     </div>
 </div>
diff --git a/src/main/webapp/views/rgv.html b/src/main/webapp/views/rgv.html
new file mode 100644
index 0000000..fc468d9
--- /dev/null
+++ b/src/main/webapp/views/rgv.html
@@ -0,0 +1,581 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>RGV鐩戞帶绠$悊</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" type="text/css" href="../static/css/normalize.css">
+    <link rel="stylesheet" type="text/css" href="../static/css/common.css">
+    <link rel="stylesheet" type="text/css" href="../static/css/rgv.css">
+    <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
+    <script type="text/javascript" src="../static/js/common.js"></script>
+    <script type="text/javascript" src="../static/js/layer/layer.js"></script>
+    <style>
+        .demoBtn {
+            vertical-align: middle;
+            width: 20%;
+            height: 25px;
+            left: 0;
+            top: 0;
+            text-shadow: inherit;
+            font-size: 15px;
+            margin-left: 5px;
+            margin-right: 5px;
+            display: inline-block;
+            background-color: #FF5722;
+            border: none;
+            color: #FFF;
+            box-shadow: 1px 1px 5px #B6B6B6;
+            border-radius: 3px;
+            cursor: pointer;
+        }
+
+        .demoBtn:hover {
+            opacity: 0.8
+        }
+        .demoBtn:focus {
+            outline: 0;
+        }
+    </style>
+</head>
+<body>
+<div style="padding: 10px;height: 100%;float: left;width: 6%">
+    <div class="button-window"></div>
+</div>
+<div style="height: 100%;padding-left: 6%">
+    <div style="padding: 10px;height: 100%">
+        <!-- 鏃ュ織鐩戞帶鏉� -->
+        <div class="log-board">
+            <!-- 鎵ц鍛戒护 -->
+
+            <!-- 鎵ц鍛戒护 -->
+            <!--<div class="command-log">-->
+<!--                <h3>鎵ц涓殑鍛戒护</h3>-->
+<!--                <div class="crn-command-item">-->
+<!--                    <label>1#</label>-->
+<!--                    <button id="demoBtn-1" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>-->
+<!--                    &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
+<!--                    <input id="crn1" disabled="disabled">-->
+<!--                </div>-->
+<!--                <div class="crn-command-item">-->
+<!--                    <label>2#</label>-->
+<!--                    <button id="demoBtn-2" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>-->
+<!--                    &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
+<!--                    <input id="crn2" disabled="disabled">-->
+<!--                </div>-->
+<!--                <div class="crn-command-item">-->
+<!--                    <label>3#</label>-->
+<!--                    <button id="demoBtn-3" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>-->
+<!--                    &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
+<!--                    <input id="crn3" disabled="disabled">-->
+<!--                </div>-->
+<!--                <div class="crn-command-item">-->
+<!--                    <label>4#</label>-->
+<!--                    <button id="demoBtn-4" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>-->
+<!--                    &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
+<!--                    <input id="crn4" disabled="disabled">-->
+<!--                </div>-->
+<!--                <div class="crn-command-item">-->
+<!--                    <label>5#</label>-->
+<!--                    <button id="demoBtn-5" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>-->
+<!--                    &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
+<!--                    <input id="crn5" disabled="disabled">-->
+<!--                </div>-->
+<!--            </div>-->
+            <!-- RGV鐘舵�佷綅淇℃伅 -->
+            <div class="rgv-state">
+                <table id="rgv-state-table">
+                    <thead>
+                    <tr>
+                        <th>RGV</th>
+                        <th>妯″紡</th>
+                        <th>鐘舵��</th>
+                        <th>浠诲姟鍙�1</th>
+                        <th>鐘舵��1</th>
+                        <th>鏈夌墿1</th>
+                        <th>RGV浣嶇疆</th>
+                        <th>璧拌瀹氫綅</th>
+                        <th>浠诲姟鍙�2</th>
+                        <th>鐘舵��2</th>
+                        <th>鏈夌墿2</th>
+                        <th>鏁呴殰浠g爜</th>
+                        <th>鏁呴殰鎻忚堪</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+        <!-- RGV鐘舵�� -->
+        <div class="rgv-msg">
+            <table id="rgv-msg-table">
+                <thead>
+                <tr>
+                    <th>RGV</th>
+                    <th>宸ヤ綔鍙�</th>
+                    <th>鐘舵��</th>
+                    <th>婧愮珯</th>
+                    <th>鐩爣绔�</th>
+                    <th>婧愬簱浣�</th>
+                    <th>鐩爣搴撲綅</th>
+<!--                    <th>璧拌閫熷害锛坢/min)</th>-->
+<!--                    <th>鍗囬檷閫熷害锛坢/min)</th>-->
+<!--                    <th>鍙夌墮閫熷害锛坢/min)</th>-->
+<!--                    <th>璧拌璺濈(Km)</th>-->
+<!--                    <th>鍗囬檷璺濈(Km)</th>-->
+<!--                    <th>璧拌鏃堕暱(H)</th>-->
+<!--                    <th>鍗囬檷鏃堕暱(H)</th>-->
+                </tr>
+                </thead>
+                <tbody>
+                </tbody>
+            </table>
+        </div>
+        <!-- 鎵嬪姩鎿嶄綔 -->
+        <div class="rgv-operation">
+
+            <!-- 閬僵灞� -->
+            <div class="rgv-operation-shade">
+        <span class="rgv-operation-shade-span">
+            WCS 绯荤粺杩愯涓紝璇峰仠姝㈠悗鎿嶄綔
+        </span>
+            </div>
+
+            <!-- 璁惧浠诲姟閫夋嫨 -->
+            <div class="task-select">
+                <!-- 鍫嗗灈鏈洪�夋嫨 -->
+                <div id="rgv-select" class="operator-item" style="width: 55%">
+                    <span class="select-title">RGV鍙�</span>
+                    <div class="select-container" style="padding: 20px 0;">
+                        <label><input type="radio" name="rgvSelect" value="1" checked>&nbsp;1鍙稲GV</label>
+                        <label><input type="radio" name="rgvSelect" value="2">&nbsp;2鍙稲GV</label>
+                    </div>
+                </div>
+                <!-- 婧愮珯/婧愬簱浣� 閫夋嫨 -->
+                <div id="source-select" class="operator-item">
+                    <span class="select-title">婧愮珯</span>
+                    <div class="select-container">
+                        <div class="select-container-item">
+                            <span>宸ヤ綅1婧愮珯</span>
+                            <label><input id="sourceStaNo" type="number" name="points" min="0" /></label>
+                        </div>
+<!--                        <div class="select-container-item">-->
+<!--                            <span>鎺�</span>-->
+<!--                            <label><input id="sourceRow" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>-->
+<!--                        </div>-->
+                        <div class="select-container-item">
+                            <span>宸ヤ綅2婧愮珯</span>
+                            <label><input id="sourceBay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label>
+                        </div>
+<!--                        <div class="select-container-item">-->
+<!--                            <span>灞�</span>-->
+<!--                            <label><input id="sourceLev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>-->
+<!--                        </div>-->
+                    </div>
+                </div>
+                <!-- 鐩爣绔�/鐩爣搴撲綅 閫夋嫨 -->
+                <div id="target-select" class="operator-item">
+                    <span class="select-title">鐩爣绔�</span>
+                    <div class="select-container">
+                        <div class="select-container-item">
+                            <span>宸ヤ綅1鐩爣绔�</span>
+                            <label><input id="staNo" type="number" name="points" min="0" /></label>
+                        </div>
+<!--                        <div class="select-container-item">-->
+<!--                            <span>鎺�</span>-->
+<!--                            <label><input id="row" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>-->
+<!--                        </div>-->
+                        <div class="select-container-item">
+                            <span>宸ヤ綅2鐩爣绔�</span>
+                            <label><input id="bay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label>
+                        </div>
+<!--                        <div class="select-container-item">-->
+<!--                            <span>灞�</span>-->
+<!--                            <label><input id="lev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>-->
+<!--                        </div>-->
+                    </div>
+                </div>
+            </div>
+
+            <!-- 璁惧浠诲姟鎿嶄綔 -->
+            <div class="task-operator">
+                <fieldset>
+                    <legend>鎵嬪姩鎿嶄綔</legend>
+                    <div class="button-group">
+                        <button class="item" onclick="put()">鍙栨斁璐�</button>
+                        <button class="item" onclick="take()">鍙栬揣</button>
+                        <button class="item" onclick="stockMove()">鏀捐揣</button>
+<!--                        <button class="item" onclick="siteMove()">绔欏埌绔�</button>-->
+                        <!--                <button class="item" onclick="bacOrigin()">鍥炲師鐐�</button>-->
+                        <!--                <button class="item" onclick="reverseOrigin()">鍙嶅師鐐�</button>-->
+                        <!--                <button class="item" onclick="coorMove()">鍧愭爣绉昏</button>-->
+                        <button class="item" onclick="taskComplete()">浠诲姟瀹屾垚</button>
+                        <!--                <button class="item" onclick="pause()">鏆傚仠</button>-->
+                        <!--                <button class="item" onclick="boot()">鍚姩</button>-->
+                        <button class="item" onclick="clearCommand()">娓呴櫎鍛戒护</button>
+                        <button class="item" onclick="handleReset()">澶嶄綅</button>
+                    </div>
+                </fieldset>
+            </div>
+
+        </div>
+        <!-- 鍫嗗灈鏈烘棩蹇楄緭鍑� -->
+        <div class="rgv-output-board">
+            <textarea id="rgv-output"></textarea>
+        </div>
+    </div>
+</div>
+</body>
+<script>
+    // 绌虹櫧琛屾暟
+    var rgvStateTableBlankRows = 0;
+    var rgvMsgTableBlankRows = 0;
+    // 瀹為檯琛屾暟
+    var rgvStateTableFullRows = 0;
+    var rgvMsgTableFullRows = 0;
+    // 鍒濆鍖�
+    var rgvOutputDom = document.getElementById("rgv-output");
+    $(document).ready(function() {
+        // getCommandLog();
+        initRgvStateTable();
+        getRgvStateInfo();
+        initRgvMsgTable();
+        getRgvMsgInfo();
+        operatorBlockShow();
+    });
+    // 鏁版嵁鏇存柊
+    setInterval(function () {
+        getRgvStateInfo();
+        getRgvMsgInfo();
+        // getCommandLog();
+    },1000);
+    setInterval(function () {
+        getRgvOutput();
+        operatorBlockShow();
+        // initDemo();
+    },500);
+
+    // 鍒ゆ柇鎵嬪姩鎿嶄綔妯″潡鏄惁鍙敤
+    function operatorBlockShow() {
+        if (parent.systemRunning) {
+            $('.rgv-operation').css("opacity", "0.5");
+            $('.rgv-operation-shade').show();
+            $('.rgv-operation-shade-span').show();
+        }  else {
+            $('.rgv-operation').css("opacity", "1");
+            $('.rgv-operation-shade').hide();
+            $('.rgv-operation-shade-span').hide();
+        }
+    }
+
+    // 鑾峰彇RGV鎵ц涓殑鍛戒护
+    function getCommandLog() {
+        $.ajax({
+            url: baseUrl + "/rgv/command/ongoing",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200) {
+                    var commands = res.data;
+                    for (var i=0; i<commands.length;i++){
+                        $("#rgv"+commands[i].rgvNo).val(commands[i].command);
+                    }
+                } else if (res.code === 403) {
+                    window.location.href = baseUrl + "/login";
+                } else {
+                    console.log(res.msg);
+                }
+            }
+        })
+    }
+
+    // 鍫嗗灈鏈轰俊鎭〃鑾峰彇 ---- 琛ㄤ竴
+    function getRgvStateInfo() {
+        var tableEl = $('#rgv-state-table');
+        $.ajax({
+            url: baseUrl+ "/rgv/table/rgv/state",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                console.log(res)
+                if (res.code === 200){
+                    var table = res.data;
+                    if (table.length > rgvStateTableBlankRows && table.length !== rgvStateTableFullRows) {
+                        initRgvStateTable(table.length-rgvStateTableBlankRows);
+                        rgvStateTableFullRows = table.length;
+                    }
+                    for (var i=1;i<=table.length;i++){
+                        var tr = tableEl.find("tr").eq(i);
+                        setVal(tr.children("td").eq(0), table[i-1].rgvNo);
+                        setVal(tr.children("td").eq(1), table[i-1].statusType);
+                        setVal(tr.children("td").eq(2), table[i-1].status);
+                        setVal(tr.children("td").eq(3), table[i-1].workNo1);
+                        setVal(tr.children("td").eq(4), table[i-1].status1);
+                        setVal(tr.children("td").eq(5), table[i-1].loading1);
+                        setVal(tr.children("td").eq(6), table[i-1].rgvPos);
+                        setVal(tr.children("td").eq(7), table[i-1].walkPos);
+                        setVal(tr.children("td").eq(8), table[i-1].workNo2);
+                        setVal(tr.children("td").eq(9), table[i-1].status2);
+                        setVal(tr.children("td").eq(10), table[i-1].loading2);
+                        setVal(tr.children("td").eq(11), table[i-1].warnCode);
+                        setVal(tr.children("td").eq(12), table[i-1].alarm);
+                    }
+                } else if (res.code === 403){
+                    window.location.href = baseUrl+"/login";
+                }  else {
+                    console.log(res.msg);
+                }
+            }
+        });
+    }
+
+    // 鍫嗗灈鏈烘暟鎹〃鑾峰彇 ---- 琛ㄤ簩
+    function getRgvMsgInfo() {
+        var tableEl = $('#rgv-msg-table');
+        $.ajax({
+            url: baseUrl+ "/rgv/table/rgv/msg",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    var table = res.data;
+                    if (table.length > rgvStateTableBlankRows && table.length !== rgvMsgTableFullRows) {
+                        initRgvStateTable(table.length-rgvStateTableBlankRows);
+                        rgvMsgTableFullRows = table.length;
+                    }
+                    for (var i=1;i<=table.length;i++){
+                        var tr = tableEl.find("tr").eq(i);
+                        setVal(tr.children("td").eq(0), table[i-1].rgvNo);
+                        setVal(tr.children("td").eq(1), table[i-1].workNo);
+                        setVal(tr.children("td").eq(2), table[i-1].status);
+                        setVal(tr.children("td").eq(3), table[i-1].sourceStaNo);
+                        setVal(tr.children("td").eq(4), table[i-1].staNo);
+                        setVal(tr.children("td").eq(5), table[i-1].sourceLocNo);
+                        setVal(tr.children("td").eq(6), table[i-1].locNo);
+                        // setVal(tr.children("td").eq(7), table[i-1].xspeed);
+                        // setVal(tr.children("td").eq(8), table[i-1].yspeed);
+                        // setVal(tr.children("td").eq(9), table[i-1].zspeed);
+                        // setVal(tr.children("td").eq(10), table[i-1].xdistance);
+                        // setVal(tr.children("td").eq(11), table[i-1].ydistance);
+                        // setVal(tr.children("td").eq(12), table[i-1].xduration);
+                        // setVal(tr.children("td").eq(13), table[i-1].yduration);
+                    }
+                } else if (res.code === 403){
+                    window.location.href = baseUrl+"/login";
+                }  else {
+                    console.log(res.msg);
+                }
+            }
+        });
+    }
+
+    // 鍫嗗灈鏈烘墜鍔ㄦ搷浣滃尯 -----------------------------------------------------------------------
+
+    function getReqParam() {
+        var rgvNo = $('input[name="rgvSelect"]:checked').val();
+        var sourceStaNo = $('#sourceStaNo').val();
+        var sourceRow = $('#sourceRow').val();
+        var sourceBay = $('#sourceBay').val();
+        var sourceLev = $('#sourceLev').val();
+        var staNo = $('#staNo').val();
+        var row = $('#row').val();
+        var bay = $('#bay').val();
+        var lev = $('#lev').val();
+        return {
+            rgvNo: rgvNo,
+            sourceStaNo: sourceStaNo,
+            sourceRow: sourceRow,
+            sourceBay: sourceBay,
+            sourceLev: sourceLev,
+            staNo: staNo,
+            row: row,
+            bay: bay,
+            lev: lev
+        };
+    }
+
+    // 鍏ュ簱
+    function put() {
+        http.post(baseUrl+"/rgv/operator/put", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 鍑哄簱
+    function take() {
+        http.post(baseUrl+"/rgv/operator/take", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 搴撲綅杞Щ
+    function stockMove() {
+        http.post(baseUrl+"/rgv/operator/stockMove", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 绔欏埌绔�
+    function siteMove() {
+        http.post(baseUrl+"/rgv/operator/siteMove", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 鍧愭爣绉诲姩
+    function coorMove() {
+        http.post(baseUrl+"/rgv/operator/coorMove", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 鍥炲師鐐�
+    function bacOrigin() {
+        http.post(baseUrl+"/rgv/operator/bacOrigin", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 鍥炲師鐐�
+    function reverseOrigin() {
+        http.post(baseUrl+"/rgv/operator/reverseOrigin", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 浠诲姟瀹屾垚
+    function taskComplete() {
+        http.post(baseUrl+"/rgv/operator/taskComplete", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 鏆傚仠
+    function pause() {
+        http.post(baseUrl+"/rgv/operator/pause", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 鍚姩
+    function boot() {
+        http.post(baseUrl+"/rgv/operator/boot", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 娓呴櫎鍛戒护
+    function clearCommand() {
+        http.post(baseUrl+"/rgv/operator/clearCommand", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 鎵嬪姩澶嶄綅
+    function handleReset() {
+        http.post(baseUrl+"/rgv/operator/handleReset", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 杈撻�佽澶囨棩蹇楄緭鍑� -----------------------------------------------------------------------
+    function getRgvOutput() {
+        $.ajax({
+            url: baseUrl + "/rgv/output/site",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                console.log(res)
+                if (res.code === 200) {
+                    rgvOutput(res.data);
+                } else if (res.code === 403) {
+                    window.location.href = baseUrl + "/login";
+                } else {
+                    console.log(res.msg);
+                }
+            }
+        })
+    }
+
+    // ------------------------------------------------------------------------------------------------
+
+    // 鍫嗗灈鏈轰俊鎭〃鑾峰彇  ----- 琛ㄤ竴
+    function initRgvStateTable(row) {
+        var line;
+        if (row === undefined){
+            var one = $('#rgv-state-table thead').height();
+            var total = $('.rgv-state').height();
+            var count = total / one;
+            count = parseInt(count) - 1;
+            rgvStateTableBlankRows = count;
+            line = count;
+        } else {
+            line = row;
+        }
+        var html = "";
+        for (var i = 0; i < line; i ++){
+            html += " <tr>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "     </tr>\n";
+        }
+        $('#rgv-state-table tbody').after(html);
+    }
+
+    // 鍫嗗灈鏈烘暟鎹〃鑾峰彇  ----- 琛ㄤ簩
+    function initRgvMsgTable(row) {
+        var line;
+        if (row === undefined){
+            var one = $('#rgv-msg-table thead').height();
+            var total = $('.rgv-msg').height();
+            var count = total / one;
+            count = parseInt(count) - 1;
+            rgvMsgTableBlankRows = count;
+            line = count;
+        } else {
+            line = row;
+        }
+        var html = "";
+        for (var i = 0; i < line; i ++){
+            html += " <tr>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "     </tr>\n";
+        }
+        $('#rgv-msg-table tbody').after(html);
+    }
+
+    // 鏃ュ織杈撳嚭妗�
+    function rgvOutput(content){
+        rgvOutputDom.value += content;
+        rgvOutputDom.scrollTop = rgvOutputDom.scrollHeight;
+    }
+
+</script>
+</html>

--
Gitblit v1.9.1