From 87c4efe93e6fe31a9c989b4aa5cc0c8f559b845d Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期五, 31 三月 2023 16:50:47 +0800
Subject: [PATCH] 提升机代码,四向穿梭车线程优化

---
 src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java     |   16 
 src/main/java/com/zy/asrs/mapper/BasLiftMapper.java               |   12 
 src/main/java/com/zy/asrs/domain/vo/LiftDataVo.java               |   16 
 src/main/java/com/zy/asrs/domain/vo/LiftStateTableVo.java         |  223 ++++
 src/main/java/com/zy/core/model/command/LiftAssignCommand.java    |   40 
 src/main/java/com/zy/core/model/protocol/LiftProtocol.java        |   66 +
 src/main/java/com/zy/asrs/service/impl/BasLiftServiceImpl.java    |   12 
 src/main/java/com/zy/asrs/domain/param/LiftOperatorParam.java     |   17 
 src/main/java/com/zy/common/utils/CommonUtils.java                |    4 
 src/main/java/com/zy/asrs/domain/vo/LiftMsgTableVo.java           |   87 +
 src/main/java/com/zy/asrs/entity/BasLiftOpt.java                  |  126 ++
 src/main/webapp/views/index.html                                  |    2 
 src/main/java/com/zy/asrs/domain/vo/ShuttleSensorDataVo.java      |   77 -
 src/main/java/com/zy/core/MainProcess.java                        |    4 
 src/main/java/com/zy/asrs/service/impl/BasLiftOptServiceImpl.java |   12 
 src/main/webapp/static/css/lift.css                               |  334 ++++++
 src/main/java/com/zy/core/enums/LiftProtocolStatusType.java       |   40 
 src/main/resources/mapper/BasLiftMapper.xml                       |   38 
 src/main/java/com/zy/asrs/service/BasLiftOptService.java          |    8 
 src/main/java/com/zy/core/thread/LiftThread.java                  |  327 +++++-
 src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java |   13 
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java       |  169 +++
 src/main/java/com/zy/core/thread/ShuttleThread.java               |   64 
 src/main/resources/mapper/BasLiftOptMapper.xml                    |   19 
 src/main/java/com/zy/core/cache/MessageQueue.java                 |   14 
 src/main/resources/mapper/WrkMastMapper.xml                       |   17 
 src/main/java/com/zy/asrs/mapper/BasLiftOptMapper.java            |   12 
 src/main/java/com/zy/asrs/service/BasLiftService.java             |    8 
 src/main/java/com/zy/asrs/entity/BasLift.java                     |  299 ++++++
 src/main/java/com/zy/core/ServerBootstrap.java                    |    2 
 src/main/webapp/views/lift.html                                   |  484 ++++++++++
 src/main/java/com/zy/core/model/command/LiftCommand.java          |   17 
 src/main/java/com/zy/asrs/controller/ShuttleController.java       |   23 
 src/main/java/com/zy/asrs/domain/vo/LiftSensorDataVo.java         |   13 
 src/main/java/com/zy/asrs/mapper/WrkMastMapper.java               |    4 
 src/main/java/com/zy/asrs/controller/LiftController.java          |  216 ++++
 36 files changed, 2,641 insertions(+), 194 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/LiftController.java b/src/main/java/com/zy/asrs/controller/LiftController.java
