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 a5e34c9..2c919dd 100644 --- a/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java +++ b/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java @@ -51,6 +51,17 @@ public class ConfigProperties { private Long delayCaptureTime; + private Long runningDelayCaptureTime; + + private Long C1DelayCaptureTime; + private Long C2DelayCaptureTime; + private Long C2OutDelayCaptureTime; + private Long C3DelayCaptureTime; + private Long C4DelayCaptureTime; + private Long C4OutDelayCaptureTime; + private Long B2DelayTime; + private Long B2OutDelayTime; + private Long delayDownloadMp4; } diff --git a/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java b/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java index a00f692..766b3f2 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java @@ -323,7 +323,8 @@ public class CameraControlController { @ApiOperation(value = "录像") public Result MP4(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.downloadMp4(id,"D:\\work\\"+LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+".mp4", LocalDateTime.now().minusMinutes(10),LocalDateTime.now().minusMinutes(8)); + LocalDateTime localDateTime = LocalDateTime.of(2022,7,21,8,20); + cameraControlModule.downloadMp4(id,"E:\\work\\"+localDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+".mp4", localDateTime,localDateTime.plusMinutes(3)); return Result.success(); } diff --git a/web/src/main/java/com/zhehekeji/web/controller/CameraController.java b/web/src/main/java/com/zhehekeji/web/controller/CameraController.java index e278e32..340f29a 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/CameraController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/CameraController.java @@ -3,12 +3,16 @@ package com.zhehekeji.web.controller; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.core.JsonParser; import com.github.pagehelper.PageInfo; +import com.sun.jna.ptr.IntByReference; import com.zhehekeji.common.util.ValidatorUtil; import com.zhehekeji.core.pojo.Result; import com.zhehekeji.web.entity.Camera; import com.zhehekeji.web.entity.CameraIO; import com.zhehekeji.web.entity.CameraIOConfig; +import com.zhehekeji.web.lib.CameraConnMap; import com.zhehekeji.web.lib.CameraControlModule; +import com.zhehekeji.web.lib.joyware.JoywareLoginModuleImpl; +import com.zhehekeji.web.lib.joyware.NetSDKLib; import com.zhehekeji.web.pojo.camera.CameraConfigSearchReq; import com.zhehekeji.web.pojo.camera.CameraIOPtz; import com.zhehekeji.web.pojo.street.StreetSearch; @@ -133,6 +137,25 @@ public class CameraController { return Result.success(); } + @PostMapping("/{cameraId}/io/xy") + @ApiOperation(value = "获取球机的当前位置坐标") + public Result xy(@PathVariable Integer cameraId) { + NetSDKLib.NET_PTZ_LOCATION_INFO ptzLocationInfo = new NetSDKLib.NET_PTZ_LOCATION_INFO(); + IntByReference intRetLen = new IntByReference(); + int nType = NetSDKLib.NET_DEVSTATE_PTZ_LOCATION; + ptzLocationInfo.write(); + + boolean bRet = JoywareLoginModuleImpl.netsdk.CLIENT_QueryDevState(CameraConnMap.getConnId(cameraId), nType, ptzLocationInfo.getPointer(), ptzLocationInfo.size(), intRetLen, 3000); + ptzLocationInfo.read(); + String s = "水平:%d,垂直:%d"; + if (bRet) { + String ss = String.format(s,ptzLocationInfo.nPTZPan,ptzLocationInfo.nPTZTilt); + log.info(ss); + return Result.success(ss); + } + return Result.success(s); + } + @GetMapping("/downloadConfig") @ApiOperation(value = "视频直播配置") public Result downloadConfig() throws IOException { 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..8644437 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/StockController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/StockController.java @@ -10,6 +10,7 @@ import com.zhehekeji.web.pojo.stock.*; import com.zhehekeji.web.service.StockService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.ClassPathResource; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -27,6 +28,7 @@ import java.util.Map; @Api(value = "Stock", tags = "库存管理") @RestController @RequestMapping("/stock") +@Slf4j public class StockController { @Resource @@ -87,7 +89,7 @@ public class StockController { OutputStream os = response.getOutputStream(); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); - String fileName = URLEncoder.encode("盘点" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")), "UTF-8"); + String fileName = URLEncoder.encode("盘点" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")), "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); List excels = stockService.exportExcels(streetId); EasyExcel.write(os, StockExportExcel.class).sheet().doWrite(excels); @@ -99,7 +101,7 @@ public class StockController { OutputStream os = response.getOutputStream(); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); - String fileName = URLEncoder.encode("全部巷道盘点结果" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")), "UTF-8"); + String fileName = URLEncoder.encode("全部巷道盘点结果" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")), "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); List excels = stockService.exportAllExcels(); EasyExcel.write(os, StockExportExcel.class).sheet().doWrite(excels); @@ -115,8 +117,13 @@ public class StockController { @ApiOperation(value = "获取盘点信息") @RequestMapping(value = "/checkInfo", method = RequestMethod.POST) public Result checkInfo(@RequestBody StockCheckSearch stockCheck) { + int a = Integer.valueOf(stockCheck.getSRMNumber()); + String ss = String.format("%03d", a); + stockCheck.setSRMNumber(ss); validatorUtil.validate(stockCheck); - Stock stock = new Stock(); + log.info("stockCheck:{}",stockCheck); + Stock stock = stockService.stock(stockCheck); + log.info("stockCheck:res:{}",stock); return Result.success(stock); } @@ -134,4 +141,14 @@ public class StockController { return Result.success(stockService.checkByMan(checkByMan)); } + public static void main(String[] args) { + String s = "4"; + String ss = String.format("%03d", 4); + System.out.println(ss); + + String bb = "10"; + String bbb = String.format("%03d", 10); + System.out.println(bbb); + } + } diff --git a/web/src/main/java/com/zhehekeji/web/controller/StreetController.java b/web/src/main/java/com/zhehekeji/web/controller/StreetController.java index 54df49c..aa1e52b 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/StreetController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/StreetController.java @@ -77,6 +77,7 @@ public class StreetController { } + @GetMapping("/lightSource/open") @ApiOperation(value = "开启光源") public Result openLightSource(){ @@ -124,6 +125,46 @@ public class StreetController { return Result.success(); } + @GetMapping("/lightSource/open/{streetId}") + @ApiOperation(value = "开启单个巷道光源") + public Result openStreetLightSource(@PathVariable Integer streetId){ + List lightSources = lightSourceService.getLightSourceByStreetId(streetId); + lightSources.forEach(lightSource -> { + if(configProperties.getLightSource().getType() == 1){ + JYDAMEquip equip = JYDamHelper.Connect(lightSource.getIp(),lightSource.getPort()); + JYDamHelper.openDO(equip,configProperties.getLightSource().getIndex()); + Integer status = JYDamHelper.ReadStatus(equip,configProperties.getLightSource().getNum(),configProperties.getLightSource().getIndex()); + log.info("ip:{},status:{}",lightSource.getIp(),status); + equip.DisConnect(); + }else if(configProperties.getLightSource().getType() == 2){ + HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),1); + } + + }); + + return Result.success(); + } + + @GetMapping("/lightSource/close/{streetId}") + @ApiOperation(value = "关闭单个巷道光源") + public Result closeStreetLightSource(@PathVariable Integer streetId){ + List lightSources = lightSourceService.getLightSourceByStreetId(streetId); + lightSources.forEach(lightSource -> { + if(configProperties.getLightSource().getType() == 1){ + JYDAMEquip equip = JYDamHelper.Connect(lightSource.getIp(),lightSource.getPort()); + JYDamHelper.closeDO(equip,configProperties.getLightSource().getIndex()); + Integer status = JYDamHelper.ReadStatus(equip,configProperties.getLightSource().getNum(),configProperties.getLightSource().getIndex()); + log.info("ip:{},status:{}",lightSource.getIp(),status); + equip.DisConnect(); + }else if(configProperties.getLightSource().getType() == 2){ + HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),0); + } + + }); + + return Result.success(); + } + diff --git a/web/src/main/java/com/zhehekeji/web/entity/Camera.java b/web/src/main/java/com/zhehekeji/web/entity/Camera.java index c4b8bc5..e599dfc 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Camera.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Camera.java @@ -35,6 +35,7 @@ public class Camera { private String status; private Integer rtcServerPort; + @ApiModelProperty(value = "预置点 增长值",hidden = true) private Integer ptzId; 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..76c36c9 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); @@ -276,10 +292,10 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { NetSDKLib.LLong l = JoywareLoginModuleImpl.netsdk.CLIENT_DownloadByDataType(CameraConnMap.getConnId(cameraId), download_by_data_type.getPointer(), net_out_download_by_data_type.getPointer(), 8000); if(l.longValue() != 0){ - log.info("start download mp4 path:{},startTime:{} ,endTime:{},now:{},status:{}", path, start, end, LocalDateTime.now(),l.longValue()); + log.info("start download mp4 path:{},startTime:{} ,endTime:{},now:{},status:{},cameraId:{}", path, start, end, LocalDateTime.now(),l.longValue(),cameraId); }else { - log.error("download mp4 error:{},startTime:{} ,endTime:{}",ToolKits.getErrorCodePrint(),start,end); + log.error("download mp4 error:{},startTime:{} ,endTime:{},cameraId:{}",ToolKits.getErrorCodePrint(),start,end,cameraId); } } @@ -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/pojo/stock/StockExportExcel.java b/web/src/main/java/com/zhehekeji/web/pojo/stock/StockExportExcel.java index bd6fbe9..9f866e6 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/stock/StockExportExcel.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/stock/StockExportExcel.java @@ -11,12 +11,15 @@ public class StockExportExcel { @ExcelProperty(index = 0, value = "巷道名称") private String streetName; - @ExcelProperty(index = 6, value = "盘点批次号") + @ExcelProperty(index = 7, value = "盘点批次号") private String lotnum; @ExcelProperty(index = 4, value = "条码") private String code; + @ExcelProperty(index = 5, value = "WMS条码") + private String wmsCode; + @ExcelProperty(index = 1, value = "货架号") private String shelveId; @@ -29,10 +32,10 @@ public class StockExportExcel { @ExcelProperty(index = 3, value = "列") private Integer column; - @ExcelProperty(index = 5, value = "盘点结果", converter = StockStatusConvert.class) + @ExcelProperty(index = 6, value = "盘点结果", converter = StockStatusConvert.class) private Integer status; - @ExcelProperty(index = 7, value = "时间", converter = LocalDateTimeConvert.class) + @ExcelProperty(index = 8, value = "时间", converter = LocalDateTimeConvert.class) private LocalDateTime exportTime; } 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 3241ac8..982e811 100644 --- a/web/src/main/java/com/zhehekeji/web/service/CameraService.java +++ b/web/src/main/java/com/zhehekeji/web/service/CameraService.java @@ -317,7 +317,6 @@ public class CameraService { } public void cameraLogin(Camera camera){ - NetSDKLib.LLong lLong = cameraControlLoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword()); if(lLong != null){ log.info("camera login success,cameraId:{},ip:{}",camera.getId(),camera.getIp()); 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 e96f7f7..200cf10 100644 --- a/web/src/main/java/com/zhehekeji/web/service/CronTab.java +++ b/web/src/main/java/com/zhehekeji/web/service/CronTab.java @@ -1,7 +1,15 @@ package com.zhehekeji.web.service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zhehekeji.web.config.ConfigProperties; +import com.zhehekeji.web.entity.LightSource; +import com.zhehekeji.web.mapper.LightSourceMapper; +import com.zhehekeji.web.service.damLightSource.JYDAMEquip; +import com.zhehekeji.web.service.damLightSource.JYDamHelper; +import com.zhehekeji.web.service.hikLightSource.HikControlSocket; +import io.swagger.models.auth.In; import lombok.extern.slf4j.Slf4j; +import net.sf.cglib.core.Local; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -9,10 +17,18 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.io.File; import java.io.IOException; +import java.math.BigInteger; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; import java.time.*; +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 @@ -21,20 +37,66 @@ public class CronTab { @Resource private ConfigProperties configProperties; + @Resource + private LightSourceMapper lightSourceMapper; private static LocalDateTime now; + private static Map lightTimeMap = new HashMap<>(); + + //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()); } + public static void putTime(Integer streetId){ + lightTimeMap.put(streetId,System.currentTimeMillis()); + } + + @Scheduled(cron = "0 0/1 * * * ?") + public void lightStatus() { + log.debug(" lightStatus"); + long timeStamp = System.currentTimeMillis(); + + Iterator> it = lightTimeMap.entrySet().iterator(); + while (it.hasNext()){ + Map.Entry entry = it.next(); + if((BigInteger.valueOf(timeStamp).subtract(BigInteger.valueOf(entry.getValue()))).compareTo(timeDIff) > 0){ + List lightSources = lightSourceMapper.selectList(new QueryWrapper().eq("street_id",entry.getKey())); + lightSources.forEach(lightSource -> { + if(configProperties.getLightSource().getType() == 1){ + + JYDAMEquip equip = JYDamHelper.Connect(lightSource.getIp(),lightSource.getPort()); + JYDamHelper.closeDO(equip,configProperties.getLightSource().getIndex()); + Integer status = JYDamHelper.ReadStatus(equip,configProperties.getLightSource().getNum(),configProperties.getLightSource().getIndex()); + log.info("ip:{},status:{}",lightSource.getIp(),status); + equip.DisConnect(); + }else if(configProperties.getLightSource().getType() == 2){ + HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),0); + } + }); + it.remove(); + } + } + } + + public static void checkFileTime(File dir,int days) { if(!dir.exists()){ return; diff --git a/web/src/main/java/com/zhehekeji/web/service/LightSourceService.java b/web/src/main/java/com/zhehekeji/web/service/LightSourceService.java index 10fcaa8..3f60d19 100644 --- a/web/src/main/java/com/zhehekeji/web/service/LightSourceService.java +++ b/web/src/main/java/com/zhehekeji/web/service/LightSourceService.java @@ -1,5 +1,6 @@ package com.zhehekeji.web.service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zhehekeji.web.entity.LightSource; import com.zhehekeji.web.mapper.LightSourceMapper; import org.springframework.beans.factory.annotation.Autowired; @@ -17,4 +18,8 @@ public class LightSourceService { public List getLightSource(){ return lightSourceMapper.selectByMap(new HashMap<>()); } + + public List getLightSourceByStreetId(Integer streetId){ + return lightSourceMapper.selectList(new QueryWrapper().eq("street_id",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 f20df27..eb19a43 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -1,5 +1,6 @@ package com.zhehekeji.web.service; +import codeDetector.BarcodeDetector; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zhehekeji.common.util.PathUtil; import com.zhehekeji.web.config.ConfigProperties; @@ -8,6 +9,7 @@ import com.zhehekeji.web.lib.*; import com.zhehekeji.web.mapper.*; import com.zhehekeji.web.pojo.OrderVO; import com.zhehekeji.web.service.RFID.RFIDSocket; +import com.zhehekeji.web.service.hikLightSource.HikControlSocket; import com.zhehekeji.web.service.ksec.KsecNettyClient; import com.zhehekeji.web.service.sick.SickSocket; import lombok.extern.slf4j.Slf4j; @@ -151,13 +153,18 @@ public class PlcService { update.setLeftRight2(plcCmdInfo.getLeftRight2()); update.setColumn2(plcCmdInfo.getColumn2()); update.setRow2(plcCmdInfo.getRow2()); + LocalDateTime endDownLoadTime = endTime.plusSeconds(5); + Duration duration = Duration.between(order.getStartTime(),endDownLoadTime); + if(duration.toMinutes() > 50){ + endDownLoadTime = order.getStartTime().plusMinutes(50); + } if (street.getCamera1Id() != null) { - String path = cameraVideo(street.getCamera1Id(),order.getStartTime(),endTime.plusSeconds(5)); + String path = cameraVideo(street.getCamera1Id(),order.getStartTime(),endDownLoadTime); update.setVideoPath1(path); } if (street.getCamera2Id() != null) { - String path = cameraVideo(street.getCamera2Id(),order.getStartTime(),endTime.plusSeconds(5)); + String path = cameraVideo(street.getCamera2Id(),order.getStartTime(),endDownLoadTime); update.setVideoPath2(path); } orderMapper.updateById(update); @@ -201,7 +208,7 @@ public class PlcService { * @param plcCmdInfo * @param times */ - public void action(PlcCmdInfo plcCmdInfo, Integer times, String code) { + public void action(PlcCmdInfo plcCmdInfo, Integer times, String code) throws InterruptedException { Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); if (street == null) { log.error("street not found ,plcId :{}", plcCmdInfo.getPlcId()); @@ -209,9 +216,7 @@ public class PlcService { } OrderInfo orderInfo = new OrderInfo(street, plcCmdInfo, times, code); String path = null; - /** - * 拍照是C2 C4拍照(取货完成、放货完成) - */ + Boolean needCapture = doNeedCaptureByCode(orderInfo.getCmdCode()); /*** * 判断该巷道有几个相机 @@ -223,22 +228,43 @@ public class PlcService { Integer cameraId = getCameraByPlcCmd(plcCmdInfo,orderInfo.getLeftRight()); gyrateCameraByCode(cameraId,orderInfo.getCmdCode()); if(needCapture){ - Boolean delay = false; - if(code.startsWith("C1") || code.startsWith("C3")){ - delay = true; - } + Boolean delay = true; Integer row = 0; Integer column = 0; + Integer sep = 0; if(times<=2){ row = plcCmdInfo.getRow1(); column = plcCmdInfo.getColumn1(); + sep = plcCmdInfo.getSeparation1(); }else { row = plcCmdInfo.getRow2(); column = plcCmdInfo.getColumn2(); + sep = plcCmdInfo.getSeparation2(); } - path = PathUtil.createFileNameByRowColumn("jpg",cameraId,row,column); + long delayTime = 0; + + if(code.startsWith("C1")){ - path = cameraCapture(cameraId,delay,configProperties.getCameraConfig().getDelayCaptureTime(),path); + delayTime = configProperties.getCameraConfig().getC1DelayCaptureTime(); + }else if(code.startsWith("C2")){ + if(sep == 1){ + delayTime = configProperties.getCameraConfig().getC2DelayCaptureTime(); + }else { + delayTime = configProperties.getCameraConfig().getC2OutDelayCaptureTime(); + } + + }else if(code.startsWith("C3")){ + delayTime = configProperties.getCameraConfig().getC3DelayCaptureTime(); + + }else if(code.startsWith("C4")){ + if(sep == 1){ + delayTime = configProperties.getCameraConfig().getC4DelayCaptureTime(); + }else { + delayTime = configProperties.getCameraConfig().getC4OutDelayCaptureTime(); + } + } + path = PathUtil.createFileNameByRowColumn("jpg",cameraId,row,column); + path = cameraCapture(cameraId,delay,delayTime,path); } //update order info after capture if (path != null && needCapture) { @@ -248,10 +274,10 @@ public class PlcService { if(times == 2){ if(street.getCamera2Id() != null){ - gyrateCameraByCodeTimeLater(street.getCamera2Id(),"C5",configProperties.getCameraConfig().getDelayCaptureTime()+100); + gyrateCameraByCodeTimeLater(street.getCamera2Id(),"C5",configProperties.getCameraConfig().getC2OutDelayCaptureTime()+500); } if(street.getCamera1Id() != null){ - gyrateCameraByCodeTimeLater(street.getCamera1Id(),"C5",configProperties.getCameraConfig().getDelayCaptureTime()+100); + gyrateCameraByCodeTimeLater(street.getCamera1Id(),"C5",configProperties.getCameraConfig().getC2OutDelayCaptureTime()+500); } } } @@ -554,17 +580,35 @@ public class PlcService { } + @Resource + private LightSourceMapper lightSourceMapper; + public Boolean check(PlcCmdInfo plcCmdInfo,String cmdCode,String wmsCode,String wmsTrayCode){ long startTime = System.currentTimeMillis(); Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); + CronTab.putTime(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); + }); Integer cameraId = getCameraByPlcCmd(plcCmdInfo,plcCmdInfo.getLeftRight1()); - gyrateCameraByCode(cameraId, cmdCode); - try { - Thread.sleep(configProperties.getCameraConfig().getDelayCaptureTime()); - } catch (InterruptedException e) { - e.printStackTrace(); + + if(plcCmdInfo.getSeparation1() == 1 && configProperties.getScanCodeMode().getTray() == 2){ + //内测 + String c = cmdCode + "-" + plcCmdInfo.getLeftRightStr(1) + "-IN"; + log.info("camera ptz"+c); + gyrateCameraByCode(cameraId, c); + }else { + gyrateCameraByCode(cameraId, cmdCode); + try { + Thread.sleep(configProperties.getCameraConfig().getDelayCaptureTime()); + } catch (InterruptedException e) { + e.printStackTrace(); + } } + + String path = PathUtil.createFileNameByRowColumn("jpg",cameraId,plcCmdInfo.getRow1(),plcCmdInfo.getColumn1()); cameraCapture(cameraId,false,null,path); //托盘码 @@ -572,10 +616,10 @@ public class PlcService { Boolean trayCheck = Boolean.TRUE; //如果是用扫码枪 扫 托盘码,就直接扫 //if(configProperties.getScanCodeMode().getTray() == 2){ - + SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(),plcCmdInfo.getLeftRight1()); if(plcCmdInfo.getSeparation1() == 1 && configProperties.getScanCodeMode().getTray() == 2){ //托盘使用sick扫码枪 - SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(),plcCmdInfo.getLeftRight1()); + if(sensorGun == null){ trayCode = "识别异常"; trayCheck = Boolean.FALSE; @@ -610,17 +654,92 @@ public class PlcService { //RFID RFID rfid = rfidService.getRFIDByPlc(street.getId()); } - StockCheckRunnable stockCheckRunnable = new StockCheckRunnable(street,plcCmdInfo,cmdCode,stockMapper,path,checkLogMapper,configProperties.getScanCodeMode().getGoods(),wmsCode,wmsTrayCode,trayCode,trayCheck,configProperties); - threadPoolExecutor.execute(stockCheckRunnable); + OrderInfo orderInfo = new OrderInfo(street,plcCmdInfo,1,cmdCode); + Stock stock = stockMapper.getByShelveIdAndRowColumn(orderInfo.getShelveId(),orderInfo.getRow(),orderInfo.getColumn()); + String scanCode = null; + Boolean codeCheck = Boolean.TRUE; + Boolean trayCodeCheck = Boolean.TRUE; + //货物使用球机扫码 + + if(configProperties.getScanCodeMode().getTray() == 2 && plcCmdInfo.getSeparation1() == 2){ + //托盘使用球机扫码 + if("".equals(wmsTrayCode)){ + //空货物的处理 + //如果系统货物为空,则只要扫码识别未出结果,就认为无货物 + trayCode = BarcodeDetector.detectBestCodeUntilOK(configProperties.getSavePath().getMediaPath()+path,configProperties.getScanCodeMode().getTrayCodeTypes()); + log.info("tray code:{},sys trayCode:{}",trayCode,wmsTrayCode); + if(StringUtils.isEmpty(trayCode)|| trayCode.equals("Unrecognized")){ + trayCheck = Boolean.TRUE; + trayCode = ""; + }else { + trayCheck = wmsTrayCode.equals(trayCode); + } + }else { + trayCode = BarcodeDetector.detectBestCodeUntilOK(configProperties.getSavePath().getMediaPath()+path,configProperties.getScanCodeMode().getTrayCodeTypes()); + if(StringUtils.isEmpty(trayCode)){ + log.error("row:{},cloumn:{}",plcCmdInfo.getRow1(),plcCmdInfo.getColumn1()); + log.error("detectBestBarCode:{}",trayCode); + trayCode = "识别异常"; + trayCheck = Boolean.FALSE; + }else { + trayCheck = wmsTrayCode.equals(trayCode); + } + } + + } + log.info("code:{}",scanCode); + //核对异常 + Integer status = 1; + //托盘和货物都正确 + if(trayCheck && codeCheck){ + status = 2; + } + if(stock == null){ + stock = new Stock(null,null,plcCmdInfo.getOrderNum(),plcCmdInfo.getLotnum(),scanCode, null,null,wmsCode,null,null,wmsTrayCode,trayCode,orderInfo.getShelveId(),orderInfo.getRow(),orderInfo.getColumn(),status,null,null,path, LocalDateTime.now()); + stockMapper.insert(stock); + }else { + stock.setStatus(status); + stock.setLotnum(plcCmdInfo.getLotnum()); + stock.setExportTime(LocalDateTime.now()); + stock.setCheckPic(path); + stock.setCheckNum(plcCmdInfo.getOrderNum()); + stock.setTrayCode(trayCode); + stock.setWmsTrayCode(wmsTrayCode); + stock.setCode(scanCode); + stock.setWmsCode(wmsCode); + stockMapper.updateById(stock); + } + checkLog(stock); +// StockCheckRunnable stockCheckRunnable = new StockCheckRunnable(street,plcCmdInfo,cmdCode,stockMapper,path,checkLogMapper,configProperties.getScanCodeMode().getGoods(),wmsCode,wmsTrayCode,trayCode,trayCheck,configProperties,sensorGun); +// threadPoolExecutor.execute(stockCheckRunnable); long end = System.currentTimeMillis(); long s = end - startTime; log.info("time:{}millisecond",s); return true; } - + public void checkLog(Stock stock){ + CheckLog checkLog = new CheckLog(); + checkLog.setCheckNum(stock.getCheckNum()); + checkLog.setPic(stock.getCheckPic()); + checkLog.setShelveId(stock.getShelveId()); + checkLog.setCode(stock.getCode()); + checkLog.setWmsCode(stock.getWmsCode()); + checkLog.setStatus(stock.getStatus()); + checkLog.setRow(stock.getRow()); + checkLog.setColumn(stock.getColumn()); + checkLog.setCreateTime(LocalDateTime.now()); + checkLog.setTrayCode(stock.getTrayCode()); + checkLog.setWmsTrayCode(stock.getWmsTrayCode()); + checkLog.setLotnum(stock.getLotnum()); + checkLogMapper.insert(checkLog); + } public void truncateStock(){ stockMapper.truncate(); } + public ConfigProperties getConfigProperties(){ + return configProperties; + } + } diff --git a/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java b/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java index 31f551a..80eee13 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java +++ b/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java @@ -3,11 +3,13 @@ package com.zhehekeji.web.service; import codeDetector.BarcodeDetector; import com.zhehekeji.web.config.ConfigProperties; import com.zhehekeji.web.entity.CheckLog; +import com.zhehekeji.web.entity.SensorGun; import com.zhehekeji.web.entity.Stock; import com.zhehekeji.web.entity.Street; import com.zhehekeji.web.lib.OrderInfo; import com.zhehekeji.web.mapper.CheckLogMapper; import com.zhehekeji.web.mapper.StockMapper; +import com.zhehekeji.web.service.sick.SickSocket; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; @@ -33,8 +35,10 @@ public class StockCheckRunnable implements Runnable { private ConfigProperties configProperties; + private SensorGun sensorGun; - public StockCheckRunnable(Street street, PlcCmdInfo plcCmdInfo, String cmdCode, StockMapper stockMapper,String path,CheckLogMapper checkLogMapper,Integer goodsActionTimes,String wmsCode,String wmsTrayCode,String trayCode,Boolean trayCheck,ConfigProperties configProperties){ + + public StockCheckRunnable(Street street, PlcCmdInfo plcCmdInfo, String cmdCode, StockMapper stockMapper, String path, CheckLogMapper checkLogMapper, Integer goodsActionTimes, String wmsCode, String wmsTrayCode, String trayCode, Boolean trayCheck, ConfigProperties configProperties, SensorGun sensorGun){ this.street = street; this.plcCmdInfo = plcCmdInfo; this.cmdCode = cmdCode; @@ -47,7 +51,7 @@ public class StockCheckRunnable implements Runnable { this.trayCode = trayCode; this.trayCheck = trayCheck; this.configProperties = configProperties; - + this.sensorGun = sensorGun; } @Override @@ -58,29 +62,7 @@ public class StockCheckRunnable implements Runnable { Boolean codeCheck = Boolean.TRUE; Boolean trayCodeCheck = Boolean.TRUE; //货物使用球机扫码 - /*if(configProperties.getScanCodeMode().getGoods() == 1){ - if("".equals(wmsCode)){ - //空货物的处理 - //如果系统货物为空,则只要扫码识别未出结果,就认为无货物 - scanCode = BarcodeDetector.detectBestCodeUntilOK(configProperties.getSavePath().getMediaPath()+path,configProperties.getScanCodeMode().getGoodsCodeTypes()); - if(StringUtils.isEmpty(scanCode)|| scanCode.equals("Unrecognized")){ - codeCheck = Boolean.TRUE; - scanCode = ""; - }else { - codeCheck = wmsCode.equals(scanCode); - } - }else { - scanCode = BarcodeDetector.detectBestCodeUntilOK(configProperties.getSavePath().getMediaPath()+path,configProperties.getScanCodeMode().getGoodsCodeTypes()); - if(StringUtils.isEmpty(scanCode)){ - log.error("row:{},cloumn:{}",plcCmdInfo.getRow1(),plcCmdInfo.getColumn1()); - log.error("detectBestBarCode:{}",scanCode); - scanCode = "识别异常"; - codeCheck = Boolean.FALSE; - }else { - codeCheck = wmsCode.equals(scanCode); - } - } - }*/ + if(configProperties.getScanCodeMode().getTray() == 2 && plcCmdInfo.getSeparation1() == 2){ //托盘使用球机扫码 if("".equals(wmsTrayCode)){ @@ -102,9 +84,10 @@ public class StockCheckRunnable implements Runnable { trayCode = "识别异常"; trayCheck = Boolean.FALSE; }else { - trayCheck = wmsCode.equals(trayCode); + trayCheck = wmsTrayCode.equals(trayCode); } } + } log.info("code:{}",scanCode); //核对异常 diff --git a/web/src/main/java/com/zhehekeji/web/service/StockService.java b/web/src/main/java/com/zhehekeji/web/service/StockService.java index 01575ac..2e3c2ed 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StockService.java +++ b/web/src/main/java/com/zhehekeji/web/service/StockService.java @@ -270,6 +270,7 @@ public class StockService { stockExportExcel.setCode(stock.getTrayCode()); stockExportExcel.setLotnum(stock.getLotnum()); stockExportExcel.setColumn(stock.getColumn()); + stockExportExcel.setWmsCode(stock.getWmsTrayCode()); //stockExportExcel.setCount(stock.getCount()); stockExportExcel.setRow(stock.getRow()); stockExportExcel.setStreetName(street.getName()); 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 8274697..261b117 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StreetService.java +++ b/web/src/main/java/com/zhehekeji/web/service/StreetService.java @@ -370,38 +370,45 @@ public class StreetService { */ public String getShevelId(String SRMNumber,Integer direction,Integer separation){ Street street = getStreetByPlcId(SRMNumber); + if(street == null){ + return null; + } return getShevelIdByStreet(street,direction,separation); } public String getShevelId(Integer streetId,Integer direction,Integer separation){ Street street = streetById(streetId); + if(street == null){ + return null; + } return getShevelIdByStreet(street,direction,separation); } public String getShevelIdByStreet(Street street,Integer direction,Integer separation){ - - //判断单双伸 type=1 单伸 2为双伸 + log.info("street:{},direction:{},sep:{}",street,direction,separation); + //todo 左右互换 + //判断单双伸 type=0 单伸 1为双伸 Integer type; - if(direction == 1){ + if(direction == 2){ type = street.getLeftType(); }else { type = street.getRightType(); } - if(type == 1){ + if(type == 0){ //单伸只需要判断左右 - if(direction == 1){ + if(direction == 2){ return street.getLeftShelveId(); }else { return street.getRightShelveId(); } }else { //双伸,还需要判断内外 - if(direction == 1){ + if(direction == 2){ if(separation == 1){ return street.getLeftInsideShelveId(); }else { - return street.getRightShelveId(); + return street.getLeftOutsideShelveId(); } }else { if(separation == 1){ diff --git a/web/src/main/java/com/zhehekeji/web/service/ksec/KescFilter.java b/web/src/main/java/com/zhehekeji/web/service/ksec/KescFilter.java index c6223eb..57a8aca 100644 --- a/web/src/main/java/com/zhehekeji/web/service/ksec/KescFilter.java +++ b/web/src/main/java/com/zhehekeji/web/service/ksec/KescFilter.java @@ -37,7 +37,7 @@ public class KescFilter extends ChannelInitializer { //4秒发一次心跳 ph.addLast(new IdleStateHandler(0, 4, 0, TimeUnit.SECONDS)); ByteBuf byteBuf = Unpooled.copiedBuffer(">".getBytes()); - ph.addLast(new KsecDecoder(1000,byteBuf,plcService)); + ph.addLast(new KsecDecoder(10000,byteBuf,plcService)); ph.addLast(new KescEncoder()); ph.addLast(new KescNettyHandler(ksecInfo,nettyClient)); } 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 8fd8c98..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) { @@ -41,116 +46,164 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception { in = (ByteBuf) super.decode(ctx, in); if(in == null){ - log.info("no data"); + 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); - KsecDataInfo dataInfo = ksecInfo.getData(); - String lotnum = dataInfo.getLotnum(); - PlcCmdInfo plcCmdInfo = null; - String srmNumber = null; - String cmdName = null; - if(dataInfo != null){ - 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(); - } - 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"); - } - - } else if (Cmd.B2.name().equals(cmdName)) { - 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); - } - } else if (Cmd.D.name().equals(ksecInfo.getType())) { - tcpLogger.info("info:{}",body); - String code = dataInfo.getCmdName(); - if(code.equals(Cmd.D1.name())){ - log.info("plcId:{},warn start",plcCmdInfo.getPlcId()); - //根据告警code转动camera - String warnCode = dataInfo.getWarnCode(); - if(!StringUtils.isEmpty(warnCode)){ - String warnCode0 = Cmd.D1.name()+"-"+warnCode.split(",")[0]; - plcService.warnAction(plcCmdInfo,warnCode0); - } - plcService.warnStart(plcCmdInfo.getPlcId(),dataInfo.getWarnCode()); - }else if(code.equals(Cmd.D2.name())){ - log.info("plcId:{},warn stop",plcCmdInfo.getPlcId()); - plcService.warnStop(plcCmdInfo.getPlcId()); - }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); - } - ctx.channel().writeAndFlush(ksecInfo); - } - //找到该货位的最后一张照片与现在的照片比照 - //plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0); - } - in.release(); + KescRunnable kescRunnable = new KescRunnable(in,ctx,plcService); + threadPoolExecutor.execute(kescRunnable); return null; } - public class StopThread extends Thread { + public static class KescRunnable implements Runnable{ + + private ByteBuf in; - private PlcCmdInfo plcCmdInfo; + private ChannelHandlerContext ctx; - public StopThread(PlcCmdInfo plcCmdInfo){ - this.plcCmdInfo = plcCmdInfo; + private PlcService plcService; + + public KescRunnable(ByteBuf body,ChannelHandlerContext ctx,PlcService plcService){ + this.in = body; + this.ctx = ctx; + this.plcService = plcService; } + @Override public void run() { - plcService.orderStop(plcCmdInfo); + 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 { + 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); + + 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())) { + + //任务 + 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()); +// //根据告警code转动camera +// String warnCode = dataInfo.getWarnCode(); +// if(!StringUtils.isEmpty(warnCode)){ +// String warnCode0 = Cmd.D1.name()+"-"+warnCode.split(",")[0]; +// plcService.warnAction(plcCmdInfo,warnCode0); +// } +// plcService.warnStart(plcCmdInfo.getPlcId(),dataInfo.getWarnCode()); +// }else if(code.equals(Cmd.D2.name())){ +// log.info("plcId:{},warn stop",plcCmdInfo.getPlcId()); +// plcService.warnStop(plcCmdInfo.getPlcId()); +// }else { +// log.info("other D code :{}",code); +// } + } 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); + } + //找到该货位的最后一张照片与现在的照片比照 + //plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0); + } + in.release(); } } } diff --git a/web/src/main/java/com/zhehekeji/web/service/robotic/ProtocolDecoder.java b/web/src/main/java/com/zhehekeji/web/service/robotic/ProtocolDecoder.java index 6906b22..46b416c 100644 --- a/web/src/main/java/com/zhehekeji/web/service/robotic/ProtocolDecoder.java +++ b/web/src/main/java/com/zhehekeji/web/service/robotic/ProtocolDecoder.java @@ -52,11 +52,16 @@ public class ProtocolDecoder extends FixedLengthFrameDecoder { //不是包头 丢 return null; } - CharSequence plc = in.readCharSequence(6, Charset.defaultCharset()); - String plcId = plc.toString(); + ByteBuf plc = in.readBytes(6); + String plcId = plc.toString(Charset.defaultCharset()); + //CharSequence plc = in.readBytes(6, Charset.defaultCharset()); + //String plcId = plc.toString(); + // OA=心跳 OB=工单 OC=任务 OD=告警 - CharSequence typeChar = in.readCharSequence(2, Charset.defaultCharset()); - String type = typeChar.toString(); +// CharSequence typeChar = in.readCharSequence(2, Charset.defaultCharset()); +// String type = typeChar.toString(); + ByteBuf typeChar = in.readBytes(2); + String type = typeChar.toString(Charset.defaultCharset()); int taskId = in.readInt(); short short1 = in.readShort(); short short2 = in.readShort(); 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..93d5cdb 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 @@ -23,19 +23,25 @@ public class SickSocket { public static String readOCR(String ip,int port){ Socket socket = new Socket(); - String code = null; + String code = "NoRead"; OutputStream os = null; InputStream is = null; try { socket.connect(new InetSocketAddress(ip,port),3000); os = socket.getOutputStream(); - writeCmd(os); is = socket.getInputStream(); - code = read(is); - tcpLogger.info(code); - if(code!= null){ - code = code.replace("\\n",""); + int i = 0; + while ("NoRead".equals(code) && i <= 4){ + writeCmd(os); + code = read(is); + tcpLogger.info("count:{},ip:{},code:{}",i,ip,code); + if(code!= null){ + code = code.replace("\\n",""); + } + i++; } + + } catch (IOException e) { tcpLogger.error("sick time out,ip:{},info:{}",ip,e); log.error("sick time out,ip:{},info:{}",ip,e); diff --git a/web/src/main/resources/application-prod.yml b/web/src/main/resources/application-prod.yml index c4683ce..2387d7d 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://127.0.0.1:3306/lia_duoji?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 + url: jdbc:mysql://192.168.77.91:3306/lia_duoji?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 username: root validationQuery: SELECT 1 FROM DUAL # --------本服务端口号 @@ -34,6 +34,21 @@ 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就可 # 单位毫秒