From de67dab661ba22ec22e5db1022962470f351e03e Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期四, 22 五月 2025 14:02:20 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/task/ClearWatchDataScheduler.java |   22 ++++
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java |   33 +++--
 src/main/webapp/views/watch/watch.html                      |   90 ++++++++++++++++++
 src/main/java/com/zy/common/utils/News.java                 |   25 +++++
 src/main/java/com/zy/common/model/WatchModel.java           |   21 ++++
 src/main/java/com/zy/common/service/WatchService.java       |   43 ++++++++
 src/main/java/com/zy/asrs/controller/WatchController.java   |   31 ++++++
 7 files changed, 251 insertions(+), 14 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..76b2d44
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/WatchController.java
@@ -0,0 +1,31 @@
+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 50c9145..f46ce75 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -19,6 +19,7 @@
 import com.zy.asrs.utils.Utils;
 import com.zy.common.service.CommonService;
 import com.zy.common.utils.HttpHandler;
+import com.zy.common.utils.News;
 import com.zy.common.utils.RedisUtil;
 import com.zy.core.CrnThread;
 import com.zy.core.DevpThread;
@@ -161,13 +162,13 @@
 
                         String barcode = barcodeThread.getBarcode();
                         if (Cools.isEmpty(barcode)) {
-                            log.info("鍏ュ簱淇″彿婊¤冻锛屾墭鐩樼爜涓虹┖");
+                            News.watchInfo(String.valueOf(staProtocol.getSiteId()), "鍏ュ簱淇″彿婊¤冻锛屾墭鐩樼爜涓虹┖");
                             continue;
                         }
 
                         TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("barcode", barcode));
                         if (taskWrk1 != null) {
-                            log.info("鎵樼洏鐮侊細" + barcode + "浠诲姟妗e瓨鍦�");
+                            News.watchInfo(String.valueOf(staProtocol.getSiteId()), "鎵樼洏鐮侊細" + barcode + "浠诲姟妗e瓨鍦�");
                             continue;
                         }
 
@@ -177,6 +178,7 @@
                         if (back) {
                             requestParam.put("wcsStatus", 1);//澶辫触
                             requestParam.put("wcsErrorMessage", errMsg);//澶辫触鍘熷洜
+                            News.watchInfo(String.valueOf(staProtocol.getSiteId()), errMsg);
                         }else {
                             requestParam.put("wcsStatus", 0);//鎴愬姛
                         }
@@ -200,14 +202,14 @@
                             if (jsonObject.getInteger("code") == 200) {
 
                             } else if (jsonObject.getInteger("code") == 500) {
-                                log.info("鏉$爜锛�" + barcode + "鐢宠WMS澶辫触,绯荤粺鍥為��,response=" + JSON.toJSONString(jsonObject));
+                                News.watchInfo(String.valueOf(staProtocol.getSiteId()), "鏉$爜锛�" + barcode + "鐢宠WMS澶辫触,绯荤粺鍥為��,response=" + JSON.toJSONString(jsonObject));
 
                                 staProtocol.setWorkNo(9997);
                                 staProtocol.setStaNo(inSta.getBackSta().shortValue());
                                 MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                 continue;
                             }else {
-                                log.info("鏉$爜锛�" + barcode + "鐢宠WMS澶辫触,response=" + JSON.toJSONString(jsonObject));
+                                News.watchInfo(String.valueOf(staProtocol.getSiteId()), "鏉$爜锛�" + barcode + "鐢宠WMS澶辫触,response=" + JSON.toJSONString(jsonObject));
                                 continue;
                             }
 
@@ -219,18 +221,18 @@
                             // 鍒涙柊涓�涓叆搴撳伐浣滄。
                             TaskWrk taskWrk = taskWrkService.selectByTaskNo(String.valueOf(resultWrkNo));
                             if(taskWrk != null) {
-                                log.info("浠诲姟锛�" + resultWrkNo + "宸茬粡瀛樺湪");
+                                News.watchInfo(String.valueOf(staProtocol.getSiteId()), "浠诲姟锛�" + resultWrkNo + "宸茬粡瀛樺湪");
                                 continue;
                             }
 
                             LocMast locMast = locMastService.selectByLocNo(resultLocNo);
                             if (locMast == null) {
-                                log.info(resultLocNo + "搴撲綅涓嶅瓨鍦�");
+                                News.watchInfo(String.valueOf(staProtocol.getSiteId()), resultLocNo + "搴撲綅涓嶅瓨鍦�");
                                 continue;
                             }
 
                             if (!locMast.getLocSts().equals("O")) {
-                                log.info(resultLocNo + "搴撲綅涓嶅浜庣┖搴撲綅");
+                                News.watchInfo(String.valueOf(staProtocol.getSiteId()), resultLocNo + "搴撲綅涓嶅浜庣┖搴撲綅");
                                 continue;
                             }
 
@@ -252,7 +254,7 @@
                             }
 
                             if (!taskWrkService.insert(taskWrk)) {
-                                log.info("浠诲姟锛�" + resultWrkNo + "浠诲姟鍒涘缓澶辫触");
+                                News.watchInfo(String.valueOf(staProtocol.getSiteId()), "浠诲姟锛�" + resultWrkNo + "浠诲姟鍒涘缓澶辫触");
                                 continue;
                             }
 
@@ -390,7 +392,7 @@
             }
             BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
             if (basCrnp == null) {
-                log.error("{}鍙峰爢鍨涙満灏氭湭鍦ㄦ暟鎹簱杩涜缁存姢锛�", crn.getId());
+                News.watchInfo(crn.getId() + "鍙峰爢鍨涙満", "{}鍙峰爢鍨涙満灏氭湭鍦ㄦ暟鎹簱杩涜缁存姢锛�", crn.getId());
                 continue;
             }
 
