#
zjj
2024-05-23 2a35d8deefb89c4b463fdbafe79f2c7bd294621d
#
8个文件已修改
2个文件已添加
1111 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/domain/vo/SiteLatestDataVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensRgvThread.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/wcs/css/rgv.css 252 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/wcs/js/console.map.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/realtimeWatch/console.html 149 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/realtimeWatch/index2.html 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/realtimeWatch/rgv.html 652 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/SiteLatestDataVo.java
@@ -20,7 +20,7 @@
    private SiteStatusType siteStatus;
    // 隔壁站点(台车特性)
    private String nearbySta;
    private short nearbySta;
    public String getSiteStatus() {
        return siteStatus.toString().toLowerCase().replaceAll("_", "-");
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -60,7 +60,7 @@
    private Short inQty;
    // 隔壁站点(台车位置)
    private String nearbySta;
    private short nearbySta;
    //指令ID
    private Integer commandId;
@@ -109,6 +109,7 @@
    private Boolean upcontactErr = false; //顶升电机接触器故障
    private List<Integer> alarm;
    private Short realTimeLocation;
    public List<Integer> getAlarm(){
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -14,6 +14,7 @@
import com.zy.asrs.entity.param.TaskOverToWms;
import com.zy.asrs.service.*;
import com.zy.common.utils.HttpHandler;
import com.zy.common.utils.News;
import com.zy.core.CrnThread;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -47,6 +47,7 @@
    private SiemensS7Net siemensS7Net;
    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
    private short heartBeatVal = 1;
    private Integer rgvCount = 4;
    public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{
        add(100);add(101);add(102);add(103);add(104);add(105);add(106);add(107);add(108);add(109);add(110);add(111);
        add(112);add(113);add(114);add(115);add(116);add(117);add(118);add(119);add(120);add(121);add(122);add(123);
@@ -168,6 +169,19 @@
                staProtocol.setPakMk(true);
            }
        }
        if (slave.getId() == 2){
            for (int i = 1;i<5;i++){
                StaProtocol staProtocol = station.get(i);
                if (null == staProtocol) {
                    staProtocol = new StaProtocol();
                    staProtocol.setSiteId(i);
                    station.put(i, staProtocol);
                }
                staProtocol.setWorkNo((short) 0);
                staProtocol.setNearbySta((short) 3);
                staProtocol.setLoading(false);
            }
        }
    }
    @Override
@@ -238,6 +252,29 @@
            }
        }
        if (slave.getId() == 2){
            OperateResultExOne<byte[]> resultRgvWrkNo = siemensS7Net.Read("DB55.222", (short) 98);
            OperateResultExOne<byte[]> resultRgvLocation = siemensS7Net.Read("DB43.0", (short) 8);
            OperateResultExOne<byte[]> resultRgvload = siemensS7Net.Read("DB192.0", (short) 8);
            if (resultRgvWrkNo.IsSuccess && resultRgvLocation.IsSuccess && resultRgvload.IsSuccess){
                for (int i = 1;i<5;i++){
                    short wrkNo = siemensS7Net.getByteTransform().TransInt16(resultRgvWrkNo.Content, i * 32);
                    short location = siemensS7Net.getByteTransform().TransInt16(resultRgvLocation.Content, i * 2);
                    boolean[] status = siemensS7Net.getByteTransform().TransBool(resultRgvload.Content, i*2, 1);
                    StaProtocol staProtocol = station.get(i);
                    if (null == staProtocol) {
                        staProtocol = new StaProtocol();
                        staProtocol.setSiteId(i);
                        station.put(i, staProtocol);
                    }
                    staProtocol.setWorkNo(wrkNo);
                    staProtocol.setNearbySta(location);
                    staProtocol.setLoading(status[0]);
                }
            }
        }
        if (slave.getId() == 1){
            //条码
src/main/java/com/zy/core/thread/SiemensRgvThread.java
@@ -191,15 +191,15 @@
                rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 10));
                rgvProtocol.setSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 12));
                rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt32(result.Content, 14));
                rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransBool(result.Content,18));
//                rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransBool(result.Content,18));
                OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功", DateUtils.convert(new Date()), slave.getId()));
                if (rgvProtocol.getAlarm() > 0 ){
                    BasRgvErrService basRgvErrService = SpringUtils.getBean(BasRgvErrService.class);
                    News.error("RGV 异常 ===>> [id:{}] [ip:{}],报警代码:{},报警文本",slave.getId(), slave.getIp(),rgvProtocol.getAlarm(),basRgvErrService.selectById(rgvProtocol.getAlarm()));
                    News.error("RGV 异常 ===>> [id:{}] [ip:{}],报警代码:{},报警文本:{}",slave.getId(), slave.getIp(),rgvProtocol.getAlarm(),basRgvErrService.selectById(rgvProtocol.getAlarm()).getErrName());
                }else {
                    News.info("正常");
                    News.info("RGV状态正常==>[id:{}]",slave.getId());
                }
                // 工位1复位信号
