From e315f19e12a301c8406ce4594a617e477e50ab7b Mon Sep 17 00:00:00 2001
From: LSH
Date: 星期六, 02 三月 2024 17:00:36 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/enums/SteHisTaskStatusType.java           |   41 
 src/main/java/com/zy/asrs/service/BasSteErrLogService.java          |   12 
 src/main/java/com/zy/core/enums/SteChargeType.java                  |   46 
 src/main/java/com/zy/asrs/mapper/BasSteErrMapper.java               |   12 
 src/main/java/com/zy/core/enums/SteTaskModeType.java                |  129 ++
 src/main/java/com/zy/core/enums/SteABType.java                      |   10 
 src/main/java/com/zy/core/thread/SteThread.java                     |  529 ++++++++
 src/main/java/com/zy/core/model/protocol/SteProtocol.java           |  302 ++++
 src/main/java/com/zy/asrs/entity/BasSte.java                        |  197 +++
 src/main/webapp/views/index.html                                    |    1 
 src/main/java/com/zy/core/enums/SlaveType.java                      |    3 
 src/main/java/com/zy/core/cache/OutputQueue.java                    |    2 
 src/main/java/com/zy/asrs/service/impl/BasSteErrLogServiceImpl.java |   35 
 src/main/java/com/zy/asrs/mapper/BasSteMapper.java                  |   17 
 src/main/webapp/views/news.html                                     |  114 +
 src/main/java/com/zy/core/thread/SiemensDevpThread.java             |    2 
 src/main/java/com/zy/core/News.java                                 |  220 +++
 src/main/java/com/zy/core/enums/SteStatusType.java                  |   43 
 src/main/java/com/zy/asrs/entity/BasSteErr.java                     |  148 ++
 src/main/java/com/zy/asrs/service/BasSteErrService.java             |    8 
 src/main/java/com/zy/asrs/service/BasSteService.java                |   14 
 src/main/java/com/zy/asrs/utils/SteUtils.java                       |  424 ++++++
 src/main/java/com/zy/asrs/service/impl/BasSteOptServiceImpl.java    |   12 
 src/main/webapp/views/ste.html                                      |  508 ++++++++
 src/main/java/com/zy/asrs/entity/BasSteOpt.java                     |  341 +++++
 src/main/java/com/zy/core/model/SteSlave.java                       |   49 
 src/main/java/com/zy/asrs/mapper/BasSteOptMapper.java               |   12 
 src/main/java/com/zy/core/model/command/SteCommand.java             |   95 +
 src/main/java/com/zy/core/enums/SteLocaType.java                    |   42 
 src/main/java/com/zy/asrs/mapper/BasSteErrLogMapper.java            |   12 
 src/main/java/com/zy/asrs/entity/BasSteErrLog.java                  |  263 ++++
 src/main/java/com/zy/asrs/service/impl/BasSteErrServiceImpl.java    |   12 
 src/main/java/com/zy/asrs/service/impl/BasSteServiceImpl.java       |   41 
 src/main/java/com/zy/asrs/service/BasSteOptService.java             |    8 
 34 files changed, 3,703 insertions(+), 1 deletions(-)

