src/main/java/com/zy/asrs/controller/DevopsController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/domain/devops/DevopsMessage.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/domain/devops/ErrorType.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/model/protocol/StaProtocol.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/properties/SlaveProperties.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/static/css/devops.css | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/views/devops.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/views/index.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/controller/DevopsController.java
@@ -6,7 +6,6 @@ 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; @@ -20,7 +19,6 @@ 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; @@ -30,9 +28,7 @@ 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") @@ -59,15 +55,26 @@ //先查询堆垛机是否在工作 WrkMast working = wrkMastMapper.selectWorking(crnSlave.getId()); for (WrkMast wrkMast : wrkMasts) { CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkMast.getCrnNo()); CrnProtocol crnProtocol = crnThread.getCrnProtocol(); if (crnProtocol == null) { crnProtocol = new CrnProtocol(); } devopsMessage = new DevopsMessage(); devopsMessage.setWrkNo(wrkMast.getWrkNo()); if (working != null) { //在工作,则判断是否未当前这条 if (working.getWrkNo().equals(wrkMast.getWrkNo())) { devopsMessage.setError("该工作档正在出库,请稍后"); if (crnProtocol.getTaskNo().intValue() == working.getWrkNo()) { devopsMessage.setError("该工作档正在执行,请稍后"); } else { devopsMessage.setError("该工作档状态不对,与堆垛机的工作号不匹配"); devopsMessage.setMethod("结合任务情况进行操作;如果实际已完成,就将工作档完成;如果未完成,则调整工作档状态"); } } else { devopsMessage.setError(working.getWrkNo() + "号工作档正在出库,请稍后"); devopsMessage.setError(working.getWrkNo() + "号工作档正在执行,请稍后"); } devopsMessages.add(devopsMessage); continue; } DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1); @@ -75,23 +82,21 @@ List<ErrorType> staError = isStaError(staProtocol, wrkMast); for (ErrorType type : staError) { if (!Cools.isEmpty(devopsMessage.getError())) { devopsMessage.setError(devopsMessage.getError() + "\n" + type.getDesc()); devopsMessage.setMethod(devopsMessage.getMethod() + "\n" + type.getMethod()); devopsMessage.setError(devopsMessage.getError() + ";" + type.getDesc()); devopsMessage.setMethod(devopsMessage.getMethod() + ";" + type.getMethod()); } else { devopsMessage.setError(type.getDesc()+ ";"); devopsMessage.setMethod(type.getMethod()+ ";" ); 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() + "\n" + type.getDesc()); devopsMessage.setMethod(devopsMessage.getMethod() + "\n" + type.getMethod()); devopsMessage.setError(devopsMessage.getError() + ";" + type.getDesc()); devopsMessage.setMethod(devopsMessage.getMethod() + ";" + type.getMethod()); } else { devopsMessage.setError(type.getDesc()+ ";"); devopsMessage.setMethod(type.getMethod()+ ";"); devopsMessage.setError(type.getDesc()); devopsMessage.setMethod(type.getMethod()); } } devopsMessages.add(devopsMessage); @@ -174,32 +179,104 @@ @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<DevopsMessage> devopsMessages = new ArrayList<>(); DevopsMessage devopsMessage; List<Integer> outSta = slaveProperties.getOutSta(); List<Integer> inSta = slaveProperties.getInSta(); // 持久数据 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; for (Integer out : outSta) { for (BasDevp devp : basDevps) { if (devp.getDevNo().equals(out)) { devopsMessage = new DevopsMessage(); devopsMessage.setStaNo(out); devopsMessage.setType("出库站点"); if (devp.getLoading().equalsIgnoreCase("Y")) { devopsMessage.setError(ErrorType.YOUWU.getDesc()); devopsMessage.setMethod("请将物料挪走,才能出库"); } else { List<ErrorType> crnError = isOutStaError(devp); 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); } } SiteTableVo vo = new SiteTableVo(); vo.setDevNo(devp.getDevNo()); // 站点编号 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.setStaNo(staProtocol.getStaNo()); // 目标站 vo.setEmptyMk(staProtocol.isEmptyMk()?"Y":"N"); // 空板信号 list.add(vo); } return R.ok().add(list); for (Integer in : inSta) { for (BasDevp devp : basDevps) { if (devp.getDevNo().equals(in)) { devopsMessage = new DevopsMessage(); devopsMessage.setStaNo(in); devopsMessage.setType("入库站点"); if (devp.getLoading().equalsIgnoreCase("Y")) { List<ErrorType> crnError = isInStaError(devp); 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()); } } } else { devopsMessage.setError(ErrorType.WUWU.getDesc()); devopsMessage.setMethod(ErrorType.WUWU.getMethod()); } devopsMessages.add(devopsMessage); } } } return R.ok().add(devopsMessages); } private List<ErrorType> isOutStaError(BasDevp devp) { List<ErrorType> types = new ArrayList<>(); // 自动 if (devp.getAutoing().equalsIgnoreCase("Y")) { types.add(ErrorType.FEIZIDONG); } // 有物 if (devp.getLoading().equalsIgnoreCase("Y")) { types.add(ErrorType.YOUWU); } // 工作号是否为0 if (devp.getWrkNo() != null) { types.add(ErrorType.GONGZUOHAO); } // 目标站点 //TODO // if (devp.getStaNo() == null) { // types.add(ErrorType.STANO); // } return types; } private List<ErrorType> isInStaError(BasDevp devp) { List<ErrorType> types = new ArrayList<>(); // 自动 if (devp.getAutoing().equalsIgnoreCase("Y")) { types.add(ErrorType.FEIZIDONG); } // 工作号是否为0 if (devp.getWrkNo() != null) { types.add(ErrorType.GONGZUOHAO); } // 目标站点 // if (staProtocol.getStaNo() == null) { // types.add(ErrorType.STANO); // } return types; } } src/main/java/com/zy/asrs/domain/devops/DevopsMessage.java
@@ -7,6 +7,10 @@ @Data public class DevopsMessage implements Serializable { private String type; private Integer staNo; private Integer wrkNo; private String error; src/main/java/com/zy/asrs/domain/devops/ErrorType.java
@@ -4,7 +4,7 @@ * 堆垛机状态枚举 */ public enum ErrorType { ERROR(10000, "站点对象为空","联系技术人员"), ERROR(10000, "站点对象为空","未连接到plc"), WUWU(10001, "站点无物", "请检查托盘是否走到位"), YOUWU(10002, "站点有物", "请检查光电是否落灰"), STANO(10003, "目标站点存在站点号", "缺少目标站点"), @@ -12,7 +12,7 @@ GONGZUOHAO(10005, "目标站点存在工作号", "目标站点存在工作号,请检查"), WORKING(11001, "堆垛机工作中", "堆垛机工作中"), WORKING(11001, "堆垛机工作中", "堆垛机上存在工作号"), HOME(11002, "货叉不在原位", "请将货叉回中"), CRNGONGZUOHAO(11003, "堆垛机存在工作号", "堆垛机存在工作号,请检查该任务是否已经完成"), LOAD(11004, "堆垛机的载物台有物", "堆垛机的载物台有物,请检查光电"), src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java
@@ -19,6 +19,11 @@ // 有物 private String loading = "-"; // 能入 private String inCan = "-"; // 能出 private String outCan = "-"; // 可入 private String inEnable = "-"; @@ -26,6 +31,9 @@ // 可出 private String outEnable = "-"; private String barcode ; // 需求1 private String pakMk = "-"; src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -54,6 +54,7 @@ // 隔壁站点(台车位置) private String nearbySta; private String barcode; //lfd入库印记 当stamp>=2时才入库 private Integer stamp = 0; src/main/java/com/zy/core/properties/SlaveProperties.java
@@ -26,6 +26,10 @@ private boolean doubleDeep; private List<Integer> inSta = new ArrayList<>(); private List<Integer> outSta = new ArrayList<>(); private List<Integer> doubleLocs = new ArrayList<>(); private int groupCount; src/main/resources/application.yml
@@ -8,7 +8,7 @@ name: @pom.build.finalName@ datasource: driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver url: jdbc:sqlserver://127.0.0.1:1433;databasename=devopsasrs url: jdbc:sqlserver://127.0.0.1:1433;databasename=ytflasrs username: sa password: sa@123 mvc: @@ -38,6 +38,8 @@ # 下位机配置 wcs-slave: inSta: 102,104 outSta: 101,103 # 双深 doubleDeep: true # 双深库位排号 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; } #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/devops.html
@@ -9,7 +9,7 @@ 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/pipeline.css"> <link rel="stylesheet" type="text/css" href="../static/css/devops.css?v=3"> <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> @@ -57,7 +57,7 @@ <div id="plc-error" class="main-board" style="padding-left: 10px"> <div class="plc-log-body"> <div> <span style="color: #1E9FFF">出库工作档:</span> <span style="color: #1E9FFF">工作档:</span> </div> <table id="plc-error-table"> <thead> @@ -77,24 +77,18 @@ <!-- 站点状态数据监控版 --> <div id="site-monitor" class="main-board"> <div> <span style="color: #1E9FFF">无法入库原因判断:</span> <span style="color: #1E9FFF">无法出入库原因判断:</span> </div> <!-- 表格 --> <!--固定表头 table 加table-layout: fixed; th 加 position:sticky;top: 0;--> <table id="site-table" style="table-layout: fixed;"> <table id="site-table" > <!-- 表头 --> <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> <th style="width: 180px">类型</th> <th style="width: 150px">站号</th> <th style="width: 400px">不符合的条件</th> <th style="width: 300px">解决</th> </tr> </thead> <!-- 表格内容 --> @@ -102,45 +96,9 @@ </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> @@ -154,7 +112,7 @@ // 实际行数 var plcErrorTableFullRows = 0; var siteTableFullRows = 0; var outputDom = document.getElementById("output"); //var outputDom = document.getElementById("output"); $(document).ready(function () { initPlcErrorTable(); getPlcError(); @@ -167,7 +125,7 @@ starGetSite(); }, 1000); setInterval(function () { getSiteOutput(); //getSiteOutput(); }, 500); function starGetSite() { @@ -221,16 +179,11 @@ } 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].emptyMk); setVal(tr.children("td").eq(9), table[i - 1].locType1); tr.children("td").eq(0).html(table[i - 1].type); tr.children("td").eq(1).html(table[i - 1].staNo); tr.children("td").eq(2).html(table[i - 1].error); tr.children("td").eq(3).html(table[i - 1].method); } } else if (res.code === 403) { window.location.href = baseUrl + "/login"; @@ -239,30 +192,6 @@ } } }); } // 输送设备日志输出 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; } // ------------------------------------------------------------------------------------------------ @@ -311,70 +240,12 @@ " <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,7 +24,7 @@ <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="devops" onclick="nav(this.id)" class="nav-unselect" href="#">执行检测</a></li> </ul> </div> </div>