From f7cc36c4ffb558a68a0e852de3eadf7737b4811d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?LAPTOP-S9HJSOEB=5C=E6=98=8A=E5=A4=A9?= Date: Fri, 19 Jul 2024 15:45:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=A7=86=E8=A7=89=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=20=E6=B5=8B=E8=AF=95=E7=90=83=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/config/ConfigProperties.java | 4 + .../com/zhehekeji/web/entity/CheckLog.java | 16 +- .../java/com/zhehekeji/web/entity/Stock.java | 2 + .../web/lib/CameraControlModule.java | 1 + .../zhehekeji/web/lib/CameraDelayTask.java | 9 + .../lib/hik/HikCameraControlModuleImpl.java | 12 + .../web/lib/hik/HikExceptionCallBack.java | 19 +- .../JoywareCameraControlModuleImpl.java | 5 + .../zhehekeji/web/service/CameraService.java | 48 +++ .../zhehekeji/web/service/InitService.java | 5 +- .../com/zhehekeji/web/service/PlcCmdInfo.java | 2 + .../com/zhehekeji/web/service/PlcService.java | 299 ++++++++++++------ .../zhehekeji/web/service/client/Decoder.java | 13 +- .../service/client/GetPhotoDelayExecutor.java | 1 + .../web/service/client/NettyServer.java | 5 +- .../web/service/client/TransmissionPojo.java | 4 +- .../web/service/ksec/KsecDecoder.java | 8 +- web/src/main/resources/application-prod.yml | 5 +- 18 files changed, 325 insertions(+), 133 deletions(-) diff --git a/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java b/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java index 1993ede..49e57c3 100644 --- a/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java +++ b/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java @@ -44,6 +44,10 @@ public class ConfigProperties { */ private Integer serverPort; + private boolean inventorySimulationFollow = false; + + private Long queueSpanTime = 5000L; + @Data public static class CameraConfig{ 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 2d412c2..c1fac85 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/CheckLog.java +++ b/web/src/main/java/com/zhehekeji/web/entity/CheckLog.java @@ -12,6 +12,8 @@ import java.time.LocalDateTime; @Data public class CheckLog { + @TableId(type = IdType.AUTO) + private Integer id; private Integer streetId; @@ -33,8 +35,13 @@ public class CheckLog { private String wmsCode; private String category; + private String taskId; private Integer count; + private Integer wmsCount; + private String wmsCategory; + + private int statusVision = 0; private String checkNum; @@ -44,10 +51,6 @@ public class CheckLog { @ApiModelProperty("扫描出的托盘码") private String trayCode; - private Integer status; - - - private String pic; private String lotnum; @@ -56,5 +59,10 @@ public class CheckLog { @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; + private Integer status; + + private String pic; + @TableField(exist=false) + private String[] pics; } 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..6efd327 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Stock.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Stock.java @@ -25,6 +25,7 @@ public class Stock { @ApiModelProperty("随行任务号") private String orderNum; + private int statusVision =0; @ApiModelProperty("盘点任务号") private String checkNum; @@ -91,4 +92,5 @@ public class Stock { private String streetName; + private String pcd;//点位文件路径 } diff --git a/web/src/main/java/com/zhehekeji/web/lib/CameraControlModule.java b/web/src/main/java/com/zhehekeji/web/lib/CameraControlModule.java index 2e3236c..85ab470 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/CameraControlModule.java +++ b/web/src/main/java/com/zhehekeji/web/lib/CameraControlModule.java @@ -108,6 +108,7 @@ public interface CameraControlModule { boolean ptzControlIrisDecEnd(Integer cameraId, int nChannelID); boolean pic(Integer cameraId, int channel, String realPath); + boolean pic(int cameraId, int channel, String realPath); void downloadMp4(Integer cameraId, String path, LocalDateTime start, LocalDateTime end); 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 acbd293..6ea672d 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/CameraDelayTask.java +++ b/web/src/main/java/com/zhehekeji/web/lib/CameraDelayTask.java @@ -30,10 +30,19 @@ public class CameraDelayTask implements Delayed { private long executeTime; + private String cameraPlcId; private long delayTime; private Integer ptzId; + 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(Integer cameraId, LocalDateTime startTime, LocalDateTime endTime, String path, Integer type, long delayTime) { this.cameraId = cameraId; this.startTime = startTime; diff --git a/web/src/main/java/com/zhehekeji/web/lib/hik/HikCameraControlModuleImpl.java b/web/src/main/java/com/zhehekeji/web/lib/hik/HikCameraControlModuleImpl.java index f6458a4..260bec0 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/hik/HikCameraControlModuleImpl.java +++ b/web/src/main/java/com/zhehekeji/web/lib/hik/HikCameraControlModuleImpl.java @@ -289,7 +289,19 @@ public class HikCameraControlModuleImpl implements CameraControlModule { return picResult; } + public boolean pic(int cameraId, int nChannelID, String path) + { + int lUserId = cameraId; + short wPicSize = 3; + short wPicQuality = 0; + HCNetSDK.NET_DVR_JPEGPARA jpegpara = new HCNetSDK.NET_DVR_JPEGPARA(wPicSize, wPicQuality); + boolean picResult = HikLoginModuleImpl.hcNetsdk.NET_DVR_CaptureJPEGPicture(lUserId, 1, jpegpara, path); + if (!picResult) { + log.error("pic error:{},cameraId:{}", HikLoginModuleImpl.hcNetsdk.NET_DVR_GetLastError(),cameraId); + } + return picResult; + } public void downloadMp4(Integer cameraId, String path, LocalDateTime start, LocalDateTime end) { PathUtil.checkDirc(path); diff --git a/web/src/main/java/com/zhehekeji/web/lib/hik/HikExceptionCallBack.java b/web/src/main/java/com/zhehekeji/web/lib/hik/HikExceptionCallBack.java index aec408c..2020cab 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/hik/HikExceptionCallBack.java +++ b/web/src/main/java/com/zhehekeji/web/lib/hik/HikExceptionCallBack.java @@ -10,15 +10,22 @@ public class HikExceptionCallBack implements HCNetSDK.FExceptionCallBack { @Override public void invoke(int dwType, int lUserID, int lHandle, Pointer pUser) { - Integer cameraId =CameraConnMap.getCameraIdByLoginId(new NetSDKLib.LLong(lUserID)); - if(dwType == 32768){ + NetSDKLib.LLong lLong = new NetSDKLib.LLong(lUserID); + Integer cameraId =CameraConnMap.getCameraIdByLoginId(lLong); + if(dwType == 0x8000){ + if(cameraId != null) { + log.error("hik disconnect,cameraId:{}", cameraId); - log.error("hik disconnect,cameraId:{}", cameraId); - }else if(dwType == 32791){ + } + }else if(dwType == 0x8017){ - log.info("hik reconnect,cameraId:{}", CameraConnMap.getCameraIdByLoginId(new NetSDKLib.LLong(lUserID))); - } + log.info("hik reconnect,cameraId:{}", cameraId); + if(!lLong.equals(CameraConnMap.getConnId(cameraId))) { + log.error("hik reconnect,cameraId:{},lUserId:{}", cameraId,lLong); + CameraConnMap.conn(cameraId, new NetSDKLib.LLong(lUserID)); + } + } } } diff --git a/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareCameraControlModuleImpl.java b/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareCameraControlModuleImpl.java index aca83de..3fd5689 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareCameraControlModuleImpl.java +++ b/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareCameraControlModuleImpl.java @@ -277,6 +277,11 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { return ok; } + @Override + public boolean pic(int cameraId, int channel, String realPath) { + return false; + } + public void downloadMp4(Integer cameraId, String path, LocalDateTime start, LocalDateTime end) { PathUtil.checkDirc(path); diff --git a/web/src/main/java/com/zhehekeji/web/service/CameraService.java b/web/src/main/java/com/zhehekeji/web/service/CameraService.java index e84db19..93a231a 100644 --- a/web/src/main/java/com/zhehekeji/web/service/CameraService.java +++ b/web/src/main/java/com/zhehekeji/web/service/CameraService.java @@ -12,6 +12,8 @@ import com.zhehekeji.web.entity.CameraIOConfig; import com.zhehekeji.web.lib.CameraConnMap; import com.zhehekeji.web.lib.CameraControlLoginModule; import com.zhehekeji.web.lib.CameraControlModule; +import com.zhehekeji.web.lib.TaskDelayExecutor; +import com.zhehekeji.web.lib.hik.HikCameraControlModuleImpl; import com.zhehekeji.web.lib.hik.HikLoginModuleImpl; import com.zhehekeji.web.lib.joyware.JoywareLoginModuleImpl; import com.zhehekeji.web.lib.joyware.NetSDKLib; @@ -24,6 +26,7 @@ import com.zhehekeji.web.pojo.camera.IOImport; import com.zhehekeji.web.pojo.street.StreetSearch; import io.swagger.models.auth.In; import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.formula.functions.T; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.dao.DuplicateKeyException; @@ -36,6 +39,7 @@ import java.io.IOException; import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; +import java.util.UUID; import java.util.concurrent.CountDownLatch; import java.util.stream.Collectors; @@ -348,6 +352,50 @@ public class CameraService { } } + public static void main(String[] args) { + Camera camera = new Camera(); + camera.setIp("192.168.1.64"); + camera.setPort(8000); + camera.setUser("admin"); + camera.setPassword("a1234567"); + + CameraControlLoginModule cameraControlLoginModule = new HikLoginModuleImpl(); + + CameraControlModule cameraControlModule = new HikCameraControlModuleImpl(); +// + NetSDKLib.LLong lLong = cameraControlLoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword()); + NetSDKLib.LLong lLong1 = cameraControlLoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword()); + NetSDKLib.LLong lLong2 = cameraControlLoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword()); + NetSDKLib.LLong lLong3 = cameraControlLoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword()); + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + cameraControlModule.pic(lLong.intValue(),0 ,"E:/"+ UUID.randomUUID() +".jpg"); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + cameraControlModule.pic(lLong1.intValue(),0 ,"E:/"+ UUID.randomUUID() +".jpg"); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + cameraControlModule.pic(lLong2.intValue(),0 ,"E:/"+ UUID.randomUUID() +".jpg"); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + cameraControlModule.pic(lLong3.intValue(),0 ,"E:/"+ UUID.randomUUID() +".jpg"); + + + } + public void cameraLogin(Camera camera){ NetSDKLib.LLong lLong = cameraControlLoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword()); if(lLong != null){ 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 dd03da0..6f2142e 100644 --- a/web/src/main/java/com/zhehekeji/web/service/InitService.java +++ b/web/src/main/java/com/zhehekeji/web/service/InitService.java @@ -13,6 +13,7 @@ import com.zhehekeji.web.lib.joyware.NetSDKLib; import com.zhehekeji.web.mapper.CameraMapper; import com.zhehekeji.web.mapper.SensorGunMapper; import com.zhehekeji.web.mapper.StreetMapper; +import com.zhehekeji.web.service.client.GetPhotoDelayExecutor; import com.zhehekeji.web.service.client.NettyServer; import com.zhehekeji.web.service.ksec.KsecNettyClient; import com.zhehekeji.web.service.robotic.NettyClient; @@ -87,6 +88,8 @@ public class InitService implements ApplicationRunner { //球机登录 List cameras = cameraMapper.selectByMap(new HashMap<>(0)); + + List streets = streetMapper.selectByMap(new HashMap<>()); cameras.forEach(camera -> { LoginThread loginThread = new LoginThread(camera); loginThread.start(); @@ -96,7 +99,6 @@ public class InitService implements ApplicationRunner { if(configProperties.getServerMode() == 0){ log.info("PLC TCP MODE"); //plc 连接状态初始化 - List streets = streetMapper.selectByMap(new HashMap<>(0)); streets.forEach(street -> { StreetConn.init(street.getId(),street.getPlcId()); @@ -123,6 +125,7 @@ public class InitService implements ApplicationRunner { } } TaskDelayExecutor.runMp4DownloadExecutor(); + GetPhotoDelayExecutor.runExecutor(streets); } class LoginThread extends Thread{ diff --git a/web/src/main/java/com/zhehekeji/web/service/PlcCmdInfo.java b/web/src/main/java/com/zhehekeji/web/service/PlcCmdInfo.java index 85f1e37..c6edd13 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcCmdInfo.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcCmdInfo.java @@ -69,6 +69,8 @@ public class PlcCmdInfo { private Integer times; + private String code; + private String lotnum; private Integer streetId; 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 521f0aa..6486f27 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -11,6 +11,7 @@ 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.StockStatus; import com.zhehekeji.web.service.RFID.RFIDMap; import com.zhehekeji.web.service.RFID.RFIDSocket; import com.zhehekeji.web.service.RFID.RFIDSocketFactory; @@ -41,6 +42,7 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Collectors; import static org.aspectj.weaver.tools.cache.SimpleCacheFactory.path; @@ -652,7 +654,26 @@ public class PlcService { public Boolean check(PlcCmdInfo plcCmdInfo,String cmdCode,String wmsCode,String wmsTrayCode,String wmsCatagary){ long startTime = System.currentTimeMillis(); + Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); + + //开始盘点具体货位 + CheckLog checkLog = new CheckLog(); + checkLog.setStreetId(street.getId()); + checkLog.setLotnum(plcCmdInfo.getLotnum()); + checkLog.setDirection(plcCmdInfo.getLeftRight1()); + checkLog.setSide(plcCmdInfo.getSide1()); + checkLog.setRow(plcCmdInfo.getRow1()); + checkLog.setColumn(plcCmdInfo.getColumn1()); + checkLog.setWmsCode(plcCmdInfo.getCode()); + + checkLog.setTaskId((plcCmdInfo.getTaskId())); + //默认未盘点 + checkLog.setStatus(StockStatus.PENDING.getStatus()); + checkLog.setCreateTime(LocalDateTime.now()); + checkLog.setWmsCategory(plcCmdInfo.getTypeNum()); + checkLog.setWmsCount(plcCmdInfo.getQuantity()); + CronTab.putTime(street.getId()); List lightSources = lightSourceMapper.selectList(new QueryWrapper().eq("street_id",street.getId())); lightSources.forEach(lightSource -> { @@ -680,76 +701,26 @@ public class PlcService { String path = PathUtil.createFileNameByRowColumn("jpg", cameraId, plcCmdInfo.getRow1(), plcCmdInfo.getColumn1()); + try { cameraCapture(cameraId, false, null, path); } catch (NullPointerException e) { log.error("相机{}未连接无法拍照", cameraId); } + + checkLog.setPic(path); + checkLogMapper.insert(checkLog); //托盘码 String trayCode = null; Boolean trayCheck = Boolean.TRUE; //扫托盘码 - if(configProperties.getScanCodeMode().getTray() == 2) { - log.info("扫码类型:" + configProperties.getScanCodeMode().getTray()); - //托盘使用sick扫码枪 - SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(), plcCmdInfo.getLeftRight1()); - if (sensorGun == null) { - trayCode = "扫码枪未配置"; - trayCheck = Boolean.FALSE; - log.error("no sensor gun config in database ,street id:{},direction:{}", street.getId(), plcCmdInfo.getLeftRight1()); - } else { - trayCode = SickSocket.readOCR(sensorGun.getIp(), sensorGun.getPort()); - log.info("sensor tray code:{}", trayCode); - if ("".equals(wmsTrayCode)) { - //托盘码为空,无货物 - //只要扫码枪未识别出条码,即认为盘点正确 - if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) { - trayCode = "无货物"; - trayCheck = Boolean.TRUE; - } else { - trayCode = "扫码枪识别异常"; - trayCheck = Boolean.FALSE; - log.warn("sick ocr error:{}", trayCode); - } - } else { - if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) { - trayCode = "扫码枪识别异常"; - trayCheck = Boolean.FALSE; - log.warn("sick ocr error:{}", trayCode); - } else { - //扫到就认为正常 - trayCheck = Boolean.TRUE; - } - } - } - }else if(configProperties.getScanCodeMode().getTray() == 3){ - //扫到的码 - Set tags = new HashSet<>(); - try { - RFIDCheck(plcCmdInfo, true); - Thread.sleep(1000 * configProperties.getRfid().getScanTime()); - } catch (Exception e) { - e.printStackTrace(); - } finally { - tags = RFIDStop(plcCmdInfo); - log.info("盘点rfid扫描结果:" + tags); - } - if (tags !=null && tags.contains(wmsTrayCode)) { - //托盘码为空,无货物 - //只要扫码枪未识别出条码,即认为盘点正确 - trayCode = wmsTrayCode; - trayCheck = Boolean.TRUE; + trayCheck = scan(configProperties.getScanCodeMode().getTray(),street,plcCmdInfo,checkLog,trayCode); - } else { - trayCode = trayCode+ "扫码枪识别异常"; - trayCheck = Boolean.FALSE; - log.warn("rfid error:{}", trayCode); - } - } - Boolean trayGoodCheck = Boolean.TRUE; + String trayGoodCode = null; + Boolean trayGoodCheck = scan(configProperties.getScanCodeMode().getGoods(),street,plcCmdInfo,checkLog,trayGoodCode); OrderInfo orderInfo = new OrderInfo(street, plcCmdInfo, 1, cmdCode); //扫货物 @@ -786,7 +757,8 @@ public class PlcService { } } } - }else if(configProperties.getScanCodeMode().getGoods() == 3){ + }else + if(configProperties.getScanCodeMode().getGoods() == 3){ Set tags = new HashSet<>(); try { RFIDCheck(plcCmdInfo, true); @@ -809,31 +781,49 @@ public class PlcService { log.warn("rfid error:{}", trayCode); } - }else if (configProperties.getScanCodeMode().getGoods() == 4){ - //开始盘点 - String goodLocation = orderInfo.getStreetId().toString()+"_"+ plcCmdInfo.getLeftRight1().toString()+"_"+ orderInfo.getSeparation().toString()+"_"+ orderInfo.getRow().toString()+"_"+ orderInfo.getColumn(); - SCTransmission scTransmission = new SCTransmission(street.getPlcId(),plcCmdInfo.getTaskId(),goodLocation,plcCmdInfo.getTypeNum(), plcCmdInfo.getQuantity(), "N"); - - String scTransmissionStr = scTransmission.toString(); - ClientChanel.write(scTransmissionStr,street.getPlcId()); + }else + if (configProperties.getScanCodeMode().getGoods() == 4){ + TransmissionPojo transmissionPojo = new TransmissionPojo(checkLog, street); + if (ClientChanel.get(plcCmdInfo.getPlcId()) != null) { + ClientChanel.get(plcCmdInfo.getPlcId()).writeAndFlush(transmissionPojo.toString(TransmissionType.ST)); + } else { + log.error("未找到对应plc" + transmissionPojo.toString()); + } + //取货完成进行拍照 try { - Thread.sleep(500); + Thread.sleep(50L); + //不为其他状态进入队列 + if (lock.tryLock()) { + //队列中没有任务,发送取图指令 + //只采用队列,队列中有数据则自动发送 + //模拟随行 + if (configProperties.isInventorySimulationFollow() ) { + TransmissionPojo transmissionPojoFollow = new TransmissionPojo(street, transmissionPojo.getRow(),transmissionPojo.getColumn(),transmissionPojo.getDirection(), ""); + String s = (transmissionPojoFollow).toString(TransmissionType.GPS); + + //放置到队列中,等待取图返回后删除 + GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(), s, configProperties.getQueueSpanTime(),transmissionPojoFollow); + + + } + //放置到队列中,等待取图返回后删除 + GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(), transmissionPojo.toString(TransmissionType.GPS), configProperties.getQueueSpanTime(),transmissionPojo); + } + } catch (InterruptedException e) { - throw new RuntimeException(e); + log.error("取图命令 error", e); + } finally { + lock.unlock(); + log.info("盘点完成"); } - //滁州开始盘点即取货到位 - - SCTransmission scTransmission2 = new SCTransmission(street.getPlcId(),plcCmdInfo.getTaskId()); - String scTransmissionStr2 = scTransmission2.toSC02String(); - ClientChanel.write(scTransmissionStr2,street.getPlcId()); } - Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(orderInfo.getStreetId(), plcCmdInfo.getLeftRight1(), orderInfo.getSeparation(), orderInfo.getRow(), orderInfo.getColumn()); String scanCode = null; //货物使用球机扫码 + checkLog.setTrayCode(trayCode); log.info("code:{}", scanCode); //核对异常 Integer status = 1; @@ -841,6 +831,8 @@ public class PlcService { if (trayCheck && trayGoodCheck ) { status = 2; } + checkLog.setStatus(status); + checkLogMapper.updateById(checkLog); if (stock == null) { stock = Stock.builder() .checkNum(plcCmdInfo.getOrderNum()) @@ -872,47 +864,115 @@ public class PlcService { } // StockCheckRunnable stockCheckRunnable = new StockCheckRunnable(street,plcCmdInfo,cmdCode,stockMapper,path,checkLogMapper,configProperties.getScanCodeMode().getGoods(),wmsCode,wmsTrayCode,trayCode,trayCheck,configProperties,sensorGun); // threadPoolExecutor.execute(stockCheckRunnable); + //还原相机 gyrateCameraByCode(cameraId, "C5"); long end = System.currentTimeMillis(); - long s = end - startTime; - log.info("time:{}millisecond", s); - TransmissionPojo transmissionPojo = new TransmissionPojo(checkLog, street); - if (ClientChanel.get(dataInfo.getSRMNumber()) != null) { - ClientChanel.get(dataInfo.getSRMNumber()).writeAndFlush(transmissionPojo.toString(TransmissionType.ST)); - } else { - log.error("未找到对应plc" + transmissionPojo.toString()); - } - //取货完成进行拍照 - try { - Thread.sleep(50L); - //不为其他状态进入队列 - if (lock.tryLock()) { - //队列中没有任务,发送取图指令 - //只采用队列,队列中有数据则自动发送 - //模拟随行 - if (configProperties.isInventorySimulationFollow() ) { - TransmissionPojo transmissionPojoFollow = new TransmissionPojo(street, transmissionPojo.getRow(),transmissionPojo.getColumn(),transmissionPojo.getDirection(), ""); - String s = (transmissionPojoFollow).toString(TransmissionType.GPS); + long timeLong = end - startTime; + log.info("time:{}millisecond", timeLong); - //放置到队列中,等待取图返回后删除 - GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(), s, configProperties.getQueueSpanTime(),transmissionPojoFollow); + return true; + } + Boolean scan(int type ,Street street, PlcCmdInfo plcCmdInfo,CheckLog checkLog ,String trayCode){ + Boolean checkBoolean = true; + if(type == 2) { + checkBoolean = Boolean.FALSE; + log.info("扫码类型:" + configProperties.getScanCodeMode().getTray()); + //托盘使用sick扫码枪 + SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(), plcCmdInfo.getLeftRight1()); + if (sensorGun == null) { + trayCode = "扫码枪识别异常"; + log.error("no sensor gun config in database ,street id:{},direction:{}", street.getId(), plcCmdInfo.getLeftRight1()); + } else { + trayCode = SickSocket.readOCR(sensorGun.getIp(), sensorGun.getPort()); + log.info("sensor tray code:{}", trayCode); + if ("".equals(plcCmdInfo.getCode())) { + //托盘码为空,无货物 + //只要扫码枪未识别出条码,即认为盘点正确 + if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) { + trayCode = ""; + checkBoolean = Boolean.TRUE; + } else { + trayCode = "扫码枪识别异常"; + checkBoolean = Boolean.FALSE; + log.warn("sick ocr error:{}", trayCode); + } + } else { + if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) { + trayCode = "扫码枪识别异常"; + checkBoolean = Boolean.FALSE; + log.warn("sick ocr error:{}", trayCode); + } else { + //扫到就认为正常 + checkBoolean = Boolean.TRUE; + } } - //放置到队列中,等待取图返回后删除 - GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(), transmissionPojo.toString(TransmissionType.GPS), configProperties.getQueueSpanTime(),transmissionPojo); } + }else + if(type == 3){ + Set tags = new HashSet<>(); + try { + RFIDCheck(plcCmdInfo, true); + Thread.sleep(1000 * configProperties.getRfid().getScanTime()); + } catch (Exception e) { + e.printStackTrace(); + } finally { + tags = RFIDStop(plcCmdInfo); + log.info("盘点rfid扫描结果:" + tags); + } + if (tags !=null && tags.contains(plcCmdInfo.getCode())) { + //托盘码为空,无货物 + //只要扫码枪未识别出条码,即认为盘点正确 + trayCode = plcCmdInfo.getCode(); + checkBoolean = Boolean.TRUE; + + } else { + trayCode = trayCode+ "扫码枪识别异常"; + checkBoolean = Boolean.FALSE; + log.warn("rfid error:{}", trayCode); + + } + }else + if (type == 4){ + TransmissionPojo transmissionPojo = new TransmissionPojo(checkLog, street); + if (ClientChanel.get(plcCmdInfo.getPlcId()) != null) { + ClientChanel.get(plcCmdInfo.getPlcId()).writeAndFlush(transmissionPojo.toString(TransmissionType.ST)); + } else { + log.error("未找到对应plc" + transmissionPojo.toString()); + } + //取货完成进行拍照 + try { + Thread.sleep(50L); + //不为其他状态进入队列 + if (lock.tryLock()) { + //队列中没有任务,发送取图指令 + //只采用队列,队列中有数据则自动发送 + //模拟随行 + if (configProperties.isInventorySimulationFollow() ) { + TransmissionPojo transmissionPojoFollow = new TransmissionPojo(street, transmissionPojo.getRow(),transmissionPojo.getColumn(),transmissionPojo.getDirection(), ""); + String s = (transmissionPojoFollow).toString(TransmissionType.GPS); - } catch (InterruptedException e) { - log.error("取图命令 error", e); - } finally { - lock.unlock(); - log.info("盘点完成"); + //放置到队列中,等待取图返回后删除 + GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(), s, configProperties.getQueueSpanTime(),transmissionPojoFollow); + + + } + //放置到队列中,等待取图返回后删除 + GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(), transmissionPojo.toString(TransmissionType.GPS), configProperties.getQueueSpanTime(),transmissionPojo); + } + + } catch (InterruptedException e) { + log.error("取图命令 error", e); + } finally { + lock.unlock(); + log.info("盘点完成"); + } } - return true; - } + return checkBoolean; + } public KsecInfo getKsecDataInfo(TransmissionPojo transmissionPojo, String type) { KsecDataInfo ksecDataInfo = new KsecDataInfo(); CheckLog checkLog = checkLogMapper.selectById(transmissionPojo.getCheckId()); @@ -1042,4 +1102,37 @@ public class PlcService { } checkLog(stock); } + + + public void visualCalculationResults(TransmissionPojo transmissionPojo) { + CheckLog checkLog = checkLogMapper.selectById(transmissionPojo.getCheckId()); + Stock stock = stockMapper.selectOne(new QueryWrapper().eq("check_Num", checkLog.getId())); + Street street = streetService.getStreetByPlcId(transmissionPojo.getStreetNumber()); + if (transmissionPojo.getResult() != null && transmissionPojo.getResult() == 1) { + checkLog.setStatusVision(StockStatus.SUCCESS.getStatus()); + stock.setStatusVision(StockStatus.SUCCESS.getStatus()); + } else { + checkLog.setStatusVision(StockStatus.ERROR.getStatus()); + stock.setStatusVision(StockStatus.ERROR.getStatus()); + stock.setCount(transmissionPojo.getCount()); + stock.setCategory(transmissionPojo.getCategory()); + } + + if (transmissionPojo.getPcd() != null && !"".equals(transmissionPojo.getPcd())) { + stock.setPcd("http://" + street.getPlcIp() + ":8007" + transmissionPojo.getPcd()); + } + if (transmissionPojo.getPicsPath() != null && transmissionPojo.getPicsPath().size() > 0) { + + String pics = transmissionPojo.getPicsPath().stream().map(v -> { + return "http://" + street.getPlcIp() + ":8007" + v; + }).collect(Collectors.joining(";")); + checkLog.setPic(pics); + stock.setCheckPic(pics); + } + checkLogMapper.updateById(checkLog); + stockMapper.updateById(stock); + } + + public void saveFollowPhoto(TransmissionPojo transmissionPojo) { + } } 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 6b81e32..11024ef 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; @@ -43,16 +41,15 @@ public class Decoder extends DelimiterBasedFrameDecoder { private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,15,30, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(20000)); - private EmptyCheckService emptyCheckService; + private PlcService plcService; - public Decoder(PlcService plcService,EmptyCheckService emptyCheckService) { + public Decoder(PlcService plcService) { super(20000,true,false, Unpooled.copiedBuffer(">".getBytes()), Unpooled.copiedBuffer("$".getBytes())); this.plcService = plcService; - this.emptyCheckService = emptyCheckService; } @Override @@ -63,7 +60,7 @@ public class Decoder extends DelimiterBasedFrameDecoder { log.debug("no data"); return null; } - ClientRunnable clientRunnable = new ClientRunnable(in,ctx,plcService,emptyCheckService); + ClientRunnable clientRunnable = new ClientRunnable(in,ctx,plcService); threadPoolExecutor.execute(clientRunnable); return null; } @@ -76,13 +73,11 @@ public class Decoder extends DelimiterBasedFrameDecoder { private PlcService plcService; - private EmptyCheckService emptyCheckService; - public ClientRunnable(ByteBuf in,ChannelHandlerContext ctx,PlcService plcService,EmptyCheckService emptyCheckService){ + public ClientRunnable(ByteBuf in,ChannelHandlerContext ctx,PlcService plcService){ this.ctx = ctx; this.in = in; this.plcService = plcService; - this.emptyCheckService = emptyCheckService; } @Override 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 c5a8e6a..db5e4d1 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 @@ -52,6 +52,7 @@ public class GetPhotoDelayExecutor { cameraDelayTaskMap.put(plcId,new DelayQueue<>()); cameraDelayTaskMap.get(plcId).add(cameraDelayTask); } + delayTasks.add(cameraDelayTask); } 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 a52bb4e..6ea7758 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; @@ -20,8 +19,6 @@ public class NettyServer { @Resource private PlcService plcService; - @Resource - private EmptyCheckService emptyCheckService; public void CreateNettyServer(int port) throws InterruptedException { Thread thread = new Thread(new Runnable() { @@ -42,7 +39,7 @@ public class NettyServer { @Override public void initChannel(SocketChannel ch) { ch.pipeline().addLast(new NettyConnectHandler()); - ch.pipeline().addLast(new Decoder(plcService,emptyCheckService)); + ch.pipeline().addLast(new Decoder(plcService)); ch.pipeline().addLast(new Encoder()); }}); // 子处理器,用于处理workerGroup 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 77d7148..19766bc 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 @@ -35,9 +35,9 @@ public class TransmissionPojo { this.row = checkLog.getRow(); this.column = checkLog.getColumn(); this.direction = checkLog.getDirection(); - this.count = checkLog.getCount(); + this.count = checkLog.getWmsCount(); if(checkLog.getCategory() != null && checkLog.getCategory().contains("/")) { - this.category = checkLog.getCategory().split("/")[0]; + this.category = checkLog.getWmsCategory().split("/")[0]; }else { this.category = checkLog.getCategory(); } 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 dba44aa..935591b 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 @@ -103,6 +103,12 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { plcCmdInfo.setQuantity(dataInfo.getQuantity()); srmNumber = dataInfo.getSRMNumber(); cmdName = dataInfo.getCmdName(); + if(dataInfo.getCode()!=null && !"".equals(dataInfo.getCode())){ + plcCmdInfo.setCode(dataInfo.getCode()); + }else if(dataInfo.getTrayCode()!=null && !"".equals(dataInfo.getTrayCode())){ + plcCmdInfo.setCode(dataInfo.getTrayCode()); + } + } if (Cmd.A.name().equals(ksecInfo.getType())) { //心跳 @@ -193,7 +199,7 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { plcCmdInfo.setTimes(1); ksecInfoMap.put(dataInfo.getTaskId(),dataInfo); - Boolean ok = plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode(), dataInfo.getTrayCode(), dataInfo.getLotnum()); + Boolean ok = plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), plcCmdInfo.getCode(), plcCmdInfo.getCode(), dataInfo.getLotnum()); // Boolean ok = true; if(ok){ ksecInfo.getData().setAckStatus(1); diff --git a/web/src/main/resources/application-prod.yml b/web/src/main/resources/application-prod.yml index 9f60935..dd94268 100644 --- a/web/src/main/resources/application-prod.yml +++ b/web/src/main/resources/application-prod.yml @@ -19,7 +19,7 @@ spring: validationQuery: SELECT 1 FROM DUAL # --------本服务端口号 server: - port: 8099 + port: 8098 #-------------- # ------用户中心地址 userUrl: http://115.236.65.98:11001 @@ -31,7 +31,6 @@ cameraConfig: cameraPassword: a1234567 cameraUser: admin cameraPort: 8000 - videoServer: 127.0.0.1:8083 #相机抓图延迟 毫秒,这个延迟是等待球机球机转动到位,然后拍照的 delayCaptureTime: 3500 #随行模式下的相机抓图延迟 毫秒,这个延迟是等待球机球机转动到位,然后拍照的 @@ -87,7 +86,7 @@ lightSource: # -----goods 货物 # 扫码模式 0:此处不盘点 1:球机扫码 2:sick扫码枪 3:南北达RFID 4.南京视觉客户端(只支持货物盘点) scanCodeMode: - tray: 3 + tray: 2 goods: 4 goodsCodeTypes: - 14