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 f670060..118162d 100644 --- a/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java +++ b/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java @@ -58,6 +58,7 @@ public class ConfigProperties { public static class Rfid { private Long scanTime = 5L; + private int graceNumber = 5; } 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 28e4c75..73cd150 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -37,10 +37,7 @@ import java.io.IOException; import java.time.Duration; import java.time.LocalDateTime; import java.util.*; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingDeque; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -98,6 +95,8 @@ public class PlcService { @Resource private RfidLiveService rfidLiveService; + ExecutorService executor = Executors.newFixedThreadPool(20); + public static Map> wmsTrayCodeMapByTask = new HashMap<>(); private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 8, 200, TimeUnit.MINUTES, new ArrayBlockingQueue<>(100000)); @@ -633,10 +632,11 @@ public class PlcService { Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); CronTab.putTime(street.getId()); plcCmdInfo.setStreetName(street.getName()); - List lightSources = lightSourceMapper.selectList(new QueryWrapper().eq("street_id", street.getId())); + //暂时不使用光源 + /*List lightSources = lightSourceMapper.selectList(new QueryWrapper().eq("street_id", street.getId())); lightSources.forEach(lightSource -> { HikControlSocket.openLight(lightSource.getIp(), lightSource.getPort(), configProperties.getLightSource().getIndex(), 1); - }); + });*/ log.info("盘点摄像头变化参数:" + plcCmdInfo.toString()); Integer cameraId = getCameraByPlcCmdE(plcCmdInfo, plcCmdInfo.getLeftRight1()); @@ -664,81 +664,135 @@ public class PlcService { } //托盘码 String trayCode = null; - Boolean trayCheck = Boolean.TRUE; + Boolean trayCheck = Boolean.FALSE; //如果是用扫码枪 扫 托盘码,就直接扫 //if(configProperties.getScanCodeMode().getTray() == 2){ log.info("扫码类型:" + configProperties.getScanCodeMode().getTray()); //托盘使用sick扫码枪 + // SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(), plcCmdInfo.getLeftRight1()); 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(),configProperties.getScanCodeMode().getSickScanTime()); - 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); - } + Future sickFuture = executor.submit(() -> { + + long startsickTime = System.currentTimeMillis(); + String code = ""; + if (sensorGun == null) { + code = "扫码枪未配置"; + log.error("no sensor gun config in database ,street id:{},direction:{}", street.getId(), plcCmdInfo.getLeftRight1()); } else { - if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) { - trayCode = "扫码枪识别异常"; - trayCheck = Boolean.FALSE; - log.warn("sick ocr error:{}", trayCode); + try { + code = SickSocket.readOCR(sensorGun.getIp(), sensorGun.getPort(), configProperties.getScanCodeMode().getSickScanTime()); + } catch (Exception e) { + + } + log.info("sensor tray code:{}", code); + if ("".equals(wmsTrayCode)) { + //托盘码为空,无货物 + //只要扫码枪未识别出条码,即认为盘点正确 + if (StringUtils.isEmpty(code) || code.equals("NoRead")) { + code = ""; + } else { + code = "扫码枪识别异常"; + log.warn("sick ocr error:{}", code); + } } else { - //扫到就认为正常 - trayCheck = Boolean.TRUE; + if (StringUtils.isEmpty(code) || code.equals("NoRead")) { + code = "扫码枪识别异常"; + log.warn("sick ocr error:{}", code); + } else { + + log.info("sick ocr:{}", code); + //扫到就认为正常 + code = ""; + } } } - } + + long endsickTime = System.currentTimeMillis(); + + log.info("sick time:{}millisecond", startsickTime - endsickTime); + return code; + + }); + // RFID // RFID rfid = rfidService.getRFIDByPlc(street.getId(),plcCmdInfo.getLeftRight1()); - Boolean trayRFIDCheck = Boolean.FALSE; + Boolean trayRFIDCheck = Boolean.FALSE; - Set tags = new HashSet<>(); + Future rfidFuture = executor.submit(() -> { + + long startRfidTime = System.currentTimeMillis(); + String code = ""; + + 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.size() > 0) { + + if (wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()) != null + && tags.containsAll(wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()))) { + log.info("扫描成功"); + + } else { + if (wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()) != null) { + wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()).removeAll(tags); + + log.info("未扫到数据为:{}", wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum())); + for (String str : wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum())) { + if (str.length() == 14) { + code = "RFID扫描失败"; + log.info("未扫描到箱体" + str); + } + } + if (wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()).size() > configProperties.getRfid().getGraceNumber()) { + code = "RFID扫描失败"; + } + } + } + RFID rfid = rfidMapper.selectOne(new QueryWrapper().eq("street_id", street.getId())); + if (!rfidLiveService.getRfidLive(plcCmdInfo, street, wmsTrayCode)) { + rfidLiveService.rfidRemoveLive(plcCmdInfo, street, rfid); + } + rfidLiveService.rfidSave(plcCmdInfo, String.join(",", tags), street, rfid); + } + + long endRfidTime = System.currentTimeMillis(); + + log.info("rfid time:{}millisecond", startRfidTime - endRfidTime); + return code; + + }); 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.size() > 0) { + String sickCode = sickFuture.get(); // get()会阻塞直到结果可用 + String rfid = rfidFuture.get(); // get()会阻塞直到结果可用 + log.info("sickCode:{}", sickCode); + log.info("rfid:{}", rfid); + + trayCode = sickCode; + if (sickCode != null && !"".equals(sickCode)) { + trayCode = trayCode + ";"; + } else { + trayCheck = Boolean.TRUE; + } - if (wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()) !=null - && tags.containsAll(wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()))) { + if (rfid == null || "".equals(rfid)) { trayRFIDCheck = Boolean.TRUE; - } else { - if(trayCheck){ - trayCode = "RFID扫描失败"; - }else - trayCode += ";RFID扫描失败"; - if (wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum())!= null) { - wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()).removeAll(tags); - log.info("未扫到数据为:{}",wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum())); - } - trayRFIDCheck = Boolean.FALSE; } - wmsTrayCodeMapByTask.remove(plcCmdInfo.getOrderNum()); - RFID rfid = rfidMapper.selectOne(new QueryWrapper().eq("street_id", street.getId())); - if (!rfidLiveService.getRfidLive(plcCmdInfo, street, wmsTrayCode)) { - rfidLiveService.rfidRemoveLive(plcCmdInfo, street, rfid); + trayCode += rfid; + if ("".equals(trayCode)) { + trayCode = "盘点正确"; } - rfidLiveService.rfidSave(plcCmdInfo, String.join(",", tags), street, rfid); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); } - OrderInfo orderInfo = new OrderInfo(street, plcCmdInfo, 1, cmdCode); Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(orderInfo.getStreetId(), plcCmdInfo.getFromDirection(), orderInfo.getSeparation(), orderInfo.getRow(), orderInfo.getColumn()); String scanCode = null; @@ -749,7 +803,7 @@ public class PlcService { //核对异常 Integer status = 1; //托盘和货物都正确 - if (trayCheck && trayRFIDCheck ) { + if (trayCheck && trayRFIDCheck) { status = 2; } if (stock == null) { diff --git a/web/src/main/java/com/zhehekeji/web/service/RFID/RFIDSocket.java b/web/src/main/java/com/zhehekeji/web/service/RFID/RFIDSocket.java index 3e151a1..60f476b 100644 --- a/web/src/main/java/com/zhehekeji/web/service/RFID/RFIDSocket.java +++ b/web/src/main/java/com/zhehekeji/web/service/RFID/RFIDSocket.java @@ -25,6 +25,13 @@ public class RFIDSocket { private Map tagsCount = new ConcurrentHashMap<>(); + public static void main(String[] args) { + String tagStr = "363000145224505289907900"; + if(tagStr.startsWith("363000") &&tagStr.endsWith("00")){ + tagStr = tagStr.substring(0, tagStr.length() - 2); + } + System.out.println(tagStr); + } public Set getTags() { return tags; } @@ -80,7 +87,12 @@ public class RFIDSocket { System.out.println("reader1 inventory tag :" + tag.getEpc()); String tagStr = tag.getEpc().replace(" ",""); System.out.println("tag: " + tag.getEpc()); + // 去除头为0 tagStr = tagStr.replace("0000000000",""); + //去除尾巴为0 + if(tagStr.startsWith("363000") &&tagStr.endsWith("00")){ + tagStr = tagStr.substring(0, tagStr.length() - 2); + } tags.add(tagStr); if (ToolUtil.isNotEmpty(tagsCount.get(tagStr))) { tagsCount.put(tagStr, tagsCount.get(tagStr) + 1); diff --git a/web/src/main/java/com/zhehekeji/web/service/SensorService.java b/web/src/main/java/com/zhehekeji/web/service/SensorService.java index aa7de1b..fc36ac7 100644 --- a/web/src/main/java/com/zhehekeji/web/service/SensorService.java +++ b/web/src/main/java/com/zhehekeji/web/service/SensorService.java @@ -22,4 +22,10 @@ public class SensorService { } return null; } + + + public List getSensorByPlc(Integer streetId){ + return sensorGunMapper.selectList(new QueryWrapper().eq("street_id",streetId)); + + } } diff --git a/web/src/main/java/com/zhehekeji/web/service/sick/SickSocket.java b/web/src/main/java/com/zhehekeji/web/service/sick/SickSocket.java index fa8a907..6c64921 100644 --- a/web/src/main/java/com/zhehekeji/web/service/sick/SickSocket.java +++ b/web/src/main/java/com/zhehekeji/web/service/sick/SickSocket.java @@ -21,7 +21,7 @@ public class SickSocket { private static final Logger tcpLogger = LoggerFactory.getLogger("sick"); public static void main(String[] args) { - String code = readOCR("127.0.0.1", 3000,30000); + String code = readOCR("127.0.0.1", 3001,5000); System.out.println(code); } @@ -50,11 +50,14 @@ public class SickSocket { os = socket.getOutputStream(); // 获取socket的输入流对象 is = socket.getInputStream(); + long start = System.currentTimeMillis(); // 定义变量i,并赋值为0 int i = 0; // 当code等于"NoRead"且i小于等于4且socket未关闭时,执行以下循环 while ("NoRead".equals(code) && !socket.isClosed()) { - sleep(300); + if( System.currentTimeMillis() - start > timeout){ + break; + } // 调用writeCmd方法,将数据写入socket的输出流 writeCmd(os); // 从socket的输入流中读取数据,并赋值给code