diff --git a/web/src/main/java/com/zhehekeji/web/controller/StockController.java b/web/src/main/java/com/zhehekeji/web/controller/StockController.java index 07e8d5f..a10b142 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/StockController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/StockController.java @@ -67,8 +67,8 @@ public class StockController { @ApiOperation(value = "获取品规列表") @RequestMapping(value = "/getCategoryList", method = RequestMethod.POST) - public Result> getCategoryList() { - List list = stockService.getCategoryList(); + public Result> getCategoryList() { + Map list = stockService.getCategoryList(); return Result.success(list); } diff --git a/web/src/main/java/com/zhehekeji/web/lib/CameraDelayTask.java b/web/src/main/java/com/zhehekeji/web/lib/CameraDelayTask.java index b5df342..3410e38 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/CameraDelayTask.java +++ b/web/src/main/java/com/zhehekeji/web/lib/CameraDelayTask.java @@ -1,5 +1,6 @@ package com.zhehekeji.web.lib; +import com.zhehekeji.web.service.client.TransmissionPojo; import lombok.AllArgsConstructor; import lombok.Data; @@ -16,6 +17,8 @@ public class CameraDelayTask implements Delayed { private String cameraPlcId; private LocalDateTime startTime; + private TransmissionPojo transmissionPojo; + private LocalDateTime endTime; private String command; @@ -32,6 +35,7 @@ public class CameraDelayTask implements Delayed { private Integer ptzId; + public CameraDelayTask(Integer cameraId, LocalDateTime startTime, LocalDateTime endTime, String path, Integer type, long delayTime) { this.cameraId = cameraId; this.startTime = startTime; @@ -42,11 +46,21 @@ public class CameraDelayTask implements Delayed { this.delayTime = delayTime; } + public CameraDelayTask(String cameraPlcId, String command, long delayTime,TransmissionPojo transmissionPojo) { + this.cameraPlcId = cameraPlcId; + this.command = command; + this.executeTime = System.currentTimeMillis()+delayTime; + this.delayTime = delayTime; + + this.transmissionPojo = transmissionPojo; + } + public CameraDelayTask(String cameraPlcId, String command, long delayTime) { this.cameraPlcId = cameraPlcId; this.command = command; this.executeTime = System.currentTimeMillis()+delayTime; this.delayTime = delayTime; + } @Override public long getDelay(TimeUnit unit) { diff --git a/web/src/main/java/com/zhehekeji/web/service/PlcService.java b/web/src/main/java/com/zhehekeji/web/service/PlcService.java index c9d1f21..9ee3e02 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -738,16 +738,16 @@ public class PlcService { //只采用队列,队列中有数据则自动发送 //模拟随行 if (configProperties.isInventorySimulationFollow()) { - - String s = (new TransmissionPojo(street, transmissionPojo.getRow(),transmissionPojo.getColumn(),transmissionPojo.getDirection(), "")).toString(TransmissionType.GPS); + TransmissionPojo transmissionPojoFollow = new TransmissionPojo(street, transmissionPojo.getRow(),transmissionPojo.getColumn(),transmissionPojo.getDirection(), ""); + String s = (transmissionPojoFollow).toString(TransmissionType.GPS); //放置到队列中,等待取图返回后删除 - GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(), s, configProperties.getQueueSpanTime()); + GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(), s, configProperties.getQueueSpanTime(),transmissionPojoFollow); } //放置到队列中,等待取图返回后删除 - GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(), transmissionPojo.toString(TransmissionType.GPS), configProperties.getQueueSpanTime()); + GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(), transmissionPojo.toString(TransmissionType.GPS), configProperties.getQueueSpanTime(),transmissionPojo); } } catch (InterruptedException e) { diff --git a/web/src/main/java/com/zhehekeji/web/service/StockService.java b/web/src/main/java/com/zhehekeji/web/service/StockService.java index 461b189..3075ae0 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StockService.java +++ b/web/src/main/java/com/zhehekeji/web/service/StockService.java @@ -327,10 +327,11 @@ public class StockService { //stock.setShelveId(stockCheck.getShelveId()); stock.setStatus(0); - } + }else { stock.setOveroperationPic("http://" + street.getPlcIp() + ":8007" + "/storeData/" + street.getPlcId() + "/" + stock.getRow() + "/" + stock.getColumn() + "/" + (stock.getDirection() + 2) + ".PNG"); + } return stock; } @@ -445,12 +446,21 @@ public class StockService { return stock; } - public List getCategoryList() { - List list = new ArrayList<>(); + public Map getCategoryList() { + Map map = new HashMap<>(); if(configProperties.getProductDoc() != null){ + List list = new ArrayList<>(); list = FileUtil.readLinesToList(configProperties.getProductDoc()); + for(String s : list){ + String[] split = s.split(":"); + if(split.length == 2) { + map.put(split[0], split[1]); + }else { + map.put(split[0], split[0]); + } + } } - return list; + return map; } diff --git a/web/src/main/java/com/zhehekeji/web/service/client/Decoder.java b/web/src/main/java/com/zhehekeji/web/service/client/Decoder.java index 3874cb1..d5885a3 100644 --- a/web/src/main/java/com/zhehekeji/web/service/client/Decoder.java +++ b/web/src/main/java/com/zhehekeji/web/service/client/Decoder.java @@ -112,7 +112,7 @@ public class Decoder extends DelimiterBasedFrameDecoder { throw new RuntimeException(e); } //删除队列的拍照数据 - GetPhotoDelayExecutor.remove(transmissionPojo.getStreetNumber(),transmissionPojo.toString(TransmissionType.GPS)); + GetPhotoDelayExecutor.remove(transmissionPojo.getStreetNumber(),transmissionPojo); //读取下一个发送 CameraDelayTask cameraDelayTask = GetPhotoDelayExecutor.nextOne(transmissionPojo.getStreetNumber(),transmissionPojo.toString(TransmissionType.GPS)); if (cameraDelayTask != null) { @@ -131,6 +131,7 @@ public class Decoder extends DelimiterBasedFrameDecoder { ksecInfo.getData().setQuantity(transmissionPojo.getCount()); ksecInfo.getData().setCheckRlt(transmissionPojo.getResult()); KsecNettyClient.write(ksecInfo); + GetPhotoDelayExecutor.removeTask(transmissionPojo.getStreetNumber(), transmissionPojo); diff --git a/web/src/main/java/com/zhehekeji/web/service/client/GetPhotoDelayExecutor.java b/web/src/main/java/com/zhehekeji/web/service/client/GetPhotoDelayExecutor.java index 7f3c4b1..d836af0 100644 --- a/web/src/main/java/com/zhehekeji/web/service/client/GetPhotoDelayExecutor.java +++ b/web/src/main/java/com/zhehekeji/web/service/client/GetPhotoDelayExecutor.java @@ -23,7 +23,8 @@ public class GetPhotoDelayExecutor { // 延时队列,存放CameraDelayTask任务 public static Map> cameraDelayTaskMap = new ConcurrentHashMap<>(); // 线程池,用于执行延时任务 - private static ExecutorService exec = Executors.newFixedThreadPool(10); + public static DelayQueue delayTasks = new DelayQueue<>(); + private static ExecutorService exec = Executors.newFixedThreadPool(15); /** * 向延时队列中添加一个拍照延时任务。 @@ -32,7 +33,7 @@ public class GetPhotoDelayExecutor { * @param getPhotoCommand 获取照片的命令 * @param time 任务延时时间 */ - public static void addCameraDelayTask(String cameraPlcId, String getPhotoCommand, long time) { + public static void addCameraDelayTask(String cameraPlcId, String getPhotoCommand, long time,TransmissionPojo transmissionPojo) { if(cameraDelayTaskMap.get(cameraPlcId)==null || cameraDelayTaskMap.get(cameraPlcId).size() == 0) { if( ClientChanel.get(cameraPlcId) != null){ @@ -43,7 +44,7 @@ public class GetPhotoDelayExecutor { log.info("队列中无数据,未找到通信"+cameraPlcId); } } - CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraPlcId, getPhotoCommand, time); + CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraPlcId, getPhotoCommand, time,transmissionPojo); if(cameraDelayTaskMap.get(cameraPlcId)!=null){ cameraDelayTaskMap.get(cameraPlcId).add(cameraDelayTask); @@ -51,27 +52,56 @@ public class GetPhotoDelayExecutor { cameraDelayTaskMap.put(cameraPlcId,new DelayQueue<>()); cameraDelayTaskMap.get(cameraPlcId).add(cameraDelayTask); } + delayTasks.add(cameraDelayTask); } /** * 根据命令和相机PLC编号从延时队列中移除任务。 * - * @param getPhotoCommand 获取巷道编号 * @param cameraPlcId 命令行 */ - public static CameraDelayTask remove(String cameraPlcId, String getPhotoCommand) { - cameraPlcId = cameraPlcId.intern(); + public static CameraDelayTask remove(String cameraPlcId, TransmissionPojo transmissionPojo) { synchronized (cameraPlcId) { // 将延时队列中的任务转换为数组,便于遍历和移除 Object[] objects = cameraDelayTaskMap.get(cameraPlcId).toArray(); if(objects.length > 0) { - CameraDelayTask cameraDelayTask = (CameraDelayTask)objects[0]; + for(Object object : objects){ - if (cameraDelayTask != null) { - cameraDelayTaskMap.get(cameraPlcId).remove(cameraDelayTask); - return cameraDelayTask; + CameraDelayTask cameraDelayTask = (CameraDelayTask)object; + if (cameraDelayTask != null + && cameraDelayTask.getTransmissionPojo().getTaskId().equals(transmissionPojo.getTaskId()) + && cameraDelayTask.getTransmissionPojo().getCheckId().equals(transmissionPojo.getCheckId()) + && cameraDelayTask.getTransmissionPojo().getDirection().equals(transmissionPojo.getDirection())) { + cameraDelayTaskMap.get(cameraPlcId).remove(cameraDelayTask); + return cameraDelayTask; + + } + } + + + } + } + return null; + } + public static CameraDelayTask removeTask(String cameraPlcId, TransmissionPojo transmissionPojo) { + synchronized (cameraPlcId){ + // 将延时队列中的任务转换为数组,便于遍历和移除 + Object[] objects = delayTasks.toArray(); + if(objects.length > 0) { + for(Object object : objects){ + CameraDelayTask cameraDelayTask = (CameraDelayTask)object; + if (cameraDelayTask != null + && cameraDelayTask.getTransmissionPojo().getTaskId().equals(transmissionPojo.getTaskId()) + && cameraDelayTask.getTransmissionPojo().getCheckId().equals(transmissionPojo.getCheckId()) + && cameraDelayTask.getTransmissionPojo().getDirection().equals(transmissionPojo.getDirection())) { + delayTasks.remove(cameraDelayTask); + return cameraDelayTask; + + } } + + } } return null; @@ -100,6 +130,7 @@ public class GetPhotoDelayExecutor { exec.execute(new GetPhotoDelayExecutor.Consumer(street)); } + exec.execute(new GetPhotoDelayExecutor.TaskConsumer()); } /** @@ -120,8 +151,40 @@ public class GetPhotoDelayExecutor { // 从Spring上下文中获取PlcService实例 PlcService plcService = SpringContextUtil.getBean(PlcService.class); // 从延时队列中获取并移除一个任务 - if(cameraDelayTaskMap.get(street.getPlcId())!= null) { + if (cameraDelayTaskMap.get(street.getPlcId())!=null) { CameraDelayTask cameraDelayTask = cameraDelayTaskMap.get(street.getPlcId()).take(); +// if (cameraDelayTask != null) { +// // 构造传输对象,并将任务命令等信息设置进去 +// TransmissionPojo transmissionPojo = new TransmissionPojo(cameraDelayTask.getCommand()); +// // 调用PLC服务,模拟发送数据到上位机 +// KsecInfo ksecInfo = plcService.getKsecDataInfo(transmissionPojo, "E"); +// ksecInfo.getData().setTypeNum(transmissionPojo.getCategory()); +// ksecInfo.getData().setQuantity(transmissionPojo.getCount()); +// ksecInfo.getData().setCheckRlt(0); +// // 将信息发送给上位机 +// if (!transmissionPojo.getTaskId().equals("0")) +// KsecNettyClient.write(ksecInfo); +// } + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + private static class TaskConsumer implements Runnable { + + /** + * 无限循环,不断从延时队列中取出任务并执行。 + */ + @Override + public void run() { + while (true) { + try { + // 从Spring上下文中获取PlcService实例 + PlcService plcService = SpringContextUtil.getBean(PlcService.class); + // 从延时队列中获取并移除一个任务 + CameraDelayTask cameraDelayTask = delayTasks.take(); if (cameraDelayTask != null) { // 构造传输对象,并将任务命令等信息设置进去 TransmissionPojo transmissionPojo = new TransmissionPojo(cameraDelayTask.getCommand()); @@ -134,7 +197,6 @@ public class GetPhotoDelayExecutor { if (!transmissionPojo.getTaskId().equals("0")) KsecNettyClient.write(ksecInfo); } - } } catch (InterruptedException e) { e.printStackTrace(); } @@ -142,5 +204,4 @@ public class GetPhotoDelayExecutor { } } - } diff --git a/web/src/main/java/com/zhehekeji/web/service/client/TransmissionPojo.java b/web/src/main/java/com/zhehekeji/web/service/client/TransmissionPojo.java index dc2d96d..145e06f 100644 --- a/web/src/main/java/com/zhehekeji/web/service/client/TransmissionPojo.java +++ b/web/src/main/java/com/zhehekeji/web/service/client/TransmissionPojo.java @@ -122,7 +122,13 @@ public class TransmissionPojo { this.result = Integer.parseInt(dataArray[7])==0 ?0:1; //不记录2d图像 //String path2D = "/fileData/"+this.taskId+"/"+this.checkId+"/"+this.direction+".jpg"; - String path3D = "/fileData/"+this.taskId+"/"+this.checkId+"/"+(this.direction+2)+".PNG"; + + String path3D ; + if((this.taskId!=null) && !"".equals(this.taskId)){ + path3D = "/fileData/"+this.taskId+"/"+this.checkId+"/"+(this.direction+2)+".PNG"; + }else { + path3D = "/fileData/"+this.checkId+"/"+(this.direction+2)+".PNG"; + } Set strings = new HashSet<>(); //strings.add(path2D); strings.add(path3D); @@ -136,6 +142,7 @@ public class TransmissionPojo { if(s[i].startsWith(".")) { s[i] = s[i].replaceFirst(".", ""); // 移除单个字符 } + // 或者 // stringArray[i] = stringArray[i].replaceAll(regexToRemove, ""); // 使用正则表达式移除字符类别 } @@ -151,8 +158,8 @@ public class TransmissionPojo { } public static void main(String[] args) { - - TransmissionPojo transmissionPojo = new TransmissionPojo("GPE&002/1/18&7&2&123&41111&30&0&fff;.\\\\f.png;/f.png>"); + //2024-05-31 17:52:07,909 INFO (Decoder.java:96)- receive client:RTE&001/1/9&2812&&2&0341&30&1&.\fileData\\2812\4.PNG;\fileData\\2812\2_0341_rlt.jpg&.\fileData\\2812\4.pcd, data length:106 + TransmissionPojo transmissionPojo = new TransmissionPojo("RTE&001/1/9&2812&&2&0341&30&1&.\\fileData\\\\2812\\4.PNG;\\fileData\\\\2812\\2_0341_rlt.jpg&.\\fileData\\\\2812\\4.pcd>"); System.out.println(transmissionPojo); } diff --git a/web/src/main/resources/application-prod.yml b/web/src/main/resources/application-prod.yml index 92ec1d1..cf32aad 100644 --- a/web/src/main/resources/application-prod.yml +++ b/web/src/main/resources/application-prod.yml @@ -70,7 +70,7 @@ IP: 127.0.0.1 # 服务端TCP端口 serverPort: 8056 # 服务端队列时间间隔(单位:ms) -queueSpanTime: 10000 +queueSpanTime: 20000 # ------------ 实时视频流 全部页面的格式 行列数量 videoStyleConfig: videoStyleRow: 4 @@ -96,6 +96,6 @@ scanCodeMode: # 照片 視頻保存多久 deleteFileDays: 30 -productDoc: "C:/Users/昊天/Desktop/新建 文本文档 (3).txt" +productDoc: "C:\\Users\\昊天\\Desktop\\新建文本文档.txt" -inventorySimulationFollow: false \ No newline at end of file +inventorySimulationFollow: true \ No newline at end of file