src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -25,19 +25,25 @@ import com.zy.core.CrnThread; import com.zy.core.DevpThread; import com.zy.core.Slave; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.CrnModeType; import com.zy.core.enums.SlaveType; import com.zy.core.model.CrnSlave; import com.zy.core.model.DevpSlave; import com.zy.core.model.RgvSlave; import com.zy.core.model.Task; import com.zy.core.model.command.CrnCommand; import com.zy.core.model.protocol.CrnProtocol; import com.zy.core.model.protocol.RgvProtocol; import com.zy.core.model.protocol.StaProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.properties.SystemProperties; import com.zy.core.thread.BarcodeThread; import com.zy.core.thread.ScaleThread; import com.zy.core.thread.SiemensCrnThread; import com.zy.core.thread.SiemensRgvThread; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -70,6 +76,59 @@ private DeviceErrorService deviceErrorService; @Autowired private BasCrnpService basCrnpService; @PostMapping("/system/running/error") @ManagerAuth(memo = "系统运行状态") public R systemRunningError(){ StringBuilder msg = new StringBuilder(); 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; } if (crnProtocol.getStatus() == 99){ msg.append("<span style=\"color: red\">").append(crn.getId()).append("号堆垛机报警<span><br>"); } } for (RgvSlave rgv : slaveProperties.getRgv()) { // 获取堆垛机信息 SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId()); if (rgvThread == null) { continue; } RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { continue; } if (rgvProtocol.getAlarm() > 0){ msg.append("<span style=\"color: red\">").append(rgv.getId()).append("号Rgv报警<span>\br"); } } for (DevpSlave devp : slaveProperties.getDevp()) { DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); Map<Integer, StaProtocol> station = devpThread.getStation(); for(Map.Entry<Integer, StaProtocol> entry : station.entrySet()) { if (entry.getKey() == 302 || entry.getKey() == 303 || entry.getKey() == 304 || entry.getKey() == 305) { if (!Cools.isEmpty(staPlcErr(entry))){ msg.append(staPlcErr(entry).get(0)); msg.append("<span style=\"color: red\">").append(staPlcErr(entry).get(0).getNo()).append("号提升机报警<span>\br"); } } } } if (Cools.isEmpty(msg)){ return R.error().add(msg.toString()); } return R.ok(); } @PostMapping("/system/running/status") @ManagerAuth(memo = "系统运行状态") @@ -477,4 +536,72 @@ return R.ok(map); } public List<PlcErrorTableVo> staPlcErr(Map.Entry<Integer, StaProtocol> entry){ List<PlcErrorTableVo> list = new ArrayList<>(); StaProtocol staProtocol = entry.getValue(); if (staProtocol.getBreakerErr()){ PlcErrorTableVo vo = new PlcErrorTableVo(); vo.setNo(entry.getKey()); // 序号 vo.setPlcDesc("断路器故障"); vo.setError("断路器故障"); list.add(vo); } if (staProtocol.getInfraredErr()){ PlcErrorTableVo vo = new PlcErrorTableVo(); vo.setNo(entry.getKey()); // 序号 vo.setPlcDesc("光电异常"); vo.setError("光电异常"); list.add(vo); } if (staProtocol.getOutTimeErr()){ PlcErrorTableVo vo = new PlcErrorTableVo(); vo.setNo(entry.getKey()); // 序号 vo.setPlcDesc("运行超时"); vo.setError("运行超时"); list.add(vo); } if (staProtocol.getSeizeSeatErr()){ PlcErrorTableVo vo = new PlcErrorTableVo(); vo.setNo(entry.getKey()); // 序号 vo.setPlcDesc("占位超时"); vo.setError("占位超时"); list.add(vo); } if (staProtocol.getWrkYgoodsN()){ PlcErrorTableVo vo = new PlcErrorTableVo(); vo.setNo(entry.getKey()); // 序号 vo.setPlcDesc("有任务无货故障"); vo.setError("有任务无货故障"); list.add(vo); } if (staProtocol.getInverterErr()){ PlcErrorTableVo vo = new PlcErrorTableVo(); vo.setNo(entry.getKey()); // 序号 vo.setPlcDesc("变频器故障"); vo.setError("变频器故障"); list.add(vo); } if (staProtocol.getContactErr()){ PlcErrorTableVo vo = new PlcErrorTableVo(); vo.setNo(entry.getKey()); // 序号 vo.setPlcDesc("电机接触器故障"); vo.setError("电机接触器故障"); list.add(vo); } if (staProtocol.getUpcontactErr()){ PlcErrorTableVo vo = new PlcErrorTableVo(); vo.setNo(entry.getKey()); // 序号 vo.setPlcDesc("顶升电机接触器故障"); vo.setError("顶升电机接触器故障"); list.add(vo); } return list; } } src/main/java/com/zy/asrs/controller/CrnController.java
@@ -21,6 +21,7 @@ import com.zy.asrs.service.LocMastService; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.service.impl.MainServiceImpl; import com.zy.asrs.service.impl.TaskWrkServiceImpl; import com.zy.asrs.utils.CommandUtils; import com.zy.asrs.utils.Utils; import com.zy.asrs.utils.VersionUtils; @@ -78,6 +79,8 @@ private MainServiceImpl mainService; @Autowired private LocMastService locMastService; @Autowired private TaskWrkServiceImpl taskWrkService; @ManagerAuth(memo = "进行中的命令") @@ -201,13 +204,12 @@ vo.setWorkNo(crnProtocol.getTaskNo()); // 任务号 if (crnProtocol.getTaskNo()>0) { WrkMast wrkMast = wrkMastService.selectById(crnProtocol.getTaskNo()); if (wrkMast != null) { vo.setStatus(CrnStatusType.process(wrkMast.getIoType()).getDesc()); // 模式状态 vo.setSourceStaNo(wrkMast.getSourceStaNo$()); // 源站 vo.setStaNo(wrkMast.getStaNo$()); // 目标站 vo.setSourceLocNo(wrkMast.getSourceLocNo()); // 源库位 vo.setLocNo(wrkMast.getLocNo()); // 目标库位 TaskWrk taskWrk = taskWrkService.selectByWrkNo(crnProtocol.getTaskNo().intValue()); if (taskWrk != null) { vo.setStatus(CrnStatusType.process(taskWrk.getIoType()).getDesc()); // 模式状态 vo.setSourceStaNo(taskWrk.getStartPoint()); // 源站 vo.setStaNo(taskWrk.getTargetPoint()); // 目标站 vo.setOrigin(taskWrk.getBarcode()); } } else { vo.setStatus(crnProtocol.modeType.equals(CrnModeType.AUTO)? CrnStatusType.MACHINE_AUTO.getDesc(): CrnStatusType.MACHINE_UN_AUTO.getDesc()); // 模式状态 @@ -320,6 +322,12 @@ } vo.setInEnable(basCrnp.getInEnable()); vo.setOutEnable(basCrnp.getOutEnable()); if (crnProtocol.getTaskNo()>0) { TaskWrk taskWrk = taskWrkService.selectByWrkNo(crnProtocol.getTaskNo().intValue()); if (taskWrk != null) { vo.setBarcode(taskWrk.getBarcode()); } } } return R.ok().add(list); } src/main/java/com/zy/asrs/controller/RgvController.java
@@ -4,6 +4,7 @@ import com.core.annotations.ManagerAuth; import com.core.common.R; import com.core.exception.CoolException; import com.zy.asrs.domain.enums.CrnStatusType; import com.zy.asrs.domain.enums.RgvStatusType; import com.zy.asrs.domain.param.CrnOperatorParam; import com.zy.asrs.domain.param.RgvOperatorParam; @@ -11,10 +12,12 @@ import com.zy.asrs.domain.vo.RgvStateTableVo; import com.zy.asrs.entity.BasRgv; import com.zy.asrs.entity.BasRgvErr; import com.zy.asrs.entity.TaskWrk; 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.TaskWrkService; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.service.impl.MainServiceImpl; import com.zy.core.CrnThread; @@ -64,6 +67,8 @@ private MainServiceImpl mainService; @Autowired private LocMastService locMastService; @Autowired private TaskWrkService taskWrkService; @ManagerAuth(memo = "复位") @@ -172,8 +177,15 @@ vo.setPakMk(rgvThread.isPakMk()?"无锁":"锁定"); vo.setWalkPos(rgvProtocol.getAlarm() == 0?"正常":"报警"); vo.setWarnCode(String.valueOf(rgvProtocol.getAlarm())); vo.setStaNo(rgvProtocol.getSouSta().intValue()); vo.setSourceStaNo(rgvProtocol.getEndSta().intValue()); if (rgvProtocol.getTaskNo1()>0) { TaskWrk taskWrk = taskWrkService.selectByWrkNo(rgvProtocol.getTaskNo1().intValue()); if (taskWrk != null) { vo.setStatus(CrnStatusType.process(taskWrk.getIoType()).getDesc()); // 模式状态 vo.setSourceStaNo(taskWrk.getStartPoint()); // 源站 vo.setStaNo(taskWrk.getTargetPoint()); // 目标站 vo.setBarcode(taskWrk.getBarcode()); } } if (rgvProtocol.getAlarm() > 0) { BasRgvErr rgvErr = basRgvErrMapper.selectById(rgvProtocol.getAlarm()); vo.setAlarm(rgvErr==null?"未知异常":rgvErr.getErrName()); @@ -204,13 +216,12 @@ 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()); // 目标库位 TaskWrk taskWrk = taskWrkService.selectByWrkNo(rgvProtocol.getTaskNo1().intValue()); if (taskWrk != null) { vo.setStatus(CrnStatusType.process(taskWrk.getIoType()).getDesc()); // 模式状态 vo.setSourceStaNo(taskWrk.getStartPoint()); // 源站 vo.setStaNo(taskWrk.getTargetPoint()); // 目标站 vo.setOrigin(taskWrk.getBarcode()); } } else { vo.setStatus(rgvProtocol.modeType.equals(RgvModeType.AUTO)? rgvProtocol.modeType.desc: RgvModeType.HAND.desc); // 模式状态 src/main/java/com/zy/asrs/controller/SiteController.java
@@ -86,6 +86,43 @@ return R.ok().add(list); } @PostMapping("/table/site2") @ManagerAuth(memo = "站点信息表") public R siteTable2(){ List<SiteTableVo> list = new ArrayList<>(); // 内存数据 Map<Integer, StaProtocol> station = new HashMap<>(); for (DevpSlave devp : slaveProperties.getDevp()) { DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); station.putAll(devpThread.getStation()); } // 持久数据 List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<BasDevp>().orderBy("dev_no")); for (BasDevp devp : basDevps) { if (devp.getDevNo()== 302 || devp.getDevNo()== 303 || devp.getDevNo()== 402 || devp.getDevNo()== 403) { SiteTableVo vo = new SiteTableVo(); vo.setDevNo(devp.getDevNo()); // 站点编号 list.add(vo); StaProtocol staProtocol = station.get(devp.getDevNo()); if (null == staProtocol) { continue; } vo.setWorkNo(staProtocol.getWorkNo()); // 工作号 vo.setAutoing(staProtocol.isAutoing()?"Y":"N"); // 自动 vo.setLoading(staProtocol.isLoading()?"Y":"N"); // 有物 vo.setInEnable(staProtocol.isInEnable()?"Y":"N"); // 可入 vo.setOutEnable(staProtocol.isOutEnable()?"Y":"N"); // 可出 vo.setPakMk(staProtocol.isPakMk()?"Y":"N"); // 入库标记 vo.setEmptyMk(staProtocol.isEmptyMk()?"Y":"N"); // 空板信号 vo.setStaNo(staProtocol.getStaNo()); // 目标站 // vo.setLocType1(staProtocol.isHigh() != staProtocol.isLow() && staProtocol.isLow() ? "低" : "高"); //高低库位 vo.setLocType1(devp.getDevNo()==102 ? "高" : "低"); } } return R.ok().add(list); } @GetMapping("/list/auth") @ManagerAuth(memo = "站点信息表") public R crnList(){ @@ -119,6 +156,43 @@ return R.ok().add(list); } @GetMapping("/list/auth2") @ManagerAuth(memo = "站点信息表") public R crnList2(){ List<SiteTableVo> list = new ArrayList<>(); // 内存数据 Map<Integer, StaProtocol> station = new HashMap<>(); for (DevpSlave devp : slaveProperties.getDevp()) { DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); station.putAll(devpThread.getStation()); } // 持久数据 List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<BasDevp>().orderBy("dev_no")); for (BasDevp devp : basDevps) { if (devp.getDevNo()== 302 || devp.getDevNo()== 303 || devp.getDevNo()== 402 || devp.getDevNo()== 403) { SiteTableVo vo = new SiteTableVo(); vo.setDevNo(devp.getDevNo()); // 站点编号 list.add(vo); StaProtocol staProtocol = station.get(devp.getDevNo()); if (null == staProtocol) { continue; } vo.setWorkNo(staProtocol.getWorkNo()); // 工作号 vo.setAutoing(staProtocol.isAutoing() ? "Y" : "N"); // 自动 vo.setLoading(staProtocol.isLoading() ? "Y" : "N"); // 有物 vo.setInEnable(staProtocol.isInEnable() ? "Y" : "N"); // 可入 vo.setOutEnable(staProtocol.isOutEnable() ? "Y" : "N"); // 可出 vo.setPakMk(staProtocol.isPakMk() ? "Y" : "N"); // 入库标记 vo.setEmptyMk(staProtocol.isEmptyMk() ? "Y" : "N"); // 空板信号 vo.setStaNo(staProtocol.getStaNo()); // 目标站 // vo.setLocType1(staProtocol.isHigh() != staProtocol.isLow() && staProtocol.isLow() ? "低" : "高"); //高低库位 vo.setLocType1(devp.getDevNo() == 102 ? "高" : "低"); vo.setBarcode(staProtocol.getBarcode()); } } return R.ok().add(list); } @PostMapping("/table/plc/errors") @ManagerAuth(memo = "输送设备plc异常信息表") public R plcErrorTable(){ @@ -129,7 +203,7 @@ for(Map.Entry<Integer, StaProtocol> entry : station.entrySet()) { if (!Cools.isEmpty(staPlcErr(entry))){ list.add(staPlcErr(entry).get(0)) ; list.add(staPlcErr(entry).get(0)); } } @@ -137,6 +211,27 @@ return R.ok().add(list); } @PostMapping("/table/plc/errors2") @ManagerAuth(memo = "输送设备plc异常信息表") public R plcErrorTable2(){ List<PlcErrorTableVo> list = new ArrayList<>(); for (DevpSlave devp : slaveProperties.getDevp()) { DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); Map<Integer, StaProtocol> station = devpThread.getStation(); for(Map.Entry<Integer, StaProtocol> entry : station.entrySet()) { if (entry.getKey() == 302 || entry.getKey() == 303 || entry.getKey() == 304 || entry.getKey() == 305) { if (!Cools.isEmpty(staPlcErr(entry))){ list.add(staPlcErr(entry).get(0)); } } } } return R.ok().add(list); } @PostMapping("/output/site") @ManagerAuth(memo = "站点设备报文日志输出") public R siteOutput(){ src/main/java/com/zy/asrs/domain/vo/CrnListVo.java
@@ -111,6 +111,7 @@ // 可出 private String outEnable; private String barcode = "-"; public void setXspeed(Float xspeed) { this.xspeed = Utils.scale(xspeed); src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java
@@ -44,14 +44,15 @@ //异常 private String warnCode; //源站 private Integer staNo; private String staNo; //目标站 private Integer sourceStaNo; private String sourceStaNo; // 异常码描述 private String alarm = "-"; private Integer RgvPos1 = 0; private String pakMk="-"; private String barcode = "-"; } src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -140,6 +140,10 @@ list = getInEnableRoadway2(); } if (Cools.isEmpty(list)){ return R.error("无可入巷道"); } //TaskWrk taskWrk = taskWrkService.selectByTaskNo(param.getTaskNo()); toWmsDTO.setWarehouseId("1688469798893297665"); src/main/webapp/static/wcs/css/index.css
@@ -31,10 +31,10 @@ .sidebar { width: 8%; height: 40%; height: 50%; line-height: 90px; position: fixed; top: 50%; top: 40%; transform: translateY(-50%); } .nav ul { src/main/webapp/views/deviceOperate/crnOperate.html
@@ -26,6 +26,8 @@ </el-table-column> <el-table-column property="deviceStatus" label="设备状态"> </el-table-column> <el-table-column property="barcode" label="托盘码"> </el-table-column> </el-table> </div> src/main/webapp/views/deviceOperate/devpOperate2.html
New file @@ -0,0 +1,201 @@ <!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="450" style="width: 100%"> <el-table-column property="devNo" label="提升机"> </el-table-column> <el-table-column property="workNo" label="工作号"> </el-table-column> <el-table-column property="locType1" label="高低库位"> </el-table-column> <el-table-column property="pakMk" label="入库标记"> </el-table-column> <el-table-column property="barcode" 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.workNo" placeholder="工作号"></el-input>--> <!-- </el-form-item>--> <!-- <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.pakMk" placeholder="入库标记"></el-input>--> <!-- </el-form-item>--> <!-- </el-form>--> <!-- <el-form label-position="top" :inline="true" class="demo-form-inline">--> <!-- <el-form-item label="">--> <!-- <el-checkbox v-model="formParam.inEnable">可入</el-checkbox>--> <!-- </el-form-item>--> <!-- <el-form-item label="">--> <!-- <el-checkbox v-model="formParam.outEnable">可出</el-checkbox>--> <!-- </el-form-item>--> <!-- </el-form>--> <!-- <div>--> <!-- <el-button @click="requestOperate('update')" type="primary">更新</el-button>--> <!-- <el-button @click="requestOperate('out')" type="warning">取货完成</el-button>--> <!-- <el-button @click="requestOperate('in')" type="warning">放货完成</el-button>--> <!-- </div>--> <!-- </div>--> <!-- </el-card>--> <!-- </div>--> <div style="width: 100%;"> <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].devNo }} </el-descriptions-item> <el-descriptions-item label="工作号"> {{ tableData[currentIndex].workNo }} </el-descriptions-item> <el-descriptions-item label="自动">{{ tableData[currentIndex].autoing }} </el-descriptions-item> <el-descriptions-item label="有物">{{ tableData[currentIndex].loading }} </el-descriptions-item> <el-descriptions-item label="可入">{{ tableData[currentIndex].inEnable }} </el-descriptions-item> <el-descriptions-item label="可出">{{ tableData[currentIndex].outEnable }} </el-descriptions-item> <el-descriptions-item label="入库标记">{{ tableData[currentIndex].pakMk }} </el-descriptions-item> <el-descriptions-item label="空板信号">{{ tableData[currentIndex].emptyMk }} </el-descriptions-item> <el-descriptions-item label="目标站">{{ tableData[currentIndex].staNo }} </el-descriptions-item> <el-descriptions-item label="高低库位">{{ tableData[currentIndex].locType1 }} </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: { devNo: null, workNo: null, staNo: null, pakMk: null, inEnable: false, outEnable: false } }, 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.devNo + "提升机" this.formParam.devNo = row.devNo this.formParam.workNo = row.workNo this.formParam.staNo = row.staNo this.formParam.pakMk = row.pakMk this.formParam.inEnable = row.inEnable == "Y" ? true : false this.formParam.outEnable = row.outEnable == "Y" ? true : false }, getTableData() { let that = this; $.ajax({ url: baseUrl + "/site/list/auth2", headers: { 'token': localStorage.getItem('token') }, data: {}, dataType: 'json', contentType: 'application/json;charset=UTF-8', method: 'GET', success: function (res) { that.tableData = res.data } }); }, requestOperate(method) { let that = this that.$confirm('此操作存在风险,是否继续','提示',{ confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(()=>{ $.ajax({ url: baseUrl + "/site/detl/"+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' }); } } }); }) } } }) </script> </body> </html> src/main/webapp/views/deviceOperate/rgvOperate.html
@@ -26,6 +26,8 @@ </el-table-column> <el-table-column property="walkPos" label="设备状态"> </el-table-column> <el-table-column property="barcode" label="托盘码"> </el-table-column> </el-table> </div> @@ -84,12 +86,10 @@ <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].status}}</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].walkPos }}</el-tag> src/main/webapp/views/index.html
@@ -197,6 +197,46 @@ var url = logout.getAttribute('href'); logout.setAttribute('href', baseUrl + "/login"); var flag = false var sure = true var msg = "" setInterval(function () { $.ajax({ url: baseUrl+"/console/system/running/error", headers: {'token': localStorage.getItem('token')}, method: 'POST', success: function (res) { console.log(res.code) if (res.code === 200){ }else if (res.code === 500){ msg = res.data flag = true } else if (res.code === 403){ top.location.href = baseUrl+"/"; } else { layer.msg(res.msg, {icon: 2}); } } }) if (flag && sure){ layer.open({ id: 1, title: '报警提示' ,content: msg, yes: function (index,layero) { console.log(1111) sure = false layer.close(index) } }); } }, 1000); }); </script> <script type="text/html" id="menuTpl"> src/main/webapp/views/realtimeWatch/crn2.html
@@ -123,8 +123,7 @@ <th>状态</th> <th>源站</th> <th>目标站</th> <th>源库位</th> <th>目标库位</th> <th>托盘码</th> <th>走行速度(m/min)</th> <th>升降速度(m/min)</th> <th>叉牙速度(m/min)</th> @@ -358,15 +357,14 @@ setVal(tr.children("td").eq(2), table[i-1].status); setVal(tr.children("td").eq(3), table[i-1].sourceStaNo); setVal(tr.children("td").eq(4), table[i-1].staNo); setVal(tr.children("td").eq(5), table[i-1].sourceLocNo); setVal(tr.children("td").eq(6), table[i-1].locNo); setVal(tr.children("td").eq(7), table[i-1].xspeed); setVal(tr.children("td").eq(8), table[i-1].yspeed); setVal(tr.children("td").eq(9), table[i-1].zspeed); setVal(tr.children("td").eq(10), table[i-1].xdistance); setVal(tr.children("td").eq(11), table[i-1].ydistance); setVal(tr.children("td").eq(12), table[i-1].xduration); setVal(tr.children("td").eq(13), table[i-1].yduration); setVal(tr.children("td").eq(5), table[i-1].origin); setVal(tr.children("td").eq(6), table[i-1].xspeed); setVal(tr.children("td").eq(7), table[i-1].yspeed); setVal(tr.children("td").eq(8), table[i-1].zspeed); setVal(tr.children("td").eq(9), table[i-1].xdistance); setVal(tr.children("td").eq(10), table[i-1].ydistance); setVal(tr.children("td").eq(11), table[i-1].xduration); setVal(tr.children("td").eq(12), table[i-1].yduration); } } else if (res.code === 403){ window.location.href = baseUrl+"/login"; @@ -555,7 +553,6 @@ var html = ""; for (var i = 0; i < line; i ++){ html += " <tr>\n" + " <td></td>\n" + " <td></td>\n" + " <td></td>\n" + " <td></td>\n" + src/main/webapp/views/realtimeWatch/index2.html
@@ -23,8 +23,9 @@ <ul class="cl-effect-4"> <li><a id="console" onclick="nav(this.id)" class="nav-select" href="#">主控图</a></li> <li><a id="pipeline" onclick="nav(this.id)" class="nav-unselect" href="#">输送设备</a></li> <li><a id="crn" onclick="nav(this.id)" class="nav-unselect" href="#">堆垛机</a></li> <li><a id="crn2" onclick="nav(this.id)" class="nav-unselect" href="#">堆垛机</a></li> <li><a id="rgv" onclick="nav(this.id)" class="nav-unselect" href="#">Rgv</a></li> <li><a id="pipeline2" onclick="nav(this.id)" class="nav-unselect" href="#">提升机</a></li> </ul> </div> </div> @@ -42,9 +43,6 @@ function nav(id) { $('.nav-select').attr("class", "nav-unselect"); $('#'+id).attr("class", "nav-select"); if (id=="crn" || id == "pipeline"){ id=id+"2"; } $('#content').attr("src", id+".html"); } src/main/webapp/views/realtimeWatch/pipeline.html
@@ -1,100 +1,434 @@ <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta charset="UTF-8"> <title>WCS输送设备管理</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"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0"> <link rel="stylesheet" type="text/css" href="../../static/wcs/css/normalize.css"> <link rel="stylesheet" type="text/css" href="../../static/wcs/css/common.css"> <link rel="stylesheet" type="text/css" href="../../static/wcs/css/pipeline.css"> <script type="text/javascript" src="../../static/wcs/js/jquery/jquery-3.3.1.min.js"></script> <script type="text/javascript" src="../../static/wcs/js/common.js"></script> <script type="text/javascript" src="../../static/wcs/js/layer/layer.js"></script> <style> .io-mode-box { float: left; width: 16%; text-align: center; } .io-mode-box label { font-weight: bolder; } .ioModeBtn { vertical-align: middle; width: 50%; height: 30px; left: 0; top: 0; text-shadow: inherit; font-size: 15px; margin-left: 5px; margin-right: 5px; display: inline-block; background-color: #FF5722; border: none; color: #FFF; box-shadow: 1px 1px 5px #B6B6B6; border-radius: 3px; cursor: pointer; } </style> </head> <body> <div class="layui-fluid"> <div class="layui-card"> <div class="layui-card-body"> <!-- <div class="layui-form toolbar" id="search-box">--> <!-- <div class="layui-form-item">--> <!-- <div class="layui-inline">--> <!-- <div class="layui-input-inline">--> <!-- <input class="layui-input" type="text" name="id" placeholder="编号" autocomplete="off">--> <!-- </div>--> <!-- </div>--> <!-- <div class="layui-inline"> --> <!-- <button class="layui-btn icon-btn" lay-filter="search" lay-submit>--> <!-- <i class="layui-icon"></i>刷新--> <!-- </button>--> <!-- <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>--> <!-- <i class="layui-icon"></i>重置--> <!-- </button>--> <!-- </div>--> <!-- </div>--> <!-- </div>--> <table class="layui-hide" id="pipeline" lay-filter="pipeline"></table> </div> </div> </div> <div style="height: 100vh;padding-left: 6%"> <div style="padding: 10px;height: 900px;"> <main> <script type="text/html" id="toolbar"> <div class="layui-btn-container"> <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData" style="visibility: hidden">新增</button> <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData" style="visibility: hidden">删除</button> <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right;visibility: hidden">导出</button> </div> </script> <script type="text/html" id="operate"> <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a> <!-- <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a>--> </script> <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/realtimeWatch/pipeline.js" charset="utf-8"></script> </body> <!-- 表单弹窗 --> <script type="text/html" id="editDialog"> <form id="detail" lay-filter="detail" class="layui-form admin-form model-form"> <input name="id" type="hidden"> <div class="layui-row"> <div class="layui-col-md12"> <div class="layui-form-item"> <label class="layui-form-label">站号: </label> <div class="layui-input-block"> <input class="layui-input" id="devNo" name="devNo" disabled placeholder=""> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">工作号: </label> <div class="layui-input-block"> <input class="layui-input" id="workNo" name="workNo" placeholder=""> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">目标站: </label> <div class="layui-input-block"> <input class="layui-input" id="staNo" name="staNo" placeholder=""> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">入库标记: </label> <div class="layui-input-block"> <input class="layui-input" id="pakMk" name="pakMk" placeholder=""> <!-- plc异常日志监控版 --> <div id="plc-error" class="main-board" style="padding-left: 10px"> <!-- 头部 --> <div class="plc-log-header"> <!-- <div style="height: 40%">--> <!-- <span>东侧PLC执行指令</span>--> <!-- </div>--> <!-- <div style="height: 40%">--> <!-- <span>西侧PLC执行指令</span>--> <!-- </div>--> <div> <span style="color: #1E9FFF">PLC异常信息表:</span> </div> </div> <!-- 主体 --> <div class="plc-log-body"> <table id="plc-error-table"> <thead> <tr> <th style="width: 200px">站点</th> <th style="width: 400px">PLC错误描述</th> <th style="width: 400px">异常</th> </tr> </thead> <tbody> </tbody> </table> </div> </div> </div> <hr class="layui-bg-gray"> <div class="layui-form-item text-right"> <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button> <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button> </div> </form> </script> </html> <!-- 站点状态数据监控版 --> <div id="site-monitor" class="main-board"> <!-- 表格 --> <!--固定表头 table 加table-layout: fixed; th 加 position:sticky;top: 0;--> <table id="site-table" style="table-layout: fixed;"> <!-- 表头 --> <thead style="position:sticky;top: 0;"> <tr> <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> </main> <footer> <textarea id="output"></textarea> </footer> <div id="site-detl" style="display: none"> <form> <div class="form-item"> <label class="form-label">站号:</label> <div class="form-input"> <input id="siteId" name="siteId" 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="staNo" name="staNo" 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> </form> </div> </div> </div> </body> <script> // 初始化 // 空白行数 var stop = false var plcErrorTableBlankRows = 0; var siteTableBlankRows = 0; // 实际行数 var plcErrorTableFullRows = 0; var siteTableFullRows = 0; var outputDom = document.getElementById("output"); $(document).ready(function() { getIoModeInfo(); initPlcErrorTable(); getPlcError(); initSiteTable(); getSite(); }); // 实时访问 setInterval(function () { getPlcError(); starGetSite(); getIoModeInfo(); }, 1000); setInterval(function () { getSiteOutput(); },500); function starGetSite() { if (stop) { return } else { getSite(); } } var ioModeData; function getIoModeInfo() { $.ajax({ url: baseUrl+ "/site/io/mode/info/site", headers: {'token': localStorage.getItem('token')}, method: 'GET', success: function (res) { if (res.code === 200){ ioModeData = res.data; ioModeData.forEach(function (e) { $("#io-mode-"+e.floor).html(e.modeDesc); }) } else if (res.code === 403){ window.location.href = baseUrl+"/login"; } else { console.log(res.msg); } } }); } /** * 强制切换入出库模式 */ function ioModeSwitch(el) { var floor = el.split("-")[2]; if (ioModeData != null && ioModeData.length > 1) { ioModeData.forEach(function(e) { if (e.floor === Number(floor)) { if (e.modeVal === 3 || e.modeVal === 4) { layer.confirm('确定切换为入库模式吗?',function () { $.ajax({ url: baseUrl+ "/site/io/mode/action/site", headers: {'token': localStorage.getItem('token')}, data: {floor: e.floor}, method: 'POST', 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); } } }); layer.closeAll(); }) } } }); } } // plc异常信息表获取 function getPlcError() { var tableEl = $('#plc-error-table'); tableEl.children("tr").children("td").html(""); $.ajax({ url: baseUrl+ "/site/table/plc/errors", 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++){ var tr = tableEl.find("tr").eq(i); tr.children("td").eq(0).html(table[i-1].no); tr.children("td").eq(1).html(table[i-1].plcDesc); tr.children("td").eq(2).html(table[i-1].error); } } else if (res.code === 403){ window.location.href = baseUrl+"/login"; } else { console.log(res.msg); } } }); } // 站点信息表获取 function getSite() { var tableEl = $('#site-table'); $.ajax({ url: baseUrl+ "/site/table/site", headers: {'token': localStorage.getItem('token')}, method: 'POST', success: function (res) { if (res.code === 200){ var table = res.data; if (table.length > siteTableBlankRows && table.length !== siteTableFullRows) { initSiteTable(table.length-siteTableBlankRows); siteTableFullRows = 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].devNo); setVal(tr.children("td").eq(1), table[i-1].workNo); setVal(tr.children("td").eq(2), table[i-1].autoing); setVal(tr.children("td").eq(3), table[i-1].loading); setVal(tr.children("td").eq(4), table[i-1].inEnable); setVal(tr.children("td").eq(5), table[i-1].outEnable); setVal(tr.children("td").eq(6), table[i-1].pakMk); setVal(tr.children("td").eq(7), table[i-1].emptyMk); setVal(tr.children("td").eq(8), table[i-1].staNo); setVal(tr.children("td").eq(9), table[i-1].locType1); } } else if (res.code === 403){ window.location.href = baseUrl+"/login"; } else { console.log(res.msg); } } }); } // 输送设备日志输出 function getSiteOutput() { $.ajax({ url: baseUrl + "/site/output/site", headers: {'token': localStorage.getItem('token')}, method: 'POST', success: function (res) { if (res.code === 200) { output(res.data); } else if (res.code === 403) { window.location.href = baseUrl + "/login"; } else { alert(res.msg); } } }) } // 日志输出框 function output(content){ outputDom.value += content; outputDom.scrollTop = outputDom.scrollHeight; } // ------------------------------------------------------------------------------------------------ // plc异常空白表格渲染 function initPlcErrorTable(row) { var line; if (row === undefined){ var one = $('#plc-error-table thead').height(); var total = $('.plc-log-body').height(); var count = total / one; count = parseInt(count) - 1; plcErrorTableBlankRows = count; line = count; } else { line = row; } var html = ""; for (var i = 0; i < line; i ++){ html += " <tr>\n" + " <td></td>\n" + " <td></td>\n" + " <td></td>\n" + " </tr>\n"; } $('#plc-error-table tbody').after(html); } // 站点空白表格渲染 function initSiteTable(row) { var line; if (row === undefined){ var one = $('#site-table thead').height(); var total = $('#site-monitor').height(); var count = total / one; count = parseInt(count) - 1; siteTableBlankRows = count; line = count; } else { line = row; } var html = ""; for (var i = 0; i < line; i ++){ html += " <tr>\n" + " <td></td>\n" + " <td></td>\n" + " <td></td>\n" + " <td></td>\n" + " <td></td>\n" + " <td></td>\n" + " <td></td>\n" + " <td></td>\n" + " <td></td>\n" + " <td></td>\n" + " </tr>\n"; } $('#site-table tbody').after(html); } // 详情操作 ------------------------------------------------------------------------- var layerDetl; $(document).on('dblclick ','#site-table tr', function () { stop = true var siteId = $(this).children("td").eq(0).html(); if (siteId !== null && siteId !== "") { layerDetl = layer.open({ type: 1, title: false, shadeClose: true, offset: 'rt', anim: 5, shade: [0], area: ['340px', '255px'], closeBtn: 0, content: $("#site-detl"), success: function(layero, index){ http.get(baseUrl+ "/site/detl/"+siteId, null, function (res) { $('#siteId').val(siteId); $('#workNo').val(res.data.workNo); $('#staNo').val(res.data.staNo); $('#pakMk').val(res.data.pakMk); }) }, end: function () { $('#siteId').val(""); $('#workNo').val(""); $('#staNo').val(""); $('#pakMk').val(""); stop = false } }) } }); $(document).on('click ','#save', function () { http.post(baseUrl+ "/site//detl/update", { siteId: $('#siteId').val(), workNo: $('#workNo').val(), staNo: $('#staNo').val(), pakMk: $('#pakMk').val() }, function (res) { layer.msg("修改成功",{icon: 1,}); }) }) $(document).on('click ','#cancel', function () { $('#siteId').val(""); $('#workNo').val(""); $('#staNo').val(""); $('#pakMk').val(""); layer.close(layerDetl); }) </script> </html> src/main/webapp/views/realtimeWatch/pipeline2.html
@@ -238,7 +238,7 @@ var tableEl = $('#plc-error-table'); tableEl.children("tr").children("td").html(""); $.ajax({ url: baseUrl+ "/site/table/plc/errors", url: baseUrl+ "/site/table/plc/errors2", headers: {'token': localStorage.getItem('token')}, method: 'POST', success: function (res) { @@ -263,7 +263,7 @@ function getSite() { var tableEl = $('#site-table'); $.ajax({ url: baseUrl+ "/site/table/site", url: baseUrl+ "/site/table/site2", headers: {'token': localStorage.getItem('token')}, method: 'POST', success: function (res) { src/main/webapp/views/realtimeWatch/rgv.html
@@ -128,8 +128,8 @@ <th>状态</th> <th>源站</th> <th>目标站</th> <th>源库位</th> <th>目标库位</th> <th>托盘码</th> <!-- <th>目标库位</th>--> <th>走行速度(m/min)</th> <!-- <th>升降速度(m/min)</th>--> <!-- <th>叉牙速度(m/min)</th>--> @@ -359,15 +359,9 @@ setVal(tr.children("td").eq(2), table[i-1].status); setVal(tr.children("td").eq(3), table[i-1].sourceStaNo); setVal(tr.children("td").eq(4), table[i-1].staNo); setVal(tr.children("td").eq(5), table[i-1].sourceLocNo); setVal(tr.children("td").eq(6), table[i-1].locNo); setVal(tr.children("td").eq(7), table[i-1].xspeed); // setVal(tr.children("td").eq(8), table[i-1].yspeed); // setVal(tr.children("td").eq(9), table[i-1].zspeed); // setVal(tr.children("td").eq(10), table[i-1].xdistance); // setVal(tr.children("td").eq(11), table[i-1].ydistance); // setVal(tr.children("td").eq(12), table[i-1].xduration); // setVal(tr.children("td").eq(13), table[i-1].yduration); setVal(tr.children("td").eq(5), table[i-1].origin); setVal(tr.children("td").eq(6), table[i-1].xspeed); } } else if (res.code === 403){ window.location.href = baseUrl+"/login";