diff --git a/src/main/java/com/zy/asrs/entity/BasSte.java b/src/main/java/com/zy/asrs/entity/BasSte.java
new file mode 100644
index 0000000..596f569
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/BasSte.java
@@ -0,0 +1,197 @@
+package com.zy.asrs.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.core.common.Cools;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Data
+@TableName("asr_bas_ste")
+public class BasSte implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 绌挎杞﹀彿
+     */
+    @ApiModelProperty(value= "绌挎杞﹀彿")
+    @TableId(value = "ste_no", type = IdType.INPUT)
+    @TableField("ste_no")
+    private Integer steNo;
+
+    /**
+     * 鍙叆
+     */
+    @ApiModelProperty(value= "鍙叆")
+    @TableField("in_enable")
+    private String inEnable;
+
+    /**
+     * 鍙嚭
+     */
+    @ApiModelProperty(value= "鍙嚭")
+    @TableField("out_enable")
+    private String outEnable;
+
+    /**
+     * 鐘舵��
+     */
+    @ApiModelProperty(value= "鐘舵��")
+    @TableField("ste_sts")
+    private Integer steSts;
+
+    /**
+     * 浠诲姟鍙�
+     */
+    @ApiModelProperty(value= "浠诲姟鍙�")
+    @TableField("wrk_no")
+    private Integer wrkNo;
+
+    /**
+     * 浠诲姟鍙�
+     */
+    @ApiModelProperty(value= "鍫嗗灈鏈哄彿")
+    @TableField("crn_no")
+    private Integer crnNo;
+
+    /**
+     * 鎺�
+     */
+    @ApiModelProperty(value= "鎺�")
+    private Integer row;
+
+    /**
+     * 鍒�
+     */
+    @ApiModelProperty(value= "鍒�")
+    private Integer bay;
+
+    /**
+     * 灞�
+     */
+    @ApiModelProperty(value= "灞�")
+    private Integer lev;
+
+    /**
+     * 鍘嗗彶鎺�
+     */
+    @ApiModelProperty(value= "鍘嗗彶鎺�")
+    @TableField("his_row")
+    private Integer hisRow;
+
+    /**
+     * 鍘嗗彶鍒�
+     */
+    @ApiModelProperty(value= "鍘嗗彶鍒�")
+    @TableField("his_bay")
+    private Integer hisBay;
+
+    /**
+     * 鍘嗗彶灞�
+     */
+    @ApiModelProperty(value= "鍘嗗彶灞�")
+    @TableField("his_lev")
+    private Integer hisLev;
+
+    /**
+     * 鏆傚瓨搴撲綅
+     */
+    @ApiModelProperty(value= "鏆傚瓨搴撲綅")
+    @TableField("idle_loc")
+    private String idleLoc;
+
+    /**
+     * 閿欒鐮�
+     */
+    @ApiModelProperty(value= "閿欒鐮�")
+    @TableField("ste_err")
+    private Long steErr;
+
+    /**
+     * 鏍囪
+     */
+    @ApiModelProperty(value= "鏍囪")
+    @TableField("pak_mk")
+    private String pakMk;
+
+    /**
+     * 鑷姩鍏呯數
+     */
+    @ApiModelProperty(value= "鑷姩鍏呯數")
+    @TableField("auto_charge")
+    private String autoCharge;
+
+    /**
+     * 鏈�浣庣數閲�
+     */
+    @ApiModelProperty(value= "鏈�浣庣數閲�")
+    @TableField("charge_line")
+    private String chargeLine;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 绂佺敤
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 绂佺敤  ")
+    private Integer status;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    @TableField("create_by")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @TableField("create_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("update_by")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("update_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/BasSteErr.java b/src/main/java/com/zy/asrs/entity/BasSteErr.java
new file mode 100644
index 0000000..ca59e78
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/BasSteErr.java
@@ -0,0 +1,148 @@
+package com.zy.asrs.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.core.common.Cools;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@TableName("asr_bas_ste_err")
+public class BasSteErr implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 寮傚父鐮�
+     */
+    @ApiModelProperty(value= "寮傚父鐮�")
+    @TableId(value = "error_code", type = IdType.INPUT)
+    @TableField("error_code")
+    private Long errorCode;
+
+    /**
+     * 寮傚父
+     */
+    @ApiModelProperty(value= "寮傚父")
+    @TableField("err_name")
+    private String errName;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("modi_user")
+    private Long modiUser;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("modi_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date modiTime;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    @TableField("appe_user")
+    private Long appeUser;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @TableField("appe_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date appeTime;
+
+    public BasSteErr() {}
+
+    public BasSteErr(Long errorCode,String errName,Long modiUser,Date modiTime,Long appeUser,Date appeTime) {
+        this.errorCode = errorCode;
+        this.errName = errName;
+        this.modiUser = modiUser;
+        this.modiTime = modiTime;
+        this.appeUser = appeUser;
+        this.appeTime = appeTime;
+    }
+
+//    BasSteErr basSteErr = new BasSteErr(
+//            null,    // 寮傚父鐮乕闈炵┖]
+//            null,    // 寮傚父
+//            null,    // 淇敼浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null,    // 娣诲姞浜哄憳
+//            null    // 娣诲姞鏃堕棿
+//    );
+
+    public Long getErrorCode() {
+        return errorCode;
+    }
+
+    public void setErrorCode(Long errorCode) {
+        this.errorCode = errorCode;
+    }
+
+    public String getErrName() {
+        return errName;
+    }
+
+    public void setErrName(String errName) {
+        this.errName = errName;
+    }
+
+    public Long getModiUser() {
+        return modiUser;
+    }
+
+    public void setModiUser(Long modiUser) {
+        this.modiUser = modiUser;
+    }
+
+    public Date getModiTime() {
+        return modiTime;
+    }
+
+    public String getModiTime$(){
+        if (Cools.isEmpty(this.modiTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.modiTime);
+    }
+
+    public void setModiTime(Date modiTime) {
+        this.modiTime = modiTime;
+    }
+
+    public Long getAppeUser() {
+        return appeUser;
+    }
+
+    public void setAppeUser(Long appeUser) {
+        this.appeUser = appeUser;
+    }
+
+    public Date getAppeTime() {
+        return appeTime;
+    }
+
+    public String getAppeTime$(){
+        if (Cools.isEmpty(this.appeTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appeTime);
+    }
+
+    public void setAppeTime(Date appeTime) {
+        this.appeTime = appeTime;
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/BasSteErrLog.java b/src/main/java/com/zy/asrs/entity/BasSteErrLog.java
new file mode 100644
index 0000000..65249e0
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/BasSteErrLog.java
@@ -0,0 +1,263 @@
+package com.zy.asrs.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.core.common.Cools;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Data
+@TableName("asr_bas_ste_err_log")
+public class BasSteErrLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 缂栧彿
+     */
+    @ApiModelProperty(value= "缂栧彿")
+    private String uuid;
+
+    /**
+     * 宸ヤ綔鍙�
+     */
+    @ApiModelProperty(value= "宸ヤ綔鍙�")
+    @TableField("wrk_no")
+    private Integer wrkNo;
+
+    /**
+     * 鍙戠敓鏃堕棿
+     */
+    @ApiModelProperty(value= "鍙戠敓鏃堕棿")
+    @TableField("start_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date startTime;
+
+    /**
+     * 缁撴潫鏃堕棿
+     */
+    @ApiModelProperty(value= "缁撴潫鏃堕棿")
+    @TableField("end_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date endTime;
+
+    /**
+     * 宸ヤ綔鐘舵��
+     */
+    @ApiModelProperty(value= "宸ヤ綔鐘舵��")
+    @TableField("wrk_sts")
+    private Long wrkSts;
+
+    /**
+     * 鍏ュ嚭搴撶被鍨�
+     */
+    @ApiModelProperty(value= "鍏ュ嚭搴撶被鍨�")
+    @TableField("io_type")
+    private Integer ioType;
+
+    /**
+     * 绌挎杞�
+     */
+    @ApiModelProperty(value= "绌挎杞�")
+    @TableField("ste_no")
+    private Integer steNo;
+
+    /**
+     * plc
+     */
+    @ApiModelProperty(value= "plc")
+    @TableField("plc_no")
+    private Integer plcNo;
+
+    /**
+     * 鐩爣搴撲綅
+     */
+    @ApiModelProperty(value= "鐩爣搴撲綅")
+    @TableField("loc_no")
+    private String locNo;
+
+    /**
+     * 鐩爣绔�
+     */
+    @ApiModelProperty(value= "鐩爣绔�")
+    @TableField("sta_no")
+    private Integer staNo;
+
+    /**
+     * 婧愮珯
+     */
+    @ApiModelProperty(value= "婧愮珯")
+    @TableField("source_sta_no")
+    private Integer sourceStaNo;
+
+    /**
+     * 婧愬簱浣�
+     */
+    @ApiModelProperty(value= "婧愬簱浣�")
+    @TableField("source_loc_no")
+    private String sourceLocNo;
+
+    /**
+     * 鏉$爜
+     */
+    @ApiModelProperty(value= "鏉$爜")
+    private String barcode;
+
+    /**
+     * 寮傚父鐮�
+     */
+    @ApiModelProperty(value= "寮傚父鐮�")
+    @TableField("err_code")
+    private Integer errCode;
+
+    /**
+     * 寮傚父
+     */
+    @ApiModelProperty(value= "寮傚父")
+    private String error;
+
+    /**
+     * 寮傚父鎯呭喌 1: 鏈鐞�  2: 宸蹭慨澶�
+     */
+    @ApiModelProperty(value= "寮傚父鎯呭喌 1: 鏈鐞�  2: 宸蹭慨澶�  ")
+    private Integer status;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @TableField("create_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    @TableField("create_by")
+    private Long createBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("update_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("update_by")
+    private Long updateBy;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public BasSteErrLog() {}
+
+    public BasSteErrLog(String uuid, Integer wrkNo, Date startTime, Date endTime, Long wrkSts, Integer ioType, Integer steNo, Integer plcNo, String locNo, Integer staNo, Integer sourceStaNo, String sourceLocNo, String barcode, Integer errCode, String error, Integer status, Date createTime, Long createBy, Date updateTime, Long updateBy, String memo) {
+        this.uuid = uuid;
+        this.wrkNo = wrkNo;
+        this.startTime = startTime;
+        this.endTime = endTime;
+        this.wrkSts = wrkSts;
+        this.ioType = ioType;
+        this.steNo = steNo;
+        this.plcNo = plcNo;
+        this.locNo = locNo;
+        this.staNo = staNo;
+        this.sourceStaNo = sourceStaNo;
+        this.sourceLocNo = sourceLocNo;
+        this.barcode = barcode;
+        this.errCode = errCode;
+        this.error = error;
+        this.status = status;
+        this.createTime = createTime;
+        this.createBy = createBy;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+        this.memo = memo;
+    }
+
+//    BasSteErrLog basSteErrLog = new BasSteErrLog(
+//            null,    // 缂栧彿
+//            null,    // 宸ヤ綔鍙�
+//            null,    // 鍙戠敓鏃堕棿
+//            null,    // 缁撴潫鏃堕棿
+//            null,    // 宸ヤ綔鐘舵��
+//            null,    // 鍏ュ嚭搴撶被鍨�
+//            null,    // 绌挎杞�
+//            null,    // plc
+//            null,    // 鐩爣搴撲綅
+//            null,    // 鐩爣绔�
+//            null,    // 婧愮珯
+//            null,    // 婧愬簱浣�
+//            null,    // 鏉$爜
+//            null,    // 寮傚父鐮�
+//            null,    // 寮傚父
+//            null,    // 寮傚父鎯呭喌
+//            null,    // 娣诲姞鏃堕棿
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null    // 澶囨敞
+//    );
+
+    public String getStartTime$(){
+        if (Cools.isEmpty(this.startTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.startTime);
+    }
+
+    public String getEndTime$(){
+        if (Cools.isEmpty(this.endTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.endTime);
+    }
+
+    public String getStatus$(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return "鏈鐞�";
+            case 2:
+                return "宸蹭慨澶�";
+            default:
+                return String.valueOf(this.status);
+        }
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/BasSteOpt.java b/src/main/java/com/zy/asrs/entity/BasSteOpt.java
new file mode 100644
index 0000000..02c3a03
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/BasSteOpt.java
@@ -0,0 +1,341 @@
+package com.zy.asrs.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.core.common.Cools;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@TableName("asr_bas_ste_opt")
+public class BasSteOpt implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 浠诲姟鍙�
+     */
+    @ApiModelProperty(value= "浠诲姟鍙�")
+    @TableField("wrk_no")
+    private Integer wrkNo;
+
+    /**
+     * 绌挎杞�
+     */
+    @ApiModelProperty(value= "绌挎杞�")
+    @TableField("ste_no")
+    private Integer steNo;
+
+    /**
+     * 涓嬪彂鏃堕棿
+     */
+    @ApiModelProperty(value= "涓嬪彂鏃堕棿")
+    @TableField("send_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date sendTime;
+
+    /**
+     * 浣滀笟
+     */
+    @ApiModelProperty(value= "浣滀笟")
+    private String mode;
+
+    /**
+     * 婧愭帓
+     */
+    @ApiModelProperty(value= "婧愭帓")
+    @TableField("source_row")
+    private Integer sourceRow;
+
+    /**
+     * 婧愬垪
+     */
+    @ApiModelProperty(value= "婧愬垪")
+    @TableField("source_bay")
+    private Integer sourceBay;
+
+    /**
+     * 婧愬眰
+     */
+    @ApiModelProperty(value= "婧愬眰")
+    @TableField("source_lev")
+    private Integer sourceLev;
+
+    /**
+     * 婧愮珯
+     */
+    @ApiModelProperty(value= "婧愮珯")
+    @TableField("source_sta")
+    private Integer sourceSta;
+
+    /**
+     * 鐩爣鎺�
+     */
+    @ApiModelProperty(value= "鐩爣鎺�")
+    @TableField("pos_row")
+    private Integer posRow;
+
+    /**
+     * 鐩爣鍒�
+     */
+    @ApiModelProperty(value= "鐩爣鍒�")
+    @TableField("pos_bay")
+    private Integer posBay;
+
+    /**
+     * 鐩爣灞�
+     */
+    @ApiModelProperty(value= "鐩爣灞�")
+    @TableField("pos_lev")
+    private Integer posLev;
+
+    /**
+     * 鐩爣绔�
+     */
+    @ApiModelProperty(value= "鐩爣绔�")
+    @TableField("pos_sta")
+    private Integer posSta;
+
+    /**
+     * 鍝嶅簲缁撴灉 1: 姝e父  0: 澶辫触
+     */
+    @ApiModelProperty(value= "鍝嶅簲缁撴灉 1: 姝e父  0: 澶辫触  ")
+    private Integer response;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("update_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("update_by")
+    private Long updateBy;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public BasSteOpt() {}
+
+    public BasSteOpt(Integer wrkNo,Integer steNo,Date sendTime,String mode,Integer sourceRow,Integer sourceBay,Integer sourceLev,Integer sourceSta,Integer posRow,Integer posBay,Integer posLev,Integer posSta,Integer response,Date updateTime,Long updateBy,String memo) {
+        this.wrkNo = wrkNo;
+        this.steNo = steNo;
+        this.sendTime = sendTime;
+        this.mode = mode;
+        this.sourceRow = sourceRow;
+        this.sourceBay = sourceBay;
+        this.sourceLev = sourceLev;
+        this.sourceSta = sourceSta;
+        this.posRow = posRow;
+        this.posBay = posBay;
+        this.posLev = posLev;
+        this.posSta = posSta;
+        this.response = response;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+        this.memo = memo;
+    }
+
+//    BasSteOpt basSteOpt = new BasSteOpt(
+//            null,    // 浠诲姟鍙�
+//            null,    // 绌挎杞�
+//            null,    // 涓嬪彂鏃堕棿
+//            null,    // 浣滀笟
+//            null,    // 婧愭帓
+//            null,    // 婧愬垪
+//            null,    // 婧愬眰
+//            null,    // 婧愮珯
+//            null,    // 鐩爣鎺�
+//            null,    // 鐩爣鍒�
+//            null,    // 鐩爣灞�
+//            null,    // 鐩爣绔�
+//            null,    // 鍝嶅簲缁撴灉
+//            null,    // 淇敼鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null    // 澶囨敞
+//    );
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Integer getWrkNo() {
+        return wrkNo;
+    }
+
+    public void setWrkNo(Integer wrkNo) {
+        this.wrkNo = wrkNo;
+    }
+
+    public Integer getSteNo() {
+        return steNo;
+    }
+
+    public void setSteNo(Integer steNo) {
+        this.steNo = steNo;
+    }
+
+    public Date getSendTime() {
+        return sendTime;
+    }
+
+    public String getSendTime$(){
+        if (Cools.isEmpty(this.sendTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.sendTime);
+    }
+
+    public void setSendTime(Date sendTime) {
+        this.sendTime = sendTime;
+    }
+
+    public String getMode() {
+        return mode;
+    }
+
+    public void setMode(String mode) {
+        this.mode = mode;
+    }
+
+    public Integer getSourceRow() {
+        return sourceRow;
+    }
+
+    public void setSourceRow(Integer sourceRow) {
+        this.sourceRow = sourceRow;
+    }
+
+    public Integer getSourceBay() {
+        return sourceBay;
+    }
+
+    public void setSourceBay(Integer sourceBay) {
+        this.sourceBay = sourceBay;
+    }
+
+    public Integer getSourceLev() {
+        return sourceLev;
+    }
+
+    public void setSourceLev(Integer sourceLev) {
+        this.sourceLev = sourceLev;
+    }
+
+    public Integer getSourceSta() {
+        return sourceSta;
+    }
+
+    public void setSourceSta(Integer sourceSta) {
+        this.sourceSta = sourceSta;
+    }
+
+    public Integer getPosRow() {
+        return posRow;
+    }
+
+    public void setPosRow(Integer posRow) {
+        this.posRow = posRow;
+    }
+
+    public Integer getPosBay() {
+        return posBay;
+    }
+
+    public void setPosBay(Integer posBay) {
+        this.posBay = posBay;
+    }
+
+    public Integer getPosLev() {
+        return posLev;
+    }
+
+    public void setPosLev(Integer posLev) {
+        this.posLev = posLev;
+    }
+
+    public Integer getPosSta() {
+        return posSta;
+    }
+
+    public void setPosSta(Integer posSta) {
+        this.posSta = posSta;
+    }
+
+    public Integer getResponse() {
+        return response;
+    }
+
+    public String getResponse$(){
+        if (null == this.response){ return null; }
+        switch (this.response){
+            case 1:
+                return "姝e父";
+            case 0:
+                return "澶辫触";
+            default:
+                return String.valueOf(this.response);
+        }
+    }
+
+    public void setResponse(Integer response) {
+        this.response = response;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Long getUpdateBy() {
+        return updateBy;
+    }
+
+    public void setUpdateBy(Long updateBy) {
+        this.updateBy = updateBy;
+    }
+
+    public String getMemo() {
+        return memo;
+    }
+
+    public void setMemo(String memo) {
+        this.memo = memo;
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/BasSteErrLogMapper.java b/src/main/java/com/zy/asrs/mapper/BasSteErrLogMapper.java
new file mode 100644
index 0000000..f88dcb3
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/BasSteErrLogMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.BasSteErrLog;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BasSteErrLogMapper extends BaseMapper<BasSteErrLog> {
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/BasSteErrMapper.java b/src/main/java/com/zy/asrs/mapper/BasSteErrMapper.java
new file mode 100644
index 0000000..46072eb
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/BasSteErrMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.BasSteErr;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BasSteErrMapper extends BaseMapper<BasSteErr> {
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/BasSteMapper.java b/src/main/java/com/zy/asrs/mapper/BasSteMapper.java
new file mode 100644
index 0000000..7f9ce76
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/BasSteMapper.java
@@ -0,0 +1,17 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.BasSte;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BasSteMapper extends BaseMapper<BasSte> {
+
+    int updatePos(@Param("steNo")Integer steNo, @Param("row")Integer row, @Param("bay")Integer bay, @Param("lev")Integer lev);
+
+    int updatePakMk(@Param("steNo")Integer steNo, @Param("pakMk")String pakMk);
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/BasSteOptMapper.java b/src/main/java/com/zy/asrs/mapper/BasSteOptMapper.java
new file mode 100644
index 0000000..19e89d2
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/BasSteOptMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.BasSteOpt;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BasSteOptMapper extends BaseMapper<BasSteOpt> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/BasSteErrLogService.java b/src/main/java/com/zy/asrs/service/BasSteErrLogService.java
new file mode 100644
index 0000000..305f874
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/BasSteErrLogService.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.asrs.entity.BasSteErrLog;
+
+public interface BasSteErrLogService extends IService<BasSteErrLog> {
+
+    BasSteErrLog findLatestByTaskNo(Integer steNo, Integer taskNo);
+
+    BasSteErrLog findLatest(Integer steNo);
+
+}
diff --git a/src/main/java/com/zy/asrs/service/BasSteErrService.java b/src/main/java/com/zy/asrs/service/BasSteErrService.java
new file mode 100644
index 0000000..256873f
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/BasSteErrService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.asrs.entity.BasSteErr;
+
+public interface BasSteErrService extends IService<BasSteErr> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/BasSteOptService.java b/src/main/java/com/zy/asrs/service/BasSteOptService.java
new file mode 100644
index 0000000..f75d67b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/BasSteOptService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.asrs.entity.BasSteOpt;
+
+public interface BasSteOptService extends IService<BasSteOpt> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/BasSteService.java b/src/main/java/com/zy/asrs/service/BasSteService.java
new file mode 100644
index 0000000..bcd6cc1
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/BasSteService.java
@@ -0,0 +1,14 @@
+package com.zy.asrs.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.asrs.entity.BasSte;
+
+public interface BasSteService extends IService<BasSte> {
+
+    Boolean updatePos(Integer steNo, Integer row, Integer bay, Integer lev);
+
+    Boolean updatePakMk(Integer steNo, String pakMk);
+
+    Integer hasCarOfLocNo(String locNo);
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/BasSteErrLogServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasSteErrLogServiceImpl.java
new file mode 100644
index 0000000..6acfbc6
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/BasSteErrLogServiceImpl.java
@@ -0,0 +1,35 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.zy.asrs.entity.BasSteErrLog;
+import com.zy.asrs.mapper.BasSteErrLogMapper;
+import com.zy.asrs.service.BasSteErrLogService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service("basSteErrLogService")
+public class BasSteErrLogServiceImpl extends ServiceImpl<BasSteErrLogMapper, BasSteErrLog> implements BasSteErrLogService {
+
+    @Override
+    public BasSteErrLog findLatestByTaskNo(Integer steNo, Integer taskNo) {
+        List<BasSteErrLog> basSteErrLogs = this.baseMapper.selectList(new EntityWrapper<BasSteErrLog>().eq("ste_no", steNo).eq("wrk_no", taskNo).orderBy("start_time", false));
+        if (basSteErrLogs == null || basSteErrLogs.size() == 0) {
+            return null;
+        } else {
+            return basSteErrLogs.get(0);
+        }
+    }
+
+    @Override
+    public BasSteErrLog findLatest(Integer steNo) {
+        List<BasSteErrLog> basSteErrLogs = this.baseMapper.selectList(new EntityWrapper<BasSteErrLog>().eq("ste_no", steNo).orderBy("start_time", false));
+        if (basSteErrLogs == null || basSteErrLogs.size() == 0) {
+            return null;
+        } else {
+            return basSteErrLogs.get(0);
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/BasSteErrServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasSteErrServiceImpl.java
new file mode 100644
index 0000000..dd4be6b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/BasSteErrServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.zy.asrs.entity.BasSteErr;
+import com.zy.asrs.mapper.BasSteErrMapper;
+import com.zy.asrs.service.BasSteErrService;
+import org.springframework.stereotype.Service;
+
+@Service("basSteErrService")
+public class BasSteErrServiceImpl extends ServiceImpl<BasSteErrMapper, BasSteErr> implements BasSteErrService {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/BasSteOptServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasSteOptServiceImpl.java
new file mode 100644
index 0000000..cdd153d
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/BasSteOptServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.zy.asrs.entity.BasSteOpt;
+import com.zy.asrs.mapper.BasSteOptMapper;
+import com.zy.asrs.service.BasSteOptService;
+import org.springframework.stereotype.Service;
+
+@Service("basSteOptService")
+public class BasSteOptServiceImpl extends ServiceImpl<BasSteOptMapper, BasSteOpt> implements BasSteOptService {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/BasSteServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasSteServiceImpl.java
new file mode 100644
index 0000000..12269ae
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/BasSteServiceImpl.java
@@ -0,0 +1,41 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.zy.asrs.entity.BasSte;
+import com.zy.asrs.mapper.BasSteMapper;
+import com.zy.asrs.service.BasSteService;
+import com.zy.asrs.utils.Utils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@Service("basSteService")
+public class BasSteServiceImpl extends ServiceImpl<BasSteMapper, BasSte> implements BasSteService {
+
+    @Override
+    public Boolean updatePos(Integer steNo, Integer row, Integer bay, Integer lev) {
+        return this.baseMapper.updatePos(steNo, row, bay, lev) > 0;
+    }
+
+    @Override
+    public Boolean updatePakMk(Integer steNo, String pakMk) {
+        return this.baseMapper.updatePakMk(steNo, pakMk) > 0;
+    }
+
+    @Override
+    public Integer hasCarOfLocNo(String locNo) {
+        List<BasSte> basStes = this.selectList(new EntityWrapper<>());
+        for (BasSte basSte : basStes) {
+            if (Utils.getRow(locNo) == basSte.getRow()
+                && Utils.getBay(locNo) == basSte.getBay()
+                && Utils.getLev(locNo) == basSte.getLev()){
+                return basSte.getSteNo();
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/utils/SteUtils.java b/src/main/java/com/zy/asrs/utils/SteUtils.java
new file mode 100644
index 0000000..3374f98
--- /dev/null
+++ b/src/main/java/com/zy/asrs/utils/SteUtils.java
@@ -0,0 +1,424 @@
+package com.zy.asrs.utils;
+
+import com.core.common.Arith;
+import com.core.common.Cools;
+import com.zy.core.properties.SlaveProperties;
+
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Created by vincent on 2020/8/27
+ */
+public class SteUtils {
+
+    public static final List<Integer> SHUTTLE_GROUP_ROW_LIST = new ArrayList<Integer>() {{
+        add(2);add(3);add(4);add(5);add(6);add(7);add(8);add(9);add(10);
+        add(11);add(12);
+    }};
+    public static final List<Integer> SECOND_GROUP_ROW_LIST = new ArrayList<Integer>() {{
+        add(2);
+        add(3);
+        add(4);
+        add(5);
+        add(6);
+    }};
+    public static final List<Integer> THIRD_GROUP_ROW_LIST = new ArrayList<Integer>() {{
+        add(8);
+        add(9);
+        add(10);
+        add(11);
+        add(12);
+    }};
+    public static final List<Integer> THIRD_GROUP_BAY_LIST = new ArrayList<Integer>() {{
+        add(4);
+        add(10);
+        add(16);
+        add(22);
+    }};
+
+    private static final DecimalFormat fmt = new DecimalFormat("##0.00");
+
+    public static float scale(Float f){
+        if (f == null || f == 0f || Float.isNaN(f)) {
+            return 0f;
+        }
+        return (float) Arith.multiplys(2, f, 1);
+    }
+
+    public static String zerofill(String msg, Integer count){
+        if (msg.length() == count){
+            return msg;
+        } else if (msg.length() > count){
+            return msg.substring(0, 16);
+        } else {
+            StringBuilder msgBuilder = new StringBuilder(msg);
+            for (int i = 0; i<count-msg.length(); i++){
+                msgBuilder.insert(0,"0");
+            }
+            return msgBuilder.toString();
+        }
+    }
+
+    public static Integer getGroupRow(String locNo, Boolean pakin, Integer crnNo){
+        int row = getRow(locNo);
+        return getGroupRow(row, pakin, crnNo);
+    }
+
+    public static List<String> getGroupLocNo(String locNo){
+        int row = getRow(locNo);
+        int bay = getBay(locNo);
+        List<String> result = new ArrayList<>();
+        if (bay==4 || bay==10 || bay==16 || bay==22){
+            if(row<7 && row>1)
+            {
+                if (SECOND_GROUP_ROW_LIST.contains(row)) {
+                    for (Integer groupRow : SECOND_GROUP_ROW_LIST) {
+                        result.add(zerofill(String.valueOf(groupRow), 2) + locNo.substring(2));
+                    }
+                }
+            } else if(row>7 && row<13){
+                if (THIRD_GROUP_ROW_LIST.contains(row)) {
+                    for (Integer groupRow : THIRD_GROUP_ROW_LIST) {
+                        result.add(zerofill(String.valueOf(groupRow), 2) + locNo.substring(2));
+                    }
+                }
+            }
+        } else{
+            if (SHUTTLE_GROUP_ROW_LIST.contains(row)) {
+                for (Integer groupRow : SHUTTLE_GROUP_ROW_LIST) {
+                    result.add(zerofill(String.valueOf(groupRow), 2) + locNo.substring(2));
+                }
+            }
+        }
+
+        return result;
+    }
+
+    public static Integer getGroupRow(Integer row, Boolean pakin, Integer crnNo) {
+        if (pakin) {
+            if (SHUTTLE_GROUP_ROW_LIST.contains(row)) {
+                return crnNo == 1 ? 2 : 12;
+            } else {
+                return row;
+            }
+        } else {
+            if (SHUTTLE_GROUP_ROW_LIST.contains(row)) {
+                return crnNo == 1 ? 2 : 12;
+            } else {
+                return row;
+            }
+        }
+    }
+
+    /**
+     * 鍒ゆ柇搴撲綅鏄惁涓虹┛姊簱浣�
+     * @param locNo
+     * @return
+     */
+    public static Boolean isShuttle(String locNo) {
+        int row = Utils.getRow(locNo);
+        if (row >= 2 && row <= 12) {
+            return Boolean.TRUE;
+        }
+        return Boolean.FALSE;
+    }
+
+    /**
+     * 鍏ュ簱锛屽爢鍨涙満鍙�1锛氭渶澶栧眰搴撲綅鏄�2鎺掞紱 2锛氭渶澶栧眰搴撲綅鏄�12鎺�
+     * 鍑哄簱锛屽爢鍨涙満鍙�1:鏈�澶栧眰搴撲綅鏄�2鎺掞紱 2锛氭渶澶栧眰搴撲綅鏄�12鎺�
+     * @param locNo 搴撲綅鍙�
+     * @param pakin 鍏ュ簱
+     * @param crnNo 鍫嗗灈鏈哄彿
+     * @return
+     */
+    public static Boolean isOutMost(String locNo, Boolean pakin, Integer crnNo) {
+        switch (crnNo){
+            case 1:
+                return Integer.parseInt(locNo.substring(0, 2)) == 2;
+            case 2:
+                return Integer.parseInt(locNo.substring(0, 2)) == 12;
+        }
+        return false;
+    }
+    // -------------------------------------------------------------------------------------------------------------------
+
+
+
+
+
+
+    /**
+     * 鍒ゆ柇鏄惁涓烘繁搴撲綅
+     */
+    public static boolean isDeepLoc(SlaveProperties slaveProperties, String locNo){
+        if (slaveProperties.isDoubleDeep()) {
+            int row = getRow(locNo);
+            return slaveProperties.getDoubleLocs().contains(row);
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁涓烘繁搴撲綅
+     */
+    public static boolean isDeepLoc(SlaveProperties slaveProperties, Integer row){
+        if (slaveProperties.isDoubleDeep()) {
+            return slaveProperties.getDoubleLocs().contains(row);
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁涓烘祬搴撲綅
+     */
+    public static boolean isShallowLoc(SlaveProperties slaveProperties, String locNo){
+        if (slaveProperties.isDoubleDeep()) {
+            int row = getRow(locNo);
+            return !slaveProperties.getDoubleLocs().contains(row);
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁涓烘祬搴撲綅
+     */
+    public static boolean isShallowLoc(SlaveProperties slaveProperties, Integer row){
+        if (slaveProperties.isDoubleDeep()) {
+            return !slaveProperties.getDoubleLocs().contains(row);
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 鑾峰彇 娣卞簱浣嶅搴旂殑娴呭簱浣嶅彿
+     */
+    public static String getShallowLoc(SlaveProperties slaveProperties, String deepLoc) {
+        int row = getRow(deepLoc);
+        int remainder = (int) Arith.remainder(row, slaveProperties.getGroupCount());
+        int shallowRow = remainder == 1 ? (row + 1) : (row - 1);
+        return zerofill(String.valueOf(shallowRow), 2) + deepLoc.substring(2);
+    }
+
+
+    /**
+     * 鑾峰彇 娣卞簱浣嶆帓瀵瑰簲鐨勬祬搴撲綅鎺�
+     */
+    public static Integer getShallowRow(SlaveProperties slaveProperties, Integer deepRow) {
+        int remainder = (int) Arith.remainder(deepRow, slaveProperties.getGroupCount());
+        return remainder == 1 ? (deepRow + 1) : (deepRow - 1);
+    }
+
+    /**
+     * 鑾峰彇 娴呭簱浣嶅搴旂殑娣卞簱浣嶅彿
+     */
+    public static String getDeepLoc(SlaveProperties slaveProperties, String shallowLoc) {
+        int row = getRow(shallowLoc);
+        int remainder = (int) Arith.remainder(row, slaveProperties.getGroupCount());
+        int targetRow;
+        if (remainder == 2) {
+            targetRow = row - 1;
+        } else if (remainder == 1) {
+            targetRow = row + 1;
+        } else {
+            throw new RuntimeException(shallowLoc + "涓嶆槸娴呭簱浣嶏紝绯荤粺绻佸繖");
+        }
+        return zerofill(String.valueOf(targetRow), 2) + shallowLoc.substring(2);
+    }
+
+    /**
+     * 鑾峰彇 娴呭簱浣嶆帓瀵瑰簲鐨勬繁搴撲綅鎺�
+     */
+    public static Integer getDeepRow(SlaveProperties slaveProperties, Integer shallowRow) {
+        int remainder = (int) Arith.remainder(shallowRow, slaveProperties.getGroupCount());
+        int targetRow;
+        if (remainder == 2) {
+            targetRow = shallowRow - 1;
+        } else if (remainder == 1) {
+            targetRow = shallowRow + 1;
+        } else {
+            throw new RuntimeException(shallowRow + "涓嶆槸娴呭簱浣嶆帓锛岀郴缁熺箒蹇�");
+        }
+        return targetRow;
+    }
+
+    /**
+     * 閫氳繃搴撲綅鍙疯幏鍙� 鎺�
+     */
+    public static int getRow(String locNo) {
+        if (!Cools.isEmpty(locNo)) {
+            return Integer.parseInt(locNo.substring(0, 2));
+        }
+        throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
+    }
+
+    /**
+     * 閫氳繃搴撲綅鍙疯幏鍙� 鍒�
+     */
+    public static int getBay(String locNo) {
+        if (!Cools.isEmpty(locNo)) {
+            return Integer.parseInt(locNo.substring(2, 5));
+        }
+        throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
+    }
+
+    /**
+     * 閫氳繃搴撲綅鍙疯幏鍙� 灞�
+     */
+    public static int getLev(String locNo) {
+        if (!Cools.isEmpty(locNo)) {
+            return Integer.parseInt(locNo.substring(5, 7));
+        }
+        throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
+    }
+
+    /**
+     * 閫氳繃鎺掑垪灞傛嫾鎺ュ嚭搴撲綅鍙�
+     */
+    public static String append(int row, int bay, int lev) {
+        return zerofill(String.valueOf(row), 2) + zerofill(String.valueOf(bay), 3) + zerofill(String.valueOf(lev), 2);
+    }
+
+
+    /**
+     * 褰撴绱㈠埌鍙屾繁搴撲綅鐨勬祬搴撲綅鏃讹紝濡傛灉娣卞簱浣嶆棤璐э紝鍒欐斁鍏ュ搴旂殑娣卞簱浣�
+     */
+    public static void toDeepIfEmptyByShallow(String shallowLoc) {
+        int row = getRow(shallowLoc);
+        int remainder = (int) Arith.remainder(row, 4);
+        int targetRow = 0;
+        if (remainder == 2) {
+            targetRow = row - 1;
+        } else if (remainder == 3) {
+            targetRow = row + 1;
+        } else {
+            throw new RuntimeException(shallowLoc + "涓嶆槸娴呭簱浣嶏紝绯荤粺绻佸繖");
+        }
+        String targetLoc = zerofill(String.valueOf(targetRow), 2) + shallowLoc.substring(2);
+
+    }
+
+    public static String getLocNo(Number row, Number bay, Number lev) {
+        return zerofill(String.valueOf(row), 2) + zerofill(String.valueOf(bay), 3) + zerofill(String.valueOf(lev), 2);
+    }
+
+    // 澶栦晶鏂瑰悜鐨勮揣浣�  浼樺厛鍏ュ簱鏂瑰悜/浼樺厛鍑哄簱鏂瑰悜 ===>> 鍙嶄箣
+    public static List<String> getGroupOutsideLoc(String locNo,Integer crnNo){
+        //姝ゆ柟娉曞彇姝ゆ帓澶栦晶搴撲綅
+        int row = getRow(locNo);
+        int bay = getBay(locNo);
+        List<String> result = new ArrayList<>();
+        if (THIRD_GROUP_BAY_LIST.contains(bay)){
+            if (THIRD_GROUP_ROW_LIST.contains(row)) {
+                List<Integer> clone = Arrays.asList(new Integer[THIRD_GROUP_ROW_LIST.size()]);
+                Collections.copy(clone, THIRD_GROUP_ROW_LIST);
+                Collections.reverse(clone);
+                for (Integer integer : clone) {
+                    if (integer > row) {
+                        result.add(zerofill(String.valueOf(integer), 2) + locNo.substring(2));
+                    } else {
+                        break;
+                    }
+                }
+
+            }else if (SECOND_GROUP_ROW_LIST.contains(row)) {
+                for (Integer integer : SECOND_GROUP_ROW_LIST) {
+                    if (integer < row) {
+                        result.add(zerofill(String.valueOf(integer), 2) + locNo.substring(2));
+                    } else {
+                        break;
+                    }
+                }
+
+            }
+        }else {
+            if (SHUTTLE_GROUP_ROW_LIST.contains(row)) {
+                if (crnNo==1){
+                    for (Integer integer : SHUTTLE_GROUP_ROW_LIST) {
+                        if (integer < row) {
+                            result.add(zerofill(String.valueOf(integer), 2) + locNo.substring(2));
+                        } else {
+                            break;
+                        }
+                    }
+                }else {
+                    List<Integer> clone = Arrays.asList(new Integer[SHUTTLE_GROUP_ROW_LIST.size()]);
+                    Collections.copy(clone, SHUTTLE_GROUP_ROW_LIST);
+                    Collections.reverse(clone);
+                    for (Integer integer : clone) {
+                        if (integer > row) {
+                            result.add(zerofill(String.valueOf(integer), 2) + locNo.substring(2));
+                        } else {
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
+    // 澶栦晶鏂瑰悜鐨勮揣浣�  浼樺厛鍏ュ簱鏂瑰悜/浼樺厛鍑哄簱鏂瑰悜 ===>> 鍙嶄箣
+    public static List<String> getGroupOutsideLocPakin(String locNo,Integer crnNo){
+        //   姝ゆ柟娉曞彇姝ゆ帓鍐呬晶搴撲綅
+        int row = getRow(locNo);
+        int bay = getBay(locNo);
+        List<String> result = new ArrayList<>();
+        if (THIRD_GROUP_BAY_LIST.contains(bay)){
+            if (THIRD_GROUP_ROW_LIST.contains(row)) {
+                for (Integer integer : THIRD_GROUP_ROW_LIST) {
+                    if (integer < row) {
+                        result.add(zerofill(String.valueOf(integer), 2) + locNo.substring(2));
+                    } else {
+                        break;
+                    }
+                }
+            }else if (SECOND_GROUP_ROW_LIST.contains(row)) {
+                List<Integer> clone = Arrays.asList(new Integer[SECOND_GROUP_ROW_LIST.size()]);
+                Collections.copy(clone, SECOND_GROUP_ROW_LIST);
+                Collections.reverse(clone);
+                for (Integer integer : clone) {
+                    if (integer > row) {
+                        result.add(zerofill(String.valueOf(integer), 2) + locNo.substring(2));
+                    } else {
+                        break;
+                    }
+                }
+
+
+            }
+        }else {
+            if (SHUTTLE_GROUP_ROW_LIST.contains(row)) {
+                if (crnNo==2){
+                    for (Integer integer : SHUTTLE_GROUP_ROW_LIST) {
+                        if (integer < row) {
+                            result.add(zerofill(String.valueOf(integer), 2) + locNo.substring(2));
+                        } else {
+                            break;
+                        }
+                    }
+                }else {
+                    List<Integer> clone = Arrays.asList(new Integer[SHUTTLE_GROUP_ROW_LIST.size()]);
+                    Collections.copy(clone, SHUTTLE_GROUP_ROW_LIST);
+                    Collections.reverse(clone);
+                    for (Integer integer : clone) {
+                        if (integer > row) {
+                            result.add(zerofill(String.valueOf(integer), 2) + locNo.substring(2));
+                        } else {
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
+}
diff --git a/src/main/java/com/zy/core/News.java b/src/main/java/com/zy/core/News.java
new file mode 100644
index 0000000..33f0593
--- /dev/null
+++ b/src/main/java/com/zy/core/News.java
@@ -0,0 +1,220 @@
+package com.zy.core;
+
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.lang.reflect.Array;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * news stories for zoneyung
+ * Created by vincent on 2022/12/22
+ */
+@Slf4j
+@Component
+public class News {
+
+    public static void main(String[] args) {
+        News.info("info{}", 1);
+        News.warn("warn{}", 2);
+        News.error("error{}", 3);
+        System.out.println(News.print());
+    }
+
+    interface NewsSupport<T> { boolean execute(T t); }
+
+    private static final NewsQueue<NewsDomain> NEWS_QUEUE = new NewsQueue<>(NewsDomain.class, 1024);
+
+    @Value("${logging.enableEveryThreadLog}")
+    private Boolean enableEveryThreadLog;
+
+    //鏄惁寮�鍚嚎绋嬫棩蹇楀姛鑳�
+    private static Boolean enable;
+
+    @PostConstruct
+    public void getEnableEveryThreadLog() {
+        enable = this.enableEveryThreadLog;
+    }
+
+    @SuppressWarnings({"unchecked"})
+    static class NewsQueue<T> {
+
+        private final transient Class<T> cls;
+        private final T[] arr;
+        private final int capacity;
+        private int head;
+        private int tail;
+
+        { this.head = 0; this.tail = 0; }
+
+        public NewsQueue(Class<T> cls, int capacity) {
+            this.cls = cls;
+            this.arr = (T[]) Array.newInstance(cls, capacity);
+            this.capacity = capacity;
+        }
+
+        public synchronized boolean offer(T t) {
+            if (this.tail == this.capacity) {
+                this.peek();
+            }
+            this.reform();
+            this.arr[this.tail] = t;
+            this.tail ++;
+            return true;
+        }
+
+        public synchronized boolean put(T t) {
+            if (this.tail == this.capacity) {
+                return false;
+            } else {
+                this.reform();
+            }
+            this.arr[this.tail] = t;
+            this.tail ++;
+            return true;
+        }
+
+        public synchronized T peek() {
+            if (this.head == this.tail) {
+                return null;
+            }
+            T t = this.arr[this.head];
+            this.head ++;
+            this.reform();
+            return t;
+        }
+
+        private void reform() {
+            for (int i = this.head; i < this.tail; i++) {
+                this.arr[i-this.head] = this.arr[i];
+            }
+            this.tail -= this.head;
+            this.head = 0;
+        }
+
+        public synchronized int size() {
+            return this.tail - this.head;
+        }
+
+        public synchronized List<T> data() {
+            T[] ts = (T[]) Array.newInstance(this.cls, size());
+            if (this.tail - this.head >= 0) {
+                System.arraycopy(this.arr, this.head, ts, 0, this.tail - this.head);
+            }
+            return Arrays.asList(ts);
+        }
+
+    }
+
+    public static void info(String format, Object... arguments) {
+        if (enable) {
+            MDC.put("threadName", "currentThread-" + Thread.currentThread().getName());
+        }
+        log.info(format, arguments);
+        offer(NewsLevel.INFO, format, arguments);
+        MDC.remove("threadName");
+    }
+    public static void infoNot(String format, Object... arguments) {
+        log.info(format, arguments);
+    }
+
+    public static void warn(String format, Object... arguments) {
+        if (enable) {
+            MDC.put("threadName", "currentThread-" + Thread.currentThread().getName());
+        }
+        log.warn(format, arguments);
+        offer(NewsLevel.WARN, format, arguments);
+        MDC.remove("threadName");
+    }
+
+    public static void error(String format, Object... arguments) {
+        if (enable) {
+            MDC.put("threadName", "currentThread-" + Thread.currentThread().getName());
+        }
+        log.error(format, arguments);
+        offer(NewsLevel.ERROR, format, arguments);
+        MDC.remove("threadName");
+    }
+
+    public static void debug(String format, Object... arguments) {
+        offer(NewsLevel.DEBUG, format, arguments);
+    }
+
+
+    public static String printStr() {
+        StringBuilder sb = new StringBuilder("[");
+        List<NewsDomain> domains = NEWS_QUEUE.data();
+        for (int i = 0; i < domains.size(); i++) {
+            NewsDomain domain = domains.get(i);
+            sb.append("{");
+            sb.append("\"l\":").append(domain.level.idx).append(",");
+            sb.append("\"v\":\"").append(domain.content).append("\"").append(",");
+            sb.append("\"t\":\"").append(domain.date).append("\"");
+            sb.append("}");
+            if (i < domains.size() - 1) {
+                sb.append(",");
+            }
+        }
+        sb.append("]");
+        return sb.toString();
+    }
+
+    public static List<Map<String, Object>> print() {
+        List<Map<String, Object>> res = new ArrayList<>();
+        for (NewsDomain datum : NEWS_QUEUE.data()) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("l", datum.level.idx);
+            map.put("v", datum.content);
+            map.put("t", datum.date);
+            res.add(map);
+        }
+        return res;
+    }
+
+    private static boolean offer(NewsLevel level, String msg, Object[] args) {
+        return NEWS_QUEUE.offer(new NewsDomain(level, replace(msg, args), (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date())));
+    }
+
+    private static String replace(String str, Object[] objs){
+        if (null == objs || objs.length == 0 || null == str || "".equals(str.trim())) {
+            return str;
+        } else {
+            StringBuilder sb = new StringBuilder(str);
+            for (Object obj : objs) {
+                int idx = sb.indexOf("{}");
+                if (idx == -1) { break; }
+                sb.replace(idx, idx + 2, String.valueOf(obj));
+            }
+            return sb.toString();
+        }
+    }
+
+    static class NewsDomain {
+        public NewsLevel level;
+        public String content;
+        public String date;
+
+        public NewsDomain(NewsLevel level, String content, String date) {
+            this.level = level;
+            this.content = content;
+            this.date = date;
+        }
+    }
+
+    enum NewsLevel {
+        INFO(1),
+        WARN(2),
+        ERROR(3),
+        DEBUG(4),
+        ;
+        public int idx;
+        NewsLevel(int idx) {
+            this.idx = idx;
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/core/cache/OutputQueue.java b/src/main/java/com/zy/core/cache/OutputQueue.java
index 65df862..0a77e31 100644
--- a/src/main/java/com/zy/core/cache/OutputQueue.java
+++ b/src/main/java/com/zy/core/cache/OutputQueue.java
@@ -17,4 +17,6 @@
     public static ArrayBlockingQueue<JSONObject> BARCODE = new ArrayBlockingQueue<>(32);
     // rgv杈撳嚭鏃ュ織
     public static ArrayBlockingQueue<String> RGV = new ArrayBlockingQueue<>(32);
+    // 绌挎杞﹁緭鍑烘棩蹇�
+    public static ArrayBlockingQueue<String> STE = new ArrayBlockingQueue<>(32);
 }
diff --git a/src/main/java/com/zy/core/enums/SlaveType.java b/src/main/java/com/zy/core/enums/SlaveType.java
index 7f64d13..02f42af 100644
--- a/src/main/java/com/zy/core/enums/SlaveType.java
+++ b/src/main/java/com/zy/core/enums/SlaveType.java
@@ -8,7 +8,8 @@
     Led,
     Scale,
     Car,
-    Rgv
+    Rgv,
+    Ste
     ;
 
     public static SlaveType findInstance(String s){
diff --git a/src/main/java/com/zy/core/enums/SteABType.java b/src/main/java/com/zy/core/enums/SteABType.java
new file mode 100644
index 0000000..d94f35e
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/SteABType.java
@@ -0,0 +1,10 @@
+package com.zy.core.enums;
+
+public enum SteABType {
+
+    A,
+    B,
+    ;
+
+
+}
diff --git a/src/main/java/com/zy/core/enums/SteChargeType.java b/src/main/java/com/zy/core/enums/SteChargeType.java
new file mode 100644
index 0000000..145b2f9
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/SteChargeType.java
@@ -0,0 +1,46 @@
+package com.zy.core.enums;
+
+import com.core.common.Cools;
+
+public enum SteChargeType {
+
+    FIRST(1, "0100101"),
+    SECOND(2, "1300101"),
+    ;
+
+    SteChargeType(int ssbm, String locNo) {
+        this.ssbm = ssbm;
+        this.locNo = locNo;
+    }
+
+    public int ssbm;
+
+    public String locNo;
+
+    public static SteChargeType get(String locNo) {
+        if (Cools.isEmpty(locNo)) {
+            return null;
+        }
+        SteChargeType[] values = SteChargeType.values();
+        for (SteChargeType value : values) {
+            if (value.locNo.equals(locNo)) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+    public static SteChargeType get(int ssbm) {
+        if (Cools.isEmpty(ssbm)) {
+            return null;
+        }
+        SteChargeType[] values = SteChargeType.values();
+        for (SteChargeType value : values) {
+            if (value.ssbm == ssbm) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/src/main/java/com/zy/core/enums/SteHisTaskStatusType.java b/src/main/java/com/zy/core/enums/SteHisTaskStatusType.java
new file mode 100644
index 0000000..b29f2a4
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/SteHisTaskStatusType.java
@@ -0,0 +1,41 @@
+package com.zy.core.enums;
+
+public enum SteHisTaskStatusType {
+
+    INIT(0, "鍒濆"),
+    COMPLETE(1, "鎵ц瀹屾垚"),
+    REMOVE(2, "鍒犻櫎"),
+    ;
+
+    public Integer id;
+    public String desc;
+    SteHisTaskStatusType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static SteHisTaskStatusType get(Short id) {
+        if (null == id) {
+            return null;
+        }
+        for (SteHisTaskStatusType type : SteHisTaskStatusType.values()) {
+            if (type.id.equals(id.intValue())) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static SteHisTaskStatusType get(SteHisTaskStatusType type) {
+        if (null == type) {
+            return null;
+        }
+        for (SteHisTaskStatusType statusType : SteHisTaskStatusType.values()) {
+            if (statusType == type) {
+                return statusType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/src/main/java/com/zy/core/enums/SteLocaType.java b/src/main/java/com/zy/core/enums/SteLocaType.java
new file mode 100644
index 0000000..bf72a9c
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/SteLocaType.java
@@ -0,0 +1,42 @@
+package com.zy.core.enums;
+
+public enum SteLocaType {
+
+    NONE(0, "鏈煡"),
+    A(1, "A鐐�"),
+    B(2, "B鐐�"),
+    A_WAITING(3, "A寰呮満鐐�"),
+    B_WAITING(4, "B寰呮満鐐�"),
+    ;
+
+    public Integer id;
+    public String desc;
+    SteLocaType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static SteLocaType get(Short id) {
+        if (null == id) {
+            return null;
+        }
+        for (SteLocaType type : SteLocaType.values()) {
+            if (type.id.equals(id.intValue())) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static SteLocaType get(SteLocaType type) {
+        if (null == type) {
+            return null;
+        }
+        for (SteLocaType crnStatusType : SteLocaType.values()) {
+            if (crnStatusType == type) {
+                return crnStatusType;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/zy/core/enums/SteStatusType.java b/src/main/java/com/zy/core/enums/SteStatusType.java
new file mode 100644
index 0000000..c757c52
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/SteStatusType.java
@@ -0,0 +1,43 @@
+package com.zy.core.enums;
+
+public enum SteStatusType {
+
+    IDLE(0, "绌洪棽"),
+    MOVING(1, "浣滀笟涓�"),
+    SOS(2, "鎶ヨ"),
+    WAITING(10, "绛夊緟纭"),
+    OFF_LINE(-1, "鏈煡"),
+    OTHER(100, "鍏跺畠"),
+    ;
+
+    public Integer id;
+    public String desc;
+    SteStatusType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static SteStatusType get(Short id) {
+        if (null == id) {
+            return null;
+        }
+        for (SteStatusType type : SteStatusType.values()) {
+            if (type.id.equals(id.intValue())) {
+                return type;
+            }
+        }
+        return OFF_LINE;
+    }
+
+    public static SteStatusType get(SteStatusType type) {
+        if (null == type) {
+            return null;
+        }
+        for (SteStatusType crnStatusType : SteStatusType.values()) {
+            if (crnStatusType == type) {
+                return crnStatusType;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/zy/core/enums/SteTaskModeType.java b/src/main/java/com/zy/core/enums/SteTaskModeType.java
new file mode 100644
index 0000000..5bf8d9d
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/SteTaskModeType.java
@@ -0,0 +1,129 @@
+package com.zy.core.enums;
+
+import com.core.exception.CoolException;
+import com.zy.asrs.utils.SteUtils;
+import com.zy.asrs.utils.Utils;
+import com.zy.core.model.protocol.SteProtocol;
+
+public enum SteTaskModeType {
+
+    INIT(0, "鍒濆"),    // 鍒濆
+    OUT_RIGHT(1, "鍙冲嚭搴�"),    // 鍙冲嚭搴�
+    OUT_LEFT(2, "宸﹀嚭搴�"),    // 宸﹀嚭搴�
+    IN_RIGHT(4, "鍙冲叆搴�"),    // 鍙冲叆搴�
+    IN_LEFT(3, "宸﹀叆搴�"),    // 宸﹀叆搴�
+    MOVE_LEFT(5, "宸︾Щ搴�"),    // 宸︾Щ搴�
+    MOVE_RIGHT(6, "鍙崇Щ搴�"),    // 鍙崇Щ搴�
+    GO_ORIGIN(8, "鍘诲彸绔�"),    // 鍥炲弽鍘熺偣
+    BACK_ORIGIN(7, "鍘诲乏绔�"),      // 鍥炲師鐐�
+    WAITING_RIGHT(10, "鍙冲緟鏈�"),        // A鐐�
+    WAITING_LEFT(9, "宸﹀緟鏈�"),       // B鐐�
+//    FIT_LEFT(11, "宸︽惉绉�"),   // 宸︽惉绉�
+//    FIT_RIGHT(12, "鍙虫惉绉�"),      // 鍙虫惉绉�
+    CHARGE_LEFT(13, "宸﹀厖鐢�"),         // 宸﹀厖鐢�
+    CHARGE_RIGHT(14, "鍙冲厖鐢�"),         // 宸﹀厖鐢�
+//    CHECK_LEFT(14, "宸︾洏鐐�"),     // 宸︾洏鐐�
+//    CHECK_RIGHT(15, "鍙崇洏鐐�"),    // 鍙崇洏鐐�
+    CLOSE_CHARGE(17, "鏂紑鍏呯數"),   // 鏂紑鍏呯數
+    ;
+
+    public Integer id;
+    public String desc;
+    SteTaskModeType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static SteTaskModeType get(Short id) {
+        if (null == id) {
+            return null;
+        }
+        for (SteTaskModeType type : SteTaskModeType.values()) {
+            if (type.id.equals(id.intValue())) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static SteTaskModeType get(SteTaskModeType type) {
+        if (null == type) {
+            return null;
+        }
+        for (SteTaskModeType crnTaskModeType : SteTaskModeType.values()) {
+            if (crnTaskModeType == type) {
+                return crnTaskModeType;
+            }
+        }
+        return null;
+    }
+
+    public static SteTaskModeType findInByLoc(String locNo, Integer crnNo) {
+        switch (SteUtils.getGroupRow(locNo, true, crnNo)) {
+            case 2:
+                return SteTaskModeType.IN_RIGHT;   // 鍙�
+            case 12:
+                return SteTaskModeType.IN_LEFT;    // 宸�
+            default:
+                throw new CoolException("瑙f瀽绌挎杞﹀師鐐瑰畾浣嶅け璐�");
+        }
+    }
+
+    public static SteTaskModeType findOutByLoc(String locNo, Integer crnNo) {
+        switch (SteUtils.getGroupRow(locNo, false, crnNo)) {
+            case 2:
+                return SteTaskModeType.OUT_LEFT;   // 鍙�
+            case 12:
+                return SteTaskModeType.OUT_RIGHT;    // 宸�
+            default:
+                throw new CoolException("瑙f瀽绌挎杞﹀師鐐瑰畾浣嶅け璐�");
+        }
+    }
+    public static SteTaskModeType findOutByLoc2(String locNo, Integer crnNo) {
+        switch (SteUtils.getGroupRow(locNo, false, crnNo)) {
+            case 2:
+                return SteTaskModeType.GO_ORIGIN;   // 8
+            case 12:
+                return SteTaskModeType.BACK_ORIGIN;    // 7
+            default:
+                throw new CoolException("瑙f瀽绌挎杞﹀師鐐瑰畾浣嶅け璐�");
+        }
+    }
+
+
+    // -----------------------------------------------
+
+    // 鍘诲緟鎼偣
+    public static SteTaskModeType findOriginByLoc(SteProtocol steProtocol, Integer crnNo) {
+        int row = steProtocol.getRow().intValue();
+        if (SteUtils.SHUTTLE_GROUP_ROW_LIST.contains(row)) {
+            return crnNo == 1 ? SteTaskModeType.BACK_ORIGIN : SteTaskModeType.GO_ORIGIN;
+        } else if (row==13 || row==1){
+            return SteTaskModeType.INIT;
+        } else {
+            throw new CoolException("瑙f瀽绌挎杞﹀師鐐瑰畾浣嶅け璐�");
+        }
+    }
+
+    public static SteTaskModeType findOriginByLoc(Integer row, Integer crnNo) {
+        if (SteUtils.SHUTTLE_GROUP_ROW_LIST.contains(row)) {
+            return crnNo == 1 ? SteTaskModeType.BACK_ORIGIN : SteTaskModeType.GO_ORIGIN;
+        } else if (row==13 || row==1){
+            return SteTaskModeType.INIT;
+        } else {
+            throw new CoolException("瑙f瀽绌挎杞﹀師鐐瑰畾浣嶅け璐�");
+        }
+    }
+
+
+    public static SteTaskModeType findWaiting(Integer row, Integer crnNo) {
+        if (SteUtils.SHUTTLE_GROUP_ROW_LIST.contains(row)) {
+            return crnNo == 1 ? SteTaskModeType.WAITING_LEFT : SteTaskModeType.WAITING_RIGHT;
+        } else if (row==1||row==13){
+            return SteTaskModeType.INIT;
+        } else {
+            throw new CoolException("瑙f瀽绌挎杞﹀師鐐瑰畾浣嶅け璐�");
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/core/model/SteSlave.java b/src/main/java/com/zy/core/model/SteSlave.java
new file mode 100644
index 0000000..f9edd36
--- /dev/null
+++ b/src/main/java/com/zy/core/model/SteSlave.java
@@ -0,0 +1,49 @@
+package com.zy.core.model;
+
+import com.zy.core.Slave;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by vincent on 2020/8/10
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class SteSlave extends Slave {
+
+    private Integer rack;
+
+    private Integer slot;
+
+    private Boolean demo;
+
+    // 绌挎杞﹀叆搴撶珯鐐�
+    private List<CrnStn> steInStn = new ArrayList<>();
+
+    // 绌挎杞﹀嚭搴撶珯鐐�
+    private List<CrnStn> steOutStn = new ArrayList<>();
+
+    @Data
+    public static class CrnStn {
+
+        // 杈撻�佺嚎plc缂栧彿
+        private Integer devpPlcId;
+
+        // 绌挎杞︾珯鐐圭紪鍙�
+        private Integer staNo;
+
+        // 鎺�
+        private Integer row;
+
+        // 鍒�
+        private Integer bay;
+
+        // 灞�
+        private Integer lev;
+
+    }
+
+}
diff --git a/src/main/java/com/zy/core/model/command/SteCommand.java b/src/main/java/com/zy/core/model/command/SteCommand.java
new file mode 100644
index 0000000..1b91911
--- /dev/null
+++ b/src/main/java/com/zy/core/model/command/SteCommand.java
@@ -0,0 +1,95 @@
+package com.zy.core.model.command;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.zy.core.enums.SteTaskModeType;
+import lombok.Data;
+
+/**
+ * 绌挎杞﹀懡浠ゆ姤鏂�
+ * Created by vincent on 2020/8/11
+ */
+@Data
+public class SteCommand {
+
+    // 绌挎杞﹀彿
+    private Integer steNo = 0;
+
+    // 浠诲姟鍙�
+    private Integer taskNo = 0;
+
+    // 浣滀笟绫诲瀷
+    private Short taskMode = 0;
+
+    // 姝e湪鎵ц浠诲姟
+    public Boolean execute = Boolean.FALSE;
+
+    // 纭浠诲姟瀹屾垚
+    public Boolean complete = Boolean.FALSE;
+
+    @JSONField(serialize = false)
+    private SteTaskModeType taskModeType;
+
+    // 鎺�
+    private Short row;
+
+    // 鍒�
+    private Short bay;
+
+    // 灞�
+    private Short lev;
+
+    // 璧峰璁惧鍙�
+    private Short startSsbm;
+
+    // 鐩殑璁惧鍙�
+    private Short endSsbm;
+
+    // 鎺у埗妯″紡 0=鑴辨満 1=鑱旀満
+    private Short controlMode;
+
+    // 寮�鍚俊鍙� 1-鍚姩
+    private Short open;
+
+    // 鍒濆鍖�
+    private Short init;
+
+    // 澶嶄綅淇″彿 1=澶嶄綅
+    private Boolean reset;
+
+    // 鍒犻櫎鎸囦护 1=鍒犻櫎
+    private Boolean delete;
+
+    // 鎵樼洏闂磋窛 涓棿鎵樼洏涔嬮棿璺濈 鍗曚綅姣背
+    private Short space;
+
+    // 闂磋窛纭
+    private Short spaceYes;
+
+    // 鎺掍慨鏀�
+    private Short rowModify;
+
+    // 鍒椾慨鏀�
+    private Short bayModify;
+
+    // 灞備慨鏀�
+    private Short levModify;
+
+    // 淇敼纭
+    private Short modifyYes;
+
+    /**
+     * 杈撳叆绌挎杞﹁繍琛岀姝� 1杩愯锛�0绂佹
+     */
+    private Short run;
+
+    public void setTaskMode(Short taskMode){
+        this.taskMode = taskMode;
+        this.taskModeType = SteTaskModeType.get(taskModeType);
+    }
+
+    public void setTaskMode(SteTaskModeType type) {
+        this.taskModeType = type;
+        this.taskMode = SteTaskModeType.get(type).id.shortValue();
+    }
+
+}
diff --git a/src/main/java/com/zy/core/model/protocol/SteProtocol.java b/src/main/java/com/zy/core/model/protocol/SteProtocol.java
new file mode 100644
index 0000000..21102b2
--- /dev/null
+++ b/src/main/java/com/zy/core/model/protocol/SteProtocol.java
@@ -0,0 +1,302 @@
+package com.zy.core.model.protocol;
+
+import com.core.common.Cools;
+import com.core.common.SpringUtils;
+import com.zy.asrs.entity.BasSte;
+import com.zy.asrs.service.BasSteService;
+import com.zy.core.News;
+import com.zy.core.enums.SteHisTaskStatusType;
+import com.zy.core.enums.SteLocaType;
+import com.zy.core.enums.SteStatusType;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Created by vincent on 2020/8/7
+ */
+@Slf4j
+@Data
+public class SteProtocol {
+
+    /**
+     * 璁惧鍙�
+     */
+    private Short steNo;
+
+    /**
+     * 1 = 鑱旀満妯″紡
+     * 0 = 鑴辨満妯″紡
+     */
+    public Short mode;
+
+    /**
+     IDLE(0, "绌洪棽"),
+     MOVING(1, "浣滀笟涓�"),
+     SOS(2, "鎶ヨ"),
+     WAITING(3, "浠诲姟瀹屾垚绛夊緟WCS纭"),
+     */
+    public Short status;
+
+    public SteStatusType statusType;
+
+    /**
+     * 浠诲姟鍙�
+     */
+    public Short taskNo = 0;
+
+    /**
+     * 姝e湪鎵ц浠诲姟
+     */
+    public Boolean execute;
+
+    /**
+     * 浠诲姟瀹屾垚锛岀瓑寰匴CS纭
+     */
+    public Boolean waiting;
+
+
+    /**
+     * 寮傚父鐮�1
+     */
+    public Short alarm;
+
+
+    /**
+     * 寮傚父鐮�2
+     */
+    public Short alarm0;
+
+    /**
+     * 鐢垫睜鐢甸噺
+     */
+    public Float charge = 0.0F;
+
+    public void setCharge(Float charge) {
+        if (charge >= 0) {
+            this.charge = charge;
+        }
+    }
+
+    /**
+     * 婊$數
+     */
+    public Boolean fullCharge;
+
+    /**
+     * 浣庣數閲�
+     */
+    public Boolean lowCharge;
+
+    /**
+     * 鐢垫睜棣堢數    0锛屾瑺鐢碉紝1浣庣數 2婊$數
+     */
+    public Short feed;
+
+    /**
+     * 褰撳墠浣嶇疆     1锛岃繎鐐癸紝2杩滅偣锛�3A鐐癸紝4B鐐�
+     */
+    public Short loca;
+
+    public SteLocaType locaType;
+
+    /**
+     * 杩戠偣璺濈
+     */
+    public Double closer;
+
+    /**
+     * 褰撳墠閫熷害
+     */
+    public Double speed = 0.0D;
+
+    /**
+     * 楂樹綆浣� 0锛屼綆浣嶏紝1楂樹綅
+     */
+    public Short pos;
+
+    /**
+     * 鏈夎揣 0锛屾病璐э紝1鏈夎揣
+     */
+    public Short load;
+
+    /**
+     * 鍦ㄨ建閬撲笂 0涓嶅湪锛�1鍦�
+     */
+    public Short track;
+
+    /**
+     * 浠诲姟绫诲瀷
+     */
+    public Short taskType;
+
+    /**
+     * 鎺�
+     */
+    public Short row;
+
+    /**
+     * 鍒�
+     */
+    public Short bay;
+
+    /**
+     * 灞�
+     */
+    public Short lev;
+
+    /**
+     * 杩囪处鎸囦护浠诲姟鍙�
+     */
+    public Integer hisTaskNo;
+
+    /**
+     * 杩囪处鎸囦护鐘舵��
+     * 0鍒濆 1鎵ц瀹屾垚 2鍒犻櫎
+     */
+    public Short hisTaskStatus;
+
+    public SteHisTaskStatusType hisTaskStatusType;
+
+    /**
+     * 鐩樼偣鏁伴噺
+     */
+    public Short checkQty;
+
+    /**
+     * 灏辩华鐘舵��  0鏈氨缁� 1灏辩华
+     */
+    public Short ready;
+
+    /**
+     * 鎵撳紑鍏呯數妗╁彿
+     */
+    public Short chargeNo;
+
+    /**
+     * 蹇冭烦鎸囦护 1-2姣忕鍒囨崲涓�娆�
+     */
+    public Short heart;
+
+    /**
+     * 鍫嗗灈鏈虹姝㈣繍琛� 1杩愯锛�0绂佹
+     */
+    public Short crnStopRun;
+
+    /**
+     * 鍫嗗灈鏈虹姝几鍙� 1杩愯锛�0绂佹
+     */
+    public Short crnStopFork;
+
+    /**
+     * 鍫嗗灈鏈烘惉绉诲厑璁� 0涓嶅厑璁�   1鍏佽
+     */
+    public Short crnAllowRun;
+
+    /**
+     * 鍏呯數鐘舵��  1锛氬湪鍏呯數锛�0锛氫笉鍦ㄥ厖鐢�
+     */
+    private Short chargeStatus;
+
+    // 鍏ュ簱鍙栫┖
+    private Boolean inEmpty;
+
+    // 鍑哄簱鍙栫┖
+    private Boolean outEmpty;
+
+    // 鍏呯數妗�
+    private Boolean steCharge;
+
+    public void setStatus(Short status){
+        this.status = status;
+        this.statusType = SteStatusType.get(status);
+    }
+
+    public void setStatus(SteStatusType type){
+        this.statusType = type;
+        this.status = SteStatusType.get(type).id.shortValue();
+    }
+
+    public void setLoca(Short loca){
+        this.loca = loca;
+        this.locaType = SteLocaType.get(loca);
+    }
+
+    public void setLoca(SteLocaType type){
+        this.locaType = type;
+        this.loca = SteLocaType.get(type).id.shortValue();
+    }
+
+    public void setHisTaskStatus(Short hisTaskStatus){
+        this.hisTaskStatus = hisTaskStatus;
+        this.hisTaskStatusType = SteHisTaskStatusType.get(hisTaskStatus);
+    }
+
+    public void setHisTaskStatus(SteHisTaskStatusType type){
+        this.hisTaskStatusType = type;
+        this.hisTaskStatus = SteHisTaskStatusType.get(type).id.shortValue();
+    }
+
+    /**
+     * 鏈�杩戜竴娆″叆鍑哄簱绫诲瀷
+     *       I:鍏ュ簱
+     *       O:鍑哄簱
+     */
+    private String lastIo = "I";
+
+    private String pakMk = "-";
+
+    public BasSte toSqlModel(BasSte basSte){
+        if (alarm!=null) {
+            basSte.setSteErr(alarm.longValue());
+        }
+        basSte.setWrkNo(taskNo.intValue());
+//        if (basSte.getPakMk().equals("N")) {
+//            if (!Cools.isEmpty(row)) {
+//                basSte.setRow(row.intValue());
+//            }
+//            if (!Cools.isEmpty(bay)) {
+//                basSte.setBay(bay.intValue());
+//            }
+//            if (!Cools.isEmpty(lev)) {
+//                basSte.setLev(lev.intValue());
+//            }
+//        }
+        return basSte;
+    }
+
+    // 鏄惁澶勪簬绌洪棽寰呭懡鐘舵��
+    public Boolean isIdle() {
+        boolean res = this.statusType.equals(SteStatusType.IDLE)
+                && this.mode == 1
+                && this.pakMk.equals("N")
+                && !isAlarm()
+                && this.chargeStatus == 0
+                && isEnable()
+                ;
+        if (!res) {
+            return res;
+        } else {
+            // 鐢甸噺
+            try {
+                String chargeLine = SpringUtils.getBean(BasSteService.class).selectById(this.steNo).getChargeLine();
+                return charge > Float.parseFloat(chargeLine);
+            } catch (Exception e) {
+                News.error("fail", e);
+                return false;
+            }
+        }
+    }
+
+    // 鏄惁澶勪簬鎶ヨ鐘舵��
+    public Boolean isAlarm() {
+        return this.alarm > 1;
+    }
+
+    public Boolean isEnable() {
+        if (Cools.isEmpty(row, bay, lev)) {
+            return false;
+        }
+        return row > 0 && bay > 0 && lev > 0;
+    }
+
+}
diff --git a/src/main/java/com/zy/core/thread/SiemensDevpThread.java b/src/main/java/com/zy/core/thread/SiemensDevpThread.java
index 465d7f5..f581c87 100644
--- a/src/main/java/com/zy/core/thread/SiemensDevpThread.java
+++ b/src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -42,6 +42,8 @@
     private DevpSlave slave;
     private SiemensS7Net siemensS7Net;
     private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
+    public boolean charge0;     //璇锋眰鍏呯數
+    public boolean charge1;     //璇锋眰鍏呯數
     private short heartBeatVal = 1;
     public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{
         add(100);add(101);add(102);add(103);
diff --git a/src/main/java/com/zy/core/thread/SteThread.java b/src/main/java/com/zy/core/thread/SteThread.java
new file mode 100644
index 0000000..9a4be94
--- /dev/null
+++ b/src/main/java/com/zy/core/thread/SteThread.java
@@ -0,0 +1,529 @@
+package com.zy.core.thread;
+
+import HslCommunication.Core.Types.OperateResult;
+import HslCommunication.Core.Types.OperateResultExOne;
+import HslCommunication.Profinet.Siemens.SiemensPLCS;
+import HslCommunication.Profinet.Siemens.SiemensS7Net;
+import com.alibaba.fastjson.JSON;
+import com.core.common.Cools;
+import com.core.common.DateUtils;
+import com.core.common.SpringUtils;
+import com.core.exception.CoolException;
+import com.zy.asrs.entity.BasSte;
+import com.zy.asrs.entity.BasSteOpt;
+import com.zy.asrs.service.BasSteOptService;
+import com.zy.asrs.service.BasSteService;
+import com.zy.core.News;
+import com.zy.core.ThreadHandler;
+import com.zy.core.cache.MessageQueue;
+import com.zy.core.cache.OutputQueue;
+import com.zy.core.cache.SlaveConnection;
+import com.zy.core.enums.SlaveType;
+import com.zy.core.enums.SteStatusType;
+import com.zy.core.model.SteSlave;
+import com.zy.core.model.Task;
+import com.zy.core.model.command.SteCommand;
+import com.zy.core.model.protocol.SteProtocol;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+import java.text.MessageFormat;
+import java.util.Date;
+
+/**
+ * shuttle 绌挎杞︾嚎绋�
+ * Created by vincent on 2020/8/4
+ * 涓嶈兘鏈� 妲藉彿 鍜� 鏈烘灦鍙�
+ */
+@Data
+@Slf4j
+public class SteThread implements Runnable, ThreadHandler {
+
+    private SiemensS7Net siemensS7Net;
+    private SteSlave slave;
+    private SteProtocol steProtocol;
+    private short heartBeatVal = 1;
+    private boolean V20011 = true;
+    private boolean V20001 = true;
+    private boolean resetFlag = false;
+
+    public SteThread(SteSlave slave) {
+        this.slave = slave;
+    }
+
+    @Override
+    @SuppressWarnings("InfiniteLoopStatement")
+    public void run() {
+        this.connect();
+        while (true) {
+            try {
+                int step = 1;
+                Task task = MessageQueue.poll(SlaveType.Ste, slave.getId());
+                if (task != null) {
+                    step = task.getStep();
+                }
+                switch (step) {
+                    // 璇绘暟鎹�
+                    case 1:
+                        readStatus();
+                        break;
+                    // 鍐欏叆鏁版嵁
+                    case 2:
+                        write((SteCommand) task.getData());
+                        break;
+                    default:
+                        break;
+                }
+                // 蹇冭烦
+//                heartbeat();
+                Thread.sleep(500);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+        }
+    }
+
+    /**
+     * 鍒濆鍖栧爢鍨涙満鐘舵��
+     */
+    private void initSte() {
+        if (null == steProtocol) {
+            steProtocol = new SteProtocol();
+        }
+        steProtocol.setSteNo(slave.getId().shortValue());
+        steProtocol.setMode((short) 0);
+        steProtocol.setStatus(SteStatusType.OFF_LINE);
+        steProtocol.setTaskNo((short) 0);
+        steProtocol.setExecute(false);
+        steProtocol.setWaiting(false);
+    }
+
+    @Override
+    public boolean connect() {
+        boolean result = false;
+        // 涓嶈兘鏈� 妲藉彿 鍜� 鏈烘灦鍙�
+        siemensS7Net = new SiemensS7Net(SiemensPLCS.S200Smart, slave.getIp());
+//        siemensS7Net.setRack(slave.getRack().byteValue());
+//        siemensS7Net.setSlot(slave.getSlot().byteValue());
+        OperateResult connect = siemensS7Net.ConnectServer();
+        if(connect.IsSuccess){
+            result = true;
+            OutputQueue.STE.offer(MessageFormat.format( "銆恵0}銆戠┛姊溅plc杩炴帴鎴愬姛 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            News.info("绌挎杞lc杩炴帴鎴愬姛 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+        } else {
+            OutputQueue.STE.offer(MessageFormat.format("銆恵0}銆戠┛姊溅plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{1}] [ip:{2}] [port:{3}] ", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            News.error("绌挎杞lc杩炴帴澶辫触锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+            initSte();
+        }
+//        melsecMcNet.ConnectClose();
+        return result;
+    }
+
+    /**
+     * 璇诲彇鐘舵��
+     */
+    private void readStatus(){
+        try {
+            OperateResultExOne<byte[]> result = siemensS7Net.Read("V800", (short) 70);
+            if (result.IsSuccess) {
+                if (null == steProtocol) {
+                    steProtocol = new SteProtocol();
+                    steProtocol.setSteNo(slave.getId().shortValue());
+                }
+//                steProtocol.setSteNo(siemensS7Net.getByteTransform().TransInt16(result.Content, 0));
+                steProtocol.setMode(siemensS7Net.getByteTransform().TransInt16(result.Content, 2));
+                steProtocol.setStatus(siemensS7Net.getByteTransform().TransInt16(result.Content, 4));
+                OperateResultExOne<Boolean> executeRes = siemensS7Net.ReadBool("V2001.0");
+                if (executeRes.IsSuccess) {
+                    steProtocol.setExecute(executeRes.Content);
+                }
+                OperateResultExOne<Boolean> waitingRes = siemensS7Net.ReadBool("V2001.1");
+                if (waitingRes.IsSuccess) {
+                    steProtocol.setWaiting(waitingRes.Content);
+                }
+//                if (steProtocol.getSteNo()==1){
+//                    if (!steProtocol.getWaiting().equals(V20011)){
+//                        News.error("灏忚溅鍙� ={} :V2001.1鍦板潃璇诲彇鍊间笉涓�鑷达紝璇�={}  璁板綍={}",steProtocol.getSteNo(),steProtocol.getWaiting(),V20011);
+//                    }
+//                    V20011=steProtocol.getWaiting();
+//                    OperateResultExOne<Boolean> waitingRes2 = siemensS7Net.ReadBool("V2000.1");
+//                    if (waitingRes2.IsSuccess) {
+//                        if (!waitingRes2.Content.equals(V20001)){
+//                            News.error("灏忚溅鍙� ={} :V2000.1鍦板潃璇诲彇鍊间笉涓�鑷达紝璇�={} 璁板綍={}",steProtocol.getSteNo(),waitingRes2.Content,V20001);
+//                        }
+//                        V20001=waitingRes2.Content;
+//                    }
+//                    OperateResultExOne<Boolean> waitingRes3 = siemensS7Net.ReadBool("V2500.1");
+//                    if (waitingRes3.IsSuccess) {
+//                        if (!waitingRes3.Content.equals(waitingRes2.Content)){
+//                            News.error("灏忚溅鍙� ={} :V2000.1鍦板潃璇诲彇鍊间笉涓�鑷达紝璇�={} 锛� V2500.1鍦板潃璇诲彇鍊间笉涓�鑷达紝璇�={}",steProtocol.getSteNo(),waitingRes2.Content,waitingRes3.Content);
+//                        }
+//                    }
+//                }
+                OperateResultExOne<Boolean> inEmptyRes = siemensS7Net.ReadBool("V2001.2");
+                if (inEmptyRes.IsSuccess) {
+                    steProtocol.setInEmpty(inEmptyRes.Content);
+                }
+                OperateResultExOne<Boolean> outEmptyRes = siemensS7Net.ReadBool("V2001.3");
+                if (outEmptyRes.IsSuccess) {
+                    steProtocol.setOutEmpty(outEmptyRes.Content);
+                }
+                steProtocol.setAlarm(siemensS7Net.getByteTransform().TransInt16(result.Content, 6));
+                steProtocol.setAlarm0(siemensS7Net.getByteTransform().TransInt16(result.Content, 8));
+                steProtocol.setCharge(siemensS7Net.getByteTransform().TransSingle(result.Content, 10));
+//                steProtocol.setFullCharge();
+//                steProtocol.setLowCharge();
+                steProtocol.setFeed(siemensS7Net.getByteTransform().TransInt16(result.Content, 14));
+                steProtocol.setLoca(siemensS7Net.getByteTransform().TransInt16(result.Content, 16));
+//                steProtocol.setCloser();
+//                steProtocol.setSpeed();
+                steProtocol.setPos(siemensS7Net.getByteTransform().TransInt16(result.Content, 18));
+                steProtocol.setLoad(siemensS7Net.getByteTransform().TransInt16(result.Content, 20));
+                steProtocol.setTrack(siemensS7Net.getByteTransform().TransInt16(result.Content, 22));
+                steProtocol.setTaskNo(siemensS7Net.getByteTransform().TransInt16(result.Content, 24));
+                steProtocol.setTaskType(siemensS7Net.getByteTransform().TransInt16(result.Content, 28));
+                steProtocol.setRow(siemensS7Net.getByteTransform().TransInt16(result.Content, 30));
+                steProtocol.setBay(siemensS7Net.getByteTransform().TransInt16(result.Content, 32));
+                steProtocol.setLev(siemensS7Net.getByteTransform().TransInt16(result.Content, 34));
+
+//                steProtocol.setHisTaskNo(siemensS7Net.getByteTransform().TransInt32(result.Content, 58));
+//                steProtocol.setHisTaskStatus(siemensS7Net.getByteTransform().TransInt16(result.Content, 62));
+//                steProtocol.setCheckQty(siemensS7Net.getByteTransform().TransInt16(result.Content, 64));
+                steProtocol.setReady(siemensS7Net.getByteTransform().TransInt16(result.Content, 36));
+//                steProtocol.setChargeNo(siemensS7Net.getByteTransform().TransInt16(result.Content, 68));
+
+//                steProtocol.setHeart(siemensS7Net.getByteTransform().TransInt16(result.Content, 72));
+                steProtocol.setCrnStopRun(siemensS7Net.getByteTransform().TransInt16(result.Content, 38));
+                steProtocol.setCrnStopFork(siemensS7Net.getByteTransform().TransInt16(result.Content, 40));
+                steProtocol.setCrnAllowRun(siemensS7Net.getByteTransform().TransInt16(result.Content, 42));
+                steProtocol.setChargeStatus(siemensS7Net.getByteTransform().TransInt16(result.Content, 44));
+                OperateResultExOne<Boolean> steChargeRes = siemensS7Net.ReadBool("V740.6");
+                if (steChargeRes.IsSuccess) {
+                    steProtocol.setSteCharge(steChargeRes.Content);
+                    if (steChargeRes.Content){
+                        steProtocol.setChargeStatus((short)1);
+                    }
+                }
+
+                OutputQueue.STE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛", DateUtils.convert(new Date()), slave.getId()));
+
+                // 澶嶄綅淇″彿
+                if (steProtocol.getWaiting()) {
+                    News.info("-------------绗竴姝ャ�乕绌挎杞﹀彿锛歿}, 宸ヤ綔鍙凤細{}]==>> 鐘舵�佷负{}锛岀瓑寰匴CS纭锛侊紒{}",
+                            slave.getId(),steProtocol.getTaskNo(),steProtocol.getStatus(), resetFlag);
+                    if (resetFlag) {
+                        News.info("绗簩姝ャ�佹敹鍒颁富绾跨▼澶嶄綅鏍囪 resetFlag = true,[绌挎杞﹀彿锛歿}, 宸ヤ綔鍙凤細{}]==>> 鐘舵�佷负{}锛岀瓑寰匴CS纭锛侊紒{}",
+                                slave.getId(),steProtocol.getTaskNo(),steProtocol.getStatus(), resetFlag);
+                        SteCommand steCommand = new SteCommand();
+                        steCommand.setComplete(true);
+                        if (write(steCommand) && confirmPos()) {
+                            resetFlag = false;
+                            News.info("绗笁姝ャ�佸彂閫佸浣嶅懡浠ゆ垚鍔� resetFlag = false,[绌挎杞﹀彿锛歿}, 宸ヤ綔鍙凤細{}]==>> 鐘舵�佷负{}锛岀瓑寰匴CS纭锛侊紒{}",
+                                    slave.getId(),steProtocol.getTaskNo(),steProtocol.getStatus(), resetFlag);
+                        }
+                    }
+                }
+
+
+                // 鏍规嵁瀹炴椂淇℃伅鏇存柊鏁版嵁搴�
+                BasSteService service = SpringUtils.getBean(BasSteService.class);
+                if (null != service) {
+                    // 鍚屾pakMk
+                    BasSte one = service.selectById(slave.getId());
+                    if (one != null) {
+                        steProtocol.setPakMk(one.getPakMk());
+                    }
+
+                    BasSte basSte = new BasSte();
+                    basSte.setSteNo(slave.getId());
+                    if (!service.updateById(steProtocol.toSqlModel(basSte))){
+                        News.error("绌挎杞lc鏁版嵁搴撴洿鏂板け璐� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+                    }
+
+                }
+            } else {
+                OutputQueue.STE.offer(MessageFormat.format("銆恵0}銆憑1}绌挎杞lc鐘舵�佷俊鎭け璐�", DateUtils.convert(new Date()), slave.getId()));
+                throw new CoolException(MessageFormat.format( "绌挎杞lc鐘舵�佷俊鎭け璐� ===>> [id:{0}] [ip:{1}] [port:{2}]", slave.getId(), slave.getIp(), slave.getPort()));
+            }
+        } catch (Exception e) {
+//            e.printStackTrace();
+            OutputQueue.STE.offer(MessageFormat.format("銆恵0}銆戣鍙栫┛姊溅plc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+//            News.error("璇诲彇绌挎杞lc鐘舵�佷俊鎭け璐� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+            initSte();
+        }
+
+    }
+
+    /**
+     * 鍐欏叆鏁版嵁
+     */
+    private boolean write(SteCommand command) throws InterruptedException {
+        if (null == command) {
+            News.error("绌挎杞﹀啓鍏ュ懡浠や负绌�");
+            return false;
+        }
+        //鍒ゆ柇灏忚溅鏄惁鍦ㄥ厖鐢�
+        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
+        if (devpThread.charge0
+                && !Cools.isEmpty(command.getRow(),command.getBay(),command.getLev())
+                && command.getRow().intValue()==1 && command.getBay().intValue()==1 && command.getLev().intValue()==1){
+            // led 寮傚父鏄剧ず
+            LedThread ledThread1 = (LedThread) SlaveConnection.get(SlaveType.Led, 1);
+            LedThread ledThread2 = (LedThread) SlaveConnection.get(SlaveType.Led, 2);
+            LedThread ledThread3 = (LedThread) SlaveConnection.get(SlaveType.Led, 3);
+            if (ledThread1 != null && ledThread2 != null && ledThread3 != null) {
+                MessageQueue.offer(SlaveType.Led, 1, new Task(3, "绌挎杞︽鍦�1鎺掑厖鐢垫々鍏呯數"));
+                MessageQueue.offer(SlaveType.Led, 2, new Task(3, "绌挎杞︽鍦�1鎺掑厖鐢垫々鍏呯數"));
+                MessageQueue.offer(SlaveType.Led, 3, new Task(3, "绌挎杞︽鍦�1鎺掑厖鐢垫々鍏呯數"));
+            }
+            News.error("绌挎杞︽鍦�1鎺掑厖鐢垫々鍏呯數");
+            return false;
+        }else if (devpThread.charge1
+                && !Cools.isEmpty(command.getRow(),command.getBay(),command.getLev())
+                && command.getRow().intValue()==13 && command.getBay().intValue()==1 && command.getLev().intValue()==1){
+            // led 寮傚父鏄剧ず
+            LedThread ledThread1 = (LedThread) SlaveConnection.get(SlaveType.Led, 1);
+            LedThread ledThread2 = (LedThread) SlaveConnection.get(SlaveType.Led, 2);
+            LedThread ledThread3 = (LedThread) SlaveConnection.get(SlaveType.Led, 3);
+            if (ledThread1 != null && ledThread2 != null && ledThread3 != null) {
+                MessageQueue.offer(SlaveType.Led, 1, new Task(3, "绌挎杞︽鍦�13鎺掑厖鐢垫々鍏呯數"));
+                MessageQueue.offer(SlaveType.Led, 2, new Task(3, "绌挎杞︽鍦�13鎺掑厖鐢垫々鍏呯數"));
+                MessageQueue.offer(SlaveType.Led, 3, new Task(3, "绌挎杞︽鍦�13鎺掑厖鐢垫々鍏呯數"));
+            }
+            News.error("绌挎杞︽鍦�13鎺掑厖鐢垫々鍏呯數");
+            return false;
+        }
+        command.setSteNo(slave.getId());
+        OperateResult result = null;
+        // 寮�濮嬩换鍔�
+        if (!command.getComplete()) {
+            //缁勭粐浠诲姟鍓嶏紝鍏堟竻绌哄啓浠诲姟纭浣嶏紝浠ュ強浠诲姟瀹屾垚纭浣�
+            siemensS7Net.Write("V2000.0", false);
+            siemensS7Net.Write("V2000.1", false);
+//            siemensS7Net.Write("V2500.1", false);
+            Thread.sleep(200);
+            OperateResultExOne<Boolean> waitingRes2 = siemensS7Net.ReadBool("V2000.1");
+            if (waitingRes2.IsSuccess) {
+                if(!waitingRes2.Content){
+                    News.error("閲嶇疆浠诲姟瀹屾垚纭浣嶆垚鍔�");
+                } else {
+                    News.error("閲嶇疆浠诲姟瀹屾垚纭浣嶅け璐�1");
+                }
+            } else {
+                News.error("閲嶇疆浠诲姟瀹屾垚纭浣嶅け璐�2");
+            }
+
+            // 1.浠诲姟鍙�
+            OperateResult result0 = siemensS7Net.Write("V998", command.getTaskNo().shortValue());
+            try {
+                Thread.sleep(200);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            // 浣滀笟
+            if (command.getTaskMode() != 0) {
+                // 2.浣滀笟
+                OperateResult result1 = siemensS7Net.Write("V1000", command.getTaskMode());
+                // 3.纭寮�濮嬩换鍔�
+                if (result0.IsSuccess && result1.IsSuccess) {
+                    result = siemensS7Net.Write("V2000.0", true);
+                    siemensS7Net.Write("V2000.1", false);
+//                    siemensS7Net.Write("V2500.1", false);
+                }
+
+            // 鍏朵粬鎸囦护
+            } else {
+                // 鎺у埗妯″紡
+                if (command.getControlMode() != null) {
+                    result =  siemensS7Net.Write("V1010", command.getControlMode());
+                // 澶嶄綅淇″彿
+                } else if (command.getReset() != null) {
+                    result =  siemensS7Net.Write("V2000.2", command.getReset());
+                // 鍒犻櫎鎸囦护
+                } else if (command.getDelete() != null) {
+                    result =  siemensS7Net.Write("V2000.3", command.getDelete());
+                // 鏃犳晥鎸囦护
+                } else if (command.getRun() != null) {
+                    result =  siemensS7Net.Write("V1016", command.getRun());
+                    // 鏃犳晥鎸囦护
+                }else {
+                    return false;
+                }
+            }
+
+        // 浠诲姟瀹屾垚
+        } else {
+            siemensS7Net.Write("V2000.0", false);
+            siemensS7Net.Write("V998", (short) 0);
+            siemensS7Net.Write("V1000", (short) 0);
+            result = siemensS7Net.Write("V2000.1", true);
+//            result = siemensS7Net.Write("V2500.1", true);
+        }
+
+        try {
+            // 鏃ュ織璁板綍
+            if (!command.getComplete() && command.getTaskMode() != 0) {
+                BasSteOptService bean = SpringUtils.getBean(BasSteOptService.class);
+                if (null != bean) {
+                    BasSteOpt basSteOpt = new BasSteOpt(
+                            command.getTaskNo(),    // 浠诲姟鍙�
+                            command.getSteNo(),    // 绌挎杞�
+                            new Date(),    // 涓嬪彂鏃堕棿
+                            command.getTaskModeType().desc,    // 浣滀笟
+                            null,    // 婧愭帓
+                            null,    // 婧愬垪
+                            null,    // 婧愬眰
+                            null,    // 婧愮珯
+                            null,    // 鐩爣鎺�
+                            null,    // 鐩爣鍒�
+                            null,    // 鐩爣灞�
+                            null,    // 鐩爣绔�
+                            null,    // 鍝嶅簲缁撴灉
+                            null,    // 淇敼鏃堕棿
+                            null,    // 淇敼浜哄憳
+                            null    // 澶囨敞
+                    );
+                    bean.insert(basSteOpt);
+                }
+            }
+
+        } catch (Exception ignore) {}
+
+        if (result != null && result.IsSuccess) {
+            // 缁存姢鏁版嵁搴撴帓鍒楀眰
+            if (!steProtocol.getWaiting()) {
+                if (!Cools.isEmpty(command.getRow(), command.getBay(), command.getLev())) {
+                    this.modifyPos(command.getRow().intValue(), command.getBay().intValue(), command.getLev().intValue());
+                }
+            }
+
+            News.info("绌挎杞﹀懡浠や笅鍙慬id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
+            OutputQueue.STE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] >>>>> 鍛戒护涓嬪彂锛� {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
+            return true;
+        } else {
+            OutputQueue.STE.offer(MessageFormat.format("銆恵0}銆戝啓鍏ョ┛姊溅plc鏁版嵁澶辫触 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            News.error("鍐欏叆绌挎杞lc鏁版嵁澶辫触 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+            return false;
+        }
+    }
+
+    public void modifyPos(Integer row, Integer bay, Integer lev) {
+        BasSteService service = SpringUtils.getBean(BasSteService.class);
+        if (!service.updatePos(this.slave.getId(), row, bay, lev)) {
+            News.error("鏇存柊{}鍙风┛姊溅瀹氫綅澶辫触 ===>> 鎺掞細銆恵}銆�, 鍒楋細銆恵}銆戯紝灞傦細銆恵}銆�", this.slave.getId(), row, bay, lev);
+        }
+    }
+
+    public boolean confirmPos() {
+        BasSteService service = SpringUtils.getBean(BasSteService.class);
+        BasSte basSte = service.selectById(slave.getId());
+        if (basSte != null) {
+            // 鏇存柊plc鏁版嵁鍧�
+            short[] arr = new short[] {basSte.getRow().shortValue(), basSte.getBay().shortValue(), basSte.getLev().shortValue()};
+            OperateResult result = siemensS7Net.Write("V1002", arr);
+            if (result.IsSuccess) {
+                // 鏇存柊鏁版嵁搴�
+                if (service.updatePakMk(this.slave.getId(), "N")) {
+                    return true;
+                } else {
+                    News.error("{}鍙风┛姊溅淇敼鏁版嵁搴撳畾浣嶅け璐ワ紒锛侊紒", slave.getId());
+                }
+            }
+        }
+        return false;
+    }
+
+    public boolean modifyPosHandle(Integer row, Integer bay, Integer lev) {
+        short[] arr = new short[] {row.shortValue(), bay.shortValue(), lev.shortValue()};
+        OperateResult result = siemensS7Net.Write("V1002", arr);
+        if (!result.IsSuccess) {
+            News.error("鏇存柊{}鍙风┛姊溅瀹氫綅澶辫触 ===>> 鎺掞細銆恵}銆�, 鍒楋細銆恵}銆戯紝灞傦細銆恵}銆�", this.slave.getId(), row, bay, lev);
+            return false;
+        }
+        BasSteService service = SpringUtils.getBean(BasSteService.class);
+        if (!service.updatePos(this.slave.getId(), row, bay, lev)) {
+            News.error("鏇存柊{}鍙风┛姊溅瀹氫綅澶辫触 ===>> 鎺掞細銆恵}銆�, 鍒楋細銆恵}銆戯紝灞傦細銆恵}銆�", this.slave.getId(), row, bay, lev);
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public void close() {
+//        siemensS7Net.ConnectClose();
+    }
+
+    /**
+     * 蹇冭烦
+     */
+    private void heartbeat(){
+        if (heartBeatVal == 1) {
+            heartBeatVal = 2;
+        } else {
+            heartBeatVal = 1;
+        }
+        OperateResult write = siemensS7Net.Write("D10", heartBeatVal);
+        if (!write.IsSuccess) {
+            News.error("杈撻�佺嚎plc缂栧彿={} 蹇冭烦澶辫触", slave.getId());
+        }
+    }
+
+//    public void modifyPos(int wrkNo, int row, int bay, int lev) {
+//        BasSteService service = SpringUtils.getBean(BasSteService.class);
+//        if (!service.updatePos(wrkNo,this.slave.getId(), row, bay, lev)) {
+//            News.error("鏇存柊{}鍙风┛姊溅瀹氫綅澶辫触 ===>> 鎺掞細銆恵}銆�, 鍒楋細銆恵}銆戯紝灞傦細銆恵}銆�", this.slave.getId(), row, bay, lev);
+//        }
+//    }
+
+    /******************************************************************************************/
+    /**************************************** 娴嬭瘯涓撶敤 *****************************************/
+    /*****************************************************************************************/
+    public static void main(String[] args) throws InterruptedException {
+        SteSlave slave = new SteSlave();
+        slave.setId(1);
+        slave.setIp("192.168.2.1");
+        slave.setPort(502);
+        SteThread thread = new SteThread(slave);
+        thread.connect();
+        thread.readStatus();
+        System.out.println(JSON.toJSONString(thread.steProtocol));
+
+        // 浠诲姟浣滀笟
+//        SteCommand command = new SteCommand();
+//        command.setSteNo(1); // 鍫嗗灈鏈虹紪鍙�
+//        Random random = new Random();
+//        int taskNo = random.nextInt(9090);
+//        command.setTaskNo(taskNo); // 宸ヤ綔鍙�
+//        command.setTaskMode(SteTaskModeType.MOVE_LEFT); // 浠诲姟妯″紡
+//        thread.write(command);
+
+        // 浠诲姟瀹屾垚
+//        SteCommand command = new SteCommand();
+//        command.setSteNo(1); // 鍫嗗灈鏈虹紪鍙�
+//        command.setComplete(Boolean.TRUE); // 浠诲姟妯″紡
+//        thread.write(command);
+
+        // 鎺у埗妯″紡
+//        SteCommand command = new SteCommand();
+//        command.setControlMode((short) 1);
+//        thread.write(command);
+
+        // 澶嶄綅淇″彿
+//        SteCommand command = new SteCommand();
+//        command.setReset(Boolean.TRUE);
+//        thread.write(command);
+
+        // 鍒犻櫎鎸囦护
+//        SteCommand command = new SteCommand();
+//        command.setDelete(Boolean.TRUE);
+//        thread.write(command);
+
+        // 绌挎杞﹁繍琛岀姝�
+        SteCommand command = new SteCommand();
+        command.setRun((short)0);
+        thread.write(command);
+
+    }
+
+}
diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html
index 86eb18b..1ec1135 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -19,6 +19,7 @@
             <li><a id="pipeline" onclick="nav(this.id)" class="nav-unselect" href="#">杈撻�佽澶�</a></li>
             <li><a id="crn" onclick="nav(this.id)" class="nav-unselect" href="#">鍫嗗灈鏈�</a></li>
             <li><a id="rgv" onclick="nav(this.id)" class="nav-unselect" href="#">RGV</a></li>
+            <li><a id="ste" onclick="nav(this.id)" class="nav-unselect" href="#">绌挎杞�</a></li>
         </ul>
     </div>
 </div>
diff --git a/src/main/webapp/views/news.html b/src/main/webapp/views/news.html
new file mode 100644
index 0000000..a38876e
--- /dev/null
+++ b/src/main/webapp/views/news.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>NEWS</title>
+    <style>
+        /** {*/
+        /*    padding: 0;*/
+        /*    margin: 0;*/
+        /*}*/
+        .container {
+            height: 100%;
+            width: 100%;
+        }
+        /*=============== SCROLL UP ===============*/
+        .scrollup {
+            text-decoration: none;
+            text-align: center;
+            width: 25px;
+            height: 18px;
+            position: fixed;
+            right: 1rem;
+            bottom: -55%;
+            background-color: rgb(108,167,168);
+            box-shadow: 0 8px 12px hsla(228, 66%, 45%, .1);
+            display: inline-flex;
+            padding: .35rem;
+            border-radius: .25rem;
+            color: #ffffff;
+            z-index: 10;
+            transition: .3s;
+            font-size: 8px;
+        }
+        .scrollup:hover {
+            transform: translateY(-.25rem);
+        }
+        /* Show Scroll Up*/
+        .show-scroll {
+            bottom: 5%;
+        }
+
+        .news-desc {
+            font-size: 14px;
+        }
+        .level-1 {
+            color: #333333;
+        }
+        .level-2 {
+            color: #1E9FFF;
+        }
+        .level-3 {
+            color: red;
+        }
+    </style>
+</head>
+<body>
+<div class="container">
+
+</div>
+<a class="scrollup" id="scroll-up">
+    <span>椤堕儴</span>
+</a>
+</body>
+<script src="../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script src="../static/js/handlebars/handlebars-v4.5.3.js"></script>
+<script src="../static/js/common.js"></script>
+<script>
+    var autoScroll = true;
+
+    function scrollUp(){
+        const scrollUp = document.getElementById('scroll-up');
+        if(this.scrollY >= 100) scrollUp.classList.add('show-scroll'); else scrollUp.classList.remove('show-scroll')
+    }
+    window.addEventListener('scroll', scrollUp)
+
+    $(document).on('click ','#scroll-up', function () {
+        window.scrollTo(0, 0);
+        autoScroll = false;
+    })
+
+    $(document).on('click ','body', function () {
+        autoScroll = false;
+    })
+
+    setInterval(()=>{
+        $.ajax({
+            url: baseUrl + "/news/print",
+            // headers: {'token': localStorage.getItem('token')},
+            method: 'GET',
+            success: function (res) {
+                if (res.code === 200) {
+                    let template = Handlebars.compile($('#newsTpl').html());
+                    $('.container').html(template({list: res.data}));
+                    if (autoScroll) {
+                        window.scrollTo(0, document.body.scrollHeight)
+                    }
+                } else if (res.code === 403) {
+                    window.location.href = baseUrl + "/login";
+                } else {
+                    console.error(res.msg);
+                }
+            }
+        })
+    }, 1000)
+
+</script>
+<script type="text/template" id="newsTpl">
+    {{#each list}}
+    <div class="news-desc level-{{l}}">
+        <span>{{t}}</span>&nbsp;-&nbsp;<span>{{v}}</span>
+    </div>
+    {{/each}}
+</script>
+</html>
diff --git a/src/main/webapp/views/ste.html b/src/main/webapp/views/ste.html
new file mode 100644
index 0000000..441dacf
--- /dev/null
+++ b/src/main/webapp/views/ste.html
@@ -0,0 +1,508 @@
+<!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/ste.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">
+                    <div data-steNo="1" class="ste-command-item">
+                        <label>1#</label>
+                        <button class="demoBtn pos-btn">鏁版嵁缁存姢</button>
+<!--                        <button id="mode-1" class="demoBtn mode-btn" > - </button>-->
+                    </div>
+                    <div data-steNo="2" class="ste-command-item">
+                        <label>2#</label>
+                        <button class="demoBtn pos-btn">鏁版嵁缁存姢</button>
+<!--                        <button id="mode-2" class="demoBtn mode-btn" > - </button>-->
+                    </div>
+                    <div data-steNo="3" class="ste-command-item">
+                        <label>3#</label>
+                        <button class="demoBtn pos-btn">鏁版嵁缁存姢</button>
+<!--                        <button id="mode-3" class="demoBtn mode-btn" > - </button>-->
+                    </div>
+                </div>
+                <!-- 鍫嗗灈鏈虹姸鎬佷綅淇℃伅 -->
+                <div class="ste-state">
+                    <table id="ste-state-table">
+                        <thead>
+                            <tr>
+                                <th>绌挎杞�</th>
+                                <th>妯″紡</th>
+                                <th>鐘舵��</th>
+                                <th>鏈夌墿</th>
+                                <th>鍦ㄨ建</th>
+                                <th>鐢甸噺</th>
+                                <th>鎺�</th>
+                                <th>鍒�</th>
+                                <th>灞�</th>
+                                <th>绛夊緟WCS纭</th>
+                                <th>瀹氫綅</th>
+                                <th>鍏呯數鐘舵��</th>
+                                <th>鎶ヨ淇℃伅1</th>
+                                <th>鎶ヨ淇℃伅2</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+            <!-- 绌挎杞︾姸鎬� -->
+            <div class="ste-msg">
+                <table id="ste-msg-table">
+                    <thead>
+                        <tr>
+                            <th>绌挎杞�</th>
+                            <th>宸ヤ綔鍙�</th>
+                            <th>鐘舵��</th>
+                            <th>婧愮珯</th>
+                            <th>鐩爣绔�</th>
+                            <th>婧愬簱浣�</th>
+                            <th>鐩爣搴撲綅</th>
+                            <th>閫熷害</th>
+                            <th>杩戠偣璺濈</th>
+                            <th>浣滀笟鏍囪</th>
+                        </tr>
+                    </thead>
+                    <tbody>
+                    </tbody>
+                </table>
+            </div>
+            <!-- 鎵嬪姩鎿嶄綔 -->
+            <div class="ste-operation">
+                <!-- 閬僵灞� -->
+                <div class="ste-operation-shade">
+                    <span class="ste-operation-shade-span">
+                        WCS 绯荤粺杩愯涓紝璇峰仠姝㈠悗鎿嶄綔
+                    </span>
+                </div>
+                <!-- 璁惧浠诲姟閫夋嫨 -->
+                <div class="task-select">
+                    <!-- 閫夋嫨 -->
+                    <div id="ste-select" class="operator-item">
+                        <span class="select-title">绌挎杞﹀彿</span>
+                        <div class="select-container">
+                            <label><input type="radio" name="steSelect" value="1" checked>&nbsp;1鍙风┛姊溅</label>
+                            <label><input type="radio" name="steSelect" value="2">&nbsp;2鍙风┛姊溅</label>
+                            <label><input type="radio" name="steSelect" value="3">&nbsp;3鍙风┛姊溅</label>
+                        </div>
+                    </div>
+                </div>
+                <!-- 璁惧浠诲姟鎿嶄綔 -->
+                <div class="task-operator">
+                    <fieldset>
+                        <legend>鎵嬪姩鎿嶄綔</legend>
+                        <div class="button-group">
+                            <button class="item" onclick="steOperator(99)">鑱旀満</button>
+                            <button class="item" onclick="steOperator(100)">鑴辨満</button>
+                            <button class="item" onclick="steOperator(1)">鍚戝彸鍑哄簱</button>
+                            <button class="item" onclick="steOperator(2)">鍚戝乏鍑哄簱</button>
+                            <button class="item" onclick="steOperator(3)">浠庡彸鍏ュ簱</button>
+                            <button class="item" onclick="steOperator(4)">浠庡乏鍏ュ簱</button>
+                            <button class="item" onclick="steOperator(5)">宸︾Щ搴�</button>
+                            <button class="item" onclick="steOperator(6)">鍙崇Щ搴�</button>
+                            <button class="item" onclick="steOperator(7)">鍘诲彸绔�</button>
+                            <button class="item" onclick="steOperator(8)">鍘诲乏绔�</button>
+                            <button class="item" onclick="steOperator(9)">鍙冲緟鏈�</button>
+                            <button class="item" onclick="steOperator(10)">宸﹀緟鏈�</button>
+<!--                            <button class="item" onclick="steOperator(11)">宸︽惉绉�</button>-->
+<!--                            <button class="item" onclick="steOperator(12)">鍙虫惉绉�</button>-->
+<!--                            <button class="item" onclick="steOperator(13)">宸﹀厖鐢�</button>-->
+<!--                            <button class="item" onclick="steOperator(14)">鍙冲厖鐢�</button>-->
+                            <button class="item" onclick="steOperator(20)">鏂紑鍏呯數妗�</button>
+                            <button class="item" onclick="steOperator(21)">灏忚溅鍏呯數缁撴潫</button>
+<!--                            <button class="item" onclick="steOperator(14)">宸︾洏鐐�</button>-->
+<!--                            <button class="item" onclick="steOperator(15)">鍙崇洏鐐�</button>-->
+                            <button class="item" onclick="steOperator(16)">浠诲姟瀹屾垚</button>
+
+                        </div>
+                    </fieldset>
+                </div>
+
+            </div>
+            <!-- 绌挎杞︽棩蹇楄緭鍑� -->
+            <div class="ste-output-board">
+                <textarea id="ste-output"></textarea>
+            </div>
+        </div>
+    </div>
+
+    <div id="ste-detl" style="display: none">
+        <div>
+            <div class="form-item">
+                <label class="form-label">绌挎杞﹀彿:</label>
+                <div class="form-input">
+                    <input id="steNo" name="steNo" class="layui-input" lay-verify="required|number" autocomplete="off" disabled="disabled">
+                </div>
+            </div>
+            <div class="form-item">
+                <label class="form-label">宸ヤ綔鍙�:</label>
+                <div class="form-input">
+                    <input id="workNo" name="workNo" type="number" class="layui-input" lay-verify="number" autocomplete="off">
+                </div>
+            </div>
+            <div class="form-item">
+                <label class="form-label">鎺�:</label>
+                <div class="form-input">
+                    <input id="row" name="row" type="number" class="layui-input" lay-verify="number" autocomplete="off">
+                </div>
+            </div>
+            <div class="form-item">
+                <label class="form-label">鍒�:</label>
+                <div class="form-input">
+                    <input id="bay" name="bay" type="number" class="layui-input" autocomplete="off">
+                </div>
+            </div>
+            <div class="form-item">
+                <label class="form-label">灞�:</label>
+                <div class="form-input">
+                    <input id="lev" name="lev" type="number" class="layui-input" autocomplete="off">
+                </div>
+            </div>
+            <div class="form-item">
+                <label class="form-label">鍫嗗灈鏈�:</label>
+                <div class="form-input">
+                    <input id="crnNo" name="crnNo" type="number" class="layui-input" autocomplete="off">
+                </div>
+            </div>
+            <div class="form-item">
+                <label class="form-label">浣滀笟鏍囪:</label>
+                <div class="form-input">
+                    <input id="pakMk" name="pakMk" type="text" class="layui-input" autocomplete="off">
+                </div>
+            </div>
+            <div class="form-item form-button-container">
+                <button class="form-button" id="save">淇濆瓨</button>
+                <button class="form-button" id="cancel" style="background-color: #D0D0D0">鍙栨秷</button>
+            </div>
+        </di>
+    </div>
+</body>
+</html>
+<script>
+    // 绌虹櫧琛屾暟
+    var steStateTableBlankRows = 0;
+    var steMsgTableBlankRows = 0;
+    // 瀹為檯琛屾暟
+    var steStateTableFullRows = 0;
+    var steMsgTableFullRows = 0;
+    // 鍒濆鍖�
+    var steOutputDom = document.getElementById("ste-output");
+    $(document).ready(function() {
+        initSteStateTable();
+        getSteStateInfo();
+        initSteMsgTable();
+        getSteMsgInfo();
+        operatorBlockShow();
+    });
+
+    setInterval(function () {
+        getSteStateInfo()
+        getSteMsgInfo();
+    },1000)
+    setInterval(function () {
+        getSteOutput();
+        operatorBlockShow();
+    },500);
+
+    // 鍒ゆ柇鎵嬪姩鎿嶄綔妯″潡鏄惁鍙敤
+    function operatorBlockShow() {
+        if (parent.systemRunning) {
+            $('.ste-operation').css("opacity", "0.5");
+            $('.ste-operation-shade').show();
+            $('.ste-operation-shade-span').show();
+        }  else {
+            $('.ste-operation').css("opacity", "1");
+            $('.ste-operation-shade').hide();
+            $('.ste-operation-shade-span').hide();
+        }
+    }
+
+    var layerIdx;
+    $(document).on('click ','.pos-btn', function () {
+        let steNo = Number($(this).parent().attr("data-steNo"));
+        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: $("#ste-detl"),
+            success: function(layero, index){
+                http.get(baseUrl+ "/ste/detl/"+steNo, null, function (res) {
+                    $('#steNo').val(steNo);
+                    $('#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 () {
+                $('#steNo').val("");
+                $('#workNo').val("");
+                $('#row').val("");
+                $('#bay').val("");
+                $('#lev').val("");
+                $('#crnNo').val("");
+                $('#pakMk').val("");
+            }
+        })
+    })
+
+    $(document).on('click ','.mode-btn', function () {
+        let steNo = Number($(this).parent().attr("data-steNo"));
+        layer.confirm("鏀瑰彉" + steNo + ' 鍙风┛姊溅鍦ㄧ嚎鐘舵�佸悧锛�', function(){
+            var index = layer.load(1, {
+                shade: [0.1,'#fff']
+            });
+            $.ajax({
+                url: baseUrl+ "/ste/mode/switch",
+                headers: {'token': localStorage.getItem('token')},
+                data: {
+                    steNo: Number(steNo),
+                    password: 'root'
+                },
+                method: 'POST',
+                success: function (res) {
+                    layer.close(index);
+                    if (res.code === 200){
+                        layer.msg(res.msg, {icon: 1});
+                    } else if (res.code === 403){
+                        window.location.href = baseUrl+"/login";
+                    }  else {
+                        layer.msg(res.msg, {icon: 2});
+                    }
+                }
+            });
+        });
+    })
+
+
+
+    $(document).on('click ','#save', function () {
+        http.post(baseUrl+ "/ste/detl/update", {
+            steNo: $('#steNo').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 getSteStateInfo() {
+        let tableEl = $('#ste-state-table');
+        $.ajax({
+            url: baseUrl+ "/ste/table/ste/state",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    let table = res.data;
+                    if (table.length > steStateTableBlankRows && table.length !== steStateTableFullRows) {
+                        initSteStateTable(table.length-steStateTableBlankRows);
+                        steStateTableFullRows = table.length;
+                    }
+                    for (let i=1;i<=table.length;i++){
+                        $("#mode-"+table[i-1].steNo).html(table[i-1].statusVal===0?'鑱旀満':'鑴辨満');
+                        let tr = tableEl.find("tr").eq(i);
+                        setVal(tr.children("td").eq(0), table[i-1].steNo);
+                        setVal(tr.children("td").eq(1), table[i-1].statusType);
+                        setVal(tr.children("td").eq(2), table[i-1].status);
+                        setVal(tr.children("td").eq(3), table[i-1].loading);
+                        setVal(tr.children("td").eq(4), table[i-1].track);
+                        setVal(tr.children("td").eq(5), table[i-1].charge);
+                        setVal(tr.children("td").eq(6), table[i-1].row);
+                        setVal(tr.children("td").eq(7), table[i-1].bay);
+                        setVal(tr.children("td").eq(8), table[i-1].lev);
+                        setVal(tr.children("td").eq(9), table[i-1].waiting);
+                        setVal(tr.children("td").eq(10), table[i-1].loca);
+                        setVal(tr.children("td").eq(11), table[i-1].chargeStatus);
+                        setVal(tr.children("td").eq(12), table[i-1].alarm1);
+                        setVal(tr.children("td").eq(13), table[i-1].alarm2);
+                    }
+                } else if (res.code === 403){
+                    window.location.href = baseUrl+"/login";
+                }  else {
+                    console.log(res.msg);
+                }
+            }
+        });
+    }
+
+    // 绌挎杞︽暟鎹〃鑾峰彇 ---- 琛ㄤ簩
+    function getSteMsgInfo() {
+        let tableEl = $('#ste-msg-table');
+        $.ajax({
+            url: baseUrl+ "/ste/table/ste/msg",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    var table = res.data;
+                    if (table.length > steMsgTableBlankRows && table.length !== steMsgTableFullRows) {
+                        initSteMsgTable(table.length-steMsgTableBlankRows);
+                        steMsgTableFullRows = 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].steNo);
+                        setVal(tr.children("td").eq(1), table[i-1].workNo);
+                        setVal(tr.children("td").eq(2), table[i-1].status);
+                        setVal(tr.children("td").eq(3), table[i-1].sourceStaNo);
+                        setVal(tr.children("td").eq(4), table[i-1].staNo);
+                        setVal(tr.children("td").eq(5), table[i-1].sourceLocNo);
+                        setVal(tr.children("td").eq(6), table[i-1].locNo);
+                        setVal(tr.children("td").eq(7), table[i-1].speed);
+                        setVal(tr.children("td").eq(8), table[i-1].closer);
+                        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 getSteOutput() {
+        $.ajax({
+            url: baseUrl + "/ste/output/ste",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200) {
+                    steOutput(res.data);
+                } else if (res.code === 403) {
+                    window.location.href = baseUrl + "/login";
+                } else {
+                    console.log(res.msg);
+                }
+            }
+        })
+    }
+
+    // 浠诲姟鎸囦护涓嬪彂
+    function steOperator(steTaskMode) {
+        http.post(baseUrl+"/ste/operator/ste", {
+            steNo: $('input[name="steSelect"]:checked').val(),
+            steTaskMode: steTaskMode
+        }, function (res) {
+            layer.msg(res.msg, {icon: 1});
+        });
+    }
+
+
+    // ------------------------------------------------------------------------------------------------
+
+    // 绌挎杞︿俊鎭〃鑾峰彇  ----- 琛ㄤ竴
+    function initSteStateTable(row) {
+        let line;
+        if (row === undefined){
+            let one = $('#ste-state-table thead').height();
+            let total = $('.ste-state').height();
+            let count = total / one;
+            count = parseInt(count) - 1;
+            steStateTableBlankRows = 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";
+        }
+        $('#ste-state-table tbody').after(html);
+    }
+
+    // 绌挎杞︽暟鎹〃鑾峰彇  ----- 琛ㄤ簩
+    function initSteMsgTable(row) {
+        let line;
+        if (row === undefined){
+            let one = $('#ste-msg-table thead').height();
+            let total = $('.ste-msg').height();
+            let count = total / one;
+            count = parseInt(count) - 1;
+            steMsgTableBlankRows = 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";
+        }
+        $('#ste-msg-table tbody').after(html);
+    }
+
+    // 鏃ュ織杈撳嚭妗�
+    function steOutput(content){
+        steOutputDom.value += content;
+        steOutputDom.scrollTop = steOutputDom.scrollHeight;
+    }
+
+</script>

--
Gitblit v1.9.1