new file mode 100644
index 0000000..f88ea21
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/LiftController.java
@@ -0,0 +1,216 @@
+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.param.LiftOperatorParam;
+import com.zy.asrs.domain.vo.*;
+import com.zy.asrs.entity.BasLift;
+import com.zy.asrs.service.BasLiftService;
+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.SlaveType;
+import com.zy.core.model.LiftSlave;
+import com.zy.core.model.Task;
+import com.zy.core.model.command.LiftAssignCommand;
+import com.zy.core.model.protocol.LiftProtocol;
+import com.zy.core.properties.SlaveProperties;
+import com.zy.core.thread.LiftThread;
+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.List;
+
+/**
+ * 鎻愬崌鏈烘帴鍙�
+ */
+@Slf4j
+@RestController
+@RequestMapping("/lift")
+public class LiftController {
+
+    @Autowired
+    private SlaveProperties slaveProperties;
+    @Autowired
+    private BasLiftService basLiftService;
+    @Autowired
+    private WrkMastService wrkMastService;
+
+    @PostMapping("/table/lift/state")
+    @ManagerAuth(memo = "鎻愬崌鏈轰俊鎭〃")
+    public R liftStateTable(){
+        List<LiftStateTableVo> list = new ArrayList<>();
+        List<BasLift> lifts = basLiftService.selectList(new EntityWrapper<BasLift>().orderBy("lift_no"));
+        for (BasLift basLift : lifts) {
+            // 琛ㄦ牸琛�
+            LiftStateTableVo vo = new LiftStateTableVo();
+            vo.setLiftNo(basLift.getLiftNo());   //鎻愬崌鏈哄彿
+            list.add(vo);
+            // 鑾峰彇鎻愬崌鏈轰俊鎭�
+            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, basLift.getLiftNo());
+            if (liftThread == null) {
+                continue;
+            }
+            LiftProtocol liftProtocol = liftThread.getLiftProtocol();
+            if (liftProtocol == null || liftProtocol.getLiftNo()==null) {
+                continue;
+            }
+            vo.setTaskNo(liftProtocol.getTaskNo());  //  浠诲姟鍙�
+            vo.setProtocolStatus(liftProtocol.getProtocolStatusType().desc);
+            vo.setLiftLock(liftProtocol.getLiftLock());
+            vo.setPositionArrivalFeedback(liftProtocol.getPositionArrivalFeedback());
+            vo.setReady(liftProtocol.getReady());
+            vo.setRunning(liftProtocol.getRunning());
+            vo.setMode(liftProtocol.getMode());
+            vo.setLineFrontHasStock(liftProtocol.getLineFrontHasStock());
+            vo.setForwardRotationFeedback(liftProtocol.getForwardRotationFeedback());
+            vo.setReverseFeedback(liftProtocol.getReverseFeedback());
+            vo.setMotorOverload(liftProtocol.getMotorOverload());
+            vo.setLineEndHasStock(liftProtocol.getLineEndHasStock());
+            vo.setInConveyLineCardTrayAlarm(liftProtocol.getInConveyLineCardTrayAlarm());
+            vo.setOutConveyLineCardTrayAlarm(liftProtocol.getOutConveyLineCardTrayAlarm());
+            vo.setPlatPositionDeviationAlarm(liftProtocol.getPlatPositionDeviationAlarm());
+            vo.setPlatTorqueDeviationAlarm(liftProtocol.getPlatTorqueDeviationAlarm());
+            vo.setPlatShuttleCheck(liftProtocol.getPlatShuttleCheck());
+            vo.setNotReady(liftProtocol.getNotReady());
+            vo.setServoError1(liftProtocol.getServoError1());
+            vo.setServoError2(liftProtocol.getServoError2());
+            vo.setServoError3(liftProtocol.getServoError3());
+            vo.setServoError4(liftProtocol.getServoError4());
+            vo.setLiftActualSpeed(liftProtocol.getLiftActualSpeed());
+            vo.setPakMk(liftProtocol.getPakMk());
+        }
+        return R.ok().add(list);
+    }
+
+    @PostMapping("/table/lift/msg")
+    @ManagerAuth(memo = "鎻愬崌鏈烘暟鎹〃")
+    public R liftMsgTable(){
+        List<LiftMsgTableVo> list = new ArrayList<>();
+        List<BasLift> lifts = basLiftService.selectList(new EntityWrapper<BasLift>().orderBy("lift_no"));
+        for (BasLift basLift : lifts) {
+            // 琛ㄦ牸琛�
+            LiftMsgTableVo vo = new LiftMsgTableVo();
+            vo.setLiftNo(basLift.getLiftNo());   //  鎻愬崌鏈哄彿
+            list.add(vo);
+            // 鑾峰彇鎻愬崌鏈轰俊鎭�
+            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, basLift.getLiftNo());
+            if (liftThread == null) {
+                continue;
+            }
+            LiftProtocol liftProtocol = liftThread.getLiftProtocol();
+            if (liftProtocol == null) {
+                continue;
+            }
+
+            vo.setWorkNo(liftProtocol.getTaskNo().intValue());//浠诲姟鍙�
+            vo.setPakMk(liftProtocol.getPakMk()?"Y" : "N");    // 浣滀笟鏍囪
+            vo.setLineFrontHasStock(liftProtocol.getLineFrontHasStock());
+            vo.setForwardRotationFeedback(liftProtocol.getForwardRotationFeedback());
+            vo.setReverseFeedback(liftProtocol.getReverseFeedback());
+            vo.setMotorOverload(liftProtocol.getMotorOverload());
+            vo.setLineEndHasStock(liftProtocol.getLineEndHasStock());
+            vo.setInConveyLineCardTrayAlarm(liftProtocol.getInConveyLineCardTrayAlarm());
+            vo.setOutConveyLineCardTrayAlarm(liftProtocol.getOutConveyLineCardTrayAlarm());
+        }
+        return R.ok().add(list);
+    }
+
+    @PostMapping("/output/lift")
+    @ManagerAuth
+    public R liftOutput(){
+        StringBuilder str = new StringBuilder();
+        String s;
+        int i = 0;
+        while((s = OutputQueue.LIFT.poll()) != null && i <=10) {
+            str.append("\n").append(s);
+            i++;
+        }
+        return R.ok().add(str.toString());
+    }
+
+    @GetMapping("/detl/{liftNo}")
+    public R liftDetl(@PathVariable("liftNo") Integer liftNo){
+        LiftDataVo vo = new LiftDataVo();
+        for (LiftSlave liftSlave : slaveProperties.getLift()) {
+            if (liftNo.equals(liftSlave.getId())) {
+                vo.setLiftNo(liftSlave.getId());
+                BasLift basLift = basLiftService.selectById(liftSlave.getId());
+                if (!Cools.isEmpty(basLift)) {
+                    vo.setWorkNo(basLift.getWrkNo());
+                    vo.setPakMk(basLift.getPakMk());
+                }
+                break;
+            }
+        }
+        return R.ok().add(vo);
+    }
+
+    @GetMapping("/sensor/detl/{liftNo}")
+    public R liftSensorDetl(@PathVariable("liftNo") Integer liftNo){
+        LiftSensorDataVo vo = new LiftSensorDataVo();
+        for (LiftSlave liftSlave : slaveProperties.getLift()) {
+            if (liftNo.equals(liftSlave.getId())) {
+                vo.setLiftNo(liftSlave.getId());
+                // 鑾峰彇鎻愬崌鏈轰俊鎭�
+                LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftSlave.getId());
+                if (liftThread == null) {
+                    return R.error("璁惧涓嶅湪绾�");
+                }
+                LiftProtocol liftProtocol = liftThread.getLiftProtocol();
+                if (liftProtocol == null) {
+                    return R.error("璁惧涓嶅湪绾�");
+                }
+
+                break;
+            }
+        }
+        return R.ok().add(vo);
+    }
+
+    /****************************************************************/
+    /************************** 鎵嬪姩鎿嶄綔 ******************************/
+    /****************************************************************/
+
+    @ManagerAuth(memo = "鎵嬪姩鎿嶄綔")
+    @PostMapping("/operator/lift")
+    public R liftOperator(LiftOperatorParam param){
+        if (Cools.isEmpty(param.getLiftNo())) {
+            return R.parse(BaseRes.PARAM);
+        }
+
+        for (LiftSlave liftSlave : slaveProperties.getLift()) {
+            if (param.getLiftNo().equals(liftSlave.getId())) {
+                LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftSlave.getId());
+                if (liftThread == null) {
+                    throw new CoolException("鎻愬崌鏈轰笉鍦ㄧ嚎");
+                }
+                LiftProtocol liftProtocol = liftThread.getLiftProtocol();
+                if (liftProtocol == null) {
+                    throw new CoolException("鎻愬崌鏈轰笉鍦ㄧ嚎");
+                }
+
+                LiftAssignCommand assignCommand = new LiftAssignCommand();
+                assignCommand.setLiftNo(liftSlave.getId().shortValue()); // 鎻愬崌鏈虹紪鍙�
+                assignCommand.setTaskNo((short) 9999);
+                assignCommand.setTaskMode(param.getLiftTaskMode().shortValue());
+                assignCommand.setAuto(false);//鎵嬪姩妯″紡
+
+                if (MessageQueue.offer(SlaveType.Lift, liftSlave.getId(), new Task(3, assignCommand))) {
+                    return R.ok();
+                } else {
+                    throw new CoolException("鍛戒护涓嬪彂澶辫触");
+                }
+            }
+        }
+        return R.error();
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/controller/ShuttleController.java b/src/main/java/com/zy/asrs/controller/ShuttleController.java
index bb931f7..58cfaed 100644
--- a/src/main/java/com/zy/asrs/controller/ShuttleController.java
+++ b/src/main/java/com/zy/asrs/controller/ShuttleController.java
@@ -30,7 +30,6 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import java.util.Random;
 
 /**
  * 鍥涘悜绌挎杞︽帴鍙�
@@ -246,8 +245,14 @@
             return R.parse(BaseRes.PARAM);
         }
 
-        if (Cools.isEmpty(param.getSourceLocNo(), param.getDistLocNo())) {
-            return R.parse(BaseRes.PARAM);
+        ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
+
+        if (param.getShuttleTaskMode() == 1 || param.getShuttleTaskMode() == 2) {
+            if (Cools.isEmpty(param.getSourceLocNo(), param.getDistLocNo())) {
+                return R.parse(BaseRes.PARAM);
+            }
+            assignCommand.setSourceLocNo(param.getSourceLocNo());
+            assignCommand.setLocNo(param.getDistLocNo());
         }
 
         for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) {
@@ -262,14 +267,12 @@
                 }
 
                 ShuttleTaskModeType shuttleTaskModeType = ShuttleTaskModeType.get(param.getShuttleTaskMode());
-                ShuttleAssignCommand command = new ShuttleAssignCommand();
-                command.setShuttleNo(shuttleSlave.getId().shortValue()); // 鍥涘悜绌挎杞︾紪鍙�
-                command.setTaskMode(shuttleTaskModeType.id.shortValue());
-                command.setSourceLocNo(param.getSourceLocNo());
-                command.setLocNo(param.getDistLocNo());
-                command.setTaskNo((short) 9999);
+                assignCommand.setShuttleNo(shuttleSlave.getId().shortValue()); // 鍥涘悜绌挎杞︾紪鍙�
+                assignCommand.setTaskMode(shuttleTaskModeType.id.shortValue());
+                assignCommand.setTaskNo((short) 9999);
+                assignCommand.setAuto(false);//鎵嬪姩妯″紡
 
-                if (MessageQueue.offer(SlaveType.Shuttle, shuttleSlave.getId(), new Task(3, command))) {
+                if (MessageQueue.offer(SlaveType.Shuttle, shuttleSlave.getId(), new Task(3, assignCommand))) {
                     return R.ok();
                 } else {
                     throw new CoolException("鍛戒护涓嬪彂澶辫触");
diff --git a/src/main/java/com/zy/asrs/domain/param/LiftOperatorParam.java b/src/main/java/com/zy/asrs/domain/param/LiftOperatorParam.java
new file mode 100644
index 0000000..433cd17
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/param/LiftOperatorParam.java
@@ -0,0 +1,17 @@
+package com.zy.asrs.domain.param;
+
+import lombok.Data;
+
+@Data
+public class LiftOperatorParam {
+
+    // 鎻愬崌鏈哄彿
+    private Integer liftNo;
+
+    // 浠诲姟鍙�
+    private Integer taskNo = 0;
+
+    //鎿嶄綔妯″紡
+    private Integer liftTaskMode;
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/vo/LiftDataVo.java b/src/main/java/com/zy/asrs/domain/vo/LiftDataVo.java
new file mode 100644
index 0000000..12bef47
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/vo/LiftDataVo.java
@@ -0,0 +1,16 @@
+package com.zy.asrs.domain.vo;
+
+import lombok.Data;
+
+@Data
+public class LiftDataVo {
+
+    // 鎻愬崌鏈哄彿
+    private Integer liftNo;
+
+    // 宸ヤ綔鍙�
+    private Integer workNo;
+
+    private Boolean pakMk;
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/vo/LiftMsgTableVo.java b/src/main/java/com/zy/asrs/domain/vo/LiftMsgTableVo.java
new file mode 100644
index 0000000..b09be1e
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/vo/LiftMsgTableVo.java
@@ -0,0 +1,87 @@
+package com.zy.asrs.domain.vo;
+
+import lombok.Data;
+
+@Data
+public class LiftMsgTableVo {
+
+    // 鎻愬崌鏈哄彿
+    private Integer liftNo;
+
+    // 宸ヤ綔鍙�
+    private Integer workNo = 0;
+
+    // 浣滀笟鏍囪
+    private String pakMk = "-";
+
+    /**
+     * 杈撻�佺嚎鍓嶇鍏夌數鏈夎揣
+     * 鏈夎揣涓�1锛屾棤璐т负0锛堝墠绔寚闈犺繎璐ф灦渚э級
+     */
+    private Boolean lineFrontHasStock;
+
+    /**
+     * 杈撻�佺嚎姝h浆鍙嶉
+     * 姝h浆杩愯涓�1锛屽惁鍒欎负0
+     */
+    private Boolean forwardRotationFeedback;
+
+    /**
+     * 杈撻�佺嚎鍙嶈浆鍙嶉
+     * 鍙嶈浆杩愯涓�1锛屽惁鍒欎负0
+     */
+    private Boolean reverseFeedback;
+
+    /**
+     * 杈撻�佺嚎鐢垫満杩囪浇
+     * 杩囪浇涓�0锛屾甯镐负1
+     */
+    private Boolean motorOverload;
+
+    /**
+     * 杈撻�佺嚎鏈鍏夌數鏈夎揣
+     * 鏈夎揣涓�1锛屾棤璐т负0
+     */
+    private Boolean lineEndHasStock;
+
+    /**
+     * 杩涜緭閫佺嚎鍗℃墭鐩樻姤璀�
+     * 鎶ヨ涓�1锛屾湭鎶ヨ涓�0
+     */
+    private Boolean inConveyLineCardTrayAlarm;
+
+    /**
+     * 鍑鸿緭閫佺嚎鍗℃墭鐩樻姤璀�
+     * 鎶ヨ涓�1锛屾湭鎶ヨ涓�0
+     */
+    private Boolean outConveyLineCardTrayAlarm;
+
+    public String getLineFrontHasStock$() {
+        return this.lineFrontHasStock ? "Y" : "N";
+    }
+
+    public String getForwardRotationFeedback$() {
+        return this.forwardRotationFeedback ? "Y" : "N";
+    }
+
+    public String getReverseFeedback$() {
+        return this.reverseFeedback ? "Y" : "N";
+    }
+
+    public String getMotorOverload$() {
+        return this.motorOverload ? "Y" : "N";
+    }
+
+    public String getLineEndHasStock$() {
+        return this.lineEndHasStock ? "Y" : "N";
+    }
+
+    public String getInConveyLineCardTrayAlarm$() {
+        return this.inConveyLineCardTrayAlarm ? "Y" : "N";
+    }
+
+    public String getOutConveyLineCardTrayAlarm$() {
+        return this.outConveyLineCardTrayAlarm ? "Y" : "N";
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/vo/LiftSensorDataVo.java b/src/main/java/com/zy/asrs/domain/vo/LiftSensorDataVo.java
new file mode 100644
index 0000000..e88b0e7
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/vo/LiftSensorDataVo.java
@@ -0,0 +1,13 @@
+package com.zy.asrs.domain.vo;
+
+import lombok.Data;
+
+@Data
+public class LiftSensorDataVo {
+
+    /**
+     * 鎻愬崌鏈哄彿
+     */
+    private Integer liftNo;
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/vo/LiftStateTableVo.java b/src/main/java/com/zy/asrs/domain/vo/LiftStateTableVo.java
new file mode 100644
index 0000000..3a43152
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/vo/LiftStateTableVo.java
@@ -0,0 +1,223 @@
+package com.zy.asrs.domain.vo;
+
+import com.zy.core.enums.LiftProtocolStatusType;
+import lombok.Data;
+
+@Data
+public class LiftStateTableVo {
+
+    // 鎻愬崌鏈哄彿
+    private Integer liftNo;
+
+    /**
+     * 浠诲姟鍙�
+     */
+    private Short taskNo = 0;
+
+    /**
+     * 褰撳墠鎻愬崌鏈虹姸鎬侊紙鍐呴儴鑷垜缁存姢锛�
+     */
+    private String protocolStatus;
+
+    /**
+     * 鎻愬崌鏈洪攣瀹�
+     */
+    private Boolean liftLock;
+
+    /**
+     * 浣嶇疆鍒拌揪鍙嶉
+     */
+    private Short positionArrivalFeedback;
+
+    /**
+     * 鍑嗗灏辩华
+     * 灏辩华涓�1锛屾湭灏辩华涓�0
+     */
+    private Boolean ready;
+
+    /**
+     * 杩愯涓�
+     * 杩愯涓负1锛屾湭杩愯涓�0
+     */
+    private Boolean running;
+
+    /**
+     * 鑱旀満/鍗曟満
+     * 鑱旀満涓�1锛屽崟鏈轰负0
+     */
+    private Boolean mode;
+
+    /**
+     * 杈撻�佺嚎鍓嶇鍏夌數鏈夎揣
+     * 鏈夎揣涓�1锛屾棤璐т负0锛堝墠绔寚闈犺繎璐ф灦渚э級
+     */
+    private Boolean lineFrontHasStock;
+
+    /**
+     * 杈撻�佺嚎姝h浆鍙嶉
+     * 姝h浆杩愯涓�1锛屽惁鍒欎负0
+     */
+    private Boolean forwardRotationFeedback;
+
+    /**
+     * 杈撻�佺嚎鍙嶈浆鍙嶉
+     * 鍙嶈浆杩愯涓�1锛屽惁鍒欎负0
+     */
+    private Boolean reverseFeedback;
+
+    /**
+     * 杈撻�佺嚎鐢垫満杩囪浇
+     * 杩囪浇涓�0锛屾甯镐负1
+     */
+    private Boolean motorOverload;
+
+    /**
+     * 杈撻�佺嚎鏈鍏夌數鏈夎揣
+     * 鏈夎揣涓�1锛屾棤璐т负0
+     */
+    private Boolean lineEndHasStock;
+
+    /**
+     * 杩涜緭閫佺嚎鍗℃墭鐩樻姤璀�
+     * 鎶ヨ涓�1锛屾湭鎶ヨ涓�0
+     */
+    private Boolean inConveyLineCardTrayAlarm;
+
+    /**
+     * 鍑鸿緭閫佺嚎鍗℃墭鐩樻姤璀�
+     * 鎶ヨ涓�1锛屾湭鎶ヨ涓�0
+     */
+    private Boolean outConveyLineCardTrayAlarm;
+
+    /**
+     * 骞冲彴浣嶇疆鍋忓樊鎶ヨ
+     * 鎶ヨ涓�1锛屾湭鎶ヨ涓�0
+     */
+    private Boolean platPositionDeviationAlarm;
+
+    /**
+     * 骞冲彴鎵煩鍋忓樊鎶ヨ
+     * 鎶ヨ涓�1锛屾湭鎶ヨ涓�0
+     */
+    private Boolean platTorqueDeviationAlarm;
+
+    /**
+     * 骞冲彴鍥涘悜杞︽娴�
+     * 鏈夎溅涓�1锛屾棤杞︿负0
+     */
+    private Boolean platShuttleCheck;
+
+    /**
+     * 鏈氨缁姸鎬�
+     * 1.	涓嶅湪鎸囧畾灞�
+     * 2.	鍥涜酱涓嶅悓姝�
+     * 3.	骞冲彴鍓嶉檺鍏夌數琚尅鍒帮紙闈犺繎璐ф灦锛�
+     * 4.	骞冲彴鍚庨檺鍏夌數琚尅鍒帮紙杩滅璐ф灦锛�
+     * 5.	骞冲彴涓婇檺浣嶆姤璀�
+     * 6.	骞冲彴涓嬮檺浣嶆姤璀�
+     * 7.	鐢垫煖鎬ュ仠鎶ヨ
+     * 8.	杈撻�佺嚎鍓嶉檺浣嶈鎸″埌锛堥潬杩戣揣鏋讹級
+     * 9.	杈撻�佺嚎鍚庨檺浣嶈鎸″埌锛堣繙绂昏揣鏋讹級
+     * 10.	瑙︽懜灞忕揣鎬ュ仠姝㈣鎸変笅
+     * 11.	鍥涜酱鍔ㄥ姏绾挎柇绾�
+     * 12.	鍗曟満妯″紡
+     * 13.	鍥涜酱鎶ヨ
+     * 14.	浣嶇疆鍋忓樊杩囧ぇ
+     * 15.	鎵煩鍋忓樊杩囧ぇ
+     * 16.	杈撻�佺嚎杩囪浇
+     * 17.	杩涙彁鍗囨満鍗℃墭鐩�
+     * 18.	鍑烘彁鍗囨満鍗℃墭鐩�
+     */
+    private Short notReady;
+
+    /**
+     * 浼烘湇1閿欒
+     */
+    private Short servoError1;
+
+    /**
+     * 浼烘湇2閿欒
+     */
+    private Short servoError2;
+
+    /**
+     * 浼烘湇3閿欒
+     */
+    private Short servoError3;
+
+    /**
+     * 浼烘湇4閿欒
+     */
+    private Short servoError4;
+
+    /**
+     * 鎻愬崌鏈哄疄闄呴�熷害鍙嶉
+     */
+    private Short liftActualSpeed;
+
+    /**
+     * 浣滀笟鏍囪
+     */
+    private Boolean pakMk = true;
+
+    public String getLiftLock$() {
+        return this.liftLock ? "Y" : "N";
+    }
+
+    public String getReady$() {
+        return this.ready ? "Y" : "N";
+    }
+
+    public String getRunning$() {
+        return this.running ? "Y" : "N";
+    }
+
+    public String getMode$() {
+        return this.mode ? "Y" : "N";
+    }
+
+    public String getLineFrontHasStock$() {
+        return this.lineFrontHasStock ? "Y" : "N";
+    }
+
+    public String getForwardRotationFeedback$() {
+        return this.forwardRotationFeedback ? "Y" : "N";
+    }
+
+    public String getReverseFeedback$() {
+        return this.reverseFeedback ? "Y" : "N";
+    }
+
+    public String getMotorOverload$() {
+        return this.motorOverload ? "Y" : "N";
+    }
+
+    public String getLineEndHasStock$() {
+        return this.lineEndHasStock ? "Y" : "N";
+    }
+
+    public String getInConveyLineCardTrayAlarm$() {
+        return this.inConveyLineCardTrayAlarm ? "Y" : "N";
+    }
+
+    public String getOutConveyLineCardTrayAlarm$() {
+        return this.outConveyLineCardTrayAlarm ? "Y" : "N";
+    }
+
+    public String getPlatPositionDeviationAlarm$() {
+        return this.platPositionDeviationAlarm ? "Y" : "N";
+    }
+
+    public String getPlatTorqueDeviationAlarm$() {
+        return this.platTorqueDeviationAlarm ? "Y" : "N";
+    }
+
+    public String getPlatShuttleCheck$() {
+        return this.platShuttleCheck ? "Y" : "N";
+    }
+
+    public String getPakMk$() {
+        return this.pakMk ? "Y" : "N";
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/vo/ShuttleSensorDataVo.java b/src/main/java/com/zy/asrs/domain/vo/ShuttleSensorDataVo.java
index 03ef340..2af7d20 100644
--- a/src/main/java/com/zy/asrs/domain/vo/ShuttleSensorDataVo.java
+++ b/src/main/java/com/zy/asrs/domain/vo/ShuttleSensorDataVo.java
@@ -10,81 +10,4 @@
      */
     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/entity/BasLift.java b/src/main/java/com/zy/asrs/entity/BasLift.java
new file mode 100644
index 0000000..0276d84
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/BasLift.java
@@ -0,0 +1,299 @@
+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 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 io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+@Data
+@TableName("asr_bas_lift")
+public class BasLift implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鎻愬崌鏈哄彿
+     */
+    @ApiModelProperty(value= "鎻愬崌鏈哄彿")
+    @TableId(value = "lift_no", type = IdType.INPUT)
+    @TableField("lift_no")
+    private Integer liftNo;
+
+    /**
+     * 褰撳墠浠诲姟鐘舵��
+     */
+    @ApiModelProperty(value= "褰撳墠浠诲姟鐘舵��")
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 浠诲姟鍙�
+     */
+    @ApiModelProperty(value= "浠诲姟鍙�")
+    @TableField("wrk_no")
+    private Integer wrkNo;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("update_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("update_by")
+    private Long updateBy;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    /**
+     * 浣滀笟鏍囪
+     */
+    @ApiModelProperty(value= "浣滀笟鏍囪")
+    @TableField("pak_mk")
+    private Boolean pakMk;
+
+    /**
+     * 鎻愬崌鏈洪攣瀹�
+     */
+    @ApiModelProperty(value= "鎻愬崌鏈洪攣瀹�")
+    @TableField("lift_lock")
+    private Boolean liftLock;
+
+    /**
+     * 浣嶇疆鍒拌揪鍙嶉
+     */
+    @ApiModelProperty(value= "浣嶇疆鍒拌揪鍙嶉")
+    @TableField("position_arrival_feedback")
+    private Integer positionArrivalFeedback;
+
+    /**
+     * 鍑嗗灏辩华
+     */
+    @ApiModelProperty(value= "鍑嗗灏辩华")
+    private Boolean ready;
+
+    /**
+     * 杩愯涓�
+     */
+    @ApiModelProperty(value= "杩愯涓�")
+    private Boolean running;
+
+    /**
+     * 鑱旀満/鍗曟満
+     */
+    @ApiModelProperty(value= "鑱旀満/鍗曟満")
+    private Boolean mode;
+
+    /**
+     * 杈撻�佺嚎鍓嶇鍏夌數鏈夎揣
+     */
+    @ApiModelProperty(value= "杈撻�佺嚎鍓嶇鍏夌數鏈夎揣")
+    @TableField("line_front_has_stock")
+    private Boolean lineFrontHasStock;
+
+    /**
+     * 杈撻�佺嚎姝h浆鍙嶉
+     */
+    @ApiModelProperty(value= "杈撻�佺嚎姝h浆鍙嶉")
+    @TableField("forward_rotation_feedback")
+    private Boolean forwardRotationFeedback;
+
+    /**
+     * 杈撻�佺嚎鍙嶈浆鍙嶉
+     */
+    @ApiModelProperty(value= "杈撻�佺嚎鍙嶈浆鍙嶉")
+    @TableField("reverse_feedback")
+    private Boolean reverseFeedback;
+
+    /**
+     * 杈撻�佺嚎鐢垫満杩囪浇
+     */
+    @ApiModelProperty(value= "杈撻�佺嚎鐢垫満杩囪浇")
+    @TableField("motor_overload")
+    private Boolean motorOverload;
+
+    /**
+     * 杈撻�佺嚎鏈鍏夌數鏈夎揣
+     */
+    @ApiModelProperty(value= "杈撻�佺嚎鏈鍏夌數鏈夎揣")
+    @TableField("line_end_has_stock")
+    private Boolean lineEndHasStock;
+
+    /**
+     * 杩涜緭閫佺嚎鍗℃墭鐩樻姤璀�
+     */
+    @ApiModelProperty(value= "杩涜緭閫佺嚎鍗℃墭鐩樻姤璀�")
+    @TableField("in_convey_line_card_tray_alarm")
+    private Boolean inConveyLineCardTrayAlarm;
+
+    /**
+     * 鍑鸿緭閫佺嚎鍗℃墭鐩樻姤璀�
+     */
+    @ApiModelProperty(value= "鍑鸿緭閫佺嚎鍗℃墭鐩樻姤璀�")
+    @TableField("out_convey_line_card_tray_alarm")
+    private Boolean outConveyLineCardTrayAlarm;
+
+    /**
+     * 骞冲彴浣嶇疆鍋忓樊鎶ヨ
+     */
+    @ApiModelProperty(value= "骞冲彴浣嶇疆鍋忓樊鎶ヨ")
+    @TableField("plat_position_deviation_alarm")
+    private Boolean platPositionDeviationAlarm;
+
+    /**
+     * 骞冲彴鎵煩鍋忓樊鎶ヨ
+     */
+    @ApiModelProperty(value= "骞冲彴鎵煩鍋忓樊鎶ヨ")
+    @TableField("plat_torque_deviation_alarm")
+    private Boolean platTorqueDeviationAlarm;
+
+    /**
+     * 骞冲彴鍥涘悜杞︽娴�
+     */
+    @ApiModelProperty(value= "骞冲彴鍥涘悜杞︽娴�")
+    @TableField("plat_shuttle_check")
+    private Boolean platShuttleCheck;
+
+    /**
+     * 鏈氨缁姸鎬�
+     */
+    @ApiModelProperty(value= "鏈氨缁姸鎬�")
+    @TableField("not_ready")
+    private Integer notReady;
+
+    /**
+     * 浼烘湇1閿欒
+     */
+    @ApiModelProperty(value= "浼烘湇1閿欒")
+    @TableField("servo_error1")
+    private Integer servoError1;
+
+    /**
+     * 浼烘湇2閿欒
+     */
+    @ApiModelProperty(value= "浼烘湇2閿欒")
+    @TableField("servo_error2")
+    private Integer servoError2;
+
+    /**
+     * 浼烘湇3閿欒
+     */
+    @ApiModelProperty(value= "浼烘湇3閿欒")
+    @TableField("servo_error3")
+    private Integer servoError3;
+
+    /**
+     * 浼烘湇4閿欒
+     */
+    @ApiModelProperty(value= "浼烘湇4閿欒")
+    @TableField("servo_error4")
+    private Integer servoError4;
+
+    /**
+     * 鎻愬崌鏈哄疄闄呴�熷害鍙嶉
+     */
+    @ApiModelProperty(value= "鎻愬崌鏈哄疄闄呴�熷害鍙嶉")
+    @TableField("lift_actual_speed")
+    private Integer liftActualSpeed;
+
+    public BasLift() {}
+
+    public BasLift(Integer liftNo,Integer status,Integer wrkNo,Date updateTime,Long updateBy,String memo,Boolean pakMk,Boolean liftLock,Integer positionArrivalFeedback,Boolean ready,Boolean running,Boolean mode,Boolean lineFrontHasStock,Boolean forwardRotationFeedback,Boolean reverseFeedback,Boolean motorOverload,Boolean lineEndHasStock,Boolean inConveyLineCardTrayAlarm,Boolean outConveyLineCardTrayAlarm,Boolean platPositionDeviationAlarm,Boolean platTorqueDeviationAlarm,Boolean platShuttleCheck,Integer notReady,Integer servoError1,Integer servoError2,Integer servoError3,Integer servoError4,Integer liftActualSpeed) {
+        this.liftNo = liftNo;
+        this.status = status;
+        this.wrkNo = wrkNo;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+        this.memo = memo;
+        this.pakMk = pakMk;
+        this.liftLock = liftLock;
+        this.positionArrivalFeedback = positionArrivalFeedback;
+        this.ready = ready;
+        this.running = running;
+        this.mode = mode;
+        this.lineFrontHasStock = lineFrontHasStock;
+        this.forwardRotationFeedback = forwardRotationFeedback;
+        this.reverseFeedback = reverseFeedback;
+        this.motorOverload = motorOverload;
+        this.lineEndHasStock = lineEndHasStock;
+        this.inConveyLineCardTrayAlarm = inConveyLineCardTrayAlarm;
+        this.outConveyLineCardTrayAlarm = outConveyLineCardTrayAlarm;
+        this.platPositionDeviationAlarm = platPositionDeviationAlarm;
+        this.platTorqueDeviationAlarm = platTorqueDeviationAlarm;
+        this.platShuttleCheck = platShuttleCheck;
+        this.notReady = notReady;
+        this.servoError1 = servoError1;
+        this.servoError2 = servoError2;
+        this.servoError3 = servoError3;
+        this.servoError4 = servoError4;
+        this.liftActualSpeed = liftActualSpeed;
+    }
+
+//    BasLift basLift = new BasLift(
+//            null,    // 鎻愬崌鏈哄彿[闈炵┖]
+//            null,    // 褰撳墠鎻愬崌鏈虹姸鎬�
+//            null,    // 浠诲姟鍙�
+//            null,    // 淇敼鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null,    // 澶囨敞
+//            null,    // 浣滀笟鏍囪
+//            null,    // 鎻愬崌鏈洪攣瀹�
+//            null,    // 浣嶇疆鍒拌揪鍙嶉
+//            null,    // 鍑嗗灏辩华
+//            null,    // 杩愯涓�
+//            null,    // 鑱旀満/鍗曟満
+//            null,    // 杈撻�佺嚎鍓嶇鍏夌數鏈夎揣
+//            null,    // 杈撻�佺嚎姝h浆鍙嶉
+//            null,    // 杈撻�佺嚎鍙嶈浆鍙嶉
+//            null,    // 杈撻�佺嚎鐢垫満杩囪浇
+//            null,    // 杈撻�佺嚎鏈鍏夌數鏈夎揣
+//            null,    // 杩涜緭閫佺嚎鍗℃墭鐩樻姤璀�
+//            null,    // 鍑鸿緭閫佺嚎鍗℃墭鐩樻姤璀�
+//            null,    // 骞冲彴浣嶇疆鍋忓樊鎶ヨ
+//            null,    // 骞冲彴鎵煩鍋忓樊鎶ヨ
+//            null,    // 骞冲彴鍥涘悜杞︽娴�
+//            null,    // 鏈氨缁姸鎬�
+//            null,    // 浼烘湇1閿欒
+//            null,    // 浼烘湇2閿欒
+//            null,    // 浼烘湇3閿欒
+//            null,    // 浼烘湇4閿欒
+//            null    // 鎻愬崌鏈哄疄闄呴�熷害鍙嶉
+//    );
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+    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;
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/BasLiftOpt.java b/src/main/java/com/zy/asrs/entity/BasLiftOpt.java
new file mode 100644
index 0000000..932332f
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/BasLiftOpt.java
@@ -0,0 +1,126 @@
+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 java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import com.core.common.SpringUtils;
+import com.zy.system.service.UserService;
+import com.zy.system.entity.User;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+@Data
+@TableName("asr_bas_lift_opt")
+public class BasLiftOpt implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 浠诲姟鍙�
+     */
+    @ApiModelProperty(value= "浠诲姟鍙�")
+    @TableField("wrk_no")
+    private Integer wrkNo;
+
+    /**
+     * 鎻愬崌鏈哄彿
+     */
+    @ApiModelProperty(value= "鎻愬崌鏈哄彿")
+    @TableField("lift_no")
+    private Integer liftNo;
+
+    /**
+     * 涓嬪彂鏃堕棿
+     */
+    @ApiModelProperty(value= "涓嬪彂鏃堕棿")
+    @TableField("send_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date sendTime;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("update_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("update_by")
+    private Long updateBy;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    /**
+     * 鍛戒护
+     */
+    @ApiModelProperty(value= "鍛戒护")
+    private String command;
+
+    public BasLiftOpt() {}
+
+    public BasLiftOpt(Integer wrkNo,Integer liftNo,Date sendTime,Date updateTime,Long updateBy,String memo,String command) {
+        this.wrkNo = wrkNo;
+        this.liftNo = liftNo;
+        this.sendTime = sendTime;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+        this.memo = memo;
+        this.command = command;
+    }
+
+//    BasLiftOpt basLiftOpt = new BasLiftOpt(
+//            null,    // 浠诲姟鍙�
+//            null,    // 鎻愬崌鏈哄彿
+//            null,    // 涓嬪彂鏃堕棿
+//            null,    // 浣滀笟
+//            null,    // 淇敼鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null,    // 澶囨敞
+//            null    // 鍛戒护
+//    );
+
+    public String getSendTime$(){
+        if (Cools.isEmpty(this.sendTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.sendTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+    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;
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/BasLiftMapper.java b/src/main/java/com/zy/asrs/mapper/BasLiftMapper.java
new file mode 100644
index 0000000..158122e
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/BasLiftMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.zy.asrs.entity.BasLift;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BasLiftMapper extends BaseMapper<BasLift> {
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/BasLiftOptMapper.java b/src/main/java/com/zy/asrs/mapper/BasLiftOptMapper.java
new file mode 100644
index 0000000..0acb88d
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/BasLiftOptMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.zy.asrs.entity.BasLiftOpt;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BasLiftOptMapper extends BaseMapper<BasLiftOpt> {
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java b/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
index 80a0f32..43d11a3 100644
--- a/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -99,4 +99,8 @@
     WrkMast selectRackInStep48(Short workNo,Integer sourceStaNo);
 
     WrkMast selectByWorkNo59(Integer workNo);
+
+    WrkMast selectLiftStep6();
+
+    WrkMast selectByWorkNo7(Integer workNo);
 }
diff --git a/src/main/java/com/zy/asrs/service/BasLiftOptService.java b/src/main/java/com/zy/asrs/service/BasLiftOptService.java
new file mode 100644
index 0000000..40961e0
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/BasLiftOptService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.zy.asrs.entity.BasLiftOpt;
+import com.baomidou.mybatisplus.service.IService;
+
+public interface BasLiftOptService extends IService<BasLiftOpt> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/BasLiftService.java b/src/main/java/com/zy/asrs/service/BasLiftService.java
new file mode 100644
index 0000000..5f39b02
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/BasLiftService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.zy.asrs.entity.BasLift;
+import com.baomidou.mybatisplus.service.IService;
+
+public interface BasLiftService extends IService<BasLift> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/BasLiftOptServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasLiftOptServiceImpl.java
new file mode 100644
index 0000000..a581c4b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/BasLiftOptServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.zy.asrs.mapper.BasLiftOptMapper;
+import com.zy.asrs.entity.BasLiftOpt;
+import com.zy.asrs.service.BasLiftOptService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("basLiftOptService")
+public class BasLiftOptServiceImpl extends ServiceImpl<BasLiftOptMapper, BasLiftOpt> implements BasLiftOptService {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/BasLiftServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasLiftServiceImpl.java
new file mode 100644
index 0000000..868706d
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/BasLiftServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.zy.asrs.mapper.BasLiftMapper;
+import com.zy.asrs.entity.BasLift;
+import com.zy.asrs.service.BasLiftService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("basLiftService")
+public class BasLiftServiceImpl extends ServiceImpl<BasLiftMapper, BasLift> implements BasLiftService {
+
+}
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 8bb3c30..0db902b 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -23,10 +23,7 @@
 import com.zy.core.enums.*;
 import com.zy.core.model.*;
 import com.zy.core.model.command.*;
-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.model.protocol.*;
 import com.zy.core.properties.SlaveProperties;
 import com.zy.core.thread.*;
 import lombok.extern.slf4j.Slf4j;
@@ -673,9 +670,8 @@
                             //鍏ュ嚭搴撴ā寮�
                             assignCommand.setTaskMode(ShuttleTaskModeType.PAK_IN.id.shortValue());
                             //婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
-                            Short currentCode = shuttleProtocol.getCurrentCode();
-                            LocMast currentLocMast = locMastService.queryByQrCode(currentCode.toString());
-                            assignCommand.setSourceLocNo(currentLocMast.getLocNo());
+                            String currentLocNo = shuttleProtocol.getCurrentLocNo();
+                            assignCommand.setSourceLocNo(currentLocNo);
 
                             if (wrkMast.getWrkSts() == 8 || Boolean.parseBoolean(searchIdleShuttle.get("sameLay").toString())) {
                                 //鍚屼竴灞�
@@ -688,7 +684,6 @@
                                 //涓嶅悓灞傦紝灏嗙洰鏍囧簱浣嶅垎閰嶆垚鎻愬崌鏈哄簱浣嶅彿
 
                                 //灏忚溅褰撳墠灞傞珮
-                                String currentLocNo = currentLocMast.getLocNo();
                                 Integer currentLev = Integer.parseInt(currentLocNo.substring(currentLocNo.length() - 2, currentLocNo.length()));
 
                                 //鑾峰彇鎻愬崌鏈�
@@ -736,9 +731,7 @@
                 continue;
             }
 
-            Short currentCode = shuttleProtocol.getCurrentCode();//鍥涘悜绌挎杞﹀綋鍓嶄綅缃簩缁寸爜
-            LocMast shuttleLocMast = locMastService.queryByQrCode(currentCode.toString());//鎵惧埌浜岀淮鐮佸搴旂殑搴撲綅璁板綍
-            String shuttleLocNo = shuttleLocMast.getLocNo();//浜岀淮鐮佸搴斿簱浣嶅彿
+            String shuttleLocNo = shuttleProtocol.getCurrentLocNo();//浜岀淮鐮佸搴斿簱浣嶅彿
             String shuttleLocNoLay = shuttleLocNo.substring(shuttleLocNo.length() - 2, shuttleLocNo.length());//搴撲綅鍙峰搴斿眰楂�
             if (lay.equals(shuttleLocNoLay)) {
                 //褰撳墠鍥涘悜绌挎杞﹀拰宸ヤ綔妗d换鍔″湪鍚屼竴灞傦紝鍒欒皟閰嶈杞﹁締
@@ -752,9 +745,7 @@
                 recentShuttle = shuttleThread;
             }else {
                 ShuttleProtocol recentShuttleProtocol = recentShuttle.getShuttleProtocol();//鐩墠鏈�杩戠┛姊溅
-                Short recentShuttleCurrentCode = recentShuttleProtocol.getCurrentCode();//鐩墠鏈�杩戠┛姊溅浣嶇疆浜岀淮鐮�
-                LocMast recentShuttleLocMast = locMastService.queryByQrCode(recentShuttleCurrentCode.toString());//鎵惧埌浜岀淮鐮佸搴旂殑搴撲綅璁板綍
-                String recentShuttleLocNo = recentShuttleLocMast.getLocNo();//浜岀淮鐮佸搴斿簱浣嶅彿
+                String recentShuttleLocNo = recentShuttleProtocol.getCurrentLocNo();//浜岀淮鐮佸搴斿簱浣嶅彿
                 String recentShuttleLocNoLay = recentShuttleLocNo.substring(recentShuttleLocNo.length() - 2, recentShuttleLocNo.length());//搴撲綅鍙峰搴斿眰楂�
 
                 int recentShuttleLocNoLayInt = Integer.parseInt(recentShuttleLocNoLay);
@@ -838,7 +829,9 @@
                         shuttleProtocol.setLocNo(null);
                         //鏍囪澶嶄綅
                         shuttleProtocol.setPakMk(true);
-                        News.info("鍥涘悜绌挎杞﹀凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅銆傚爢鍨涙満鍙�={}", shuttleProtocol.getShuttleNo());
+                        //浠诲姟鎸囦护娓呴浂
+                        shuttleProtocol.setAssignCommand(null);
+                        News.info("鍥涘悜绌挎杞﹀凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅銆傚洓鍚戠┛姊溅鍙�={}", shuttleProtocol.getShuttleNo());
                     } else {
                         News.error("鍥涘悜绌挎杞﹀凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅澶辫触锛屼絾鏈壘鍒板伐浣滄。銆傚洓鍚戠┛姊溅鍙�={}锛屽伐浣滃彿={}", shuttleProtocol.getShuttleNo(), shuttleProtocol.getTaskNo());
                     }
@@ -849,6 +842,152 @@
     }
 
     /**
+     * 鎻愬崌鏈轰换鍔�
+     */
+    public synchronized void liftIoExecute() {
+        for (LiftSlave liftSlave : slaveProperties.getLift()) {
+            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftSlave.getId());
+            if (liftThread == null) {
+                continue;
+            }
+            LiftProtocol liftProtocol = liftThread.getLiftProtocol();
+            if (liftProtocol == null) {
+                continue;
+            }
+
+            //鍒ゆ柇鎻愬崌鏈烘槸鍚﹀浜庣┖闂茬姸鎬�
+            if (!liftProtocol.isIdle()) {
+                continue;
+            }
+
+            //鎼滅储鏄惁鏈夊緟澶勭悊鐨勪换鍔�
+            WrkMast wrkMast = wrkMastMapper.selectLiftStep6();
+            if (wrkMast == null) {
+                continue;
+            }
+
+            //缁欐彁鍗囨満鍒嗛厤浠诲姟
+            liftProtocol.setLiftLock(true);//閿佸畾鎻愬崌鏈�
+            liftProtocol.setTaskNo(wrkMast.getWrkNo().shortValue());//璁剧疆浠诲姟鍙�
+            liftProtocol.setShuttleNo(wrkMast.getShuttleNo().shortValue());//璁剧疆鍥涘悜绌挎杞﹀彿
+            liftProtocol.setProtocolStatus(LiftProtocolStatusType.WORKING);//璁剧疆鎻愬崌鏈虹姸鎬佷负宸ヤ綔涓�
+
+            //鎵惧埌鍥涘悜绌挎杞︾殑绾跨▼
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, liftProtocol.getShuttleNo().intValue());
+            if (shuttleThread == null) {
+                continue;
+            }
+            ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+            if (shuttleProtocol == null) {
+                continue;
+            }
+
+            //鍛戒护list
+            ArrayList<LiftCommand> commands = new ArrayList<>();
+
+            //褰撳墠绌挎杞﹀簱浣嶅彿
+            String currentLocNo = shuttleProtocol.getCurrentLocNo();
+            //褰撳墠绌挎杞︽ゼ灞�
+            int currentLocNoLey = Integer.parseInt(currentLocNo.substring(currentLocNo.length() - 2, currentLocNo.length()));
+
+            //宸ヤ綔妗g洰鏍囧簱浣嶅彿
+            String wrkMastLocNo = wrkMast.getLocNo();
+            //宸ヤ綔妗g洰鏍囧簱浣嶆ゼ灞�
+            int wrkMastLocNoLey = Integer.parseInt(wrkMastLocNo.substring(wrkMastLocNo.length() - 2, wrkMastLocNo.length()));
+
+            //鎻愬崌鏈哄綋鍓嶆ゼ灞�
+            int liftLev = liftProtocol.getLev().intValue();
+            if (liftLev != currentLocNoLey) {
+                //涓嶅悓妤煎眰
+                LiftCommand command1 = new LiftCommand();
+                command1.setLiftNo(liftProtocol.getLiftNo());//鎻愬崌鏈哄彿
+                command1.setTaskNo(liftProtocol.getTaskNo());//浠诲姟鍙�
+                command1.setRun((short) 1);//鍗囬檷
+                command1.setDistPosition((short) currentLocNoLey);//鐩爣妤煎眰(绌挎杞︽墍鍦ㄦゼ灞�)
+                command1.setLiftLock(true);//閿佸畾鎻愬崌鏈�
+
+                commands.add(command1);//灏嗗懡浠ゆ坊鍔犺繘list
+            }
+
+            //杈撻�佺嚎灏嗗洓鍚戠┛姊溅绉诲姩杩涙潵
+            LiftCommand command2 = new LiftCommand();
+            command2.setLiftNo(liftProtocol.getLiftNo());//鎻愬崌鏈哄彿
+            command2.setTaskNo(liftProtocol.getTaskNo());//浠诲姟鍙�
+            command2.setRun((short) 6);//杈撻�佺嚎杩愪綔
+            command2.setLiftLock(true);//閿佸畾鎻愬崌鏈�
+
+            commands.add(command2);//灏嗗懡浠ゆ坊鍔犺繘list
+
+            //鎻愬崌鏈烘惉杩愬洓鍚戠┛姊溅
+            LiftCommand command3 = new LiftCommand();
+            command3.setLiftNo(liftProtocol.getLiftNo());//鎻愬崌鏈哄彿
+            command3.setTaskNo(liftProtocol.getTaskNo());//浠诲姟鍙�
+            command3.setRun((short) 1);//鍗囬檷
+            command3.setDistPosition((short) wrkMastLocNoLey);//宸ヤ綔妗g洰鏍囨ゼ灞�
+            command3.setLiftLock(true);//閿佸畾鎻愬崌鏈�
+
+            commands.add(command3);//灏嗗懡浠ゆ坊鍔犺繘list
+
+            //鎻愬崌鏈哄埌杈炬寚瀹氭ゼ灞傦紝杈撻�佺嚎灏嗗洓鍚戠┛姊溅绉诲嚭鍘�
+            //杈撻�佺嚎灏嗗洓鍚戠┛姊溅绉诲姩杩涙潵
+            LiftCommand command4 = new LiftCommand();
+            command4.setLiftNo(liftProtocol.getLiftNo());//鎻愬崌鏈哄彿
+            command4.setTaskNo(liftProtocol.getTaskNo());//浠诲姟鍙�
+            command4.setRun((short) 3);//杈撻�佺嚎杩愪綔
+            command4.setLiftLock(true);//閿佸畾鎻愬崌鏈�
+
+            commands.add(command4);//灏嗗懡浠ゆ坊鍔犺繘list
+
+            wrkMast.setWrkSts(7L);//绉诲姩浠诲姟
+            //鎵�闇�鍛戒护缁勫悎瀹屾瘯锛屾洿鏂版暟鎹簱锛屾彁浜ゅ埌绾跨▼鍘诲伐浣�
+            LiftAssignCommand assignCommand = new LiftAssignCommand();
+            assignCommand.setCommands(commands);
+            assignCommand.setLiftNo(liftProtocol.getLiftNo());
+            assignCommand.setTaskNo(liftProtocol.getTaskNo());
+            if (wrkMastMapper.updateById(wrkMast) > 0) {
+                //涓嬪彂浠诲姟
+                MessageQueue.offer(SlaveType.Lift, liftProtocol.getLiftNo().intValue(), new Task(3, assignCommand));
+            }
+        }
+    }
+
+    /**
+     * 鎻愬崌鏈轰换鍔″畬鎴�
+     */
+    public synchronized void liftFinished() {
+        for (LiftSlave liftSlave : slaveProperties.getLift()) {
+            //鑾峰彇鎻愬崌鏈轰俊鎭�
+            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftSlave.getId());
+            LiftProtocol liftProtocol = liftThread.getLiftProtocol();
+            if (liftProtocol == null) {
+                continue;
+            }
+
+            //鎻愬崌鏈轰负绛夊緟纭
+            if (liftProtocol.getProtocolStatus() == LiftProtocolStatusType.WAITING.id && liftProtocol.getTaskNo() != 0) {
+                //灏嗕换鍔℃。鏍囪涓哄畬鎴�
+                WrkMast wrkMast = wrkMastMapper.selectByWorkNo7(liftProtocol.getTaskNo().intValue());
+                if (wrkMast != null) {
+                    wrkMast.setWrkSts(8L);
+                    if (wrkMastMapper.updateById(wrkMast) > 0) {
+                        //璁剧疆鎻愬崌鏈轰负绌洪棽鐘舵��
+                        liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE);
+                        //浠诲姟鍙锋竻闆�
+                        liftProtocol.setTaskNo((short) 0);
+                        //鏍囪澶嶄綅
+                        liftProtocol.setPakMk(true);
+                        //浠诲姟鎸囦护娓呴浂
+                        liftProtocol.setAssignCommand(null);
+                        News.info("鎻愬崌鏈哄凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅銆傛彁鍗囨満鍙�={}", liftProtocol.getLiftNo());
+                    } else {
+                        News.error("鎻愬崌鏈哄凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅澶辫触锛屼絾鏈壘鍒板伐浣滄。銆傛彁鍗囨満鍙�={}锛屽伐浣滃彿={}", liftProtocol.getLiftNo(), liftProtocol.getTaskNo());
+                    }
+                }
+            }
+        }
+    }
+
+    /**
      * 鍏ュ嚭搴�  ===>>  鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂
      */
     public synchronized void crnIoExecute(){
diff --git a/src/main/java/com/zy/common/utils/CommonUtils.java b/src/main/java/com/zy/common/utils/CommonUtils.java
index 7d850db..2b371c0 100644
--- a/src/main/java/com/zy/common/utils/CommonUtils.java
+++ b/src/main/java/com/zy/common/utils/CommonUtils.java
@@ -40,4 +40,8 @@
         return new short[]{byteToShort2, byteToShort};
     }
 
+    public static boolean shortToBoolean(Short num) {
+        return num != 0;
+    }
+
 }
diff --git a/src/main/java/com/zy/core/MainProcess.java b/src/main/java/com/zy/core/MainProcess.java
index a2f1a1d..b032df4 100644
--- a/src/main/java/com/zy/core/MainProcess.java
+++ b/src/main/java/com/zy/core/MainProcess.java
@@ -61,6 +61,10 @@
                     mainService.shuttleIoExecute();
                     //鍥涘悜绌挎杞︿换鍔″畬鎴�
                     mainService.shuttleFinished();
+                    //鎻愬崌鏈轰换鍔�
+                    mainService.liftIoExecute();
+                    //鎻愬崌鏈轰换鍔″畬鎴�
+                    mainService.liftFinished();
                     // 鍏ュ簱  ===>> 鎵ц鍫嗗灈鏈哄宸ヤ綔妗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 48d373b..665d92d 100644
--- a/src/main/java/com/zy/core/ServerBootstrap.java
+++ b/src/main/java/com/zy/core/ServerBootstrap.java
@@ -108,7 +108,7 @@
         // 鍒濆鍖栨彁鍗囨満
         News.info("鍒濆鍖栨彁鍗囨満........................................................");
         for (LiftSlave liftSlave : slaveProperties.getLift()) {
-            LiftThread liftThread = new LiftThread(liftSlave);
+            LiftThread liftThread = new LiftThread(liftSlave, redisUtil);
             new Thread(liftThread).start();
             SlaveConnection.put(SlaveType.Lift, liftSlave.getId(), liftThread);
         }
diff --git a/src/main/java/com/zy/core/cache/MessageQueue.java b/src/main/java/com/zy/core/cache/MessageQueue.java
index bc17bec..cad0ffb 100644
--- a/src/main/java/com/zy/core/cache/MessageQueue.java
+++ b/src/main/java/com/zy/core/cache/MessageQueue.java
@@ -31,6 +31,8 @@
     private static final Map<Integer, ConcurrentLinkedQueue<Task>> CAR_EXCHANGE = new ConcurrentHashMap<>();
     //鍥涘悜绌挎杞q浜ゆ崲鏈�
     private static final Map<Integer, ConcurrentLinkedQueue<Task>> SHUTTLE_EXCHANGE = new ConcurrentHashMap<>();
+    //鎻愬崌鏈簃q浜ゆ崲鏈�
+    private static final Map<Integer, ConcurrentLinkedQueue<Task>> LIFT_EXCHANGE = new ConcurrentHashMap<>();
 
     /**
      * mq 浜ゆ崲鏈哄垵濮嬪寲
@@ -61,6 +63,9 @@
             case Shuttle:
                 SHUTTLE_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>());
                 break;
+            case Lift:
+                LIFT_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>());
+                break;
             default:
                 break;
         }
@@ -88,6 +93,8 @@
                 return CAR_EXCHANGE.get(id).offer(task);
             case Shuttle:
                 return SHUTTLE_EXCHANGE.get(id).offer(task);
+            case Lift:
+                return LIFT_EXCHANGE.get(id).offer(task);
             default:
                 return false;
         }
@@ -115,6 +122,8 @@
                 return CAR_EXCHANGE.get(id).poll();
             case Shuttle:
                 return SHUTTLE_EXCHANGE.get(id).poll();
+            case Lift:
+                return LIFT_EXCHANGE.get(id).poll();
             default:
                 return null;
         }
@@ -141,6 +150,8 @@
                 return CAR_EXCHANGE.get(id).peek();
             case Shuttle:
                 return SHUTTLE_EXCHANGE.get(id).peek();
+            case Lift:
+                return LIFT_EXCHANGE.get(id).peek();
             default:
                 return null;
         }
@@ -172,6 +183,9 @@
             case Shuttle:
                 SHUTTLE_EXCHANGE.get(id).clear();
                 break;
+            case Lift:
+                LIFT_EXCHANGE.get(id).clear();
+                break;
             default:
                 break;
         }
diff --git a/src/main/java/com/zy/core/enums/LiftProtocolStatusType.java b/src/main/java/com/zy/core/enums/LiftProtocolStatusType.java
new file mode 100644
index 0000000..f3c8e67
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/LiftProtocolStatusType.java
@@ -0,0 +1,40 @@
+package com.zy.core.enums;
+
+public enum LiftProtocolStatusType {
+    IDLE(1, "绌洪棽"),
+    WORKING(2, "浣滀笟涓�"),
+    WAITING(3, "绛夊緟纭"),
+    ;
+
+    public Integer id;
+    public String desc;
+
+    LiftProtocolStatusType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static LiftProtocolStatusType get(Integer id) {
+        if (null == id) {
+            return null;
+        }
+        for (LiftProtocolStatusType type : LiftProtocolStatusType.values()) {
+            if (type.id.equals(id.intValue())) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static LiftProtocolStatusType get(LiftProtocolStatusType type) {
+        if (null == type) {
+            return null;
+        }
+        for (LiftProtocolStatusType type2 : LiftProtocolStatusType.values()) {
+            if (type2 == type) {
+                return type2;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/zy/core/model/command/LiftAssignCommand.java b/src/main/java/com/zy/core/model/command/LiftAssignCommand.java
new file mode 100644
index 0000000..f164e46
--- /dev/null
+++ b/src/main/java/com/zy/core/model/command/LiftAssignCommand.java
@@ -0,0 +1,40 @@
+package com.zy.core.model.command;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class LiftAssignCommand {
+
+    /**
+     * 鎻愬崌鏈哄彿
+     */
+    private Short liftNo = 0;
+
+    /**
+     * 浠诲姟鍙�
+     */
+    private Short taskNo = 0;
+
+    /**
+     * 鍛戒护list
+     */
+    private List<LiftCommand> commands;
+
+    /**
+     * 浣滀笟绫诲瀷
+     * 1: 涓婂崌涓�灞�
+     * 2锛� 涓嬮檷涓�灞�
+     * 3锛� 鏈夎揣姝h浆
+     * 4锛� 鏈夎揣鍙嶈浆
+     * 5锛� 澶嶄綅
+     */
+    private Short taskMode = 0;
+
+    /**
+     * 鏄惁鑷姩锛宼rue锛氳嚜鍔ㄦā寮忥紝false锛氭墜鍔ㄦā寮�
+     */
+    private Boolean auto = true;
+
+}
diff --git a/src/main/java/com/zy/core/model/command/LiftCommand.java b/src/main/java/com/zy/core/model/command/LiftCommand.java
index bb1d3d0..b1b1755 100644
--- a/src/main/java/com/zy/core/model/command/LiftCommand.java
+++ b/src/main/java/com/zy/core/model/command/LiftCommand.java
@@ -12,22 +12,12 @@
     /**
      * 鎻愬崌鏈哄彿
      */
-    private Integer liftNo = 0;
+    private Short liftNo = 0;
 
     /**
      * 浠诲姟鍙�
      */
-    private Integer taskNo = 0;
-
-    /**
-     * 浣滀笟绫诲瀷
-     */
-    private Short taskMode = 0;
-
-    /**
-     * 浠诲姟纭 false锛氭湭纭 true锛氬凡纭
-     */
-    private Boolean complete = Boolean.FALSE;
+    private Short taskNo = 0;
 
     /**
      * 寮�濮嬭繍琛�
@@ -65,6 +55,9 @@
     private Boolean liftLock;
 
     public Short getLiftLockShortValue() {
+        if (liftLock == null) {
+            return (short) 0;
+        }
         return liftLock ? (short) 1 : (short) 0;
     }
 
diff --git a/src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java b/src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java
index 07c1e2c..623a7e3 100644
--- a/src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java
+++ b/src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java
@@ -2,6 +2,9 @@
 
 import lombok.Data;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @Data
 public class ShuttleAssignCommand {
 
@@ -38,4 +41,14 @@
      */
     private String locNo;
 
+    /**
+     * 鍛戒护list
+     */
+    private List<ShuttleCommand> commands = new ArrayList<>();
+
+    /**
+     * 鏄惁鑷姩锛宼rue锛氳嚜鍔ㄦā寮忥紝false锛氭墜鍔ㄦā寮�
+     */
+    private Boolean auto = true;
+
 }
diff --git a/src/main/java/com/zy/core/model/protocol/LiftProtocol.java b/src/main/java/com/zy/core/model/protocol/LiftProtocol.java
index cd00e23..ff69c13 100644
--- a/src/main/java/com/zy/core/model/protocol/LiftProtocol.java
+++ b/src/main/java/com/zy/core/model/protocol/LiftProtocol.java
@@ -1,5 +1,13 @@
 package com.zy.core.model.protocol;
 
+import com.core.common.SpringUtils;
+import com.zy.asrs.service.BasShuttleService;
+import com.zy.core.News;
+import com.zy.core.enums.LiftProtocolStatusType;
+import com.zy.core.enums.ShuttleErrorCodeType;
+import com.zy.core.enums.ShuttleProtocolStatusType;
+import com.zy.core.enums.ShuttleStatusType;
+import com.zy.core.model.command.LiftAssignCommand;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
@@ -19,6 +27,21 @@
      * 浠诲姟鍙�
      */
     private Short taskNo = 0;
+
+    /**
+     * 鍥涘悜绌挎杞﹀彿
+     */
+    private Short shuttleNo = 0;
+
+    /**
+     * 褰撳墠鎻愬崌鏈虹姸鎬侊紙鍐呴儴鑷垜缁存姢锛�
+     */
+    private Integer protocolStatus = 1;
+
+    /**
+     * 褰撳墠鎻愬崌鏈虹姸鎬佹灇涓�
+     */
+    private LiftProtocolStatusType protocolStatusType = LiftProtocolStatusType.IDLE;
 
     /**
      * 灞�
@@ -161,8 +184,51 @@
      */
     private Short liftActualSpeed;
 
+    /**
+     * 浣滀笟鏍囪
+     */
+    private Boolean pakMk = true;
+
+    /**
+     * 浠诲姟鍛戒护
+     */
+    private LiftAssignCommand assignCommand;
+
     public Short getLiftLockShortValue() {
         return liftLock ? (short) 1 : (short) 0;
     }
 
+    /**
+     * 璁剧疆鎻愬崌鏈虹姸鎬�
+     */
+    public void setProtocolStatus(Integer status) {
+        this.protocolStatus = status;
+        this.protocolStatusType = LiftProtocolStatusType.get(status);
+    }
+
+    /**
+     * 璁剧疆鎻愬崌鏈虹姸鎬�
+     */
+    public void setProtocolStatus(LiftProtocolStatusType status) {
+        this.protocolStatus = status.id;
+        this.protocolStatusType = status;
+    }
+
+    // 鏄惁澶勪簬绌洪棽寰呭懡鐘舵��
+    public Boolean isIdle() {
+        boolean res = this.taskNo == 0
+                && !this.liftLock
+                && this.ready
+                && !this.running
+                && this.mode
+                && this.pakMk.equals(true)
+                ;
+        return res;
+    }
+
+    public void setPositionArrivalFeedback(Short position) {
+        this.lev = position;//灞傞珮
+        this.positionArrivalFeedback = position;//浣嶇疆鍒拌揪鍙嶉
+    }
+
 }
diff --git a/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java b/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java
index 8e407ec..d370e72 100644
--- a/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java
+++ b/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java
@@ -1,7 +1,9 @@
 package com.zy.core.model.protocol;
 
 import com.core.common.SpringUtils;
+import com.zy.asrs.entity.LocMast;
 import com.zy.asrs.service.BasShuttleService;
+import com.zy.asrs.service.LocMastService;
 import com.zy.core.News;
 import com.zy.core.enums.ShuttleErrorCodeType;
 import com.zy.core.enums.ShuttleProtocolStatusType;
@@ -228,4 +230,18 @@
         }
     }
 
