From 32b593115da09714624f3803fc43a6add07da391 Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期四, 22 五月 2025 16:20:14 +0800
Subject: [PATCH] #系统异常监视

---
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java   |   65 ++++++------
 src/main/java/com/zy/common/task/ClearWatchDataScheduler.java |   22 ++++
 src/main/java/com/zy/common/utils/News.java                   |   25 +++++
 src/main/java/com/zy/common/model/WatchModel.java             |   19 +++
 src/main/java/com/zy/common/service/WatchService.java         |   43 ++++++++
 src/main/java/com/zy/asrs/controller/WatchController.java     |   32 ++++++
 src/main/webapp/views/watch.html                              |   90 ++++++++++++++++++
 7 files changed, 265 insertions(+), 31 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/WatchController.java b/src/main/java/com/zy/asrs/controller/WatchController.java
new file mode 100644
index 0000000..e282fbe
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/WatchController.java
@@ -0,0 +1,32 @@
+package com.zy.asrs.controller;
+
+import com.core.common.R;
+import com.zy.common.model.WatchModel;
+import com.zy.common.service.WatchService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+public class WatchController {
+
+    @Autowired
+    private WatchService watchService;
+
+    @GetMapping("/watch/findAll")
+    public R findAll() {
+        List<WatchModel> list = watchService.getList();
+        return R.ok().add(list);
+    }
+
+    @GetMapping("/watch/fake")
+    public R fake() {
+        watchService.push("101绔欑偣", "鍏ュ簱淇″彿婊¤冻锛屾墭鐩樼爜涓虹┖");
+        watchService.push("102绔欑偣", "娴嬭瘯鏁版嵁");
+        watchService.push("103绔欑偣", "娴嬭瘯鏁版嵁2");
+        return R.ok();
+    }
+
+}
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 a47497c..238f2da 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -159,7 +159,7 @@
                 }
                 if (!back && staProtocol.isBarcodeErr()) {
                     errMsg = "鎵爜澶辫触";
-                    log.error("鐗╂枡鐮佹壂鐮佸け璐�");
+                    News.watchError(staProtocol.getSiteId() + "绔�-鍏ュ簱", "鎵爜澶辫触");
                     back = true;
                 }
                 // 閫�鍥�
@@ -173,6 +173,7 @@
                     // led 寮傚父鏄剧ず
                     if (ledThread != null) {
                         MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg));
+                        News.watchInfo(staProtocol.getSiteId() + "绔�-鍏ュ簱", errMsg);
                     }
                 }
 
