自动化立体仓库 - WCS系统
Junjie
2023-05-24 38db3a419d0b794b8a2bab98d2fc15d4bb4c8b31
堆垛机调试
2个文件已添加
3个文件已修改
590 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/CrnController.java 104 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/CommandUtils.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/wms/js/crnOperate/crnOperate.js 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/crnOperate/crnOperate.html 259 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/realtimeWatch/crn.html 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/CrnController.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.annotations.ManagerAuth;
import com.core.common.Cools;
import com.core.common.R;
@@ -12,10 +13,7 @@
import com.zy.asrs.domain.vo.CommandLogVo;
import com.zy.asrs.domain.vo.CrnMsgTableVo;
import com.zy.asrs.domain.vo.CrnStateTableVo;
import com.zy.asrs.entity.BasCrnError;
import com.zy.asrs.entity.BasCrnp;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.entity.*;
import com.zy.asrs.mapper.BasCrnErrorMapper;
import com.zy.asrs.service.BasCrnpService;
import com.zy.asrs.service.LocMastService;
@@ -37,10 +35,7 @@
import com.zy.core.properties.SystemProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
@@ -53,7 +48,6 @@
 */
@Slf4j
@RestController
@RequestMapping("/crn")
public class CrnController {
    @Autowired
@@ -71,7 +65,7 @@
    @ManagerAuth(memo = "进行中的命令")
    @PostMapping("/command/ongoing")
    @PostMapping("/crn/command/ongoing")
    public R ongoingCommand(){
        List<CommandLogVo> list = new ArrayList<>();
        for (CrnSlave crn : slaveProperties.getCrn()) {
@@ -97,7 +91,7 @@
        return R.ok().add(list);
    }
    @PostMapping("/table/crn/state")
    @PostMapping("/crn/table/crn/state")
    @ManagerAuth(memo = "堆垛机信息表")
    public R crnStateTable(){
        List<CrnStateTableVo> list = new ArrayList<>();
@@ -135,7 +129,41 @@
        return R.ok().add(list);
    }
    @PostMapping("/table/crn/msg")
    @PostMapping("/crn/table/crn/{id}/state")
    @ManagerAuth(memo = "堆垛机信息表")
    public R crnStateTable(@PathVariable("id") Integer id){
        BasCrnp basCrnp = basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no", id).orderBy("crn_no"));
        // 表格行
        CrnStateTableVo vo = new CrnStateTableVo();
        vo.setCrnNo(basCrnp.getCrnNo());   //  堆垛机号
        // 获取堆垛机信息
        CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
        if (crnThread == null) {
            return R.error();
        }
        CrnProtocol crnProtocol = crnThread.getCrnProtocol();
        if (crnProtocol == null) {
            return R.error();
        }
        vo.setWorkNo(crnProtocol.getTaskNo());  //  任务号
        vo.setStatusType(crnProtocol.modeType.desc);   //  模式状态
        vo.setStatus(crnProtocol.getStatusType().desc);     //  状态
        vo.setLoading((crnProtocol.getLoaded() != null && crnProtocol.getLoaded() == 1) ? "有物" : "无物");  //  有物
        vo.setBay(crnProtocol.getBay());    //  列
        vo.setLev(crnProtocol.getLevel());  //  层
        vo.setForkOffset(crnProtocol.getForkPosType().desc);    // 货叉位置
        vo.setLiftPos(crnProtocol.getLiftPosType().desc);
        vo.setWalkPos(crnProtocol.getWalkPos()==1?"不在定位":"在定位");
        vo.setWarnCode(String.valueOf(crnProtocol.getAlarm1()));
        if (crnProtocol.getAlarm1() > 0) {
            BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm1());
            vo.setAlarm(crnError==null?"未知异常":crnError.getErrName());
        }
        return R.ok().add(vo);
    }
    @PostMapping("/crn/table/crn/msg")
    @ManagerAuth(memo = "堆垛机数据表")
    public R crnMsgTable(){
        List<CrnMsgTableVo> list = new ArrayList<>();
@@ -179,7 +207,7 @@
        return R.ok().add(list);
    }
    @PostMapping("/output/site")
    @PostMapping("/crn/output/site")
    @ManagerAuth(memo = "堆垛机报文日志输出")
    public R crnOutput(){
        StringBuilder str = new StringBuilder();
@@ -193,7 +221,7 @@
    }
    @GetMapping("/demo/status")
    @GetMapping("/crn/demo/status")
    public R demoStatus(){
        List<Map<String, Object>> res = new ArrayList<>();
        for (CrnSlave crnSlave : slaveProperties.getCrn()) {
@@ -206,7 +234,7 @@
    }
    @PostMapping("/demo/switch")
    @PostMapping("/crn/demo/switch")
    @ManagerAuth(memo = "堆垛机演示")
    public R crnDemo(CrnDemoParam param) throws InterruptedException {
        if (Cools.isEmpty(param.getCrnId())){
@@ -235,7 +263,7 @@
    /****************************************************************/
    @ManagerAuth(memo = "入库")
    @PostMapping("/operator/put")
    @PostMapping("/crn/operator/put")
    public R crnPut(CrnOperatorParam param){
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
@@ -252,7 +280,7 @@
    }
    @ManagerAuth(memo = "出库")
    @PostMapping("/operator/take")
    @PostMapping("/crn/operator/take")
    public R crnTake(CrnOperatorParam param){
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
@@ -269,7 +297,7 @@
    }
    @ManagerAuth(memo = "库位转移")
    @PostMapping("/operator/stockMove")
    @PostMapping("/crn/operator/stockMove")
    public R crnStockMove(CrnOperatorParam param){
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
@@ -291,7 +319,7 @@
    }
    @ManagerAuth(memo = "站到站")
    @PostMapping("/operator/siteMove")
    @PostMapping("/crn/operator/siteMove")
    public R crnSiteMove(CrnOperatorParam param){
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
@@ -308,7 +336,7 @@
    }
    @ManagerAuth(memo = "回原点")
    @PostMapping("/operator/bacOrigin")
    @PostMapping("/crn/operator/bacOrigin")
    public R crnBacOrigin(CrnOperatorParam param){
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
@@ -325,7 +353,7 @@
    }
    @ManagerAuth(memo = "反原点")
    @PostMapping("/operator/reverseOrigin")
    @PostMapping("/crn/operator/reverseOrigin")
    public R reverseOrigin(CrnOperatorParam param){
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
@@ -360,7 +388,7 @@
//    }
    @ManagerAuth(memo = "任务完成")
    @PostMapping("/operator/taskComplete")
    @PostMapping("/crn/operator/taskComplete")
    public R crnTaskComplete(CrnOperatorParam param){
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
@@ -389,7 +417,7 @@
//    }
    @ManagerAuth(memo = "清除命令")
    @PostMapping("/operator/clearCommand")
    @PostMapping("/crn/operator/clearCommand")
    public R crnClearCommand(CrnOperatorParam param){
        if (param.getCrnNo() == null) {
            throw new CoolException("请选择堆垛机");
@@ -409,7 +437,7 @@
    }
    @ManagerAuth(memo = "手动复位")
    @PostMapping("/operator/handleReset")
    @PostMapping("/crn/operator/handleReset")
    public R handleReset(CrnOperatorParam param) throws Exception {
        if (param.getCrnNo() == null) {
            throw new CoolException("请选择堆垛机");
@@ -501,5 +529,33 @@
        }
    }
    // /crn/list/auth
    @RequestMapping(value = "/crnListQuery/auth")
    @ManagerAuth
    public R listQuery(String condition){
        ArrayList<HashMap<String, Object>> list = new ArrayList<>();
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            if (crnThread == null) {
                continue;
            }
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) {
                continue;
            }
            HashMap<String, Object> map = new HashMap<>();
            map.put("id", crn.getId());
            map.put("value", "堆垛机" + crn.getId() + "号");
            if (condition != "" && !condition.equals(crn.getId().toString())) {
                continue;
            }
            list.add(map);
        }
        return R.ok().add(list);
    }
}
src/main/java/com/zy/asrs/utils/CommandUtils.java
@@ -30,15 +30,19 @@
        CommandInfo commandInfo = null;
        WrkMast wrkMast = null;
        int taskNo = 0;
        int wmsWrkNo = 0;
        switch (type) {
            case Crn:
                CrnCommand command = (CrnCommand) task.getData();
                taskNo = command.getTaskNo();
                wrkMast = wrkMastService.selectById(taskNo);
                if (taskNo != 0) {
                    wrkMast = wrkMastService.selectById(taskNo);
                    wmsWrkNo = wrkMast.getWmsWrkNo();
                }
                commandInfo = new CommandInfo();
                commandInfo.setWrkNo(taskNo);
                commandInfo.setWmsWrkNo(wrkMast.getWmsWrkNo());
                commandInfo.setWmsWrkNo(wmsWrkNo);
                commandInfo.setCommandStatus(1);
                commandInfo.setStartTime(new Date());
                commandInfo.setDevice("crn");
@@ -50,11 +54,14 @@
            case Devp:
                StaProtocol staProtocol = (StaProtocol) task.getData();
                taskNo = staProtocol.getWorkNo();
                wrkMast = wrkMastService.selectById(taskNo);
                if (taskNo != 0) {
                    wrkMast = wrkMastService.selectById(taskNo);
                    wmsWrkNo = wrkMast.getWmsWrkNo();
                }
                commandInfo = new CommandInfo();
                commandInfo.setWrkNo(taskNo);
                commandInfo.setWmsWrkNo(wrkMast.getWmsWrkNo());
                commandInfo.setWmsWrkNo(wmsWrkNo);
                commandInfo.setCommandStatus(1);
                commandInfo.setStartTime(new Date());
                commandInfo.setDevice("devp");
@@ -67,11 +74,14 @@
                List<LedCommand> data = (List<LedCommand>) task.getData();
                for (LedCommand ledCommand : data) {
                    taskNo = ledCommand.getWorkNo();
                    wrkMast = wrkMastService.selectById(taskNo);
                    if (taskNo != 0) {
                        wrkMast = wrkMastService.selectById(taskNo);
                        wmsWrkNo = wrkMast.getWmsWrkNo();
                    }
                    commandInfo = new CommandInfo();
                    commandInfo.setWrkNo(ledCommand.getWorkNo());
                    commandInfo.setWmsWrkNo(wrkMast.getWmsWrkNo());
                    commandInfo.setWmsWrkNo(wmsWrkNo);
                    commandInfo.setCommandStatus(1);
                    commandInfo.setStartTime(new Date());
                    commandInfo.setDevice("led");
src/main/webapp/static/wms/js/crnOperate/crnOperate.js
New file
@@ -0,0 +1,114 @@
var crnNo;
layui.config({
    base: baseUrl + "/static/wms/layui/lay/modules/"
}).use(['table','laydate', 'form', 'admin'], function(){
});
function connectCrn() {
    var deviceId = $("#deviceId").val()
    if (deviceId == "") {
        layer.msg('请选择堆垛机');
        return false;
    }
    crnNo = deviceId;
    $.ajax({
        url: baseUrl + "/crn/table/crn/" + crnNo + "/state",
        headers: {'token': localStorage.getItem('token')},
        method: 'POST',
        traditional:true,
        success: function (res) {
            if (res.code == 200) {
                layer.msg('连接成功')
                console.log(res)
                let data = res.data
                $("#__crnNo").val(data.crnNo)
                $("#statusType").val(data.statusType)
                $("#status").val(data.status)
                $("#loading").val(data.loading)
                $("#__bay").val(data.bay)
                $("#__lev").val(data.lev)
                $("#forkOffset").val(data.forkOffset)
                $("#liftPos").val(data.liftPos)
                $("#walkPos").val(data.walkPos)
                $("#warnCode").val(data.warnCode)
                $("#alarm").val(data.alarm)
            }else {
                layer.msg(res.msg)
            }
        }
    })
}
// 入库
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 taskComplete() {
    http.post(baseUrl+"/crn/operator/taskComplete", 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 getReqParam() {
    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 {
        crnNo: crnNo,
        sourceStaNo: sourceStaNo,
        sourceRow: sourceRow,
        sourceBay: sourceBay,
        sourceLev: sourceLev,
        staNo: staNo,
        row: row,
        bay: bay,
        lev: lev
    };
}
src/main/webapp/views/crnOperate/crnOperate.html
New file
@@ -0,0 +1,259 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></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, maximum-scale=1">
    <link rel="stylesheet" href="../../static/wms/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/wms/css/admin.css?v=318" media="all">
    <link rel="stylesheet" href="../../static/wms/css/cool.css" media="all">
</head>
<body>
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body" style="padding: 40px;">
            <div class="layui-form toolbar" id="search-box" style="text-align: center;">
                <div class="layui-form-item">
                    <div class="layui-inline">
                        <div class="layui-input-inline cool-auto-complete">
                            <input id="deviceId" class="layui-input" name="deviceId" type="text" placeholder="请输入" autocomplete="off" style="display: none">
                            <input id="deviceId$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="选择堆垛机" onfocus=this.blur()>
                            <div class="cool-auto-complete-window">
                                <input class="cool-auto-complete-window-input" data-key="crnListQueryBydeviceId" onkeyup="autoLoad(this.getAttribute('data-key'))">
                                <select class="cool-auto-complete-window-select" data-key="crnListQueryBydeviceIdSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
                                </select>
                            </div>
                        </div>
                        <button class="layui-btn" onclick="connectCrn()">确认连接</button>
                    </div>
                </div>
            </div>
            <div class="layui-row">
                <div class="layui-col-md6" style="border-right: 1px red solid">
                    <h3 style="text-align: center;">设备调试</h3>
                    <div class="layui-row" style="margin-top: 30px;">
                        <h4>源站/源库位</h4>
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline" style="display: flex;justify-content: center;align-items: center;">
                                    <div>站</div>
                                    <input class="layui-input" id="sourceStaNo" type="number" name="points" placeholder="站" autocomplete="off">
                                </div>
                            </div>
                        </div>
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline" style="display: flex;justify-content: center;align-items: center;">
                                    <div>排</div>
                                    <input class="layui-input" id="sourceRow" type="number" name="points" min="1" style="background-color: #a9eeff" value="1">
                                </div>
                            </div>
                        </div>
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline" style="display: flex;justify-content: center;align-items: center;">
                                    <div>列</div>
                                    <input class="layui-input" id="sourceBay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0">
                                </div>
                            </div>
                        </div>
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline" style="display: flex;justify-content: center;align-items: center;">
                                    <div>层</div>
                                    <input class="layui-input" id="sourceLev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1">
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="layui-row" style="margin-top: 30px;">
                        <h4>目标站/目标库位</h4>
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline" style="display: flex;justify-content: center;align-items: center;">
                                    <div>站</div>
                                    <input class="layui-input" id="staNo" type="number" name="points" min="0" />
                                </div>
                            </div>
                        </div>
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline" style="display: flex;justify-content: center;align-items: center;">
                                    <div>排</div>
                                    <input class="layui-input" id="row" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" />
                                </div>
                            </div>
                        </div>
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline" style="display: flex;justify-content: center;align-items: center;">
                                    <div>列</div>
                                    <input class="layui-input" id="bay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" />
                                </div>
                            </div>
                        </div>
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline" style="display: flex;justify-content: center;align-items: center;">
                                    <div>层</div>
                                    <input class="layui-input" id="lev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" />
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="layui-row" style="margin-top: 30px;">
                        <div class="layui-col-md12" style="display: flex;justify-content: flex-start;">
                            <button class="layui-btn" onclick="put()">入库</button>
                            <button class="layui-btn" onclick="take()">出库</button>
                            <button class="layui-btn" onclick="stockMove()">库位转移</button>
                            <button class="layui-btn" onclick="siteMove()">站到站</button>
                            <button class="layui-btn" onclick="taskComplete()">任务完成</button>
                            <button class="layui-btn" onclick="clearCommand()">清除命令</button>
                            <button class="layui-btn" onclick="handleReset()">复位</button>
                        </div>
                    </div>
                </div>
                <div class="layui-col-md6" style="padding-left: 20px;">
                    <h3 style="text-align: center;">设备状态</h3>
                    <div class="layui-row" style="margin-top: 30px;">
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline">
                                    <div>堆垛机</div>
                                    <input class="layui-input" id="__crnNo" type="text" disabled />
                                </div>
                            </div>
                        </div>
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline">
                                    <div>模式</div>
                                    <input class="layui-input" id="statusType" type="text" disabled />
                                </div>
                            </div>
                        </div>
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline">
                                    <div>状态</div>
                                    <input class="layui-input" id="status" type="text" disabled />
                                </div>
                            </div>
                        </div>
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline">
                                    <div>有物</div>
                                    <input class="layui-input" id="loading" type="text" disabled />
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="layui-row" style="margin-top: 20px;">
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline">
                                    <div>列</div>
                                    <input class="layui-input" id="__bay" type="text" disabled />
                                </div>
                            </div>
                        </div>
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline">
                                    <div>层</div>
                                    <input class="layui-input" id="__lev" type="text" disabled />
                                </div>
                            </div>
                        </div>
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline">
                                    <div>货叉定位</div>
                                    <input class="layui-input" id="forkOffset" type="text" disabled />
                                </div>
                            </div>
                        </div>
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline">
                                    <div>载货台定位</div>
                                    <input class="layui-input" id="liftPos" type="text" disabled />
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="layui-row" style="margin-top: 20px;">
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline">
                                    <div>走行在定位</div>
                                    <input class="layui-input" id="walkPos" type="text" disabled />
                                </div>
                            </div>
                        </div>
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline">
                                    <div>故障代码</div>
                                    <input class="layui-input" id="warnCode" type="text" disabled />
                                </div>
                            </div>
                        </div>
                        <div class="layui-col-md3">
                            <div class="layui-inline">
                                <div class="layui-input-inline">
                                    <div>故障描述</div>
                                    <input class="layui-input" id="alarm" type="text" disabled />
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<script type="text/javascript" src="../../static/wms/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/wms/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/wms/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/wms/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/wms/js/crnOperate/crnOperate.js" charset="utf-8"></script>
</body>
</html>
src/main/webapp/views/realtimeWatch/crn.html
@@ -114,97 +114,6 @@
                </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">
                <!-- 堆垛机选择 -->
                <div id="crn-select" class="operator-item">
                    <span class="select-title">堆垛机号</span>
                    <div class="select-container">
                        <label><input type="radio" name="crnSelect" value="1" checked>&nbsp;1号堆垛机</label>
                        <label><input type="radio" name="crnSelect" value="2">&nbsp;2号堆垛机</label>
                        <label><input type="radio" name="crnSelect" value="3">&nbsp;3号堆垛机</label>
                        <label><input type="radio" name="crnSelect" value="4">&nbsp;4号堆垛机</label>
                        <label><input type="radio" name="crnSelect" value="5">&nbsp;5号堆垛机</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>
                <!-- 目标站/目标库位 选择 -->
                <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>
            <!-- 设备任务操作 -->
            <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>
                        <!--                <button class="item" onclick="bacOrigin()">回原点</button>-->
                        <!--                <button class="item" onclick="reverseOrigin()">反原点</button>-->
                        <!--                <button class="item" onclick="coorMove()">坐标移行</button>-->
                        <button class="item" onclick="taskComplete()">任务完成</button>
                        <!--                <button class="item" onclick="pause()">暂停</button>-->
                        <!--                <button class="item" onclick="boot()">启动</button>-->
                        <button class="item" onclick="clearCommand()">清除命令</button>
                        <button class="item" onclick="handleReset()">复位</button>
                    </div>
                </fieldset>
            </div>
        </div>
        <!-- 堆垛机日志输出 -->
        <div class="crn-output-board">
            <textarea id="crn-output"></textarea>