From f837a9d55af6eedbf684c470de9a7bb926ba0633 Mon Sep 17 00:00:00 2001 From: zhang <zc857179121@qq.com> Date: 星期三, 30 四月 2025 12:26:09 +0800 Subject: [PATCH] 1 --- src/main/java/com/zy/asrs/controller/DevopsController.java | 152 ++++++++++++ src/main/java/com/zy/asrs/domain/devops/DevopsMessage.java | 16 + src/main/webapp/views/index.html | 1 src/main/java/com/zy/asrs/domain/devops/ErrorType.java | 58 ++++ src/main/webapp/views/devops.html | 437 ++++++++++++++++++++++++++++++++++++ 5 files changed, 664 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/zy/asrs/controller/DevopsController.java b/src/main/java/com/zy/asrs/controller/DevopsController.java new file mode 100644 index 0000000..8da1cf5 --- /dev/null +++ b/src/main/java/com/zy/asrs/controller/DevopsController.java @@ -0,0 +1,152 @@ +package com.zy.asrs.controller; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +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.entity.WrkMast; +import com.zy.asrs.mapper.WrkMastMapper; +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.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.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("/devops") +public class DevopsController { + + @Autowired + private WrkMastService wrkMastService; + + @Autowired + private SlaveProperties slaveProperties; + + @Autowired + private WrkMastMapper wrkMastMapper; + + @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()).in("io_type", 101, 103, 107).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("璇ュ伐浣滄。姝e湪鍑哄簱锛岃绋嶅悗"); + } else { + devopsMessage.setError(working.getWrkNo() + "鍙峰伐浣滄。姝e湪鍑哄簱"); + } + continue; + } + List<ErrorType> staError = isStaError(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()); + } + } + List<ErrorType> crnError = isCrnError(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(WrkMast staNo) { + List<ErrorType> types = new ArrayList<>(); + DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1); + StaProtocol staProtocol = devpThread.getStation().get(staNo); + if (staProtocol == null) { + types.add(ErrorType.ERROR); + return types; + } else { + staProtocol = staProtocol.clone(); + } + if (staProtocol.isAutoing()) { + types.add(ErrorType.FEIZIDONG); + } + if (staProtocol.isLoading()) { + types.add(ErrorType.YOUWU); + } + if (staProtocol.getWorkNo() == 0) { + types.add(ErrorType.GONGZUOHAO); + } + if (staProtocol.getStaNo() == null) { + types.add(ErrorType.STANO); + } + return types; + } + + + private List<ErrorType> isCrnError(WrkMast wrkMast) { + List<ErrorType> types = new ArrayList<>(); + CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkMast.getCrnNo()); + CrnProtocol crnProtocol = crnThread.getCrnProtocol(); + + if (crnProtocol.getStatusType() == CrnStatusType.IDLE) { + + } + if (crnProtocol.getTaskNo() == 0) { + + } + if (crnProtocol.getModeType() == CrnModeType.AUTO) { + + } + if (crnProtocol.getLoaded() == 0) { + + } + 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); + } + if (crnProtocol.modeType == CrnModeType.AUTO) { + types.add(ErrorType.FEIZIDONG); + } +// if (crnProtocol.getTaskNo().equals(wrkMast.getWrkNo().shortValue())) { +// types.add(ErrorType.CRNGONGZUOHAO); +// } + return types; + } + + +} diff --git a/src/main/java/com/zy/asrs/domain/devops/DevopsMessage.java b/src/main/java/com/zy/asrs/domain/devops/DevopsMessage.java new file mode 100644 index 0000000..7266424 --- /dev/null +++ b/src/main/java/com/zy/asrs/domain/devops/DevopsMessage.java @@ -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; + +} diff --git a/src/main/java/com/zy/asrs/domain/devops/ErrorType.java b/src/main/java/com/zy/asrs/domain/devops/ErrorType.java new file mode 100644 index 0000000..fef3fc6 --- /dev/null +++ b/src/main/java/com/zy/asrs/domain/devops/ErrorType.java @@ -0,0 +1,58 @@ +package com.zy.asrs.domain.devops; + +/** + * 鍫嗗灈鏈虹姸鎬佹灇涓� + */ +public enum ErrorType { + ERROR(10000, "绔欑偣瀵硅薄涓虹┖","鑱旂郴鎶�鏈汉鍛�"), + WUWU(10001, "鏃犵墿", "1"), + YOUWU(10002, "鏈夌墿", "1"), + STANO(10003, "鐩爣绔欑偣瀛樺湪绔欑偣鍙�", "1"), + FEIZIDONG(10004, "鐩爣绔欑偣闈炶嚜鍔�", "1"), + GONGZUOHAO(10005, "鐩爣绔欑偣瀛樺湪宸ヤ綔鍙�", "1"), + + + WORKING(11001, "鍫嗗灈鏈哄湪宸ヤ綔涓�", "1"), + HOME(11002, "璐у弶涓嶅湪鍘熶綅", "1"), + CRNGONGZUOHAO(11003, "鍫嗗灈鏈哄湪宸ヤ綔涓�", "1"), + + ; + 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; + } + + +} + diff --git a/src/main/webapp/views/devops.html b/src/main/webapp/views/devops.html new file mode 100644 index 0000000..7aa8ca5 --- /dev/null +++ b/src/main/webapp/views/devops.html @@ -0,0 +1,437 @@ +<!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/pipeline.css"> + <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">宸ヤ綔妗e彿</th> + <th style="width: 400px">鍘熷洜</th> + <th style="width: 400px">瑙e喅鏂规硶</th> + </tr> + </thead> + <tbody> + + </tbody> + </table> + </div> + </div> + + <!-- 绔欑偣鐘舵�佹暟鎹洃鎺х増 --> + <div id="site-monitor" class="main-board"> + <div> + <span style="color: #1E9FFF">鏃犳硶鍏ュ簱鍘熷洜鍒ゆ柇:</span> + </div> + <!-- 琛ㄦ牸 --> + <!--鍥哄畾琛ㄥご table 鍔爐able-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> \ No newline at end of file diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html index e5fe9d1..0caa66c 100644 --- a/src/main/webapp/views/index.html +++ b/src/main/webapp/views/index.html @@ -24,6 +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> </ul> </div> </div> -- Gitblit v1.9.1