Junjie
2025-05-22 32b593115da09714624f3803fc43a6add07da391
#系统异常监视
2个文件已修改
5个文件已添加
296 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/WatchController.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/WatchModel.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/WatchService.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/task/ClearWatchDataScheduler.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/News.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/watch.html 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/WatchController.java
New file
@@ -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();
    }
}
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.设备上走 )的数据,请查看WCS输送线界面,工作号={}", wrkMast.getWrkNo());
                            News.watchError(staProtocol.getSiteId() + "站-入库", barcode + "条码已存在状态为( 2.设备上走 )的数据,请查看WCS输送线界面,工作号={}", 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("组托请求后LED错误清除");
                        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("工作档和完结工作号不匹配,{},{}", wrkMast.getPltType(), staProtocol.getFinishWorkNo());
                News.watchInfo(wrkMast.getWrkNo() + "任务-2.5F入库", "工作档和完结工作号不匹配,{},{}", 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() + "==工作档任务号:" + 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()
                            + "能入信号(wms设置).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()
                            + "能入信号(wms设置).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.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!
                if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) {
                    News.warnNoLog("" + mark + " - 1" + " - 9" + " - // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!库位状态={}", shallowLoc.getLocSts());
                    News.watchInfo(wrkMast.getWrkNo() + "任务-堆垛机入库", "" + mark + " - 1" + " - 9" + " - // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!库位状态={}", shallowLoc.getLocSts());
                    WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                    if (null == waitWrkMast) {
                        News.error("" + mark + " - 1" + " - 10" + " - {}库位异常,未检索到相应工作档!", shallowLocNo);
                        News.watchError(wrkMast.getWrkNo() + "任务-堆垛机入库", "" + mark + " - 1" + " - 10" + " - {}库位异常,未检索到相应工作档!", shallowLocNo);
                    } else {
                        waitWrkMast.setIoPri(15D);
                        waitWrkMast.setModiTime(new Date());
@@ -1132,20 +1133,20 @@
                }
                // 工作档状态判断
                if (wrkMast.getIoType() < 100 || wrkMast.getSourceStaNo() == null) {
                    News.error("" + mark + " - 2" + " - 1" + " - 查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getIoType());
                    News.watchError(wrkMast.getWrkNo() + "任务-堆垛机出库", "" + mark + " - 2" + " - 1" + " - 查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", 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继续执行,否则循环终止):staProtocol=" + staProtocol);
                    News.watchInfo(wrkMast.getWrkNo() + "任务-堆垛机出库", "" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + 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.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!
                        if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) {
                            News.warnNoLog("" + mark + " - 2" + " - 7" + " - // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!库位状态={}", shallowLoc.getLocSts());
                            News.watchInfo(wrkMast.getWrkNo() + "任务-堆垛机出库", "" + mark + " - 2" + " - 7" + " - // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!库位状态={}", shallowLoc.getLocSts());
                            WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                            if (null == waitWrkMast) {
                                News.error("{}库位异常,未检索到相应工作档!", shallowLocNo);
                                News.watchError(wrkMast.getWrkNo() + "任务-堆垛机出库", "{}库位异常,未检索到相应工作档!", 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、S  库位状态={}", shallowLoc.getLocSts());
                            WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo);
                            if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) {
                                News.infoNoLog("" + mark + " - 2" + " - 11" + " - // F、D  工作状态(判断条件为==4)={}", waitWrkMast.getWrkSts());
                                News.watchError(wrkMast.getWrkNo() + "任务-堆垛机出库", "" + mark + " - 2" + " - 11" + " - // F、D  工作状态(判断条件为==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());
                }
            }
        }
src/main/java/com/zy/common/model/WatchModel.java
New file
@@ -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();
    }
}
src/main/java/com/zy/common/service/WatchService.java
New file
@@ -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);
        }
    }
}
src/main/java/com/zy/common/task/ClearWatchDataScheduler.java
New file
@@ -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();
    }
}
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;
src/main/webapp/views/watch.html
New file
@@ -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>