| | |
| | | <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/css/common_wcs.css"> |
| | | <link rel="stylesheet" type="text/css" href="../static/layui/css/layui.css"> |
| | | <link rel="stylesheet" href="../static/css/shuttle.css"> |
| | | <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script> |
| | |
| | | <script type="text/javascript" src="../static/js/common.js"></script> |
| | | </head> |
| | | <body> |
| | | <div style="padding: 10px;height: 100%;float: left;width: 6%"> |
| | | <div class="button-window"></div> |
| | | </div> |
| | | <div style="height: 100%;padding-left: 6%"> |
| | | <div style="padding: 10px;height: 100%"> |
| | | <!-- 日志监控板 --> |
| | | <div class="log-board"> |
| | | <div class="command-log" id="commandLogId"> |
| | | <!-- <div data-shuttleNo="1" class="shuttle-command-item">--> |
| | | <!-- <label>1#</label>--> |
| | | <!-- <button class="demoBtn pos-btn">数据维护</button>--> |
| | | <!-- <button id="mode-1" class="demoBtn mode-btn" >设备信息</button>--> |
| | | <!-- </div>--> |
| | | </div> |
| | | <!-- 堆垛机状态位信息 --> |
| | | <div class="shuttle-state"> |
| | | <table id="shuttle-state-table"> |
| | | <thead> |
| | | <tr> |
| | | <th>四向穿梭车</th> |
| | | <th>待定</th> |
| | | <th>状态</th> |
| | | <th>有物</th> |
| | | <th>在轨</th> |
| | | <th>电量</th> |
| | | <th>排</th> |
| | | <th>列</th> |
| | | <th>层</th> |
| | | <th>等待WCS确认</th> |
| | | <th>定位</th> |
| | | <th>充电状态</th> |
| | | <th>报警信息1</th> |
| | | <th>报警信息2</th> |
| | | </tr> |
| | | </thead> |
| | | <tbody> |
| | | </tbody> |
| | | </table> |
| | | </div> |
| | | </div> |
| | | <!-- 穿梭车状态 --> |
| | | <div class="shuttle-msg"> |
| | | <table id="shuttle-msg-table"> |
| | | <div style="padding: 10px;height: 100%;float: left;width: 6%"> |
| | | <div class="button-window"></div> |
| | | </div> |
| | | <div style="height: 100%;padding-left: 6%"> |
| | | <div style="padding: 10px;height: 100%"> |
| | | <!-- 日志监控板 --> |
| | | <div class="log-board"> |
| | | <!-- <div class="command-log" id="commandLogId" style="width: 5%;">--> |
| | | <!--<!– <div data-shuttleNo="1" class="shuttle-command-item">–>--> |
| | | <!--<!– <label>1#</label>–>--> |
| | | <!--<!– <button class="demoBtn pos-btn">数据维护</button>–>--> |
| | | <!--<!– <button id="mode-1" class="demoBtn mode-btn" >设备信息</button>–>--> |
| | | <!--<!– </div>–>--> |
| | | <!-- </div>--> |
| | | <!-- 堆垛机状态位信息 --> |
| | | <div class="shuttle-state" style="width: 100%;"> |
| | | <table id="shuttle-state-table"> |
| | | <thead> |
| | | <tr> |
| | | <th>四向穿梭车</th> |
| | | <th>工作号</th> |
| | | <th>状态</th> |
| | | <th>源站</th> |
| | | <th>目标站</th> |
| | | <th>源库位</th> |
| | | <th>目标库位</th> |
| | | <th>速度</th> |
| | | <th>作业标记</th> |
| | | </tr> |
| | | <tr> |
| | | <th>四向穿梭车</th> |
| | | <th>任务状态</th> |
| | | <th>小车状态</th> |
| | | <th>工作模式</th> |
| | | <th>实际库位</th> |
| | | <th>实际坐标</th> |
| | | <th>电量</th> |
| | | <th>当前速度</th> |
| | | <th>负载状态</th> |
| | | <th>顶升位置</th> |
| | | <th>充电状态</th> |
| | | <th>故障码</th> |
| | | <th>管制状态</th> |
| | | <th>低电量</th> |
| | | <th>演示模式</th> |
| | | </tr> |
| | | </thead> |
| | | <tbody> |
| | | </tbody> |
| | | </table> |
| | | </div> |
| | | <!-- 手动操作 --> |
| | | <div class="shuttle-operation"> |
| | | <!-- 遮罩层 --> |
| | | <div class="shuttle-operation-shade"> |
| | | </div> |
| | | <!-- 穿梭车状态 --> |
| | | <div class="shuttle-msg"> |
| | | <table id="shuttle-msg-table"> |
| | | <thead> |
| | | <tr> |
| | | <th>四向穿梭车</th> |
| | | <th>工作号</th> |
| | | <th>源库位</th> |
| | | <th>目标库位</th> |
| | | <th>电池电压</th> |
| | | <th>剩余电量</th> |
| | | <th>总电量</th> |
| | | <th>作业标记</th> |
| | | </tr> |
| | | </thead> |
| | | <tbody> |
| | | </tbody> |
| | | </table> |
| | | </div> |
| | | <!-- 手动操作 --> |
| | | <div class="shuttle-operation"> |
| | | <!-- 遮罩层 --> |
| | | <div class="shuttle-operation-shade"> |
| | | <span class="shuttle-operation-shade-span"> |
| | | WCS 系统运行中,请停止后操作 |
| | | </span> |
| | | </div> |
| | | <!-- 设备任务选择 --> |
| | | <div class="task-select"> |
| | | <!-- 选择 --> |
| | | <div id="shuttle-select" class="operator-item"> |
| | | <span class="select-title">四向穿梭车号</span> |
| | | <div class="select-container" id="shuttleRadioBoxId"> |
| | | <!-- <label><input type="radio" name="shuttleSelect" value="1" checked> 1号穿梭车</label>--> |
| | | </div> |
| | | </div> |
| | | <!-- 设备任务选择 --> |
| | | <div class="task-select"> |
| | | <!-- 选择 --> |
| | | <div id="shuttle-select" class="operator-item" style="width: 100%;"> |
| | | <span class="select-title">四向穿梭车号</span> |
| | | <div class="select-container" id="shuttleRadioBoxId" style="display: flex;flex-wrap: wrap;justify-content: center;align-items: center;"> |
| | | <!-- <label><input type="radio" name="shuttleSelect" value="1" checked> 1号穿梭车</label>--> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- 设备任务操作 --> |
| | | <div class="task-operator"> |
| | | <!-- 设备任务操作 --> |
| | | <div class="task-operator"> |
| | | <fieldset style="height: auto;padding-bottom: 20px;"> |
| | | <legend>手动操作</legend> |
| | | <div style="display: flex;"> |
| | | <div class="task-operator" style="height: auto;width: auto;"> |
| | | <div class="operator-item" style="height: auto"> |
| | | <span class="select-title">源站/源库位</span> |
| | | <div class="select-container" style="height: auto"> |
| | | <div style="width: 30%;"> |
| | | <div class="operator-item" style="height: auto;width: 100%;"> |
| | | <span class="select-title">源库位/目标库位</span> |
| | | <div class="select-container" style="height: auto;padding: 30px 10px 20px 10px;"> |
| | | <div class="select-container-item"> |
| | | <span>站</span> |
| | | <label><input id="sourceStaNo" type="number" name="points" min="0" /></label> |
| | | <span>源库位</span> |
| | | <label><input id="sourceLocNo" type="text" name="sourceLocNo" /></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> |
| | | <span>目标库位</span> |
| | | <label><input id="distLocNo" type="text" name="distLocNo" /></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 style="margin-top: 10px;"> |
| | | <button class="item" onclick="shuttleOperator(9)">搬运货物</button> |
| | | <button class="item" onclick="shuttleOperator(4)">移动到目标库位</button> |
| | | <button class="item" onclick="shuttleOperator(5)">移动到目标库位(任务)</button> |
| | | <!-- <button class="item" onclick="shuttleOperator(16)">移动到提升机</button>--> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="task-operator" style="height: auto;width: auto;"> |
| | | <div class="operator-item" style="height: auto"> |
| | | <span class="select-title">源站/源库位</span> |
| | | <div class="select-container" style="height: auto"> |
| | | <div class="select-container-item"> |
| | | <span>站</span> |
| | | <label><input id="distStaNo" type="number" name="points" min="0" /></label> |
| | | </div> |
| | | <div class="select-container-item"> |
| | | <span>排</span> |
| | | <label><input id="distRow" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label> |
| | | </div> |
| | | <div class="select-container-item"> |
| | | <span>列</span> |
| | | <label><input id="distBay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label> |
| | | </div> |
| | | <div class="select-container-item"> |
| | | <span>层</span> |
| | | <label><input id="distLev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label> |
| | | <div style="width: 40%;"> |
| | | <div class="operator-item" style="height: auto;width: 100%;"> |
| | | <span class="select-title">相关指令</span> |
| | | <div class="select-container" style="height: auto;padding: 30px 10px 10px 10px;"> |
| | | <div class="button-group"> |
| | | <button class="item" onclick="shuttleOperator(1)">托盘顶升</button> |
| | | <button class="item" onclick="shuttleOperator(2)">托盘下降</button> |
| | | <button class="item" onclick="shuttleOperator(6)">充电开关</button> |
| | | <button class="item" onclick="shuttleOperator(3)">复位</button> |
| | | <button class="item" onclick="shuttleOperator(12)">演示模式-开</button> |
| | | <button class="item" onclick="shuttleOperator(13)">演示模式-关</button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <fieldset style="height: auto;padding-bottom: 20px;"> |
| | | <legend>手动操作</legend> |
| | | <div class="button-group"> |
| | | <button class="item" onclick="shuttleOperator(4)">托盘顶升</button> |
| | | <button class="item" onclick="shuttleOperator(4)">托盘放下</button> |
| | | <button class="item" onclick="shuttleOperator(5)">左移</button> |
| | | <button class="item" onclick="shuttleOperator(6)">右移</button> |
| | | <button class="item" onclick="shuttleOperator(7)">前移</button> |
| | | <button class="item" onclick="shuttleOperator(8)">后移</button> |
| | | <button class="item" onclick="shuttleOperator(9)">强制移动</button> |
| | | <button class="item" onclick="shuttleOperator(16)">任务完成</button> |
| | | </div> |
| | | </fieldset> |
| | | </div> |
| | | |
| | | </fieldset> |
| | | </div> |
| | | <!-- 穿梭车日志输出 --> |
| | | <div class="shuttle-output-board"> |
| | | <textarea id="shuttle-output"></textarea> |
| | | </div> |
| | | |
| | | </div> |
| | | <!-- 穿梭车日志输出 --> |
| | | <div class="shuttle-output-board"> |
| | | <textarea id="shuttle-output"></textarea> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div id="shuttle-detl" style="display: none"> |
| | | <div> |
| | | <div class="form-item"> |
| | | <label class="form-label">四向穿梭车号:</label> |
| | | <div class="form-input"> |
| | | <input id="shuttleNo" name="shuttleNo" class="layui-input" lay-verify="required|number" autocomplete="off" disabled="disabled"> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">工作号:</label> |
| | | <div class="form-input"> |
| | | <input id="workNo" name="workNo" type="number" class="layui-input" lay-verify="number" autocomplete="off"> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">排:</label> |
| | | <div class="form-input"> |
| | | <input id="row" name="row" type="number" class="layui-input" lay-verify="number" autocomplete="off"> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">列:</label> |
| | | <div class="form-input"> |
| | | <input id="bay" name="bay" type="number" class="layui-input" autocomplete="off"> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">层:</label> |
| | | <div class="form-input"> |
| | | <input id="lev" name="lev" type="number" class="layui-input" autocomplete="off"> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">作业标记:</label> |
| | | <div class="form-input"> |
| | | <input id="pakMk" name="pakMk" type="text" class="layui-input" autocomplete="off"> |
| | | </div> |
| | | </div> |
| | | <div class="form-item form-button-container"> |
| | | <button class="form-button" id="save">保存</button> |
| | | <button class="form-button" id="cancel" style="background-color: #D0D0D0">取消</button> |
| | | <div id="shuttle-detl" style="display: none"> |
| | | <div> |
| | | <div class="form-item"> |
| | | <label class="form-label">穿梭车号:</label> |
| | | <div class="form-input"> |
| | | <input id="shuttleNo" name="shuttleNo" class="layui-input" lay-verify="required|number" autocomplete="off" disabled="disabled"> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div id="shuttle-detl2" style="display: none"> |
| | | <div style="width: 1400px"> |
| | | <div class="form-item" style="text-align: left"> |
| | | <spen style="margin: 20px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style:dotted;"> |
| | | 异常:<spen style="color: #FD482C;">✔</spen> |
| | | </spen> |
| | | <spen style="margin: 20px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style: double;"> |
| | | 正常:<spen style="color: #00FF00;">—</spen> |
| | | </spen> |
| | | </div> |
| | | <div style="float:left;margin: 10px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style:dotted;"> |
| | | <div class="form-item" style="text-align: center"> |
| | | <label>四向穿梭车异常</label> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">四向穿梭车号:</label> |
| | | <div class="form-input"> |
| | | <input id="shuttleNo1" name="shuttleNo" class="layui-input" lay-verify="required|number" autocomplete="off" disabled="disabled" readonly> |
| | | </div> |
| | | </div> |
| | | |
| | | </div> |
| | | <div style="float:left;margin: 10px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style:dotted"> |
| | | <div class="form-item" style="text-align: center"> |
| | | <label>四向穿梭车提示信息</label> |
| | | </div> |
| | | |
| | | </div> |
| | | <div style="float:left;margin: 10px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style:dotted"> |
| | | <div class="form-item" style="text-align: center"> |
| | | <label>任务信息</label> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">入库任务中:</label> |
| | | <div class="form-input"> |
| | | <input id="pakInTask" name="pakInTask" class="layui-input" autocomplete="off" readonly> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">出库任务中:</label> |
| | | <div class="form-input"> |
| | | <input id="pakOutTask" name="pakOutTask" class="layui-input" autocomplete="off" readonly> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">移库任务中:</label> |
| | | <div class="form-input"> |
| | | <input id="pakMoveTask" name="pakMoveTask" class="layui-input" autocomplete="off" readonly> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">回原点任务中:</label> |
| | | <div class="form-input"> |
| | | <input id="goHpTask" name="goHpTask" class="layui-input" autocomplete="off" readonly> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">去反原点任务中:</label> |
| | | <div class="form-input"> |
| | | <input id="goOHpTask" name="goOHpTask" class="layui-input" autocomplete="off" readonly> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">去原点避让位:</label> |
| | | <div class="form-input"> |
| | | <input id="goHpAvoid" name="goHpAvoid" class="layui-input" autocomplete="off" readonly> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">去反原点避让位:</label> |
| | | <div class="form-input"> |
| | | <input id="goOHpAvoid" name="goOHpAvoid" class="layui-input" autocomplete="off" readonly> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">入库取空结束:</label> |
| | | <div class="form-input"> |
| | | <input id="pakInEmpty" name="pakInEmpty" class="layui-input" autocomplete="off" readonly> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">入库正常结束:</label> |
| | | <div class="form-input"> |
| | | <input id="pakInFinish" name="pakInFinish" class="layui-input" autocomplete="off" readonly> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">出库取空结束:</label> |
| | | <div class="form-input"> |
| | | <input id="pakOutEmpty" name="pakOutEmpty" class="layui-input" autocomplete="off" readonly> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">出库正常结束:</label> |
| | | <div class="form-input"> |
| | | <input id="pakOutFinish" name="pakOutFinish" class="layui-input" autocomplete="off" readonly> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">去原点避让完成:</label> |
| | | <div class="form-input"> |
| | | <input id="goHpAvoidFinish" name="goHpAvoidFinish" class="layui-input" autocomplete="off" readonly> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">去反原点避让完成:</label> |
| | | <div class="form-input"> |
| | | <input id="goOHpAvoidFinish" name="goOHpAvoidFinish" class="layui-input" autocomplete="off" readonly> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">去原点避让完成:</label> |
| | | <div class="form-input"> |
| | | <input id="goHpAvoidErr" name="goHpAvoidErr" class="layui-input" autocomplete="off" readonly> |
| | | </div> |
| | | </div> |
| | | <div class="form-item"> |
| | | <label class="form-label">去反原点避让完成:</label> |
| | | <div class="form-input"> |
| | | <input id="goOHpAvoidErr" name="goOHpAvoidErr" class="layui-input" autocomplete="off" readonly> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div style="float:left;margin: 10px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style:dotted"> |
| | | <div class="form-item" style="text-align: center"> |
| | | <label>状态信息</label> |
| | | </div> |
| | | <!-- <div class="form-item">--> |
| | | <!-- <label class="form-label">联机模式:</label>--> |
| | | <!-- <div class="form-input">--> |
| | | <!-- <input id="autoMode" name="autoMode" class="layui-input" autocomplete="off" readonly>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <!-- <div class="form-item">--> |
| | | <!-- <label class="form-label">电压过低:</label>--> |
| | | <!-- <div class="form-input">--> |
| | | <!-- <input id="voltageLow" name="voltageLow" class="layui-input" autocomplete="off" readonly>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <div 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="pakMk" name="pakMk" type="text" class="layui-input" autocomplete="off"> |
| | | </div> |
| | | </div> |
| | | <div class="form-item form-button-container"> |
| | | <button class="form-button" id="save">保存</button> |
| | | <button class="form-button" id="cancel" style="background-color: #D0D0D0">取消</button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </body> |
| | | </html> |
| | | <script> |
| | |
| | | var shuttleMsgTableFullRows = 0; |
| | | // 初始化 |
| | | var shuttleOutputDom = document.getElementById("shuttle-output"); |
| | | |
| | | var ws = new WebSocket("ws://" + window.location.host + baseUrl + "/shuttle/websocket"); |
| | | |
| | | //当WebSocket创建成功时,触发onopen事件 |
| | | ws.onopen = function(){ |
| | | console.log("open"); |
| | | } |
| | | |
| | | //当客户端收到服务端发来的消息时,触发onmessage事件 |
| | | ws.onmessage = function(e){ |
| | | const result = JSON.parse(e.data); |
| | | if (result.url == "/shuttle/table/shuttle/state") { |
| | | setShuttleStateInfo(JSON.parse(result.data)) |
| | | setShuttleMsgInfo(JSON.parse(result.data)) |
| | | }else if (result.url == "/shuttle/output/shuttle") { |
| | | setShuttleOutput(JSON.parse(result.data)) |
| | | } |
| | | // console.log(e.data,result); |
| | | } |
| | | |
| | | //当客户端收到服务端发送的关闭连接请求时,触发onclose事件 |
| | | ws.onclose = function(e){ |
| | | console.log("close"); |
| | | } |
| | | |
| | | //如果出现连接、处理、接收、发送数据失败的时候触发onerror事件 |
| | | ws.onerror = function(e) { |
| | | console.log(e); |
| | | } |
| | | |
| | | $(document).ready(function() { |
| | | initShuttleStateTable(); |
| | | getShuttleStateInfo(); |
| | | initShuttleMsgTable(); |
| | | getShuttleMsgInfo(); |
| | | operatorBlockShow(); |
| | | setShuttleRadio(); |
| | | }); |
| | | |
| | | setInterval(function () { |
| | | getShuttleStateInfo() |
| | | getShuttleMsgInfo(); |
| | | getShuttleStateInfo(); |
| | | },1000) |
| | | setInterval(function () { |
| | | getShuttleOutput(); |
| | |
| | | } |
| | | } |
| | | |
| | | var layerIdx; |
| | | $(document).on('click ','.pos-btn', function () { |
| | | let shuttleNo = Number($(this).parent().attr("data-shuttleNo")); |
| | | layerIdx = layer.open({ |
| | | type: 1, |
| | | title: false, |
| | | shadeClose: true, |
| | | offset: [$(this).offset().top + 30 + 'px', $(this).offset().left + 'px'], |
| | | anim: 5, |
| | | shade: [0], |
| | | area: ['310px', '370px'], |
| | | closeBtn: 0, |
| | | content: $("#shuttle-detl"), |
| | | success: function(layero, index){ |
| | | http.get(baseUrl+ "/shuttle/detl/"+shuttleNo, null, function (res) { |
| | | $('#shuttleNo').val(shuttleNo); |
| | | $('#workNo').val(res.data.workNo); |
| | | $('#row').val(res.data.row); |
| | | $('#bay').val(res.data.bay); |
| | | $('#lev').val(res.data.lev); |
| | | $('#crnNo').val(res.data.crnNo); |
| | | $('#pakMk').val(res.data.pakMk); |
| | | }) |
| | | }, |
| | | end: function () { |
| | | $('#shuttleNo').val(""); |
| | | $('#workNo').val(""); |
| | | $('#row').val(""); |
| | | $('#bay').val(""); |
| | | $('#lev').val(""); |
| | | $('#crnNo').val(""); |
| | | $('#pakMk').val(""); |
| | | } |
| | | }) |
| | | }) |
| | | |
| | | var layerIdx0; |
| | | $(document).on('click ','.mode-btn', function () { |
| | | let shuttleNo = Number($(this).parent().attr("data-shuttleNo")); |
| | | layerIdx0 = layer.open({ |
| | | type: 1, |
| | | title: false, |
| | | shadeClose: true, |
| | | offset: [$(this).offset().top + 30 + 'px', $(this).offset().left + 'px'], |
| | | anim: 5, |
| | | shade: [0], |
| | | area: ['70%', '85%'], |
| | | closeBtn: 0, |
| | | content: $("#shuttle-detl2"), |
| | | success: function(layero, index){ |
| | | console.log(shuttleNo) |
| | | http.get(baseUrl+ "/shuttle/sensor/detl/"+shuttleNo, null, function (res) { |
| | | $('#shuttleNo1').val(res.data.shuttleNo); |
| | | // getColor(res.data.liftErr,'#liftErr'); |
| | | // getColor(res.data.inFetchErr,'#inFetchErr'); |
| | | // getColor(res.data.outFetchErr,'#outFetchErr'); |
| | | // getColor(res.data.antiErr,'#antiErr'); |
| | | // getColor(res.data.liftSwitchErr,'#liftSwitchErr'); |
| | | // getColor(res.data.trackErr,'#trackErr'); |
| | | // getColor(res.data.timeoutErr,'#timeoutErr'); |
| | | // getColor(res.data.connectErr,'#connectErr'); |
| | | // getColor(res.data.emergencyErr,'#emergencyErr'); |
| | | // getColor(res.data.taskTypeErr,'#taskTypeErr'); |
| | | // getColor(res.data.taskNoErr,'#taskNoErr'); |
| | | // getColor(res.data.newTaskErr,'#newTaskErr'); |
| | | // getColor(res.data.errTaskErr,'#errTaskErr'); |
| | | // getColor(res.data.stopErr,'#stopErr'); |
| | | // getColor(res.data.offlineTaskErr,'#offlineTaskErr'); |
| | | // getColor(res.data.startTaskErr,'#startTaskErr'); |
| | | // getColor(res.data.voltageTaskErr,'#voltageTaskErr'); |
| | | // getColor(res.data.devpErr,'#devpErr'); |
| | | // getColor(res.data.online,'#online'); |
| | | // getColor(res.data.notOnTrack,'#notOnTrack'); |
| | | // getColor(res.data.lowVoltage,'#lowVoltage'); |
| | | // getColor(res.data.electricityLoss,'#electricityLoss'); |
| | | // getColor(res.data.forcedTravel,'#forcedTravel'); |
| | | // getColor(res.data.demoMode,'#demoMode'); |
| | | // getColor(res.data.brushConnect,'#brushConnect'); |
| | | // getColor(res.data.taskManualForbid,'#taskManualForbid'); |
| | | // getColor(res.data.onlineManualForbid,'#onlineManualForbid'); |
| | | // getColor(res.data.devpEmergency,'#devpEmergency'); |
| | | // getColor(res.data.taskInterrupt,'#taskInterrupt'); |
| | | // getColor(res.data.taskClear,'#taskClear'); |
| | | // getColor(res.data.taskConfirmTimeout,'#taskConfirmTimeout'); |
| | | // getColor(res.data.taskWithCharge,'#taskWithCharge'); |
| | | getColor(res.data.pakInTask,'#pakInTask'); |
| | | getColor(res.data.pakOutTask,'#pakOutTask'); |
| | | getColor(res.data.pakMoveTask,'#pakMoveTask'); |
| | | getColor(res.data.goHpTask,'#goHpTask'); |
| | | getColor(res.data.goOHpTask,'#goOHpTask'); |
| | | getColor(res.data.goHpAvoid,'#goHpAvoid'); |
| | | getColor(res.data.goOHpAvoid,'#goOHpAvoid'); |
| | | getColor(res.data.pakInEmpty,'#pakInEmpty'); |
| | | getColor(res.data.pakInFinish,'#pakInFinish'); |
| | | getColor(res.data.pakOutEmpty,'#pakOutEmpty'); |
| | | getColor(res.data.pakOutFinish,'#pakOutFinish'); |
| | | getColor(res.data.goHpAvoidFinish,'#goHpAvoidFinish'); |
| | | getColor(res.data.goOHpAvoidFinish,'#goOHpAvoidFinish'); |
| | | getColor(res.data.goHpAvoidErr,'#goHpAvoidErr'); |
| | | getColor(res.data.goOHpAvoidErr,'#goOHpAvoidErr'); |
| | | // getColor(res.data.autoMode,'#autoMode'); |
| | | // getColor(res.data.voltageLow,'#voltageLow'); |
| | | }) |
| | | }, |
| | | end: function () { |
| | | $('#shuttleNo').val(""); |
| | | } |
| | | }) |
| | | }) |
| | | |
| | | function getColor(res,e){ |
| | | $(e).val(res?"✔":"—"); |
| | | if (res){ |
| | |
| | | } |
| | | } |
| | | |
| | | // $(document).on('click ','.mode-btn', function () { |
| | | // let shuttleNo = Number($(this).parent().attr("data-shuttleNo")); |
| | | // layer.confirm("改变" + shuttleNo + ' 号穿梭车在线状态吗?', function(){ |
| | | // var index = layer.load(1, { |
| | | // shade: [0.1,'#fff'] |
| | | // }); |
| | | // $.ajax({ |
| | | // url: baseUrl+ "/shuttle/mode/switch", |
| | | // headers: {'token': localStorage.getItem('token')}, |
| | | // data: { |
| | | // shuttleNo: Number(shuttleNo), |
| | | // password: 'root' |
| | | // }, |
| | | // method: 'POST', |
| | | // success: function (res) { |
| | | // layer.close(index); |
| | | // if (res.code === 200){ |
| | | // layer.msg(res.msg, {icon: 1}); |
| | | // } else if (res.code === 403){ |
| | | // window.location.href = baseUrl+"/login"; |
| | | // } else { |
| | | // layer.msg(res.msg, {icon: 2}); |
| | | // } |
| | | // } |
| | | // }); |
| | | // }); |
| | | // }) |
| | | |
| | | |
| | | |
| | | $(document).on('click ','#save', function () { |
| | | http.post(baseUrl+ "/shuttle/detl/update", { |
| | | shuttleNo: $('#shuttleNo').val(), |
| | | workNo: $('#workNo').val(), |
| | | row: $('#row').val(), |
| | | bay: $('#bay').val(), |
| | | lev: $('#lev').val(), |
| | | crnNo: $('#crnNo').val(), |
| | | pakMk: $('#pakMk').val(), |
| | | }, function (res) { |
| | | layer.msg("修改成功", {icon: 1,}); |
| | | layer.close(layerIdx); |
| | | layer.close(layerDetl); |
| | | }) |
| | | }) |
| | | |
| | | $(document).on('click ','#cancel', function () { |
| | | layer.close(layerIdx); |
| | | }) |
| | | |
| | | function setShuttleRadio() { |
| | |
| | | //渲染四向穿梭车数据维护和设备信息html |
| | | let shuttleCommandLogBox = '<div class="shuttle-command-item" data-shuttleNo="' + table[i - 1].shuttleNo + '">\n' + |
| | | '<label>' + table[i - 1].shuttleNo + '#</label>\n' + |
| | | '<button class="demoBtn pos-btn">数据维护</button>\n' + |
| | | '<button class="demoBtn mode-btn" id="mode-' + table[i - 1].shuttleNo + '">设备信息</button>\n' + |
| | | // '<button class="demoBtn pos-btn">数据维护</button>\n' + |
| | | // '<button class="demoBtn mode-btn" id="mode-' + table[i - 1].shuttleNo + '">设备信息</button>\n' + |
| | | '</div>' |
| | | $("#commandLogId").append(shuttleCommandLogBox); |
| | | } |
| | |
| | | |
| | | // 四向穿梭车信息表获取 ---- 表一 |
| | | function getShuttleStateInfo() { |
| | | sendWs(JSON.stringify({ |
| | | "url": "/shuttle/table/shuttle/state", |
| | | "data": {} |
| | | })) |
| | | } |
| | | |
| | | // 四向穿梭车信息表设置 ---- 表一 |
| | | function setShuttleStateInfo(res) { |
| | | let tableEl = $('#shuttle-state-table'); |
| | | $.ajax({ |
| | | url: baseUrl+ "/shuttle/table/shuttle/state", |
| | | headers: {'token': localStorage.getItem('token')}, |
| | | method: 'POST', |
| | | success: function (res) { |
| | | if (res.code === 200){ |
| | | let table = res.data; |
| | | if (table.length > shuttleStateTableBlankRows && table.length !== shuttleStateTableFullRows) { |
| | | initShuttleStateTable(table.length-shuttleStateTableBlankRows); |
| | | shuttleStateTableFullRows = table.length; |
| | | } |
| | | for (let i=1;i<=table.length;i++){ |
| | | // $("#mode-"+table[i-1].shuttleNo).html(table[i-1].statusVal===0?'联机':'脱机'); |
| | | let tr = tableEl.find("tr").eq(i); |
| | | setVal(tr.children("td").eq(0), table[i-1].shuttleNo); |
| | | setVal(tr.children("td").eq(1), table[i-1].status); |
| | | setVal(tr.children("td").eq(2), table[i-1].status); |
| | | setVal(tr.children("td").eq(3), table[i-1].loading); |
| | | setVal(tr.children("td").eq(4), table[i-1].track); |
| | | setVal(tr.children("td").eq(5), table[i-1].batteryPower); |
| | | setVal(tr.children("td").eq(6), table[i-1].row); |
| | | setVal(tr.children("td").eq(7), table[i-1].bay); |
| | | setVal(tr.children("td").eq(8), table[i-1].lev); |
| | | setVal(tr.children("td").eq(9), table[i-1].waiting); |
| | | setVal(tr.children("td").eq(10), table[i-1].loca); |
| | | setVal(tr.children("td").eq(11), table[i-1].chargeStatus); |
| | | setVal(tr.children("td").eq(12), table[i-1].alarm1); |
| | | setVal(tr.children("td").eq(13), table[i-1].alarm2); |
| | | } |
| | | } else if (res.code === 403){ |
| | | window.location.href = baseUrl+"/login"; |
| | | } else { |
| | | console.log(res.msg); |
| | | } |
| | | if (res.code === 200){ |
| | | let table = res.data; |
| | | if (table.length > shuttleStateTableBlankRows && table.length !== shuttleStateTableFullRows) { |
| | | initShuttleStateTable(table.length-shuttleStateTableBlankRows); |
| | | shuttleStateTableFullRows = table.length; |
| | | } |
| | | }); |
| | | for (let i=1;i<=table.length;i++){ |
| | | // $("#mode-"+table[i-1].shuttleNo).html(table[i-1].statusVal===0?'联机':'脱机'); |
| | | let tr = tableEl.find("tr").eq(i); |
| | | let suspendState; |
| | | if (table[i - 1]['extend'] != undefined) { |
| | | suspendState = table[i-1]['extend'].suspendState |
| | | } |
| | | |
| | | setVal(tr.children("td").eq(0), table[i-1].shuttleNo); |
| | | setVal(tr.children("td").eq(1), table[i-1].protocolStatus$); |
| | | setVal(tr.children("td").eq(2), table[i-1].deviceStatus$); |
| | | setVal(tr.children("td").eq(3), table[i-1].mode$); |
| | | setVal(tr.children("td").eq(4), table[i-1].currentLocNo); |
| | | setVal(tr.children("td").eq(5), table[i-1].currentCode); |
| | | setVal(tr.children("td").eq(6), table[i-1].batteryPower); |
| | | setVal(tr.children("td").eq(7), table[i-1].speed); |
| | | setVal(tr.children("td").eq(8), table[i-1].hasPallet$); |
| | | setVal(tr.children("td").eq(9), table[i-1].hasLift$); |
| | | setVal(tr.children("td").eq(10), table[i-1].hasCharge$); |
| | | setVal(tr.children("td").eq(11), table[i-1].statusErrorCode$); |
| | | setVal(tr.children("td").eq(12), suspendState); |
| | | setVal(tr.children("td").eq(13), table[i-1].lowerPower); |
| | | setVal(tr.children("td").eq(14), table[i-1].demo$); |
| | | } |
| | | } else if (res.code === 403){ |
| | | window.location.href = baseUrl+"/login"; |
| | | } else { |
| | | console.log(res.msg); |
| | | } |
| | | } |
| | | |
| | | // 四向穿梭车数据表获取 ---- 表二 |
| | | function getShuttleMsgInfo() { |
| | | function setShuttleMsgInfo(res) { |
| | | let tableEl = $('#shuttle-msg-table'); |
| | | $.ajax({ |
| | | url: baseUrl+ "/shuttle/table/shuttle/msg", |
| | | headers: {'token': localStorage.getItem('token')}, |
| | | method: 'POST', |
| | | success: function (res) { |
| | | if (res.code === 200){ |
| | | var table = res.data; |
| | | if (table.length > shuttleMsgTableBlankRows && table.length !== shuttleMsgTableFullRows) { |
| | | initShuttleMsgTable(table.length-shuttleMsgTableBlankRows); |
| | | shuttleMsgTableFullRows = table.length; |
| | | } |
| | | for (var i=1;i<=table.length;i++){ |
| | | var tr = tableEl.find("tr").eq(i); |
| | | setVal(tr.children("td").eq(0), table[i-1].shuttleNo); |
| | | setVal(tr.children("td").eq(1), table[i-1].workNo); |
| | | setVal(tr.children("td").eq(2), table[i-1].status); |
| | | setVal(tr.children("td").eq(3), table[i-1].sourceStaNo); |
| | | setVal(tr.children("td").eq(4), table[i-1].staNo); |
| | | setVal(tr.children("td").eq(5), table[i-1].sourceLocNo); |
| | | setVal(tr.children("td").eq(6), table[i-1].locNo); |
| | | setVal(tr.children("td").eq(7), table[i-1].speed); |
| | | setVal(tr.children("td").eq(8), table[i-1].pakMk); |
| | | } |
| | | } else if (res.code === 403){ |
| | | window.location.href = baseUrl+"/login"; |
| | | } else { |
| | | console.log(res.msg); |
| | | } |
| | | if (res.code === 200){ |
| | | var table = res.data; |
| | | if (table.length > shuttleMsgTableBlankRows && table.length !== shuttleMsgTableFullRows) { |
| | | initShuttleMsgTable(table.length-shuttleMsgTableBlankRows); |
| | | shuttleMsgTableFullRows = table.length; |
| | | } |
| | | }); |
| | | for (var i=1;i<=table.length;i++){ |
| | | var tr = tableEl.find("tr").eq(i); |
| | | let maxCellVoltage; |
| | | let minCellVoltage; |
| | | let voltage; |
| | | let chargeCycleTimes; |
| | | let surplusQuantity; |
| | | let countQuantity; |
| | | if (table[i - 1]['extend'] != undefined) { |
| | | maxCellVoltage = table[i-1]['extend'].maxCellVoltage |
| | | minCellVoltage = table[i-1]['extend'].minCellVoltage |
| | | voltage = table[i-1]['extend'].voltage |
| | | chargeCycleTimes = table[i-1]['extend'].chargeCycleTimes |
| | | surplusQuantity = table[i-1]['extend'].surplusQuantity |
| | | countQuantity = table[i-1]['extend'].countQuantity |
| | | } |
| | | |
| | | setVal(tr.children("td").eq(0), table[i-1].shuttleNo); |
| | | setVal(tr.children("td").eq(1), table[i-1].taskNo); |
| | | setVal(tr.children("td").eq(2), table[i-1].sourceLocNo); |
| | | setVal(tr.children("td").eq(3), table[i-1].locNo); |
| | | setVal(tr.children("td").eq(4), voltage); |
| | | setVal(tr.children("td").eq(5), surplusQuantity); |
| | | setVal(tr.children("td").eq(6), countQuantity); |
| | | setVal(tr.children("td").eq(7), table[i-1].pakMk$); |
| | | } |
| | | } else if (res.code === 403){ |
| | | window.location.href = baseUrl+"/login"; |
| | | } else { |
| | | console.log(res.msg); |
| | | } |
| | | } |
| | | |
| | | // 穿梭车日志输出 ----------------------------------------------------------------------- |
| | | function getShuttleOutput() { |
| | | sendWs(JSON.stringify({ |
| | | "url": "/shuttle/output/shuttle", |
| | | "data": {} |
| | | })) |
| | | } |
| | | |
| | | function setShuttleOutput(res) { |
| | | if (res.code === 200) { |
| | | shuttleOutput(res.data); |
| | | } else if (res.code === 403) { |
| | | window.location.href = baseUrl + "/login"; |
| | | } else { |
| | | console.log(res.msg); |
| | | } |
| | | } |
| | | |
| | | // 任务指令下发 |
| | | function shuttleOperator(shuttleTaskMode) { |
| | | http.post(baseUrl+"/shuttle/operator/shuttle", { |
| | | shuttleNo: $('input[name="shuttleSelect"]:checked').val(), |
| | | shuttleTaskMode: shuttleTaskMode, |
| | | sourceLocNo: $("#sourceLocNo").val(), |
| | | distLocNo: $("#distLocNo").val() |
| | | }, function (res) { |
| | | layer.msg(res.msg, {icon: 1}); |
| | | }); |
| | | } |
| | | |
| | | // 跑库 |
| | | function moveLoc() { |
| | | $.ajax({ |
| | | url: baseUrl + "/shuttle/output/shuttle", |
| | | url: baseUrl + "/shuttle/moveLoc", |
| | | headers: {'token': localStorage.getItem('token')}, |
| | | method: 'POST', |
| | | data: { |
| | | shuttleNo: $('input[name="shuttleSelect"]:checked').val(), |
| | | xStart: $("#xStart").val(), |
| | | xTarget: $("#xTarget").val(), |
| | | yStart: $("#yStart").val(), |
| | | yTarget: $("#yTarget").val(), |
| | | moveType: $('input[name="moveType"]:checked').val() |
| | | }, |
| | | success: function (res) { |
| | | if (res.code === 200) { |
| | | shuttleOutput(res.data); |
| | | layer.msg(res.msg, {icon: 1}); |
| | | } else if (res.code === 403) { |
| | | window.location.href = baseUrl + "/login"; |
| | | } else { |
| | |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // 任务指令下发 |
| | | function shuttleOperator(shuttleTaskMode) { |
| | | http.post(baseUrl+"/shuttle/operator/shuttle", { |
| | | shuttleNo: $('input[name="shuttleSelect"]:checked').val(), |
| | | shuttleTaskMode: shuttleTaskMode |
| | | }, function (res) { |
| | | layer.msg(res.msg, {icon: 1}); |
| | | }); |
| | | } |
| | | |
| | | |
| | |
| | | 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" + |
| | |
| | | shuttleOutputDom.scrollTop = shuttleOutputDom.scrollHeight; |
| | | } |
| | | |
| | | //四向穿梭车配置参数保存 |
| | | function shuttleParamSave() { |
| | | $.ajax({ |
| | | url: baseUrl+ "/shuttle/runSpeed/" + $('input[name="shuttleSelect"]:checked').val(), |
| | | headers: {'token': localStorage.getItem('token')}, |
| | | method: 'POST', |
| | | data: { |
| | | runSpeed: $("#runSpeed").val(), |
| | | chargeLine: $("#chargeLine").val(), |
| | | }, |
| | | success: function (res) { |
| | | if (res.code === 200){ |
| | | layer.msg("配置已保存", {icon: 1,}); |
| | | } else if (res.code === 403){ |
| | | window.location.href = baseUrl+"/login"; |
| | | } else { |
| | | console.log(res.msg); |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | |
| | | // 详情操作 ------------------------------------------------------------------------- |
| | | var layerDetl; |
| | | $(document).on('dblclick ','#shuttle-msg-table tr', function () { |
| | | var shuttleNo = $(this).children("td").eq(0).html(); |
| | | if (shuttleNo !== null && shuttleNo !== "") { |
| | | layerDetl = layer.open({ |
| | | type: 1, |
| | | title: false, |
| | | shadeClose: true, |
| | | offset: 'rt', |
| | | anim: 5, |
| | | shade: [0], |
| | | area: ['340px', '255px'], |
| | | closeBtn: 0, |
| | | content: $("#shuttle-detl"), |
| | | success: function(layero, index){ |
| | | $.ajax({ |
| | | url: baseUrl+ "/shuttle/table/shuttle/state", |
| | | headers: {'token': localStorage.getItem('token')}, |
| | | method: 'POST', |
| | | success: function (res) { |
| | | if (res.code === 200){ |
| | | var table = res.data; |
| | | for (var i=1;i<=table.length;i++){ |
| | | if (shuttleNo == table[i-1].shuttleNo) { |
| | | $('#shuttleNo').val(shuttleNo); |
| | | $('#workNo').val(table[i-1].taskNo); |
| | | $('#pakMk').val(table[i-1].pakMk$); |
| | | $('#token').val(table[i-1].token); |
| | | } |
| | | } |
| | | } else if (res.code === 403){ |
| | | window.location.href = baseUrl+"/login"; |
| | | } else { |
| | | console.log(res.msg); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | end: function () { |
| | | $('#shuttleNo').val(""); |
| | | $('#workNo').val(""); |
| | | $('#pakMk').val(""); |
| | | $('#token').val(""); |
| | | } |
| | | }) |
| | | } |
| | | }); |
| | | |
| | | $(document).on('click ','#cancel', function () { |
| | | $('#shuttleNo').val(""); |
| | | $('#workNo').val(""); |
| | | $('#pakMk').val(""); |
| | | $('#token').val(""); |
| | | layer.close(layerDetl); |
| | | }) |
| | | |
| | | function sendWs(message) { |
| | | if (ws.readyState == WebSocket.OPEN) { |
| | | ws.send(message) |
| | | } |
| | | } |
| | | |
| | | </script> |