src/main/java/com/zy/asrs/controller/CrnController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/utils/CommandUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/static/wms/js/crnOperate/crnOperate.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/views/crnOperate/crnOperate.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/views/realtimeWatch/crn.html | ●●●●● 补丁 | 查看 | 原始文档 | 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> 1号堆垛机</label> <label><input type="radio" name="crnSelect" value="2"> 2号堆垛机</label> <label><input type="radio" name="crnSelect" value="3"> 3号堆垛机</label> <label><input type="radio" name="crnSelect" value="4"> 4号堆垛机</label> <label><input type="radio" name="crnSelect" value="5"> 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>