#
Junjie
2025-05-22 de67dab661ba22ec22e5db1022962470f351e03e
#
2个文件已修改
5个文件已添加
265 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/WatchController.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/ClearWatchDataScheduler.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/WatchModel.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/WatchService.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/News.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/watch/watch.html 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/WatchController.java
New file
@@ -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();
    }
}
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 + "任务档存在");
                            News.watchInfo(String.valueOf(staProtocol.getSiteId()), "托盘码:" + barcode + "任务档存在");
                            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() + "站点", "入库 ===>> 工作档不存在,检查任务是否生成");
                    continue;
                }
                // 堆垛机控制过滤
                if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
                    News.watchError(slave.getId() + "号堆垛机", "堆垛机忙碌中");
                    continue;
                }
@@ -529,7 +534,7 @@
                    }
                    // 工作档状态判断
                    if (taskWrk.getIoType() != 2 || taskWrk.getTargetPoint() == null || taskWrk.getStartPoint() == null) {
                        log.error("查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", taskWrk.getWrkNo(), taskWrk.getStartPoint(), taskWrk.getIoType());
                        News.watchError(taskWrk.getWrkNo() + "任务", "查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", 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;
                        }
src/main/java/com/zy/asrs/task/ClearWatchDataScheduler.java
New file
@@ -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();
    }
}
src/main/java/com/zy/common/model/WatchModel.java
New file
@@ -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();
    }
}
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/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;
src/main/webapp/views/watch/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.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>