From a2c563572181cf54946020db619b6867f11f088a Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期五, 24 三月 2023 08:56:19 +0800
Subject: [PATCH] 四向穿梭车

---
 src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java     |  294 +++++
 src/main/java/com/zy/core/enums/ShuttlePlcInputStatusType.java    |   41 
 src/main/java/com/zy/core/model/command/ShuttleCommand.java       |   98 +
 src/main/java/com/zy/asrs/domain/vo/ShuttleMsgTableVo.java        |   44 
 src/main/java/com/zy/asrs/mapper/BasShuttleMapper.java            |   12 
 src/main/resources/mapper/BasShuttleMapper.xml                    |   29 
 src/main/java/com/zy/asrs/domain/vo/ShuttleDataVo.java            |   22 
 src/main/webapp/static/css/shuttle.css                            |  334 ++++++
 src/main/java/com/zy/core/enums/ShuttleStatusType.java            |   45 
 src/main/java/com/zy/asrs/service/BasShuttleService.java          |    8 
 src/main/java/com/zy/core/enums/ShuttleErrorCodeType.java         |   50 
 src/main/webapp/views/index.html                                  |    3 
 src/main/java/com/zy/asrs/domain/vo/ShuttleSensorDataVo.java      |   90 +
 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                        |    2 
 src/main/webapp/views/shuttle.html                                |  786 +++++++++++++++
 src/main/java/com/zy/asrs/service/impl/BasShuttleServiceImpl.java |   12 
 src/main/java/com/zy/core/model/ShuttleSlave.java                 |   46 
 src/main/java/com/zy/asrs/entity/BasShuttle.java                  |  258 +++++
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java       |   27 
 src/main/java/com/zy/core/thread/ShuttleThread.java               |  275 +++++
 src/main/java/com/zy/asrs/domain/vo/ShuttleStateTableVo.java      |   63 +
 src/main/java/com/zy/core/cache/MessageQueue.java                 |   14 
 src/main/java/com/zy/core/enums/ShuttlePlcOutputStatusType.java   |   45 
 src/main/java/com/zy/core/ServerBootstrap.java                    |   16 
 src/main/java/com/zy/core/properties/SlaveProperties.java         |    7 
 src/main/java/com/zy/asrs/controller/ShuttleController.java       |  294 +++++
 src/main/java/com/zy/core/enums/ShuttleTaskModeType.java          |   40 
 src/main/webapp/static/js/map.json                                |   30 
 src/main/java/com/zy/asrs/domain/param/ShuttleOperatorParam.java  |   26 
 31 files changed, 2,986 insertions(+), 28 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/ShuttleController.java b/src/main/java/com/zy/asrs/controller/ShuttleController.java
