src/main/java/com/zy/asrs/controller/CrnController.java
@@ -385,7 +385,21 @@ return crnControl(command)?R.ok():R.error(); } @ManagerAuth(memo = "恢复联机任务") @PostMapping("/operator/taskRe") public R taskRe(CrnOperatorParam param){ CrnCommand command = new CrnCommand(); command.setTaskRe((short)1); return crnControl(command)?R.ok():R.error(); } @ManagerAuth(memo = "清除联机任务") @PostMapping("/operator/taskClear") public R crnTaskClear(CrnOperatorParam param){ CrnCommand command = new CrnCommand(); command.setTaskClear((short)1); return crnControl(command)?R.ok():R.error(); } // @ManagerAuth(memo = "暂停") // @PostMapping("/operator/pause") src/main/java/com/zy/asrs/controller/DevopsController.java
New file @@ -0,0 +1,205 @@ package com.zy.asrs.controller; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.annotations.ManagerAuth; import com.core.common.Cools; import com.core.common.R; import com.zy.asrs.domain.devops.DevopsMessage; import com.zy.asrs.domain.devops.ErrorType; import com.zy.asrs.domain.vo.SiteTableVo; import com.zy.asrs.entity.BasDevp; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.mapper.WrkMastMapper; import com.zy.asrs.service.BasDevpService; import com.zy.asrs.service.WrkMastService; import com.zy.core.CrnThread; import com.zy.core.DevpThread; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.CrnForkPosType; import com.zy.core.enums.CrnModeType; import com.zy.core.enums.CrnStatusType; import com.zy.core.enums.SlaveType; import com.zy.core.model.CrnSlave; import com.zy.core.model.DevpSlave; import com.zy.core.model.protocol.CrnProtocol; import com.zy.core.model.protocol.StaProtocol; import com.zy.core.properties.SlaveProperties; 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.HashMap; import java.util.List; import java.util.Map; @RestController @RequestMapping("/devops") public class DevopsController { @Autowired private WrkMastService wrkMastService; @Autowired private SlaveProperties slaveProperties; @Autowired private WrkMastMapper wrkMastMapper; @Autowired private BasDevpService basDevpService; @RequestMapping("/wrkMast/list") public R list() { List<DevopsMessage> devopsMessages = new ArrayList<>(); DevopsMessage devopsMessage; for (CrnSlave crnSlave : slaveProperties.getCrn()) { List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("crn_no", crnSlave.getId()).orderBy("wrk_sts", false)); //先查询堆垛机是否在工作 WrkMast working = wrkMastMapper.selectWorking(crnSlave.getId()); for (WrkMast wrkMast : wrkMasts) { devopsMessage = new DevopsMessage(); devopsMessage.setWrkNo(wrkMast.getWrkNo()); if (working != null) { //在工作,则判断是否未当前这条 if (working.getWrkNo().equals(wrkMast.getWrkNo())) { devopsMessage.setError("该工作档正在出库,请稍后"); } else { devopsMessage.setError(working.getWrkNo() + "号工作档正在出库,请稍后"); } continue; } DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1); StaProtocol staProtocol = devpThread.getStation().get(wrkMast.getStaNo()); List<ErrorType> staError = isStaError(staProtocol, wrkMast); for (ErrorType type : staError) { if (!Cools.isEmpty(devopsMessage.getError())) { devopsMessage.setError(devopsMessage.getError() + ";" + type.getDesc()); devopsMessage.setMethod(devopsMessage.getMethod() + ";" + type.getMethod()); } else { devopsMessage.setError(type.getDesc()); devopsMessage.setMethod(type.getMethod()); } } CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkMast.getCrnNo()); CrnProtocol crnProtocol = crnThread.getCrnProtocol(); List<ErrorType> crnError = isCrnError(crnProtocol, wrkMast); for (ErrorType type : crnError) { if (!Cools.isEmpty(devopsMessage.getError())) { devopsMessage.setError(devopsMessage.getError() + ";" + type.getDesc()); devopsMessage.setMethod(devopsMessage.getMethod() + ";" + type.getMethod()); } else { devopsMessage.setError(type.getDesc()); devopsMessage.setMethod(type.getMethod()); } } devopsMessages.add(devopsMessage); } } return R.ok(devopsMessages); } private List<ErrorType> isStaError(StaProtocol staProtocol, WrkMast wrkMast) { List<ErrorType> types = new ArrayList<>(); if (staProtocol == null) { types.add(ErrorType.ERROR); return types; } else { staProtocol = staProtocol.clone(); } // 自动 if (staProtocol.isAutoing()) { types.add(ErrorType.FEIZIDONG); } if (wrkMast.getIoType() > 100) { // 出库校验 // 有物 if (staProtocol.isLoading()) { types.add(ErrorType.YOUWU); } // 工作号是否为0 if (staProtocol.getWorkNo() == 0) { types.add(ErrorType.GONGZUOHAO); } // 目标站点 if (staProtocol.getStaNo() == null) { types.add(ErrorType.STANO); } } else { // 入库校验 } return types; } private List<ErrorType> isCrnError(CrnProtocol crnProtocol, WrkMast wrkMast) { List<ErrorType> types = new ArrayList<>(); // 堆垛机是否空闲 if (crnProtocol.getStatusType() == CrnStatusType.IDLE) { types.add(ErrorType.CRN_NO_IDLE); } //任务号是否为0 if (crnProtocol.getTaskNo() == 0) { types.add(ErrorType.WORKING); } // 堆垛机是否自动 if (crnProtocol.getModeType() == CrnModeType.AUTO) { types.add(ErrorType.CRN_FEIZIDONG); } // 载货台有物 if (crnProtocol.getLoaded() == 0) { types.add(ErrorType.LOAD); } // 堆垛机取货中 if (crnProtocol.statusType == CrnStatusType.FETCHING) { types.add(ErrorType.WORKING); } // 放货中 if (crnProtocol.statusType == CrnStatusType.PUTTING) { types.add(ErrorType.WORKING); } // 堆垛机等待确认状态 if (crnProtocol.statusType == CrnStatusType.WAITING) { types.add(ErrorType.WORKING); } // 货叉是否会回中 if (crnProtocol.forkPosType == CrnForkPosType.HOME) { types.add(ErrorType.HOME); } return types; } @PostMapping("/site/list") @ManagerAuth(memo = "站点信息表") public R siteTable() { 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) { StaProtocol staProtocol = station.get(devp.getDevNo()); if (null == staProtocol) { continue; } SiteTableVo vo = new SiteTableVo(); vo.setDevNo(devp.getDevNo()); // 站点编号 vo.setWorkNo(Integer.valueOf(staProtocol.getWorkNo())); // 工作号 vo.setAutoing(staProtocol.isAutoing() ? "自动" : "非自动"); // 自动 vo.setLoading(staProtocol.isLoading() ? "有物" : "未检测到物料"); // 有物 vo.setInEnable(staProtocol.isInEnable() ? "可入" : "不可入"); // 可入 vo.setOutEnable(staProtocol.isOutEnable() ? "可出" : "不可出"); // 可出 vo.setPakMk(staProtocol.isPakMk() ? "有" : "缺少入库标记"); // 入库标记 vo.setStaNo(staProtocol.getStaNo()); // 目标站 vo.setBarcode(staProtocol.getBarcode()); list.add(vo); } return R.ok().add(list); } } src/main/java/com/zy/asrs/domain/devops/DevopsMessage.java
New file @@ -0,0 +1,16 @@ package com.zy.asrs.domain.devops; import lombok.Data; import java.io.Serializable; @Data public class DevopsMessage implements Serializable { private Integer wrkNo; private String error; private String method; } src/main/java/com/zy/asrs/domain/devops/ErrorType.java
New file @@ -0,0 +1,62 @@ package com.zy.asrs.domain.devops; /** * 堆垛机状态枚举 */ public enum ErrorType { ERROR(10000, "站点对象为空","联系技术人员"), WUWU(10001, "站点无物", "请检查托盘是否走到位"), YOUWU(10002, "站点有物", "请检查光电是否落灰"), STANO(10003, "目标站点存在站点号", "缺少目标站点"), FEIZIDONG(10004, "目标站点非自动", "站点非自动状态,请切换"), GONGZUOHAO(10005, "目标站点存在工作号", "目标站点存在工作号,请检查"), WORKING(11001, "堆垛机工作中", "堆垛机工作中"), HOME(11002, "货叉不在原位", "请将货叉回中"), CRNGONGZUOHAO(11003, "堆垛机存在工作号", "堆垛机存在工作号,请检查该任务是否已经完成"), LOAD(11004, "堆垛机的载物台有物", "堆垛机的载物台有物,请检查光电"), CRN_FEIZIDONG(11004, "堆垛机非自动", "请将堆垛机切自动"), CRN_NO_IDLE(11004, "堆垛机非空闲", "请将堆垛机切自动"), ; private Integer code; private String desc; private String method; ErrorType(Integer code, String desc, String method) { this.code = code; this.desc = desc; this.method = method; } public String getMethod() { return method; } public void setMethod(String method) { this.method = method; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } } src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java
@@ -34,7 +34,7 @@ // 目标站 private Short staNo = 0; private String barcode; //高低库位 private String locType1 = "-"; //入库模式 @@ -45,4 +45,7 @@ private String idle = "-"; //已完成工作号 private String finishWorkNo = "-"; // private String mome = "-"; } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -309,6 +309,10 @@ if (wrkMast == null) { return; } if (wrkMast.getPltType().shortValue() != staProtocol.getFinishWorkNo()) { log.info("工作档和完结工作号不匹配,{},{}", wrkMast.getPltType(), staProtocol.getFinishWorkNo()); return; } Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "2.5F_Mode")); if (Cools.isEmpty(config) || config.getValue().equals("false")) { return; @@ -352,11 +356,19 @@ // 遍历拣料入库口 for (DevpSlave.Sta pickSta : devp.getPickSta()) { // 获取条码扫描仪信息 BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, pickSta.getBarcode()); if (barcodeThread == null) { // BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, pickSta.getBarcode()); // if (barcodeThread == null) { // continue; // } // 获取拣料入库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } String barcode = barcodeThread.getBarcode(); String barcode = staProtocol.getBarcode(); if (!Cools.isEmpty(barcode)) { // News.info(""+mark+" - 1"+" - {}号条码扫描器检测条码信息:{}", pickSta.getBarcode(), barcode); if ("NG".endsWith(barcode) || "NoRead".equals(barcode)) { @@ -366,14 +378,6 @@ continue; } // 获取拣料入库站信息 SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } // // 入出库模式判断 // if (devpThread.ioMode != IoModeType.PAKIN_MODE) { continue; } @@ -465,7 +469,7 @@ // 更新站点信息 且 下发plc命令 staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); staProtocol.setStaNo((short) 161); staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); log.error("输送线下发5:" + wrkMast.getWrkNo() + "," + wrkMast.getStaNo()); @@ -506,11 +510,8 @@ && staProtocol.isPakMk()) { // 获取条码扫描仪信息 BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, pickSta.getBarcode()); if (barcodeThread == null) { continue; } String barcode = barcodeThread.getBarcode(); String barcode = staProtocol.getBarcode(); if (!Cools.isEmpty(barcode)) { // log.info("{}号条码扫描器检测条码信息:{}", pickSta.getBarcode(), barcode); if ("00000000".equals(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || "empty".equals(barcode)) { @@ -604,7 +605,7 @@ try { // 更新站点信息 且 下发plc命令 staProtocol.setWorkNo(dto.getWorkNo().shortValue()); staProtocol.setStaNo((short) 161); staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); @@ -753,6 +754,9 @@ if (wrkMast == null) { continue; } if (wrkMast.getWrkNo().shortValue() != staProtocol.getFinishWorkNo()) { continue; } // 判断工作档条件 if (wrkMast.getIoType() < 100 || wrkMast.getStaNo() == null || wrkMast.getSourceStaNo() == null) { continue; @@ -760,7 +764,7 @@ // 下发站点信息 staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); staProtocol.setStaNo(RouteUtils.CrnStaEnd(1031, 1135)); staProtocol.setStaNo((short) 1031); if (!MessageQueue.offer(SlaveType.Devp, devpSlave.getId(), new Task(2, staProtocol))) { log.info(staProtocol.getWorkNo() + "," + staProtocol.getStaNo() + "输送线出库命令下发失败222"); continue; src/main/java/com/zy/common/model/LocTypeDto.java
@@ -31,14 +31,18 @@ } public LocTypeDto(StaProtocol staProtocol) { // if (staProtocol.isHigh() == staProtocol.isLow()) { // throw new CoolException("plc高低检测异常"); // } if (staProtocol.getSiteId() == 106 || staProtocol.getSiteId() == 159){ this.locType1 = 2; // 高库位 if (staProtocol.isHigh() && !staProtocol.isLow()) { this.locType1 = 2; } else if (!staProtocol.isHigh() && staProtocol.isLow()) { this.locType1 = 1; }else { this.locType1 = 1; // 低库位 throw new CoolException("plc高低检测异常"); } // if (staProtocol.getSiteId() == 106 || staProtocol.getSiteId() == 159){ // this.locType1 = 2; // 高库位 // }else { // this.locType1 = 1; // 低库位 // } } /** src/main/java/com/zy/core/MainProcess.java
@@ -51,7 +51,7 @@ // mainService.ioConvert(); // 拣料、并板、盘点再入库 // mainService.stnToCrnStnPick(3); mainService.stnToCrnStnPick(3); mainService.stnToCrnStnPick2(); // 入库 ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档 src/main/java/com/zy/core/model/command/CrnCommand.java
@@ -20,6 +20,10 @@ // 任务完成确认位 private Short ackFinish = 0; private Short taskRe = 0; private Short taskClear = 0; // 任务号 private Short taskNo = 0; @@ -74,6 +78,8 @@ // 任务确认 0:未确认 1:已确认 private Short command = 0; private boolean traySize = false; public void setTaskMode(Short taskMode){ src/main/resources/application.yml
@@ -176,6 +176,19 @@ led: ${wcs-slave.led[3].id} outSta[4]: staNo: 1135 pickSta[0]: staNo: 1112 led: ${wcs-slave.led[0].id} pickSta[1]: staNo: 1122 led: ${wcs-slave.led[2].id} pickSta[2]: staNo: 1114 led: ${wcs-slave.led[1].id} pickSta[3]: staNo: 1124 led: ${wcs-slave.led[3].id} # 条码扫描仪1 src/main/webapp/static/css/devops.css
New file @@ -0,0 +1,167 @@ body { /*padding: 10px;*/ background-color: #6CA7A8; } main { background-color: #fff; height: 96%; border-radius: 5px; box-shadow: 0 0 3px rgba(0,0,0,.3); margin-bottom: 8px; } .button-window { float: left; width: 100%; height: 100%; padding: 10px; border-radius: 5px; box-shadow: 0 0 3px rgba(0 0 0 .3); } .main-board { padding-left: 1%; float: left; width: 50%; height: 100%; overflow: auto; } .main-board:first-child { border-right: 1px solid #cad9ea; } /* 表格 */ .plc-log-header { height: 15%; } .plc-log-body { height: 100%; overflow: auto; } /* 入出库模式 */ .io-mode-oper { height: 100%; /*overflow: hidden;*/ padding: 10px 20px; } .io-mode-oper fieldset { padding: 15px 0 10px 0; border-width: 1px; border-style: solid; height: 100%; } .io-mode-oper legend { text-align: center; padding: 0 10px; font-size: 16px; font-weight: 300; } /* 站点表格 */ #site-table { font-size: 12px; border-collapse: collapse; margin: 0 auto; text-align: center; } #site-table td, #site-table th { border: 1px solid #cad9ea; color: #666; height: 25px; } #site-table thead th { background-color: #CCE8EB; width: 100px; } #site-table tr:nth-child(odd) { background: #fff; } #site-table tr:nth-child(even) { background: #F5FAFA; } /* plc异常表格 */ #plc-error-table { font-size: 12px; border-collapse: collapse; margin: 0 auto; } #plc-error-table td, #plc-error-table th { border: 1px solid #cad9ea; color: #666; height: 25px; text-align: left; padding-left: 5px; } #plc-error-table thead th { background-color: #CCE8EB; width: 100px; } #plc-error-table td { color: red; } #plc-error-table tr:nth-child(odd) { background: #fff; } #plc-error-table tr:nth-child(even) { background: #F5FAFA; } /* 详情弹出层 */ #site-detl { padding: 30px 10px 0 25px; overflow: hidden; } #site-detl form { overflow: hidden; } .form-item { margin-bottom: 10px; } .form-label { display: inline-block; width: 70px; text-align: right; } .form-input { display: inline-block; padding-left: 15px; } .form-input input { outline-style: none ; border: 1px solid #ccc; border-radius: 3px; padding: 5px 8px; width: 150px; font-size: 14px; font-weight: bolder; } .form-input input:focus{ border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6) } .form-button-container { text-align: center; } .form-button { margin: 10px 10px; width: 50px; height: 30px; color:white; background-color:cornflowerblue; border-radius: 3px; border-width: 0; outline: none; font-size: 15px; text-align: center; cursor: pointer; } .form-button:hover { opacity: 0.7; } src/main/webapp/views/crn.html
@@ -207,6 +207,8 @@ <!-- <button class="item" onclick="reverseOrigin()">反原点</button>--> <!-- <button class="item" onclick="coorMove()">坐标移行</button>--> <button class="item" onclick="taskComplete()">任务完成</button> <button class="item" onclick="taskRe()">恢复联机任务</button> <button class="item" onclick="taskClear()">清除联机任务</button> <!-- <button class="item" onclick="pause()">暂停</button>--> <!-- <button class="item" onclick="boot()">启动</button>--> <!-- <button class="item" onclick="clearCommand()">清除命令</button>--> @@ -444,6 +446,20 @@ }); } // 任务完成 function taskRe() { http.post(baseUrl+"/crn/operator/taskRe", getReqParam(), function (res) { layer.msg(res.msg); }); } // 任务完成 function taskClear() { http.post(baseUrl+"/crn/operator/taskClear", getReqParam(), function (res) { layer.msg(res.msg); }); } // 暂停 function pause() { http.post(baseUrl+"/crn/operator/pause", getReqParam(), function (res) { src/main/webapp/views/devops.html
New file @@ -0,0 +1,354 @@ <!DOCTYPE html> <html lang="en"> <head> <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.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0"> <link rel="stylesheet" type="text/css" href="../static/css/normalize.css"> <link rel="stylesheet" type="text/css" href="../static/css/common.css"> <link rel="stylesheet" type="text/css" href="../static/css/devops.css?v=1"> <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script> <script type="text/javascript" src="../static/js/common.js"></script> <script type="text/javascript" src="../static/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 style="padding: 10px;height: 100%;float: left;width: 6%"> <div class="button-window"></div> </div> <div style="height: 100%;padding-left: 6%"> <div style="padding: 10px;height: 100%"> <main> <!-- plc异常日志监控版 --> <div id="plc-error" class="main-board" style="padding-left: 10px"> <div class="plc-log-body"> <div> <span style="color: #1E9FFF">工作档:</span> </div> <table id="plc-error-table"> <thead> <tr> <th style="width: 200px">工作档号</th> <th style="width: 400px">原因</th> <th style="width: 400px">解决方法</th> </tr> </thead> <tbody> </tbody> </table> </div> </div> <!-- 站点状态数据监控版 --> <div id="site-monitor" class="main-board"> <div> <span style="color: #1E9FFF">无法出入库原因判断:</span> </div> <!-- 表格 --> <!--固定表头 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> <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 () { initPlcErrorTable(); getPlcError(); initSiteTable(); getSite(); }); // 实时访问 setInterval(function () { getPlcError(); starGetSite(); }, 1000); setInterval(function () { //getSiteOutput(); }, 500); function starGetSite() { if (stop) { return } else { getSite(); } } // plc异常信息表获取 function getPlcError() { var tableEl = $('#plc-error-table'); tableEl.children("tr").children("td").html(""); $.ajax({ url: baseUrl + "/devops/wrkMast/list", 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].wrkNo); tr.children("td").eq(1).html(table[i - 1].error); tr.children("td").eq(2).html(table[i - 1].method); } } else if (res.code === 403) { window.location.href = baseUrl + "/login"; } else { console.log(res.msg); } } }); } // 站点信息表获取 function getSite() { var tableEl = $('#site-table'); $.ajax({ url: baseUrl + "/devops/site/list", 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].staNo); setVal(tr.children("td").eq(8), table[i - 1].barcode); setVal(tr.children("td").eq(9), table[i - 1].mome); } } else if (res.code === 403) { window.location.href = baseUrl + "/login"; } else { console.log(res.msg); } } }); } // ------------------------------------------------------------------------------------------------ // 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/index.html
@@ -24,6 +24,8 @@ <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="devops" 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>--> </ul> </div>