From c946b206b0923e8b9567a529b8fd5d2d684c8265 Mon Sep 17 00:00:00 2001
From: zc <zc@123>
Date: 星期六, 17 五月 2025 20:03:42 +0800
Subject: [PATCH] 完成调试

---
 src/main/java/com/zy/asrs/controller/DevopsController.java  |  205 ++++++++++++
 src/main/java/com/zy/asrs/domain/devops/DevopsMessage.java  |   16 +
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java |   42 +-
 src/main/java/com/zy/asrs/controller/CrnController.java     |   14 
 src/main/java/com/zy/core/model/command/CrnCommand.java     |    6 
 src/main/java/com/zy/common/model/LocTypeDto.java           |   18 
 src/main/webapp/views/crn.html                              |   16 +
 src/main/webapp/views/index.html                            |    4 
 src/main/java/com/zy/asrs/domain/devops/ErrorType.java      |   62 +++
 src/main/java/com/zy/core/MainProcess.java                  |    8 
 src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java        |    5 
 src/main/webapp/static/css/devops.css                       |  167 ++++++++++
 src/main/webapp/views/devops.html                           |  354 ++++++++++++++++++++++
 src/main/resources/application.yml                          |   13 
 14 files changed, 898 insertions(+), 32 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/CrnController.java b/src/main/java/com/zy/asrs/controller/CrnController.java
index e4fcfca..11082d5 100644
--- a/src/main/java/com/zy/asrs/controller/CrnController.java
+++ b/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")
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..54112ed
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/DevopsController.java
@@ -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("璇ュ伐浣滄。姝e湪鍑哄簱锛岃绋嶅悗");
+                    } else {
+                        devopsMessage.setError(working.getWrkNo() + "鍙峰伐浣滄。姝e湪鍑哄簱锛岃绋嶅悗");
+                    }
+                    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);
+    }
+}
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..80a4e21
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/devops/ErrorType.java
@@ -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;
+    }
+
+
+}
+
diff --git a/src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java b/src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java
index 77fd04d..bd81f29 100644
--- a/src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java
+++ b/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 = "-";
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index 4c738c0..a47497c 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/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("宸ヤ綔妗e拰瀹岀粨宸ヤ綔鍙蜂笉鍖归厤锛寋}锛寋}", 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 @@
             // 閬嶅巻鎷f枡鍏ュ簱鍙�
             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;
+//                }
+                // 鑾峰彇鎷f枡鍏ュ簱绔欎俊鎭�
+                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;
                 }
 
-                // 鑾峰彇鎷f枡鍏ュ簱绔欎俊鎭�
-                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;
+                    }
                     // 鍒ゆ柇宸ヤ綔妗f潯浠�
                     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;
diff --git a/src/main/java/com/zy/common/model/LocTypeDto.java b/src/main/java/com/zy/common/model/LocTypeDto.java
index 38fb7d2..6044c53 100644
--- a/src/main/java/com/zy/common/model/LocTypeDto.java
+++ b/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; // 楂樺簱浣�
-        }else {
-            this.locType1 = 1; // 浣庡簱浣�
+        if (staProtocol.isHigh() && !staProtocol.isLow()) {
+            this.locType1 = 2;
+        } else if (!staProtocol.isHigh() && staProtocol.isLow()) {
+            this.locType1 = 1;
+        } else {
+            throw new CoolException("plc楂樹綆妫�娴嬪紓甯�");
         }
+//        if (staProtocol.getSiteId() == 106 || staProtocol.getSiteId() == 159){
+//            this.locType1 = 2; // 楂樺簱浣�
+//        }else {
+//            this.locType1 = 1; // 浣庡簱浣�
+//        }
     }
 
     /**
diff --git a/src/main/java/com/zy/core/MainProcess.java b/src/main/java/com/zy/core/MainProcess.java
index fe3aa2b..59b8935 100644
--- a/src/main/java/com/zy/core/MainProcess.java
+++ b/src/main/java/com/zy/core/MainProcess.java
@@ -32,7 +32,7 @@
     /**
      * =====>>  寮�濮嬪伐浣�
      */
-    public void start(){
+    public void start() {
         thread = new Thread(() -> {
             while (!Thread.currentThread().isInterrupted()) {
                 try {
@@ -51,7 +51,7 @@
 //                    mainService.ioConvert();
 
                     // 鎷f枡銆佸苟鏉裤�佺洏鐐瑰啀鍏ュ簱
-//                    mainService.stnToCrnStnPick(3);
+                    mainService.stnToCrnStnPick(3);
                     mainService.stnToCrnStnPick2();
 
                     // 鍏ュ簱  ===>> 鍏ュ簱绔欏埌鍫嗗灈鏈虹珯锛屾牴鎹潯鐮佹壂鎻忕敓鎴愬叆搴撳伐浣滄。
@@ -61,7 +61,7 @@
 
                     // 鍑哄簱  ===>>  鍫嗗灈鏈哄嚭搴撶珯鍒板嚭搴撶珯
                     mainService.crnStnToOutStn(4);
-                    mainService. toSxk(107);
+                    mainService.toSxk(107);
                     // 鍏ュ嚭搴�  ===>>  鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂
                     mainService.crnIoExecute(5);
                     // 鍏ュ嚭搴撳寮� ===>> 鍫嗗灈鏈哄懡浠や笅鍙戝悗锛屽紓姝ヤ慨鏀瑰伐浣滄。鐘舵��
@@ -88,7 +88,7 @@
     }
 
     @PreDestroy
-    public void shutDown(){
+    public void shutDown() {
         if (thread != null) thread.interrupt();
     }
 
diff --git a/src/main/java/com/zy/core/model/command/CrnCommand.java b/src/main/java/com/zy/core/model/command/CrnCommand.java
index 6b09a73..910a717 100644
--- a/src/main/java/com/zy/core/model/command/CrnCommand.java
+++ b/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){
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index dd1c3b5..2340d08 100644
--- a/src/main/resources/application.yml
+++ b/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
diff --git a/src/main/webapp/static/css/devops.css b/src/main/webapp/static/css/devops.css
new file mode 100644
index 0000000..b40ab7c
--- /dev/null
+++ b/src/main/webapp/static/css/devops.css
@@ -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;
+}
\ No newline at end of file
diff --git a/src/main/webapp/views/crn.html b/src/main/webapp/views/crn.html
index 7c1731e..d76e511 100644
--- a/src/main/webapp/views/crn.html
+++ b/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) {
diff --git a/src/main/webapp/views/devops.html b/src/main/webapp/views/devops.html
new file mode 100644
index 0000000..90321ba
--- /dev/null
+++ b/src/main/webapp/views/devops.html
@@ -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">宸ヤ綔妗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>
+
+
+        <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>
\ No newline at end of file
diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html
index be04591..b8b6a5c 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -24,7 +24,9 @@
             <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="rgv" onclick="nav(this.id)" class="nav-unselect" href="#">RGV</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>
 </div>

--
Gitblit v1.9.1