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 ca85c3f..2b48c4b 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 @@ -1,11 +1,9 @@ package com.zhehekeji.web.service.client; import com.zhehekeji.web.lib.CameraDelayTask; -import com.zhehekeji.web.service.EmptyCheckService; import com.zhehekeji.web.service.PlcService; import com.zhehekeji.web.service.ksec.KsecInfo; import com.zhehekeji.web.service.ksec.KsecNettyClient; -import com.zhehekeji.web.service.putian.*; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; @@ -87,44 +85,12 @@ public class Decoder extends DelimiterBasedFrameDecoder { if(HEART_BEAT.equals(transmissionPojo.getHeader())){ ClientChanel.connect(transmissionPojo.getStreetNumber(),ctx.channel()); } - //获取照片后发送进行计算逻辑,并在拍照队列中取出拍照发送 - else if(GET_PHOTO_END.equals(transmissionPojo.getHeader())){ - if(transmissionPojo.getTaskId() != null && !"0".equals(transmissionPojo.getTaskId())) { - ClientChanel.get(transmissionPojo.getStreetNumber()).writeAndFlush(transmissionPojo.toString(TransmissionType.RTS)); - } - try { - Thread.sleep(50L); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - //删除队列的拍照数据 - GetPhotoDelayExecutor.remove(transmissionPojo.getStreetNumber(),transmissionPojo.toString(TransmissionType.GPS)); - //发送给上位机 - CameraDelayTask cameraDelayTask = GetPhotoDelayExecutor.getNext(transmissionPojo.getStreetNumber()); - if (cameraDelayTask != null) { - TransmissionPojo pojo = new TransmissionPojo(cameraDelayTask.getCommand()); - ClientChanel.get(pojo.getStreetNumber()).writeAndFlush(pojo.toString(TransmissionType.GPS)); - } - - } - //照片和结果保存,并发送给上位机 + //将新图片旧图片从队列删除,并保存相关信息 else if(RETURN_CHECK.equals(transmissionPojo.getHeader())){ - //保存数据 - plcService.visualCalculationResults(transmissionPojo); - //发送给上位机 - KsecInfo ksecInfo = plcService.getKsecDataInfo(transmissionPojo,"E"); - ksecInfo.getData().setTypeNum(transmissionPojo.getCategory()); - ksecInfo.getData().setQuantity(transmissionPojo.getCount()); - ksecInfo.getData().setCheckRlt(transmissionPojo.getResult()); - KsecNettyClient.write(ksecInfo); - } - //照片和结果保存,并发送给上位机 - else if(FOLLOW_GET_PHOTO_END.equals(transmissionPojo.getHeader())){ - //保存数据 - plcService.saveFollowPhoto(transmissionPojo); + } } } diff --git a/web/src/main/java/com/zhehekeji/web/service/client/NettyServer.java b/web/src/main/java/com/zhehekeji/web/service/client/NettyServer.java index ec4266d..da90a3d 100644 --- a/web/src/main/java/com/zhehekeji/web/service/client/NettyServer.java +++ b/web/src/main/java/com/zhehekeji/web/service/client/NettyServer.java @@ -1,6 +1,5 @@ package com.zhehekeji.web.service.client; -import com.zhehekeji.web.service.EmptyCheckService; import com.zhehekeji.web.service.PlcService; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; 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 6911619..fd5b808 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 @@ -11,38 +11,12 @@ import java.util.Set; @Data public class TransmissionPojo { private String data; - private String[] dataArray; private String header; - private String streetNumber;//巷道标识符 - - private Integer row;//行 - private Integer column;//列 - - private String pcd;//点位文件路径 - private String taskId; - private String checkId; - private Integer direction;//左右 - private Integer count = 0; //数量 - private String category = ""; //品规 - private Set picsPath; //照片 + private String streetNumber; + private double length; + private String[] dataArray; - private Integer result; - public TransmissionPojo(CheckLog checkLog , Street street){ - this.checkId = checkLog.getId().toString(); - this.streetNumber = street.getPlcId(); - this.taskId = checkLog.getLotnum(); - this.row = checkLog.getRow(); - this.column = checkLog.getColumn(); - this.direction = checkLog.getDirection(); - this.count = checkLog.getCount(); - if(checkLog.getCategory() != null && checkLog.getCategory().contains("/")) { - this.category = checkLog.getCategory().split("/")[0]; - }else { - this.category = checkLog.getCategory(); - } - - } /** * 将给定数字转换为指定长度(默认3位)的字符,不足部分用“0”补全。 @@ -62,90 +36,19 @@ public class TransmissionPojo { } return numStr; } - public TransmissionPojo( Street street,Integer row , Integer column,Integer direction,String orderId){ - this.streetNumber = street.getPlcId(); - this.row = row; - this.taskId = "0"; - this.direction = direction; - this.column = column; - this.checkId = convertNumberToFixedLengthChars(row, 3) + convertNumberToFixedLengthChars(column, 3); - - } - public String toString(TransmissionType type) { - this.header = type.toString(); - if (type == TransmissionType.ST) { - return "ST&" + streetNumber + "&" + checkId + "&" + taskId + "&" + direction ; - }else if (type == TransmissionType.GPS) { - return "GPS&" + streetNumber +"/"+row +"/"+column+ "&" + checkId + "&" + taskId + "&" + direction+ "&" + category + "&" + count; - }else if (type == TransmissionType.RTS) { - return "RTS&" + streetNumber +"/"+row +"/"+column+ "&" + checkId + "&" + taskId + "&" + direction + "&" + category + "&" + count; - } - return ""; - } public TransmissionPojo(String data) { this.data = data; data = data.replace(">", ""); - this.dataArray = data.split("&"); - this.header = dataArray[0]; - if(dataArray[1].contains("/")) { - String[] dataArr = dataArray[1].split("/"); - this.streetNumber = dataArr[0]; - this.row = Integer.valueOf(dataArr[1]); - if(dataArr.length > 2) { - this.column = Integer.valueOf(dataArr[2]); - } - }else { - this.streetNumber = dataArray[1]; - } - if (dataArray.length > 2) { - this.checkId = dataArray[2]; - this.taskId = (dataArray[3]); - if(dataArray[4] != null && !"".equals(dataArray[4]) && !"null".equals(dataArray[4])) { - this.direction = Integer.valueOf(dataArray[4]); - } - } - - if (dataArray.length > 5) { - if(dataArray[5] != null &&!"".equals(dataArray[5]) && !"null".equals(dataArray[5]) ) { + this.dataArray = data.split(";"); - this.category = dataArray[5]; - } - if( dataArray.length > 6 && dataArray[6] != null && !"".equals(dataArray[6]) && ! "null".equals(dataArray[5])) { - this.count = Integer.valueOf(dataArray[6]); - } - } - if (dataArray.length > 7) { - 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"; - Set strings = new HashSet<>(); - //strings.add(path2D); - strings.add(path3D); - - // 将数组中的元素添加到 Set 集合中 - if(dataArray.length > 8 && dataArray[8].split(";").length>0) { - String[] s = dataArray[8].split(";"); - for (int i = 0; i < s.length; i++) { - s[i] = s[i].replace("\\\\","/"); - s[i] = s[i].replace("\\","/"); - if(s[i].startsWith(".")) { - s[i] = s[i].replaceFirst(".", ""); // 移除单个字符 - } - // 或者 - // stringArray[i] = stringArray[i].replaceAll(regexToRemove, ""); // 使用正则表达式移除字符类别 - } - Collections.addAll(strings,s); - strings.remove(""); - } - this.picsPath = strings; + this.header = (dataArray[0]); + this.streetNumber = (dataArray[1]); + if (dataArray.length > 2) { + this.length = Double.parseDouble(dataArray[2]); } - if(this.taskId != null && !"".equals(this.taskId) && this.checkId != null && !"".equals(this.checkId)) - this.pcd = "/fileData/"+this.taskId+"/"+this.checkId+"/"+(this.direction+2)+".pcd"; - } public static void main(String[] args) { diff --git a/web/src/main/java/com/zhehekeji/web/service/client/image/ImageQueueReplacer.java b/web/src/main/java/com/zhehekeji/web/service/client/image/ImageQueueReplacer.java new file mode 100644 index 0000000..a86be05 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/service/client/image/ImageQueueReplacer.java @@ -0,0 +1,74 @@ +package com.zhehekeji.web.service.client.image; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.concurrent.LinkedBlockingQueue; +import javax.imageio.ImageIO; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; +import javax.imageio.ImageIO; + +public class ImageQueueReplacer { + + private final String targetDirectory; + private final LinkedBlockingQueue imageQueue; + private final Semaphore semaphore; + private volatile boolean running = true; + + public ImageQueueReplacer(String targetDirectory) { + this.targetDirectory = targetDirectory; + this.imageQueue = new LinkedBlockingQueue<>(); + this.semaphore = new Semaphore(0); // 初始信号量为0 + } + + public void queueImage(BufferedImage image) { + imageQueue.add(image); + semaphore.release(); // 图片入队时释放信号量,告知有图片可处理 + } + + public void startAutoReplace(String imageName) { + Thread autoReplaceThread = new Thread(() -> { + while (running) { + try { + semaphore.acquire(); // 等待信号量,表明有图片或开始指令 + BufferedImage imageToReplace; + while ((imageToReplace = imageQueue.poll()) != null) { + replaceImage(imageToReplace, imageName); + } + // 队列为空时,仅在第一次启动时执行覆盖(根据需求调整) + if (semaphore.availablePermits() == 0 && imageQueue.isEmpty()) { + replaceImage(null, imageName); // 使用null表示无图片可覆盖 + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } + } + }); + autoReplaceThread.setDaemon(true); + autoReplaceThread.start(); + } + + private void replaceImage(BufferedImage image, String imageName) { + if (image != null) { + File outputFile = new File(targetDirectory, imageName); + try { + ImageIO.write(image, "jpg", outputFile); + System.out.println("Image saved: " + outputFile.getAbsolutePath()); + } catch (IOException e) { + System.err.println("Error saving image: " + e.getMessage()); + } + } else { + System.out.println("No image available to replace."); + } + } + + public void stop() { + running = false; + } +} diff --git a/web/src/main/java/com/zhehekeji/web/service/client/image/ImageSaver.java b/web/src/main/java/com/zhehekeji/web/service/client/image/ImageSaver.java new file mode 100644 index 0000000..44c4b20 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/service/client/image/ImageSaver.java @@ -0,0 +1,28 @@ +package com.zhehekeji.web.service.client.image; + +import lombok.extern.slf4j.Slf4j; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import javax.imageio.ImageIO; + +@Slf4j +public class ImageSaver { + + private final String targetDirectory; + + public ImageSaver(String targetDirectory) { + this.targetDirectory = targetDirectory; + } + + public void saveImage(BufferedImage image, String imageName) { + File outputFile = new File(targetDirectory, imageName); + try { + ImageIO.write(image, "jpg", outputFile); + System.out.println("Image saved: " + outputFile.getAbsolutePath()); + } catch (IOException e) { + System.err.println("Error saving image: " + e.getMessage()); + } + } +}