src/main/webapp/static/wcs/css/rgv.css
New file
@@ -0,0 +1,252 @@
body {
    background-color: #6CA7A8;
}
.button-window {
    float: left;
    width: 100%;
    height: 100%;
    padding: 10px;
    border-radius: 5px;
    box-shadow: 0 0 3px rgba(0 0 0 .3);
}
/* -------------------- 第一模块 -------------------- */
.log-board {
    background-color: #fff;
    border-radius: 5px;
    box-shadow: 0 0 3px rgba(0,0,0,.3);
    height: 28%;
}
/* 左 */
.command-log {
    float: left;
    height: 100%;
    width: 20%;
    text-align: center;
}
.command-log h2 {
    padding: 10px;
}
.rgv-command-item {
    padding: 4px 0;
}
.rgv-command-item label {
    font-size: 20px;
    font-weight: bold;
    vertical-align: middle;
}
.rgv-command-item span {
    display: inline-block;
    width: 20px;
    height: 20px;
    background-color: #2e9926;
    border-radius: 5px;
    vertical-align: middle;
}
.rgv-command-item input {
    vertical-align: middle;
    outline: none;
    width: 60%;
}
/* 右 */
.rgv-state {
    float: left;
    height: 100%;
    width: 100%;
    overflow: auto;
}
/* 堆垛机状态表 */
#rgv-state-table {
    font-size: 12px;
    border-collapse: collapse;
    margin: 0 auto;
    text-align: center;
}
#rgv-state-table td, #rgv-state-table th {
    border: 1px solid #cad9ea;
    color: #666;
    height: 25px;
}
#rgv-state-table thead th {
    background-color: #CCE8EB;
    width: 300px;
}
#rgv-state-table tr:nth-child(odd) {
    background: #fff;
}
#rgv-state-table tr:nth-child(even) {
    background: #F5FAFA;
}
/* -------------------- 第二模块 -------------------- */
.rgv-msg {
    /*overflow: auto;*/
    margin-top: 10px;
    height: 23%;
    background-color: #fff;
    border-radius: 5px;
    box-shadow: 0 0 3px rgba(0,0,0,.3);
}
/* 堆垛机状态信息表 */
#rgv-msg-table {
    font-size: 12px;
    border-collapse: collapse;
    margin: 0 auto;
    text-align: center;
}
#rgv-msg-table td, #rgv-msg-table th {
    border: 1px solid #f1f1f1;
    color: #666;
    height: 30px;
}
#rgv-msg-table thead th {
    background-color: #fff;
    width: 400px;
}
#rgv-msg-table tr:nth-child(odd) {
    background: #fff;
}
#rgv-msg-table tr:nth-child(even) {
    background: #fff;
}
/* -------------------- 第三模块 -------------------- */
.rgv-operation {
    position: relative;
    margin-top: 10px;
    height: 25%;
    background-color: #fff;
    border-radius: 5px;
    box-shadow: 0 0 3px rgba(0,0,0,.3);
}
/* 任务设备选择框 */
.task-select {
    height: 50%;
    overflow: hidden;
    padding: 20px 0 10px 20px;
}
.operator-item {
    display: inline-block;
    height: 100%;
    width: 20%;
    text-align: center;
    position: relative;
    vertical-align: middle;
    padding: 10px 0px 10px 50px;
}
.operator-item .select-title {
    display: inline-block;
    position: absolute;
    top: -11px;
    left: 50%;
    transform: translate(-50%, 0);
    background-color: #fff;
    color: #2e95d3;
    font-size: 12px;
    border: 1px solid #8d8d8d;
    border-radius: 5px;
    padding: 5px;
    z-index: 999;
}
.operator-item .select-container {
    padding: 10px 0;
    height: 100%;
    border: 1px solid #8d8d8d;
    border-radius: 5px;
}
#rgv-select .select-container label {
    display: inline-block;
    padding: 0 20px;
    vertical-align: middle; margin-top:-2px; margin-bottom:1px;
}
.select-container input {
    display: inline-block;
    font-size: 12px;
    vertical-align: middle; margin-top:-2px; margin-bottom:1px;
}
.select-container-item {
    display: inline-block;
    margin: 0px auto;
    padding: 0;
}
.select-container-item input {
    height: 20px;
    border: 1px solid #8D8D8D;
    border-radius: 3px;
    width: 80px;
    outline: none;
}
/* 任务作业选择框 */
.task-operator {
    height: 50%;
    overflow: hidden;
    padding: 0 20px 10px 20px;
}
.task-operator fieldset {
    padding: 15px 20px 5px 50px;
    border-width: 1px;
    border-style: solid;
    height: 100%;
}
.task-operator legend {
    margin-left: 20px;
    padding: 0 10px;
    font-size: 16px;
    font-weight: 300;
}
button.item {
    border: 1px solid #333;
    font-size: 13px;
    padding: 1px 1px 1px 1px;
    width: 100px;
    height: 40px;
    outline: none;
    cursor: pointer;
    color: #333;
    background-color: transparent;
    margin-right: 5px;
    border-radius: 5px;
}
button.item:hover {
    background-color: #333;
    color: #fff;
}
/* 手动操作遮罩 */
.rgv-operation-shade {
    position: absolute;
    height: 100%;
    width: 100%;
    z-index: 1000;
    text-align: center;
    padding: 80px 0;
}
.rgv-operation-shade-span {
    font-size: xx-large;
    font-weight: bold;
    color: red;
}
/* -------------------- 第四模块 -------------------- */
.rgv-output-board {
    margin-top: 10px;
    height: 15%;
    background-color: #fff;
    border-radius: 5px;
    box-shadow: 0 0 3px rgba(0,0,0,.3);
}
#rgv-output {
    border-left: none;
    border-right: none;
    border-top: 1px solid #9d9d9d;
    border-bottom: 1px solid #333;
    width: 100%;
    height: 100%;
    overflow: auto;
    resize:none;
    color: #666;
}
src/main/webapp/static/wcs/js/console.map.js
@@ -966,7 +966,7 @@
                "type": "stn",
                "id": "site-407",
                "text": "407",
                "top": 770,
                "top": 795,
                "left": 1437,
                "width": 49,
                "height": 20