+    //閫氳繃褰撳墠浜岀淮鐮佽幏鍙栧綋鍓嶅簱浣嶅彿
+    public String getCurrentLocNo() {
+        LocMastService locMastService = SpringUtils.getBean(LocMastService.class);
+        if (locMastService == null) {
+            return null;
+        }
+        //婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
+        LocMast currentLocMast = locMastService.queryByQrCode(this.currentCode.toString());
+        if (currentLocMast == null) {
+            return null;
+        }
+        return currentLocMast.getLocNo();
+    }
+
 }
diff --git a/src/main/java/com/zy/core/thread/LiftThread.java b/src/main/java/com/zy/core/thread/LiftThread.java
index 0f9a811..34ea0c1 100644
--- a/src/main/java/com/zy/core/thread/LiftThread.java
+++ b/src/main/java/com/zy/core/thread/LiftThread.java
@@ -5,22 +5,40 @@
 import HslCommunication.Core.Types.OperateResultExOne;
 import HslCommunication.ModBus.ModbusTcpNet;
 import com.alibaba.fastjson.JSON;
+import com.core.common.Cools;
 import com.core.common.DateUtils;
+import com.core.common.SpringUtils;
 import com.core.exception.CoolException;
+import com.zy.asrs.entity.BasLift;
+import com.zy.asrs.entity.BasLiftOpt;
+import com.zy.asrs.entity.BasShuttle;
+import com.zy.asrs.entity.BasShuttleOpt;
+import com.zy.asrs.service.BasLiftOptService;
+import com.zy.asrs.service.BasLiftService;
+import com.zy.asrs.service.BasShuttleOptService;
+import com.zy.asrs.service.BasShuttleService;
+import com.zy.common.utils.CommonUtils;
+import com.zy.common.utils.RedisUtil;
 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.enums.SlaveType;
