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