@@ -974,7 +974,7 @@
                "type": "stn",
                "id": "site-406",
                "text": "406",
                "top": 795,
                "top": 770,
                "left": 1437,
                "width": 49,
                "height": 20
@@ -982,7 +982,7 @@
                "type": "stn",
                "id": "site-307",
                "text": "307",
                "top": 700,
                "top": 725,
                "left": 1437,
                "width": 49,
                "height": 20
@@ -990,7 +990,7 @@
                "type": "stn",
                "id": "site-306",
                "text": "306",
                "top": 725,
                "top": 700,
                "left": 1437,
                "width": 49,
                "height": 20
src/main/webapp/views/realtimeWatch/console.html
@@ -636,7 +636,7 @@
                            siteEl.html(sites[i].siteId);
                        }
                        // RGV位置
                        if(sites[i].siteId === '112' || sites[i].siteId === '212'){
                        if(sites[i].siteId === '1' || sites[i].siteId === '2'|| sites[i].siteId === '3' || sites[i].siteId === '4'){
                            carAnimate(Number(sites[i].siteId), Number(sites[i].nearbySta));
                        }
                    }
@@ -763,54 +763,121 @@
    // 小车偏移动画
    function carAnimate(id, target) {
        var targetTop = 0;
        if (id === 112) {
        var targetLeft = 1489;
        console.log(id+" ....>>>"+target)
            switch (target) {
                case 1:
                    targetTop += 313;
                    break;
                case 2:
                    targetTop += 313;
                    break;
                case 3:
                    targetTop += 256;
                    targetTop += 67;
                    break;
                case 4:
                    targetTop += 226;
                case 9:
                    targetTop += 92;
                    break;
                case 5:
                    targetTop += 168;
                case 6:
                    targetTop += 168;
                case 14:
                    targetTop += 115;
                    break;
                case 19:
                    targetTop += 140;
                    break;
                case 26:
                    targetTop += 160;
                    break;
                case 31:
                    targetTop += 183;
                    break;
                case 37:
                    targetTop += 208;
                    break;
                case 42:
                    targetTop += 231;
                    break;
                case 49:
                    targetTop += 252;
                    break;
                case 54:
                    targetTop += 275;
                    break;
                case 60:
                    targetTop += 300;
                    break;
                case 65:
                    targetTop += 330;
                    break;
                case 72:
                    targetTop += 366;
                    break;
                case 77:
                    targetTop += 389;
                    break;
                case 83:
                    targetTop += 414;
                    break;
                case 88:
                    targetTop += 445;
                    break;
                case 95:
                    targetTop += 480;
                    break;
                case 100:
                    targetTop += 503;
                    break;
                case 107:
                    targetTop += 528;
                    break;
                case 110:
                    targetTop += 570;
                    break;
                case 118:
                    targetTop += 594;
                    break;
                case 123:
                    targetTop += 617;
                    break;
                case 130:
                    targetTop += 642;
                    break;
                case 156:
                    targetTop += 700;
                    break;
                case 161:
                    targetTop += 712;
                    break;
                case 168:
                    targetTop += 725;
                    break;
                case 186:
                    targetTop += 770;
                    break;
                case 191:
                    targetTop += 782;
                    break;
                case 197:
                    targetTop += 795;
                    break;
                default:
                    return;
                   break;
            }
        } else if (id === 212) {
            switch (target) {
                case 1:
                    targetTop += 313;
                    break;
                case 2:
                    targetTop += 313;
                    break;
                case 3:
                    targetTop += 256;
                    break;
                case 4:
                    targetTop += 226;
                    break;
                case 5:
                    targetTop += 168;
                case 6:
                    targetTop += 168;
                    break;
                default:
                    return;
            if (target === 200){
                targetTop += 830;
                targetLeft += 26;
            }
        } else {
            return;
        }
        $("#site-" + id).animate({top: targetTop + 'px'}, 1000);
            if (target === 300){
                targetTop += 41;
                targetLeft += 26;
            }
            if (target > 0 && target<200 && targetTop === 0){
                var location =  100 - (target/2);
                var px = 830-41;
                targetTop += 41 + (px - px* (location/100));
            }
            if (target > 200 && target<300){
                targetLeft += 45;
                 var location =  300 - target;
                 var px = 830-41;
                targetTop += 41 + px* (location/100);
            }
        $("#site-" + id).animate({top: targetTop + 'px',left:targetLeft+'px'}, 1000);
    }
    //下发输送线命令
src/main/webapp/views/realtimeWatch/index2.html
@@ -24,6 +24,7 @@
            <li><a id="console" onclick="nav(this.id)" class="nav-select" href="#">主控图</a></li>
            <li><a id="pipeline" onclick="nav(this.id)" class="nav-unselect" href="#">输送设备</a></li>
            <li><a id="crn" onclick="nav(this.id)" class="nav-unselect" href="#">堆垛机</a></li>
            <li><a id="rgv" onclick="nav(this.id)" class="nav-unselect" href="#">Rgv</a></li>
        </ul>
    </div>
</div>
src/main/webapp/views/realtimeWatch/rgv.html
New file
@@ -0,0 +1,652 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>RGV监控管理</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <link rel="stylesheet" type="text/css" href="../../static/wcs/css/normalize.css">
    <link rel="stylesheet" type="text/css" href="../../static/wcs/css/common.css">
    <link rel="stylesheet" type="text/css" href="../../static/wcs/css/crn.css">
    <script type="text/javascript" src="../../static/wcs/js/jquery/jquery-3.3.1.min.js"></script>
    <script type="text/javascript" src="../../static/wcs/js/common.js"></script>
    <script type="text/javascript" src="../../static/wcs/js/layer/layer.js"></script>
    <style>
        .demoBtn {
            vertical-align: middle;
            width: 20%;
            height: 25px;
            left: 0;
            top: 0;
            text-shadow: inherit;
            font-size: 15px;
            margin-left: 5px;
            margin-right: 5px;
            display: inline-block;
            background-color: #FF5722;
            border: none;
            color: #FFF;
            box-shadow: 1px 1px 5px #B6B6B6;
            border-radius: 3px;
            cursor: pointer;
        }
        .demoBtn:hover {
            opacity: 0.8
        }
        .demoBtn:focus {
            outline: 0;
        }
    </style>
</head>
<body>
<div style="padding: 10px;height: 100%;float: left;width: 6%">
    <!--  <div class="button-window"></div>-->
</div>
<div style="height: 100%;padding-left: 6%">
    <div style="padding: 10px;height: 100%">
        <!-- 日志监控板 -->
        <div class="log-board" >
            <!-- 执行命令 -->
            <!-- 执行命令 -->
            <!--      <div class="command-log" style="overflow: auto;">-->
            <!--        <h3>执行中的命令</h3>-->
            <!--        <div class="crn-command-item">-->
            <!--          <label>1#</label>-->
            <!--&lt;!&ndash;          <button id="demoBtn-1" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>&ndash;&gt;-->
            <!--          &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
            <!--          <input id="crn1" disabled="disabled">-->
            <!--        </div>-->
            <!--        <div class="crn-command-item">-->
            <!--          <label>2#</label>-->
            <!--&lt;!&ndash;          <button id="demoBtn-2" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>&ndash;&gt;-->
            <!--          &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
            <!--          <input id="crn2" disabled="disabled">-->
            <!--        </div>-->
            <!--        <div class="crn-command-item">-->
            <!--          <label>3#</label>-->
            <!--&lt;!&ndash;          <button id="demoBtn-3" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>&ndash;&gt;-->
            <!--          &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
            <!--          <input id="crn3" disabled="disabled">-->
            <!--        </div>-->
            <!--        <div class="crn-command-item">-->
            <!--          <label>4#</label>-->
            <!--&lt;!&ndash;          <button id="demoBtn-4" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>&ndash;&gt;-->
            <!--          &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
            <!--          <input id="crn4" disabled="disabled">-->
            <!--        </div>-->
            <!--        <div class="crn-command-item">-->
            <!--          <label>5#</label>-->
            <!--&lt;!&ndash;          <button id="demoBtn-5" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>&ndash;&gt;-->
            <!--          &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
            <!--          <input id="crn5" disabled="disabled">-->
            <!--        </div>-->
            <!--        <div class="crn-command-item">-->
            <!--          <label>6#</label>-->
            <!--&lt;!&ndash;          <button id="demoBtn-6" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>&ndash;&gt;-->
            <!--          &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
            <!--          <input id="crn6" disabled="disabled">-->
            <!--        </div>-->
            <!--      </div>-->
            <!-- RGV状态位信息 -->
            <div class="crn-state">
                <table id="crn-state-table">
                    <thead>
                    <tr>
                        <th>RGV</th>
                        <th>模式</th>
                        <th>状态</th>
<!--                        <th>执行状态</th>-->
<!--                        <th>当前速度</th>-->
                        <th>当前位置</th>
                        <th>报警状态</th>
                        <th>故障描述</th>
<!--                        <th>有物</th>-->
<!--                        <th>列</th>-->
<!--                        <th>层</th>-->
<!--                        <th>货叉定位</th>-->
<!--                        <th>载货台定位</th>-->
<!--                        <th>走行在定位</th>-->
<!--                        <th>故障代码</th>-->
<!--                        <th>故障描述</th>-->
                    </tr>
                    </thead>
                    <tbody>
                    </tbody>
                </table>
            </div>
        </div>
        <!-- RGV状态 -->
        <div class="crn-msg">
            <table id="crn-msg-table">
                <thead>
                <tr>
                    <th>RGV</th>
                    <th>工作号</th>
                    <th>状态</th>
                    <th>源站</th>
                    <th>目标站</th>
                    <th>源库位</th>
                    <th>目标库位</th>
                    <th>走行速度(m/min)</th>
<!--                    <th>升降速度(m/min)</th>-->
<!--                    <th>叉牙速度(m/min)</th>-->
<!--                    <th>走行距离(Km)</th>-->
<!--                    <th>升降距离(Km)</th>-->
<!--                    <th>走行时长(H)</th>-->
<!--                    <th>升降时长(H)</th>-->
                </tr>
                </thead>
                <tbody>
                </tbody>
            </table>
        </div>
        <!-- 手动操作 -->
        <div class="crn-operation">
            <!-- 遮罩层 -->
            <!--      <div class="crn-operation-shade">-->
            <!--        <span class="crn-operation-shade-span">-->
            <!--            WCS 系统运行中,请停止后操作-->
            <!--        </span>-->
            <!--      </div>-->
            <!-- 设备任务选择 -->
            <div class="task-select">
                <!-- RGV选择 -->
                <!--        <div id="crn-select" class="operator-item" style="width: 55%">-->
                <!--          <span class="select-title">RGV号</span>-->
                <!--          <div class="select-container" style="padding: 20px 0;">-->
                <!--            <label><input type="radio" name="crnSelect" value="1" checked>&nbsp;1号RGV</label>-->
                <!--            <label><input type="radio" name="crnSelect" value="2">&nbsp;2号RGV</label>-->
                <!--            <label><input type="radio" name="crnSelect" value="3">&nbsp;3号RGV</label>-->
                <!--            <label><input type="radio" name="crnSelect" value="4">&nbsp;4号RGV</label>-->
                <!--            <label><input type="radio" name="crnSelect" value="5">&nbsp;5号RGV</label>-->
                <!--            <label><input type="radio" name="crnSelect" value="6">&nbsp;6号RGV</label>-->
                <!--          </div>-->
                <!--        </div>-->
                <!-- 源站/源库位 选择 -->
                <!--        <div id="source-select" class="operator-item">-->
                <!--          <span class="select-title">源站/源库位</span>-->
                <!--          <div class="select-container">-->
                <!--            <div class="select-container-item">-->
                <!--              <span>站</span>-->
                <!--              <label><input id="sourceStaNo" type="number" name="points" min="0" /></label>-->
                <!--            </div>-->
                <!--            <div class="select-container-item">-->
                <!--              <span>排</span>-->
                <!--              <label><input id="sourceRow" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>-->
                <!--            </div>-->
                <!--            <div class="select-container-item">-->
                <!--              <span>列</span>-->
                <!--              <label><input id="sourceBay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label>-->
                <!--            </div>-->
                <!--            <div class="select-container-item">-->
                <!--              <span>层</span>-->
                <!--              <label><input id="sourceLev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>-->
                <!--            </div>-->
                <!--          </div>-->
                <!--        </div>-->
                <!--        &lt;!&ndash; 目标站/目标库位 选择 &ndash;&gt;-->
                <!--        <div id="target-select" class="operator-item">-->
                <!--          <span class="select-title">目标站/目标库位</span>-->
                <!--          <div class="select-container">-->
                <!--            <div class="select-container-item">-->
                <!--              <span>站</span>-->
                <!--              <label><input id="staNo" type="number" name="points" min="0" /></label>-->
                <!--            </div>-->
                <!--            <div class="select-container-item">-->
                <!--              <span>排</span>-->
                <!--              <label><input id="row" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>-->
                <!--            </div>-->
                <!--            <div class="select-container-item">-->
                <!--              <span>列</span>-->
                <!--              <label><input id="bay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label>-->
                <!--            </div>-->
                <!--            <div class="select-container-item">-->
                <!--              <span>层</span>-->
                <!--              <label><input id="lev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>-->
                <!--            </div>-->
                <!--          </div>-->
                <!--        </div>-->
            </div>
            <!--      &lt;!&ndash; 设备任务操作 &ndash;&gt;-->
            <!--      <div class="task-operator">-->
            <!--        <fieldset>-->
            <!--          <legend>手动操作</legend>-->
            <!--          <div class="button-group">-->
            <!--            <button class="item" onclick="put()">入库</button>-->
            <!--            <button class="item" onclick="take()">出库</button>-->
            <!--            <button class="item" onclick="stockMove()">库位转移</button>-->
            <!--            <button class="item" onclick="siteMove()">站到站</button>-->
            <!--            &lt;!&ndash;                <button class="item" onclick="bacOrigin()">回原点</button>&ndash;&gt;-->
            <!--            &lt;!&ndash;                <button class="item" onclick="reverseOrigin()">反原点</button>&ndash;&gt;-->
            <!--            <button class="item" onclick="coorMove()">坐标移行</button>-->
            <!--            <button class="item" onclick="taskComplete()">任务完成</button>-->
            <!--            &lt;!&ndash;                <button class="item" onclick="pause()">暂停</button>&ndash;&gt;-->
            <!--            &lt;!&ndash;                <button class="item" onclick="boot()">启动</button>&ndash;&gt;-->
            <!--            <button class="item" onclick="clearCommand()">清除命令</button>-->
            <!--            <button class="item" onclick="handleReset()">复位</button>-->
            <!--          </div>-->
            <!--        </fieldset>-->
            <!--      </div>-->
        </div>
        <!-- RGV日志输出 -->
        <div class="crn-output-board">
            <textarea id="crn-output"></textarea>
        </div>
    </div>
</div>
</body>
<script>
    // 空白行数
    var crnStateTableBlankRows = 0;
    var crnMsgTableBlankRows = 0;
    // 实际行数
    var crnStateTableFullRows = 0;
    var crnMsgTableFullRows = 0;
    // 初始化
    var crnOutputDom = document.getElementById("crn-output");
    $(document).ready(function() {
        getCommandLog();
        initCrnStateTable();
        getCrnStateInfo();
        initCrnMsgTable();
        getCrnMsgInfo();
        operatorBlockShow();
    });
    // 数据更新
    setInterval(function () {
        getCrnStateInfo();
        getCrnMsgInfo();
        getCommandLog();
    },1000);
    setInterval(function () {
        getCrnOutput();
        operatorBlockShow();
        initDemo();
    },500);
    // 判断手动操作模块是否可用
    function operatorBlockShow() {
        if (parent.systemRunning) {
            $('.crn-operation').css("opacity", "0.5");
            $('.crn-operation-shade').show();
            $('.crn-operation-shade-span').show();
        }  else {
            $('.crn-operation').css("opacity", "1");
            $('.crn-operation-shade').hide();
            $('.crn-operation-shade-span').hide();
        }
    }
    // 获取RGV执行中的命令
    function getCommandLog() {
        $.ajax({
            url: baseUrl + "/rgv/command/ongoing",
            headers: {'token': localStorage.getItem('token')},
            method: 'POST',
            success: function (res) {
                if (res.code === 200) {
                    var commands = res.data;
                    for (var i=0; i<commands.length;i++){
                        $("#crn"+commands[i].rgvNo).val(commands[i].command);
                    }
                } else if (res.code === 403) {
                    window.location.href = baseUrl + "/login";
                } else {
                    console.log(res.msg);
                }
            }
        })
    }
    // RGV信息表获取 ---- 表一
    function getCrnStateInfo() {
        var tableEl = $('#crn-state-table');
        $.ajax({
            url: baseUrl+ "/rgv/table/rgv/state",
            headers: {'token': localStorage.getItem('token')},
            method: 'POST',
            success: function (res) {
                if (res.code === 200){
                    var table = res.data;
                    if (table.length > crnStateTableBlankRows && table.length !== crnStateTableFullRows) {
                        initCrnStateTable(table.length-crnStateTableBlankRows);
                        crnStateTableFullRows = table.length;
                    }
                    for (var i=1;i<=table.length;i++){
                        var tr = tableEl.find("tr").eq(i);
                        setVal(tr.children("td").eq(0), table[i-1].rgvNo);
                        setVal(tr.children("td").eq(1), table[i-1].statusType);
                        setVal(tr.children("td").eq(2), table[i-1].status);
                        setVal(tr.children("td").eq(3), table[i-1].rgvPos);
                        setVal(tr.children("td").eq(4), table[i-1].walkPos);
                        setVal(tr.children("td").eq(5), table[i-1].alarm);
                    }
                } else if (res.code === 403){
                    window.location.href = baseUrl+"/login";
                }  else {
                    console.log(res.msg);
                }
            }
        });
    }
    // RGV数据表获取 ---- 表二
    function getCrnMsgInfo() {
        var tableEl = $('#crn-msg-table');
        $.ajax({
            url: baseUrl+ "/rgv/table/rgv/msg",
            headers: {'token': localStorage.getItem('token')},
            method: 'POST',
            success: function (res) {
                if (res.code === 200){
                    var table = res.data;
                    if (table.length > crnStateTableBlankRows && table.length !== crnMsgTableFullRows) {
                        initCrnStateTable(table.length-crnStateTableBlankRows);
                        crnMsgTableFullRows = table.length;
                    }
                    for (var i=1;i<=table.length;i++){
                        var tr = tableEl.find("tr").eq(i);
                        setVal(tr.children("td").eq(0), table[i-1].rgvNo);
                        setVal(tr.children("td").eq(1), table[i-1].workNo);
                        setVal(tr.children("td").eq(2), table[i-1].status);
                        setVal(tr.children("td").eq(3), table[i-1].sourceStaNo);
                        setVal(tr.children("td").eq(4), table[i-1].staNo);
                        setVal(tr.children("td").eq(5), table[i-1].sourceLocNo);
                        setVal(tr.children("td").eq(6), table[i-1].locNo);
                        setVal(tr.children("td").eq(7), table[i-1].xspeed);
                        // setVal(tr.children("td").eq(8), table[i-1].yspeed);
                        // setVal(tr.children("td").eq(9), table[i-1].zspeed);
                        // setVal(tr.children("td").eq(10), table[i-1].xdistance);
                        // setVal(tr.children("td").eq(11), table[i-1].ydistance);
                        // setVal(tr.children("td").eq(12), table[i-1].xduration);
                        // setVal(tr.children("td").eq(13), table[i-1].yduration);
                    }
                } else if (res.code === 403){
                    window.location.href = baseUrl+"/login";
                }  else {
                    console.log(res.msg);
                }
            }
        });
    }
    // RGV手动操作区 -----------------------------------------------------------------------
    function getReqParam() {
        var rgvNo = $('input[name="crnSelect"]:checked').val();
        var sourceStaNo = $('#sourceStaNo').val();
        var sourceRow = $('#sourceRow').val();
        var sourceBay = $('#sourceBay').val();
        var sourceLev = $('#sourceLev').val();
        var staNo = $('#staNo').val();
        var row = $('#row').val();
        var bay = $('#bay').val();
        var lev = $('#lev').val();
        return {
            rgvNo: rgvNo,
            sourceStaNo: sourceStaNo,
            sourceRow: sourceRow,
            sourceBay: sourceBay,
            sourceLev: sourceLev,
            staNo: staNo,
            row: row,
            bay: bay,
            lev: lev
        };
    }
    // 入库
    function put() {
        http.post(baseUrl+"/crn/operator/put", getReqParam(), function (res) {
            layer.msg(res.msg);
        });
    }
    // 出库
    function take() {
        http.post(baseUrl+"/crn/operator/take", getReqParam(), function (res) {
            layer.msg(res.msg);
        });
    }
    // 库位转移
    function stockMove() {
        http.post(baseUrl+"/crn/operator/stockMove", getReqParam(), function (res) {
            layer.msg(res.msg);
        });
    }
    // 站到站
    function siteMove() {
        http.post(baseUrl+"/crn/operator/siteMove", getReqParam(), function (res) {
            layer.msg(res.msg);
        });
    }
    // 坐标移动
    function coorMove() {
        http.post(baseUrl+"/crn/operator/coorMove", getReqParam(), function (res) {
            layer.msg(res.msg);
        });
    }
    // 回原点
    function bacOrigin() {
        http.post(baseUrl+"/crn/operator/bacOrigin", getReqParam(), function (res) {
            layer.msg(res.msg);
        });
    }
    // 回原点
    function reverseOrigin() {
        http.post(baseUrl+"/crn/operator/reverseOrigin", getReqParam(), function (res) {
            layer.msg(res.msg);
        });
    }
    // 任务完成
    function taskComplete() {
        http.post(baseUrl+"/crn/operator/taskComplete", getReqParam(), function (res) {
            layer.msg(res.msg);
        });
    }
    // 暂停
    function pause() {
        http.post(baseUrl+"/crn/operator/pause", getReqParam(), function (res) {
            layer.msg(res.msg);
        });
    }
    // 启动
    function boot() {
        http.post(baseUrl+"/crn/operator/boot", getReqParam(), function (res) {
            layer.msg(res.msg);
        });
    }
    // 清除命令
    function clearCommand() {
        http.post(baseUrl+"/crn/operator/clearCommand", getReqParam(), function (res) {
            layer.msg(res.msg);
        });
    }
    // 手动复位
    function handleReset() {
        http.post(baseUrl+"/crn/operator/handleReset", getReqParam(), function (res) {
            layer.msg(res.msg);
        });
    }
    // 输送设备日志输出 -----------------------------------------------------------------------
    function getCrnOutput() {
        $.ajax({
            url: baseUrl + "/rgv/output/site",
            headers: {'token': localStorage.getItem('token')},
            method: 'POST',
            success: function (res) {
                console.log(res)
                if (res.code === 200) {
                    crnOutput(res.data);
                } else if (res.code === 403) {
                    window.location.href = baseUrl + "/login";
                } else {
                    console.log(res.msg);
                }
            }
        })
    }
    // ------------------------------------------------------------------------------------------------
    // RGV信息表获取  ----- 表一
    function initCrnStateTable(row) {
        var line;
        if (row === undefined){
            var one = $('#crn-state-table thead').height();
            var total = $('.crn-state').height();
            var count = total / one;
            count = parseInt(count) - 1;
            crnStateTableBlankRows = count;
            line = count;
        } else {
            line = row;
        }
        var html = "";
        for (var i = 0; i < line; i ++){
            html += " <tr>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "     </tr>\n";
        }
        $('#crn-state-table tbody').after(html);
    }
    // RGV数据表获取  ----- 表二
    function initCrnMsgTable(row) {
        var line;
        if (row === undefined){
            var one = $('#crn-msg-table thead').height();
            var total = $('.crn-msg').height();
            var count = total / one;
            count = parseInt(count) - 1;
            crnMsgTableBlankRows = count;
            line = count;
        } else {
            line = row;
        }
        var html = "";
        for (var i = 0; i < line; i ++){
            html += " <tr>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "       <td></td>\n" +
                "     </tr>\n";
        }
        $('#crn-msg-table tbody').after(html);
    }
    // 日志输出框
    function crnOutput(content){
        crnOutputDom.value += content;
        crnOutputDom.scrollTop = crnOutputDom.scrollHeight;
    }
    var crnDemoData;
    function initDemo() {
        $.ajax({
            url: baseUrl+"/crn/demo/status",
            async: false,
            method: 'GET',
            success: function (res) {
                if (res.code === 200) {
                    crnDemoData = res.data;
                    crnDemoData.forEach(function (e) {
                        $("#demoBtn-"+e.rgvNo).html(e.demo?'停止':'演示');
                    })
                } else if (res.code === 403){
                    parent.location.href = baseUrl+"/login";
                }  else {
                    layer.msg(res.msg, {icon: 2});
                }
            }
        })
    }
    function demoSwitch(el) {
        var crnId = el.split("-")[1];
        var opt;
        if (crnDemoData == null) {
            initDemo();
        }
        for (var i = 0; i<crnDemoData.length; i++) {
            if (Number(crnDemoData[i].rgvNo) === Number(crnId)) {
                opt = !crnDemoData[i].demo;
            }
        }
        layer.confirm(crnId + ' 号RGV确定'+ (opt?'开始':'停止') + '演示吗?', function(){
            doDemo(crnId, 'root', opt); // 停止wcs系统
        });
    }
    function doDemo(crnId, password, opt) {
        // 加载tips
        var index = layer.load(1, {
            shade: [0.1,'#fff']
        });
        $.ajax({
            url: baseUrl+ "/crn/demo/switch",
            headers: {'token': localStorage.getItem('token')},
            // async: false,
            data: {
                crnId: Number(crnId),
                password: password,
                opt: opt
            },
            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});
                }
            }
        });
    }
</script>
</html>