@@ -445,7 +447,7 @@
                 // 鏌ヨ绔欑偣璇︾粏淇℃伅
                 BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
                 if (staDetl == null) {
-                    log.error("鍏ュ簱 ===>> 鍫嗗灈鏈虹珯鐐瑰湪鏁版嵁搴撲笉瀛樺湪, 绔欑偣缂栧彿={}", crnStn.getStaNo());
+                    News.watchError(crnStn.getStaNo() + "绔欑偣", "鍏ュ簱 ===>> 鍫嗗灈鏈虹珯鐐瑰湪鏁版嵁搴撲笉瀛樺湪, 绔欑偣缂栧彿={}", crnStn.getStaNo());
                     continue;
                 }
 
@@ -454,18 +456,21 @@
                     flag = true;
                 }
                 if (!flag) {
+                    News.watchError(crnStn.getStaNo() + "绔欑偣", "鍏ュ簱 ===>> 鍫嗗灈鏈虹珯鐐圭姸鎬佹娴嬪け璐ワ紝绔欑偣闇�瑕佹弧瓒筹細鑷姩銆佹湁鐗┿�佹湁宸ヤ綔鍙枫�佺珯鐐瑰彲鍏�");
                     continue;
                 }
 
 
                 // 鑾峰彇宸ヤ綔鐘舵�佷负2锛堣澶囦笂璧帮級鐨勫叆搴撳伐浣滄。
-                TaskWrk taskWrk = taskWrkMapper.selectPakIn(slave.getId(), staProtocol.getWorkNo().intValue(), staDesc.getStnNo().toString());
+                TaskWrk taskWrk = taskWrkMapper.selectPakIn(slave.getId(), staProtocol.getWorkNo(), staDesc.getStnNo().toString());
                 if (null == taskWrk) {
+                    News.watchError(crnStn.getStaNo() + "绔欑偣", "鍏ュ簱 ===>> 宸ヤ綔妗d笉瀛樺湪锛屾鏌ヤ换鍔℃槸鍚︾敓鎴�");
                     continue;
                 }
 
                 // 鍫嗗灈鏈烘帶鍒惰繃婊�
                 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
+                    News.watchError(slave.getId() + "鍙峰爢鍨涙満", "鍫嗗灈鏈哄繖纰屼腑");
                     continue;
                 }
 
@@ -529,7 +534,7 @@
                     }
                     // 宸ヤ綔妗g姸鎬佸垽鏂�
                     if (taskWrk.getIoType() != 2 || taskWrk.getTargetPoint() == null || taskWrk.getStartPoint() == null) {
-                        log.error("鏌ヨ宸ヤ綔妗f暟鎹笉绗﹀悎鏉′欢--鍏ュ嚭绫诲瀷/绔欑偣, 宸ヤ綔鍙�={}锛屾簮搴撲綅={}锛屽叆鍑虹被鍨�={}", taskWrk.getWrkNo(), taskWrk.getStartPoint(), taskWrk.getIoType());
+                        News.watchError(taskWrk.getWrkNo() + "浠诲姟", "鏌ヨ宸ヤ綔妗f暟鎹笉绗﹀悎鏉′欢--鍏ュ嚭绫诲瀷/绔欑偣, 宸ヤ綔鍙�={}锛屾簮搴撲綅={}锛屽叆鍑虹被鍨�={}", taskWrk.getWrkNo(), taskWrk.getStartPoint(), taskWrk.getIoType());
                         continue;
                     }
 
@@ -545,7 +550,7 @@
                     // 鏌ヨ绔欑偣璇︾粏淇℃伅
                     BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
                     if (staDetl == null) {
-                        log.error("鍑哄簱 ===>> 鍫嗗灈鏈虹珯鐐瑰湪鏁版嵁搴撲笉瀛樺湪, 绔欑偣缂栧彿={}", crnStn.getStaNo());
+                        News.watchError(taskWrk.getWrkNo() + "浠诲姟", "鍑哄簱 ===>> 鍫嗗灈鏈虹珯鐐瑰湪鏁版嵁搴撲笉瀛樺湪, 绔欑偣缂栧彿={}", crnStn.getStaNo());
                         break;
                     }
 
@@ -560,7 +565,7 @@
                         }
                         int storeCount = basDevpService.getStoreCount();
                         if(storeCount >= maxCount){
-                            log.error("杈撻�佺嚎鏆傚瓨鏁拌揪鍒颁笂闄恵}",storeCount);
+                            News.watchError(taskWrk.getWrkNo() + "浠诲姟", "杈撻�佺嚎鏆傚瓨鏁拌揪鍒颁笂闄恵}", storeCount);
                             break;
                         }
 
diff --git a/src/main/java/com/zy/asrs/task/ClearWatchDataScheduler.java b/src/main/java/com/zy/asrs/task/ClearWatchDataScheduler.java
new file mode 100644
index 0000000..21790cc
--- /dev/null
+++ b/src/main/java/com/zy/asrs/task/ClearWatchDataScheduler.java
@@ -0,0 +1,22 @@
+package com.zy.asrs.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/model/WatchModel.java b/src/main/java/com/zy/common/model/WatchModel.java
new file mode 100644
index 0000000..47a5612
--- /dev/null
+++ b/src/main/java/com/zy/common/model/WatchModel.java
@@ -0,0 +1,21 @@
+package com.zy.common.model;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@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/utils/News.java b/src/main/java/com/zy/common/utils/News.java
index 3ee8ad0..2923676 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;
@@ -108,6 +110,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);
     }
@@ -154,6 +171,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/watch.html b/src/main/webapp/views/watch/watch.html
new file mode 100644
index 0000000..e1476c2
--- /dev/null
+++ b/src/main/webapp/views/watch/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.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