Merge branch '南通通威' of https://gitlab.hzleaper.com:81/duoji/backend-duoji-monitor into 南通通威

# Conflicts:
#	web/src/main/java/com/zhehekeji/web/service/client/image/ImageSaver.java

1.增加code和长度
2.图片漏记更简洁
3.增加队列,负责发送返回给客户端或者视觉服务器
湖北-大华摄像头
LAPTOP-S9HJSOEB\昊天 2 years ago
commit 818bf0a376

@ -46,8 +46,7 @@ public class CheckLog {
private Integer status;
@TableId(type = IdType.AUTO)
private Integer taskId;
private String taskId;
private String pic;

@ -59,6 +59,9 @@ public class Stock {
private Integer direction;
private String QrCode;
private Double length;
private Integer side;
@TableField(value = "`row`")

@ -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;
}

@ -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{

@ -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<Integer> 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 plcIdplcId,plcIdsrmNumber
*
@ -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<CheckLog>()
.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.");

@ -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);
}
}

@ -394,18 +394,28 @@ public class StockService {
* @return
*/
public Stock stockInfo(StockCheck stockCheck) {
Street street = streetMapper.selectOne(new QueryWrapper<Street>()
.eq(stockCheck.getStreetId()!=null,"id",stockCheck.getStreetId())
.eq(stockCheck.getStreetPlc()!=null,"plc_Id",stockCheck.getStreetPlc()));
Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>()
.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<StockLog> stockLogs = stockLogMapper.selectList(new QueryWrapper<StockLog>().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);

@ -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){

@ -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));
}

@ -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:" + "");
}
/**

@ -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) {

@ -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<String, DelayQueue<DelayTask>> delayTaskMap = new ConcurrentHashMap<>();
//返回指令队列
public static DelayQueue<DelayTask> 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<Street> 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));
}
}

@ -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 {
}
}

@ -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);

Loading…
Cancel
Save