diff --git a/modules/common/pom.xml b/modules/common/pom.xml index 462a781..2340aa1 100644 --- a/modules/common/pom.xml +++ b/modules/common/pom.xml @@ -109,13 +109,7 @@ system ${project.basedir}/src/main/resources/lib/core-1.0.0.jar - - com.zhehekeji - base-assembly - 1.0.0 - system - ${project.basedir}/src/main/resources/lib/base-assembly-1.0.0.jar - + com.baomidou mybatis-plus-boot-starter diff --git a/web/pom.xml b/web/pom.xml index 90169b6..a889ee3 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -21,7 +21,7 @@ com.zhehekeji - base-assembly + common ${base.assembly.version} 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 2c919dd..99a0432 100644 --- a/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java +++ b/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java @@ -37,6 +37,16 @@ public class ConfigProperties { private ScanCodeMode scanCodeMode; + /** + * 本机IP + */ + private String IP; + + /** + * TCP服务端端口 + */ + private Integer serverPort; + @Data public static class CameraConfig{ 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 f6f68bf..aaf8c1d 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/ClientTestController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/ClientTestController.java @@ -3,11 +3,16 @@ package com.zhehekeji.web.controller; import com.github.pagehelper.PageInfo; import com.zhehekeji.core.pojo.Result; import com.zhehekeji.web.entity.CheckLog; +import com.zhehekeji.web.entity.Street; import com.zhehekeji.web.pojo.stock.CheckLogSearch; +import com.zhehekeji.web.pojo.street.StreetVO; 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.TMTransmission; +import com.zhehekeji.web.service.PlcService; +import com.zhehekeji.web.service.StreetService; +import com.zhehekeji.web.service.client.*; +import com.zhehekeji.web.service.putian.PTData; +import com.zhehekeji.web.service.putian.PTEmptyCheckContent; +import com.zhehekeji.web.service.putian.PuTianNettyClient; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -23,42 +28,135 @@ public class ClientTestController { @Resource private EmptyCheckService emptyCheckService; + @Resource + private StreetService streetService; + @Resource + private PlcService plcService; - @ApiOperation("空货位盘点【发起】") + @ApiOperation("模拟普天 空货位盘点【发起】") @GetMapping("/emptyCheck/start") - public Result startEmptyCheck(@ApiParam("巷道标识") String SRMNumber,@ApiParam("盘点批次ID") String taskId, @ApiParam("检测第几行") Integer row){ - - ClientChanel.write(ECTransmission.toEmptyCheckStartString(SRMNumber),SRMNumber); - - return Result.success(); + public Result startEmptyCheck(@ApiParam("巷道标识")@RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId, @ApiParam("检测第几行")@RequestParam Integer row, + @ApiParam("开始列")@RequestParam Integer startColumn,@ApiParam("结束列")@RequestParam Integer endColumn){ + emptyCheckService.emptyCheckStart(SRMNumber,taskId,row); + String msg = ECTransmission.toEmptyCheckStartString(SRMNumber); + ClientChanel.write(msg,SRMNumber); + return Result.success(msg); } - @ApiOperation("空货位盘点 【结束】") + @ApiOperation("模拟普天 空货位盘点 【结束】") @GetMapping("/emptyCheck/stop") - public Result stopEmptyCheck(@ApiParam("巷道标识") String SRMNumber,@ApiParam("盘点批次ID") String taskId, @ApiParam("检测第几行") Integer row){ - emptyCheckService.emptyCheckStart(SRMNumber,taskId,row); - ClientChanel.write(ECTransmission.toEmptyCheckEndString(SRMNumber),SRMNumber); - return Result.success(); + public Result stopEmptyCheck(@ApiParam("巷道标识")@RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId, @ApiParam("检测第几行")@RequestParam Integer row, + @ApiParam("开始列")@RequestParam Integer startColumn,@ApiParam("结束列")@RequestParam Integer endColumn){ + String msg = ECTransmission.toEmptyCheckEndString(SRMNumber); + ClientChanel.write(msg,SRMNumber); + //获取空货位的结果信息 + // 返回给普天 + Street street = streetService.getStreetByPlcId(SRMNumber); + PTEmptyCheckContent ptEmptyCheckContent = null; + PTData ptData = null; + String shevel = null; + if(street.getLeftType() == 0){ + //单伸 + String SingleLeft = emptyCheckService.getEmptyStatus(SRMNumber,taskId,1,1,row); + shevel = "L01"; + ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleLeft); + ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent); + PuTianNettyClient.write(ptData); + String SingleRight = emptyCheckService.getEmptyStatus(SRMNumber,taskId,1,2,row); + shevel = "R01"; + ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleRight); + ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent); + PuTianNettyClient.write(ptData); + }else { + String SingleInLeft = emptyCheckService.getEmptyStatus(SRMNumber,taskId,1,1,row); + shevel = "L01"; + ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleInLeft); + ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent); + PuTianNettyClient.write(ptData); + String SingleInRight = emptyCheckService.getEmptyStatus(SRMNumber,taskId,1,2,row); + shevel = "R01"; + ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleInRight); + ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent); + PuTianNettyClient.write(ptData); + String SingleOutLeft = emptyCheckService.getEmptyStatus(SRMNumber,taskId,2,1,row); + shevel = "L02"; + ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleOutLeft); + ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent); + PuTianNettyClient.write(ptData); + String SingleOutRight = emptyCheckService.getEmptyStatus(SRMNumber,taskId,2,2,row); + shevel = "R02"; + ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleOutRight); + ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent); + PuTianNettyClient.write(ptData); + } + return Result.success(msg); } - @ApiOperation("盘点具体货位 第一步 【发起盘点】") + @ApiOperation("模拟普天 盘点具体货位 第一步 【发起盘点】") @GetMapping("/stockCheck/start") - public Result startStockCheck(@ApiParam("巷道标识") String SRMNumber,@ApiParam("盘点批次ID") String taskId, - @ApiParam("货位号,如L0100010002 ,R/L表示左右,01是浅货位(02深),0001是X,0002是Y") String goodsLocation,@ApiParam("品规")String code,@ApiParam("数量")Integer count, - @ApiParam("是否是虚拟检测 Y:是 N:不是")String V){ + public Result startStockCheck(@ApiParam("巷道标识")@RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId, + @ApiParam("货位号,如L0100010002 ,R/L表示左右,01是浅货位(02深),0001是X,0002是Y") @RequestParam String goodsLocation,@ApiParam("品规")@RequestParam String code,@ApiParam("数量") @RequestParam Integer count, + @ApiParam("是否是虚拟检测 Y:是 N:不是") @RequestParam String V){ TMTransmission tmTransmission = new TMTransmission(SRMNumber,taskId,goodsLocation,code,count,V); - ClientChanel.write(tmTransmission.toString(),SRMNumber); + String msg = tmTransmission.toString(); + ClientChanel.write(msg,SRMNumber); return Result.success(); } - @ApiOperation("盘点具体货位 第二步 【取货到载货台完成】") + @ApiOperation("模拟普天 盘点具体货位 第二步 【取货到载货台完成,客户端拍照】") @GetMapping("/stockCheck/goodsMoveOver") - public Result goodsMoveOver(@ApiParam("巷道标识") String SRMNumber,@ApiParam("盘点批次ID") String taskId){ + public Result goodsMoveOver(@ApiParam("巷道标识") @RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId){ TMTransmission tmTransmission = new TMTransmission(SRMNumber,taskId); - ClientChanel.write(tmTransmission.toSC02String(),SRMNumber); + String msg = tmTransmission.toSC02String(); + ClientChanel.write(msg,SRMNumber); return Result.success(); } + @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){ + //todo 顶部拍照 + Integer row = Integer.valueOf(goodsLocation.substring(3,7)); + Integer column = Integer.valueOf(goodsLocation.substring(7)); + String picPath = plcService.IntoStock(SRMNumber,"C1",row,column); + //返回普天 + PTData ptData = PTData.IntoStock(SRMNumber,taskId,goodsLocation,picPath); + PuTianNettyClient.write(ptData); + return Result.success(ptData.toString()); + } + + @ApiOperation("模拟普天 货物入库完成 【货物入库完成】") + @GetMapping("/intoStock/goodsOver") + public Result goodsOver(@ApiParam("巷道标识") @RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId, + @ApiParam("货位号,如L0100010002 ,R/L表示左右,01是浅货位(02深),0001是X,0002是Y") @RequestParam String goodsLocation){ + //拍入库完成后的照片 + Integer row = Integer.valueOf(goodsLocation.substring(3,7)); + Integer column = Integer.valueOf(goodsLocation.substring(7)); + String picPath = plcService.IntoStock(SRMNumber,"C2",row,column); + //向客户端发送读码指令,等待客户端返回条码 + ISTransmission isTransmission = new ISTransmission(SRMNumber,taskId,goodsLocation); + //为防万一,先清除code + ClientCodeMap.removeCode(SRMNumber); + ClientChanel.write(isTransmission.toString(),SRMNumber); + //发送结果给普天 + //若1分钟内仍为收到 则放弃 + Long start = System.currentTimeMillis(); + while (ClientCodeMap.getCode(SRMNumber) == null && (System.currentTimeMillis()-start)<60000){ + + try { + Thread.sleep(300l); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + String code = ClientCodeMap.getCode(SRMNumber); + PTData ptData = PTData.IntoStock04(SRMNumber,taskId,goodsLocation,picPath,code); + PuTianNettyClient.write(ptData); + return Result.success(); + } + + } 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 d5f50d9..479a30b 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.mapper.SensorGunMapper; import com.zhehekeji.web.mapper.StreetMapper; import com.zhehekeji.web.service.client.NettyServer; import com.zhehekeji.web.service.ksec.KsecNettyClient; +import com.zhehekeji.web.service.putian.PuTianNettyClient; import com.zhehekeji.web.service.robotic.NettyClient; import com.zhehekeji.web.service.sick.SickNettyClient; import lombok.extern.slf4j.Slf4j; @@ -39,9 +40,7 @@ public class InitService implements ApplicationRunner { @Resource private StreetMapper streetMapper; @Resource - private NettyClient nettyClient; - @Resource - private KsecNettyClient ksecNettyClient; + private PuTianNettyClient puTianNettyClient; @Resource private ConfigProperties configProperties; @@ -80,43 +79,26 @@ public class InitService implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { - nettyServer.CreateNettyServer(3001); + nettyServer.CreateNettyServer(configProperties.getServerPort()); //球机登录 List cameras = cameraMapper.selectByMap(new HashMap<>(0)); cameras.forEach(camera -> { LoginThread loginThread = new LoginThread(camera); loginThread.start(); }); - //plc连接 - 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()); - try { - nettyClient.createClient(street); - }catch (Exception e){ - log.error("streetId:{}:初始plc连接失败,url:{},port:{}",street.getId(),street.getPlcIp(),street.getPlcPort()); - } - }); - }else if(configProperties.getServerMode() == 1){ - log.info("KESC JSON MODE"); - // 昆船协议 - ConfigProperties.KSEC ksec = configProperties.getKsec(); - if(ksec != null){ - StreetConn.init(1,"ksec"); - try { - ksecNettyClient.createClient(ksec); - }catch (Exception e){ - log.error("kesc connect error,url:{},port:{}",ksec.getIp(),ksec.getPort()); - } - }else { - log.error("ksec no config"); + ConfigProperties.KSEC ksec = configProperties.getKsec(); + if(ksec != null){ + StreetConn.init(1,"ksec"); + try { + puTianNettyClient.createClient(ksec); + }catch (Exception e){ + log.error("kesc connect error,url:{},port:{}",ksec.getIp(),ksec.getPort()); } + }else { + log.error("ksec no config"); } - TaskDelayExecutor.runMp4DownloadExecutor(); + + //TaskDelayExecutor.runMp4DownloadExecutor(); } 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 67ec5a1..8fec1b4 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -80,10 +80,6 @@ public class PlcService { public Integer plcStatus() { Integer count = 1; - if(configProperties.getServerMode() == 0){ - count = streetMapper.selectCount(new QueryWrapper<>()); - } - List connIds = StreetConn.connList(); return (count - connIds.size()); } @@ -623,4 +619,28 @@ public class PlcService { return configProperties; } + + /** + * 相机转动,拍照,并返回图片地址 + * @param SRMNumber + * @param PTZCode + * @return + */ + public String IntoStock(String SRMNumber,String PTZCode,Integer row,Integer column){ + Street street = streetService.getStreetByPlcId(SRMNumber); + //南京烟草物流只有一个相机 + Integer cameraId = street.getCamera1Id() == null ? street.getCamera2Id():street.getCamera1Id(); + //转动拍照 + gyrateCameraByCode(cameraId,PTZCode); + //等待2s再拍照 + try { + Thread.sleep(2000l); + } catch (InterruptedException e) { + e.printStackTrace(); + } + String path = PathUtil.createFileNameByRowColumn("jpg",cameraId,row,column); + cameraCapture(cameraId,false,0l,path); + return configProperties.getIP()+":9007/"+path; + } + } diff --git a/web/src/main/java/com/zhehekeji/web/service/client/ClientCodeMap.java b/web/src/main/java/com/zhehekeji/web/service/client/ClientCodeMap.java new file mode 100644 index 0000000..a785ae0 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/service/client/ClientCodeMap.java @@ -0,0 +1,25 @@ +package com.zhehekeji.web.service.client; + +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; + +public class ClientCodeMap { + + /** + * 线程安全的map + */ + protected static Map codeMap = new Hashtable<>(); + + public static void putCode(String SRMNumber,String code){ + codeMap.put(SRMNumber,code); + } + + public static String getCode(String SRMNumber){ + return codeMap.get(SRMNumber); + } + + public static void removeCode(String SRMNumber){ + codeMap.remove(SRMNumber); + } +} diff --git a/web/src/main/java/com/zhehekeji/web/service/client/ISTransmission.java b/web/src/main/java/com/zhehekeji/web/service/client/ISTransmission.java new file mode 100644 index 0000000..26d0e93 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/service/client/ISTransmission.java @@ -0,0 +1,44 @@ +package com.zhehekeji.web.service.client; + +import lombok.Data; + +@Data +public class ISTransmission { + + private static String HEADER = "IS"; + + private static String Split = ","; + + private String SRMNumber; + + private String taskId; + + private String goodsLocation; + + private String code; + + public String toString(){ + StringBuffer sb = new StringBuffer(); + sb.append(HEADER).append(Split).append(SRMNumber).append(Split).append(taskId).append(Split).append(goodsLocation); + if(code != null){ + sb.append(Split).append(code); + } + return sb.toString(); + } + + public ISTransmission(String SRMNumber,String taskId,String goodsLocation){ + this.SRMNumber = SRMNumber; + this.goodsLocation = goodsLocation; + this.taskId = taskId; + } + + public ISTransmission(String msg){ + String [] strings = msg.split(Split); + HEADER = strings[0]; + SRMNumber = strings[1]; + goodsLocation = strings[2]; + if(strings.length == 4){ + code = strings[3]; + } + } +} diff --git a/web/src/main/java/com/zhehekeji/web/service/putian/PTData.java b/web/src/main/java/com/zhehekeji/web/service/putian/PTData.java index 56d8d45..b4cbc20 100644 --- a/web/src/main/java/com/zhehekeji/web/service/putian/PTData.java +++ b/web/src/main/java/com/zhehekeji/web/service/putian/PTData.java @@ -13,6 +13,21 @@ public class PTData { public static String HEART_TYPE = "HB"; + /** + * 此报文是无需回复的报文 + */ + protected static String FLOW_NO_NEED_RES = "."; + + /** + * 此报文是需要回复的报文 + */ + protected static String FLOW_R = "R"; + + /** + * 此报文是回复的报文 + */ + protected static String FLOW_A = "A"; + /** * 1.空货位盘点开始(EmptyCheck01): EC01 * 2.空货位盘点结束(EmptyCheck02): EC02 @@ -45,10 +60,6 @@ public class PTData { private String Content; - public String toString(){ - return FlowControl + SPLIT + Type + SPLIT + Content + END_STRING; - } - public PTData(String data){ String[] strings = data.split(SPLIT); FlowControl = strings[0]; @@ -64,7 +75,35 @@ public class PTData { return ptData; } + public static PTData IntoStock(String SRMNumber,String taskId,String goodsLocation,String picPath){ + StringBuffer contentSB = new StringBuffer(); + contentSB.append(SRMNumber).append(",").append(taskId).append(",").append(goodsLocation).append(",").append(picPath); + PTData ptData = new PTData(contentSB.toString(),FLOW_NO_NEED_RES,Into_Stock_02); + return ptData; + } + + public static PTData IntoStock04(String SRMNumber,String taskId,String goodsLocation,String picPath,String code){ + StringBuffer contentSB = new StringBuffer(); + contentSB.append(SRMNumber).append(",").append(taskId).append(",").append(goodsLocation).append(",").append(picPath).append(",").append(code); + PTData ptData = new PTData(contentSB.toString(),FLOW_NO_NEED_RES,Into_Stock_04); + return ptData; + } + public static PTData EmptyStatusResponse(PTEmptyCheckContent ptEmptyCheckContent){ + return new PTData(ptEmptyCheckContent.toString(),FLOW_NO_NEED_RES,EMPTY_CHECK_03); + } + + public String toString(){ + StringBuffer sb = new StringBuffer(); + sb.append(this.FlowControl).append(SPLIT).append(Type).append(SPLIT).append(Content).append(END_STRING); + return sb.toString(); + } + + public PTData(String content,String Flow,String type){ + this.FlowControl = Flow; + this.Content = content; + this.Type = type; + } } 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 de156db..6992cd8 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 @@ -29,15 +29,16 @@ public class PTDecoder extends LineBasedFrameDecoder { * @param stripDelimiter true:解析出的数据包不带换行符 * @param failFast */ - public PTDecoder(int maxLength, boolean stripDelimiter, boolean failFast) { + public PTDecoder(int maxLength, boolean stripDelimiter, boolean failFast,EmptyCheckService emptyCheckService) { super(maxLength, stripDelimiter, failFast); + this.emptyCheckService = emptyCheckService; } protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception { in = (ByteBuf) super.decode(ctx, in); if(in != null){ String body = in.toString(Charset.forName("UTF-8")); - tcpLogger.info(body); + tcpLogger.info("received from PT:{}",body); PTData ptData = new PTData(body); if(ptData.getType().equals(PTData.HEART_TYPE)){ @@ -45,14 +46,14 @@ public class PTDecoder extends LineBasedFrameDecoder { }else if(ptData.getType().equals(PTData.EMPTY_CHECK_01)){ log.info("空货位检测开始"); - PTEmptyCheckContent checkContent = PTEmptyCheckContent.EmptyCheck(body); + PTEmptyCheckContent checkContent = PTEmptyCheckContent.EmptyCheck(ptData.getContent()); emptyCheckService.emptyCheckStart(checkContent.getSRMNUmber(), checkContent.getTaskNo(), checkContent.getRow()); String startEmptyCheckStr = ECTransmission.toEmptyCheckStartString(checkContent.getSRMNUmber()); //通知客户端开始检测 ClientChanel.write(startEmptyCheckStr,checkContent.getSRMNUmber()); }else if(ptData.getType().equals(PTData.EMPTY_CHECK_02)){ log.info("空货位检测结束"); - PTEmptyCheckContent checkContent = PTEmptyCheckContent.EmptyCheck(body); + PTEmptyCheckContent checkContent = PTEmptyCheckContent.EmptyCheck(ptData.getContent()); String endEmptyCheckStr = ECTransmission.toEmptyCheckEndString(checkContent.getSRMNUmber()); //通知客户端结束检测 ClientChanel.write(endEmptyCheckStr,checkContent.getSRMNUmber()); diff --git a/web/src/main/java/com/zhehekeji/web/service/putian/PTEmptyCheckContent.java b/web/src/main/java/com/zhehekeji/web/service/putian/PTEmptyCheckContent.java index 6c865fd..3f7d0eb 100644 --- a/web/src/main/java/com/zhehekeji/web/service/putian/PTEmptyCheckContent.java +++ b/web/src/main/java/com/zhehekeji/web/service/putian/PTEmptyCheckContent.java @@ -37,6 +37,13 @@ public class PTEmptyCheckContent { */ private String type; + private String shelve; + + /** + * 盘点结果 + */ + private String emptyStatus; + public static PTEmptyCheckContent EmptyCheck(String data){ PTEmptyCheckContent ptContent = new PTEmptyCheckContent(); @@ -49,4 +56,18 @@ public class PTEmptyCheckContent { ptContent.setType(strings[5]); return ptContent; } + + public static PTEmptyCheckContent emptyCheckResponse(String SRMNUmber,String taskId,int row,int startColumn,int endColumn,String shelve,String emptyStatus){ + PTEmptyCheckContent ptContent = new PTEmptyCheckContent(); + ptContent.setSRMNUmber(SRMNUmber); + ptContent.setTaskNo(taskId); + ptContent.setRow(row); + ptContent.setStartColumn(startColumn); + ptContent.setEndColumn(endColumn); + ptContent.setShelve(shelve); + ptContent.setEmptyStatus(emptyStatus); + return ptContent; + } + + } diff --git a/web/src/main/java/com/zhehekeji/web/service/putian/PTFilter.java b/web/src/main/java/com/zhehekeji/web/service/putian/PTFilter.java index 80cbc15..13d09ce 100644 --- a/web/src/main/java/com/zhehekeji/web/service/putian/PTFilter.java +++ b/web/src/main/java/com/zhehekeji/web/service/putian/PTFilter.java @@ -1,5 +1,6 @@ package com.zhehekeji.web.service.putian; +import com.zhehekeji.web.service.EmptyCheckService; import com.zhehekeji.web.service.PlcService; import com.zhehekeji.web.service.ksec.*; import io.netty.buffer.ByteBuf; @@ -21,11 +22,14 @@ public class PTFilter extends ChannelInitializer { private PlcService plcService; + private EmptyCheckService emptyCheckService; + private PuTianNettyClient nettyClient; - public PTFilter(PlcService plcService, PuTianNettyClient nettyClient){ + public PTFilter(PlcService plcService, PuTianNettyClient nettyClient,EmptyCheckService emptyCheckService){ this.plcService = plcService; this.nettyClient = nettyClient; + this.emptyCheckService = emptyCheckService; } @Override @@ -34,7 +38,7 @@ public class PTFilter extends ChannelInitializer { //30秒发一次心跳 ph.addLast(new IdleStateHandler(0, 30, 0, TimeUnit.SECONDS)); ByteBuf byteBuf = Unpooled.copiedBuffer(">".getBytes()); - ph.addLast(new PTDecoder(1000,false,true)); + ph.addLast(new PTDecoder(1000,false,true,emptyCheckService)); ph.addLast(new PtEncoder()); ph.addLast(new PTNettyHandler(nettyClient)); } diff --git a/web/src/main/java/com/zhehekeji/web/service/putian/PTNettyHandler.java b/web/src/main/java/com/zhehekeji/web/service/putian/PTNettyHandler.java index 16a24a9..61a83d5 100644 --- a/web/src/main/java/com/zhehekeji/web/service/putian/PTNettyHandler.java +++ b/web/src/main/java/com/zhehekeji/web/service/putian/PTNettyHandler.java @@ -17,7 +17,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class PTNettyHandler extends ChannelInboundHandlerAdapter { /** 客户端请求的心跳命令 */ - private PTData heart; + private PTData heart = PTData.HeartBeat(); private PuTianNettyClient nettyClient; @@ -32,7 +32,7 @@ public class PTNettyHandler extends ChannelInboundHandlerAdapter { */ @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { - log.info("upPc connected "); + log.info("Pt connected "); StreetConn.conn(1); ctx.fireChannelActive(); } @@ -42,7 +42,7 @@ public class PTNettyHandler extends ChannelInboundHandlerAdapter { */ @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { - log.info("upPc closed"); + log.info("Pt closed"); StreetConn.disConn(1); log.info(" streetId reconnect......"); nettyClient.reconnect(1); @@ -55,7 +55,7 @@ public class PTNettyHandler extends ChannelInboundHandlerAdapter { @Override public void userEventTriggered(ChannelHandlerContext ctx, Object obj) throws Exception { if (obj instanceof IdleStateEvent) { - log.debug("upPc send heart"); + log.debug("Pt send heart"); ctx.channel().writeAndFlush(heart); } diff --git a/web/src/main/java/com/zhehekeji/web/service/putian/PtEncoder.java b/web/src/main/java/com/zhehekeji/web/service/putian/PtEncoder.java index f05eae6..bdf27cd 100644 --- a/web/src/main/java/com/zhehekeji/web/service/putian/PtEncoder.java +++ b/web/src/main/java/com/zhehekeji/web/service/putian/PtEncoder.java @@ -3,6 +3,8 @@ package com.zhehekeji.web.service.putian; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.nio.charset.StandardCharsets; @@ -11,9 +13,12 @@ import java.nio.charset.StandardCharsets; */ public class PtEncoder extends MessageToByteEncoder { + private static final Logger tcpLogger = LoggerFactory.getLogger("tcp"); + @Override protected void encode(ChannelHandlerContext channelHandlerContext, PTData data, ByteBuf byteBuf) throws Exception { String body = data.toString(); + tcpLogger.info("send to PT:{}",body); byteBuf.writeBytes(body.getBytes(StandardCharsets.UTF_8)); } } diff --git a/web/src/main/java/com/zhehekeji/web/service/putian/PuTianNettyClient.java b/web/src/main/java/com/zhehekeji/web/service/putian/PuTianNettyClient.java index ee4b2da..9969f15 100644 --- a/web/src/main/java/com/zhehekeji/web/service/putian/PuTianNettyClient.java +++ b/web/src/main/java/com/zhehekeji/web/service/putian/PuTianNettyClient.java @@ -1,6 +1,7 @@ package com.zhehekeji.web.service.putian; import com.zhehekeji.web.config.ConfigProperties; +import com.zhehekeji.web.service.EmptyCheckService; import com.zhehekeji.web.service.PlcService; import com.zhehekeji.web.service.client.Decoder; import com.zhehekeji.web.service.client.Encoder; @@ -28,6 +29,8 @@ public class PuTianNettyClient { private PlcService plcService; @Resource private ConfigProperties configProperties; + @Resource + private EmptyCheckService emptyCheckService; /** * 重连最大次数 @@ -43,7 +46,8 @@ public class PuTianNettyClient { Bootstrap client = new Bootstrap(); client.group(group); client.channel(NioSocketChannel.class); - client.handler(new PTNettyHandler(this)); + client.handler(new PTFilter(plcService,this,emptyCheckService)); + // 连接服务端 channel = client.connect(ksec.getIp(), ksec.getPort()).sync().channel(); } @@ -84,9 +88,9 @@ public class PuTianNettyClient { } } - public static void write(KsecInfo ksecInfo){ + public static void write(PTData ptData){ if(channel != null){ - channel.writeAndFlush(ksecInfo); + channel.writeAndFlush(ptData); }else { log.error(" no connected upPc"); } diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index 27f76ac..f3b2b77 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -34,35 +34,17 @@ cameraConfig: videoServer: 127.0.0.1:8083 #相机抓图延迟 毫秒,这个延迟是等待球机球机转动到位,然后拍照的 delayCaptureTime: 3500 - #随行模式下的相机抓图延迟 毫秒,这个延迟是等待球机球机转动到位,然后拍照的 - # 发了C1之后多久拍照 - C1DelayCaptureTime: 1500 - # 内侧货架 发了C2 之后多久拍照 - C2DelayCaptureTime: 1500 - # 外侧货架 发了C2 之后多久拍照 - C2OutDelayCaptureTime: 2500 - # 发了C3之后多久拍照 - C3DelayCaptureTime: 1500 - C4DelayCaptureTime: 1500 - C4OutDelayCaptureTime: 1500 - # 发了B2之后多久转原点位 - B2DelayTime: 2000 - # 外侧货架发了B2多久转原点位 - B2OutDelayTime: 2000 - # 下载mp4延迟 海康的下载mp4需要2分钟 - # 利珀延迟10s就可 - # 单位毫秒 - delayDownloadMp4: 10000 # ------------ # -----图片 mp4下载地址 savePath: mediaPath: d:\\data\media\ mp4Path: d://data/mp4/ -# ------------服务端类型 0:TCP(罗伯泰克) 1:KSEC(JSON)(昆船) -serverMode: 1 +# 普天上位地址 ksec: - ip: 172.18.96.1 + ip: 192.168.125.5 port: 3000 +# 服务端TCP端口 +serverPort: 3001 # ------------ 实时视频流 全部页面的格式 行列数量 videoStyleConfig: videoStyleRow: 4 @@ -77,13 +59,7 @@ lightSource: index: 1 # -----tray 托盘 # -----goods 货物 -# 扫码模式 0:此处不盘点 1:球机扫码 2:sick扫码枪 3:南北达RFID -scanCodeMode: - tray: 1 - goods: 0 - goodsCodeTypes: - - 14 - trayCodeTypes: - - 14 # 照片 視頻保存多久 -deleteFileDays: 365 \ No newline at end of file +deleteFileDays: 365 +# 服务端IP +IP: 192.168.1.1 \ No newline at end of file diff --git a/web/src/main/resources/logback-spring.xml b/web/src/main/resources/logback-spring.xml index 278dbcf..ba1ca23 100644 --- a/web/src/main/resources/logback-spring.xml +++ b/web/src/main/resources/logback-spring.xml @@ -128,6 +128,7 @@ +