new file mode 100644
index 0000000..d1d94ea
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/ShuttleController.java
@@ -0,0 +1,294 @@
+package com.zy.asrs.controller;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.annotations.ManagerAuth;
+import com.core.common.BaseRes;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.core.exception.CoolException;
+import com.zy.asrs.domain.enums.CrnStatusType;
+import com.zy.asrs.domain.param.ShuttleOperatorParam;
+import com.zy.asrs.domain.param.SteModeParam;
+import com.zy.asrs.domain.param.SteOperatorParam;
+import com.zy.asrs.domain.vo.*;
+import com.zy.asrs.entity.BasShuttle;
+import com.zy.asrs.entity.BasSte;
+import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.service.BasShuttleService;
+import com.zy.asrs.service.WrkMastService;
+import com.zy.core.cache.MessageQueue;
+import com.zy.core.cache.OutputQueue;
+import com.zy.core.cache.SlaveConnection;
+import com.zy.core.enums.*;
+import com.zy.core.model.ShuttleSlave;
+import com.zy.core.model.SteSlave;
+import com.zy.core.model.Task;
+import com.zy.core.model.command.ShuttleCommand;
+import com.zy.core.model.command.SteCommand;
+import com.zy.core.model.protocol.ShuttleProtocol;
+import com.zy.core.model.protocol.SteProtocol;
+import com.zy.core.properties.SlaveProperties;
+import com.zy.core.properties.SystemProperties;
+import com.zy.core.thread.ShuttleThread;
+import com.zy.core.thread.SteThread;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍥涘悜绌挎杞︽帴鍙�
+ */
+@Slf4j
+@RestController
+@RequestMapping("/shuttle")
+public class ShuttleController {
+
+    @Autowired
+    private SlaveProperties slaveProperties;
+    @Autowired
+    private BasShuttleService basShuttleService;
+    @Autowired
+    private WrkMastService wrkMastService;
+
+    @PostMapping("/table/shuttle/state")
+    @ManagerAuth(memo = "鍥涘悜绌挎杞︿俊鎭〃")
+    public R steStateTable(){
+        List<ShuttleStateTableVo> list = new ArrayList<>();
+        List<BasShuttle> shuttles = basShuttleService.selectList(new EntityWrapper<BasShuttle>().orderBy("shuttle_no"));
+        for (BasShuttle basShuttle : shuttles) {
+            // 琛ㄦ牸琛�
+            ShuttleStateTableVo vo = new ShuttleStateTableVo();
+            vo.setShuttleNo(basShuttle.getShuttleNo());   //鍥涘悜绌挎杞﹀彿
+            list.add(vo);
+            // 鑾峰彇鍥涘悜绌挎杞︿俊鎭�
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, basShuttle.getShuttleNo());
+            if (shuttleThread == null) {
+                continue;
+            }
+            ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+            if (shuttleProtocol == null) {
+                continue;
+            }
+            vo.setTaskNo(shuttleProtocol.getTaskNo().intValue());  //  浠诲姟鍙�
+            if (!Cools.isEmpty(shuttleProtocol.getBusyStatus())) {
+                vo.setStatus(shuttleProtocol.getBusyStatusType().desc); //  鐘舵��
+            }
+            vo.setRow(shuttleProtocol.getRow());
+            vo.setBay(shuttleProtocol.getBay());
+            vo.setLev(shuttleProtocol.getLev());
+            vo.setBatteryPower(shuttleProtocol.getBatteryPower() + "%");
+            vo.setSpeed(shuttleProtocol.getCurrentMoveServoSpeed());
+            if (!Cools.isEmpty(shuttleProtocol.getErrorCode())) {
+                vo.setAlarm1(String.valueOf(shuttleProtocol.getErrorCode()));
+            }
+            if (!Cools.isEmpty(shuttleProtocol.getStatusErrorCode())) {
+                vo.setAlarm2(String.valueOf(shuttleProtocol.getStatusErrorCode()));
+            }
+        }
+        return R.ok().add(list);
+    }
+
+    @PostMapping("/table/shuttle/msg")
+    @ManagerAuth(memo = "鍥涘悜绌挎杞︽暟鎹〃")
+    public R steMsgTable(){
+        List<ShuttleMsgTableVo> list = new ArrayList<>();
+        List<BasShuttle> shuttles = basShuttleService.selectList(new EntityWrapper<BasShuttle>().orderBy("shuttle_no"));
+        for (BasShuttle basShuttle : shuttles) {
+            // 琛ㄦ牸琛�
+            ShuttleMsgTableVo vo = new ShuttleMsgTableVo();
+            vo.setShuttleNo(basShuttle.getShuttleNo());   //  鍥涘悜绌挎杞﹀彿
+            list.add(vo);
+            // 鑾峰彇绌挎杞︿俊鎭�
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, basShuttle.getShuttleNo());
+            if (shuttleThread == null) {
+                continue;
+            }
+            ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+            if (shuttleProtocol == null) {
+                continue;
+            }
+
+            vo.setWorkNo(shuttleProtocol.getTaskNo().intValue());  //  浠诲姟鍙�
+            if (shuttleProtocol.getTaskNo() > 0) {
+                WrkMast wrkMast = wrkMastService.selectById(shuttleProtocol.getTaskNo());
+                if (wrkMast != null) {
+                    //vo.setStatus(CrnStatusType.process(wrkMast.getIoType()).getDesc());   //  妯″紡鐘舵��
+                    vo.setSourceStaNo(wrkMast.getSourceStaNo$());    //  婧愮珯
+                    vo.setStaNo(wrkMast.getStaNo$());   //  鐩爣绔�
+                    vo.setSourceLocNo(wrkMast.getSourceLocNo());    //  婧愬簱浣�
+                    vo.setLocNo(wrkMast.getLocNo());    //  鐩爣搴撲綅
+                }
+            }
+            vo.setSpeed(shuttleProtocol.getCurrentMoveServoSpeed());  // 閫熷害
+            vo.setPakMk(shuttleProtocol.getPakMk());    // 浣滀笟鏍囪
+        }
+        return R.ok().add(list);
+    }
+
+    @PostMapping("/output/shuttle")
+    @ManagerAuth
+    public R steOutput(){
+        StringBuilder str = new StringBuilder();
+        String s;
+        int i = 0;
+        while((s = OutputQueue.SHUTTLE.poll()) != null && i <=10) {
+            str.append("\n").append(s);
+            i++;
+        }
+        return R.ok().add(str.toString());
+    }
+
+    @GetMapping("/detl/{shuttleNo}")
+    public R steDetl(@PathVariable("shuttleNo") Integer shuttleNo){
+        ShuttleDataVo vo = new ShuttleDataVo();
+        for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) {
+            if (shuttleNo.equals(shuttleSlave.getId())) {
+                vo.setShuttleNo(shuttleSlave.getId());
+                BasShuttle basShuttle = basShuttleService.selectById(shuttleSlave.getId());
+                if (!Cools.isEmpty(basShuttle)) {
+                    vo.setRow(basShuttle.getRow());
+                    vo.setBay(basShuttle.getBay());
+                    vo.setLev(basShuttle.getLev());
+                    vo.setWorkNo(basShuttle.getWrkNo());
+                    vo.setPakMk(basShuttle.getPakMk());
+                }
+                break;
+            }
+        }
+        return R.ok().add(vo);
+    }
+
+    @GetMapping("/sensor/detl/{shuttleNo}")
+    public R shuttleSensorDetl(@PathVariable("shuttleNo") Integer shuttleNo){
+        ShuttleSensorDataVo vo = new ShuttleSensorDataVo();
+        for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) {
+            if (shuttleNo.equals(shuttleSlave.getId())) {
+                vo.setShuttleNo(shuttleSlave.getId());
+                // 鑾峰彇绌挎杞︿俊鎭�
+                ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleSlave.getId());
+                if (shuttleThread == null) {
+                    return R.error("璁惧涓嶅湪绾�");
+                }
+                ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+                if (shuttleProtocol == null) {
+                    return R.error("璁惧涓嶅湪绾�");
+                }
+
+                // 绌挎杞﹀紓甯� -----------
+
+                // 绌挎杞︽彁绀轰俊鎭� ----------------------
+
+                // 浠诲姟淇℃伅 ----------------
+                vo.setPakInTask(shuttleProtocol.isPakInTask());
+                vo.setPakOutTask(shuttleProtocol.isPakOutTask());
+                vo.setPakMoveTask(shuttleProtocol.isPakMoveTask());
+                vo.setGoHpTask(shuttleProtocol.isGoHpTask());
+                vo.setGoOHpTask(shuttleProtocol.isGoOHpTask());
+                vo.setGoHpAvoid(shuttleProtocol.isGoHpAvoid());
+                vo.setGoOHpAvoid(shuttleProtocol.isGoOHpAvoid());
+                vo.setPakInEmpty(shuttleProtocol.isPakInEmpty());
+                vo.setPakInFinish(shuttleProtocol.isPakInFinish());
+                vo.setPakOutEmpty(shuttleProtocol.isPakOutEmpty());
+                vo.setPakOutFinish(shuttleProtocol.isPakOutFinish());
+                vo.setGoHpAvoidFinish(shuttleProtocol.isGoHpAvoidFinish());
+                vo.setGoOHpAvoidFinish(shuttleProtocol.isGoOHpAvoidFinish());
+                vo.setGoHpAvoidErr(shuttleProtocol.isGoHpAvoidErr());
+                vo.setGoOHpAvoidErr(shuttleProtocol.isGoOHpAvoidErr());
+
+                // 鐘舵�佷俊鎭� -------------
+
+                break;
+            }
+        }
+        return R.ok().add(vo);
+    }
+
+    @PostMapping("/detl/update")
+    @ManagerAuth
+    public R steUpdate(ShuttleDataVo vo){
+        BasShuttle basShuttle = basShuttleService.selectById(vo.getShuttleNo());
+        if (basShuttle == null) {
+            return R.error();
+        }
+        // 鑾峰彇鍥涘悜绌挎杞︿俊鎭�
+        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, vo.getShuttleNo());
+        ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+        if (shuttleProtocol == null) {
+            throw new CoolException(vo.getShuttleNo() + "鍙峰洓鍚戠┛姊溅涓嶅湪绾匡紝鏃犳硶淇濆瓨");
+        }
+//        if (!Cools.isEmpty(vo.getRow(), vo.getBay(), vo.getLev())) {
+//            if (!shuttleThread.modifyPosHandle(vo.getRow(), vo.getBay(), vo.getLev())) {
+//                throw new CoolException("鏈嶅姟鍣ㄩ敊璇�");
+//            }
+//        }
+        ShuttleCommand shuttleCommand = new ShuttleCommand();
+        shuttleCommand.setTaskNo(vo.getWorkNo());
+        if (MessageQueue.offer(SlaveType.Shuttle, vo.getShuttleNo(), new Task(2, shuttleCommand))) {
+        } else {
+            throw new CoolException("鍛戒护涓嬪彂澶辫触");
+        }
+        basShuttle.setRow(vo.getRow());
+        basShuttle.setBay(vo.getBay());
+        basShuttle.setLev(vo.getLev());
+
+        basShuttle.setPakMk(vo.getPakMk());
+        basShuttle.setWrkNo(vo.getWorkNo());
+        basShuttle.setUpdateTime(new Date());
+        if (!basShuttleService.updateById(basShuttle)) {
+            throw new CoolException("淇敼澶辫触");
+        }
+        return R.ok();
+    }
+
+    /****************************************************************/
+    /************************** 鎵嬪姩鎿嶄綔 ******************************/
+    /****************************************************************/
+
+    @ManagerAuth(memo = "鎵嬪姩鎿嶄綔")
+    @PostMapping("/operator/shuttle")
+    public R shuttleOperator(ShuttleOperatorParam param){
+        if (Cools.isEmpty(param.getShuttleNo(), param.getShuttleTaskMode())) {
+            return R.parse(BaseRes.PARAM);
+        }
+
+        for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) {
+            if (param.getShuttleNo().equals(shuttleSlave.getId())) {
+                ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleSlave.getId());
+                if (shuttleThread == null) {
+                    throw new CoolException("鍥涘悜绌挎杞︿笉鍦ㄧ嚎");
+                }
+                ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+                if (shuttleProtocol == null) {
+                    throw new CoolException("鍥涘悜绌挎杞︿笉鍦ㄧ嚎");
+                }
+                ShuttleTaskModeType shuttleTaskModeType = ShuttleTaskModeType.get(param.getShuttleTaskMode());
+                ShuttleCommand shuttleCommand = new ShuttleCommand();
+                shuttleCommand.setShuttleNo(shuttleSlave.getId()); // 鍥涘悜绌挎杞︾紪鍙�
+//                if (param.getShuttleTaskMode() == 16) {
+//                    steCommand.setComplete(true);
+//                } else if (param.getSteTaskMode() == 99) {
+//                    steCommand.setControlMode((short) 1);
+//                } else if (param.getSteTaskMode() == 100) {
+//                    steCommand.setControlMode((short) 0);
+//                } else {
+//                    if (steTaskModeType == null) {
+//                        throw new CoolException("浠诲姟绫诲瀷閿欒");
+//                    }
+//                    steCommand.setTaskNo(param.getTaskNo()); // 宸ヤ綔鍙�
+//                    steCommand.setTaskMode(steTaskModeType);
+//                }
+                if (MessageQueue.offer(SlaveType.Shuttle, shuttleSlave.getId(), new Task(2, shuttleCommand))) {
+                    return R.ok();
+                } else {
+                    throw new CoolException("鍛戒护涓嬪彂澶辫触");
+                }
+            }
+        }
+        return R.error();
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/param/ShuttleOperatorParam.java b/src/main/java/com/zy/asrs/domain/param/ShuttleOperatorParam.java
new file mode 100644
index 0000000..3e198e3
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/param/ShuttleOperatorParam.java
@@ -0,0 +1,26 @@
+package com.zy.asrs.domain.param;
+
+import lombok.Data;
+
+@Data
+public class ShuttleOperatorParam {
+
+    // 鍥涘悜绌挎杞﹀彿
+    private Integer shuttleNo;
+
+    // 鍛戒护绫诲瀷
+    private Short shuttleTaskMode;
+
+    // 浠诲姟鍙�
+    private Integer taskNo = 0;
+
+    // 鐩爣搴撲綅-鎺�
+    private Short row;
+
+    // 鐩爣搴撲綅-鍒�
+    private Short bay;
+
+    // 鐩爣搴撲綅-灞�
+    private Short lev;
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/vo/ShuttleDataVo.java b/src/main/java/com/zy/asrs/domain/vo/ShuttleDataVo.java
new file mode 100644
index 0000000..82a7f81
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/vo/ShuttleDataVo.java
@@ -0,0 +1,22 @@
+package com.zy.asrs.domain.vo;
+
+import lombok.Data;
+
+@Data
+public class ShuttleDataVo {
+
+    // 鍥涘悜绌挎杞﹀彿
+    private Integer shuttleNo;
+
+    // 宸ヤ綔鍙�
+    private Integer workNo;
+
+    private Integer row;
+
+    private Integer bay;
+
+    private Integer lev;
+
+    private String pakMk;
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/vo/ShuttleMsgTableVo.java b/src/main/java/com/zy/asrs/domain/vo/ShuttleMsgTableVo.java
new file mode 100644
index 0000000..7963b64
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/vo/ShuttleMsgTableVo.java
@@ -0,0 +1,44 @@
+package com.zy.asrs.domain.vo;
+
+import lombok.Data;
+
+@Data
+public class ShuttleMsgTableVo {
+
+    // 鍥涘悜绌挎杞﹀彿
+    private Integer shuttleNo;
+
+    // 宸ヤ綔鍙�
+    private Integer 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 = "";
+
+    // 閫熷害
+    private Double speed = 0.0D;
+
+    // 浣滀笟鏍囪
+    private String pakMk = "-";
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/vo/ShuttleSensorDataVo.java b/src/main/java/com/zy/asrs/domain/vo/ShuttleSensorDataVo.java
new file mode 100644
index 0000000..03ef340
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/vo/ShuttleSensorDataVo.java
@@ -0,0 +1,90 @@
+package com.zy.asrs.domain.vo;
+
+import lombok.Data;
+
+@Data
+public class ShuttleSensorDataVo {
+
+    /**
+     * 鍥涘悜绌挎杞﹀彿
+     */
+    private Integer shuttleNo;
+
+    // 浠诲姟淇℃伅 ---------------------------------------------------------
+    /**
+     * 96.鍏ュ簱浠诲姟涓�
+     */
+    private boolean pakInTask;
+
+    /**
+     * 97. 鍑哄簱浠诲姟涓�
+     */
+    private boolean pakOutTask;
+
+    /**
+     * 98. 绉诲簱浠诲姟涓�
+     */
+    private boolean pakMoveTask;
+
+    /**
+     * 99. 鍥炲師鐐逛换鍔′腑
+     */
+    private boolean goHpTask;
+
+    /**
+     * 100. 鍘诲弽鍘熺偣浠诲姟涓�
+     */
+    private boolean goOHpTask;
+
+    /**
+     * 101. 鍘诲師鐐归伩璁╀綅
+     */
+    private boolean goHpAvoid;
+
+    /**
+     * 102. 鍘诲弽鍘熺偣閬胯浣�
+     */
+    private boolean goOHpAvoid;
+
+    /**
+     * 104. 鍏ュ簱鍙栫┖缁撴潫
+     */
+    private boolean pakInEmpty;
+
+    /**
+     * 105. 鍏ュ簱姝e父缁撴潫
+     */
+    private boolean pakInFinish;
+
+    /**
+     * 106. 鍑哄簱鍙栫┖缁撴潫
+     */
+    private boolean pakOutEmpty;
+
+    /**
+     * 107. 鍑哄簱姝e父缁撴潫
+     */
+    private boolean pakOutFinish;
+
+    /**
+     * 108. 鍘诲師鐐归伩璁╁畬鎴�
+     */
+    private boolean goHpAvoidFinish;
+
+    /**
+     * 109. 鍘诲弽鍘熺偣閬胯瀹屾垚
+     */
+    private boolean goOHpAvoidFinish;
+
+    /**
+     * 110. 鍘诲師鐐归伩璁╁畬鎴�
+     */
+    private boolean goHpAvoidErr;
+
+    /**
+     * 111. 鍘诲弽鍘熺偣閬胯瀹屾垚
+     */
+    private boolean goOHpAvoidErr;
+
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/vo/ShuttleStateTableVo.java b/src/main/java/com/zy/asrs/domain/vo/ShuttleStateTableVo.java
new file mode 100644
index 0000000..70e3c4a
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/vo/ShuttleStateTableVo.java
@@ -0,0 +1,63 @@
+package com.zy.asrs.domain.vo;
+
+import lombok.Data;
+
+@Data
+public class ShuttleStateTableVo {
+
+    // 鍥涘悜绌挎杞﹀彿
+    private Integer shuttleNo;
+
+    // 鐘舵��
+    private String status = "-";
+
+    // 鏈夌墿
+    private String loading = "-";
+
+    /**
+     * 浠诲姟鍙�
+     */
+    public Integer taskNo;
+
+    // 姝e湪鎵ц浠诲姟
+    private String execute;
+
+    // 浠诲姟瀹屾垚锛岀瓑寰匴CS纭
+    private String waiting;
+
+    // 鎺�
+    private Short row;
+
+    // 鍒�
+    private Short bay;
+
+    // 灞�
+    private Short lev;
+
+    // 寮傚父鐮�1
+    private String alarm1 = "-";
+
+    // 寮傚父鐮�2
+    private String alarm2 = "-";
+
+    /**
+     * 鐢垫睜鐢甸噺
+     */
+    public String batteryPower = "-";
+
+    /**
+     * 褰撳墠閫熷害
+     */
+    public Double speed;
+
+    /**
+     * 鍏呯數鐘舵��
+     */
+    public String chargeStatus = "-";
+
+    /**
+     * 褰撳墠浣嶇疆
+     */
+    public String loca = "-";
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/BasShuttle.java b/src/main/java/com/zy/asrs/entity/BasShuttle.java
new file mode 100644
index 0000000..999eb2b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/BasShuttle.java
@@ -0,0 +1,258 @@
+package com.zy.asrs.entity;
+
+import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.core.common.SpringUtils;
+import com.zy.system.service.UserService;
+import com.zy.system.entity.User;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+import com.core.common.SpringUtils;
+import com.zy.system.service.UserService;
+import com.zy.system.entity.User;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+@Data
+@TableName("asr_bas_shuttle")
+public class BasShuttle implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鍥涘悜绌挎杞﹀彿
+     */
+    @ApiModelProperty(value= "鍥涘悜绌挎杞﹀彿")
+    @TableId(value = "shuttle_no", type = IdType.INPUT)
+    @TableField("shuttle_no")
+    private Integer shuttleNo;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 绂佺敤  
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 绂佺敤  ")
+    private Integer status;
+
+    /**
+     * 浣滀笟鎬�
+     */
+    @ApiModelProperty(value= "浣滀笟鎬�")
+    @TableField("shuttle_status")
+    private Integer shuttleStatus;
+
+    /**
+     * 浠诲姟鍙�
+     */
+    @ApiModelProperty(value= "浠诲姟鍙�")
+    @TableField("wrk_no")
+    private Integer wrkNo;
+
+    /**
+     * 鎺�
+     */
+    @ApiModelProperty(value= "鎺�")
+    private Integer row;
+
+    /**
+     * 鍒�
+     */
+    @ApiModelProperty(value= "鍒�")
+    private Integer bay;
+
+    /**
+     * 灞�
+     */
+    @ApiModelProperty(value= "灞�")
+    private Integer lev;
+
+    /**
+     * 鍘嗗彶鎺�
+     */
+    @ApiModelProperty(value= "鍘嗗彶鎺�")
+    @TableField("his_row")
+    private Integer hisRow;
+
+    /**
+     * 鍘嗗彶鍒�
+     */
+    @ApiModelProperty(value= "鍘嗗彶鍒�")
+    @TableField("his_bay")
+    private Integer hisBay;
+
+    /**
+     * 鍘嗗彶灞�
+     */
+    @ApiModelProperty(value= "鍘嗗彶灞�")
+    @TableField("his_lev")
+    private Integer hisLev;
+
+    /**
+     * 鏆傚瓨搴撲綅
+     */
+    @ApiModelProperty(value= "鏆傚瓨搴撲綅")
+    @TableField("idle_loc")
+    private String idleLoc;
+
+    /**
+     * 鑷姩鍏呯數
+     */
+    @ApiModelProperty(value= "鑷姩鍏呯數")
+    @TableField("auto_charge")
+    private Integer autoCharge;
+
+    /**
+     * 鐢甸噺绾�
+     */
+    @ApiModelProperty(value= "鐢甸噺绾�")
+    @TableField("charge_line")
+    private Integer chargeLine;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @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;
+
+    /**
+     * 鎻愬崌鏈哄彿
+     */
+    @ApiModelProperty(value= "鎻愬崌鏈哄彿")
+    @TableField("lift_no")
+    private Integer liftNo;
+
+    /**
+     * 鏍囪
+     */
+    @ApiModelProperty(value= "鏍囪")
+    @TableField("pak_mk")
+    private String pakMk;
+
+    public BasShuttle() {}
+
+    public BasShuttle(Integer shuttleNo,Integer status,Integer shuttleStatus,Integer wrkNo,Integer row,Integer bay,Integer lev,Integer hisRow,Integer hisBay,Integer hisLev,String idleLoc,Integer autoCharge,Integer chargeLine,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo,Integer liftNo) {
+        this.shuttleNo = shuttleNo;
+        this.status = status;
+        this.shuttleStatus = shuttleStatus;
+        this.wrkNo = wrkNo;
+        this.row = row;
+        this.bay = bay;
+        this.lev = lev;
+        this.hisRow = hisRow;
+        this.hisBay = hisBay;
+        this.hisLev = hisLev;
+        this.idleLoc = idleLoc;
+        this.autoCharge = autoCharge;
+        this.chargeLine = chargeLine;
+        this.createBy = createBy;
+        this.createTime = createTime;
+        this.updateBy = updateBy;
+        this.updateTime = updateTime;
+        this.memo = memo;
+        this.liftNo = liftNo;
+    }
+
+//    BasShuttle basShuttle = new BasShuttle(
+//            null,    // 鍥涘悜绌挎杞﹀彿[闈炵┖]
+//            null,    // 鐘舵��
+//            null,    // 浣滀笟鎬�
+//            null,    // 浠诲姟鍙�
+//            null,    // 鎺�
+//            null,    // 鍒�
+//            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 getCreateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.createBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getUsername());
+        }
+        return null;
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.updateBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getUsername());
+        }
+        return null;
+    }
+
+    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/mapper/BasShuttleMapper.java b/src/main/java/com/zy/asrs/mapper/BasShuttleMapper.java
new file mode 100644
index 0000000..d85304a
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/BasShuttleMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.zy.asrs.entity.BasShuttle;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BasShuttleMapper extends BaseMapper<BasShuttle> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/BasShuttleService.java b/src/main/java/com/zy/asrs/service/BasShuttleService.java
new file mode 100644
index 0000000..ed45783
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/BasShuttleService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.zy.asrs.entity.BasShuttle;
+import com.baomidou.mybatisplus.service.IService;
+
+public interface BasShuttleService extends IService<BasShuttle> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/BasShuttleServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasShuttleServiceImpl.java
new file mode 100644
index 0000000..7c3f623
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/BasShuttleServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.zy.asrs.mapper.BasShuttleMapper;
+import com.zy.asrs.entity.BasShuttle;
+import com.zy.asrs.service.BasShuttleService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("basShuttleService")
+public class BasShuttleServiceImpl extends ServiceImpl<BasShuttleMapper, BasShuttle> implements BasShuttleService {
+
+}
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 0380f0b..4651f27 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -30,13 +30,11 @@
 import com.zy.core.model.command.LedCommand;
 import com.zy.core.model.command.SteCommand;
 import com.zy.core.model.protocol.CrnProtocol;
+import com.zy.core.model.protocol.ShuttleProtocol;
 import com.zy.core.model.protocol.StaProtocol;
 import com.zy.core.model.protocol.SteProtocol;
 import com.zy.core.properties.SlaveProperties;
-import com.zy.core.thread.BarcodeThread;
-import com.zy.core.thread.LedThread;
-import com.zy.core.thread.SiemensDevpThread;
-import com.zy.core.thread.SteThread;
+import com.zy.core.thread.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -612,6 +610,27 @@
     }
 
     /**
+     * 鍏ュ嚭搴�  ===>>  鍥涘悜绌挎杞﹀叆鍑哄簱浣滀笟涓嬪彂
+     */
+    public synchronized void shuttleIoExecute() {
+        for (ShuttleSlave shuttle : slaveProperties.getShuttle()) {
+            //鑾峰彇鍥涘悜绌挎杞︿俊鎭�
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId());
+            ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+            if (shuttleProtocol == null) {
+                continue;
+            }
+
+            // 鍙湁褰撳洓鍚戠┛姊溅绌洪棽 骞朵笖鏃犱换鍔℃椂鎵嶇户缁墽琛�
+            if (shuttleProtocol.getBusyStatusType() == ShuttleStatusType.IDLE && shuttleProtocol.getTaskNo() == 0) {
+                //鍏ュ嚭搴撻�昏緫
+                //.....
+            }
+        }
+
+    }
+
+    /**
      * 鍏ュ嚭搴�  ===>>  鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂
      */
     public synchronized void crnIoExecute(){
diff --git a/src/main/java/com/zy/core/MainProcess.java b/src/main/java/com/zy/core/MainProcess.java
index c5895a9..6e02faa 100644
--- a/src/main/java/com/zy/core/MainProcess.java
+++ b/src/main/java/com/zy/core/MainProcess.java
@@ -57,6 +57,8 @@
                     mainService.crnStnToOutStn();
                     // 鍏ュ嚭搴�  ===>>  鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂
                     mainService.crnIoExecute();
+                    // 鍏ュ嚭搴�  ===>>  鍥涘悜绌挎杞﹀叆鍑哄簱浣滀笟涓嬪彂
+                    mainService.shuttleIoExecute();
                     // 鍏ュ簱  ===>> 鎵ц鍫嗗灈鏈哄宸ヤ綔妗g殑瀹屾垚鎿嶄綔
                     mainService.storeFinished();
                     // 鍏ュ簱 ===>> 鎵ц绌挎杞﹀宸ヤ綔妗g殑瀹屾垚鎿嶄綔
diff --git a/src/main/java/com/zy/core/ServerBootstrap.java b/src/main/java/com/zy/core/ServerBootstrap.java
index 151df14..6d94ede 100644
--- a/src/main/java/com/zy/core/ServerBootstrap.java
+++ b/src/main/java/com/zy/core/ServerBootstrap.java
@@ -3,10 +3,7 @@
 import com.zy.core.cache.MessageQueue;
 import com.zy.core.cache.SlaveConnection;
 import com.zy.core.enums.SlaveType;
-import com.zy.core.model.CrnSlave;
-import com.zy.core.model.DevpSlave;
-import com.zy.core.model.LedSlave;
-import com.zy.core.model.SteSlave;
+import com.zy.core.model.*;
 import com.zy.core.properties.SlaveProperties;
 import com.zy.core.thread.*;
 import lombok.extern.slf4j.Slf4j;
@@ -73,6 +70,10 @@
         for (Slave ste : slaveProperties.getSte()) {
             MessageQueue.init(SlaveType.Ste, ste);
         }
+        // 鍒濆鍖栧洓鍚戠┛姊溅mq
+        for (Slave shuttle : slaveProperties.getShuttle()) {
+            MessageQueue.init(SlaveType.Shuttle, shuttle);
+        }
     }
 
     private void initThread(){
@@ -97,6 +98,13 @@
             new Thread((Runnable) devpThread).start();
             SlaveConnection.put(SlaveType.Devp, devp.getId(), devpThread);
         }
