diff --git a/web/src/main/java/com/zhehekeji/web/controller/StockController.java b/web/src/main/java/com/zhehekeji/web/controller/StockController.java index 28b1674..a00de62 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/StockController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/StockController.java @@ -116,7 +116,7 @@ public class StockController { @RequestMapping(value = "/checkInfo", method = RequestMethod.POST) public Result checkInfo(@RequestBody StockCheckSearch stockCheck) { validatorUtil.validate(stockCheck); - Stock stock = new Stock(); + Stock stock = stockService.stock(stockCheck); return Result.success(stock); } 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 fc2a64d..4a13ccd 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 @@ -28,6 +28,7 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { * 向上 */ public boolean ptzControlUpStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) { + log.info("up start"); return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL, lParam1, lParam2, 0, 0); @@ -35,6 +36,7 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { } public boolean ptzControlUpEnd(Integer cameraId, int nChannelID) { + log.info("up end"); return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL, 0, 0, 0, 1); @@ -44,12 +46,14 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { * 向下 */ public boolean ptzControlDownStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) { + log.info("down start"); return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, NetSDKLib.NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL, lParam1, lParam2, 0, 0); } public boolean ptzControlDownEnd(Integer cameraId, int nChannelID) { + log.info("down end"); return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, NetSDKLib.NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL, 0, 0, 0, 1); @@ -59,12 +63,14 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { * 向左 */ public boolean ptzControlLeftStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) { + log.info("left start"); return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL, lParam1, lParam2, 0, 0); } public boolean ptzControlLeftEnd(Integer cameraId, int nChannelID) { + log.info("left end"); return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL, 0, 0, 0, 1); @@ -74,12 +80,14 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { * 向右 */ public boolean ptzControlRightStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) { + log.info("right start"); return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL, lParam1, lParam2, 0, 0); } public boolean ptzControlRightEnd(Integer cameraId, int nChannelID) { + log.info("right end"); return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL, 0, 0, 0, 1); @@ -89,12 +97,14 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { * 向左上 */ public boolean ptzControlLeftUpStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) { + log.info("up left start"); return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP, lParam1, lParam2, 0, 0); } public boolean ptzControlLeftUpEnd(Integer cameraId, int nChannelID) { + log.info("up left end"); return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP, 0, 0, 0, 1); @@ -104,12 +114,14 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { * 向右上 */ public boolean ptzControlRightUpStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) { + log.info("up right start"); return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTTOP, lParam1, lParam2, 0, 0); } public boolean ptzControlRightUpEnd(Integer cameraId, int nChannelID) { + log.info("up right end"); return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTTOP, 0, 0, 0, 1); @@ -119,6 +131,7 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { * 向左下 */ public boolean ptzControlLeftDownStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) { + log.info(" left down start"); Boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN, lParam1, lParam2, 0, 0); @@ -129,6 +142,7 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { } public boolean ptzControlLeftDownEnd(Integer cameraId, int nChannelID) { + log.info(" left down end"); return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN, 0, 0, 0, 1); @@ -138,12 +152,14 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { * 向右下 */ public boolean ptzControlRightDownStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) { + log.info(" right down start"); return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTDOWN, lParam1, lParam2, 0, 0); } public boolean ptzControlRightDownEnd(Integer cameraId, int nChannelID) { + log.info(" right down end"); return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTDOWN, 0, 0, 0, 1); @@ -306,6 +322,7 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { * @param cameraId */ public void toPtz(Integer ptzId, Integer cameraId) { + log.info("to ptz,ptzId:{},cameraId:{}",ptzId,cameraId); int dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_MOVE_CONTROL; Boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId), 0, dwPTZCommand, 0, ptzId, 0, 0, null); if (!ok) { diff --git a/web/src/main/java/com/zhehekeji/web/pojo/stock/StockCheckSearch.java b/web/src/main/java/com/zhehekeji/web/pojo/stock/StockCheckSearch.java index 57f2431..9c39a74 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/stock/StockCheckSearch.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/stock/StockCheckSearch.java @@ -7,7 +7,7 @@ import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @Data -public class StockCheckSearch { +public class StockCheckSearch { @NotEmpty(message = "巷道标识符不能为空") @ApiModelProperty("巷道标识符") diff --git a/web/src/main/java/com/zhehekeji/web/service/CronTab.java b/web/src/main/java/com/zhehekeji/web/service/CronTab.java index eb0a591..200cf10 100644 --- a/web/src/main/java/com/zhehekeji/web/service/CronTab.java +++ b/web/src/main/java/com/zhehekeji/web/service/CronTab.java @@ -26,6 +26,9 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; @Component @EnableScheduling @@ -44,12 +47,19 @@ public class CronTab { //10分钟 private static BigInteger timeDIff = BigInteger.valueOf(10*60*1000); + private static int gByte = 1024* 1024 * 1024; + @Scheduled(cron = "0 0 0 * * ?") //@Scheduled(cron = "0 0/1 * * * *") public void file() { log.info(" corn delete file"); now = LocalDateTime.now(); File dir = new File(configProperties.getSavePath().getMediaPath()); + long space = dir.getFreeSpace() / gByte; + log.info(" free space :{}",space); + if(space > 150){ + return; + } checkFileTime(dir,configProperties.getDeleteFileDays()); File dir2 = new File(configProperties.getSavePath().getMp4Path()); checkFileTime(dir2,configProperties.getDeleteFileDays()); 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 2c2c5db..5f0473d 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 @@ -15,6 +15,9 @@ import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import java.nio.charset.Charset; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; /** * 昆船通讯协议(TCP 传输JSON) @@ -30,6 +33,8 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { private static String lastLotnum; + private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(7,21,30, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(20000)); + private PlcService plcService; public KsecDecoder(int maxFrameLength, ByteBuf delimiter, PlcService plcService) { @@ -44,86 +49,120 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { log.debug("no data"); return null; } - String body = in.toString(Charset.forName("UTF-8")); - if (body.startsWith("<")){ - // 去掉首尾标识符 - body = body.substring(1, body.length()); - KsecInfo ksecInfo = JSONObject.parseObject(body, KsecInfo.class); - if (Cmd.A.name().equals(ksecInfo.getType())) { - in.release(); - return null; - } - KsecDataInfo dataInfo = ksecInfo.getData(); - String lotnum = dataInfo.getLotnum(); - PlcCmdInfo plcCmdInfo = null; - String srmNumber = null; - String cmdName = null; - if(dataInfo != null){ - //左右换过来 - if(dataInfo.getFromDirection() == 1){ - dataInfo.setFromDirection(2); - }else { - dataInfo.setFromDirection(1); - } - if(dataInfo.getToDirection() != null && dataInfo.getToDirection() == 1){ - dataInfo.setToDirection(2); - }else { - dataInfo.setToDirection(1); - } - plcCmdInfo = new PlcCmdInfo(dataInfo.getSRMNumber(), dataInfo.getTaskId(), dataInfo.getFromSide(), dataInfo.getFromDirection(), dataInfo.getFromColumn(), dataInfo.getFromRow(), dataInfo.getFromSeparation(),dataInfo.getToSide(), dataInfo.getToDirection(), dataInfo.getToColumn(), dataInfo.getToRow(),dataInfo.getToSeparation(),lotnum); + KescRunnable kescRunnable = new KescRunnable(in,ctx,plcService); + threadPoolExecutor.execute(kescRunnable); + return null; + } - srmNumber = dataInfo.getSRMNumber(); - cmdName = dataInfo.getCmdName(); - } - if (Cmd.A.name().equals(ksecInfo.getType())) { - //心跳 - log.debug("receieve heart "); - } else if (Cmd.B.name().equals(ksecInfo.getType())) { - tcpLogger.info("info:{}",body); - //任务 - if (Cmd.B1.name().equals(cmdName)) { - //昆船盘点模式下也会发B1 ,但是不会发送B2 - //这里判断下,是否存在盘点批次号 若存在,既是盘点的B1,无需处理;若不存在lotnum,则是随行的B1 - if(StringUtils.isEmpty(dataInfo.getLotnum())){ - //任务开始 旋转到原点位 - plcService.gyrateCamera(plcCmdInfo,Cmd.C5.name()); - plcService.orderStart(plcCmdInfo); - }else { - log.info("check move"); - } + public static class KescRunnable implements Runnable{ + + private ByteBuf in; - } else if (Cmd.B2.name().equals(cmdName)) { - //B2 C4 一起发的,需要停止等B2 + private ChannelHandlerContext ctx; - //这里判断是不是双伸 - if(plcCmdInfo.getSeparation2() == 2){ - //深测货架延迟 - Thread.sleep(plcService.getConfigProperties().getCameraConfig().getB2OutDelayTime()); + private PlcService plcService; + + public KescRunnable(ByteBuf body,ChannelHandlerContext ctx,PlcService plcService){ + this.in = body; + this.ctx = ctx; + this.plcService = plcService; + } + + @Override + public void run() { + String body = in.toString(Charset.forName("UTF-8")); + tcpLogger.info(body); + if (body.startsWith("<")){ + // 去掉首尾标识符 + body = body.substring(1, body.length()); + KsecInfo ksecInfo = JSONObject.parseObject(body, KsecInfo.class); + if (Cmd.A.name().equals(ksecInfo.getType())) { + in.release(); + return ; + } + KsecDataInfo dataInfo = ksecInfo.getData(); + String lotnum = dataInfo.getLotnum(); + PlcCmdInfo plcCmdInfo = null; + String srmNumber = null; + String cmdName = null; + if(dataInfo != null){ + //左右换过来 + if(dataInfo.getFromDirection() == 1){ + dataInfo.setFromDirection(2); }else { - //浅侧延迟 - Thread.sleep(plcService.getConfigProperties().getCameraConfig().getB2DelayTime()); + dataInfo.setFromDirection(1); } - plcService.gyrateCamera(plcCmdInfo,Cmd.C5.name()); - plcService.orderStop(plcCmdInfo); - } - } else if (Cmd.C.name().equals(ksecInfo.getType())) { - tcpLogger.info("info:{}",body); - //动作 - String code = dataInfo.getCmdName(); - log.info("action code,{},orderInfo:{}", code, plcCmdInfo.toString()); - if (Cmd.isBaseAction(code)) { - //执行动作,需要保存执行到第几步了 - Integer times = GoodsActionTimes.put(plcCmdInfo.getOrderNum()); - plcCmdInfo.setTimes(times); - code = code + "-" + plcCmdInfo.getLeftRightStr(times) + plcCmdInfo.getInOutStr(times); - //执行动作 - plcService.action(plcCmdInfo, times, code); - }else { - log.info("other C code :{}",code); + if(dataInfo.getToDirection() != null && dataInfo.getToDirection() == 1){ + dataInfo.setToDirection(2); + }else { + dataInfo.setToDirection(1); + } + plcCmdInfo = new PlcCmdInfo(dataInfo.getSRMNumber(), dataInfo.getTaskId(), dataInfo.getFromSide(), dataInfo.getFromDirection(), dataInfo.getFromColumn(), dataInfo.getFromRow(), dataInfo.getFromSeparation(),dataInfo.getToSide(), dataInfo.getToDirection(), dataInfo.getToColumn(), dataInfo.getToRow(),dataInfo.getToSeparation(),lotnum); + + srmNumber = dataInfo.getSRMNumber(); + cmdName = dataInfo.getCmdName(); } - } else if (Cmd.D.name().equals(ksecInfo.getType())) { - tcpLogger.info("info:{}",body); - //柳州去掉告警 + if (Cmd.A.name().equals(ksecInfo.getType())) { + //心跳 + log.debug("receieve heart "); + } else if (Cmd.B.name().equals(ksecInfo.getType())) { + + //任务 + if (Cmd.B1.name().equals(cmdName)) { + //昆船盘点模式下也会发B1 ,但是不会发送B2 + //这里判断下,是否存在盘点批次号 若存在,既是盘点的B1,无需处理;若不存在lotnum,则是随行的B1 + if(StringUtils.isEmpty(dataInfo.getLotnum())){ + //任务开始 旋转到原点位 + plcService.gyrateCamera(plcCmdInfo,Cmd.C5.name()); + plcService.orderStart(plcCmdInfo); + }else { + log.info("check move"); + } + + } else if (Cmd.B2.name().equals(cmdName)) { + //B2 C4 一起发的,需要停止等B2 + + //这里判断是不是双伸 + if(plcCmdInfo.getSeparation2() == 2){ + //深测货架延迟 + try { + Thread.sleep(plcService.getConfigProperties().getCameraConfig().getB2OutDelayTime()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }else { + //浅侧延迟 + try { + Thread.sleep(plcService.getConfigProperties().getCameraConfig().getB2DelayTime()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + plcService.gyrateCamera(plcCmdInfo,Cmd.C5.name()); + plcService.orderStop(plcCmdInfo); + } + } else if (Cmd.C.name().equals(ksecInfo.getType())) { + + //动作 + String code = dataInfo.getCmdName(); + log.info("action code,{},orderInfo:{}", code, plcCmdInfo.toString()); + if (Cmd.isBaseAction(code)) { + //执行动作,需要保存执行到第几步了 + Integer times = GoodsActionTimes.put(plcCmdInfo.getOrderNum()); + plcCmdInfo.setTimes(times); + code = code + "-" + plcCmdInfo.getLeftRightStr(times) + plcCmdInfo.getInOutStr(times); + //执行动作 + try { + plcService.action(plcCmdInfo, times, code); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }else { + log.info("other C code :{}",code); + } + } else if (Cmd.D.name().equals(ksecInfo.getType())) { + + //柳州去掉告警 // String code = dataInfo.getCmdName(); // if(code.equals(Cmd.D1.name())){ // log.info("plcId:{},warn start",plcCmdInfo.getPlcId()); @@ -140,44 +179,31 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { // }else { // log.info("other D code :{}",code); // } - } else if (Cmd.E.name().equals(ksecInfo.getType())) { - tcpLogger.info("info:{}",body); - //盘点 - //转球机到盘点位 然后拍照 - - if(!StringUtils.isEmpty(lotnum) && !lotnum.equals(lastLotnum)){ - //需要把stock表truncate - FileUtil.save(lotnum,"lastLotnum"); - tcpLogger.info("truncate table ,last lotnum:{},new lotnum:{}",lastLotnum,lotnum); - plcService.truncateStock(); - lastLotnum = lotnum; - } - plcCmdInfo.setTimes(1); - Boolean ok = plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode(), dataInfo.getTrayCode()); - if(ok){ - ksecInfo.getData().setAckStatus(1); - }else { - ksecInfo.getData().setAckStatus(0); + } else if (Cmd.E.name().equals(ksecInfo.getType())) { + + //盘点 + //转球机到盘点位 然后拍照 + + if(!StringUtils.isEmpty(lotnum) && !lotnum.equals(lastLotnum)){ + //需要把stock表truncate + FileUtil.save(lotnum,"lastLotnum"); + tcpLogger.info("truncate table ,last lotnum:{},new lotnum:{}",lastLotnum,lotnum); + plcService.truncateStock(); + lastLotnum = lotnum; + } + plcCmdInfo.setTimes(1); + Boolean ok = plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode(), dataInfo.getTrayCode()); + if(ok){ + ksecInfo.getData().setAckStatus(1); + }else { + ksecInfo.getData().setAckStatus(0); + } + ctx.channel().writeAndFlush(ksecInfo); } - ctx.channel().writeAndFlush(ksecInfo); - } //找到该货位的最后一张照片与现在的照片比照 //plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0); - } - in.release(); - return null; - } - - public class StopThread extends Thread { - - private PlcCmdInfo plcCmdInfo; - - public StopThread(PlcCmdInfo plcCmdInfo){ - this.plcCmdInfo = plcCmdInfo; - } - @Override - public void run() { - plcService.orderStop(plcCmdInfo); + } + in.release(); } } } 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 4712b26..9f4bb1e 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 @@ -32,7 +32,7 @@ public class SickSocket { writeCmd(os); is = socket.getInputStream(); code = read(is); - tcpLogger.info(code); + tcpLogger.info("ip:{},code:{}",ip,code); if(code!= null){ code = code.replace("\\n",""); } diff --git a/web/src/main/resources/application-prod.yml b/web/src/main/resources/application-prod.yml index 874fd2c..55a6e5e 100644 --- a/web/src/main/resources/application-prod.yml +++ b/web/src/main/resources/application-prod.yml @@ -14,7 +14,7 @@ spring: testWhileIdle: false timeBetweenEvictionRunsMillis: 60000 type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://172.16.0.70:3306/lia_duoji?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 + url: jdbc:mysql://172.16.0.64:3306/lia_duoji?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 username: root validationQuery: SELECT 1 FROM DUAL # --------本服务端口号