src/main/java/com/zy/asrs/controller/RgvController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/domain/enums/RgvStatusType.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/domain/param/RgvOperatorParam.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/domain/vo/RgvMsgTableVo.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/entity/BasRgvErr.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/system/entity/license/CustomLicenseManager.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application-prod.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/views/deviceOperate/rgvOperate.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/controller/RgvController.java
New file @@ -0,0 +1,325 @@ package com.zy.asrs.controller; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.annotations.ManagerAuth; import com.core.common.R; import com.core.exception.CoolException; import com.zy.asrs.domain.enums.RgvStatusType; import com.zy.asrs.domain.param.RgvOperatorParam; import com.zy.asrs.domain.vo.RgvMsgTableVo; import com.zy.asrs.domain.vo.RgvStateTableVo; import com.zy.asrs.entity.BasRgv; import com.zy.asrs.entity.BasRgvErr; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.mapper.BasRgvErrMapper; import com.zy.asrs.service.BasRgvService; import com.zy.asrs.service.LocMastService; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.service.impl.MainServiceImpl; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.RgvModeType; import com.zy.core.enums.RgvTaskModeType; import com.zy.core.enums.SlaveType; import com.zy.core.model.RgvSlave; import com.zy.core.model.Task; import com.zy.core.model.command.RgvCommand; import com.zy.core.model.protocol.RgvProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.thread.SiemensRgvThread; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; /** * RGV接口 * Created by vincent on 2020-06-01 */ @Slf4j @RestController @RequestMapping("/rgv") public class RgvController { @Autowired private SlaveProperties slaveProperties; @Autowired private WrkMastService wrkMastService; @Autowired private BasRgvErrMapper basRgvErrMapper; @Autowired private BasRgvService basRgvService; @Autowired private MainServiceImpl mainService; @Autowired private LocMastService locMastService; @PostMapping("/table/rgv/state") @ManagerAuth(memo = "RGV信息表") public R rgvStateTable(){ List<RgvStateTableVo> list = new ArrayList<>(); List<BasRgv> rgvs = basRgvService.selectList(new EntityWrapper<BasRgv>().orderBy("rgv_no")); for (BasRgv basRgv : rgvs) { // 表格行 RgvStateTableVo vo = new RgvStateTableVo(); vo.setRgvNo(basRgv.getRgvNo()); // RGV号 list.add(vo); // 获取RGV信息 SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, basRgv.getRgvNo()); if (rgvThread == null) { continue; } RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { continue; } vo.setStatusType(rgvProtocol.modeType.desc); // 模式状态 vo.setStatus(rgvProtocol.getStatusType().desc); // 状态 vo.setWorkNo1(rgvProtocol.getTaskNo1()); // 工位1任务号 vo.setStatus1(rgvProtocol.getStatusType1().desc); // 工位1状态 vo.setLoading1(rgvProtocol.getLoaded1()==1?"有物":"无物"); // 工位1有物 vo.setRgvPos(rgvProtocol.getRgvPos()); vo.setRgvPos1(rgvProtocol.getRgvPosI()); vo.setWalkPos(rgvProtocol.getWalkPos()==1?"在定位":"不在定位"); vo.setPakMk(rgvThread.isPakMk()?"无锁":"锁定"); // vo.setWorkNo2(rgvProtocol.getTaskNo2()); // 工位2任务号 // vo.setStatus2(rgvProtocol.getStatusType2().desc); // 工位2状态 // vo.setLoading2(rgvProtocol.getLoaded2()==1?"有物":"无物"); // 工位2有物 vo.setWarnCode(String.valueOf(rgvProtocol.getAlarm())); if (rgvProtocol.getAlarm() > 0) { BasRgvErr rgvErr = basRgvErrMapper.selectById(rgvProtocol.getAlarm()); vo.setAlarm(rgvErr==null?"未知异常":rgvErr.getErrName()); } } return R.ok().add(list); } @PostMapping("/table/rgv/msg") @ManagerAuth(memo = "RGV数据表") public R rgvMsgTable(){ List<RgvMsgTableVo> list = new ArrayList<>(); List<BasRgv> rgvs = basRgvService.selectList(new EntityWrapper<BasRgv>().orderBy("rgv_no")); for (BasRgv basRgv : rgvs) { // 表格行 RgvMsgTableVo vo = new RgvMsgTableVo(); vo.setRgvNo(basRgv.getRgvNo()); // RGV号 list.add(vo); // 获取RGV信息 SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, basRgv.getRgvNo()); if (rgvThread == null) { continue; } RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { continue; } vo.setWorkNo(rgvProtocol.getTaskNo1()); // 任务号 if (rgvProtocol.getTaskNo1()>0) { WrkMast wrkMast = wrkMastService.selectById(rgvProtocol.getTaskNo1()); if (wrkMast != null) { vo.setStatus(RgvStatusType.process(wrkMast.getIoType()).getDesc()); // 模式状态 vo.setSourceStaNo(wrkMast.getSourceStaNo$()); // 源站 vo.setStaNo(wrkMast.getStaNo$()); // 目标站 vo.setSourceLocNo(wrkMast.getSourceLocNo()); // 源库位 vo.setLocNo(wrkMast.getLocNo()); // 目标库位 } } else { vo.setStatus(rgvProtocol.modeType.equals(RgvModeType.AUTO)? rgvProtocol.modeType.desc: RgvModeType.HAND.desc); // 模式状态 } vo.setXspeed(rgvProtocol.getXSpeed()); // 走行速度(m/min) vo.setXdistance(rgvProtocol.getXDistance()); // 走行距离(Km) vo.setXduration(rgvProtocol.getXDuration()); // 走行时长(H) } return R.ok().add(list); } @PostMapping("/output/site") @ManagerAuth(memo = "RGV报文日志输出") public R rgvOutput(){ StringBuilder str = new StringBuilder(); String s; int i = 0; while((s = OutputQueue.RGV.poll()) != null && i <=10) { str.append("\n").append(s); i++; } return R.ok().add(str.toString()); } /****************************************************************/ /************************** 手动操作 ******************************/ /****************************************************************/ @ManagerAuth(memo = "取放货") @PostMapping("/operator/put") public R rgvFetchPut(RgvOperatorParam param){ RgvCommand command = new RgvCommand(); command.setRgvNo(param.getRgvNo()); // RGV编号 command.setAckFinish1((short) 0); // 任务完成确认位 command.setTaskNo1((short) 0); // 工作号 command.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货 command.setSourceStaNo1(param.getSourceStaNo1()); // 源站 command.setDestinationStaNo1(param.getStaNo1()); // 目标站 // command.setAckFinish2((short) 0); // 任务完成确认位 // command.setTaskNo2((short) 0); // 工作号 // command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货 // command.setSourceStaNo2(param.getSourceStaNo2()); // 源站 // command.setDestinationStaNo2(param.getStaNo2()); // 目标站 command.setCommand((short) 0); return rgvControl(command)? R.ok(): R.error(); } @ManagerAuth(memo = "取货") @PostMapping("/operator/take") public R rgvFetch(RgvOperatorParam param){ RgvCommand command = new RgvCommand(); command.setRgvNo(param.getRgvNo()); // RGV编号 command.setAckFinish1((short) 0); // 任务完成确认位 command.setTaskNo1((short) 0); // 工作号 command.setTaskMode1(RgvTaskModeType.FETCH); // 任务模式: 取货 command.setSourceStaNo1(param.getSourceStaNo1()); // 源站 command.setDestinationStaNo1(param.getStaNo1()); // 目标站 command.setAckFinish2((short) 0); // 任务完成确认位 command.setTaskNo2((short) 0); // 工作号 command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货 command.setSourceStaNo2(param.getSourceStaNo2()); // 源站 command.setDestinationStaNo2(param.getStaNo2()); // 目标站 command.setCommand((short) 0); return rgvControl(command)? R.ok(): R.error(); } @ManagerAuth(memo = "放货") @PostMapping("/operator/stockMove") public R rgvPut(RgvOperatorParam param){ RgvCommand command = new RgvCommand(); command.setRgvNo(param.getRgvNo()); // RGV编号 command.setAckFinish1((short) 0); // 任务完成确认位 command.setTaskNo1((short) 0); // 工作号 command.setTaskMode1(RgvTaskModeType.PUT); // 任务模式: 放货 command.setSourceStaNo1(param.getSourceStaNo1()); // 源站 command.setDestinationStaNo1(param.getStaNo1()); // 目标站 command.setAckFinish2((short) 0); // 任务完成确认位 command.setTaskNo2((short) 0); // 工作号 command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货 command.setSourceStaNo2(param.getSourceStaNo2()); // 源站 command.setDestinationStaNo2(param.getStaNo2()); // 目标站 command.setCommand((short) 0); return rgvControl(command)? R.ok(): R.error(); } @ManagerAuth(memo = "任务完成") @PostMapping("/operator/taskComplete") public R rgvTaskComplete(RgvOperatorParam param){ RgvCommand command = new RgvCommand(); command.setRgvNo(param.getRgvNo()); // RGV编号 command.setAckFinish1((short) 1); // 任务完成确认位 command.setTaskNo1((short) 0); // 工作号 command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo1((short) 0); // 源站 command.setDestinationStaNo1((short) 0); // 目标站 command.setAckFinish2((short) 1); // 任务完成确认位 command.setTaskNo2((short) 0); // 工作号 command.setTaskMode2(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo2((short) 0); // 源站 command.setDestinationStaNo2((short) 0); // 目标站 command.setCommand((short) 0); return rgvControl(command)? R.ok(): R.error(); } @ManagerAuth(memo = "清除命令") @PostMapping("/operator/clearCommand") public R rgvClearCommand(RgvOperatorParam param){ if (param.getRgvNo() == null) { throw new CoolException("请选择RGV号"); } RgvCommand command = new RgvCommand(); command.setRgvNo(param.getRgvNo()); // RGV编号 command.setAckFinish1((short) 0); // 任务完成确认位 command.setTaskNo1((short) 0); // 工作号 command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo1((short) 0); // 源站 command.setDestinationStaNo1((short) 0); // 目标站 command.setAckFinish2((short) 0); // 任务完成确认位 command.setTaskNo2((short) 0); // 工作号 command.setTaskMode2(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo2((short) 0); // 源站 command.setDestinationStaNo2((short) 0); // 目标站 command.setCommand((short) 0); return rgvControl(command)? R.ok(): R.error(); } @ManagerAuth(memo = "手动复位") @PostMapping("/operator/handleReset") public R handleReset(RgvOperatorParam param) throws Exception { if (param.getRgvNo() == null) { throw new CoolException("请选择RGV"); } // 获取RGV缓存 for (RgvSlave rgv : slaveProperties.getRgv()) { // 获取RGV信息 if (param.getRgvNo().equals(rgv.getId())) { SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId()); if (rgvThread == null) { throw new CoolException("RGV不在线"); } RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { throw new CoolException("RGV不在线"); } RgvCommand Command = new RgvCommand(); Command.setRgvNo(rgv.getId()); // RGV编号 Command.setTaskMode1(RgvTaskModeType.NONE); Command.setAckFinish1((short) 0); // 任务完成确认位 Command.setAckFinish2((short) 0); // 任务完成确认位 Command.setCommand((short) 0); // 任务完成确认位 // 延时发送 Thread.sleep(1000L); if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(4, Command))) { return R.ok(); } else { throw new CoolException("命令下发失败"); } } } return R.error(); } private boolean rgvControl(RgvCommand command){ if (command.getRgvNo() == null) { throw new CoolException("请选择RGV"); } for (RgvSlave rgv : slaveProperties.getRgv()) { // 获取RGV信息 if (command.getRgvNo().equals(rgv.getId())) { SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId()); if (rgvThread == null) { throw new CoolException("RGV不在线"); } RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { throw new CoolException("RGV不在线"); } if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(4, command))) { return true; } else { throw new CoolException("命令下发失败"); } } } return false; } } src/main/java/com/zy/asrs/domain/enums/RgvStatusType.java
New file @@ -0,0 +1,43 @@ package com.zy.asrs.domain.enums; /** * RGV状态枚举 */ public enum RgvStatusType { // 入库 MACHINE_PAKIN("入库"), // 出库 MACHINE_PAKOUT("出库"), // 异常 MACHINE_ERROR("异常"), // 自动 MACHINE_AUTO("自动"), // 非自动/手动 MACHINE_UN_AUTO("非自动"), ; private String desc; RgvStatusType(String desc){ this.desc = desc; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public static RgvStatusType process(Integer ioType){ if (ioType>100) { return MACHINE_PAKOUT; } else if (ioType < 100 && ioType!=3 && ioType!=6 && ioType!=11) { return MACHINE_PAKIN; } else { return MACHINE_ERROR; } } } src/main/java/com/zy/asrs/domain/param/RgvOperatorParam.java
New file @@ -0,0 +1,25 @@ package com.zy.asrs.domain.param; import lombok.Data; /** * Created by vincent on 2020-06-02 */ @Data public class RgvOperatorParam { // RGV号 private Integer rgvNo; // 工位1源站 private Short sourceStaNo1; // 工位1目标站 private Short staNo1; // 工位2源站 private Short sourceStaNo2; // 工位2目标站 private Short staNo2; } src/main/java/com/zy/asrs/domain/vo/RgvMsgTableVo.java
New file @@ -0,0 +1,62 @@ package com.zy.asrs.domain.vo; import com.zy.asrs.utils.Utils; import lombok.Data; /** * Created by vincent on 2020-06-02 */ @Data public class RgvMsgTableVo { // RGV号 private Integer rgvNo; // 工作号 private Short workNo = 0; // 状态 private String status = "-"; // 源站 private String sourceStaNo = "-"; // 目标站 private String staNo = "-"; // 源库位 private String sourceLocNo = "-"; // 目标库位 private String locNo = "-"; // 异常 private String error = ""; // 原点 private String origin = ""; // 命令 private String command = ""; // 走行速度(m/min) private Float xspeed = 0.0F; // 走行距离(Km) private Float xdistance = 0.0F; // 走行时长(H) private Float xduration = 0.0F; public void setXspeed(Float xspeed) { this.xspeed = Utils.scale(xspeed); } public void setXdistance(Float xdistance) { this.xdistance = Utils.scale(xdistance); } public void setXduration(Float xduration) { this.xduration = Utils.scale(xduration); } } src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java
New file @@ -0,0 +1,53 @@ package com.zy.asrs.domain.vo; import lombok.Data; /** * Created by vincent on 2020-06-02 */ @Data public class RgvStateTableVo { // RGV号 private Integer RgvNo; // 模式 private String statusType = "-"; // 状态 private String status = "-"; // 任务号 private Short workNo1 = 0; // 状态 private String status1 = "-"; // 有物 private String loading1 = "-"; // RGV位置 private Short RgvPos = 0; // 走行定位 private String walkPos = "-"; // 任务号 private Short workNo2 = 0; // 状态 private String status2 = "-"; // 有物 private String loading2 = "-"; //异常 private String warnCode; // 异常码描述 private String alarm = "-"; private Integer RgvPos1 = 0; private String pakMk="-"; } src/main/java/com/zy/asrs/entity/BasRgvErr.java
@@ -95,7 +95,7 @@ UserService service = SpringUtils.getBean(UserService.class); User user = service.selectById(this.modiUser); if (!Cools.isEmpty(user)){ return String.valueOf(user.getNickname()); return String.valueOf(user.getId()); } return null; } @@ -111,7 +111,7 @@ UserService service = SpringUtils.getBean(UserService.class); User user = service.selectById(this.appeUser); if (!Cools.isEmpty(user)){ return String.valueOf(user.getNickname()); return String.valueOf(user.getId()); } return null; } src/main/java/com/zy/system/entity/license/CustomLicenseManager.java
@@ -128,24 +128,24 @@ if(expectedCheckModel != null && serverCheckModel != null){ //校验IP地址 if(!checkIpAddress(expectedCheckModel.getIpAddress(),serverCheckModel.getIpAddress())){ //throw new LicenseContentException("当前服务器的IP没在授权范围内"); } //校验Mac地址 if(!checkIpAddress(expectedCheckModel.getMacAddress(),serverCheckModel.getMacAddress())){ //throw new LicenseContentException("当前服务器的Mac地址没在授权范围内"); } //校验主板序列号 if(!checkSerial(expectedCheckModel.getMainBoardSerial(),serverCheckModel.getMainBoardSerial())){ throw new LicenseContentException("当前服务器的主板序列号没在授权范围内"); } //校验CPU序列号 if(!checkSerial(expectedCheckModel.getCpuSerial(),serverCheckModel.getCpuSerial())){ throw new LicenseContentException("当前服务器的CPU序列号没在授权范围内"); } // if(!checkIpAddress(expectedCheckModel.getIpAddress(),serverCheckModel.getIpAddress())){ // //throw new LicenseContentException("当前服务器的IP没在授权范围内"); // } // // //校验Mac地址 // if(!checkIpAddress(expectedCheckModel.getMacAddress(),serverCheckModel.getMacAddress())){ // //throw new LicenseContentException("当前服务器的Mac地址没在授权范围内"); // } // // //校验主板序列号 // if(!checkSerial(expectedCheckModel.getMainBoardSerial(),serverCheckModel.getMainBoardSerial())){ // throw new LicenseContentException("当前服务器的主板序列号没在授权范围内"); // } // // //校验CPU序列号 // if(!checkSerial(expectedCheckModel.getCpuSerial(),serverCheckModel.getCpuSerial())){ // throw new LicenseContentException("当前服务器的CPU序列号没在授权范围内"); // } }else{ throw new LicenseContentException("不能获取服务器硬件信息"); } src/main/resources/application-prod.yml
@@ -2,6 +2,34 @@ doubleDeep: true #双深 doubleLocs: 1,4,7,10,11,14,15,18,19 #双深库位排号 groupCount: 4 #一个堆垛机负责的货架排数 # RGV穿梭车1 rgv[0]: id: 1 ip: 172.17.91.54 port: 502 rack: 0 slot: 0 # RGV穿梭车1 rgv[1]: id: 2 ip: 172.17.91.57 port: 502 rack: 0 slot: 0 # RGV穿梭车1 rgv[2]: id: 3 ip: 172.17.91.60 port: 502 rack: 0 slot: 0 # RGV穿梭车1 rgv[3]: id: 4 ip: 172.17.91.63 port: 502 rack: 0 slot: 0 crn[0]: #堆垛机1 id: 1 ip: 172.17.91.2 src/main/webapp/views/deviceOperate/rgvOperate.html
New file @@ -0,0 +1,340 @@ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>堆垛机设备</title> <link rel="stylesheet" href="../../static/wcs/css/element.css"> <script type="text/javascript" src="../../static/wcs/js/jquery/jquery-3.3.1.min.js"></script> <script type="text/javascript" src="../../static/wcs/js/common.js"></script> <script type="text/javascript" src="../../static/wcs/js/vue.min.js"></script> <script type="text/javascript" src="../../static/wcs/js/element.js"></script> </head> <body> <div id="app" style="display: flex;justify-content: center;flex-wrap: wrap;"> <div style="width: 100%;"> <el-table border ref="singleTable" :data="tableData" highlight-current-row @row-click="handleRowClick" max-height="350" style="width: 100%"> <el-table-column property="crnNo" label="堆垛机"> </el-table-column> <el-table-column property="workNo" label="工作号"> </el-table-column> <el-table-column property="statusType" label="模式"> </el-table-column> <el-table-column property="wrkStatus$" label="任务状态"> </el-table-column> <el-table-column property="deviceStatus" label="设备状态"> </el-table-column> </el-table> </div> <div style="width: 100%;display: flex;justify-content: center;margin-top: 10px;"> <div style="width: 55%;margin-right: 10px;"> <el-card class="box-card"> <div slot="header" class="clearfix"> <span>设备调试</span> </div> <div> <el-form :model="formParam" label-position="top" :inline="true" class="demo-form-inline"> <!-- <el-form-item label="源站/源库位">--> <!-- <el-input v-model="formParam.sourceStaNo" placeholder="源站/源库位"></el-input>--> <!-- </el-form-item>--> <el-form-item label="源排"> <el-input v-model="formParam.sourceRow" placeholder="排"></el-input> </el-form-item> <el-form-item label="源列"> <el-input v-model="formParam.sourceBay" placeholder="列"></el-input> </el-form-item> <el-form-item label="源层"> <el-input v-model="formParam.sourceLev" placeholder="层"></el-input> </el-form-item> </el-form> <el-form :model="formParam" label-position="top" :inline="true" class="demo-form-inline"> <!-- <el-form-item label="目标站/目标库位">--> <!-- <el-input v-model="formParam.staNo" placeholder="目标站/目标库位"></el-input>--> <!-- </el-form-item>--> <el-form-item label="目标排"> <el-input v-model="formParam.row" placeholder="排"></el-input> </el-form-item> <el-form-item label="目标列"> <el-input v-model="formParam.bay" placeholder="列"></el-input> </el-form-item> <el-form-item label="目标层"> <el-input v-model="formParam.lev" placeholder="层"></el-input> </el-form-item> </el-form> <el-form :model="formParam" label-position="top" :inline="true" class="demo-form-inline"> <el-form-item label="托盘码"> <el-input v-model="formParam.barcode" placeholder="条码"></el-input> </el-form-item> <el-form-item label="托盘类型"> <el-input v-model="formParam.barcodeType" placeholder="类型"></el-input> </el-form-item> <el-form-item label="空托盘"> <el-select v-model="formParam.emptyContainer" placeholder="是否为空托盘"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> </el-form> <el-form label-position="top" :inline="true" class="demo-form-inline"> <el-form-item label=""> <el-checkbox @change="updateEnableInOut('in')" v-model="enableIn">可入</el-checkbox> </el-form-item> <el-form-item label=""> <el-checkbox @change="updateEnableInOut('out')" v-model="enableOut">可出</el-checkbox> </el-form-item> </el-form> <div> <el-button @click="requestOperate('put')" type="primary">入库</el-button> <el-button @click="requestOperate('take')" type="primary">出库</el-button> <el-button @click="requestOperate('stockMove')" type="primary">库位转移</el-button> <el-button @click="requestOperate('siteMove')" type="primary">站到站</el-button> <el-button @click="requestOperate('taskComplete')" type="primary">任务完成</el-button> <el-button @click="requestOperate('clearCommand')" type="primary">清除命令</el-button> <el-button @click="requestOperate('reset')" type="primary">复位</el-button> <br/> <br/> <el-button @click="requestOperate('auto')" type="warning">联机</el-button> <el-button @click="requestOperate('semiAutomatic')" type="warning">半自动</el-button> <el-button @click="requestOperate('hand')" type="warning">手动</el-button> <el-button @click="requestOperate('onlineWrk4')" type="warning">恢复联机任务</el-button> <el-button @click="requestOperate('onlineWrk3')" type="warning">清除联机任务</el-button> <el-button @click="requestOperate('onlineWrk1')" type="warning">申请完成任务</el-button> <br/> <br/> <el-button @click="requestOperate('onlineWrk2')" type="warning">申请取消任务</el-button> </div> </div> </el-card> </div> <div style="width: 45%;"> <el-card class="box-card"> <div slot="header" class="clearfix"> <span>设备状态</span> </div> <div> <div v-if="currentIndex == null"> <el-empty description="请选择设备"></el-empty> </div> <div v-else> <el-descriptions :title="currentTitle" direction="vertical" :column="4" border> <el-descriptions-item label="堆垛机">{{ tableData[currentIndex].crnNo }} </el-descriptions-item> <el-descriptions-item label="工作号"> {{ tableData[currentIndex].workNo }} </el-descriptions-item> <el-descriptions-item label="模式"> <el-tag>{{ tableData[currentIndex].statusType }}</el-tag> </el-descriptions-item> <el-descriptions-item label="任务状态"> <div v-if="tableData[currentIndex].wrkStatus == 0"> <el-tag>{{ tableData[currentIndex].wrkStatus$ }}</el-tag> </div> <div v-else> <el-tag type="success">{{ tableData[currentIndex].wrkStatus$ }}</el-tag> </div> </el-descriptions-item> <el-descriptions-item label="设备状态"> <el-tag>{{ tableData[currentIndex].deviceStatus }}</el-tag> </el-descriptions-item> <el-descriptions-item label="有物"> <el-tag>{{ tableData[currentIndex].loading }}</el-tag> </el-descriptions-item> <el-descriptions-item label="列">{{ tableData[currentIndex].bay }} </el-descriptions-item> <el-descriptions-item label="层">{{ tableData[currentIndex].lev }} </el-descriptions-item> <el-descriptions-item label="故障代码">{{ tableData[currentIndex].warnCode }} </el-descriptions-item> <el-descriptions-item label="故障描述">{{ tableData[currentIndex].lev }} </el-descriptions-item> <el-descriptions-item label="源站">{{ tableData[currentIndex].sourceStaNo }} </el-descriptions-item> <el-descriptions-item label="目标站">{{ tableData[currentIndex].staNo }} </el-descriptions-item> <el-descriptions-item label="源库位">{{ tableData[currentIndex].sourceLocNo }} </el-descriptions-item> <el-descriptions-item label="目标库位">{{ tableData[currentIndex].locNo }} </el-descriptions-item> <el-descriptions-item label="货叉定位">{{ tableData[currentIndex].forkOffset }} </el-descriptions-item> <el-descriptions-item label="载货台定位">{{ tableData[currentIndex].liftPos }} </el-descriptions-item> <el-descriptions-item label="走行在定位">{{ tableData[currentIndex].walkPos }} </el-descriptions-item> <el-descriptions-item label="走行速度(m/min)">{{ tableData[currentIndex].xspeed }} </el-descriptions-item> <el-descriptions-item label="升降速度(m/min)">{{ tableData[currentIndex].yspeed }} </el-descriptions-item> <el-descriptions-item label="叉牙速度(m/min)">{{ tableData[currentIndex].zspeed }} </el-descriptions-item> <el-descriptions-item label="走行距离(Km)">{{ tableData[currentIndex].xdistance }} </el-descriptions-item> <el-descriptions-item label="升降距离(Km)">{{ tableData[currentIndex].ydistance }} </el-descriptions-item> <el-descriptions-item label="走行时长(H)">{{ tableData[currentIndex].xduration }} </el-descriptions-item> <el-descriptions-item label="升降时长(H)">{{ tableData[currentIndex].yduration }} </el-descriptions-item> </el-descriptions> </div> </div> </el-card> </div> </div> </div> <script> var app = new Vue({ el: '#app', data: { tableData: [], currentRow: null, currentTitle: "未选择设备", currentIndex: null, formParam: { crnNo: null, sourceStaNo: null, sourceRow: 1, sourceBay: 0, sourceLev: 1, staNo: null, row: 1, bay: 0, lev: 1, barcode:null, barcodeType:null, emptyContainer:null }, enableIn: false, enableOut: false, options:[ { value:'1', label:'是' }, { value:'0', label:'否' } ] }, created() { this.init() }, watch: { }, methods: { init() { this.getTableData() setInterval(() => { this.getTableData() }, 1000) }, handleRowClick(row, col, event) { const index = this.tableData.indexOf(row) this.currentRow = row; this.currentIndex = index this.currentTitle = row.crnNo + "号堆垛机" this.formParam.crnNo = row.crnNo this.enableIn = row.inEnable == "Y" ? true : false this.enableOut = row.outEnable == "Y" ? true : false }, getTableData() { let that = this; $.ajax({ url: baseUrl + "/rgv/table/rgv/state", headers: { 'token': localStorage.getItem('token') }, data: {}, dataType: 'json', contentType: 'application/json;charset=UTF-8', method: 'post', success: function (res) { that.tableData = res.data } }); }, requestOperate(method) { let that = this that.$confirm('此操作存在风险,是否继续','提示',{ confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(()=>{ $.ajax({ url: baseUrl + "/crn/operator/" + method, headers: { 'token': localStorage.getItem('token') }, data: this.formParam, method: 'POST', success: function (res) { if (res.code == 200) { that.$message({ message: res.msg, type: 'success' }); } else { that.$message({ message: res.msg, type: 'error' }); } } }); }) }, updateEnableInOut(type) { let that = this let param = {} if (type == "in") { param = { inEnable: this.enableIn ? "Y" : "N", crnNo: this.formParam.crnNo } } else { param = { outEnable: this.enableOut ? "Y" : "N", crnNo: this.formParam.crnNo } } $.ajax({ url: baseUrl + "/basCrnp/update/auth", headers: { 'token': localStorage.getItem('token') }, data: param, method: 'POST', success: function (res) { if (res.code == 200) { that.$message({ message: res.msg, type: 'success' }); } else { that.$message({ message: res.msg, type: 'error' }); } } }); } } }) </script> </body> </html>