+import com.zy.core.enums.*;
 import com.zy.core.model.LiftSlave;
 import com.zy.core.model.Task;
+import com.zy.core.model.command.LiftAssignCommand;
 import com.zy.core.model.command.LiftCommand;
+import com.zy.core.model.command.ShuttleAssignCommand;
+import com.zy.core.model.command.ShuttleCommand;
 import com.zy.core.model.protocol.LiftProtocol;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
 import java.text.MessageFormat;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
 
 /**
  * 鎻愬崌鏈虹嚎绋�
@@ -32,9 +50,11 @@
     private ModbusTcpNet modbusTcpNet;
     private LiftSlave slave;
     private LiftProtocol liftProtocol;
+    private RedisUtil redisUtil;
 
-    public LiftThread(LiftSlave slave) {
+    public LiftThread(LiftSlave slave,RedisUtil redisUtil) {
         this.slave = slave;
+        this.redisUtil = redisUtil;
     }
 
     @Override
@@ -56,6 +76,10 @@
                     case 2:
                         write((LiftCommand) task.getData());
                         break;
+                    //鍒嗛厤浠诲姟
+                    case 3:
+                        assignWork((LiftAssignCommand) task.getData());
+                        break;
                     default:
                         break;
                 }
@@ -70,7 +94,7 @@
     public boolean connect() {
         boolean result = false;
         //-------------------------鎻愬崌鏈鸿繛鎺ユ柟娉�------------------------//
-        modbusTcpNet = new ModbusTcpNet(slave.getIp(), slave.getPort(), (byte) 0x01);
+        modbusTcpNet = new ModbusTcpNet(slave.getIp(), slave.getPort(), (byte) 0x02);
         // 褰撲綘闇�瑕佹寚瀹氭牸寮忕殑鏁版嵁瑙f瀽鏃讹紝灏遍渶瑕佽缃笅闈㈢殑杩欎釜淇℃伅
         modbusTcpNet.setDataFormat(DataFormat.ABCD);
         OperateResult connect = modbusTcpNet.ConnectServer();
@@ -94,7 +118,7 @@
 
     private void readStatus() {
         try {
-            OperateResultExOne<byte[]> result = modbusTcpNet.Read("29", (short) 17);
+            OperateResultExOne<byte[]> result = modbusTcpNet.Read("29", (short) 50);
             if (result.IsSuccess) {
                 if (null == liftProtocol) {
                     liftProtocol = new LiftProtocol();
@@ -105,55 +129,106 @@
                 //鑾峰彇鏁版嵁
                 byte[] content = result.Content;
                 //鎻愬崌鏈洪攣瀹�
-                liftProtocol.setLiftLock(modbusTcpNet.getByteTransform().TransBool(content,0));
+                liftProtocol.setLiftLock(CommonUtils.shortToBoolean(modbusTcpNet.getByteTransform().TransInt16(content, 0)));
                 //浣嶇疆鍒拌揪鍙嶉
                 liftProtocol.setPositionArrivalFeedback(modbusTcpNet.getByteTransform().TransInt16(content,2));
                 //鍑嗗灏辩华
-                liftProtocol.setReady(modbusTcpNet.getByteTransform().TransBool(content,3));
+                liftProtocol.setReady(CommonUtils.shortToBoolean(modbusTcpNet.getByteTransform().TransInt16(content,4)));
                 //杩愯涓�
-                liftProtocol.setRunning(modbusTcpNet.getByteTransform().TransBool(content,4));
+                liftProtocol.setRunning(CommonUtils.shortToBoolean(modbusTcpNet.getByteTransform().TransInt16(content,6)));
                 //鑱旀満/鍗曟満
-                liftProtocol.setMode(modbusTcpNet.getByteTransform().TransBool(content,5));
+                liftProtocol.setMode(CommonUtils.shortToBoolean(modbusTcpNet.getByteTransform().TransInt16(content,8)));
+
+                //浠ヤ笅鍙傛暟骞舵湭杩涜璋冩暣(闇�瑕佸悗缁拡瀵瑰疄鏈鸿繘琛岃幏鍙栧拰璋冭瘯)
                 //杈撻�佺嚎鍓嶇鍏夌數鏈夎揣
-                liftProtocol.setLineFrontHasStock(modbusTcpNet.getByteTransform().TransBool(content,6));
+                liftProtocol.setLineFrontHasStock(modbusTcpNet.getByteTransform().TransBool(content,10));
                 //杈撻�佺嚎姝h浆鍙嶉
-                liftProtocol.setForwardRotationFeedback(modbusTcpNet.getByteTransform().TransBool(content,7));
+                liftProtocol.setForwardRotationFeedback(modbusTcpNet.getByteTransform().TransBool(content,12));
                 //杈撻�佺嚎鍙嶈浆鍙嶉
-                liftProtocol.setReverseFeedback(modbusTcpNet.getByteTransform().TransBool(content,8));
+                liftProtocol.setReverseFeedback(modbusTcpNet.getByteTransform().TransBool(content,14));
                 //杈撻�佺嚎鐢垫満杩囪浇
-                liftProtocol.setMotorOverload(modbusTcpNet.getByteTransform().TransBool(content,9));
+                liftProtocol.setMotorOverload(modbusTcpNet.getByteTransform().TransBool(content,16));
                 //杈撻�佺嚎鏈鍏夌數鏈夎揣
-                liftProtocol.setLineEndHasStock(modbusTcpNet.getByteTransform().TransBool(content,10));
+                liftProtocol.setLineEndHasStock(modbusTcpNet.getByteTransform().TransBool(content,18));
                 //杩涜緭閫佺嚎鍗℃墭鐩樻姤璀�
-                liftProtocol.setInConveyLineCardTrayAlarm(modbusTcpNet.getByteTransform().TransBool(content,11));
+                liftProtocol.setInConveyLineCardTrayAlarm(modbusTcpNet.getByteTransform().TransBool(content,20));
                 //鍑鸿緭閫佺嚎鍗℃墭鐩樻姤璀�
-                liftProtocol.setOutConveyLineCardTrayAlarm(modbusTcpNet.getByteTransform().TransBool(content,12));
+                liftProtocol.setOutConveyLineCardTrayAlarm(modbusTcpNet.getByteTransform().TransBool(content,22));
                 //骞冲彴浣嶇疆鍋忓樊鎶ヨ
-                liftProtocol.setPlatPositionDeviationAlarm(modbusTcpNet.getByteTransform().TransBool(content,13));
+                liftProtocol.setPlatPositionDeviationAlarm(modbusTcpNet.getByteTransform().TransBool(content,24));
                 //骞冲彴鎵煩鍋忓樊鎶ヨ
-                liftProtocol.setPlatTorqueDeviationAlarm(modbusTcpNet.getByteTransform().TransBool(content,14));
+                liftProtocol.setPlatTorqueDeviationAlarm(modbusTcpNet.getByteTransform().TransBool(content,26));
                 //骞冲彴鍥涘悜杞︽娴�
-                liftProtocol.setPlatShuttleCheck(modbusTcpNet.getByteTransform().TransBool(content,15));
+                liftProtocol.setPlatShuttleCheck(modbusTcpNet.getByteTransform().TransBool(content,28));
                 //鏈氨缁姸鎬�
-                liftProtocol.setNotReady(modbusTcpNet.getByteTransform().TransInt16(content,16));
+                liftProtocol.setNotReady(modbusTcpNet.getByteTransform().TransInt16(content,30));
                 //浼烘湇1閿欒
-                liftProtocol.setServoError1(modbusTcpNet.getByteTransform().TransInt16(content,17));
+                liftProtocol.setServoError1(modbusTcpNet.getByteTransform().TransInt16(content,32));
                 //浼烘湇2閿欒
-                liftProtocol.setServoError2(modbusTcpNet.getByteTransform().TransInt16(content,18));
+                liftProtocol.setServoError2(modbusTcpNet.getByteTransform().TransInt16(content,34));
                 //浼烘湇3閿欒
-                liftProtocol.setServoError3(modbusTcpNet.getByteTransform().TransInt16(content,19));
+                liftProtocol.setServoError3(modbusTcpNet.getByteTransform().TransInt16(content,36));
                 //浼烘湇4閿欒
-                liftProtocol.setServoError4(modbusTcpNet.getByteTransform().TransInt16(content,20));
+                liftProtocol.setServoError4(modbusTcpNet.getByteTransform().TransInt16(content,38));
                 //鎻愬崌鏈哄疄闄呴�熷害鍙嶉
-                liftProtocol.setLiftActualSpeed(modbusTcpNet.getByteTransform().TransInt16(content,21));
+                liftProtocol.setLiftActualSpeed(modbusTcpNet.getByteTransform().TransInt16(content,40));
 
                 ///璇诲彇鎻愬崌鏈虹姸鎬�-end
 
-                OutputQueue.LIFT.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
-//                log.info(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
+                //灏忚溅澶勪簬杩愯鐘舵�侊紝灏嗘爣璁扮疆涓簍rue
+                if (liftProtocol.getRunning()) {
+                    liftProtocol.setPakMk(true);
+                }
 
-                // 鏍规嵁瀹炴椂淇℃伅鏇存柊鏁版嵁搴�
-                //.....
+                //鎻愬崌鏈哄浜庨攣瀹氥�佹湭杩愯銆佸氨缁�佹爣璁皌rue銆佹湁浠诲姟鍙�
+                if (liftProtocol.getLiftLock()
+                        && !liftProtocol.getRunning()
+                        && liftProtocol.getReady()
+                        && liftProtocol.getPakMk()
+                        && liftProtocol.getTaskNo() != 0
+                        && liftProtocol.getAssignCommand() != null) {
+                    //杩樻湁鏈畬鎴愮殑鍛戒护
+                    executeWork(liftProtocol.getAssignCommand());
+                }
+
+                //灏嗘彁鍗囨満鐘舵�佷繚瀛樿嚦鏁版嵁搴�
+                BasLiftService liftService = SpringUtils.getBean(BasLiftService.class);
+                BasLift basLift = liftService.selectById(liftProtocol.getLiftNo());
+                if (basLift == null) {
+                    basLift = new BasLift();
+                    //鎻愬崌鏈哄彿
+                    basLift.setLiftNo(slave.getId());
+                    liftService.insert(basLift);
+                }
+                basLift.setStatus(liftProtocol.getProtocolStatus());
+                basLift.setWrkNo(liftProtocol.getTaskNo().intValue());
+                basLift.setUpdateTime(new Date());
+                basLift.setPakMk(liftProtocol.getPakMk());
+                basLift.setLiftLock(liftProtocol.getLiftLock());
+                basLift.setPositionArrivalFeedback(liftProtocol.getPositionArrivalFeedback().intValue());
+                basLift.setReady(liftProtocol.getReady());
+                basLift.setRunning(liftProtocol.getRunning());
+                basLift.setMode(liftProtocol.getMode());
+                basLift.setLineFrontHasStock(liftProtocol.getLineFrontHasStock());
+                basLift.setForwardRotationFeedback(liftProtocol.getForwardRotationFeedback());
+                basLift.setReverseFeedback(liftProtocol.getReverseFeedback());
+                basLift.setMotorOverload(liftProtocol.getMotorOverload());
+                basLift.setLineEndHasStock(liftProtocol.getLineEndHasStock());
+                basLift.setInConveyLineCardTrayAlarm(liftProtocol.getInConveyLineCardTrayAlarm());
+                basLift.setOutConveyLineCardTrayAlarm(liftProtocol.getOutConveyLineCardTrayAlarm());
+                basLift.setPlatPositionDeviationAlarm(liftProtocol.getPlatPositionDeviationAlarm());
+                basLift.setPlatTorqueDeviationAlarm(liftProtocol.getPlatTorqueDeviationAlarm());
+                basLift.setPlatShuttleCheck(liftProtocol.getPlatShuttleCheck());
+                basLift.setNotReady(liftProtocol.getNotReady().intValue());
+                basLift.setServoError1(liftProtocol.getServoError1().intValue());
+                basLift.setServoError2(liftProtocol.getServoError2().intValue());
+                basLift.setServoError3(liftProtocol.getServoError3().intValue());
+                basLift.setServoError4(liftProtocol.getServoError4().intValue());
+                basLift.setLiftActualSpeed(liftProtocol.getLiftActualSpeed().intValue());
+                if (liftService.updateById(basLift)) {
+                    OutputQueue.LIFT.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
+//                    log.info(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
+                }
 
             }else {
                 OutputQueue.LIFT.offer(MessageFormat.format("銆恵0}銆憑1}鎻愬崌鏈簆lc鐘舵�佷俊鎭け璐�", DateUtils.convert(new Date()), slave.getId()));
@@ -171,23 +246,35 @@
             return false;
         }
 
-        command.setLiftNo(slave.getId());
+        command.setLiftNo(slave.getId().shortValue());
         // 寮�濮嬩换鍔�
         short[] array = new short[30];
         //寮�濮嬭繍琛�
         array[0] = command.getRun();
-        //鐩爣浣嶇疆
-        array[1] = command.getDistPosition();
-        //杩愯閫熷害
-        array[2] = command.getSpeed();
-        //浜屽眰楂樺害璁惧畾
-        array[3] = command.getHeight2();
-        //涓夊眰楂樺害璁惧畾
-        array[4] = command.getHeight3();
-        //鍥涘眰楂樺害璁惧畾
-        array[5] = command.getHeight4();
-        //鎻愬崌鏈洪攣瀹�
-        array[29] = command.getLiftLockShortValue();
+        if (command.getDistPosition() != null) {
+            //鐩爣浣嶇疆
+            array[1] = command.getDistPosition();
+        }
+        if (command.getSpeed() != null) {
+            //杩愯閫熷害
+            array[2] = command.getSpeed();
+        }
+        if (command.getHeight2() != null) {
+            //浜屽眰楂樺害璁惧畾
+            array[3] = command.getHeight2();
+        }
+        if (command.getHeight3() != null) {
+            //涓夊眰楂樺害璁惧畾
+            array[4] = command.getHeight3();
+        }
+        if (command.getHeight4() != null) {
+            //鍥涘眰楂樺害璁惧畾
+            array[5] = command.getHeight4();
+        }
+        if (command.getLiftLockShortValue() != null) {
+            //鎻愬崌鏈洪攣瀹�
+            array[29] = command.getLiftLockShortValue();
+        }
 
         OperateResult result = modbusTcpNet.Write("0", array);;
         if (result != null && result.IsSuccess) {
@@ -199,6 +286,138 @@
             News.error("鍐欏叆鎻愬崌鏈簆lc鏁版嵁澶辫触 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
             return false;
         }
+    }
+
+    //鍒嗛厤浠诲姟
+    private void assignWork(LiftAssignCommand assignCommand) {
+        //灏嗘map瀛樺叆redis涓�
+        HashMap<String, Object> map = new HashMap<>();
+
+        //鎻愬崌鏈哄彿
+        map.put("lift_no", assignCommand.getLiftNo());
+        //宸ヤ綔鍙�
+        map.put("wrk_no", assignCommand.getTaskNo());
+        //鍛戒护鎵ц姝ュ簭
+        map.put("commandStep", 0);
+        //鍛戒护
+        map.put("assignCommand", assignCommand);
+        //浠诲姟鏁版嵁淇濆瓨鍒皉edis
+        redisUtil.set("lift_wrk_no_" + assignCommand.getTaskNo(), JSON.toJSONString(map));
+        liftProtocol.setAssignCommand(assignCommand);
+        liftProtocol.setProtocolStatus(LiftProtocolStatusType.WORKING);
+        //鎵ц涓嬪彂浠诲姟
+        executeWork(assignCommand);
+    }
+
+    //鎵ц浠诲姟
+    private boolean executeWork(LiftAssignCommand assignCommand) {
+        //璇诲彇redis鏁版嵁
+        if (assignCommand == null) {
+            return false;
+        }
+
+        //灏嗘爣璁扮疆涓篺alse(闃叉閲嶅彂)
+        liftProtocol.setPakMk(false);
+
+        //鎵嬪姩妯″紡鎸囦护
+        if (!assignCommand.getAuto()) {
+            LiftCommand command = new LiftCommand();
+            //鎻愬崌鏈哄綋鍓嶆ゼ灞�
+            Short lev = liftProtocol.getLev();
+            List<LiftCommand> commands = assignCommand.getCommands();
+            if (commands == null) {
+                commands = new ArrayList<LiftCommand>();
+            }
+            liftProtocol.setTaskNo(assignCommand.getTaskNo());
+            switch (assignCommand.getTaskMode()) {
+                case 1://涓婂崌涓�灞�
+                    command.setRun((short) 1);//鍗囬檷
+                    command.setDistPosition(++lev);
+                    break;
+                case 2://涓嬮檷涓�灞�
+                    command.setRun((short) 1);//涓嬮檷
+                    command.setDistPosition(--lev);
+                    break;
+                case 3://鏈夎揣姝h浆
+                    command.setRun((short) 6);
+                    break;
+                case 4://鏈夎揣鍙嶈浆
+                    command.setRun((short) 3);
+                    break;
+                case 5://澶嶄綅
+                    command.setRun((short) 0);
+                    command.setLiftLock(false);
+                    liftProtocol.setTaskNo((short) 0);
+                    liftProtocol.setShuttleNo((short) 0);
+                    liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE);
+                    liftProtocol.setPakMk(true);
+                    break;
+                default:
+            }
+            commands.add(command);
+            assignCommand.setCommands(commands);
+        }
+
+        Object o = redisUtil.get("lift_wrk_no_" + assignCommand.getTaskNo());
+        if (o == null) {
+            return false;
+        }
+        HashMap map = JSON.parseObject(o.toString(), HashMap.class);
+        List<LiftCommand> commands = assignCommand.getCommands();
+        //褰撳墠姝ュ簭
+        int commandStep = Integer.parseInt(map.get("commandStep").toString());
+        //鎬绘搴�
+        int size = commands.size();
+
+        //鍙栧嚭鍛戒护
+        LiftCommand command = commands.get(commandStep);
+        //涓嬪彂鍛戒护
+        if (!write(command)) {
+            News.error("鎻愬崌鏈哄懡浠や笅鍙戝け璐ワ紝鎻愬崌鏈哄彿={}锛屼换鍔℃暟鎹�={}", command.getLiftNo(), JSON.toJSON(command));
+            return false;
+        }else {
+            News.info("鎻愬崌鏈哄懡浠や笅鍙戞垚鍔燂紝鎻愬崌鏈哄彿={}锛屼换鍔℃暟鎹�={}", command.getLiftNo(), JSON.toJSON(command));
+
+            //鍒ゆ柇鏁版嵁鏄惁鎵ц瀹屾垚
+            if (commandStep < size - 1) {
+                //鏇存柊redis鏁版嵁
+                //姝ュ簭澧炲姞
+                commandStep++;
+                map.put("commandStep", commandStep);
+                //浠诲姟鏁版嵁淇濆瓨鍒皉edis
+                redisUtil.set("lift_wrk_no_" + map.get("wrk_no").toString(), JSON.toJSONString(map));
+            }else {
+                //宸叉墽琛屽畬鎴�
+                //淇濆瓨鏁版嵁鍒版暟鎹簱鍋氭祦姘�
+                BasLiftOptService liftOptService = SpringUtils.getBean(BasLiftOptService.class);
+                if (liftOptService != null) {
+                    BasLiftOpt opt = new BasLiftOpt(
+                            assignCommand.getTaskNo().intValue(),
+                            assignCommand.getLiftNo().intValue(),
+                            new Date(),
+                            null,
+                            null,
+                            null,
+                            JSON.toJSONString(assignCommand)
+                    );
+                    liftOptService.insert(opt);
+                }
+                //鍒犻櫎redis
+                redisUtil.del("lift_wrk_no_" + map.get("wrk_no").toString());
+
+                if (assignCommand.getAuto()) {
+                    //瀵逛富绾跨▼鎶涘嚭绛夊緟纭鐘舵�亀aiting
+                    liftProtocol.setProtocolStatus(LiftProtocolStatusType.WAITING);
+                    News.info("鎻愬崌鏈轰换鍔℃墽琛屽畬鎴愮瓑寰呯‘璁や腑锛屾彁鍗囨満鍙�={}锛屼换鍔℃暟鎹�={}", command.getLiftNo(), JSON.toJSON(command));
+                }else {
+                    //鎵嬪姩妯″紡涓嶆姏鍑虹瓑寰呯姸鎬�
+                    News.info("鎻愬崌鏈烘墜鍔ㄤ换鍔℃墽琛屽畬鎴愶紝鎻愬崌鏈哄彿={}锛屼换鍔℃暟鎹�={}", command.getLiftNo(), JSON.toJSON(command));
+                }
+
+            }
+        }
+
+        return true;
     }
 
     /**
@@ -218,19 +437,19 @@
         slave.setId(1);
         slave.setIp("192.168.4.24");
         slave.setPort(502);
-        LiftThread thread = new LiftThread(slave);
-        thread.connect();
-        thread.readStatus();
-
-        LiftCommand command = new LiftCommand();
-        command.setRun((short) 0);
-        command.setDistPosition((short) 12);
-        command.setSpeed((short) 300);
-        command.setHeight2((short) 100);
-        command.setHeight3((short) 200);
-        command.setHeight4((short) 303);
-        command.setLiftLock(true);
-        thread.write(command);
+//        LiftThread thread = new LiftThread(slave,);
+//        thread.connect();
+//        thread.readStatus();
+//
+//        LiftCommand command = new LiftCommand();
+//        command.setRun((short) 1);
+//        command.setDistPosition((short) 12);
+//        command.setSpeed((short) 300);
+//        command.setHeight2((short) 100);
+//        command.setHeight3((short) 200);
+//        command.setHeight4((short) 303);
+//        command.setLiftLock(true);
+//        thread.write(command);
 
     }
 
diff --git a/src/main/java/com/zy/core/thread/ShuttleThread.java b/src/main/java/com/zy/core/thread/ShuttleThread.java
index db733ce..73613c9 100644
--- a/src/main/java/com/zy/core/thread/ShuttleThread.java
+++ b/src/main/java/com/zy/core/thread/ShuttleThread.java
@@ -10,7 +10,6 @@
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.BasShuttle;
 import com.zy.asrs.entity.BasShuttleOpt;
-import com.zy.asrs.mapper.BasShuttleMapper;
 import com.zy.asrs.service.BasShuttleOptService;
 import com.zy.asrs.service.BasShuttleService;
 import com.zy.common.model.NavigateNode;
@@ -168,8 +167,11 @@
                     shuttleProtocol.setPakMk(true);
                 }
 
-                //鍥涘悜绌挎杞︾┖闂层�佹湁浠诲姟涓旀爣璁颁负true锛岄渶瑕佹墽琛屼换鍔$殑涓嬩竴鏉℃寚浠�
-                if (shuttleProtocol.getBusyStatusType() == ShuttleStatusType.IDLE && shuttleProtocol.getTaskNo() != 0 && shuttleProtocol.getPakMk()) {
+                //鍥涘悜绌挎杞︾┖闂层�佹湁浠诲姟銆佹爣璁颁负true銆佸瓨鍦ㄤ换鍔℃寚浠わ紝闇�瑕佹墽琛屼换鍔$殑涓嬩竴鏉℃寚浠�
+                if (shuttleProtocol.getBusyStatusType() == ShuttleStatusType.IDLE
+                        && shuttleProtocol.getTaskNo() != 0
+                        && shuttleProtocol.getPakMk()
+                        && shuttleProtocol.getAssignCommand() != null) {
                     //鎵ц涓嬩竴姝ユ寚浠�
                     executeWork(shuttleProtocol.getAssignCommand());
                 }
@@ -347,19 +349,23 @@
         //灏嗘map瀛樺叆redis涓�
         HashMap<String, Object> map = new HashMap<>();
 
-        //璁$畻璺緞
-        List<NavigateNode> calc = NavigateUtils.calc(assignCommand.getSourceLocNo(), assignCommand.getLocNo(), assignCommand.getTaskMode().intValue());
-        if (calc != null) {
-            //鑾峰彇鍒嗘璺緞
-            ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(calc);
-            //璺緞鏁版嵁
-            map.put("path", data);
-            //璺緞娆℃暟
-            map.put("pathSize", data.size());
-        }else {
-            if (assignCommand.getTaskMode() == ShuttleTaskModeType.PAK_IN.id.shortValue() || assignCommand.getTaskMode() == ShuttleTaskModeType.PAK_OUT.id.shortValue()) {
-                //灞炰簬鍏ュ簱鍑哄簱锛屽繀椤昏璁$畻璺緞锛屽垯鎶涘嚭寮傚父
-                throw new Exception("鏈兘鎵惧埌杩愯璺緞");
+        if (assignCommand.getTaskMode() == ShuttleTaskModeType.PAK_IN.id.shortValue()
+                || assignCommand.getTaskMode() == ShuttleTaskModeType.PAK_OUT.id.shortValue()) {
+            //鍏ュ簱鎴栧嚭搴撴ā寮忥紝璁$畻璺緞
+            //璁$畻璺緞
+            List<NavigateNode> calc = NavigateUtils.calc(assignCommand.getSourceLocNo(), assignCommand.getLocNo(), assignCommand.getTaskMode().intValue());
+            if (calc != null) {
+                //鑾峰彇鍒嗘璺緞
+                ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(calc);
+                //璺緞鏁版嵁
+                map.put("path", data);
+                //璺緞娆℃暟
+                map.put("pathSize", data.size());
+            }else {
+                if (assignCommand.getTaskMode() == ShuttleTaskModeType.PAK_IN.id.shortValue() || assignCommand.getTaskMode() == ShuttleTaskModeType.PAK_OUT.id.shortValue()) {
+                    //灞炰簬鍏ュ簱鍑哄簱锛屽繀椤昏璁$畻璺緞锛屽垯鎶涘嚭寮傚父
+                    throw new Exception("鏈兘鎵惧埌杩愯璺緞");
+                }
             }
         }
 
@@ -373,6 +379,7 @@
         map.put("assignCommand", assignCommand);
         shuttleProtocol.setTaskNo(assignCommand.getTaskNo());
         shuttleProtocol.setAssignCommand(assignCommand);
+        shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WORKING);
         //浠诲姟鏁版嵁淇濆瓨鍒皉edis
         redisUtil.set("wrk_no_" + assignCommand.getTaskNo(), JSON.toJSONString(map));
         //鎵ц涓嬪彂浠诲姟
@@ -385,7 +392,14 @@
         if (assignCommand == null) {
             return false;
         }
+
+        //灏嗘爣璁扮疆涓篺alse(闃叉閲嶅彂)
+        shuttleProtocol.setPakMk(false);
+
         Object o = redisUtil.get("wrk_no_" + assignCommand.getTaskNo());
+        if (o == null) {
+            return false;
+        }
         HashMap map = JSON.parseObject(o.toString(), HashMap.class);
         //褰撳墠姝ュ簭
         int commandStep = Integer.parseInt(map.get("commandStep").toString());
@@ -453,6 +467,8 @@
                 shuttleProtocol.setTaskNo((short) 0);
                 //鏍囪澶嶄綅
                 shuttleProtocol.setPakMk(true);
+                //浠诲姟鎸囦护娓呴浂
+                shuttleProtocol.setAssignCommand(null);
                 break;
             default:
         }
@@ -464,9 +480,6 @@
             return false;
         } else {
             News.info("鍥涘悜绌挎杞﹀懡浠や笅鍙戞垚鍔燂紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command));
-
-            //灏嗘爣璁扮疆涓篺alse(闃叉閲嶅彂)
-            shuttleProtocol.setPakMk(false);
 
             //鍒ゆ柇鏁版嵁鏄惁鎵ц瀹屾垚
             if (commandStep < size - 1) {
@@ -491,17 +504,22 @@
                             null,
                             null,
                             null,
-                            JSON.toJSONString(command)
+                            JSON.toJSONString(assignCommand)
                     );
                     shuttleOptService.insert(opt);
                 }
                 //鍒犻櫎redis
                 redisUtil.del("wrk_no_" + map.get("wrk_no").toString());
 
-                //瀵逛富绾跨▼鎶涘嚭绛夊緟纭鐘舵�亀aiting
-                shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WAITING);
+                if (!assignCommand.getAuto()) {
+                    //鎵嬪姩妯″紡涓嶆姏鍑虹瓑寰呯姸鎬侊紝鐩存帴澶嶄綅
+                    News.info("鍥涘悜绌挎杞︽墜鍔ㄤ换鍔℃墽琛屽畬鎴愶紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command));
+                }else {
+                    //瀵逛富绾跨▼鎶涘嚭绛夊緟纭鐘舵�亀aiting
+                    shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WAITING);
+                    News.info("鍥涘悜绌挎杞︿换鍔℃墽琛屽畬鎴愮瓑寰呯‘璁や腑锛岀┛姊溅鍙�={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command));
+                }
 
-                News.info("鍥涘悜绌挎杞︿换鍔℃墽琛屽畬鎴愮瓑寰呯‘璁や腑锛岀┛姊溅鍙�={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command));
             }
 
         }
diff --git a/src/main/resources/mapper/BasLiftMapper.xml b/src/main/resources/mapper/BasLiftMapper.xml
new file mode 100644
index 0000000..8bac418
--- /dev/null
+++ b/src/main/resources/mapper/BasLiftMapper.xml
@@ -0,0 +1,38 @@
+<?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.BasLiftMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasLift">
+        <result column="lift_no" property="liftNo" />
+        <result column="lift_status" property="liftStatus" />
+        <result column="wrk_no" property="wrkNo" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="memo" property="memo" />
+        <result column="pak_mk" property="pakMk" />
+        <result column="lift_lock" property="liftLock" />
+        <result column="position_arrival_feedback" property="positionArrivalFeedback" />
+        <result column="ready" property="ready" />
+        <result column="running" property="running" />
+        <result column="mode" property="mode" />
+        <result column="line_front_has_stock" property="lineFrontHasStock" />
+        <result column="forward_rotation_feedback" property="forwardRotationFeedback" />
+        <result column="reverse_feedback" property="reverseFeedback" />
+        <result column="motor_overload" property="motorOverload" />
+        <result column="line_end_has_stock" property="lineEndHasStock" />
+        <result column="in_convey_line_card_tray_alarm" property="inConveyLineCardTrayAlarm" />
+        <result column="out_convey_line_card_tray_alarm" property="outConveyLineCardTrayAlarm" />
+        <result column="plat_position_deviation_alarm" property="platPositionDeviationAlarm" />
+        <result column="plat_torque_deviation_alarm" property="platTorqueDeviationAlarm" />
+        <result column="plat_shuttle_check" property="platShuttleCheck" />
+        <result column="not_ready" property="notReady" />
+        <result column="servo_error1" property="servoError1" />
+        <result column="servo_error2" property="servoError2" />
+        <result column="servo_error3" property="servoError3" />
+        <result column="servo_error4" property="servoError4" />
+        <result column="lift_actual_speed" property="liftActualSpeed" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/BasLiftOptMapper.xml b/src/main/resources/mapper/BasLiftOptMapper.xml
new file mode 100644
index 0000000..de36cbd
--- /dev/null
+++ b/src/main/resources/mapper/BasLiftOptMapper.xml
@@ -0,0 +1,19 @@
+<?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.BasLiftOptMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasLiftOpt">
+        <id column="id" property="id" />
+        <result column="wrk_no" property="wrkNo" />
+        <result column="lift_no" property="liftNo" />
+        <result column="send_time" property="sendTime" />
+        <result column="mode" property="mode" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="memo" property="memo" />
+        <result column="command" property="command" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/WrkMastMapper.xml b/src/main/resources/mapper/WrkMastMapper.xml
index f525429..90cfbca 100644
--- a/src/main/resources/mapper/WrkMastMapper.xml
+++ b/src/main/resources/mapper/WrkMastMapper.xml
@@ -247,6 +247,21 @@
     </select>
 
     <select id="selectByWorkNo59" resultMap="BaseResultMap">
-        select top 1 * from dbo.asr_wrk_mast where wrk_no=#{workNo} and wrk_sts in (5,9)
+        select top 1 * from dbo.asr_wrk_mast
+        where wrk_no=#{workNo}
+        and wrk_sts in (5,9)
+    </select>
+
+    <select id="selectLiftStep6" resultMap="BaseResultMap">
+        select top 1 * from dbo.asr_wrk_mast
+        where wrk_sts in (6)
+        and shuttle_no is not null
+        order by io_pri desc,wrk_sts desc
+    </select>
+
+    <select id="selectByWorkNo7" resultMap="BaseResultMap">
+        select top 1 * from dbo.asr_wrk_mast
+        where wrk_no=#{workNo}
+        and wrk_sts in (7)
     </select>
 </mapper>
diff --git a/src/main/webapp/static/css/lift.css b/src/main/webapp/static/css/lift.css
new file mode 100644
index 0000000..c2160f2
--- /dev/null
+++ b/src/main/webapp/static/css/lift.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;
+}
+
+.lift-command-item {
+    padding: 4px 0;
+    margin-top: 5px;
+}
+.lift-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;
+}
+
+/* 鍙� */
+.lift-state {
+    float: left;
+    height: 100%;
+    width: 80%;
+    overflow: auto;
+}
+/* 绌挎杞︾姸鎬佽〃 */
+#lift-state-table {
+    font-size: 12px;
+    border-collapse: collapse;
+    margin: 0 auto;
+    text-align: center;
+}
+#lift-state-table td, #lift-state-table th {
+    border: 1px solid #cad9ea;
+    color: #666;
+    height: 25px;
+}
+#lift-state-table thead th {
+    background-color: #CCE8EB;
+    width: 300px;
+}
+#lift-state-table tr:nth-child(odd) {
+    background: #fff;
+}
+#lift-state-table tr:nth-child(even) {
+    background: #F5FAFA;
+}
+
+/* -------------------- 绗簩妯″潡 -------------------- */
+.lift-msg {
+    /*overflow: auto;*/
+    margin-top: 10px;
+    height: 23%;
+    background-color: #fff;
+    border-radius: 5px;
+    box-shadow: 0 0 3px rgba(0,0,0,.3);
+}
+/* 鍫嗗灈鏈虹姸鎬佷俊鎭〃 */
+#lift-msg-table {
+    font-size: 12px;
+    border-collapse: collapse;
+    margin: 0 auto;
+    text-align: center;
+}
+#lift-msg-table td, #lift-msg-table th {
+    border: 1px solid #f1f1f1;
+    color: #666;
+    height: 30px;
+}
+#lift-msg-table thead th {
+    background-color: #fff;
+    width: 400px;
+}
+#lift-msg-table tr:nth-child(odd) {
+    background: #fff;
+}
+#lift-msg-table tr:nth-child(even) {
+    background: #fff;
+}
+
+/* -------------------- 绗笁妯″潡 -------------------- */
+
+.lift-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;
+}
+#lift-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;
+}
+
+/* 鎵嬪姩鎿嶄綔閬僵 */
+.lift-operation-shade {
+    position: absolute;
+    height: 100%;
+    width: 100%;
+    z-index: 1000;
+    text-align: center;
+    padding: 80px 0;
+}
+.lift-operation-shade-span {
+    font-size: xx-large;
+    font-weight: bold;
+    color: red;
+}
+
+/* -------------------- 绗洓妯″潡 -------------------- */
+.lift-output-board {
+    margin-top: 10px;
+    height: 20%;
+    background-color: #fff;
+    border-radius: 5px;
+    box-shadow: 0 0 3px rgba(0,0,0,.3);
+}
+#lift-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;
+}
+
+
+/* 璇︽儏寮瑰嚭灞� */
+#lift-detl {
+    padding: 30px 10px 0 25px;
+    overflow: hidden;
+}
+#lift-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/views/index.html b/src/main/webapp/views/index.html
index bbbf794..c1cbf39 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -20,7 +20,7 @@
         <ul class="cl-effect-4">
             <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="lift" 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>