@@ -184,7 +185,7 @@
                         && staProtocol.isPakMk()) {
                     String barcode = staProtocol.getBarcode();
                     if (Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || "00000000".equals(barcode)) {
-                        News.info("{}鍙锋潯鐮佹壂鎻忓櫒妫�娴嬫潯鐮佷俊鎭細{}", inSta.getBarcode(), barcode);
+                        News.watchInfo(staProtocol.getSiteId() + "绔�-鍏ュ簱", "{}鍙锋潯鐮佹壂鎻忓櫒妫�娴嬫潯鐮佷俊鎭細{}", inSta.getBarcode(), barcode);
                         // led 寮傚父鏄剧ず
                         if (ledThread != null) {
                             String errorMsg = "鎵爜澶辫触锛岃閲嶈瘯";
@@ -197,7 +198,7 @@
                     if (wrkMast != null) {
                         int wrkNo1 = basDevpService.selectCount(new EntityWrapper<BasDevp>().eq("wrk_no", wrkMast.getWrkNo()));
                         if (wrkNo1 != 0) {
-                            News.error(barcode + "鏉$爜宸插瓨鍦ㄧ姸鎬佷负锛� 2.璁惧涓婅蛋 锛夌殑鏁版嵁,璇锋煡鐪媁CS杈撻�佺嚎鐣岄潰,宸ヤ綔鍙�={}", wrkMast.getWrkNo());
+                            News.watchError(staProtocol.getSiteId() + "绔�-鍏ュ簱", barcode + "鏉$爜宸插瓨鍦ㄧ姸鎬佷负锛� 2.璁惧涓婅蛋 锛夌殑鏁版嵁,璇锋煡鐪媁CS杈撻�佺嚎鐣岄潰,宸ヤ綔鍙�={}", wrkMast.getWrkNo());
                             if (ledThread != null) {
                                 News.error(methodName + ":鎵爜澶辫触锛岃閲嶈瘯");
                                 MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, barcode + "鏉$爜宸插瓨鍦ㄧ姸鎬佷负锛� 2.璁惧涓婅蛋 锛夌殑浠诲姟,宸ヤ綔鍙�=" + wrkMast.getWrkNo()));
@@ -215,7 +216,7 @@
                         log.info("缁勬墭璇锋眰鍚嶭ED閿欒娓呴櫎");
 
                         if (!result) {
-                            News.error(methodName + ":鏇存柊plc绔欑偣淇℃伅澶辫触");
+                            News.watchError(staProtocol.getSiteId() + "绔�-鍏ュ簱", methodName + ":鏇存柊plc绔欑偣淇℃伅澶辫触");
                             log.error("杈撻�佺嚎涓嬪彂(瀛樺湪璁惧涓婅蛋鐨勫伐浣滄。锛岀洿鎺ヤ笅鍙戯紒)==>鏇存柊plc绔欑偣淇℃伅澶辫触");
 
 //                            throw new CoolException("鏇存柊plc绔欑偣淇℃伅澶辫触");
@@ -265,6 +266,7 @@
                             if (!Cools.isEmpty(errorMsg)) {
                                 MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
                             }
+                            News.watchError(staProtocol.getSiteId() + "绔�-鍏ュ簱", errorMsg);
                         }
 
 
@@ -310,7 +312,7 @@
                 return;
             }
             if (wrkMast.getPltType().shortValue() != staProtocol.getFinishWorkNo()) {
-                log.info("宸ヤ綔妗e拰瀹岀粨宸ヤ綔鍙蜂笉鍖归厤锛寋}锛寋}", wrkMast.getPltType(), staProtocol.getFinishWorkNo());
+                News.watchInfo(wrkMast.getWrkNo() + "浠诲姟-2.5F鍏ュ簱", "宸ヤ綔妗e拰瀹岀粨宸ヤ綔鍙蜂笉鍖归厤锛寋}锛寋}", wrkMast.getPltType(), staProtocol.getFinishWorkNo());
                 return;
             }
             Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "2.5F_Mode"));
@@ -318,7 +320,7 @@
                 return;
             }
             if (!config.getValue().equalsIgnoreCase("1")) {
-                log.info("妯″紡涓嶅1");
+                News.watchInfo(wrkMast.getWrkNo() + "浠诲姟-2.5F鍏ュ簱", "妯″紡涓嶅1");
                 return;
             }
             // 鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
