diff --git a/web/src/main/java/com/zhehekeji/web/controller/ClientTestController.java b/web/src/main/java/com/zhehekeji/web/controller/ClientTestController.java index 1becaec..20082b4 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/ClientTestController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/ClientTestController.java @@ -115,13 +115,13 @@ public class ClientTestController { return Result.success(); } - @ApiOperation("模拟普天 货物入库 【货位入库】") + @ApiOperation("模拟普天 货物入库,顶部拍照 【货位入库】") @GetMapping("/intoStock/picOver") public Result picOver(@ApiParam("巷道标识") @RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId, @ApiParam("货位号,如L0100010002 ,R/L表示左右,01是浅货位(02深),0001是X,0002是Y") @RequestParam String goodsLocation){ - String picPath = plcService.IntoStock(SRMNumber,"C1",taskId,goodsLocation); + String picPath = plcService.IntoStock(SRMNumber,taskId,goodsLocation); //返回普天 PTData ptData = PTData.IntoStock(SRMNumber,taskId,goodsLocation,picPath); PuTianNettyClient.write(ptData); @@ -134,7 +134,7 @@ public class ClientTestController { @ApiParam("货位号,如L0100010002 ,R/L表示左右,01是浅货位(02深),0001是X,0002是Y") @RequestParam String goodsLocation){ //拍入库完成后的照片 - String picPath = plcService.IntoStockOver(SRMNumber,"C2",taskId,goodsLocation); + String picPath = plcService.IntoStockOver(SRMNumber,taskId,goodsLocation); //向客户端发送读码指令,等待客户端返回条码 ISTransmission isTransmission = new ISTransmission(SRMNumber,taskId,goodsLocation); //为防万一,先清除code diff --git a/web/src/main/java/com/zhehekeji/web/pojo/street/StreetSearch.java b/web/src/main/java/com/zhehekeji/web/pojo/street/StreetSearch.java index 949659e..6abb47d 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/street/StreetSearch.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/street/StreetSearch.java @@ -8,4 +8,6 @@ public class StreetSearch { private Integer pageSize; private Integer pageNum; + + private Integer searchType; } 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 982e811..c563ee5 100644 --- a/web/src/main/java/com/zhehekeji/web/service/CameraService.java +++ b/web/src/main/java/com/zhehekeji/web/service/CameraService.java @@ -109,16 +109,19 @@ public class CameraService { PageHelper.startPage(streetSearch.getPageNum(), streetSearch.getPageSize()); List cameras = cameraMapper.selectByMap(new HashMap<>(0)); if(cameras.size() > 0){ - CountDownLatch latch = new CountDownLatch(cameras.size()); - cameras.forEach(camera -> { - StatusThread statusThread = new StatusThread(camera,latch); - statusThread.start(); - }); - try { - latch.await(); - } catch (InterruptedException e) { - e.printStackTrace(); + if(streetSearch.getSearchType() == null || streetSearch.getSearchType() == 0){ + CountDownLatch latch = new CountDownLatch(cameras.size()); + cameras.forEach(camera -> { + StatusThread statusThread = new StatusThread(camera,latch); + statusThread.start(); + }); + try { + latch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } } + } return new PageInfo<>(cameras); 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 25427be..33704e1 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -448,7 +448,6 @@ public class PlcService { public Stock checkStart(TMTransmission tmTransmission){ log.info("【开始盘点货位】save stock info ,taskId:{},SRMNumber:{},goodsLocation:{}",tmTransmission.getTaskNo(),tmTransmission.getSRMNumber(),tmTransmission.getGoodsLocation()); Street street = streetService.getStreetByPlcId(tmTransmission.getSRMNumber()); - Integer row = Integer.valueOf(tmTransmission.getGoodsLocation().substring(3,7)); Integer column = Integer.valueOf(tmTransmission.getGoodsLocation().substring(7)); Integer leftRight = tmTransmission.getGoodsLocation().substring(0,1).equals("L")?1:2; @@ -557,26 +556,28 @@ public class PlcService { /** * 相机转动,拍照,并返回图片地址 + * 顶部拍照 C1 * @param SRMNumber - * @param PTZCode * @return */ - public String IntoStock(String SRMNumber,String PTZCode,String taskId,String goodsLocation){ + public String IntoStock(String SRMNumber,String taskId,String goodsLocation){ Street street = streetService.getStreetByPlcId(SRMNumber); //南京烟草物流只有一个相机 Integer cameraId = street.getCamera1Id() == null ? street.getCamera2Id():street.getCamera1Id(); + Integer row = Integer.valueOf(goodsLocation.substring(3,7)); + Integer column = Integer.valueOf(goodsLocation.substring(7)); + Integer leftRight = goodsLocation.substring(0,1).equals("L")?1:2; + Integer inout = Integer.valueOf(goodsLocation.substring(1,3)); + //转动拍照 - gyrateCameraByCode(cameraId,PTZCode); + gyrateCameraByCode(cameraId,"C1"); //等待2s再拍照 try { Thread.sleep(2000l); } catch (InterruptedException e) { e.printStackTrace(); } - Integer row = Integer.valueOf(goodsLocation.substring(3,7)); - Integer column = Integer.valueOf(goodsLocation.substring(7)); - Integer leftRight = goodsLocation.substring(0,1).equals("L")?1:2; - Integer inout = Integer.valueOf(goodsLocation.substring(1,3)); + String path = PathUtil.createFileNameByRowColumn("jpg",cameraId,row,column); Order order = new Order(); order.setStreetId(street.getId()); @@ -585,6 +586,8 @@ public class PlcService { order.setInOut1(inout); order.setIntoStockPic(path); order.setIntoStockTime(LocalDateTime.now()); + order.setRow1(row); + order.setColumn1(column); orderMapper.insert(order); cameraCapture(cameraId,false,0l,path); return configProperties.getIP()+":9007/"+path; @@ -593,14 +596,20 @@ public class PlcService { /** * 相机转动,拍照,并返回图片地址 * @param SRMNumber - * @param PTZCode * @return */ - public String IntoStockOver(String SRMNumber,String PTZCode,String taskId,String goodsLocation){ + public String IntoStockOver(String SRMNumber,String taskId,String goodsLocation){ Street street = streetService.getStreetByPlcId(SRMNumber); //南京烟草物流只有一个相机 Integer cameraId = street.getCamera1Id() == null ? street.getCamera2Id():street.getCamera1Id(); + Integer row = Integer.valueOf(goodsLocation.substring(3,7)); + Integer column = Integer.valueOf(goodsLocation.substring(7)); + Integer leftRight = goodsLocation.substring(0,1).equals("L")?1:2; + Integer inout = Integer.valueOf(goodsLocation.substring(1,3)); + String inoutString = inout == 1 ? "IN" : "OUT"; + String leftRightString = leftRight == 1 ? "L":"R"; //转动拍照 + String PTZCode = String.format("C2-%s-%s", inoutString,leftRightString); gyrateCameraByCode(cameraId,PTZCode); //等待2s再拍照 try { @@ -608,10 +617,7 @@ public class PlcService { } catch (InterruptedException e) { e.printStackTrace(); } - Integer row = Integer.valueOf(goodsLocation.substring(3,7)); - Integer column = Integer.valueOf(goodsLocation.substring(7)); - Integer leftRight = goodsLocation.substring(0,1).equals("L")?1:2; - Integer inout = Integer.valueOf(goodsLocation.substring(1,3)); + String path = PathUtil.createFileNameByRowColumn("jpg",cameraId,row,column); Order order = orderMapper.getOneByOrderNum(taskId); if(order != null){ diff --git a/web/src/main/java/com/zhehekeji/web/service/StreetService.java b/web/src/main/java/com/zhehekeji/web/service/StreetService.java index 1af6d90..680291d 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StreetService.java +++ b/web/src/main/java/com/zhehekeji/web/service/StreetService.java @@ -89,37 +89,9 @@ public class StreetService { if(!StringUtils.isEmpty(street.getPlcIp())){ ClientChanel.putIp(street.getPlcIp(),street.getPlcId()); } - if(configProperties.getServerMode().equals(0)){ - StreetConn.init(street.getId(), street.getPlcId()); - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - //连接 - try { - nettyClient.createClient(street); - } catch (InterruptedException e) { - log.error("新增巷道,连接异常"); - } - } - }); - thread.start(); - } - if(!StringUtils.isEmpty(streetVO.getLightSourceIp()) && streetVO.getLightSourcePort() != null && streetVO.getLightSourcePort() != 0){ - LightSource lightSource = new LightSource(); - lightSource.setStreetId(street.getId()); - lightSource.setIp(streetVO.getLightSourceIp()); - lightSource.setPort(streetVO.getLightSourcePort()); - lightSourceMapper.insert(lightSource); - } - if(!StringUtils.isEmpty(streetVO.getRFIDIp()) && streetVO.getRFIDPort() != null && streetVO.getRFIDPort() != 0){ - RFID rfid = new RFID(); - rfid.setStreetId(street.getId()); - rfid.setIp(streetVO.getRFIDIp()); - rfid.setPort(streetVO.getRFIDPort()); - rfidMapper.insert(rfid); - } + streetVO.setId(street.getId()); - sensorGunConfig(streetVO,street.getId()); + //sensorGunConfig(streetVO,street.getId()); return street; } 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 e1d6039..11a110b 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 @@ -27,18 +27,32 @@ public class ClientChanel { * key :IP * value: 巷道标识符 */ - private static Map IPMap = new HashMap<>(); + private static Map IP_SRMNumberMap = new HashMap<>(); + + /** + * key :巷道标识符 + * value: IP + */ + private static Map SRMNumber_IPMap = new HashMap<>(); public static void putIp(String ip,String ID){ - IPMap.put(ip,ID); + IP_SRMNumberMap.put(ip,ID); + } + + public static void putSRMNUmber_Ip(String ID,String ip){ + SRMNumber_IPMap.put(ip,ID); + } + + public static String getIpFromId(String ID){ + return SRMNumber_IPMap.get(ID); } public static void deleteIp(String ip){ - IPMap.remove(ip); + IP_SRMNumberMap.remove(ip); } public static String getIDFromIp(String ip){ - return IPMap.get(ip); + return IP_SRMNumberMap.get(ip); } public static void connect(String key, Channel channel){ 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 1c1ddf6..a61e845 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 @@ -64,14 +64,17 @@ public class Decoder extends DelimiterBasedFrameDecoder { //回复客户端,建立连接完成 ctx.channel().writeAndFlush(ceTransmission.toString()); ClientChanel.connect(ceTransmission.getSRMNumber(), ctx.channel()); + tcpLogger.info("client:{} connect", ceTransmission.getSRMNumber()); in.release(); }else if(body.startsWith(ECTransmission.getHEADER())){ //空货位盘点 ECTransmission ecTransmission = new ECTransmission(body); + //保存空货位条码 + EmptyCheckCodeInfo.addCode(ecTransmission.getSRMNumber(),ecTransmission.getRow(),ecTransmission.getStartColumn(), ecTransmission.getEndColumn(), ecTransmission.getOriginCode()); //保存空货位信息 emptyCheckService.emptyCheckLog(ecTransmission); - + in.release(); }else if(body.startsWith("DC")){ //客户端断开连接 String [] strings = body.split(","); @@ -79,6 +82,7 @@ public class Decoder extends DelimiterBasedFrameDecoder { tcpLogger.info("client:{} disConnect", strings[1]); ClientChanel.disConnect(strings[1]); } + in.release(); } return null; } diff --git a/web/src/main/java/com/zhehekeji/web/service/client/EmptyCheckCodeInfo.java b/web/src/main/java/com/zhehekeji/web/service/client/EmptyCheckCodeInfo.java new file mode 100644 index 0000000..67d2a16 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/service/client/EmptyCheckCodeInfo.java @@ -0,0 +1,41 @@ +package com.zhehekeji.web.service.client; + +import lombok.Data; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * 空货位扫描到的全部条码 + */ +@Data +public class EmptyCheckCodeInfo { + + private static Map> allCode = new HashMap<>(); + + public static void start(String SRMNumber,Integer row,Integer startColumn,Integer endColumn){ + String key = String.format("{}-{}-{}-{}",SRMNumber,row,startColumn,endColumn); + allCode.remove(key); + } + + public static void addCode(String SRMNumber,Integer row,Integer startColumn,Integer endColumn,String code){ + String key = String.format("{}-{}-{}-{}",SRMNumber,row,startColumn,endColumn); + Set codes = allCode.get(key); + if(codes == null){ + codes = new HashSet<>(); + } + codes.add(code); + } + + public static Set getAllCode(String SRMNumber,Integer row,Integer startColumn,Integer endColumn){ + String key = String.format("{}-{}-{}-{}",SRMNumber,row,startColumn,endColumn); + return allCode.get(key); + } + + public static void stop(String SRMNumber,Integer row,Integer startColumn,Integer endColumn){ + String key = String.format("{}-{}-{}-{}",SRMNumber,row,startColumn,endColumn); + allCode.remove(key); + } +} diff --git a/web/src/main/java/com/zhehekeji/web/service/client/RealtimeCheckMap.java b/web/src/main/java/com/zhehekeji/web/service/client/RealtimeCheckMap.java index 7ccd1f5..09fbff3 100644 --- a/web/src/main/java/com/zhehekeji/web/service/client/RealtimeCheckMap.java +++ b/web/src/main/java/com/zhehekeji/web/service/client/RealtimeCheckMap.java @@ -1,7 +1,9 @@ package com.zhehekeji.web.service.client; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; +import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; @@ -11,6 +13,10 @@ public class RealtimeCheckMap { private static Map map = new HashMap<>(); public static void put(String SRMNumber,CheckInfo checkInfo){ + checkInfo.setTime(LocalDateTime.now()); + String ip = ClientChanel.getIpFromId(SRMNumber); + ip = ip +":9008/pic"; + checkInfo.setIP(ip); map.put(SRMNumber,checkInfo); } @@ -41,6 +47,8 @@ public class RealtimeCheckMap { private Integer checkCount; + private Integer status; + private String topPic1; private String topPic2; @@ -53,5 +61,20 @@ public class RealtimeCheckMap { private String sidePic4; + private String IP; + + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") + private LocalDateTime time; + + public Integer getStatus(){ + if(WMSCode.equals(checkCount) && checkCount.equals(WMSCount)){ + return 1; + } + return 0; + } + + + + } } diff --git a/web/src/main/java/com/zhehekeji/web/service/putian/PTDecoder.java b/web/src/main/java/com/zhehekeji/web/service/putian/PTDecoder.java index f3bcead..98f4067 100644 --- a/web/src/main/java/com/zhehekeji/web/service/putian/PTDecoder.java +++ b/web/src/main/java/com/zhehekeji/web/service/putian/PTDecoder.java @@ -3,6 +3,7 @@ package com.zhehekeji.web.service.putian; import com.zhehekeji.web.service.EmptyCheckService; import com.zhehekeji.web.service.client.ClientChanel; import com.zhehekeji.web.service.client.ECTransmission; +import com.zhehekeji.web.service.client.EmptyCheckCodeInfo; import com.zhehekeji.web.service.ksec.KsecDecoder; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -12,6 +13,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.nio.charset.Charset; +import java.util.Set; @Slf4j public class PTDecoder extends LineBasedFrameDecoder { @@ -51,6 +53,7 @@ public class PTDecoder extends LineBasedFrameDecoder { String startEmptyCheckStr = ECTransmission.toEmptyCheckStartString(checkContent.getSRMNUmber(),checkContent.getTaskNo(),checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn()); //通知客户端开始检测 ClientChanel.write(startEmptyCheckStr,checkContent.getSRMNUmber()); + EmptyCheckCodeInfo.start(checkContent.getSRMNUmber(),checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn()); }else if(ptData.getType().equals(PTData.EMPTY_CHECK_02)){ log.info("空货位检测结束"); PTEmptyCheckContent checkContent = PTEmptyCheckContent.EmptyCheck(ptData.getContent()); @@ -59,7 +62,14 @@ public class PTDecoder extends LineBasedFrameDecoder { ClientChanel.write(endEmptyCheckStr,checkContent.getSRMNUmber()); //等待3s把空货位盘点的结果发给普天 //todo + + emptyCheckService.getEmptyStatus(checkContent.getSRMNUmber(),checkContent.getTaskNo(),1,1,checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn()); + //打印空货位的所有条码 + Set codes = EmptyCheckCodeInfo.getAllCode(checkContent.getSRMNUmber(),checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn()); + log.info("【空货位扫描到的所有条码】,SRMNumber:{},row:{},startColumn:{},endColumn:{},taskId:{},\ncodes:{}",checkContent.getSRMNUmber(),checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn(),checkContent.getTaskNo(),codes); + //清空所有的条码 + EmptyCheckCodeInfo.stop(checkContent.getSRMNUmber(),checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn()); }else if(ptData.getType().equals(PTData.STOCK_CHECK_01)){ log.info("盘点具体货位"); @@ -67,8 +77,13 @@ public class PTDecoder extends LineBasedFrameDecoder { }else if(ptData.getType().equals(PTData.STOCK_CHECK_02)){ log.info("盘点具体货位 ,货物已取到载货台"); - }else { - log.info("未知的盘点指令:{}",ptData.getType()); + }else if(ptData.getType().equals(PTData.Into_Stock_01)){ + log.info("入库顶部拍照"); + + }else if(ptData.getType().equals(PTData.Into_Stock_02)){ + log.info("入库完成拍照"); + + } } return null;