diff --git a/src/main/webapp/views/lift.html b/src/main/webapp/views/lift.html
new file mode 100644
index 0000000..43e400e
--- /dev/null
+++ b/src/main/webapp/views/lift.html
@@ -0,0 +1,484 @@
+<!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/lift.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>
+            <div class="lift-state">
+                <table id="lift-state-table">
+                    <thead>
+                    <tr>
+                        <th>鎻愬崌鏈�</th>
+                        <th>宸ヤ綔鍙�</th>
+                        <th>浠诲姟鐘舵��</th>
+                        <th>鎻愬崌鏈洪攣瀹�</th>
+                        <th>浣嶇疆鍒拌揪鍙嶉</th>
+                        <th>鍑嗗灏辩华</th>
+                        <th>杩愯涓�</th>
+                        <th>鑱旀満/鍗曟満</th>
+                        <th>骞冲彴浣嶇疆鍋忓樊鎶ヨ</th>
+                        <th>骞冲彴鎵煩鍋忓樊鎶ヨ</th>
+                        <th>骞冲彴鍥涘悜杞︽娴�</th>
+                        <th>鏈氨缁姸鎬�</th>
+                        <th>浼烘湇1閿欒</th>
+                        <th>浼烘湇2閿欒</th>
+                        <th>浼烘湇3閿欒</th>
+                        <th>浼烘湇4閿欒</th>
+                        <th>鎻愬崌鏈哄疄闄呴�熷害鍙嶉</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+        <!-- 鎻愬崌鏈虹姸鎬� -->
+        <div class="lift-msg">
+            <table id="lift-msg-table">
+                <thead>
+                <tr>
+                    <th>鎻愬崌鏈�</th>
+                    <th>宸ヤ綔鍙�</th>
+                    <th>杈撻�佺嚎鍓嶇鍏夌數鏈夎揣</th>
+                    <th>杈撻�佺嚎姝h浆鍙嶉</th>
+                    <th>杈撻�佺嚎鍙嶈浆鍙嶉</th>
+                    <th>杈撻�佺嚎鐢垫満杩囪浇</th>
+                    <th>杈撻�佺嚎鏈鍏夌數鏈夎揣</th>
+                    <th>杩涜緭閫佺嚎鍗℃墭鐩樻姤璀�</th>
+                    <th>鍑鸿緭閫佺嚎鍗℃墭鐩樻姤璀�</th>
+                    <th>浣滀笟鏍囪</th>
+                </tr>
+                </thead>
+                <tbody>
+                </tbody>
+            </table>
+        </div>
+        <!-- 鎵嬪姩鎿嶄綔 -->
+        <div class="lift-operation">
+            <!-- 閬僵灞� -->
+            <div class="lift-operation-shade">
+                    <span class="lift-operation-shade-span">
+                        WCS 绯荤粺杩愯涓紝璇峰仠姝㈠悗鎿嶄綔
+                    </span>
+            </div>
+            <!-- 璁惧浠诲姟閫夋嫨 -->
+            <div class="task-select">
+                <!-- 閫夋嫨 -->
+                <div id="lift-select" class="operator-item">
+                    <span class="select-title">鎻愬崌鏈哄彿</span>
+                    <div class="select-container" id="liftRadioBoxId">
+                        <!--                            <label><input type="radio" name="liftSelect" value="1" checked>&nbsp;1鍙锋彁鍗囨満</label>-->
+                    </div>
+                </div>
+            </div>
+
+            <!-- 璁惧浠诲姟鎿嶄綔 -->
+            <div class="task-operator">
+                <fieldset>
+                    <legend>鎵嬪姩鎿嶄綔</legend>
+                    <div class="button-group">
+                        <button class="item" onclick="liftOperator(1)">涓婂崌涓�灞�</button>
+                        <button class="item" onclick="liftOperator(2)">涓嬮檷涓�灞�</button>
+                        <button class="item" onclick="liftOperator(3)">鏈夎揣姝h浆</button>
+                        <button class="item" onclick="liftOperator(4)">鏈夎揣鍙嶈浆</button>
+                        <button class="item" onclick="liftOperator(5)">澶嶄綅</button>
+                    </div>
+                </fieldset>
+            </div>
+
+        </div>
+        <!-- 鎻愬崌鏈烘棩蹇楄緭鍑� -->
+        <div class="lift-output-board">
+            <textarea id="lift-output"></textarea>
+        </div>
+    </div>
+</div>
+</body>
+</html>
+<script>
+    // 绌虹櫧琛屾暟
+    var liftStateTableBlankRows = 0;
+    var liftMsgTableBlankRows = 0;
+    // 瀹為檯琛屾暟
+    var liftStateTableFullRows = 0;
+    var liftMsgTableFullRows = 0;
+    // 鍒濆鍖�
+    var liftOutputDom = document.getElementById("lift-output");
+    $(document).ready(function() {
+        initliftStateTable();
+        getliftStateInfo();
+        initliftMsgTable();
+        getliftMsgInfo();
+        operatorBlockShow();
+        setliftRadio();
+    });
+
+    setInterval(function () {
+        getliftStateInfo()
+        getliftMsgInfo();
+    },1000)
+    setInterval(function () {
+        getliftOutput();
+        operatorBlockShow();
+    },500);
+
+    // 鍒ゆ柇鎵嬪姩鎿嶄綔妯″潡鏄惁鍙敤
+    function operatorBlockShow() {
+        if (parent.systemRunning) {
+            $('.lift-operation').css("opacity", "0.5");
+            $('.lift-operation-shade').show();
+            $('.lift-operation-shade-span').show();
+        }  else {
+            $('.lift-operation').css("opacity", "1");
+            $('.lift-operation-shade').hide();
+            $('.lift-operation-shade-span').hide();
+        }
+    }
+
+    var layerIdx;
+    $(document).on('click ','.pos-btn', function () {
+        let liftNo = Number($(this).parent().attr("data-liftNo"));
+        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: $("#lift-detl"),
+            success: function(layero, index){
+                http.get(baseUrl+ "/lift/detl/"+liftNo, null, function (res) {
+                    $('#liftNo').val(liftNo);
+                    $('#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 () {
+                $('#liftNo').val("");
+                $('#workNo').val("");
+                $('#row').val("");
+                $('#bay').val("");
+                $('#lev').val("");
+                $('#crnNo').val("");
+                $('#pakMk').val("");
+            }
+        })
+    })
+
+    var layerIdx0;
+    $(document).on('click ','.mode-btn', function () {
+        let liftNo = Number($(this).parent().attr("data-liftNo"));
+        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: $("#lift-detl2"),
+            success: function(layero, index){
+                console.log(liftNo)
+                http.get(baseUrl+ "/lift/sensor/detl/"+liftNo, null, function (res) {
+                    $('#liftNo1').val(res.data.liftNo);
+                    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');
+                })
+            },
+            end: function () {
+                $('#liftNo').val("");
+            }
+        })
+    })
+
+    function getColor(res,e){
+        $(e).val(res?"鉁�":"鈥�");
+        if (res){
+            $(e).attr("style", "color: #FD482C;");
+        }else {
+            $(e).attr("style", "color: #00FF00;");
+        }
+    }
+
+    $(document).on('click ','#save', function () {
+        http.post(baseUrl+ "/lift/detl/update", {
+            liftNo: $('#liftNo').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 setliftRadio() {
+        $.ajax({
+            url: baseUrl+ "/lift/table/lift/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 liftRadioBox = '<label><input type="radio" name="liftSelect" ';
+                        if (i === 1) {
+                            liftRadioBox += 'checked '
+                        }
+                        liftRadioBox += 'value="' + table[i - 1].liftNo + '">&nbsp;' + table[i - 1].liftNo + '鍙锋彁鍗囨満</label>'
+                        $("#liftRadioBoxId").append(liftRadioBox)
+
+
+                        //娓叉煋鎻愬崌鏈烘暟鎹淮鎶ゅ拰璁惧淇℃伅html
+                        let liftCommandLogBox = '<div class="lift-command-item" data-liftNo="' + table[i - 1].liftNo + '">\n' +
+                            '<label>' + table[i - 1].liftNo + '#</label>\n' +
+                            '</div>'
+                        $("#commandLogId").append(liftCommandLogBox);
+                    }
+                } else if (res.code === 403){
+                    window.location.href = baseUrl+"/login";
+                }  else {
+                    console.log(res.msg);
+                }
+            }
+        });
+    }
+
+    // 鎻愬崌鏈轰俊鎭〃鑾峰彇 ---- 琛ㄤ竴
+    function getliftStateInfo() {
+        let tableEl = $('#lift-state-table');
+        $.ajax({
+            url: baseUrl+ "/lift/table/lift/state",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    let table = res.data;
+                    if (table.length > liftStateTableBlankRows && table.length !== liftStateTableFullRows) {
+                        initliftStateTable(table.length-liftStateTableBlankRows);
+                        liftStateTableFullRows = table.length;
+                    }
+                    for (let i=1;i<=table.length;i++){
+                        // $("#mode-"+table[i-1].liftNo).html(table[i-1].statusVal===0?'鑱旀満':'鑴辨満');
+                        let tr = tableEl.find("tr").eq(i);
+                        setVal(tr.children("td").eq(0), table[i-1].liftNo);
+                        setVal(tr.children("td").eq(1), table[i-1].taskNo);
+                        setVal(tr.children("td").eq(2), table[i-1].protocolStatus);
+                        setVal(tr.children("td").eq(3), table[i-1].liftLock$);
+                        setVal(tr.children("td").eq(4), table[i-1].positionArrivalFeedback$);
+                        setVal(tr.children("td").eq(5), table[i-1].ready$);
+                        setVal(tr.children("td").eq(6), table[i-1].running$);
+                        setVal(tr.children("td").eq(7), table[i-1].mode$);
+                        setVal(tr.children("td").eq(8), table[i-1].platPositionDeviationAlarm$);
+                        setVal(tr.children("td").eq(9), table[i-1].platTorqueDeviationAlarm$);
+                        setVal(tr.children("td").eq(10), table[i-1].platShuttleCheck$);
+                        setVal(tr.children("td").eq(11), table[i-1].notReady$);
+                        setVal(tr.children("td").eq(12), table[i-1].servoError1);
+                        setVal(tr.children("td").eq(13), table[i-1].servoError2);
+                        setVal(tr.children("td").eq(14), table[i-1].servoError3);
+                        setVal(tr.children("td").eq(14), table[i-1].servoError4);
+                        setVal(tr.children("td").eq(14), table[i-1].liftActualSpeed);
+                    }
+                } else if (res.code === 403){
+                    window.location.href = baseUrl+"/login";
+                }  else {
+                    console.log(res.msg);
+                }
+            }
+        });
+    }
+
+    // 鎻愬崌鏈烘暟鎹〃鑾峰彇 ---- 琛ㄤ簩
+    function getliftMsgInfo() {
+        let tableEl = $('#lift-msg-table');
+        $.ajax({
+            url: baseUrl+ "/lift/table/lift/msg",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    var table = res.data;
+                    if (table.length > liftMsgTableBlankRows && table.length !== liftMsgTableFullRows) {
+                        initliftMsgTable(table.length-liftMsgTableBlankRows);
+                        liftMsgTableFullRows = 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].liftNo);
+                        setVal(tr.children("td").eq(1), table[i-1].workNo);
+                        setVal(tr.children("td").eq(2), table[i-1].lineFrontHasStock$);
+                        setVal(tr.children("td").eq(3), table[i-1].forwardRotationFeedback$);
+                        setVal(tr.children("td").eq(4), table[i-1].reverseFeedback$);
+                        setVal(tr.children("td").eq(5), table[i-1].motorOverload$);
+                        setVal(tr.children("td").eq(6), table[i-1].lineEndHasStock$);
+                        setVal(tr.children("td").eq(7), table[i-1].inConveyLineCardTrayAlarm$);
+                        setVal(tr.children("td").eq(8), table[i-1].outConveyLineCardTrayAlarm$);
+                        setVal(tr.children("td").eq(9), table[i-1].pakMk);
+                    }
+                } else if (res.code === 403){
+                    window.location.href = baseUrl+"/login";
+                }  else {
+                    console.log(res.msg);
+                }
+            }
+        });
+    }
+
+    // 鎻愬崌鏈烘棩蹇楄緭鍑� -----------------------------------------------------------------------
+    function getliftOutput() {
+        $.ajax({
+            url: baseUrl + "/lift/output/lift",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200) {
+                    liftOutput(res.data);
+                } else if (res.code === 403) {
+                    window.location.href = baseUrl + "/login";
+                } else {
+                    console.log(res.msg);
+                }
+            }
+        })
+    }
+
+    // 浠诲姟鎸囦护涓嬪彂
+    function liftOperator(liftTaskMode) {
+        http.post(baseUrl+"/lift/operator/lift", {
+            liftNo: $('input[name="liftSelect"]:checked').val(),
+            liftTaskMode: liftTaskMode,
+        }, function (res) {
+            layer.msg(res.msg, {icon: 1});
+        });
+    }
+
+
+    // ------------------------------------------------------------------------------------------------
+
+    // 鎻愬崌鏈轰俊鎭〃鑾峰彇  ----- 琛ㄤ竴
+    function initliftStateTable(row) {
+        let line;
+        if (row === undefined){
+            let one = $('#lift-state-table thead').height();
+            let total = $('.lift-state').height();
+            let count = total / one;
+            count = parseInt(count) - 1;
+            liftStateTableBlankRows = 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" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "     </tr>\n";
+        }
+        $('#lift-state-table tbody').after(html);
+    }
+
+    // 鎻愬崌鏈烘暟鎹〃鑾峰彇  ----- 琛ㄤ簩
+    function initliftMsgTable(row) {
+        let line;
+        if (row === undefined){
+            let one = $('#lift-msg-table thead').height();
+            let total = $('.lift-msg').height();
+            let count = total / one;
+            count = parseInt(count) - 1;
+            liftMsgTableBlankRows = 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";
+        }
+        $('#lift-msg-table tbody').after(html);
+    }
+
+    // 鏃ュ織杈撳嚭妗�
+    function liftOutput(content){
+        liftOutputDom.value += content;
+        liftOutputDom.scrollTop = liftOutputDom.scrollHeight;
+    }
+
+</script>

--
Gitblit v1.9.1