diff --git a/web/src/main/java/com/zhehekeji/web/entity/CheckLog.java b/web/src/main/java/com/zhehekeji/web/entity/CheckLog.java index 049b5f3..1535f0d 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/CheckLog.java +++ b/web/src/main/java/com/zhehekeji/web/entity/CheckLog.java @@ -46,8 +46,7 @@ public class CheckLog { private Integer status; - @TableId(type = IdType.AUTO) - private Integer taskId; + private String taskId; private String pic; diff --git a/web/src/main/java/com/zhehekeji/web/entity/Stock.java b/web/src/main/java/com/zhehekeji/web/entity/Stock.java index 85994e8..664793e 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Stock.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Stock.java @@ -59,6 +59,9 @@ public class Stock { private Integer direction; + + private String QrCode; + private Double length; private Integer side; @TableField(value = "`row`") diff --git a/web/src/main/java/com/zhehekeji/web/pojo/stock/StockCheck.java b/web/src/main/java/com/zhehekeji/web/pojo/stock/StockCheck.java index 2f1fc0b..9a500cb 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/stock/StockCheck.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/stock/StockCheck.java @@ -1,7 +1,9 @@ package com.zhehekeji.web.pojo.stock; import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @@ -9,12 +11,16 @@ import javax.validation.constraints.NotNull; @Data public class StockCheck { + // @NotEmpty(message = "货架号不能为空") // @ApiModelProperty("货架号") // private String shelveId; private Integer streetId; + private String streetPlc; + + private Integer direction; private Integer side; @@ -29,4 +35,10 @@ public class StockCheck { private Integer ok; + private Double length; + private String QrCode; + + private String checkNum; + + } diff --git a/web/src/main/java/com/zhehekeji/web/service/InitService.java b/web/src/main/java/com/zhehekeji/web/service/InitService.java index 17731b6..5d88ad3 100644 --- a/web/src/main/java/com/zhehekeji/web/service/InitService.java +++ b/web/src/main/java/com/zhehekeji/web/service/InitService.java @@ -1,5 +1,6 @@ package com.zhehekeji.web.service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zhehekeji.filter.aspect.LPLicense; import com.zhehekeji.web.config.ConfigProperties; import com.zhehekeji.web.entity.Camera; @@ -14,6 +15,7 @@ import com.zhehekeji.web.mapper.CameraMapper; import com.zhehekeji.web.mapper.SensorGunMapper; import com.zhehekeji.web.mapper.StreetMapper; import com.zhehekeji.web.service.client.NettyServer; +import com.zhehekeji.web.service.client.image.GetPhotoDelayExecutor; import com.zhehekeji.web.service.ksec.KsecNettyClient; import com.zhehekeji.web.service.robotic.NettyClient; import com.zhehekeji.web.service.sick.SickNettyClient; @@ -120,6 +122,7 @@ public class InitService implements ApplicationRunner { NettyServer nettyServer = new NettyServer(); nettyServer.CreateNettyServer(9040); TaskDelayExecutor.runMp4DownloadExecutor(); + GetPhotoDelayExecutor.runExecutor(streetMapper.selectList(new QueryWrapper<>()),plcService); } class LoginThread extends Thread{ 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 421ebca..23dc569 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -10,13 +10,18 @@ import com.zhehekeji.web.lib.*; import com.zhehekeji.web.mapper.*; import com.zhehekeji.web.pojo.CameraPtzPojo; import com.zhehekeji.web.pojo.OrderVO; +import com.zhehekeji.web.pojo.stock.StockCheck; import com.zhehekeji.web.service.RFID.RFIDMap; import com.zhehekeji.web.service.RFID.RFIDSocket; import com.zhehekeji.web.service.client.ClientChanel; +import com.zhehekeji.web.service.client.TransmissionPojo; +import com.zhehekeji.web.service.client.image.GetPhotoDelayExecutor; import com.zhehekeji.web.service.client.image.ImageSaver; import com.zhehekeji.web.service.damLightSource.JYDAMEquip; import com.zhehekeji.web.service.damLightSource.JYDamHelper; import com.zhehekeji.web.service.hikLightSource.HikControlSocket; +import com.zhehekeji.web.service.ksec.KsecDataInfo; +import com.zhehekeji.web.service.ksec.KsecInfo; import com.zhehekeji.web.service.ksec.KsecNettyClient; import com.zhehekeji.web.service.sick.SickSocket; import lombok.extern.slf4j.Slf4j; @@ -101,7 +106,17 @@ public class PlcService { List connIds = StreetConn.connList(); return (count - connIds.size()); } + public Street getStreetByPlcId(String streetPlc) { + return streetMapper.getStreetByPlcId(streetPlc); + } + public Stock checkCorrect(StockCheck stockCheck){ + return stockService.checkCorrect(stockCheck); + } + + public Stock stockInfo(StockCheck stockCheck){ + return stockService.stockInfo(stockCheck); + } /** * 开始工单 robotic plcId是plcId,昆船的plcId是来自包体,即srmNumber * @@ -603,37 +618,11 @@ public class PlcService { //判断单双伸 type=0 单伸 1为双伸 Integer type; if(leftRight == 1){ - type = street.getLeftType(); + return street.getCamera1Id(); }else { - type = street.getRightType(); + return street.getCamera2Id(); } - if(type == 0){ - //单伸 - if (street.getCamera1Id() != null && street.getCamera2Id() != null && street.getCamera1Id() != 0 && street.getCamera2Id() != 0) { - if (leftRight == 1) { - return street.getCamera2Id(); - } else { - return street.getCamera1Id(); - } - } else { - Integer cameraId = street.getCamera1Id() != null && street.getCamera1Id() != 0 ? street.getCamera1Id() : street.getCamera2Id(); - return cameraId; - } - }else { - if (street.getCamera1Id() != null && street.getCamera2Id() != null && street.getCamera1Id() != 0 && street.getCamera2Id() != 0) { - //双伸 todo 这个因项目而异,看现场的情况 - //默认是 左侧返回camera2 右侧返回camera1 - if(plcCmdInfo.getLeftRight1() == 1){ - return street.getCamera2Id(); - }else { - return street.getCamera1Id(); - } - } else { - Integer cameraId = street.getCamera1Id() != null && street.getCamera1Id() != 0 ? street.getCamera1Id() : street.getCamera2Id(); - return cameraId; - } - } } @@ -652,53 +641,31 @@ public class PlcService { //南通通威拍摄货物顶部时按列号的单双来判断单数左侧 Integer cameraId = getCameraByPlcCmd(plcCmdInfo,plcCmdInfo.getColumn1()%2==1?1:2); - - Integer leftRightTop = plcCmdInfo.getLeftRight1() == 1 ? 2 : 1; - Integer cameraIdTop = getCameraByPlcCmd(plcCmdInfo, leftRightTop); - if(plcCmdInfo.getSeparation1() == 1 && configProperties.getScanCodeMode().getTray() == 2){ - //内测 - String c = cmdCode + "-" + plcCmdInfo.getLeftRightStr(1) + "-IN"; - log.info("camera ptz"+c); - gyrateCameraByCode(cameraIdTop, c); - }else { - log.info("camera ptz"+cmdCode); - gyrateCameraByCode(cameraIdTop, cmdCode); - try { - Thread.sleep(configProperties.getCameraConfig().getDelayCaptureTime()); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } + //对侧拍摄二维码 + Integer cameraIdQt = getCameraByPlcCmd(plcCmdInfo, plcCmdInfo.getLeftRight1() == 1 ? 2 : 1); + gyrateCameraByCode(cameraId, "E1-Len"); String path = PathUtil.createFileNameByRowColumn("jpg",cameraId,plcCmdInfo.getRow1(),plcCmdInfo.getColumn1()); - //拍照暂停1s再拍 + //拍照暂停1s再拍,拍摄正面的二维码 try { Thread.sleep(configProperties.getCameraConfig().getEDelayCaptureTime()); } catch (InterruptedException e) { e.printStackTrace(); } - cameraCapture(cameraIdTop,false,null,path); + cameraCapture(cameraId,false,null,path); //成都蜜雪冰城 只拍照人工核对 - String e2 = "E2-" + plcCmdInfo.getLeftRightStr(1) + "-IN"; - log.info("camera ptz"+e2); - gyrateCameraByCode(cameraId, e2); + gyrateCameraByCode(cameraIdQt, "E1-QRCode"); try { Thread.sleep(configProperties.getCameraConfig().getEDelayCaptureTime()); } catch (InterruptedException e) { e.printStackTrace(); } - cameraCapture(cameraId,false,null,path+".jpg"); + cameraCapture(cameraIdQt,false,null,path+".jpg"); OrderInfo orderInfo = new OrderInfo(street,plcCmdInfo,1,cmdCode); Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(orderInfo.getStreetId(),orderInfo.getLeftRight(),orderInfo.getSeparation(),orderInfo.getRow(),orderInfo.getColumn()); //核对异常 if(stock == null){ - /* stock = new Stock(null,null,plcCmdInfo.getOrderNum(),plcCmdInfo.getLotnum() - ,"", null,null,wmsCode,wmsCatagary,null, - wmsTrayCode,"",orderInfo.getStreetId(), - orderInfo.getLeftRight(),orderInfo.getSeparation(), - orderInfo.getRow(),orderInfo.getColumn(),0,null,null, - path, LocalDateTime.now(),null);*/ stock = Stock.builder() .checkNum(plcCmdInfo.getOrderNum()) .lotnum(plcCmdInfo.getLotnum()) @@ -740,16 +707,49 @@ public class PlcService { long end = System.currentTimeMillis(); long s = end - startTime; //发送图片,触发拍照和id - imageSaver.uploadFileToFtp(street.getPlcIp(), configProperties.getSavePath().getMediaPath() + path); - ClientChanel.get(street.getPlcId()).writeAndFlush("id:"+stock.getCheckNum()); - ClientChanel.get(street.getPlcId()).writeAndFlush("tar:1"); + //增加到队列中 + TransmissionPojo transmissionPojo = TransmissionPojo.builder() + .ip(street.getPlcIp()) + .streetNumber(street.getPlcId()) + .direction(stock.getDirection()) + .id(stock.getCheckNum()) + .localFilePath(configProperties.getSavePath().getMediaPath() + path) + .build(); + GetPhotoDelayExecutor.addDelayTask(transmissionPojo,15000l); log.info("time:{}millisecond",s); return true; } + + + //获取旧数据并发送给上位机 + public KsecInfo getKsecDataInfo(TransmissionPojo transmissionPojo, String type){ + KsecDataInfo ksecDataInfo = new KsecDataInfo(); + CheckLog checkLog = checkLogMapper.selectOne(new QueryWrapper() + .eq("check_Num",transmissionPojo.getId()) + .orderByDesc("export_Time") + .last("limit 1")); + if(checkLog!=null) { + ksecDataInfo.setLotnum(checkLog.getLotnum()); + ksecDataInfo.setSRMNumber(transmissionPojo.getStreetNumber()); + ksecDataInfo.setCmdName(type); + ksecDataInfo.setTaskId(checkLog.getTaskId().toString()); + ksecDataInfo.setFromDirection(checkLog.getDirection()); + ksecDataInfo.setFromColumn(checkLog.getColumn()); + ksecDataInfo.setFromRow(checkLog.getRow()); + ksecDataInfo.setFromSide(checkLog.getSide()); + ksecDataInfo.setCode(checkLog.getCode()); + ksecDataInfo.setTrayCode(checkLog.getTrayCode()); + ksecDataInfo.setLotnum(checkLog.getLotnum()); + } + + KsecInfo ksecInfo = new KsecInfo("KC", "E", ksecDataInfo); + KsecNettyClient.write(ksecInfo); + return ksecInfo; + } @Resource ImageSaver imageSaver; public CheckLog checkLog(Stock stock){ @@ -768,6 +768,7 @@ public class PlcService { checkLog.setTrayCode(stock.getTrayCode()); checkLog.setWmsTrayCode(stock.getWmsTrayCode()); checkLog.setLotnum(stock.getLotnum()); + checkLog.setTaskId(stock.getCheckNum().substring(stock.getCheckNum().lastIndexOf("_")+1)); log.info("checklogmapper start insert new checklog info."); checkLogMapper.insert(checkLog); log.info("checklogmapper insert new checklog info finished."); diff --git a/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java b/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java index 09d479f..440cfd3 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java +++ b/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java @@ -145,6 +145,8 @@ public class StockCheckRunnable implements Runnable { checkLog.setTrayCode(stock.getTrayCode()); checkLog.setWmsTrayCode(stock.getWmsTrayCode()); checkLog.setLotnum(stock.getLotnum()); + checkLog.setTaskId(stock.getCheckNum().substring(stock.getCheckNum().lastIndexOf("_")+1)); checkLogMapper.insert(checkLog); } + } 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 a4c6b1a..e797a30 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StockService.java +++ b/web/src/main/java/com/zhehekeji/web/service/StockService.java @@ -394,18 +394,28 @@ public class StockService { * @return */ public Stock stockInfo(StockCheck stockCheck) { + Street street = streetMapper.selectOne(new QueryWrapper() + .eq(stockCheck.getStreetId()!=null,"id",stockCheck.getStreetId()) + .eq(stockCheck.getStreetPlc()!=null,"plc_Id",stockCheck.getStreetPlc())); + Stock stock = stockMapper.selectOne(new QueryWrapper() + .eq(street.getId()!=null ,"street_id",street.getId()) + .eq(stockCheck.getDirection()!=null ,"direction",stockCheck.getDirection()) + .eq(stockCheck.getSide()!=null ,"side",stockCheck.getSide()) + .eq(stockCheck.getRow()!=null ,"`row`",stockCheck.getRow()) + .eq(stockCheck.getColumn()!=null ,"`column`",stockCheck.getColumn()) + .eq(stockCheck.getCheckNum()!=null ,"check_num",stockCheck.getCheckNum()) + .orderByDesc("export_Time").last("limit 1") + ); - Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(stockCheck.getStreetId(), stockCheck.getDirection(), stockCheck.getSide(), stockCheck.getRow(), stockCheck.getColumn()); if (stock == null) { stock = new Stock(); stock.setColumn(stockCheck.getColumn()); stock.setRow(stockCheck.getRow()); //stock.setShelveId(stockCheck.getShelveId()); stock.setStatus(0); - Street street = streetMapper.selectById(stockCheck.getStreetId()); + stock.setStreetName(street.getName()); } else { - Street street = streetMapper.selectById(stock.getStreetId()); stock.setStreetName(street.getName()); List stockLogs = stockLogMapper.selectList(new QueryWrapper().eq("`row`", stockCheck.getRow()).eq("`column`", stockCheck.getColumn()).eq("street_id", stockCheck.getStreetId()).eq("direction", stockCheck.getDirection()).eq("side", stockCheck.getSide()).orderByDesc("create_time").last(" limit 2")); @@ -470,9 +480,17 @@ public class StockService { log.info("check stock correct, street_id:{},direction:{},side:{},row:{},column:{}", stockCheck.getStreetId(), stockCheck.getDirection(), stockCheck.getSide(), stockCheck.getRow(), stockCheck.getColumn()); if (stockCheck.getOk() == 1) { stock.setStatus(StockStatus.MANUAL.getStatus()); - } else { - stock.setStatus(StockStatus.ERROR.getStatus()); - } + } else if(stockCheck.getOk() == -1) { + stock.setLength(stockCheck.getLength()); + stock.setQrCode(stockCheck.getQrCode()); + if(stockCheck.getLength()>600) { + + stock.setStatus(StockStatus.SUCCESS.getStatus()); + } + }else { + stock.setStatus(StockStatus.ERROR.getStatus()); + } + stockMapper.updateById(stock); checkLog(stock); diff --git a/web/src/main/java/com/zhehekeji/web/service/client/ClientChanel.java b/web/src/main/java/com/zhehekeji/web/service/client/ClientChanel.java index 4231f2d..e1d12cf 100644 --- a/web/src/main/java/com/zhehekeji/web/service/client/ClientChanel.java +++ b/web/src/main/java/com/zhehekeji/web/service/client/ClientChanel.java @@ -1,6 +1,7 @@ package com.zhehekeji.web.service.client; +import com.zhehekeji.web.service.client.image.ImageSaver; import io.netty.channel.Channel; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; @@ -99,6 +100,26 @@ public class ClientChanel { public static Channel get(String key){ return channelMap.get(key); } + public static void sending(TransmissionPojo transmissionPojo){ + if(transmissionPojo != null) { + synchronized (transmissionPojo.getStreetNumber()) { + //configProperties.getSavePath().getMediaPath() + path + if (ClientChanel.get(transmissionPojo.getStreetNumber()) != null) { + ImageSaver.uploadFileToFtp(transmissionPojo.getIp(), transmissionPojo.getLocalFilePath()); + ClientChanel.get(transmissionPojo.getStreetNumber()).writeAndFlush("id:" + transmissionPojo.getId()); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + ClientChanel.get(transmissionPojo.getStreetNumber()).writeAndFlush("tar:1"); + + } + } + }else { + log.error("无可发送的信息"); + } + } public static void write(String data,String key){ if(channelMap.get(key) != null){ 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 033d3d1..8534dbd 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,17 @@ package com.zhehekeji.web.service.client; +import com.zhehekeji.common.util.SpringContextUtil; import com.zhehekeji.core.util.Assert; import com.zhehekeji.web.entity.Stock; +import com.zhehekeji.web.entity.Street; import com.zhehekeji.web.lib.CameraDelayTask; import com.zhehekeji.web.mapper.StockMapper; +import com.zhehekeji.web.mapper.StreetMapper; +import com.zhehekeji.web.pojo.stock.StockCheck; import com.zhehekeji.web.pojo.stock.StockStatus; import com.zhehekeji.web.service.PlcService; +import com.zhehekeji.web.service.StockService; +import com.zhehekeji.web.service.client.image.GetPhotoDelayExecutor; import com.zhehekeji.web.service.ksec.KsecInfo; import com.zhehekeji.web.service.ksec.KsecNettyClient; import io.netty.buffer.ByteBuf; @@ -53,10 +59,20 @@ public class Decoder extends DelimiterBasedFrameDecoder { super(20000,true,false, Unpooled.copiedBuffer(">".getBytes()), Unpooled.copiedBuffer("$".getBytes())); - this.plcService = plcService; + if(plcService !=null) { + this.plcService = plcService; + }else { + // 从Spring上下文中获取PlcService实例 + this.plcService = SpringContextUtil.getBean(PlcService.class); + } } @Resource StockMapper stockMapper; + @Resource + StockService stockService; + + @Resource + StreetMapper streetMapper; @Override protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception { @@ -96,22 +112,40 @@ public class Decoder extends DelimiterBasedFrameDecoder { } //将新图片旧图片从队列删除,并保存相关信息 else if(RETURN_CHECK.equals(transmissionPojo.getHeader())){ - if(transmissionPojo.getLength()>10){ - Stock stock = stockInfo(stockCheck); - Assert.isTrue(stock != null && stock.getId() != null, "该货位暂时没有记录"); - Integer oldStatus = stock.getStatus(); - //Assert.isTrue(StockStatus.ERROR.getStatus().equals(oldStatus), "无需核对"); - - log.info("check stock correct, street_id:{},direction:{},side:{},row:{},column:{}", stockCheck.getStreetId(), stockCheck.getDirection(), stockCheck.getSide(), stockCheck.getRow(), stockCheck.getColumn()); - if (stockCheck.getOk() == 1) { - stock.setStatus(StockStatus.MANUAL.getStatus()); - } else { - stock.setStatus(StockStatus.ERROR.getStatus()); + + if(transmissionPojo.getLength() != null) { + Double len = transmissionPojo.getLength(); + transmissionPojo = GetPhotoDelayExecutor.getOne(transmissionPojo.getStreetNumber(),transmissionPojo); + if(transmissionPojo != null) { + transmissionPojo.setLength(len); + } } + if(transmissionPojo != null && transmissionPojo.getQrCode() != null) { + - stockMapper.updateById(stock); - checkLog(stock); - } + String QrCode = transmissionPojo.getQrCode(); + transmissionPojo = GetPhotoDelayExecutor.getOne(transmissionPojo.getStreetNumber(),transmissionPojo); + if(transmissionPojo != null) { + transmissionPojo.setQrCode(QrCode); + } + } + if(transmissionPojo != null && transmissionPojo.getQrCode() != null && transmissionPojo.getLength() != null){ + + ClientChanel.get(transmissionPojo.getStreetNumber()).writeAndFlush("id:" + ""); + Street street = plcService.getStreetByPlcId(transmissionPojo.getStreetNumber()); + StockCheck stockCheck = new StockCheck(); + stockCheck.setStreetPlc(transmissionPojo.getStreetNumber()); + stockCheck.setCheckNum(transmissionPojo.getId()); + + stockCheck.setLength(transmissionPojo.getLength()); + stockCheck.setQrCode(transmissionPojo.getQrCode()); + stockCheck.setOk(-1); + Stock stock = plcService.checkCorrect(stockCheck); + plcService.getKsecDataInfo( transmissionPojo, "E"); + GetPhotoDelayExecutor.remove(transmissionPojo.getStreetNumber(),transmissionPojo); + ClientChanel.sending(GetPhotoDelayExecutor.nextOne(transmissionPojo.getStreetNumber(),transmissionPojo)); + + } diff --git a/web/src/main/java/com/zhehekeji/web/service/client/NettyConnectHandler.java b/web/src/main/java/com/zhehekeji/web/service/client/NettyConnectHandler.java index fe55324..60b8a79 100644 --- a/web/src/main/java/com/zhehekeji/web/service/client/NettyConnectHandler.java +++ b/web/src/main/java/com/zhehekeji/web/service/client/NettyConnectHandler.java @@ -25,6 +25,8 @@ public class NettyConnectHandler extends ChannelInboundHandlerAdapter { int clientPort = socketAddress.getPort(); log.info("ip:{} port:{} connected",clientIp, clientPort); ctx.fireChannelActive(); + + ctx.channel().writeAndFlush("id:" + ""); } /** 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 3f7c34d..496fade 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 @@ -2,22 +2,36 @@ package com.zhehekeji.web.service.client; import com.zhehekeji.web.entity.CheckLog; import com.zhehekeji.web.entity.Street; +import io.swagger.models.auth.In; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.Collections; import java.util.HashSet; import java.util.Set; @Data +@Builder +@AllArgsConstructor public class TransmissionPojo { private String data; + + private String localFilePath; private String header; private String streetNumber; + private String ip; + + private Integer direction; + //长度 - private double id; + private String id; //长度 - private double length; + private Double length; + //二维码 + private String QrCode; private String[] dataArray; @@ -39,6 +53,9 @@ public class TransmissionPojo { } return numStr; } + public TransmissionPojo(){ + + } public TransmissionPojo(String data) { @@ -51,12 +68,17 @@ public class TransmissionPojo { this.streetNumber = (dataArray[1]); if (dataArray.length > 2) { - this.id = Double.parseDouble(dataArray[2]); + this.id = (dataArray[2]); } - if (dataArray.length > 3) { + if (dataArray.length > 3 && !dataArray[3].equals("")) { this.length = Double.parseDouble(dataArray[3]); } + + if (dataArray.length > 4) { + + this.QrCode = dataArray[4]; + } } public static void main(String[] args) { diff --git a/web/src/main/java/com/zhehekeji/web/service/client/image/GetPhotoDelayExecutor.java b/web/src/main/java/com/zhehekeji/web/service/client/image/GetPhotoDelayExecutor.java new file mode 100644 index 0000000..67e683f --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/service/client/image/GetPhotoDelayExecutor.java @@ -0,0 +1,209 @@ +package com.zhehekeji.web.service.client.image; + +import com.zhehekeji.common.util.SpringContextUtil; +import com.zhehekeji.web.entity.Street; +import com.zhehekeji.web.lib.CameraDelayTask; +import com.zhehekeji.web.service.PlcService; +import com.zhehekeji.web.service.client.ClientChanel; +import com.zhehekeji.web.service.client.TransmissionPojo; +import com.zhehekeji.web.service.ksec.KsecInfo; +import com.zhehekeji.web.service.ksec.KsecNettyClient; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.*; + +/** + * GetPhotoDelayExecutor类用于管理照片获取的延时任务。 + */ +@Slf4j +public class GetPhotoDelayExecutor { + // 延时队列,存放DelayTask任务 + public static Map> delayTaskMap = new ConcurrentHashMap<>(); + //返回指令队列 + public static DelayQueue delayTasks = new DelayQueue<>(); + // 线程池,用于执行延时任务 + private static ExecutorService exec = Executors.newFixedThreadPool(10); + + /** + * 向延时队列中添加一个算法延时任务。 + * + * @param time 任务延时时间 + */ + public static void addDelayTask(TransmissionPojo transmissionPojo,long time) { + + DelayTask cameraDelayTask = new DelayTask(transmissionPojo,time); + //如果队列中没有,则直接发送,并标注已发送 + if(delayTaskMap.get(transmissionPojo.getStreetNumber())==null || delayTaskMap.get(transmissionPojo.getStreetNumber()).size() == 0) { + ClientChanel.sending(transmissionPojo); + cameraDelayTask.setSend(true); + } + //先发送完数据 + delayTasks.add(new DelayTask(transmissionPojo,time*2)); + //记录队列中 + if(delayTaskMap.get(transmissionPojo.getStreetNumber())!=null){ + + delayTaskMap.get(transmissionPojo.getStreetNumber()).add(cameraDelayTask); + }else { + delayTaskMap.put(transmissionPojo.getStreetNumber(),new DelayQueue<>()); + delayTaskMap.get(transmissionPojo.getStreetNumber()).add(cameraDelayTask); + } + } + + /** + * 根据命令和相机PLC编号从延时队列中移除任务。 + * + + * @param cameraPlcId 命令行 + */ + public static void remove(String cameraPlcId, TransmissionPojo transmissionPojo) { + cameraPlcId = cameraPlcId.intern(); + synchronized (cameraPlcId) { + // 将延时队列中的任务转换为数组,便于遍历和移除 + Object[] objects = delayTaskMap.get(cameraPlcId).toArray(); + + Object[] delays = delayTasks.toArray(); + if(objects.length > 0) { + //删除巷道队列中数据 + for (int i =0;i< objects.length;i++){ + if(((DelayTask)(objects[i])).getTransmissionPojo().getId().equals(transmissionPojo.getId()) ){ + delayTaskMap.get(cameraPlcId).remove(objects[i]); + } + } + //删除任务队列 + for (int i =0;i< delays.length;i++){ + if(((DelayTask)(delays[i])).getTransmissionPojo().getId().equals(transmissionPojo.getId()) ){ + delayTasks.remove(delays[i]); + } + } + + } + } + } + + public static TransmissionPojo getOne(String cameraPlcId, TransmissionPojo transmissionPojo) { + cameraPlcId = cameraPlcId.intern(); + synchronized (cameraPlcId) { + // 将延时队列中的任务转换为数组,便于遍历和移除 + Object[] objects = delayTaskMap.get(cameraPlcId).toArray(); + if(objects.length > 0) { + for (int i =0;i< objects.length;i++){ + if(((DelayTask)(objects[i])).getTransmissionPojo().getId().equals(transmissionPojo.getId()) ){ + return ((DelayTask)(objects[i])).getTransmissionPojo(); + } + } + } + } + return null; + } + + public static TransmissionPojo nextOne(String cameraPlcId, TransmissionPojo transmissionPojo) { + cameraPlcId = cameraPlcId.intern(); + synchronized (cameraPlcId) { + // 将延时队列中的任务转换为数组,便于遍历和移除 + Object[] objects = delayTaskMap.get(cameraPlcId).toArray(); + if(objects.length > 0) { + DelayTask cameraDelayTask = (DelayTask)objects[0]; + if (cameraDelayTask != null) { + return cameraDelayTask.getTransmissionPojo(); + + } + } + } + return null; + } + /** + * 启动延时任务的执行器。 + */ + public static void runExecutor(List streets,PlcService plcService ) { + for (Street street: streets){ + + exec.execute(new TaskConsumer(street)); + } + exec.execute(new DelayConsumer(plcService)); + } + + /** + * ,用于消费延时队列中的任务。发送拍照命令 + */ + private static class TaskConsumer implements Runnable { + private Street street; + TaskConsumer(Street street){ + this.street = street; + } + /** + * 无限循环,不断从延时队列中取出任务并执行。 + */ + @Override + public void run() { + while (true) { + try { + // 从Spring上下文中获取PlcService实例 + if(delayTaskMap.get(street.getPlcId()) == null){ + + delayTaskMap.put(street.getPlcId(),new DelayQueue<>()); + } + DelayTask cameraDelayTask = delayTaskMap.get(street.getPlcId()).take(); + if (cameraDelayTask !=null && !cameraDelayTask.isSend()) { + + ClientChanel.sending(cameraDelayTask.getTransmissionPojo()); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + //发送给上位机命令 + private static class DelayConsumer implements Runnable { + PlcService plcService ; + DelayConsumer(PlcService plcService){ + this.plcService= plcService; + } + /** + * 无限循环,不断从延时队列中取出任务并执行。 + */ + @Override + public void run() { + while (true) { + try { + // 从Spring上下文中获取PlcService实例 + DelayTask cameraDelayTask = delayTasks.take(); + //发送给上位机 + plcService.getKsecDataInfo( cameraDelayTask.getTransmissionPojo(), "E"); + + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + + +} +@Data +class DelayTask implements Delayed{ + + private TransmissionPojo transmissionPojo; + private long executeTime; + private boolean send = false; + int count = 2; + + DelayTask(TransmissionPojo transmissionPojo,long executeTime){ + this.transmissionPojo = transmissionPojo; + this.executeTime = System.currentTimeMillis()+executeTime; + } + + + @Override + public long getDelay(TimeUnit unit) { + return unit.convert(this.executeTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS); + } + + @Override + public int compareTo(Delayed o) { + return (int) (this.getDelay(TimeUnit.MILLISECONDS) -o.getDelay(TimeUnit.MILLISECONDS)); + } +} \ No newline at end of file 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 index 16ec48e..135f2b4 100644 --- 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 @@ -18,9 +18,9 @@ import javax.imageio.ImageIO; public class ImageSaver { - private static final int BUFFER_SIZE = 4096; - public void copyFileToFolder(String sourceFilePath, String destinationFolderPath, String fileName) { + + public void copyFileToFolder(String sourceFilePath, String destinationFolderPath, String fileName) { Path source = Paths.get(sourceFilePath); Path destination = Paths.get(destinationFolderPath, fileName); @@ -35,35 +35,38 @@ public class ImageSaver { public static void main(String[] args) { ImageSaver imageSaver = new ImageSaver(); - imageSaver.uploadFileToFtp("192.168.1.52", - "d:\\\\data\\media\\14/3-7/20240524/20240524144747-3-7.jpg"); + ImageSaver.uploadFileToFtp("192.168.1.52", + "d:\\\\data\\media\\14/3-7/20240524/20240524144747-3-7.jpg"); } - public void uploadFileToFtp(String ip,String localFilePath) - { + public static void uploadFileToFtp(String ip, String localFilePath) { try { - Thread.sleep(120); - uploadFileToFtp(ip,"administrator","",localFilePath,"/compute.jpg"); + uploadFileToFtp(ip, "administrator", "", localFilePath, "/len/compute.jpg"); + + Thread.sleep(700); + uploadFileToFtp(ip, "administrator", "", localFilePath+".jpg", "/QT/compute.jpg"); } catch (IOException e) { throw new RuntimeException(e); } catch (InterruptedException e) { throw new RuntimeException(e); } } - public void uploadFileToFtp(String ip,String username, String password,String localFilePath, String remoteFilePath ) throws IOException { + + public static void uploadFileToFtp(String ip, String username, String password, String localFilePath, String + remoteFilePath) throws IOException { FTPClient ftpClient = new FTPClient(); try { // 连接到FTP服务器 ftpClient.connect(ip); - boolean log =ftpClient.login(username, password); - + boolean log = ftpClient.login(username, password); + ftpClient.login(username, password); ftpClient.enterLocalPassiveMode(); // 设置被动模式,适应大多数网络环境 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 设置文件传输模式为二进制 // 读取本地文件 File localFile = new File(localFilePath); InputStream inputStream = new FileInputStream(localFile); - System.out.println(ftpClient.isConnected()); + System.out.println("文件存在与否"+localFile.exists()); // 上传文件 boolean uploadSuccess = ftpClient.storeFile(remoteFilePath, inputStream); @@ -92,3 +95,4 @@ public class ImageSaver { } } + diff --git a/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java b/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java index d40c757..733ec9b 100644 --- a/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java +++ b/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java @@ -201,8 +201,8 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { }else { ksecInfo.getData().setAckStatus(0); } - ctx.channel().writeAndFlush(ksecInfo); - log.info("盘点结束:"+ksecInfo.getData().toString()); + //ctx.channel().writeAndFlush(ksecInfo); + //log.info("盘点结束:"+ksecInfo.getData().toString()); } //找到该货位的最后一张照片与现在的照片比照 //plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0);