+        // 鍒濆鍖栧洓鍚戠┛姊溅
+        News.info("鍒濆鍖栧洓鍚戠┛姊溅......................................................");
+        for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) {
+            ShuttleThread shuttleThread = new ShuttleThread(shuttleSlave);
+            new Thread(shuttleThread).start();
+            SlaveConnection.put(SlaveType.Shuttle, shuttleSlave.getId(), shuttleThread);
+        }
         // 鍒濆鍖栨潯鐮佹壂鎻忎华绾跨▼
         News.info("鍒濆鍖栨潯鐮佹壂鎻忎华绾跨▼...................................................");
         for (Slave barcode : slaveProperties.getBarcode()) {
diff --git a/src/main/java/com/zy/core/cache/MessageQueue.java b/src/main/java/com/zy/core/cache/MessageQueue.java
index ed5b018..bc17bec 100644
--- a/src/main/java/com/zy/core/cache/MessageQueue.java
+++ b/src/main/java/com/zy/core/cache/MessageQueue.java
@@ -29,6 +29,8 @@
     private static final Map<Integer, ConcurrentLinkedQueue<Task>> SCALE_EXCHANGE = new ConcurrentHashMap<>();
     // 鍙拌溅mq浜ゆ崲鏈�
     private static final Map<Integer, ConcurrentLinkedQueue<Task>> CAR_EXCHANGE = new ConcurrentHashMap<>();
+    //鍥涘悜绌挎杞q浜ゆ崲鏈�
+    private static final Map<Integer, ConcurrentLinkedQueue<Task>> SHUTTLE_EXCHANGE = new ConcurrentHashMap<>();
 
     /**
      * mq 浜ゆ崲鏈哄垵濮嬪寲
@@ -56,6 +58,9 @@
             case Car:
                 CAR_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>());
                 break;
+            case Shuttle:
+                SHUTTLE_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>());
+                break;
             default:
                 break;
         }
@@ -81,6 +86,8 @@
                 return SCALE_EXCHANGE.get(id).offer(task);
             case Car:
                 return CAR_EXCHANGE.get(id).offer(task);
+            case Shuttle:
+                return SHUTTLE_EXCHANGE.get(id).offer(task);
             default:
                 return false;
         }
@@ -106,6 +113,8 @@
                 return SCALE_EXCHANGE.get(id).poll();
             case Car:
                 return CAR_EXCHANGE.get(id).poll();
+            case Shuttle:
+                return SHUTTLE_EXCHANGE.get(id).poll();
             default:
                 return null;
         }
@@ -130,6 +139,8 @@
                 return SCALE_EXCHANGE.get(id).peek();
             case Car:
                 return CAR_EXCHANGE.get(id).peek();
+            case Shuttle:
+                return SHUTTLE_EXCHANGE.get(id).peek();
             default:
                 return null;
         }
@@ -158,6 +169,9 @@
             case Car:
                 CAR_EXCHANGE.get(id).clear();
                 break;
+            case Shuttle:
+                SHUTTLE_EXCHANGE.get(id).clear();
+                break;
             default:
                 break;
         }
diff --git a/src/main/java/com/zy/core/cache/OutputQueue.java b/src/main/java/com/zy/core/cache/OutputQueue.java
index b8bf8fa..6a18ab3 100644
--- a/src/main/java/com/zy/core/cache/OutputQueue.java
+++ b/src/main/java/com/zy/core/cache/OutputQueue.java
@@ -17,5 +17,7 @@
     public static ArrayBlockingQueue<JSONObject> BARCODE = new ArrayBlockingQueue<>(32);
     // 绌挎杞﹁緭鍑烘棩蹇�
     public static ArrayBlockingQueue<String> STE = new ArrayBlockingQueue<>(32);
+    //鍥涘悜绌挎杞﹁緭鍑烘棩蹇�
+    public static ArrayBlockingQueue<String> SHUTTLE = new ArrayBlockingQueue<>(32);
 
 }
diff --git a/src/main/java/com/zy/core/enums/ShuttleErrorCodeType.java b/src/main/java/com/zy/core/enums/ShuttleErrorCodeType.java
new file mode 100644
index 0000000..bd4797d
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/ShuttleErrorCodeType.java
@@ -0,0 +1,50 @@
+package com.zy.core.enums;
+
+/**
+ * 鍥涘悜绌挎杞�
+ * Wm204 閿欒缂栧彿
+ */
+public enum ShuttleErrorCodeType {
+
+    NORMAL(0, "鏃犻敊璇�"),
+    PCB_SUBMODULE(1, "PCB瀛愭ā鍧�"),
+    PCB_PLATE(2, "PCB鏉�"),
+    SERVO(10, "浼烘湇"),
+    CANOPEN(11, "canopen"),
+    RUN_ERROR(14, "杩愯閿欒"),
+    SYSTEM_ERROR(16, "绯荤粺閿欒")
+    ;
+
+    public Integer id;
+    public String desc;
+
+    ShuttleErrorCodeType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static ShuttleErrorCodeType get(Integer id) {
+        if (null == id) {
+            return null;
+        }
+        for (ShuttleErrorCodeType type : ShuttleErrorCodeType.values()) {
+            if (type.id.equals(id.intValue())) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static ShuttleErrorCodeType get(ShuttleErrorCodeType type) {
+        if (null == type) {
+            return null;
+        }
+        for (ShuttleErrorCodeType shuttleErrorCodeType : ShuttleErrorCodeType.values()) {
+            if (shuttleErrorCodeType == type) {
+                return shuttleErrorCodeType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/src/main/java/com/zy/core/enums/ShuttlePlcInputStatusType.java b/src/main/java/com/zy/core/enums/ShuttlePlcInputStatusType.java
new file mode 100644
index 0000000..d9df63f
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/ShuttlePlcInputStatusType.java
@@ -0,0 +1,41 @@
+package com.zy.core.enums;
+
+/**
+ * 鍥涘悜绌挎杞�
+ * Wm207  PLC杈撳叆鐘舵��
+ */
+public enum ShuttlePlcInputStatusType {
+
+    LIFT_STATUS(Byte.parseByte("6"), "鎵樼洏椤堕儴浼犳劅鍣ㄧ姸鎬�")
+    ;
+
+    public byte id;
+    public String desc;
+
+    ShuttlePlcInputStatusType(byte id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static ShuttlePlcInputStatusType get(byte id) {
+        for (ShuttlePlcInputStatusType type : ShuttlePlcInputStatusType.values()) {
+            if (type.id == id) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static ShuttlePlcInputStatusType get(ShuttlePlcInputStatusType type) {
+        if (null == type) {
+            return null;
+        }
+        for (ShuttlePlcInputStatusType shuttlePlcInputStatusType : ShuttlePlcInputStatusType.values()) {
+            if (shuttlePlcInputStatusType == type) {
+                return shuttlePlcInputStatusType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/src/main/java/com/zy/core/enums/ShuttlePlcOutputStatusType.java b/src/main/java/com/zy/core/enums/ShuttlePlcOutputStatusType.java
new file mode 100644
index 0000000..dd67492
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/ShuttlePlcOutputStatusType.java
@@ -0,0 +1,45 @@
+package com.zy.core.enums;
+
+/**
+ * 鍥涘悜绌挎杞�
+ * WM205 Plc杈撳嚭鐘舵�両O
+ */
+public enum ShuttlePlcOutputStatusType {
+
+    NULL(Byte.parseByte("0"), "绌�"),
+    LIFT(Byte.parseByte("1"), "椤跺崌浣�"),
+    TURN(Byte.parseByte("2"), "杞悜浣�"),
+    BRAKE(Byte.parseByte("3"), "鎶遍椄浣�"),
+    CHARGE(Byte.parseByte("4"), "鍐茬數浣�")
+    ;
+
+    public byte id;
+    public String desc;
+
+    ShuttlePlcOutputStatusType(byte id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static ShuttlePlcOutputStatusType get(byte id) {
+        for (ShuttlePlcOutputStatusType type : ShuttlePlcOutputStatusType.values()) {
+            if (type.id == id) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static ShuttlePlcOutputStatusType get(ShuttlePlcOutputStatusType type) {
+        if (null == type) {
+            return null;
+        }
+        for (ShuttlePlcOutputStatusType shuttlePlcOutputStatusType : ShuttlePlcOutputStatusType.values()) {
+            if (shuttlePlcOutputStatusType == type) {
+                return shuttlePlcOutputStatusType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/src/main/java/com/zy/core/enums/ShuttleStatusType.java b/src/main/java/com/zy/core/enums/ShuttleStatusType.java
new file mode 100644
index 0000000..36fc6d4
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/ShuttleStatusType.java
@@ -0,0 +1,45 @@
+package com.zy.core.enums;
+
+/**
+ * 鍥涘悜绌挎杞�
+ * Wm200 灏忚溅蹇欑姸鎬佷綅
+ */
+public enum ShuttleStatusType {
+
+    IDLE(false, "绌洪棽"),
+    BUSY(true, "蹇�"),
+    ;
+
+    public Boolean id;
+    public String desc;
+
+    ShuttleStatusType(Boolean id,String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static ShuttleStatusType get(Boolean id) {
+        if (null == id) {
+            return null;
+        }
+        for (ShuttleStatusType type : ShuttleStatusType.values()) {
+            if (type.id.equals(id.booleanValue())) {
+                return type;
+            }
+        }
+        return BUSY;
+    }
+
+    public static ShuttleStatusType get(ShuttleStatusType type) {
+        if (null == type) {
+            return null;
+        }
+        for (ShuttleStatusType shuttleStatusType : ShuttleStatusType.values()) {
+            if (shuttleStatusType == type) {
+                return shuttleStatusType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/src/main/java/com/zy/core/enums/ShuttleTaskModeType.java b/src/main/java/com/zy/core/enums/ShuttleTaskModeType.java
new file mode 100644
index 0000000..a24d901
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/ShuttleTaskModeType.java
@@ -0,0 +1,40 @@
+package com.zy.core.enums;
+
+public enum ShuttleTaskModeType {
+
+    INIT(0, "鍒濆"),    // 鍒濆
+    ;
+
+    public Integer id;
+    public String desc;
+
+    ShuttleTaskModeType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static ShuttleTaskModeType get(Short id) {
+        if (null == id) {
+            return null;
+        }
+        for (ShuttleTaskModeType type : ShuttleTaskModeType.values()) {
+            if (type.id.equals(id.intValue())) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static ShuttleTaskModeType get(ShuttleTaskModeType type) {
+        if (null == type) {
+            return null;
+        }
+        for (ShuttleTaskModeType shuttleTaskModeType : ShuttleTaskModeType.values()) {
+            if (shuttleTaskModeType == type) {
+                return shuttleTaskModeType;
+            }
+        }
+        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 c6c2f6c..86d676a 100644
--- a/src/main/java/com/zy/core/enums/SlaveType.java
+++ b/src/main/java/com/zy/core/enums/SlaveType.java
@@ -9,6 +9,7 @@
     Scale,
     Car,
     Ste,
+    Shuttle,
     ;
 
     public static SlaveType findInstance(String s){
diff --git a/src/main/java/com/zy/core/model/ShuttleSlave.java b/src/main/java/com/zy/core/model/ShuttleSlave.java
new file mode 100644
index 0000000..2635e5f
--- /dev/null
+++ b/src/main/java/com/zy/core/model/ShuttleSlave.java
@@ -0,0 +1,46 @@
+package com.zy.core.model;
+
+import com.zy.core.Slave;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ShuttleSlave extends Slave {
+
+    private Integer rack;
+
+    private Integer slot;
+
+    private Boolean demo;
+
+    // 绌挎杞﹀叆搴撶珯鐐�
+    private List<Sta> shuttleInStn = new ArrayList<>();
+
+    // 绌挎杞﹀嚭搴撶珯鐐�
+    private List<Sta> shuttleOutStn = new ArrayList<>();
+
+    @Data
+    public static class Sta {
+
+        // 杈撻�佺嚎plc缂栧彿
+        private Integer devpPlcId;
+
+        // 绌挎杞︾珯鐐圭紪鍙�
+        private Integer staNo;
+
+        // 鎺�
+        private Integer row;
+
+        // 鍒�
+        private Integer bay;
+
+        // 灞�
+        private Integer lev;
+
+    }
+
+}
diff --git a/src/main/java/com/zy/core/model/command/ShuttleCommand.java b/src/main/java/com/zy/core/model/command/ShuttleCommand.java
new file mode 100644
index 0000000..7acb6d6
--- /dev/null
+++ b/src/main/java/com/zy/core/model/command/ShuttleCommand.java
@@ -0,0 +1,98 @@
+package com.zy.core.model.command;
+
+import lombok.Data;
+
+@Data
+public class ShuttleCommand {
+
+    /**
+     * 鍥涘悜绌挎杞﹀彿
+     */
+    private Integer shuttleNo = 0;
+
+    /**
+     * 浠诲姟鍙�
+     */
+    private Integer taskNo = 0;
+
+    /**
+     * 浣滀笟绫诲瀷
+     */
+    private Short taskMode = 0;
+
+    /**
+     * 浠诲姟纭 false锛氭湭纭 true锛氬凡纭
+     */
+    private Boolean complete = Boolean.FALSE;
+
+    /**
+     * 鎺у埗鎸囦护瀛�
+     */
+    private Integer commandWord;
+
+    /**
+     * 鍚浜岀淮缂栧彿
+     */
+    private String startCodeNum;
+
+    /**
+     * 涓棿浜岀淮缂栧彿
+     */
+    private String middleCodeNum;
+
+    /**
+     * 鐩爣浜岀淮缂栧彿
+     */
+    private String distCodeNum;
+
+    /**
+     * 璧风偣鍒扮洰鏍囩偣鐨勮窛绂婚暱搴�
+     */
+    private Integer startToDistDistance;
+
+    /**
+     * 涓棿鐐瑰埌鐩爣鐐圭殑璺濈闀垮害
+     */
+    private Integer middleToDistDistance;
+
+    /**
+     * 灏忚溅杩愯鏂瑰悜
+     */
+    private Integer runDirection;
+
+    /**
+     * 鎵樼洏椤跺崌
+     */
+    private Integer palletLift;
+
+    /**
+     * 灏忚溅寮哄埗绉诲姩璺濈
+     */
+    private Integer forceMoveDistance;
+
+    /**
+     * 鍏呯數寮�鍏�
+     */
+    private Integer chargeSwitch;
+
+    /**
+     * 灏忚溅IO鎺у埗
+     */
+    private byte IOControl;
+
+    /**
+     * 灏忚溅杩愯閫熷害
+     */
+    private Integer runSpeed;
+
+    /**
+     * 灏忚溅闆疯揪澶囩敤
+     */
+    private Integer radarTmp;
+
+    /**
+     * 鎸囦护缁撴潫浣�
+     */
+    private Integer commandEnd;
+
+}
diff --git a/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java b/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java
new file mode 100644
index 0000000..b82f97b
--- /dev/null
+++ b/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java
@@ -0,0 +1,294 @@
+package com.zy.core.model.protocol;
+
+import com.zy.core.enums.ShuttleStatusType;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 鍥涘悜绌挎杞�
+ */
+@Slf4j
+@Data
+public class ShuttleProtocol {
+
+    /**
+     * 鍥涘悜绌挎杞﹀彿
+     */
+    private Short shuttleNo;
+
+    /**
+     * 浠诲姟鍙�
+     */
+    public Short taskNo = 0;
+
+    /**
+     * 鎺�
+     */
+    public Short row;
+
+    /**
+     * 鍒�
+     */
+    public Short bay;
+
+    /**
+     * 灞�
+     */
+    public Short lev;
+
+    /**
+     * 鎺у埗鎸囦护瀛�
+     */
+    private Integer commandWord;
+
+    /**
+     * 鍚浜岀淮缂栧彿
+     */
+    private Integer startCodeNum;
+
+    /**
+     * 涓棿浜岀淮缂栧彿
+     */
+    private Integer middleCodeNum;
+
+    /**
+     * 鐩爣浜岀淮缂栧彿
+     */
+    private Integer distCodeNum;
+
+    /**
+     * 璧风偣鍒扮洰鏍囩偣鐨勮窛绂婚暱搴�
+     */
+    private Integer startToDistDistance;
+
+    /**
+     * 涓棿鐐瑰埌鐩爣鐐圭殑璺濈闀垮害
+     */
+    private Integer middleToDistDistance;
+
+    /**
+     * 灏忚溅杩愯鏂瑰悜
+     */
+    private Integer runDirection;
+
+    /**
+     * 鎵樼洏椤跺崌
+     */
+    private Integer palletLift;
+
+    /**
+     * 灏忚溅寮哄埗绉诲姩璺濈
+     */
+    private Integer forceMoveDistance;
+
+    /**
+     * 鍏呯數寮�鍏�
+     */
+    private Integer chargeSwitch;
+
+    /**
+     * 灏忚溅IO鎺у埗
+     */
+    private Integer IOControl;
+
+    /**
+     * 灏忚溅杩愯閫熷害
+     */
+    private Integer runSpeed;
+
+    /**
+     * 灏忚溅闆疯揪澶囩敤
+     */
+    private Integer radarTmp;
+
+    /**
+     * 鎸囦护缁撴潫浣�
+     */
+    private Integer commandEnd;
+
+
+    /**
+     * 灏忚溅蹇欑姸鎬佷綅
+     * true: 蹇�
+     * false: 绌洪棽
+     */
+    private Boolean busyStatus;
+
+    /**
+     * 灏忚溅蹇欑姸鎬佷綅鏋氫妇
+     */
+    private ShuttleStatusType busyStatusType;
+
+    /**
+     * 褰撳墠浜岀淮鐮�
+     * 0涓虹┖
+     */
+    private String currentCode;
+
+    /**
+     * 鐢垫睜鐢甸噺鐧惧垎姣�
+     */
+    private Double batteryPower;
+
+    /**
+     * 鐢垫睜娓╁害
+     */
+    private Double batteryTemp;
+
+    /**
+     * 閿欒缂栧彿
+     */
+    private Integer errorCode;
+
+    /**
+     * Plc杈撳嚭鐘舵�両O
+     */
+    private byte plcOutputStatusIO;
+
+    /**
+     * 閿欒淇℃伅鐮�
+     */
+    private Integer statusErrorCode;
+
+    /**
+     * PLC杈撳叆鐘舵��
+     */
+    private byte plcInputStatus;
+
+    /**
+     * 褰撳墠鎴栬�呬箣鍓嶈鍒扮殑浜岀淮鐮佸��
+     */
+    private String currentOrBeforeCode;
+
+    /**
+     * 璇诲埌鐨勪簩缁寸爜X鏂瑰悜鍋忕Щ閲�
+     */
+    private Integer codeOffsetX;
+
+    /**
+     * 璇诲埌鐨勪簩缁寸爜Y鏂瑰悜鍋忕Щ閲�
+     */
+    private Integer codeOffsetY;
+
+    /**
+     * 褰撳墠鐨勭數鍘嬪��
+     */
+    private Double currentVoltage;
+
+    /**
+     * 褰撳墠鐨勬ā鎷熼噺鍊�
+     */
+    private Integer currentAnalogValue;
+
+    /**
+     * 褰撳墠鐨勫崌闄嶄己鏈嶉�熷害
+     */
+    private Double currentLiftServoSpeed;
+
+    /**
+     * 褰撳墠鐨勮璧颁己鏈嶉�熷害
+     */
+    private Double currentMoveServoSpeed;
+
+    /**
+     * 褰撳墠鐨勫崌闄嶄己鏈嶈礋杞界巼
+     */
+    private Double currentLiftServoLoad;
+
+    /**
+     * 褰撳墠鐨勮璧颁己鏈嶈礋杞界巼
+     */
+    private Double currentMoveServoLoad;
+
+    /**
+     * 浣滀笟鏍囪
+     */
+    private String pakMk = "-";
+
+    // 浠诲姟淇℃伅 ---------------------------------------------------------
+    /**
+     * 96.鍏ュ簱浠诲姟涓�
+     */
+    private boolean pakInTask;
+
+    /**
+     * 97. 鍑哄簱浠诲姟涓�
+     */
+    private boolean pakOutTask;
+
+    /**
+     * 98. 绉诲簱浠诲姟涓�
+     */
+    private boolean pakMoveTask;
+
+    /**
+     * 99. 鍥炲師鐐逛换鍔′腑
+     */
+    private boolean goHpTask;
+
+    /**
+     * 100. 鍘诲弽鍘熺偣浠诲姟涓�
+     */
+    private boolean goOHpTask;
+
+    /**
+     * 101. 鍘诲師鐐归伩璁╀綅
+     */
+    private boolean goHpAvoid;
+
+    /**
+     * 102. 鍘诲弽鍘熺偣閬胯浣�
+     */
+    private boolean goOHpAvoid;
+
+    /**
+     * 104. 鍏ュ簱鍙栫┖缁撴潫
+     */
+    private boolean pakInEmpty;
+
+    /**
+     * 105. 鍏ュ簱姝e父缁撴潫
+     */
+    private boolean pakInFinish;
+
+    /**
+     * 106. 鍑哄簱鍙栫┖缁撴潫
+     */
+    private boolean pakOutEmpty;
+
+    /**
+     * 107. 鍑哄簱姝e父缁撴潫
+     */
+    private boolean pakOutFinish;
+
+    /**
+     * 108. 鍘诲師鐐归伩璁╁畬鎴�
+     */
+    private boolean goHpAvoidFinish;
+
+    /**
+     * 109. 鍘诲弽鍘熺偣閬胯瀹屾垚
+     */
+    private boolean goOHpAvoidFinish;
+
+    /**
+     * 110. 鍘诲師鐐归伩璁╁畬鎴�
+     */
+    private boolean goHpAvoidErr;
+
+    /**
+     * 111. 鍘诲弽鍘熺偣閬胯瀹屾垚
+     */
+    private boolean goOHpAvoidErr;
+
+    public void setBusyStatus(Boolean status) {
+        this.busyStatus = status;
+        this.busyStatusType = ShuttleStatusType.get(status);
+    }
+
+    public void setBusyStatus(ShuttleStatusType type) {
+        this.busyStatus = type.id.booleanValue();
+        this.busyStatusType = type;
+    }
+
+}
diff --git a/src/main/java/com/zy/core/properties/SlaveProperties.java b/src/main/java/com/zy/core/properties/SlaveProperties.java
index b40fca2..4d026aa 100644
--- a/src/main/java/com/zy/core/properties/SlaveProperties.java
+++ b/src/main/java/com/zy/core/properties/SlaveProperties.java
@@ -1,10 +1,7 @@
 package com.zy.core.properties;
 
 import com.zy.core.Slave;
-import com.zy.core.model.CrnSlave;
-import com.zy.core.model.DevpSlave;
-import com.zy.core.model.LedSlave;
-import com.zy.core.model.SteSlave;
+import com.zy.core.model.*;
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
@@ -42,4 +39,6 @@
 
     private List<Slave> car = new ArrayList<>();
 
+    private List<ShuttleSlave> shuttle = new ArrayList<>();
+
 }
diff --git a/src/main/java/com/zy/core/thread/ShuttleThread.java b/src/main/java/com/zy/core/thread/ShuttleThread.java
new file mode 100644
index 0000000..224377b
--- /dev/null
+++ b/src/main/java/com/zy/core/thread/ShuttleThread.java
@@ -0,0 +1,275 @@
+package com.zy.core.thread;
+
+import HslCommunication.Core.Transfer.DataFormat;
+import HslCommunication.Core.Types.OperateResult;
+import HslCommunication.Core.Types.OperateResultExOne;
+import HslCommunication.ModBus.ModbusTcpNet;
+import HslCommunication.Profinet.Siemens.SiemensPLCS;
+import HslCommunication.Profinet.Siemens.SiemensS7Net;
+import com.alibaba.fastjson.JSON;
+import com.core.common.DateUtils;
+import com.core.common.RadixTools;
+import com.core.exception.CoolException;
+import com.zy.core.News;
+import com.zy.core.ThreadHandler;
+import com.zy.core.cache.MessageQueue;
+import com.zy.core.cache.OutputQueue;
+import com.zy.core.cache.SlaveConnection;
+import com.zy.core.enums.ShuttleStatusType;
+import com.zy.core.enums.SlaveType;
+import com.zy.core.model.ShuttleSlave;
+import com.zy.core.model.SteSlave;
+import com.zy.core.model.Task;
+import com.zy.core.model.command.ShuttleCommand;
+import com.zy.core.model.command.SteCommand;
+import com.zy.core.model.protocol.ShuttleProtocol;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+import java.text.MessageFormat;
+import java.util.Date;
+
+/**
+ * 鍥涘悜绌挎杞︾嚎绋�
+ */
+@Data
+@Slf4j
+public class ShuttleThread implements  Runnable, ThreadHandler {
+
+    private ModbusTcpNet modbusTcpNet;
+    private ShuttleSlave slave;
+    private ShuttleProtocol shuttleProtocol;
+    private SiemensS7Net siemensS7Net;
+
+    public ShuttleThread(ShuttleSlave slave) {
+        this.slave = slave;
+    }
+
+    @Override
+    public void run() {
+        this.connect();
+        while (true) {
+            try {
+                int step = 1;
+                Task task = MessageQueue.poll(SlaveType.Shuttle, slave.getId());
+                if (task != null) {
+                    step = task.getStep();
+                }
+                switch (step) {
+                    // 璇绘暟鎹�
+                    case 1:
+                        readStatus();
+                        break;
+                    // 鍐欏叆鏁版嵁
+                    case 2:
+                        write((ShuttleCommand) task.getData());
+                        break;
+                    default:
+                        break;
+                }
+                Thread.sleep(500);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    @Override
+    public boolean connect() {
+        boolean result = false;
+        //-------------------------鍥涘悜绌挎杞﹁繛鎺ユ柟娉�------------------------//
+        modbusTcpNet = new ModbusTcpNet(slave.getIp(), slave.getPort(), (byte) 0x01);
+        // 褰撲綘闇�瑕佹寚瀹氭牸寮忕殑鏁版嵁瑙f瀽鏃讹紝灏遍渶瑕佽缃笅闈㈢殑杩欎釜淇℃伅
+        modbusTcpNet.setDataFormat(DataFormat.ABCD);
+        OperateResult connect = modbusTcpNet.ConnectServer();
+        if(connect.IsSuccess){
+            result = true;
+            OutputQueue.CRN.offer(MessageFormat.format( "銆恵0}銆戝洓鍚戠┛姊溅plc杩炴帴鎴愬姛 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            log.info("鍥涘悜绌挎杞lc杩炴帴鎴愬姛 ===>> [id:{}] [ip:{}] [port:{}] ", slave.getId(), slave.getIp(), slave.getPort());
+        } else {
+            OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆戝洓鍚戠┛姊溅plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            log.error("鍥涘悜绌挎杞lc杩炴帴澶辫触锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}] ", slave.getId(), slave.getIp(), slave.getPort());
+        }
+        modbusTcpNet.ConnectClose();
+        //-------------------------鍥涘悜绌挎杞﹁繛鎺ユ柟娉�------------------------//
+        return result;
+    }
+
+    @Override
+    public void close() {
+
+    }
+
+    private void readStatus() {
+        try {
+            OperateResultExOne<byte[]> result = modbusTcpNet.Read("0", (short) 17);
+            if (result.IsSuccess) {
+                if (null == shuttleProtocol) {
+                    shuttleProtocol = new ShuttleProtocol();
+                    shuttleProtocol.setShuttleNo(slave.getId().shortValue());
+                }
+
+                //----------璁剧疆鍥涘悜绌挎杞︾姸鎬�-----------
+                //鑾峰彇鏁版嵁
+                byte[] content = result.Content;
+
+                //--------鎺у埗瀛�--------
+                //鎺у埗鎸囦护瀛�
+                shuttleProtocol.setCommandWord(modbusTcpNet.getByteTransform().TransUInt16(content, 0));
+                //鍚浜岀淮缂栧彿
+                shuttleProtocol.setStartCodeNum(modbusTcpNet.getByteTransform().TransUInt16(content, 2));
+                //涓棿浜岀淮缂栧彿
+                shuttleProtocol.setMiddleCodeNum(modbusTcpNet.getByteTransform().TransUInt16(content, 4));
+                //鐩爣浜岀淮缂栧彿
+                shuttleProtocol.setDistCodeNum(modbusTcpNet.getByteTransform().TransUInt16(content, 6));
+                //璧风偣鍒扮洰鏍囩偣鐨勮窛绂婚暱搴�
+                shuttleProtocol.setStartToDistDistance(modbusTcpNet.getByteTransform().TransInt32(content, 8));
+                //涓棿鐐瑰埌鐩爣鐐圭殑璺濈闀垮害
+                shuttleProtocol.setMiddleToDistDistance(modbusTcpNet.getByteTransform().TransInt32(content, 12));
+                //灏忚溅杩愯鏂瑰悜
+                shuttleProtocol.setRunDirection(modbusTcpNet.getByteTransform().TransUInt16(content, 16));
+                //鎵樼洏椤跺崌
+                shuttleProtocol.setPalletLift(modbusTcpNet.getByteTransform().TransUInt16(content,18));
+                //灏忚溅寮哄埗绉诲姩璺濈
+                shuttleProtocol.setForceMoveDistance(modbusTcpNet.getByteTransform().TransInt32(content, 20));
+                //鍏呯數寮�鍏�
+                shuttleProtocol.setChargeSwitch(modbusTcpNet.getByteTransform().TransUInt16(content,24));
+                //灏忚溅IO鎺у埗
+                shuttleProtocol.setIOControl(modbusTcpNet.getByteTransform().TransUInt16(content,26));
+                //灏忚溅杩愯閫熷害
+                shuttleProtocol.setRunSpeed(modbusTcpNet.getByteTransform().TransUInt16(content,28));
+                //灏忚溅闆疯揪澶囩敤
+                shuttleProtocol.setRadarTmp(modbusTcpNet.getByteTransform().TransUInt16(content,30));
+                //鎸囦护缁撴潫浣�
+                shuttleProtocol.setCommandEnd(modbusTcpNet.getByteTransform().TransUInt16(content,32));
+
+
+                //---------鐘舵�佸瓧---------
+//                shuttleProtocol.setBusyStatus(modbusTcpNet.getByteTransform().TransUInt16(content,32));
+
+                ///璁剧疆鍥涘悜绌挎杞︾姸鎬�-end
+                OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
+                //璇诲彇鍥涘悜绌挎杞﹁澶囦俊鎭紝鎻愪緵鏌ヨ
+                //.....
+
+
+                // 鏍规嵁瀹炴椂淇℃伅鏇存柊鏁版嵁搴�
+                //.....
+
+
+            }else {
+                OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆憑1}鍥涘悜绌挎杞lc鐘舵�佷俊鎭け璐�", DateUtils.convert(new Date()), slave.getId()));
+                throw new CoolException(MessageFormat.format( "鍥涘悜绌挎杞lc鐘舵�佷俊鎭け璐� ===>> [id:{0}] [ip:{1}] [port:{2}]", slave.getId(), slave.getIp(), slave.getPort()));
+            }
+        } catch (Exception e) {
+            OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戝洓鍚戠┛姊溅plc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            initShuttle();
+        }
+    }
+
+    private boolean write(ShuttleCommand command){
+        if (null == command) {
+            News.error("鍥涘悜绌挎杞﹀啓鍏ュ懡浠や负绌�");
+            return false;
+        }
+
+        //鍒ゆ柇灏忚溅鏄惁鍦ㄥ厖鐢�
+        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
+        if (devpThread.charge1){
+
+        }
+
+        command.setShuttleNo(slave.getId());
+        OperateResult result = null;
+        // 寮�濮嬩换鍔�
+        //...
+
+
+        try {
+            // 鏃ュ織璁板綍
+            if (!command.getComplete() && command.getTaskMode() != 0) {
+                //鏃ュ織璁板綍淇濆瓨鍒版暟鎹簱涓�
+                //.....
+            }
+        } catch (Exception ignore) {}
+
+        if (result != null && result.IsSuccess) {
+            // 缁存姢鏁版嵁搴撴帓鍒楀眰
+//            if (!steProtocol.getWaiting()) {
+//                if (!Cools.isEmpty(command.getRow(), command.getBay(), command.getLev())) {
+//                    this.modifyPos(command.getRow().intValue(), command.getBay().intValue(), command.getLev().intValue());
+//                }
+//            }
+
+            News.info("鍥涘悜绌挎杞﹀懡浠や笅鍙慬id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
+            OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] >>>>> 鍛戒护涓嬪彂锛� {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
+            return true;
+        } else {
+            OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戝啓鍏ュ洓鍚戠┛姊溅plc鏁版嵁澶辫触 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            News.error("鍐欏叆鍥涘悜绌挎杞lc鏁版嵁澶辫触 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+            return false;
+        }
+    }
+
+    /**
+     * 鍒濆鍖栧洓鍚戠┛姊溅
+     */
+    private void initShuttle() {
+        if (null == shuttleProtocol) {
+            shuttleProtocol = new ShuttleProtocol();
+        }
+        shuttleProtocol.setShuttleNo(slave.getId().shortValue());
+        shuttleProtocol.setBusyStatus(ShuttleStatusType.BUSY);
+        shuttleProtocol.setCurrentCode("0");
+    }
+
+    /******************************************************************************************/
+    /**************************************** 娴嬭瘯涓撶敤 *****************************************/
+    /*****************************************************************************************/
+    public static void main(String[] args) throws InterruptedException {
+        ShuttleSlave slave = new ShuttleSlave();
+        slave.setId(1);
+        slave.setIp("192.168.4.24");
+        slave.setPort(502);
+        ShuttleThread thread = new ShuttleThread(slave);
+        thread.connect();
+        thread.readStatus();
+        System.out.println(JSON.toJSONString(thread.shuttleProtocol));
+
+        // 浠诲姟浣滀笟
+//        SteCommand command = new SteCommand();
+//        command.setSteNo(1); // 鍫嗗灈鏈虹紪鍙�
+//        Random random = new Random();
+//        int taskNo = random.nextInt(9090);
+//        command.setTaskNo(taskNo); // 宸ヤ綔鍙�
+//        command.setTaskMode(SteTaskModeType.MOVE_LEFT); // 浠诲姟妯″紡
+//        thread.write(command);
+
+        // 浠诲姟瀹屾垚
+//        SteCommand command = new SteCommand();
+//        command.setSteNo(1); // 鍫嗗灈鏈虹紪鍙�
+//        command.setComplete(Boolean.TRUE); // 浠诲姟妯″紡
+//        thread.write(command);
+
+        // 鎺у埗妯″紡
+//        SteCommand command = new SteCommand();
+//        command.setControlMode((short) 1);
+//        thread.write(command);
+
+        // 澶嶄綅淇″彿
+//        SteCommand command = new SteCommand();
+//        command.setReset(Boolean.TRUE);
+//        thread.write(command);
+
+        // 鍒犻櫎鎸囦护
+//        SteCommand command = new SteCommand();
+//        command.setDelete(Boolean.TRUE);
+//        thread.write(command);
+
+        // 绌挎杞﹁繍琛岀姝�
+//        SteCommand command = new SteCommand();
+//        command.setRun((short)0);
+//        thread.write(command);
+
+    }
+}
diff --git a/src/main/resources/mapper/BasShuttleMapper.xml b/src/main/resources/mapper/BasShuttleMapper.xml
new file mode 100644
index 0000000..724891e
--- /dev/null
+++ b/src/main/resources/mapper/BasShuttleMapper.xml
@@ -0,0 +1,29 @@
+<?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.BasShuttleMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasShuttle">
+        <result column="shuttle_no" property="shuttleNo" />
+        <result column="status" property="status" />
+        <result column="shuttle_status" property="shuttleStatus" />
+        <result column="wrk_no" property="wrkNo" />
+        <result column="row" property="row" />
+        <result column="bay" property="bay" />
+        <result column="lev" property="lev" />
+        <result column="his_row" property="hisRow" />
+        <result column="his_bay" property="hisBay" />
+        <result column="his_lev" property="hisLev" />
+        <result column="idle_loc" property="idleLoc" />
+        <result column="auto_charge" property="autoCharge" />
+        <result column="charge_line" property="chargeLine" />
+        <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" />
+        <result column="lift_no" property="liftNo" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/webapp/static/css/shuttle.css b/src/main/webapp/static/css/shuttle.css
new file mode 100644
index 0000000..b507363
--- /dev/null
+++ b/src/main/webapp/static/css/shuttle.css
@@ -0,0 +1,334 @@
+body {
+    background-color: #6CA7A8;
+}
+.button-window {
+    float: left;
+    width: 100%;
+    height: 100%;
+    padding: 10px;
+    background-color: #6CA7A8;
+    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: 25%;
+}
+/* 宸� */
+.command-log {
+    float: left;
+    height: 100%;
+    width: 20%;
+    text-align: center;
+}
+.command-log h2 {
+    padding: 10px;
+}
+
+.shuttle-command-item {
+    padding: 4px 0;
+    margin-top: 5px;
+}
+.shuttle-command-item label {
+    font-size: 20px;
+    font-weight: bold;
+    vertical-align: middle;
+}
+.demoBtn {
+    vertical-align: middle;
+    /*width: 30%;*/
+    height: 30px;
+    left: 0;
+    top: 0;
+    padding: 5px 15px;
+    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;
+}
+
+/* 鍙� */
+.shuttle-state {
+    float: left;
+    height: 100%;
+    width: 80%;
+    overflow: auto;
+}
+/* 绌挎杞︾姸鎬佽〃 */
+#shuttle-state-table {
+    font-size: 12px;
+    border-collapse: collapse;
+    margin: 0 auto;
+    text-align: center;
+}
+#shuttle-state-table td, #shuttle-state-table th {
+    border: 1px solid #cad9ea;
+    color: #666;
+    height: 25px;
+}
+#shuttle-state-table thead th {
+    background-color: #CCE8EB;
+    width: 300px;
+}
+#shuttle-state-table tr:nth-child(odd) {
+    background: #fff;
+}
+#shuttle-state-table tr:nth-child(even) {
+    background: #F5FAFA;
+}
+
+/* -------------------- 绗簩妯″潡 -------------------- */
+.shuttle-msg {
+    /*overflow: auto;*/
+    margin-top: 10px;
+    height: 23%;
+    background-color: #fff;
+    border-radius: 5px;
+    box-shadow: 0 0 3px rgba(0,0,0,.3);
+}
+/* 鍫嗗灈鏈虹姸鎬佷俊鎭〃 */
+#shuttle-msg-table {
+    font-size: 12px;
+    border-collapse: collapse;
+    margin: 0 auto;
+    text-align: center;
+}
+#shuttle-msg-table td, #shuttle-msg-table th {
+    border: 1px solid #f1f1f1;
+    color: #666;
+    height: 30px;
+}
+#shuttle-msg-table thead th {
+    background-color: #fff;
+    width: 400px;
+}
+#shuttle-msg-table tr:nth-child(odd) {
+    background: #fff;
+}
+#shuttle-msg-table tr:nth-child(even) {
+    background: #fff;
+}
+
+/* -------------------- 绗笁妯″潡 -------------------- */
+
+.shuttle-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 {
+    width: 13%;
+    height: 100%;
+    overflow: hidden;
+    display: inline-block;
+    padding: 20px 0 10px 20px;
+    /*clear: right;*/
+}
+.operator-item {
+    display: inline-block;
+    height: 100%;
+    text-align: center;
+    position: relative;
+    vertical-align: middle;
+    padding: 0 20px;
+}
+.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: 30px 0;
+    height: 100%;
+    border: 1px solid #8d8d8d;
+    border-radius: 5px;
+}
+#shuttle-select .select-container label {
+    display: block;
+    padding: 5px 40px;
+    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;
+    padding: 0 10px;
+}
+.select-container-item input {
+    height: 20px;
+    border: 1px solid #8D8D8D;
+    border-radius: 3px;
+    width: 80px;
+    outline: none;
+}
+
+/* 浠诲姟浣滀笟閫夋嫨妗� */
+.task-operator {
+    width: 86%;
+    height: 100%;
+    overflow: hidden;
+    padding: 5px 0 10px 20px;
+    display: inline-block;
+    margin-right: 10px;
+}
+.task-operator fieldset {
+    padding: 15px 20px 5px 50px;
+    /*border-width: 1px;*/
+    /*border-style: solid;*/
+    height: 100%;
+    border: 1px solid #8d8d8d;
+    border-radius: 5px;
+}
+.task-operator legend {
+    background-color: #fff;
+    color: #2e95d3;
+    font-size: 12px;
+    border: 1px solid #8d8d8d;
+    border-radius: 5px;
+    padding: 5px;
+    z-index: 999;
+}
+button.item {
+    margin-top: 5px;
+    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;
+}
+
+/* 鎵嬪姩鎿嶄綔閬僵 */
+.shuttle-operation-shade {
+    position: absolute;
+    height: 100%;
+    width: 100%;
+    z-index: 1000;
+    text-align: center;
+    padding: 80px 0;
+}
+.shuttle-operation-shade-span {
+    font-size: xx-large;
+    font-weight: bold;
+    color: red;
+}
+
+/* -------------------- 绗洓妯″潡 -------------------- */
+.shuttle-output-board {
+    margin-top: 10px;
+    height: 20%;
+    background-color: #fff;
+    border-radius: 5px;
+    box-shadow: 0 0 3px rgba(0,0,0,.3);
+}
+#shuttle-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;
+}
+
+
+/* 璇︽儏寮瑰嚭灞� */
+#shuttle-detl {
+    padding: 30px 10px 0 25px;
+    overflow: hidden;
+}
+#shuttle-detl form {
+    overflow: hidden;
+}
+.form-item {
+    margin-bottom: 10px;
+}
+.form-label {
+    display: inline-block;
+    width: 130px;
+    text-align: right;
+}
+.form-input {
+    display: inline-block;
+    padding-left: 15px;
+}
+.form-input input {
+    outline-style: none ;
+    border: 1px solid #ccc;
+    border-radius: 3px;
+    padding: 5px 8px;
+    width: 150px;
+    height: 30px;
+    font-size: 14px;
+    font-weight: bolder;
+}
+.form-input input:focus{
+    border-color: #66afe9;
+    outline: 0;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);
+    box-shadow: inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)
+}
+.form-button-container {
+    text-align: center;
+}
+.form-button {
+    margin: 10px 10px;
+    width: 50px;
+    height: 30px;
+    color:white;
+    background-color:cornflowerblue;
+    border-radius: 3px;
+    border-width: 0;
+    outline: none;
+    font-size: 15px;
+    text-align: center;
+    cursor: pointer;
+}
+.form-button:hover {
+    opacity: 0.7;
+}
diff --git a/src/main/webapp/static/js/map.json b/src/main/webapp/static/js/map.json
index c0e9b7c..6670040 100644
--- a/src/main/webapp/static/js/map.json
+++ b/src/main/webapp/static/js/map.json
@@ -1072,8 +1072,8 @@
     "value": -1,
     "data": ""
   }, {
-    "value": 4,
-    "data": "200"
+    "value": -1,
+    "data": ""
   }, {
     "value": -1,
     "data": ""
@@ -1151,11 +1151,11 @@
     "value": -1,
     "data": ""
   }, {
-    "value": 4,
-    "data": "201"
+    "value": -1,
+    "data": ""
   }, {
-    "value": 4,
-    "data": "202"
+    "value": -1,
+    "data": ""
   }, {
     "value": -1,
     "data": ""
@@ -1233,11 +1233,11 @@
     "value": -1,
     "data": ""
   }, {
-    "value": 4,
-    "data": "203"
+    "value": -1,
+    "data": ""
   }, {
     "value": 4,
-    "data": "204"
+    "data": "100"
   }, {
     "value": -1,
     "data": ""
@@ -1316,10 +1316,10 @@
     "data": ""
   }, {
     "value": 4,
-    "data": "205"
+    "data": "104"
   }, {
     "value": 4,
-    "data": "206"
+    "data": "101"
   }, {
     "value": -1,
     "data": ""
@@ -1397,11 +1397,11 @@
     "value": -1,
     "data": ""
   }, {
-    "value": -1,
-    "data": ""
+    "value": 4,
+    "data": "103"
   }, {
     "value": 4,
-    "data": "207"
+    "data": "102"
   }, {
     "value": -1,
     "data": ""
@@ -1483,7 +1483,7 @@
     "data": ""
   }, {
     "value": 4,
-    "data": "208"
+    "data": ""
   }, {
     "value": 0,
     "data": ""
diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html
index 738eb63..043106d 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -21,7 +21,8 @@
             <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="ste" onclick="nav(this.id)" class="nav-unselect" href="#">绌挎杞�</a></li>
+<!--            <li><a id="ste" onclick="nav(this.id)" class="nav-unselect" href="#">绌挎杞�</a></li>-->
+            <li><a id="shuttle" onclick="nav(this.id)" class="nav-unselect" href="#">鍥涘悜绌挎杞�</a></li>
         </ul>
     </div>
 </div>
diff --git a/src/main/webapp/views/shuttle.html b/src/main/webapp/views/shuttle.html
new file mode 100644
index 0000000..f1eafbb
--- /dev/null
+++ b/src/main/webapp/views/shuttle.html
@@ -0,0 +1,786 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>鍥涘悜绌挎杞︾洃鎺х鐞�</title>
+    <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/layui/css/layui.css">
+    <link rel="stylesheet" href="../static/css/shuttle.css">
+    <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
+    <script type="text/javascript" src="../static/js/layer/layer.js"></script>
+    <script type="text/javascript" src="../static/layui/layui.js"></script>
+    <script type="text/javascript" src="../static/js/common.js"></script>
+</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" id="commandLogId">
+<!--                    <div data-shuttleNo="1" class="shuttle-command-item">-->
+<!--                        <label>1#</label>-->
+<!--                        <button class="demoBtn pos-btn">鏁版嵁缁存姢</button>-->
+<!--                        <button id="mode-1" class="demoBtn mode-btn" >璁惧淇℃伅</button>-->
+<!--                    </div>-->
+                </div>
+                <!-- 鍫嗗灈鏈虹姸鎬佷綅淇℃伅 -->
+                <div class="shuttle-state">
+                    <table id="shuttle-state-table">
+                        <thead>
+                            <tr>
+                                <th>鍥涘悜绌挎杞�</th>
+                                <th>寰呭畾</th>
+                                <th>鐘舵��</th>
+                                <th>鏈夌墿</th>
+                                <th>鍦ㄨ建</th>
+                                <th>鐢甸噺</th>
+                                <th>鎺�</th>
+                                <th>鍒�</th>
+                                <th>灞�</th>
+                                <th>绛夊緟WCS纭</th>
+                                <th>瀹氫綅</th>
+                                <th>鍏呯數鐘舵��</th>
+                                <th>鎶ヨ淇℃伅1</th>
+                                <th>鎶ヨ淇℃伅2</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+            <!-- 绌挎杞︾姸鎬� -->
+            <div class="shuttle-msg">
+                <table id="shuttle-msg-table">
+                    <thead>
+                        <tr>
+                            <th>鍥涘悜绌挎杞�</th>
+                            <th>宸ヤ綔鍙�</th>
+                            <th>鐘舵��</th>
+                            <th>婧愮珯</th>
+                            <th>鐩爣绔�</th>
+                            <th>婧愬簱浣�</th>
+                            <th>鐩爣搴撲綅</th>
+                            <th>閫熷害</th>
+                            <th>浣滀笟鏍囪</th>
+                        </tr>
+                    </thead>
+                    <tbody>
+                    </tbody>
+                </table>
+            </div>
+            <!-- 鎵嬪姩鎿嶄綔 -->
+            <div class="shuttle-operation">
+                <!-- 閬僵灞� -->
+                <div class="shuttle-operation-shade">
+                    <span class="shuttle-operation-shade-span">
+                        WCS 绯荤粺杩愯涓紝璇峰仠姝㈠悗鎿嶄綔
+                    </span>
+                </div>
+                <!-- 璁惧浠诲姟閫夋嫨 -->
+                <div class="task-select">
+                    <!-- 閫夋嫨 -->
+                    <div id="shuttle-select" class="operator-item">
+                        <span class="select-title">鍥涘悜绌挎杞﹀彿</span>
+                        <div class="select-container" id="shuttleRadioBoxId">
+<!--                            <label><input type="radio" name="shuttleSelect" value="1" checked>&nbsp;1鍙风┛姊溅</label>-->
+                        </div>
+                    </div>
+                </div>
+
+                <!-- 璁惧浠诲姟鎿嶄綔 -->
+                <div class="task-operator">
+                    <div style="display: flex;">
+                        <div class="task-operator" style="height: auto;width: auto;">
+                            <div class="operator-item" style="height: auto">
+                                <span class="select-title">婧愮珯/婧愬簱浣�</span>
+                                <div class="select-container" style="height: auto">
+                                    <div class="select-container-item">
+                                        <span>绔�</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>鍒�</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>
+
+                        <div class="task-operator" style="height: auto;width: auto;">
+                            <div class="operator-item" style="height: auto">
+                                <span class="select-title">婧愮珯/婧愬簱浣�</span>
+                                <div class="select-container" style="height: auto">
+                                    <div class="select-container-item">
+                                        <span>绔�</span>
+                                        <label><input id="distStaNo" type="number" name="points" min="0" /></label>
+                                    </div>
+                                    <div class="select-container-item">
+                                        <span>鎺�</span>
+                                        <label><input id="distRow" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>
+                                    </div>
+                                    <div class="select-container-item">
+                                        <span>鍒�</span>
+                                        <label><input id="distBay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label>
+                                    </div>
+                                    <div class="select-container-item">
+                                        <span>灞�</span>
+                                        <label><input id="distLev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                    <fieldset style="height: auto;padding-bottom: 20px;">
+                        <legend>鎵嬪姩鎿嶄綔</legend>
+                        <div class="button-group">
+                            <button class="item" onclick="shuttleOperator(4)">鎵樼洏椤跺崌</button>
+                            <button class="item" onclick="shuttleOperator(4)">鎵樼洏鏀句笅</button>
+                            <button class="item" onclick="shuttleOperator(5)">宸︾Щ</button>
+                            <button class="item" onclick="shuttleOperator(6)">鍙崇Щ</button>
+                            <button class="item" onclick="shuttleOperator(7)">鍓嶇Щ</button>
+                            <button class="item" onclick="shuttleOperator(8)">鍚庣Щ</button>
+                            <button class="item" onclick="shuttleOperator(9)">寮哄埗绉诲姩</button>
+                            <button class="item" onclick="shuttleOperator(16)">浠诲姟瀹屾垚</button>
+                        </div>
+                    </fieldset>
+                </div>
+
+            </div>
+            <!-- 绌挎杞︽棩蹇楄緭鍑� -->
+            <div class="shuttle-output-board">
+                <textarea id="shuttle-output"></textarea>
+            </div>
+        </div>
+    </div>
+
+    <div id="shuttle-detl" style="display: none">
+        <div>
+            <div class="form-item">
+                <label class="form-label">鍥涘悜绌挎杞﹀彿:</label>
+                <div class="form-input">
+                    <input id="shuttleNo" name="shuttleNo" class="layui-input" lay-verify="required|number" autocomplete="off" disabled="disabled">
+                </div>
+            </div>
+            <div class="form-item">
+                <label class="form-label">宸ヤ綔鍙�:</label>
+                <div class="form-input">
+                    <input id="workNo" name="workNo" type="number" class="layui-input" lay-verify="number" autocomplete="off">
+                </div>
+            </div>
+            <div class="form-item">
+                <label class="form-label">鎺�:</label>
+                <div class="form-input">
+                    <input id="row" name="row" type="number" class="layui-input" lay-verify="number" autocomplete="off">
+                </div>
+            </div>
+            <div class="form-item">
+                <label class="form-label">鍒�:</label>
+                <div class="form-input">
+                    <input id="bay" name="bay" type="number" class="layui-input" autocomplete="off">
+                </div>
+            </div>
+            <div class="form-item">
+                <label class="form-label">灞�:</label>
+                <div class="form-input">
+                    <input id="lev" name="lev" type="number" class="layui-input" autocomplete="off">
+                </div>
+            </div>
+            <div class="form-item">
+                <label class="form-label">浣滀笟鏍囪:</label>
+                <div class="form-input">
+                    <input id="pakMk" name="pakMk" type="text" class="layui-input" autocomplete="off">
+                </div>
+            </div>
+            <div class="form-item form-button-container">
+                <button class="form-button" id="save">淇濆瓨</button>
+                <button class="form-button" id="cancel" style="background-color: #D0D0D0">鍙栨秷</button>
+            </div>
+        </div>
+    </div>
+    <div id="shuttle-detl2" style="display: none">
+        <div style="width: 1400px">
+            <div class="form-item" style="text-align: left">
+                <spen style="margin:  20px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style:dotted;">
+                    寮傚父锛�<spen style="color: #FD482C;">鉁�</spen>
+                </spen>
+                <spen style="margin:  20px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style: double;">
+                    姝e父锛�<spen style="color: #00FF00;">鈥�</spen>
+                </spen>
+            </div>
+            <div style="float:left;margin:  10px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style:dotted;">
+                <div class="form-item" style="text-align: center">
+                    <label>鍥涘悜绌挎杞﹀紓甯�</label>
+                </div>
+                <div class="form-item">
+                    <label class="form-label">鍥涘悜绌挎杞﹀彿:</label>
+                    <div class="form-input">
+                        <input id="shuttleNo1" name="shuttleNo" class="layui-input" lay-verify="required|number" autocomplete="off" disabled="disabled" readonly>
+                    </div>
+                </div>
+
+            </div>
+            <div style="float:left;margin:  10px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style:dotted">
+                <div class="form-item" style="text-align: center">
+                    <label>鍥涘悜绌挎杞︽彁绀轰俊鎭�</label>
+                </div>
+
+            </div>
+            <div style="float:left;margin:  10px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style:dotted">
+                <div class="form-item" style="text-align: center">
+                    <label>浠诲姟淇℃伅</label>
+                </div>
+                <div class="form-item">
+                    <label class="form-label">鍏ュ簱浠诲姟涓�:</label>
+                    <div class="form-input">
+                        <input id="pakInTask" name="pakInTask" class="layui-input" autocomplete="off" readonly>
+                    </div>
+                </div>
+                <div class="form-item">
+                    <label class="form-label">鍑哄簱浠诲姟涓�:</label>
+                    <div class="form-input">
+                        <input id="pakOutTask" name="pakOutTask" class="layui-input" autocomplete="off" readonly>
+                    </div>
+                </div>
+                <div class="form-item">
+                    <label class="form-label">绉诲簱浠诲姟涓�:</label>
+                    <div class="form-input">
+                        <input id="pakMoveTask" name="pakMoveTask" class="layui-input" autocomplete="off" readonly>
+                    </div>
+                </div>
+                <div class="form-item">
+                    <label class="form-label">鍥炲師鐐逛换鍔′腑:</label>
+                    <div class="form-input">
+                        <input id="goHpTask" name="goHpTask" class="layui-input" autocomplete="off" readonly>
+                    </div>
+                </div>
+                <div class="form-item">
+                    <label class="form-label">鍘诲弽鍘熺偣浠诲姟涓�:</label>
+                    <div class="form-input">
+                        <input id="goOHpTask" name="goOHpTask" class="layui-input" autocomplete="off" readonly>
+                    </div>
+                </div>
+                <div class="form-item">
+                    <label class="form-label">鍘诲師鐐归伩璁╀綅:</label>
+                    <div class="form-input">
+                        <input id="goHpAvoid" name="goHpAvoid" class="layui-input" autocomplete="off" readonly>
+                    </div>
+                </div>
+                <div class="form-item">
+                    <label class="form-label">鍘诲弽鍘熺偣閬胯浣�:</label>
+                    <div class="form-input">
+                        <input id="goOHpAvoid" name="goOHpAvoid" class="layui-input" autocomplete="off" readonly>
+                    </div>
+                </div>
+                <div class="form-item">
+                    <label class="form-label">鍏ュ簱鍙栫┖缁撴潫:</label>
+                    <div class="form-input">
+                        <input id="pakInEmpty" name="pakInEmpty" class="layui-input" autocomplete="off" readonly>
+                    </div>
+                </div>
+                <div class="form-item">
+                    <label class="form-label">鍏ュ簱姝e父缁撴潫:</label>
+                    <div class="form-input">
+                        <input id="pakInFinish" name="pakInFinish" class="layui-input" autocomplete="off" readonly>
+                    </div>
+                </div>
+                <div class="form-item">
+                    <label class="form-label">鍑哄簱鍙栫┖缁撴潫:</label>
+                    <div class="form-input">
+                        <input id="pakOutEmpty" name="pakOutEmpty" class="layui-input" autocomplete="off" readonly>
+                    </div>
+                </div>
+                <div class="form-item">
+                    <label class="form-label">鍑哄簱姝e父缁撴潫:</label>
+                    <div class="form-input">
+                        <input id="pakOutFinish" name="pakOutFinish" class="layui-input" autocomplete="off" readonly>
+                    </div>
+                </div>
+                <div class="form-item">
+                    <label class="form-label">鍘诲師鐐归伩璁╁畬鎴�:</label>
+                    <div class="form-input">
+                        <input id="goHpAvoidFinish" name="goHpAvoidFinish" class="layui-input" autocomplete="off" readonly>
+                    </div>
+                </div>
+                <div class="form-item">
+                    <label class="form-label">鍘诲弽鍘熺偣閬胯瀹屾垚:</label>
+                    <div class="form-input">
+                        <input id="goOHpAvoidFinish" name="goOHpAvoidFinish" class="layui-input" autocomplete="off" readonly>
+                    </div>
+                </div>
+                <div class="form-item">
+                    <label class="form-label">鍘诲師鐐归伩璁╁畬鎴�:</label>
+                    <div class="form-input">
+                        <input id="goHpAvoidErr" name="goHpAvoidErr" class="layui-input" autocomplete="off" readonly>
+                    </div>
+                </div>
+                <div class="form-item">
+                    <label class="form-label">鍘诲弽鍘熺偣閬胯瀹屾垚:</label>
+                    <div class="form-input">
+                        <input id="goOHpAvoidErr" name="goOHpAvoidErr" class="layui-input" autocomplete="off" readonly>
+                    </div>
+                </div>
+            </div>
+            <div style="float:left;margin:  10px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style:dotted">
+                <div class="form-item" style="text-align: center">
+                    <label>鐘舵�佷俊鎭�</label>
+                </div>
+<!--                <div class="form-item">-->
+<!--                    <label class="form-label">鑱旀満妯″紡:</label>-->
+<!--                    <div class="form-input">-->
+<!--                        <input id="autoMode" name="autoMode" class="layui-input" autocomplete="off" readonly>-->
+<!--                    </div>-->
+<!--                </div>-->
+<!--                <div class="form-item">-->
+<!--                    <label class="form-label">鐢靛帇杩囦綆:</label>-->
+<!--                    <div class="form-input">-->
+<!--                        <input id="voltageLow" name="voltageLow" class="layui-input" autocomplete="off" readonly>-->
+<!--                    </div>-->
+<!--                </div>-->
+            </div>
+        </div>
+    </div>
+</body>
+</html>
+<script>
+    // 绌虹櫧琛屾暟
+    var shuttleStateTableBlankRows = 0;
+    var shuttleMsgTableBlankRows = 0;
+    // 瀹為檯琛屾暟
+    var shuttleStateTableFullRows = 0;
+    var shuttleMsgTableFullRows = 0;
+    // 鍒濆鍖�
+    var shuttleOutputDom = document.getElementById("shuttle-output");
+    $(document).ready(function() {
+        initShuttleStateTable();
+        getShuttleStateInfo();
+        initShuttleMsgTable();
+        getShuttleMsgInfo();
+        operatorBlockShow();
+        setShuttleRadio();
+    });
+
+    setInterval(function () {
+        getShuttleStateInfo()
+        getShuttleMsgInfo();
+    },1000)
+    setInterval(function () {
+        getShuttleOutput();
+        operatorBlockShow();
+    },500);
+
+    // 鍒ゆ柇鎵嬪姩鎿嶄綔妯″潡鏄惁鍙敤
+    function operatorBlockShow() {
+        if (parent.systemRunning) {
+            $('.shuttle-operation').css("opacity", "0.5");
+            $('.shuttle-operation-shade').show();
+            $('.shuttle-operation-shade-span').show();
+        }  else {
+            $('.shuttle-operation').css("opacity", "1");
+            $('.shuttle-operation-shade').hide();
+            $('.shuttle-operation-shade-span').hide();
+        }
+    }
+
+    var layerIdx;
+    $(document).on('click ','.pos-btn', function () {
+        let shuttleNo = Number($(this).parent().attr("data-shuttleNo"));
+        layerIdx = layer.open({
+            type: 1,
+            title: false,
+            shadeClose: true,
+            offset: [$(this).offset().top + 30 + 'px', $(this).offset().left + 'px'],
+            anim: 5,
+            shade: [0],
+            area: ['310px', '370px'],
+            closeBtn: 0,
+            content: $("#shuttle-detl"),
+            success: function(layero, index){
+                http.get(baseUrl+ "/shuttle/detl/"+shuttleNo, null, function (res) {
+                    $('#shuttleNo').val(shuttleNo);
+                    $('#workNo').val(res.data.workNo);
+                    $('#row').val(res.data.row);
+                    $('#bay').val(res.data.bay);
+                    $('#lev').val(res.data.lev);
+                    $('#crnNo').val(res.data.crnNo);
+                    $('#pakMk').val(res.data.pakMk);
+                })
+            },
+            end: function () {
+                $('#shuttleNo').val("");
+                $('#workNo').val("");
+                $('#row').val("");
+                $('#bay').val("");
+                $('#lev').val("");
+                $('#crnNo').val("");
+                $('#pakMk').val("");
+            }
+        })
+    })
+
+    var layerIdx0;
+    $(document).on('click ','.mode-btn', function () {
+        let shuttleNo = Number($(this).parent().attr("data-shuttleNo"));
+        layerIdx0 = layer.open({
+            type: 1,
+            title: false,
+            shadeClose: true,
+            offset: [$(this).offset().top + 30 + 'px', $(this).offset().left + 'px'],
+            anim: 5,
+            shade: [0],
+            area: ['70%', '85%'],
+            closeBtn: 0,
+            content: $("#shuttle-detl2"),
+            success: function(layero, index){
+                console.log(shuttleNo)
+                http.get(baseUrl+ "/shuttle/sensor/detl/"+shuttleNo, null, function (res) {
+                    $('#shuttleNo1').val(res.data.shuttleNo);
+                    // getColor(res.data.liftErr,'#liftErr');
+                    // getColor(res.data.inFetchErr,'#inFetchErr');
+                    // getColor(res.data.outFetchErr,'#outFetchErr');
+                    // getColor(res.data.antiErr,'#antiErr');
+                    // getColor(res.data.liftSwitchErr,'#liftSwitchErr');
+                    // getColor(res.data.trackErr,'#trackErr');
+                    // getColor(res.data.timeoutErr,'#timeoutErr');
+                    // getColor(res.data.connectErr,'#connectErr');
+                    // getColor(res.data.emergencyErr,'#emergencyErr');
+                    // getColor(res.data.taskTypeErr,'#taskTypeErr');
+                    // getColor(res.data.taskNoErr,'#taskNoErr');
+                    // getColor(res.data.newTaskErr,'#newTaskErr');
+                    // getColor(res.data.errTaskErr,'#errTaskErr');
+                    // getColor(res.data.stopErr,'#stopErr');
+                    // getColor(res.data.offlineTaskErr,'#offlineTaskErr');
+                    // getColor(res.data.startTaskErr,'#startTaskErr');
+                    // getColor(res.data.voltageTaskErr,'#voltageTaskErr');
+                    // getColor(res.data.devpErr,'#devpErr');
+                    // getColor(res.data.online,'#online');
+                    // getColor(res.data.notOnTrack,'#notOnTrack');
+                    // getColor(res.data.lowVoltage,'#lowVoltage');
+                    // getColor(res.data.electricityLoss,'#electricityLoss');
+                    // getColor(res.data.forcedTravel,'#forcedTravel');
+                    // getColor(res.data.demoMode,'#demoMode');
+                    // getColor(res.data.brushConnect,'#brushConnect');
+                    // getColor(res.data.taskManualForbid,'#taskManualForbid');
+                    // getColor(res.data.onlineManualForbid,'#onlineManualForbid');
+                    // getColor(res.data.devpEmergency,'#devpEmergency');
+                    // getColor(res.data.taskInterrupt,'#taskInterrupt');
+                    // getColor(res.data.taskClear,'#taskClear');
+                    // getColor(res.data.taskConfirmTimeout,'#taskConfirmTimeout');
+                    // getColor(res.data.taskWithCharge,'#taskWithCharge');
+                    getColor(res.data.pakInTask,'#pakInTask');
+                    getColor(res.data.pakOutTask,'#pakOutTask');
+                    getColor(res.data.pakMoveTask,'#pakMoveTask');
+                    getColor(res.data.goHpTask,'#goHpTask');
+                    getColor(res.data.goOHpTask,'#goOHpTask');
+                    getColor(res.data.goHpAvoid,'#goHpAvoid');
+                    getColor(res.data.goOHpAvoid,'#goOHpAvoid');
+                    getColor(res.data.pakInEmpty,'#pakInEmpty');
+                    getColor(res.data.pakInFinish,'#pakInFinish');
+                    getColor(res.data.pakOutEmpty,'#pakOutEmpty');
+                    getColor(res.data.pakOutFinish,'#pakOutFinish');
+                    getColor(res.data.goHpAvoidFinish,'#goHpAvoidFinish');
+                    getColor(res.data.goOHpAvoidFinish,'#goOHpAvoidFinish');
+                    getColor(res.data.goHpAvoidErr,'#goHpAvoidErr');
+                    getColor(res.data.goOHpAvoidErr,'#goOHpAvoidErr');
+                    // getColor(res.data.autoMode,'#autoMode');
+                    // getColor(res.data.voltageLow,'#voltageLow');
+                })
+            },
+            end: function () {
+                $('#shuttleNo').val("");
+            }
+        })
+    })
+
+    function getColor(res,e){
+        $(e).val(res?"鉁�":"鈥�");
+        if (res){
+            $(e).attr("style", "color: #FD482C;");
+        }else {
+            $(e).attr("style", "color: #00FF00;");
+        }
+    }
+
+    // $(document).on('click ','.mode-btn', function () {
+    //     let shuttleNo = Number($(this).parent().attr("data-shuttleNo"));
+    //     layer.confirm("鏀瑰彉" + shuttleNo + ' 鍙风┛姊溅鍦ㄧ嚎鐘舵�佸悧锛�', function(){
+    //         var index = layer.load(1, {
+    //             shade: [0.1,'#fff']
+    //         });
+    //         $.ajax({
+    //             url: baseUrl+ "/shuttle/mode/switch",
+    //             headers: {'token': localStorage.getItem('token')},
+    //             data: {
+    //                 shuttleNo: Number(shuttleNo),
+    //                 password: 'root'
+    //             },
+    //             method: 'POST',
+    //             success: function (res) {
+    //                 layer.close(index);
+    //                 if (res.code === 200){
+    //                     layer.msg(res.msg, {icon: 1});
+    //                 } else if (res.code === 403){
+    //                     window.location.href = baseUrl+"/login";
+    //                 }  else {
+    //                     layer.msg(res.msg, {icon: 2});
+    //                 }
+    //             }
+    //         });
+    //     });
+    // })
+
+
+
+    $(document).on('click ','#save', function () {
+        http.post(baseUrl+ "/shuttle/detl/update", {
+            shuttleNo: $('#shuttleNo').val(),
+            workNo: $('#workNo').val(),
+            row:  $('#row').val(),
+            bay: $('#bay').val(),
+            lev:  $('#lev').val(),
+            crnNo: $('#crnNo').val(),
+            pakMk: $('#pakMk').val(),
+        }, function (res) {
+            layer.msg("淇敼鎴愬姛", {icon: 1,});
+            layer.close(layerIdx);
+        })
+    })
+
+    $(document).on('click ','#cancel', function () {
+        layer.close(layerIdx);
+    })
+
+    function setShuttleRadio() {
+        $.ajax({
+            url: baseUrl+ "/shuttle/table/shuttle/state",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    let table = res.data;
+                    for (let i=1;i<=table.length;i++){
+                        //娓叉煋鍥涘悜绌挎杞﹂�夐」html
+                        let shuttleRadioBox = '<label><input type="radio" name="shuttleSelect" ';
+                        if (i === 1) {
+                            shuttleRadioBox += 'checked '
+                        }
+                        shuttleRadioBox += 'value="' + table[i - 1].shuttleNo + '">&nbsp;' + table[i - 1].shuttleNo + '鍙风┛姊溅</label>'
+                        $("#shuttleRadioBoxId").append(shuttleRadioBox)
+
+
+                        //娓叉煋鍥涘悜绌挎杞︽暟鎹淮鎶ゅ拰璁惧淇℃伅html
+                        let shuttleCommandLogBox = '<div class="shuttle-command-item" data-shuttleNo="' + table[i - 1].shuttleNo + '">\n' +
+                            '<label>' + table[i - 1].shuttleNo + '#</label>\n' +
+                            '<button class="demoBtn pos-btn">鏁版嵁缁存姢</button>\n' +
+                            '<button class="demoBtn mode-btn" id="mode-' + table[i - 1].shuttleNo + '">璁惧淇℃伅</button>\n' +
+                            '</div>'
+                        $("#commandLogId").append(shuttleCommandLogBox);
+                    }
+                } else if (res.code === 403){
+                    window.location.href = baseUrl+"/login";
+                }  else {
+                    console.log(res.msg);
+                }
+            }
+        });
+    }
+
+    // 鍥涘悜绌挎杞︿俊鎭〃鑾峰彇 ---- 琛ㄤ竴
+    function getShuttleStateInfo() {
+        let tableEl = $('#shuttle-state-table');
+        $.ajax({
+            url: baseUrl+ "/shuttle/table/shuttle/state",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    let table = res.data;
+                    if (table.length > shuttleStateTableBlankRows && table.length !== shuttleStateTableFullRows) {
+                        initShuttleStateTable(table.length-shuttleStateTableBlankRows);
+                        shuttleStateTableFullRows = table.length;
+                    }
+                    for (let i=1;i<=table.length;i++){
+                        // $("#mode-"+table[i-1].shuttleNo).html(table[i-1].statusVal===0?'鑱旀満':'鑴辨満');
+                        let tr = tableEl.find("tr").eq(i);
+                        setVal(tr.children("td").eq(0), table[i-1].shuttleNo);
+                        setVal(tr.children("td").eq(1), table[i-1].status);
+                        setVal(tr.children("td").eq(2), table[i-1].status);
+                        setVal(tr.children("td").eq(3), table[i-1].loading);
+                        setVal(tr.children("td").eq(4), table[i-1].track);
+                        setVal(tr.children("td").eq(5), table[i-1].batteryPower);
+                        setVal(tr.children("td").eq(6), table[i-1].row);
+                        setVal(tr.children("td").eq(7), table[i-1].bay);
+                        setVal(tr.children("td").eq(8), table[i-1].lev);
+                        setVal(tr.children("td").eq(9), table[i-1].waiting);
+                        setVal(tr.children("td").eq(10), table[i-1].loca);
+                        setVal(tr.children("td").eq(11), table[i-1].chargeStatus);
+                        setVal(tr.children("td").eq(12), table[i-1].alarm1);
+                        setVal(tr.children("td").eq(13), table[i-1].alarm2);
+                    }
+                } else if (res.code === 403){
+                    window.location.href = baseUrl+"/login";
+                }  else {
+                    console.log(res.msg);
+                }
+            }
+        });
+    }
+
+    // 鍥涘悜绌挎杞︽暟鎹〃鑾峰彇 ---- 琛ㄤ簩
+    function getShuttleMsgInfo() {
+        let tableEl = $('#shuttle-msg-table');
+        $.ajax({
+            url: baseUrl+ "/shuttle/table/shuttle/msg",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    var table = res.data;
+                    if (table.length > shuttleMsgTableBlankRows && table.length !== shuttleMsgTableFullRows) {
+                        initShuttleMsgTable(table.length-shuttleMsgTableBlankRows);
+                        shuttleMsgTableFullRows = 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].shuttleNo);
+                        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].speed);
+                        setVal(tr.children("td").eq(8), table[i-1].pakMk);
+                    }
+                } else if (res.code === 403){
+                    window.location.href = baseUrl+"/login";
+                }  else {
+                    console.log(res.msg);
+                }
+            }
+        });
+    }
+
+    // 绌挎杞︽棩蹇楄緭鍑� -----------------------------------------------------------------------
+    function getShuttleOutput() {
+        $.ajax({
+            url: baseUrl + "/shuttle/output/shuttle",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200) {
+                    shuttleOutput(res.data);
+                } else if (res.code === 403) {
+                    window.location.href = baseUrl + "/login";
+                } else {
+                    console.log(res.msg);
+                }
+            }
+        })
+    }
+
+    // 浠诲姟鎸囦护涓嬪彂
+    function shuttleOperator(shuttleTaskMode) {
+        http.post(baseUrl+"/shuttle/operator/shuttle", {
+            shuttleNo: $('input[name="shuttleSelect"]:checked').val(),
+            shuttleTaskMode: shuttleTaskMode
+        }, function (res) {
+            layer.msg(res.msg, {icon: 1});
+        });
+    }
+
+
+    // ------------------------------------------------------------------------------------------------
+
+    // 鍥涘悜绌挎杞︿俊鎭〃鑾峰彇  ----- 琛ㄤ竴
+    function initShuttleStateTable(row) {
+        let line;
+        if (row === undefined){
+            let one = $('#shuttle-state-table thead').height();
+            let total = $('.shuttle-state').height();
+            let count = total / one;
+            count = parseInt(count) - 1;
+            shuttleStateTableBlankRows = count;
+            line = count;
+        } else {
+            line = row;
+        }
+        let html = "";
+        for (let 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" +
+                "       <td></td>\n" +
+                "     </tr>\n";
+        }
+        $('#shuttle-state-table tbody').after(html);
+    }
+
+    // 绌挎杞︽暟鎹〃鑾峰彇  ----- 琛ㄤ簩
+    function initShuttleMsgTable(row) {
+        let line;
+        if (row === undefined){
+            let one = $('#shuttle-msg-table thead').height();
+            let total = $('.shuttle-msg').height();
+            let count = total / one;
+            count = parseInt(count) - 1;
+            shuttleMsgTableBlankRows = count;
+            line = count;
+        } else {
+            line = row;
+        }
+        let html = "";
+        for (let 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" +
+                "       <td></td>\n" +
+                "     </tr>\n";
+        }
+        $('#shuttle-msg-table tbody').after(html);
+    }
+
+    // 鏃ュ織杈撳嚭妗�
+    function shuttleOutput(content){
+        shuttleOutputDom.value += content;
+        shuttleOutputDom.scrollTop = shuttleOutputDom.scrollHeight;
+    }
+
+</script>

--
Gitblit v1.9.1