@@ -341,7 +343,7 @@
             }
 
         } else {
-            News.errorNoLog("" + mark + " - 6" + " - 绔欑偣淇℃伅涓嶇鍚堝叆搴撴潯浠讹紒锛侊紒" + " 鑷姩淇″彿锛�" + staProtocol.isLoading() + "銆佸彲鍏ヤ俊鍙凤細" + staProtocol.isInEnable()
+            News.watchError(staProtocol.getSiteId() + "绔�-2.5F鍏ュ簱", "" + mark + " - 6" + " - 绔欑偣淇℃伅涓嶇鍚堝叆搴撴潯浠讹紒锛侊紒" + " 鑷姩淇″彿锛�" + staProtocol.isLoading() + "銆佸彲鍏ヤ俊鍙凤細" + staProtocol.isInEnable()
                     + "銆佺┖鏉夸俊鍙凤細" + staProtocol.isEmptyMk() + "銆佸伐浣滃彿锛�" + staProtocol.getWorkNo()
                     + "銆侀攣瀹氭爣璁�" + staProtocol.isPakMk() + "銆佸叆搴撳嵃璁帮細" + staProtocol.getStamp());
         }
@@ -716,7 +718,7 @@
                         }
 
                     } else {
-                        News.errorNoLog("" + mark + " - 6" + " - 鍫嗗灈鏈轰俊鎭笉绗﹀悎鍏ュ簱鏉′欢锛侊紒锛�"
+                        News.watchError(crnProtocol.getCrnNo() + "鍙峰爢鍨涙満-鍑哄簱鍒板嚭搴撶珯", "" + mark + " - 6" + " - 鍫嗗灈鏈轰俊鎭笉绗﹀悎鍏ュ簱鏉′欢锛侊紒锛�"
                                 + " 鍫嗗灈鏈虹姸鎬侊細" + crnProtocol.modeType + "==鑷姩AUTO锛�" + CrnModeType.AUTO
                                 + "銆佸爢鍨涙満浠诲姟鍙凤細" + crnProtocol.getTaskNo() + "==宸ヤ綔妗d换鍔″彿锛�" + wrkMast.getWrkNo().shortValue()
                                 + "銆佺姸鎬佹灇涓撅細" + crnProtocol.statusType + "==WAITING锛�90 //浠诲姟瀹屾垚绛夊緟WCS纭)锛�" + CrnStatusType.WAITING
@@ -920,7 +922,7 @@
             // 鏌ヨ绔欑偣璇︾粏淇℃伅
             BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
             if (staDetl == null) {
-                News.error("" + mark + " - 1" + " - 2" + " - 鍏ュ簱 ===>> 鍫嗗灈鏈虹珯鐐瑰湪鏁版嵁搴撲笉瀛樺湪, 绔欑偣缂栧彿={}", crnStn.getStaNo());
+                News.watchError(staProtocol.getSiteId() + "绔�-鍫嗗灈鏈哄叆搴�", "" + mark + " - 1" + " - 2" + " - 鍏ュ簱 ===>> 鍫嗗灈鏈虹珯鐐瑰湪鏁版嵁搴撲笉瀛樺湪, 绔欑偣缂栧彿={}", crnStn.getStaNo());
                 continue;
             }
             WrkMast wrkMast;
@@ -932,7 +934,7 @@
                 }
 
                 if (!flag) {
-                    News.errorNoLog("" + mark + " - 1" + " - 3" + " - 鍫嗗灈鏈哄叆搴撶珯淇℃伅(浠ヤ笅闇�瑕佸叏true):"
+                    News.watchError(staProtocol.getSiteId() + "绔�-鍫嗗灈鏈哄叆搴�", "" + mark + " - 1" + " - 3" + " - 鍫嗗灈鏈哄叆搴撶珯淇℃伅(浠ヤ笅闇�瑕佸叏true):"
                             + "鑷姩淇″彿" + staProtocol.isAutoing() + "鏈夌墿淇″彿" + staProtocol.isLoading()
                             + "宸ヤ綔鍙�>0" + staProtocol.getWorkNo() + "鍙叆淇″彿" + staProtocol.isInEnable()
                             + "鑳藉叆淇″彿锛坵ms璁剧疆锛�.equals(\"Y\")" + staDetl.getCanining());
@@ -941,18 +943,17 @@
                 // 鑾峰彇宸ヤ綔鐘舵�佷负2锛堣澶囦笂璧帮級鐨勫叆搴撳伐浣滄。
                 wrkMast = wrkMastMapper.selectPakInStep2(slave.getId(), staProtocol.getFinishWorkNo().intValue(), crnStn.getStaNo());
                 if (null == wrkMast) {
-                    News.infoNoLog("" + mark + " - 1" + " - 4" + " - 鏌ヨ鏃犲緟鍏ュ簱鏁版嵁--wrk_sts=2, 宸ヤ綔鍙�={}", staProtocol.getFinishWorkNo());
-//                log.error("鏌ヨ鏃犲緟鍏ュ簱鏁版嵁--wrk_sts=2, 宸ヤ綔鍙�={}", staProtocol.getWorkNo());
+                    News.watchInfo(staProtocol.getSiteId() + "绔�-鍫嗗灈鏈哄叆搴�", "" + mark + " - 1" + " - 4" + " - 鏌ヨ鏃犲緟鍏ュ簱鏁版嵁--wrk_sts=2, 宸ヤ綔鍙�={}", staProtocol.getFinishWorkNo());
                     continue;
                 }
                 // 鑾峰彇搴撲綅淇℃伅
                 locMast = locMastService.selectById(wrkMast.getLocNo());
                 if (locMast == null) {
-                    News.error("" + mark + " - 1" + " - 5" + " - 鏌ヨ搴撳瓨鏃犳暟鎹�--搴撲綅鍙穥}", wrkMast.getLocNo());
+                    News.watchError(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄叆搴�", "" + mark + " - 1" + " - 5" + " - 鏌ヨ搴撳瓨鏃犳暟鎹�--搴撲綅鍙穥}", wrkMast.getLocNo());
                     continue;
                 }
                 if (!locMast.getLocSts().equals("S") && !locMast.getLocSts().equals("Q")) {
-                    News.error("" + mark + " - 1" + " - 6" + " - 鍏ュ簱鎿嶄綔搴撲綅鐘舵�佷笉绗﹀悎--鐘舵��, 搴撲綅鍙�={}锛屽簱浣嶇姸鎬�={}", wrkMast.getLocNo(), locMast.getLocSts());
+                    News.watchError(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄叆搴�", "" + mark + " - 1" + " - 6" + " - 鍏ュ簱鎿嶄綔搴撲綅鐘舵�佷笉绗﹀悎--鐘舵��, 搴撲綅鍙�={}锛屽簱浣嶇姸鎬�={}", wrkMast.getLocNo(), locMast.getLocSts());
                     continue;
                 }
 
@@ -972,7 +973,7 @@
                     flag = true;
                 }
                 if (!flag) {
-                    News.errorNoLog("" + mark + " - 1" + " - 3" + " - 鍫嗗灈鏈哄叆搴撶珯淇℃伅(浠ヤ笅闇�瑕佸叏true):"
+                    News.watchError(staProtocol.getSiteId() + "绔�-鍫嗗灈鏈哄叆搴�", "" + mark + " - 1" + " - 3" + " - 鍫嗗灈鏈哄叆搴撶珯淇℃伅(浠ヤ笅闇�瑕佸叏true):"
                             + "鑷姩淇″彿" + staProtocol.isAutoing() + "鏈夌墿淇″彿" + staProtocol.isLoading()
                             + "宸ヤ綔鍙�>0" + staProtocol.getWorkNo() + "鍙叆淇″彿" + staProtocol.isInEnable()
                             + "鑳藉叆淇″彿锛坵ms璁剧疆锛�.equals(\"Y\")" + staDetl.getCanining());
@@ -981,18 +982,18 @@
                 // 鑾峰彇宸ヤ綔鐘舵�佷负2锛堣澶囦笂璧帮級鐨勫叆搴撳伐浣滄。
                 wrkMast = wrkMastMapper.selectPakInStep2(slave.getId(), staProtocol.getWorkNo().intValue(), crnStn.getStaNo());
                 if (null == wrkMast) {
-                    News.infoNoLog("" + mark + " - 1" + " - 4" + " - 鏌ヨ鏃犲緟鍏ュ簱鏁版嵁--wrk_sts=2, 宸ヤ綔鍙�={}", staProtocol.getWorkNo());
+                    News.watchInfo(staProtocol.getSiteId() + "绔�-鍫嗗灈鏈哄叆搴�", "" + mark + " - 1" + " - 4" + " - 鏌ヨ鏃犲緟鍏ュ簱鏁版嵁--wrk_sts=2, 宸ヤ綔鍙�={}", staProtocol.getWorkNo());
 //                log.error("鏌ヨ鏃犲緟鍏ュ簱鏁版嵁--wrk_sts=2, 宸ヤ綔鍙�={}", staProtocol.getWorkNo());
                     continue;
                 }
                 // 鑾峰彇搴撲綅淇℃伅
                 locMast = locMastService.selectById(wrkMast.getLocNo());
                 if (locMast == null) {
-                    News.error("" + mark + " - 1" + " - 5" + " - 鏌ヨ搴撳瓨鏃犳暟鎹�--搴撲綅鍙穥}", wrkMast.getLocNo());
+                    News.watchError(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄叆搴�", "" + mark + " - 1" + " - 5" + " - 鏌ヨ搴撳瓨鏃犳暟鎹�--搴撲綅鍙穥}", wrkMast.getLocNo());
                     continue;
                 }
                 if (!locMast.getLocSts().equals("S") && !locMast.getLocSts().equals("Q")) {
-                    News.error("" + mark + " - 1" + " - 6" + " - 鍏ュ簱鎿嶄綔搴撲綅鐘舵�佷笉绗﹀悎--鐘舵��, 搴撲綅鍙�={}锛屽簱浣嶇姸鎬�={}", wrkMast.getLocNo(), locMast.getLocSts());
+                    News.watchError(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄叆搴�", "" + mark + " - 1" + " - 6" + " - 鍏ュ簱鎿嶄綔搴撲綅鐘舵�佷笉绗﹀悎--鐘舵��, 搴撲綅鍙�={}锛屽簱浣嶇姸鎬�={}", wrkMast.getLocNo(), locMast.getLocSts());
                     continue;
                 }
 
@@ -1011,15 +1012,15 @@
 
             // 鍙屾繁搴撲綅涓旀祬搴撲綅鏈夎揣锛屽垯闇�鍏堝娴呭簱浣嶈繘琛屽簱浣嶇Щ杞�
             if (Utils.isDeepLoc(slaveProperties, wrkMast.getLocNo())) {
-                News.warnNoLog("" + mark + " - 1" + " - 8" + " - 鍙屾繁搴撲綅涓旀祬搴撲綅鏈夎揣锛屽垯闇�鍏堝娴呭簱浣嶈繘琛屽簱浣嶇Щ杞� : 寮�濮嬫墽琛� 浠诲姟鍙�={}", wrkMast.getWrkNo());
+                News.watchInfo(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄叆搴�", "" + mark + " - 1" + " - 8" + " - 鍙屾繁搴撲綅涓旀祬搴撲綅鏈夎揣锛屽垯闇�鍏堝娴呭簱浣嶈繘琛屽簱浣嶇Щ杞� : 寮�濮嬫墽琛� 浠诲姟鍙�={}", wrkMast.getWrkNo());
                 String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getLocNo());
                 LocMast shallowLoc = locMastService.selectById(shallowLocNo);
                 // O.绌哄簱浣嶃�丵.鎷f枡/鐩樼偣/骞舵澘鍐嶅叆搴撱�丼.鍏ュ簱棰勭害銆乆.绂佺敤 鐩存帴鎼紒
                 if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) {
-                    News.warnNoLog("" + mark + " - 1" + " - 9" + " - // O.绌哄簱浣嶃�丵.鎷f枡/鐩樼偣/骞舵澘鍐嶅叆搴撱�丼.鍏ュ簱棰勭害銆乆.绂佺敤 鐩存帴鎼紒搴撲綅鐘舵��={}", shallowLoc.getLocSts());
+                    News.watchInfo(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄叆搴�", "" + mark + " - 1" + " - 9" + " - // O.绌哄簱浣嶃�丵.鎷f枡/鐩樼偣/骞舵澘鍐嶅叆搴撱�丼.鍏ュ簱棰勭害銆乆.绂佺敤 鐩存帴鎼紒搴撲綅鐘舵��={}", shallowLoc.getLocSts());
                     WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                     if (null == waitWrkMast) {
-                        News.error("" + mark + " - 1" + " - 10" + " - {}搴撲綅寮傚父锛屾湭妫�绱㈠埌鐩稿簲宸ヤ綔妗o紒", shallowLocNo);
+                        News.watchError(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄叆搴�", "" + mark + " - 1" + " - 10" + " - {}搴撲綅寮傚父锛屾湭妫�绱㈠埌鐩稿簲宸ヤ綔妗o紒", shallowLocNo);
                     } else {
                         waitWrkMast.setIoPri(15D);
                         waitWrkMast.setModiTime(new Date());
@@ -1132,20 +1133,20 @@
                 }
                 // 宸ヤ綔妗g姸鎬佸垽鏂�
                 if (wrkMast.getIoType() < 100 || wrkMast.getSourceStaNo() == null) {
-                    News.error("" + mark + " - 2" + " - 1" + " - 鏌ヨ宸ヤ綔妗f暟鎹笉绗﹀悎鏉′欢--鍏ュ嚭绫诲瀷/绔欑偣, 宸ヤ綔鍙�={}锛屾簮搴撲綅={}锛屽叆鍑虹被鍨�={}", wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getIoType());
+                    News.watchError(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄嚭搴�", "" + mark + " - 2" + " - 1" + " - 鏌ヨ宸ヤ綔妗f暟鎹笉绗﹀悎鏉′欢--鍏ュ嚭绫诲瀷/绔欑偣, 宸ヤ綔鍙�={}锛屾簮搴撲綅={}锛屽叆鍑虹被鍨�={}", wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getIoType());
                     continue;
                 }
                 // 鑾峰彇婧愬簱浣嶄俊鎭�
                 LocMast sourceSta = locMastService.selectById(wrkMast.getSourceLocNo());
                 if (!sourceSta.getLocSts().equals("R") && !sourceSta.getLocSts().equals("P")) {
-                    News.error("" + mark + " - 2" + " - 2" + " - 鍑哄簱鎿嶄綔搴撲綅鐘舵�佷笉绗﹀悎--鐘舵��, 搴撲綅鍙�={}锛屽簱浣嶇姸鎬�={}", wrkMast.getLocNo(), sourceSta.getLocSts());
+                    News.watchError(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄嚭搴�", "" + mark + " - 2" + " - 2" + " - 鍑哄簱鎿嶄綔搴撲綅鐘舵�佷笉绗﹀悎--鐘舵��, 搴撲綅鍙�={}锛屽簱浣嶇姸鎬�={}", wrkMast.getLocNo(), sourceSta.getLocSts());
                     continue;
                 }
                 // 鑾峰彇鍫嗗灈鏈哄嚭搴撶珯淇℃伅
                 SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                 StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
                 if (staProtocol == null) {
-                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 鍫嗗灈鏈哄嚭搴撶珯淇℃伅(staProtocol!=null缁х画鎵ц,鍚﹀垯寰幆缁堟)锛歴taProtocol=" + staProtocol);
+                    News.watchInfo(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄嚭搴�", "" + mark + " - 2" + " - 3" + " - 鍫嗗灈鏈哄嚭搴撶珯淇℃伅(staProtocol!=null缁х画鎵ц,鍚﹀垯寰幆缁堟)锛歴taProtocol=" + staProtocol);
                     break;
 //                    continue;
                 } else {
@@ -1162,7 +1163,7 @@
                 // 鏌ヨ绔欑偣璇︾粏淇℃伅
                 BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
                 if (staDetl == null) {
-                    News.error("" + mark + " - 2" + " - 5" + " - 鍑哄簱 ===>> 鍫嗗灈鏈虹珯鐐瑰湪鏁版嵁搴撲笉瀛樺湪, 绔欑偣缂栧彿={}", crnStn.getStaNo());
+                    News.watchInfo(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄嚭搴�", "" + mark + " - 2" + " - 5" + " - 鍑哄簱 ===>> 鍫嗗灈鏈虹珯鐐瑰湪鏁版嵁搴撲笉瀛樺湪, 绔欑偣缂栧彿={}", crnStn.getStaNo());
                     break;
 //                    continue;
                 }
@@ -1188,15 +1189,15 @@
 
                     // 鍙屾繁搴撲綅涓旀祬搴撲綅鏈夎揣锛屽垯闇�鍏堝娴呭簱浣嶈繘琛屽簱浣嶇Щ杞�
                     if (Utils.isDeepLoc(slaveProperties, wrkMast.getSourceLocNo())) {
-                        News.warnNoLog("" + mark + " - 2" + " - 6" + " - 鍙屾繁搴撲綅涓旀祬搴撲綅鏈夎揣锛屽垯闇�鍏堝娴呭簱浣嶈繘琛屽簱浣嶇Щ杞� : 寮�濮嬫墽琛� 浠诲姟鍙�={}", wrkMast.getWrkNo());
+                        News.watchInfo(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄嚭搴�", "" + mark + " - 2" + " - 6" + " - 鍙屾繁搴撲綅涓旀祬搴撲綅鏈夎揣锛屽垯闇�鍏堝娴呭簱浣嶈繘琛屽簱浣嶇Щ杞� : 寮�濮嬫墽琛� 浠诲姟鍙�={}", wrkMast.getWrkNo());
                         String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getSourceLocNo());
                         LocMast shallowLoc = locMastService.selectById(shallowLocNo);
                         // O.绌哄簱浣嶃�丵.鎷f枡/鐩樼偣/骞舵澘鍐嶅叆搴撱�丼.鍏ュ簱棰勭害銆乆.绂佺敤 鐩存帴鎼紒
                         if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) {
-                            News.warnNoLog("" + mark + " - 2" + " - 7" + " - // O.绌哄簱浣嶃�丵.鎷f枡/鐩樼偣/骞舵澘鍐嶅叆搴撱�丼.鍏ュ簱棰勭害銆乆.绂佺敤 鐩存帴鎼紒搴撲綅鐘舵��={}", shallowLoc.getLocSts());
+                            News.watchInfo(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄嚭搴�", "" + mark + " - 2" + " - 7" + " - // O.绌哄簱浣嶃�丵.鎷f枡/鐩樼偣/骞舵澘鍐嶅叆搴撱�丼.鍏ュ簱棰勭害銆乆.绂佺敤 鐩存帴鎼紒搴撲綅鐘舵��={}", shallowLoc.getLocSts());
                             WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                             if (null == waitWrkMast) {
-                                News.error("{}搴撲綅寮傚父锛屾湭妫�绱㈠埌鐩稿簲宸ヤ綔妗o紒", shallowLocNo);
+                                News.watchError(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄嚭搴�", "{}搴撲綅寮傚父锛屾湭妫�绱㈠埌鐩稿簲宸ヤ綔妗o紒", shallowLocNo);
                             } else {
                                 if (waitWrkMast.getWrkSts() == 11) {
                                     waitWrkMast.setIoPri(15D);
@@ -1223,13 +1224,13 @@
                                     wrkMastMapper.updateById(wrkMast);
                                 }
                             }
-                            News.error("{}浠诲姟鍑哄簱澶辫触锛屾祬搴撲綅鍫靛锛佹祬搴撲綅鍙�:{}", wrkMast.getWrkNo(), shallowLocNo);
+                            News.watchError(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄嚭搴�", "{}浠诲姟鍑哄簱澶辫触锛屾祬搴撲綅鍫靛锛佹祬搴撲綅鍙�:{}", wrkMast.getWrkNo(), shallowLocNo);
                             continue;
                         } else if (shallowLoc.getLocSts().equals("Q") || shallowLoc.getLocSts().equals("S")) {
                             News.warnNoLog("" + mark + " - 2" + " - 10" + " - // Q銆丼  搴撲綅鐘舵��={}", shallowLoc.getLocSts());
                             WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo);
                             if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) {
-                                News.infoNoLog("" + mark + " - 2" + " - 11" + " - // F銆丏  宸ヤ綔鐘舵��(鍒ゆ柇鏉′欢涓�==4)={}", waitWrkMast.getWrkSts());
+                                News.watchError(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄嚭搴�", "" + mark + " - 2" + " - 11" + " - // F銆丏  宸ヤ綔鐘舵��(鍒ゆ柇鏉′欢涓�==4)={}", waitWrkMast.getWrkSts());
                                 continue;
                             }
                         }
@@ -1243,7 +1244,7 @@
                     //涓嬪彂浠诲姟鍓嶈姹傛憚鍍忔満
                     boolean succ = sendACameraRequest(wrkMast.getWrkNo());
                     if (!succ) {
-                        log.error(wrkMast.getWrkNo() + "浠诲姟涓嬪彂鍓嶈姹傛憚鍍忔満鍚姩澶辫触");
+                        News.watchError(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄嚭搴�", wrkMast.getWrkNo() + "浠诲姟涓嬪彂鍓嶈姹傛憚鍍忔満鍚姩澶辫触");
                     }
                     News.warnNoLog("" + mark + " - 2" + " - 12" + " - 鍛戒护涓嬪彂 : 宸ヤ綔鍙�={},婧愭帓={},婧愬垪={},婧愬眰={},鐩爣鎺�={},鐩爣鍒�={},鐩爣灞�={}", wrkMast.getWrkNo().shortValue()
                             , sourceSta.getRow1().shortValue(), sourceSta.getBay1().shortValue(), sourceSta.getLev1().shortValue()
@@ -1275,6 +1276,8 @@
                         }
                         break;
                     }
+                }else {
+                    News.watchError(wrkMast.getWrkNo() + "浠诲姟-鍫嗗灈鏈哄嚭搴�", "鍫嗗灈鏈虹珯鐐圭姸鎬侀渶瑕佹弧瓒筹細鑷姩銆佸彲鍑�, 绔欑偣缂栧彿={}", staProtocol.getSiteId());
                 }
             }
         }
diff --git a/src/main/java/com/zy/common/model/WatchModel.java b/src/main/java/com/zy/common/model/WatchModel.java
new file mode 100644
index 0000000..ebdb51e
--- /dev/null
+++ b/src/main/java/com/zy/common/model/WatchModel.java
@@ -0,0 +1,19 @@
+package com.zy.common.model;
+
+import lombok.Data;
+
+@Data
+public class WatchModel {
+
+    private String key;
+
+    private String msg;
+
+    private Long time;
+
+    public WatchModel(String key, String msg) {
+        this.key = key;
+        this.msg = msg;
+        this.time = System.currentTimeMillis();
+    }
+}
diff --git a/src/main/java/com/zy/common/service/WatchService.java b/src/main/java/com/zy/common/service/WatchService.java
new file mode 100644
index 0000000..f6b30fd
--- /dev/null
+++ b/src/main/java/com/zy/common/service/WatchService.java
@@ -0,0 +1,43 @@
+package com.zy.common.service;
+
+import com.zy.common.model.WatchModel;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class WatchService {
+
+    private HashMap<String, WatchModel> map = new HashMap<>();
+
+    public boolean push(String key, String msg) {
+        map.put(key, new WatchModel(key, msg));
+        return true;
+    }
+
+    public HashMap<String, WatchModel> getMap() {
+        return map;
+    }
+
+    public List<WatchModel> getList() {
+        return new ArrayList<>(map.values());
+    }
+
+    public synchronized void clearTimeOutData() {
+        ArrayList<String> removeKey = new ArrayList<>();
+        for (Map.Entry<String, WatchModel> entry : this.map.entrySet()) {
+            WatchModel watchModel = entry.getValue();
+            if (System.currentTimeMillis() - watchModel.getTime() > 1000 * 10) {
+                removeKey.add(entry.getKey());
+            }
+        }
+
+        for (String key : removeKey) {
+            map.remove(key);
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/common/task/ClearWatchDataScheduler.java b/src/main/java/com/zy/common/task/ClearWatchDataScheduler.java
new file mode 100644
index 0000000..50b03f4
--- /dev/null
+++ b/src/main/java/com/zy/common/task/ClearWatchDataScheduler.java
@@ -0,0 +1,22 @@
+package com.zy.common.task;
+
+import com.zy.common.service.WatchService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public class ClearWatchDataScheduler {
+
+    @Autowired
+    private WatchService watchService;
+
+    @Scheduled(cron = "0/5 * * * * ? ")
+    public void clear() {
+        watchService.clearTimeOutData();
+    }
+
+
+}
diff --git a/src/main/java/com/zy/common/utils/News.java b/src/main/java/com/zy/common/utils/News.java
index 63c8762..3937246 100644
--- a/src/main/java/com/zy/common/utils/News.java
+++ b/src/main/java/com/zy/common/utils/News.java
@@ -1,5 +1,7 @@
 package com.zy.common.utils;
 
+import com.core.common.SpringUtils;
+import com.zy.common.service.WatchService;
 import lombok.extern.slf4j.Slf4j;
 
 import java.lang.reflect.Array;
@@ -109,6 +111,21 @@
         offer(NewsLevel.ERROR, format, arguments);
     }
 
+    public static void watchInfo(String key, String format, Object... arguments) {
+        info(format, arguments);
+        watchOffer(key, replace(format, arguments));
+    }
+
+    public static void watchWarn(String key, String format, Object... arguments) {
+        warn(format, arguments);
+        watchOffer(key, replace(format, arguments));
+    }
+
+    public static void watchError(String key, String format, Object... arguments) {
+        error(format, arguments);
+        watchOffer(key, replace(format, arguments));
+    }
+
     public static void infoNoLog(String format, Object... arguments) {
         offer(NewsLevel.INFO, format, arguments);
     }
@@ -155,6 +172,14 @@
         return NEWS_QUEUE.offer(new NewsDomain(level, replace(msg, args), (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date())));
     }
 
+    private static boolean watchOffer(String key, String msg) {
+        WatchService watchService = SpringUtils.getBean(WatchService.class);
+        if(watchService != null) {
+            return watchService.push(key, msg);
+        }
+        return false;
+    }
+
     private static String replace(String str, Object[] objs){
         if (null == objs || objs.length == 0 || null == str || "".equals(str.trim())) {
             return str;
diff --git a/src/main/webapp/views/watch.html b/src/main/webapp/views/watch.html
new file mode 100644
index 0000000..9fe40a2
--- /dev/null
+++ b/src/main/webapp/views/watch.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html lang="en">
+
+	<head>
+		<meta charset="UTF-8">
+		<title>绯荤粺鐩戣</title>
+		<link rel="stylesheet" href="../../static/wcs/css/element.css">
+		<script type="text/javascript" src="../../static/wcs/js/jquery/jquery-3.3.1.min.js"></script>
+		<script type="text/javascript" src="../../static/wcs/js/common.js"></script>
+		<script type="text/javascript" src="../../static/wcs/js/vue.min.js"></script>
+		<script type="text/javascript" src="../../static/wcs/js/element.js"></script>
+		<style>
+			.container {
+				display: flex;
+				flex-wrap: wrap;
+				justify-content: space-around;
+			}
+
+			.box-card {
+				width: 480px;
+				margin: 10px;
+			}
+		</style>
+	</head>
+
+	<body>
+		<div id="app">
+			<div class="container" v-if="watchData != undefined && watchData != null && watchData.length > 0">
+				<el-card class="box-card" v-for="item in watchData" :key="item">
+					<div>
+						{{ item.key }}
+					</div>
+					<div>
+						{{ item.msg }}
+					</div>
+				</el-card>
+			</div>
+			<div v-else>
+				<el-empty description="鏃犲紓甯�"></el-empty>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				el: '#app',
+				data: {
+					watchData: [],
+				},
+				created() {
+					this.init()
+				},
+				methods: {
+					init() {
+						let that = this;
+						this.getWatchData()
+
+						setInterval(() => {
+							that.getWatchData()
+						}, 1000);
+					},
+					getWatchData() {
+						let that = this;
+						$.ajax({
+							url: baseUrl + "/watch/findAll",
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							data: {},
+							dataType: 'json',
+							contentType: 'application/json;charset=UTF-8',
+							method: 'GET',
+							success: function(res) {
+								if (res.code == 200) {
+									that.watchData = res.data;
+								} else if (res.code === 403) {
+									top.location.href = baseUrl + "/";
+								} else {
+									that.$message({
+										message: res.msg,
+										type: 'error'
+									});
+								}
+							}
+						});
+					},
+				}
+			})
+		</script>
+	</body>
+
+</html>

--
Gitblit v1.9.1