New file |
| | |
| | | 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(); |
| | | } |
| | | |
| | | } |
| | |
| | | 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; |
| | |
| | | |
| | | 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; |
| | | } |
| | | |
| | |
| | | if (back) { |
| | | requestParam.put("wcsStatus", 1);//失败 |
| | | requestParam.put("wcsErrorMessage", errMsg);//失败原因 |
| | | News.watchInfo(String.valueOf(staProtocol.getSiteId()), errMsg); |
| | | }else { |
| | | requestParam.put("wcsStatus", 0);//成功 |
| | | } |
| | |
| | | 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; |
| | | } |
| | | |
| | |
| | | // 创新一个入库工作档 |
| | | 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; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | if (!taskWrkService.insert(taskWrk)) { |
| | | log.info("任务:" + resultWrkNo + "任务创建失败"); |
| | | News.watchInfo(String.valueOf(staProtocol.getSiteId()), "任务:" + resultWrkNo + "任务创建失败"); |
| | | continue; |
| | | } |
| | | |
| | |
| | | } |
| | | BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); |
| | | if (basCrnp == null) { |
| | | log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId()); |
| | | News.watchInfo(crn.getId() + "号堆垛机", "{}号堆垛机尚未在数据库进行维护!", crn.getId()); |
| | | continue; |
| | | } |
| | | |
| | |
| | | // 查询站点详细信息 |
| | | BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); |
| | | if (staDetl == null) { |
| | | log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); |
| | | News.watchError(crnStn.getStaNo() + "站点", "入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); |
| | | continue; |
| | | } |
| | | |
| | |
| | | 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; |
| | | } |
| | | |
| | |
| | | } |
| | | // 工作档状态判断 |
| | | 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; |
| | | } |
| | | |
| | |
| | | // 查询站点详细信息 |
| | | BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); |
| | | if (staDetl == null) { |
| | | log.error("出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); |
| | | News.watchError(taskWrk.getWrkNo() + "任务", "出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); |
| | | break; |
| | | } |
| | | |
| | |
| | | } |
| | | int storeCount = basDevpService.getStoreCount(); |
| | | if(storeCount >= maxCount){ |
| | | log.error("输送线暂存数达到上限{}",storeCount); |
| | | News.watchError(taskWrk.getWrkNo() + "任务", "输送线暂存数达到上限{}", storeCount); |
| | | break; |
| | | } |
| | | |
New file |
| | |
| | | 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(); |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | 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(); |
| | | } |
| | | } |
New file |
| | |
| | | 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); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | 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; |
| | |
| | | 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); |
| | | } |
| | |
| | | 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; |
New file |
| | |
| | | <!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> |