diff --git a/modules/common/src/main/java/com/zhehekeji/common/util/PathUtil.java b/modules/common/src/main/java/com/zhehekeji/common/util/PathUtil.java index ca089df..4b39f7e 100644 --- a/modules/common/src/main/java/com/zhehekeji/common/util/PathUtil.java +++ b/modules/common/src/main/java/com/zhehekeji/common/util/PathUtil.java @@ -13,8 +13,9 @@ import java.util.UUID; public class PathUtil { public static String createFileName(String fileType) { - String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd/HH")); - return time + "/" + UUID.randomUUID() + "."+fileType; + LocalDateTime now = LocalDateTime.now(); + String time = now.format(DateTimeFormatter.ofPattern("yyyy/MM/dd/HH")); + return time + "/" + now.format(DateTimeFormatter.ofPattern("mmss"))+UUID.randomUUID() + "."+fileType; } /** diff --git a/web/src/main/java/com/zhehekeji/web/config/CacheConfig.java b/web/src/main/java/com/zhehekeji/web/config/CacheConfig.java index a83bc4a..56203e8 100644 --- a/web/src/main/java/com/zhehekeji/web/config/CacheConfig.java +++ b/web/src/main/java/com/zhehekeji/web/config/CacheConfig.java @@ -2,13 +2,17 @@ package com.zhehekeji.web.config; import com.github.pagehelper.cache.GuavaCache; import com.google.common.cache.CacheBuilder; +import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.concurrent.ConcurrentMapCache; import org.springframework.cache.support.SimpleCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.concurrent.TimeUnit; @Configuration @@ -18,6 +22,10 @@ public class CacheConfig { @Bean public CacheManager localCacheManager() { SimpleCacheManager simpleCacheManager = new SimpleCacheManager(); + List caches = new ArrayList(); + caches.add(new ConcurrentMapCache("street")); + caches.add(new ConcurrentMapCache("ptz")); + simpleCacheManager.setCaches(caches); //把各个cache注册到cacheManager中,GuavaCache实现了org.springframework.cache.Cache接口 // CacheBuilder cacheBuilder = CacheBuilder.newBuilder(); // cacheBuilder. 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 1240122..bf36a71 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java @@ -10,10 +10,8 @@ import com.zhehekeji.web.mapper.CameraMapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; -import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.time.LocalDateTime; @@ -426,11 +424,12 @@ public class CameraControlController { @ApiOperation(value = "立即拍照") public Result pic(@PathVariable Integer id) { checkLogin(id); - OrderInfo orderInfo = new OrderInfo(0L,"SRM123","AAA",1,1,"C5",true); + String path = "D:\\work\\qqq.jpeg"; + OrderInfo orderInfo = new OrderInfo(0L,"SRM123","AAA",1,1,"C5",true,1); if(cameraType == 0){ - System.out.println(JoywarePtzControlModule.pic(id,0,orderInfo)); + System.out.println(JoywarePtzControlModule.pic(id,0,path)); }else if(cameraType == 1){ - System.out.println(HikPtzControlModule.pic(id,1,orderInfo,"D:\\work\\qqq.jpeg")); + System.out.println(HikPtzControlModule.pic(id,1,path)); } return Result.success(); @@ -440,7 +439,7 @@ public class CameraControlController { @ApiOperation(value = "录像") public Result MP4(@PathVariable Integer id) { checkLogin(id); - HikPtzControlModule.downloadMp4(id,"D:\\work\\qqq_1.mp4","", LocalDateTime.now().minusMinutes(10),LocalDateTime.now().minusMinutes(5)); + HikPtzControlModule.downloadMp4(id,"D:\\work\\qqq_1.mp4", LocalDateTime.now().minusMinutes(10),LocalDateTime.now().minusMinutes(5)); 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 7aaefd4..929a758 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/CameraController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/CameraController.java @@ -102,6 +102,13 @@ public class CameraController { return Result.success(cameraService.ptz(req.getCameraIOId(),req.getCameraId(),req.getName(),req.getType(),req.getCode())); } + @PostMapping("/io/ptz/getPtzIdByCodeAndCameraId") + @ApiOperation(value = "根据code和cameraId获取ptzId") + public Result getPtzIdByCodeAndCameraId(String code,Integer cameraId) { + + return Result.success(cameraService.getPtzIdByCodeAndCameraId(code,cameraId)); + } + @PostMapping("/io/toPtz") @ApiOperation(value = "转至球机IO配置点") public Result toPtz(@RequestBody CameraIOPtz req) { diff --git a/web/src/main/java/com/zhehekeji/web/controller/OrderController.java b/web/src/main/java/com/zhehekeji/web/controller/OrderController.java index 27d9290..2796db4 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/OrderController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/OrderController.java @@ -7,7 +7,7 @@ import com.zhehekeji.web.pojo.OrderSaveReq; import com.zhehekeji.web.pojo.OrderSearch; import com.zhehekeji.web.pojo.OrderVO; import com.zhehekeji.web.service.OrderService; -import com.zhehekeji.web.service.PlcOrderInfo; +import com.zhehekeji.web.service.PlcCmdInfo; import com.zhehekeji.web.service.PlcService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -49,16 +49,16 @@ public class OrderController { @ApiOperation("工单开始信号") @PostMapping("/start") - public Result orderStart(@ApiParam("工单号") @RequestBody PlcOrderInfo orderNum, @ApiParam("plc")@RequestParam String plcId){ - orderNum.setOrderNum(plcId+"_"+orderNum.getTaskId()); - plcService.orderStart(orderNum,plcId); + public Result orderStart(@ApiParam("工单号") @RequestBody PlcCmdInfo plcCmdInfo){ + return Result.success(); } @ApiOperation("工单结束信号") @GetMapping("/stop") public Result orderStop(@ApiParam("工单号") @RequestParam String orderNum,@ApiParam("plc")@RequestParam String plcId){ - plcService.orderStop(plcId,orderNum); + PlcCmdInfo plcCmdInfo = new PlcCmdInfo(); + plcService.orderStop(plcCmdInfo); return Result.success(); } diff --git a/web/src/main/java/com/zhehekeji/web/controller/PLCController.java b/web/src/main/java/com/zhehekeji/web/controller/PLCController.java index 733c056..8d8df43 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/PLCController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/PLCController.java @@ -60,7 +60,7 @@ public class PLCController { @GetMapping("/orderAction") @ApiOperation(value = "执行的工单情况") public Result orderAction(){ - return Result.success(OrderAction.get()); + return Result.success(GoodsActionTimes.get()); } } diff --git a/web/src/main/java/com/zhehekeji/web/entity/Warn.java b/web/src/main/java/com/zhehekeji/web/entity/Warn.java index ed86130..bd35223 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Warn.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Warn.java @@ -37,4 +37,7 @@ public class Warn { @TableField("`signal`") private String signal; + + //发生告警时打断的工单 + private Long orderId; } diff --git a/web/src/main/java/com/zhehekeji/web/lib/CaptureCmdSerial.java b/web/src/main/java/com/zhehekeji/web/lib/CaptureCmdSerial.java new file mode 100644 index 0000000..7a6c0a6 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/lib/CaptureCmdSerial.java @@ -0,0 +1,43 @@ +package com.zhehekeji.web.lib; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * the relation of the picture path and the int value + */ +public class CaptureCmdSerial { + + public static ConcurrentHashMap captureMap = new ConcurrentHashMap<>(Short.MAX_VALUE * 4); + + private static AtomicInteger serialIntId = new AtomicInteger(0); + + private static Integer nextSerial() { + return serialIntId.addAndGet(1); + } + + /** + * bind one int value to the picture path + * @param picPath + * @return + */ + public static Integer put(String picPath) { + Integer id = nextSerial(); + captureMap.put(id, picPath); + return id; + } + + /** + * get the picture path by a int value + * then delete the relation + * @param serialId + * @return + */ + public static String getOrderInfo(Integer serialId) { + String path = captureMap.get(serialId); + captureMap.remove(serialId); + return path; + } + + +} diff --git a/web/src/main/java/com/zhehekeji/web/lib/HikLoginModule.java b/web/src/main/java/com/zhehekeji/web/lib/HikLoginModule.java index d1f50bd..69a235e 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/HikLoginModule.java +++ b/web/src/main/java/com/zhehekeji/web/lib/HikLoginModule.java @@ -42,15 +42,7 @@ public class HikLoginModule { //设置登录超时时间和尝试次数,可选 int waitTime = 5000; //登录请求响应超时时间设置为5S int tryTimes = 3; //登录时尝试建立链接1次 - //netsdk.CLIENT_SetConnectTime(waitTime, tryTimes); - - hcNetsdk.NET_DVR_SetConnectTime(waitTime, tryTimes); - - - //CaptureReceiveCB captureReceiveCB = SpringContextUtil.getBean(CaptureReceiveCB.class); - //netsdk.CLIENT_SetSnapRevCallBack(captureReceiveCB, null); - return true; } diff --git a/web/src/main/java/com/zhehekeji/web/lib/HikPtzControlModule.java b/web/src/main/java/com/zhehekeji/web/lib/HikPtzControlModule.java index b8eeb49..d20659d 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/HikPtzControlModule.java +++ b/web/src/main/java/com/zhehekeji/web/lib/HikPtzControlModule.java @@ -16,9 +16,6 @@ import java.time.LocalDateTime; */ @Slf4j public class HikPtzControlModule { - - private static NET_IN_PTZ_STATUS_PROC.CallBack.Mp4ReceiveCB mp4ReceiveCB = new NET_IN_PTZ_STATUS_PROC.CallBack.Mp4ReceiveCB(); - /** * 向上 */ @@ -26,8 +23,6 @@ public class HikPtzControlModule { { int lUserId = HikLoginModule.CameraConnMap.getConnId(cameraId).intValue(); return HikLoginModule.hcNetsdk.NET_DVR_PTZControl_Other(lUserId, nChannelID, dwPTZCommand, 0); - //return LoginModule.hcNetsdk.NET_DVR_PTZControl(lUserId, dwPTZCommand, 0); - } public static boolean ptzControlUpEnd(Integer cameraId, int nChannelID, int dwPTZCommand, int dwStop) @@ -222,21 +217,19 @@ public class HikPtzControlModule { return HikLoginModule.hcNetsdk.NET_DVR_PTZControl_Other(lUserId, nChannelID, dwPTZCommand, 1); } - public static boolean pic(Integer cameraId, int nChannelID, OrderInfo orderInfo, String path) + public static boolean pic(Integer cameraId, int nChannelID, String path) { - Integer cmdSerial = OrderCmdSerial.nextSerial(); PathUtil.checkDirc(path); - OrderCmdSerial.put(cmdSerial, orderInfo); int lUserId = HikLoginModule.CameraConnMap.getConnId(cameraId).intValue(); short wPicSize = 3; short wPicQuality = 0; HCNetSDK.NET_DVR_JPEGPARA jpegpara = new HCNetSDK.NET_DVR_JPEGPARA(wPicSize, wPicQuality); - //jpegpara.write(); + boolean picResult = HikLoginModule.hcNetsdk.NET_DVR_CaptureJPEGPicture(lUserId, nChannelID, jpegpara, path); + if(picResult == false){ + int error = HikLoginModule.hcNetsdk.NET_DVR_GetLastError(); + log.error("pic error:{}",error); + } - boolean picResult = false; - picResult = HikLoginModule.hcNetsdk.NET_DVR_CaptureJPEGPicture(lUserId, nChannelID, jpegpara, path); - int error = HikLoginModule.hcNetsdk.NET_DVR_GetLastError(); - log.error("pic error:{}",error); return picResult; } @@ -251,10 +244,10 @@ public class HikPtzControlModule { // return LoginModule.hcNetsdk.NET_DVR_CaptureJPEGPicture(CameraConnMap.getConnId(cameraId), nChannelID, jpegpara, ); }*/ - public static void downloadMp4(Integer cameraId, String path, String orderNum, LocalDateTime start, LocalDateTime end) { + public static void downloadMp4(Integer cameraId, String path, LocalDateTime start, LocalDateTime end) { //视频结束时间加上5s end = end.minusMinutes(1); - start = end.minusSeconds(60); + //start = end.minusSeconds(60); PathUtil.checkDirc(path); //NetSDKLib.NET_TIME startTime = new NetSDKLib.NET_TIME(); //startTime.setTime(start.getYear(), start.getMonthValue(), start.getDayOfMonth(), start.getHour(), start.getMinute(), start.getSecond()); @@ -287,81 +280,10 @@ public class HikPtzControlModule { if(!ok){ log.error("download error:{}",HikLoginModule.hcNetsdk.NET_DVR_GetLastError()); } - - -// OrderRealtime.startDownload(result, orderNum); -// Thread downLoadThread = new Thread(new Runnable() { -// @Override -// public void run() { -// boolean downStatus = downLoadMp4Func(lUserID, result); -// if(downStatus) -// { -// OrderRealtime.overDownload(result); -// } -// } -// }); -// downLoadThread.start(); } } - private static boolean downLoadMp4Func(int lUserID ,int hPlayback) - { - System.out.println("开始下载"); - boolean downStatus = true; - if(!HikLoginModule.hcNetsdk.NET_DVR_PlayBackControl_V40(hPlayback, HCNetSDK.NET_DVR_PLAYSTART, null, 0, null, new IntByReference(0))) - { - int iErr = HikLoginModule.hcNetsdk.NET_DVR_GetLastError(); - downStatus = false; - //System.out.println("NET_DVR_PLAYSTART失败,错误号:" + iErr); - //LoginModule.hcNetsdk.NET_DVR_Logout(lUserID); - //LoginModule.hcNetsdk.NET_DVR_Cleanup(); - return downStatus; - } - int iDownPos = 0; - while(true) - { - IntByReference nPos = new IntByReference(0); - HikLoginModule.hcNetsdk.NET_DVR_PlayBackControl_V40(hPlayback, HCNetSDK.NET_DVR_PLAYGETPOS, null, 0, nPos.getPointer(), new IntByReference(0)); - - iDownPos = nPos.getValue(); - if(iDownPos < 0) - { - int iErr = HikLoginModule.hcNetsdk.NET_DVR_GetLastError(); - //System.out.println("NET_DVR_GetDownloadPos失败,错误号:" + iErr); - log.error("NET_DVR_GetDownloadPos失败,错误号:{}", iErr); - //LoginModule.hcNetsdk.NET_DVR_Logout(lUserID); - //LoginModule.hcNetsdk.NET_DVR_Cleanup(); - downStatus = false; - break; - } - if((iDownPos >= 0) && (iDownPos <100)) - { - System.out.println("正常下载中,进度:" + iDownPos); - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - continue; - } - if(iDownPos ==100) - { - //System.out.println("下载完成"); - log.info("下载完成"); - break; - } - if(iDownPos >100) - { - //System.out.println("下载异常,进度:" + iDownPos); - downStatus = false; - log.error("下载异常,进度:{}", iDownPos); - break; - } - } - return downStatus; - } /** * 设置预置点 * @@ -369,12 +291,6 @@ public class HikPtzControlModule { * @param name 预置点的名称 * @param cameraId 球机ID,来获取登录句柄 */ - /*public static void ptz(Integer ptzId, String name, Integer cameraId) { - int dwzCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_SET_CONTROL; - Boolean ok = LoginModule.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId), 0, dwzCommand, 0, ptzId, 0, 0, ToolKits.GetGBKStringToPointer(name)); - //Boolean ok = true; - Assert.isTrue(ok, "设置失败"); - }*/ public static void ptz(Integer ptzId, String name, Integer cameraId) { int dwzCommand = HCNetSDK.SET_PRESET; @@ -387,14 +303,6 @@ public class HikPtzControlModule { * @param ptzId * @param cameraId */ - /*public static void toPtz(Integer ptzId, Integer cameraId) { - int dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_MOVE_CONTROL; - Boolean ok = LoginModule.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId), 0, dwPTZCommand, 0, ptzId, 0, 0, null); - if (!ok) { - log.error("转至预置点 失败 cameraId:{},ptzId:{}", cameraId, ptzId); - } - }*/ - public static void toPtz(Integer ptzId, Integer cameraId) { int dwPTZCommand = HCNetSDK.GOTO_PRESET; diff --git a/web/src/main/java/com/zhehekeji/web/lib/JoywareLoginModule.java b/web/src/main/java/com/zhehekeji/web/lib/JoywareLoginModule.java index c39b40c..d5e49d7 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/JoywareLoginModule.java +++ b/web/src/main/java/com/zhehekeji/web/lib/JoywareLoginModule.java @@ -1,10 +1,7 @@ package com.zhehekeji.web.lib; import com.zhehekeji.common.util.SpringContextUtil; -import com.zhehekeji.web.lib.joyware.CaptureReceiveCB; -import com.zhehekeji.web.lib.joyware.NET_IN_PTZ_STATUS_PROC; -import com.zhehekeji.web.lib.joyware.NET_OUT_PTZ_STATUS_PROC; -import com.zhehekeji.web.lib.joyware.NetSDKLib; +import com.zhehekeji.web.lib.joyware.*; import com.zhehekeji.web.lib.joyware.NetSDKLib.LLong; import com.zhehekeji.web.lib.joyware.NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY; import com.zhehekeji.web.lib.joyware.NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY; @@ -21,9 +18,9 @@ public class JoywareLoginModule { // 设备信息 public static NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); - private static NET_IN_PTZ_STATUS_PROC.CallBack.DisConnectCallBack disConnectCallBack = new NET_IN_PTZ_STATUS_PROC.CallBack.DisConnectCallBack(); + private static CallBack.DisConnectCallBack disConnectCallBack = new CallBack.DisConnectCallBack(); - private static NET_IN_PTZ_STATUS_PROC.CallBack.HaveReConnect haveReConnect = new NET_IN_PTZ_STATUS_PROC.CallBack.HaveReConnect(); + private static CallBack.HaveReConnect haveReConnect = new CallBack.HaveReConnect(); // 登陆句柄 public static LLong m_hLoginHandle = new LLong(0); @@ -115,7 +112,7 @@ public class JoywareLoginModule { public static void attachPTZStatusProc() { NET_IN_PTZ_STATUS_PROC pIn = new NET_IN_PTZ_STATUS_PROC(); pIn.nChannel = 0; - pIn.cbPTZStatusProc = NET_IN_PTZ_STATUS_PROC.CallBack.CBPTZStatusProcCallBack.getInstance(); + pIn.cbPTZStatusProc = CallBack.CBPTZStatusProcCallBack.getInstance(); pIn.write(); NET_OUT_PTZ_STATUS_PROC pOut = new NET_OUT_PTZ_STATUS_PROC(); pOut.write(); diff --git a/web/src/main/java/com/zhehekeji/web/lib/JoywarePtzControlModule.java b/web/src/main/java/com/zhehekeji/web/lib/JoywarePtzControlModule.java index e92f7db..47b4177 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/JoywarePtzControlModule.java +++ b/web/src/main/java/com/zhehekeji/web/lib/JoywarePtzControlModule.java @@ -3,7 +3,7 @@ package com.zhehekeji.web.lib; import com.sun.jna.ptr.IntByReference; import com.zhehekeji.common.util.PathUtil; import com.zhehekeji.core.util.Assert; -import com.zhehekeji.web.lib.joyware.NET_IN_PTZ_STATUS_PROC; +import com.zhehekeji.web.lib.joyware.CallBack; import com.zhehekeji.web.lib.joyware.NetSDKLib; import com.zhehekeji.web.lib.joyware.ToolKits; import lombok.extern.slf4j.Slf4j; @@ -18,7 +18,7 @@ import java.time.LocalDateTime; public class JoywarePtzControlModule { - private static NET_IN_PTZ_STATUS_PROC.CallBack.Mp4ReceiveCB mp4ReceiveCB = new NET_IN_PTZ_STATUS_PROC.CallBack.Mp4ReceiveCB(); + //private static CallBack.Mp4ReceiveCB mp4ReceiveCB = new CallBack.Mp4ReceiveCB(); /** * 向上 @@ -231,20 +231,19 @@ public class JoywarePtzControlModule { 0, 0, 0, 1); } - public static boolean pic(Integer cameraId, int nChannelID, OrderInfo orderInfo) { + public static boolean pic(Integer cameraId,Integer channel, String realPath) { NetSDKLib.SNAP_PARAMS stuSnapParams = new NetSDKLib.SNAP_PARAMS(); - stuSnapParams.Channel = nChannelID; // channel + stuSnapParams.Channel = 0; // channel stuSnapParams.mode = 0; // capture picture mode stuSnapParams.Quality = 3; // picture quality stuSnapParams.InterSnap = 0; // timer capture picture time interval - stuSnapParams.CmdSerial = OrderCmdSerial.nextSerial(); - OrderCmdSerial.put(stuSnapParams.CmdSerial, orderInfo); + stuSnapParams.CmdSerial = CaptureCmdSerial.put(realPath); IntByReference reserved = new IntByReference(0); return JoywareLoginModule.netsdk.CLIENT_SnapPictureEx(HikLoginModule.CameraConnMap.getConnId(cameraId), stuSnapParams, reserved); } - public static void downloadMp4(Integer cameraId, String path, String orderNum, LocalDateTime start, LocalDateTime end) { + public static void downloadMp4(Integer cameraId, String path, LocalDateTime start, LocalDateTime end) { //视频结束时间加上5s end = end.plusSeconds(5); PathUtil.checkDirc(path); @@ -259,7 +258,7 @@ public class JoywarePtzControlModule { download_by_data_type.szSavedFileName = path; download_by_data_type.emDataType = 3; download_by_data_type.emRecordType = 0; - download_by_data_type.cbDownLoadPos = mp4ReceiveCB; + //download_by_data_type.cbDownLoadPos = mp4ReceiveCB; download_by_data_type.write(); NetSDKLib.NET_OUT_DOWNLOAD_BY_DATA_TYPE net_out_download_by_data_type = new NetSDKLib.NET_OUT_DOWNLOAD_BY_DATA_TYPE(); net_out_download_by_data_type.write(); @@ -267,8 +266,6 @@ public class JoywarePtzControlModule { NetSDKLib.LLong l = JoywareLoginModule.netsdk.CLIENT_DownloadByDataType(HikLoginModule.CameraConnMap.getConnId(cameraId), download_by_data_type.getPointer(), net_out_download_by_data_type.getPointer(), 8000); if (l.longValue() == 0) { log.error("download error :{}", ToolKits.getErrorCodePrint()); - } else { - OrderRealtime.startDownload(l, orderNum); } } diff --git a/web/src/main/java/com/zhehekeji/web/lib/OrderCmdSerial.java b/web/src/main/java/com/zhehekeji/web/lib/OrderCmdSerial.java deleted file mode 100644 index 18b8060..0000000 --- a/web/src/main/java/com/zhehekeji/web/lib/OrderCmdSerial.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.zhehekeji.web.lib; - -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * sdk抓图回调,用来关联订单的类 - */ -public class OrderCmdSerial { - - public static ConcurrentHashMap orderCmdSerialMap = new ConcurrentHashMap<>(Short.MAX_VALUE * 4); - - private static AtomicInteger serialIntId = new AtomicInteger(0); - - public static Integer nextSerial() { - return serialIntId.addAndGet(1); - } - - public static void put(Integer serialId, OrderInfo orderInfo) { - orderCmdSerialMap.put(serialId, orderInfo); - } - - public static void remove(Integer serialId) { - orderCmdSerialMap.remove(serialId); - } - - public static OrderInfo getOrderInfo(Integer serialId) { - return orderCmdSerialMap.get(serialId); - } - - public static void main(String[] args) { - AtomicInteger integer = new AtomicInteger(Integer.MAX_VALUE); - System.out.println(integer); - //System.out.println(integer.addAndGet(1)); - System.out.println((short) integer.addAndGet(1)); - AtomicInteger next = new AtomicInteger(integer.addAndGet(1)); - System.out.println(next.get()); - } - - -} diff --git a/web/src/main/java/com/zhehekeji/web/lib/OrderInfo.java b/web/src/main/java/com/zhehekeji/web/lib/OrderInfo.java index 30103d6..7822041 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/OrderInfo.java +++ b/web/src/main/java/com/zhehekeji/web/lib/OrderInfo.java @@ -1,5 +1,7 @@ package com.zhehekeji.web.lib; +import com.zhehekeji.web.entity.Street; +import com.zhehekeji.web.service.PlcCmdInfo; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; @@ -27,22 +29,46 @@ public class OrderInfo { */ private Boolean isPre; - /** - * 1:入库 2:货位 3:出库 - */ -// private Integer type; - -// @AllArgsConstructor -// @Getter -// public enum OrderPathType{ -// PUT(1), -// OUTPUT(3), -// GOODS(2), -// -// ; -// private Integer type; -// -// } + private Integer leftRight; + + public OrderInfo(Street street, PlcCmdInfo plcCmdInfo, Integer times){ + if(street == null){ + return; + } + //拍照,转动 需要知道是哪个货架 + //1 判断是左右货架 1:左货架 2:右货架 + //判断左右 行列号 + + isPre = true; + if(times % 2 ==0){ + isPre = false; + } + if(times == 2 || times == 1){ + leftRight = plcCmdInfo.getLeftRight1(); + row = plcCmdInfo.getRow1(); + column = plcCmdInfo.getColumn1(); + }else if(times == 4 || times == 3){ + leftRight = plcCmdInfo.getLeftRight2(); + row = plcCmdInfo.getRow2(); + column = plcCmdInfo.getColumn2(); + } + //找到球机IO配置的预置点 + //todo + if(!"C6".equals(code)){ + if(leftRight == 1){ + code = code+"-L"; + }else if(leftRight == 2){ + code = code+"-R"; + } + } + if(leftRight == 1){ + shelveId = street.getLeftShelveId(); + }else { + shelveId = street.getRightShelveId(); + } + orderId = 0L; + orderNum = plcCmdInfo.getOrderNum(); + } } diff --git a/web/src/main/java/com/zhehekeji/web/lib/OrderRealtime.java b/web/src/main/java/com/zhehekeji/web/lib/OrderRealtime.java index 4847610..c8a2a8b 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/OrderRealtime.java +++ b/web/src/main/java/com/zhehekeji/web/lib/OrderRealtime.java @@ -70,20 +70,4 @@ public class OrderRealtime { orderMap.remove(streetId); return orderNum; } - - public static void startDownload(NetSDKLib.LLong play, String orderNum) { - playOrderMap.put(play, orderNum); - } - - /** - * 下载完成,删除关联关系,并返回订单号 - * - * @param play - * @return - */ - public static String overDownload(NetSDKLib.LLong play) { - String orderNum = playOrderMap.get(play); - playOrderMap.remove(play); - return orderNum; - } } diff --git a/web/src/main/java/com/zhehekeji/web/lib/joyware/CallBack.java b/web/src/main/java/com/zhehekeji/web/lib/joyware/CallBack.java new file mode 100644 index 0000000..c278f82 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/lib/joyware/CallBack.java @@ -0,0 +1,81 @@ +package com.zhehekeji.web.lib.joyware; + +import com.sun.jna.Pointer; +import com.zhehekeji.web.lib.HikLoginModule; +import com.zhehekeji.web.lib.JoywareLoginModule; +import com.zhehekeji.web.lib.OrderRealtime; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class CallBack { + + /** + * 球机掉线回调 + */ + public static class DisConnectCallBack implements NetSDKLib.fDisConnect { + + @Override + public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { + Integer cameraId = HikLoginModule.CameraConnMap.getCameraIdByLoginId(lLoginID); + log.error("球机:{}掉线",cameraId); + //CameraConnMap.disConn(cameraId); + } + } + +// /** +// * mp4下载回调 +// */ +// public static class Mp4ReceiveCB implements NetSDKLib.fTimeDownLoadPosCallBack { +// +// @Override +// public void invoke(NetSDKLib.LLong lPlayHandle, int dwTotalSize, int dwDownLoadSize, int index, NetSDKLib.NET_RECORDFILE_INFO.ByValue recordfileinfo, Pointer dwUser) { +// if(dwDownLoadSize == -1) { +// JoywareLoginModule.netsdk.CLIENT_StopDownload(lPlayHandle); +// } +// } +// } + + public static class HaveReConnect implements NetSDKLib.fHaveReConnect { + @Override + public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) { + log.info("球机:{}重连,loginId:{}",pchDVRIP,m_hLoginHandle.longValue()); + System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort); + } + } + + public static class CBPTZStatusProcCallBack implements NetSDKLib.fPTZStatusProcCallBack{ + + private CBPTZStatusProcCallBack() { + } + + private static class CallBackHolder { + private static CBPTZStatusProcCallBack instance = new CBPTZStatusProcCallBack(); + } + + public static CBPTZStatusProcCallBack getInstance() { + return CallBackHolder.instance; + } + + + @Override + public void invoke(NetSDKLib.LLong lLoginId, NetSDKLib.LLong lAttachHandle, Pointer pBuf, int dwBufLen, long dwUser) { + NetSDKLib.NET_PTZ_LOCATION_INFO PTZInfo = new NetSDKLib.NET_PTZ_LOCATION_INFO(); + ToolKits.GetPointerData(pBuf, PTZInfo); + // if(PTZInfo.bState == 2){ + // Integer cameraId = CameraConnMap.getCameraIdByLoginId(lLoginId); + // if(cameraId != null){ + // OrderInfo orderInfo = CameraCaptureMap.getOrderInfoByStreetId(cameraId); + // log.info("cameraId:{}",cameraId); + // if(orderInfo != null && !"C6".equals(orderInfo.getCode())){ + // log.info("cameraId:{} 到位 拍照,code:{},orderNUm:{}",cameraId,orderInfo.getCode(),orderInfo.getOrderNum()); + // //PtzControlModule.pic(cameraId,0,orderInfo); + // } + // CameraCaptureMap.remove(cameraId); + // } + // + // } + } + + } + +} diff --git a/web/src/main/java/com/zhehekeji/web/lib/joyware/CaptureReceiveCB.java b/web/src/main/java/com/zhehekeji/web/lib/joyware/CaptureReceiveCB.java index 138ce33..4fcb414 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/joyware/CaptureReceiveCB.java +++ b/web/src/main/java/com/zhehekeji/web/lib/joyware/CaptureReceiveCB.java @@ -4,6 +4,7 @@ import com.sun.jna.Pointer; import com.zhehekeji.web.config.ConfigProperties; import com.zhehekeji.web.mapper.OrderMapper; import com.zhehekeji.web.mapper.StockMapper; +import com.zhehekeji.web.service.PlcService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -16,32 +17,26 @@ import java.util.concurrent.TimeUnit; /** * @Description 抓图回调函数 * @Author wangyiming1031@aliyun.com - * @Date 2020/12/14 16:11 + * @Date 2020/12/14 16:11 **/ @Component @Slf4j -public class CaptureReceiveCB implements NetSDKLib.fSnapRev{ - - @Resource - private OrderMapper orderMapper; +public class CaptureReceiveCB implements NetSDKLib.fSnapRev { @Resource private ConfigProperties configProperties; private static String fileType = "jpg"; - @Resource - private StockMapper stockMapper; - /** * 执行线程池 */ - private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 10, 200, - TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10000000)); + private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 3, 200, + TimeUnit.MINUTES, new ArrayBlockingQueue<>(10000000)); @Override public void invoke(NetSDKLib.LLong lLoginID, Pointer pBuf, int RevLen, int EncodeType, int CmdSerial, Pointer dwUser) { - CaptureRunnable captureRunnable = new CaptureRunnable(CmdSerial,fileType,RevLen,configProperties.getSavePath().getMediaPath(),pBuf,orderMapper,stockMapper); + CaptureRunnable captureRunnable = new CaptureRunnable(CmdSerial, fileType, RevLen, configProperties.getSavePath().getMediaPath(), pBuf); threadPoolExecutor.execute(captureRunnable); } diff --git a/web/src/main/java/com/zhehekeji/web/lib/joyware/CaptureRunnable.java b/web/src/main/java/com/zhehekeji/web/lib/joyware/CaptureRunnable.java index cc243f6..bf590b4 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/joyware/CaptureRunnable.java +++ b/web/src/main/java/com/zhehekeji/web/lib/joyware/CaptureRunnable.java @@ -2,14 +2,10 @@ package com.zhehekeji.web.lib.joyware; import com.sun.jna.Pointer; import com.zhehekeji.common.util.PathUtil; -import com.zhehekeji.web.entity.Order; -import com.zhehekeji.web.entity.Stock; -import com.zhehekeji.web.lib.OrderCmdSerial; +import com.zhehekeji.web.lib.CaptureCmdSerial; import com.zhehekeji.web.lib.OrderInfo; -import com.zhehekeji.web.mapper.OrderMapper; -import com.zhehekeji.web.mapper.StockMapper; +import com.zhehekeji.web.service.PlcService; import lombok.extern.slf4j.Slf4j; -import org.springframework.util.StringUtils; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; @@ -30,82 +26,25 @@ public class CaptureRunnable implements Runnable { private Pointer pBuf; - private OrderMapper orderMapper; - - private StockMapper stockMapper; - public CaptureRunnable(int cmdSerial, String fileType, Integer revLen, String mediaPath, - Pointer pBuf, OrderMapper orderMapper, StockMapper stockMapper) { + Pointer pBuf) { this.CmdSerial = cmdSerial; this.fileType = fileType; this.RevLen = revLen; this.mediaPath = mediaPath; this.pBuf = pBuf; - this.orderMapper = orderMapper; - this.stockMapper = stockMapper; } @Override public void run() { - OrderInfo orderInfo = OrderCmdSerial.getOrderInfo(CmdSerial); - OrderCmdSerial.remove(CmdSerial); - if (orderInfo != null) { - String path = PathUtil.createFileName(fileType); + String path = CaptureCmdSerial.getOrderInfo(CmdSerial); + if (path != null) { String picPath = savePic(pBuf, RevLen, mediaPath + path); if (picPath == null) { return; } - - String shelveId = orderInfo.getShelveId(); - Integer row = orderInfo.getRow(); - Integer column = orderInfo.getColumn(); - - //同步 防止有照片丢失 - synchronized (orderInfo.getOrderNum().intern()) { - Order order = orderMapper.getOneByOrderNum(orderInfo.getOrderNum()); - if (order != null) { - Stock stock = stockMapper.getByShelveIdAndRowColumn(orderInfo.getShelveId(), orderInfo.getRow(), orderInfo.getColumn()); - if (stock == null) { - stock = new Stock(); - stock.setShelveId(shelveId); - stock.setColumn(column); - stock.setRow(row); - stock.setStatus(0); - if (orderInfo.getIsPre()) { - stock.setPreoperationPic(path); - } else { - stock.setOveroperationPic(path); - } - stock.setOrderNum(order.getOrderNum()); - stockMapper.insert(stock); - }else { - if (orderInfo.getIsPre()) { - stock.setPreoperationPic(path); - } else { - stock.setOveroperationPic(path); - } - stock.setOrderNum(order.getOrderNum()); - stockMapper.updateById(stock); - } - String pics = order.getPicPaths(); - if (StringUtils.isEmpty(pics)) { - order.setPicPaths(path); - } else { - order.setPicPaths(pics + "," + path); - } - Order update = new Order(); - update.setId(order.getId()); - update.setPicPaths(order.getPicPaths()); - log.info(" update order set pics:{},orderNum:{}", update.getPicPaths(), orderInfo.getOrderNum()); - orderMapper.updateById(update); - // 盘点历史纪录 - - } - - } return; } - log.warn("no order"); } private String savePic(Pointer pBuf, int RevLen, String path) { diff --git a/web/src/main/java/com/zhehekeji/web/lib/joyware/NET_IN_PTZ_STATUS_PROC.java b/web/src/main/java/com/zhehekeji/web/lib/joyware/NET_IN_PTZ_STATUS_PROC.java index bafa1a0..0a38f62 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/joyware/NET_IN_PTZ_STATUS_PROC.java +++ b/web/src/main/java/com/zhehekeji/web/lib/joyware/NET_IN_PTZ_STATUS_PROC.java @@ -34,79 +34,5 @@ public class NET_IN_PTZ_STATUS_PROC extends NetSDKLib.SdkStructure{ this.dwSize = this.size(); } - @Slf4j - public static class CallBack { - /** - * 球机掉线回调 - */ - public static class DisConnectCallBack implements NetSDKLib.fDisConnect { - - @Override - public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { - Integer cameraId = HikLoginModule.CameraConnMap.getCameraIdByLoginId(lLoginID); - log.error("球机:{}掉线",cameraId); - //CameraConnMap.disConn(cameraId); - } - } - - /** - * mp4下载回调 - */ - public static class Mp4ReceiveCB implements NetSDKLib.fTimeDownLoadPosCallBack { - - @Override - public void invoke(NetSDKLib.LLong lPlayHandle, int dwTotalSize, int dwDownLoadSize, int index, NetSDKLib.NET_RECORDFILE_INFO.ByValue recordfileinfo, Pointer dwUser) { - if(dwDownLoadSize == -1) { - OrderRealtime.overDownload(lPlayHandle); - StopDownLoadThread stopDownLoadThread = new StopDownLoadThread(lPlayHandle); - stopDownLoadThread.start(); - } - } - } - - public static class HaveReConnect implements NetSDKLib.fHaveReConnect { - @Override - public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) { - log.info("球机:{}重连,loginId:{}",pchDVRIP,m_hLoginHandle.longValue()); - System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort); - } - } - - public static class CBPTZStatusProcCallBack implements NetSDKLib.fPTZStatusProcCallBack{ - - private CBPTZStatusProcCallBack() { - } - - private static class CallBackHolder { - private static CBPTZStatusProcCallBack instance = new CBPTZStatusProcCallBack(); - } - - public static CBPTZStatusProcCallBack getInstance() { - return CallBackHolder.instance; - } - - - @Override - public void invoke(NetSDKLib.LLong lLoginId, NetSDKLib.LLong lAttachHandle, Pointer pBuf, int dwBufLen, long dwUser) { - NetSDKLib.NET_PTZ_LOCATION_INFO PTZInfo = new NetSDKLib.NET_PTZ_LOCATION_INFO(); - ToolKits.GetPointerData(pBuf, PTZInfo); - // if(PTZInfo.bState == 2){ - // Integer cameraId = CameraConnMap.getCameraIdByLoginId(lLoginId); - // if(cameraId != null){ - // OrderInfo orderInfo = CameraCaptureMap.getOrderInfoByStreetId(cameraId); - // log.info("cameraId:{}",cameraId); - // if(orderInfo != null && !"C6".equals(orderInfo.getCode())){ - // log.info("cameraId:{} 到位 拍照,code:{},orderNUm:{}",cameraId,orderInfo.getCode(),orderInfo.getOrderNum()); - // //PtzControlModule.pic(cameraId,0,orderInfo); - // } - // CameraCaptureMap.remove(cameraId); - // } - // - // } - } - - } - - } } diff --git a/web/src/main/java/com/zhehekeji/web/mapper/CameraIOMapper.java b/web/src/main/java/com/zhehekeji/web/mapper/CameraIOMapper.java index 23240a7..f992958 100644 --- a/web/src/main/java/com/zhehekeji/web/mapper/CameraIOMapper.java +++ b/web/src/main/java/com/zhehekeji/web/mapper/CameraIOMapper.java @@ -14,4 +14,7 @@ public interface CameraIOMapper extends BaseMapper { "left join (select * from camera_io where camera_id = #{cameraId}) io on io.name = t.name order by t.id") List cameraIOs (@Param("cameraId") Integer cameraId); + @Select("select * from camera_io where code = #{code} and camera_id = #{cameraId}") + CameraIO getByCodeAndCameraId(String code,Integer cameraId); + } 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 2488b03..5cb42c6 100644 --- a/web/src/main/java/com/zhehekeji/web/service/CameraService.java +++ b/web/src/main/java/com/zhehekeji/web/service/CameraService.java @@ -19,6 +19,9 @@ import com.zhehekeji.web.pojo.camera.IOImport; import com.zhehekeji.web.pojo.street.StreetSearch; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -147,31 +150,38 @@ public class CameraService { * @param IOId 存在修改,不存在 新增 * @param cameraId */ + @CacheEvict(value = "ptz",key = "#cameraId+'-'+#code") public synchronized Integer ptz(Integer IOId, Integer cameraId, String name,Integer type,String code) { Camera camera = cameraMapper.selectById(cameraId); Assert.notNull(camera, "球机不存在"); - Integer cameraPtzId = camera.getPtzId() == null ? 0 : camera.getPtzId(); CameraIO cameraIO = null; - int ptzId = cameraPtzId + 1; + int ptzId = 0; if (IOId == null || IOId == 0) { + //中威从1开始 海康从300开始 + ptzId = camera.getPtzId() == null ? (configProperties.getCameraConfig().getCameraType() == ConfigProperties.JOYWARE_CAMERA?0:300) : camera.getPtzId(); + ptzId = ptzId + 1; //新增 cameraIO = new CameraIO(); - cameraIO.setCameraId(cameraId); + cameraIO.setCameraId(camera.getId()); cameraIO.setUpdateTime(LocalDateTime.now()); cameraIO.setName(name); cameraIO.setPtzId(ptzId); cameraIO.setCode(code); - conver(cameraIO,type); - ioMapper.insert(cameraIO); + conver(cameraIO,0); + try { + ioMapper.insert(cameraIO); + }catch (DuplicateKeyException e){ + Assert.isTrue(false,"code已存在:"+code); + } camera.setPtzId(ptzId); cameraMapper.updateById(camera); + return ptzId; } else { //修改 cameraIO = ioMapper.selectById(IOId); Assert.notNull(cameraIO, "IO不存在"); - //将ptzId赋值为旧的,不能用新的,负责SDK里面就是新增预置点 + //将ptzId赋值为旧的,不能用新的 ptzId = cameraIO.getPtzId(); - //cameraIO.setPtzId(ptzId); cameraIO.setUpdateTime(LocalDateTime.now()); conver(cameraIO,type); ioMapper.updateById(cameraIO); @@ -185,6 +195,21 @@ public class CameraService { return cameraIO.getId(); } + /** + * 所有的根据code和caameraId获取预置点都使用此方法,有缓存 + * @param code + * @param cameraId + * @return + */ + @Cacheable(value = "ptz",key = "#cameraId+'-'+#code") + public Integer getPtzIdByCodeAndCameraId(String code,Integer cameraId){ + CameraIO cameraIO = ioMapper.getByCodeAndCameraId(code,cameraId); + if(cameraIO != null){ + return cameraIO.getPtzId(); + } + return null; + } + public Integer getPtzId(Integer ioId){ CameraIO cameraIO = ioMapper.selectById(ioId); Assert.notNull(cameraIO,"IO配置不存在"); diff --git a/web/src/main/java/com/zhehekeji/web/service/OrderAction.java b/web/src/main/java/com/zhehekeji/web/service/GoodsActionTimes.java similarity index 51% rename from web/src/main/java/com/zhehekeji/web/service/OrderAction.java rename to web/src/main/java/com/zhehekeji/web/service/GoodsActionTimes.java index 8af1dae..bb61dbb 100644 --- a/web/src/main/java/com/zhehekeji/web/service/OrderAction.java +++ b/web/src/main/java/com/zhehekeji/web/service/GoodsActionTimes.java @@ -7,44 +7,46 @@ import java.util.HashMap; import java.util.Map; /** - * @Description 记录订单任务的次数 + * @Description 记录订单取放货的次数 * @Author - * @Date 2021/1/20 13:54 + * @Date 2021/1/20 13:54 **/ @Data @Slf4j -public class OrderAction { +public class GoodsActionTimes { - private static Map orderActions = new HashMap<>(); + private static Map orderActions = new HashMap<>(); /** * 订单任务,返回该订单已发送的任务数 * 一个订单由4个任务完成 + * * @param orderNum * @return */ - public static Integer put(String orderNum){ - synchronized (orderNum.intern()){ - if(orderActions.get(orderNum) == null){ - orderActions.put(orderNum,1); + public static Integer put(String orderNum) { + //对订单号加锁 统计数量 + synchronized (orderNum.intern()) { + if (orderActions.get(orderNum) == null) { + orderActions.put(orderNum, 1); return 1; } int times = orderActions.get(orderNum); times++; //该订单的任务达到4次了,不会再有任务了,清除缓存 //具体看取货、放货、货物库内转移的流程 - if(times >= 4){ - log.info("remove oderNum:{},times:{}",orderNum,times); + if (times >= 4) { + log.info("remove oderNum:{},times:{}", orderNum, times); orderActions.remove(orderNum); - }else { - orderActions.put(orderNum,times); - log.info("oderNum:{},times:{}",orderNum,times); + } else { + orderActions.put(orderNum, times); + log.info("oderNum:{},times:{}", orderNum, times); } return times; } } - public static Map get(){ + public static Map get() { return orderActions; } } diff --git a/web/src/main/java/com/zhehekeji/web/service/OrderService.java b/web/src/main/java/com/zhehekeji/web/service/OrderService.java index 6c80573..bb8f07f 100644 --- a/web/src/main/java/com/zhehekeji/web/service/OrderService.java +++ b/web/src/main/java/com/zhehekeji/web/service/OrderService.java @@ -82,47 +82,6 @@ public class OrderService { return order.getId(); } - /** - * 订单结束 - * - * @param orderNum 订单号 - * @param street 巷道 - * @param warn 是否有告警 true 告警 - */ - public void orderStop(String orderNum, Street street, Boolean warn) { - synchronized (orderNum.intern()){ - Order order = orderMapper.getOneByOrderNum(orderNum); - if (order == null) { - log.error("订单结束信号,订单不存在,orderNum:{}", orderNum); - return; - } - if (order.getStartTime() == null) { - log.error("订单结束信号,订单未开始,orderNum:{}", orderNum); - return; - } - Order update = new Order(); - update.setId(order.getId()); - if (warn) { - update.setStatus(1); - } else { - update.setStatus(0); - } - update.setEndTime(LocalDateTime.now()); - - if (street.getCamera1Id() != null) { - String path = PathUtil.createFileName("mp4"); - JoywarePtzControlModule.downloadMp4(street.getCamera1Id(), configProperties.getSavePath().getMp4Path()+ path, orderNum, order.getStartTime(), update.getEndTime()); - update.setVideoPath1(path); - } - if (street.getCamera2Id() != null) { - String path = PathUtil.createFileName("mp4"); - JoywarePtzControlModule.downloadMp4(street.getCamera2Id(), configProperties.getSavePath().getMp4Path() + path, orderNum, order.getStartTime(), update.getEndTime()); - update.setVideoPath2(path); - } - orderMapper.updateById(update); - } - } - public String location(OrderVO orderVO,Street street){ //from to 模型 if (orderVO.getInOut1() != null && orderVO.getInOut2() != null) { diff --git a/web/src/main/java/com/zhehekeji/web/service/PlcOrderInfo.java b/web/src/main/java/com/zhehekeji/web/service/PlcCmdInfo.java similarity index 82% rename from web/src/main/java/com/zhehekeji/web/service/PlcOrderInfo.java rename to web/src/main/java/com/zhehekeji/web/service/PlcCmdInfo.java index 5ec29a6..3ca5f2d 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcOrderInfo.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcCmdInfo.java @@ -7,7 +7,7 @@ import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor -public class PlcOrderInfo { +public class PlcCmdInfo { /** * 任务Id @@ -56,7 +56,9 @@ public class PlcOrderInfo { private String orderNum; - public PlcOrderInfo(String plcId,String taskId, Integer inOut1, Integer leftRight1, Integer column1, Integer row1, Integer inOut2, Integer leftRight2, Integer column2, Integer row2) { + private String plcId; + + public PlcCmdInfo(String plcId, String taskId, Integer inOut1, Integer leftRight1, Integer column1, Integer row1, Integer inOut2, Integer leftRight2, Integer column2, Integer row2) { this.taskId = taskId; this.inOut1 = inOut1; this.leftRight1 = leftRight1; @@ -66,6 +68,7 @@ public class PlcOrderInfo { this.leftRight2 = leftRight2; this.column2 = column2; this.row2 = row2; + this.plcId = plcId; this.orderNum = plcId+"_"+taskId; } } 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 4b63819..ed4709d 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -10,21 +10,19 @@ import com.zhehekeji.web.pojo.OrderVO; import com.zhehekeji.web.pojo.stock.StockStatus; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; /** * @Description plc信号指令处理类 - * 对plcId做同步处理,防止内存中保存的正在运行的订单信息错乱 + * 对plcId做同步处理,防止内存中保存的正在运行的订单信息错乱 * @Author qiushui - * @Date 2021/1/19 13:45 + * @Date 2021/1/19 13:45 **/ @Service @Slf4j @@ -50,13 +48,15 @@ public class PlcService { private CameraIOMapper ioMapper; @Resource private StockService stockService; + @Resource + private CameraService cameraService; /** * 原点位 */ private static String originalPoint = "C6"; - public Integer plcStatus(){ + public Integer plcStatus() { List streets = streetMapper.selectByMap(new HashMap<>(0)); List connIds = StreetConn.connList(); return (streets.size() - connIds.size()); @@ -64,171 +64,238 @@ public class PlcService { /** * 开始工单 robotic plcId是plcId,昆船的plcId是来自包体,即srmNumber - * @param plcOrderInfo - * @param plcId + * + * @param plcCmdInfo */ - public void orderStart(PlcOrderInfo plcOrderInfo,String plcId) { - Order order = new Order(); - order.setOrderNum(plcOrderInfo.getOrderNum()); - order.setStatus(0); - order.setStartTime(LocalDateTime.now()); - Street street = streetService.getStreetByPlcId(plcId); - if(street != null){ - OrderRealtime.startOrder(street.getId(), plcOrderInfo.getOrderNum()); + public void orderStart(PlcCmdInfo plcCmdInfo) { + Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); + if (street != null) { + Order order = new Order(); + order.setOrderNum(plcCmdInfo.getOrderNum()); + order.setStatus(0); + order.setStartTime(LocalDateTime.now()); order.setStreetId(street.getId()); - order.setInOut1(plcOrderInfo.getInOut1()); - order.setLeftRight1(plcOrderInfo.getLeftRight1()); - order.setColumn1(plcOrderInfo.getColumn1()); - order.setRow1(plcOrderInfo.getRow1()); - order.setInOut2(plcOrderInfo.getInOut2()); - order.setLeftRight2(plcOrderInfo.getLeftRight2()); - order.setColumn2(plcOrderInfo.getColumn2()); - order.setRow2(plcOrderInfo.getRow2()); + order.setInOut1(plcCmdInfo.getInOut1()); + order.setLeftRight1(plcCmdInfo.getLeftRight1()); + order.setColumn1(plcCmdInfo.getColumn1()); + order.setRow1(plcCmdInfo.getRow1()); + //todo 昆船的项目 ,取货 放货是独立的 + //取货是是不知道放货的位置的,所以订单开始的时候只写1位置 + //订单结束写2位置 orderMapper.insert(order); - //orderMapper.update(order, new UpdateWrapper().eq("order_num", orderNum)); + OrderRealtime.startOrder(street.getId(), plcCmdInfo.getOrderNum()); } } /** - * //times == 1 ,做动作 - * //times == 2 ,拍照 - * //times == 3 ,做动作 - * //times == 4 ,拍照 - * @param plcOrderInfo - * @param plcId - * @param times + * 工单结束信息 + * 判断有没有告警,有告警的不做处理 + * 没有告警,且存在未结束工单,修改保存工单信息 + * + * @param plcCmdInfo */ - public void action(PlcOrderInfo plcOrderInfo,String plcId,Integer times,String code){ - Street street = streetService.getStreetByPlcId(plcId); - if(street == null){ + public void orderStop(PlcCmdInfo plcCmdInfo) { + LocalDateTime endTime = LocalDateTime.now(); + Street street = streetMapper.getStreetByPlcId(plcCmdInfo.getPlcId()); + if (street == null) { return; } - //拍照,转动 需要知道是哪个货架 - //1 判断是左右货架 1:左货架 2:右货架 - //判断左右 行列号 - Integer leftRight = 0; - Integer row = 0; - Integer column = 0; - Boolean isPre = true; - if(times % 2 ==0){ - isPre = false; - } - if(times == 2 || times == 1){ - leftRight = plcOrderInfo.getLeftRight1(); - row = plcOrderInfo.getRow1(); - column = plcOrderInfo.getColumn1(); - }else if(times == 4 || times == 3){ - leftRight = plcOrderInfo.getLeftRight2(); - row = plcOrderInfo.getRow2(); - column = plcOrderInfo.getColumn2(); - }else { - log.error("异常的任务次数,orderInfo:{},plcId:{},time:{}",plcOrderInfo.toString(),plcId,times); + Order order = orderMapper.getOneByOrderNum(plcCmdInfo.getOrderNum()); + if (order == null) { + log.error("订单结束信号,订单不存在,orderNum:{}", plcCmdInfo.getOrderNum()); return; } - //找到球机IO配置的预置点 - if(!originalPoint.equals(code)){ - if(leftRight == 1){ - code = code+"-L"; - }else if(leftRight == 2){ - code = code+"-R"; - } + OrderRealtime.stopOrder(street.getId()); + Order update = new Order(); + update.setId(order.getId()); + update.setEndTime(endTime); + if (street.getCamera1Id() != null) { + String path = cameraVideo(street.getCamera1Id(),order.getStartTime(),endTime); + order.setVideoPath1(path); } - log.info("预置点:{}",code); - //2 得到相应的货架号(目前订单 只支持单伸货架) - //todo 后面可能会有双伸,这里要改,plc那里也要改 - String shelveId; - if(leftRight == 1){ - shelveId = street.getLeftShelveId(); - }else { - shelveId = street.getRightShelveId(); + if (street.getCamera2Id() != null) { + String path = cameraVideo(street.getCamera2Id(),order.getStartTime(),endTime); + order.setVideoPath2(path); } - if(StringUtils.isEmpty(shelveId) || row == 0 || column == 0){ - log.error("异常的任务号,找不到对应的货架或行列号。orderInfo:{},plcId:{},time:{}",plcOrderInfo.toString(),plcId,times); + orderMapper.updateById(update); + + } + + public void orderStopByWarn(String orderNum){ + Order order = orderMapper.getOneByOrderNum(orderNum); + if(order == null){ return; } - OrderInfo orderInfo = new OrderInfo(0L,plcOrderInfo.getOrderNum(),shelveId,row,column,code,isPre); -// CameraCaptureMap.put(street.getCamera1Id(),orderInfo); -// CameraCaptureMap.put(street.getCamera2Id(),orderInfo); - move(street.getCamera1Id(), street.getCamera2Id(), code); - Stock stock = stockMapper.getByShelveIdAndRowColumn(shelveId,row,column); - if(stock != null){ - stock.setStatus(StockStatus.PENDING.getStatus()); - stockMapper.updateById(stock); + Order upd = new Order(); + upd.setId(order.getId()); + upd.setEndTime(LocalDateTime.now()); + //warn flag + //default 0 : normal + upd.setStatus(1); + orderMapper.updateById(upd); + } + + + public String cameraVideo(Integer cameraId, LocalDateTime startTime, LocalDateTime endTime) { + String path = PathUtil.createFileName("mp4"); + String realPath = configProperties.getSavePath().getMp4Path() + path; + if (configProperties.getCameraConfig().getCameraType() == ConfigProperties.HIK_CAMERA) { + HikPtzControlModule.downloadMp4(cameraId, realPath, startTime, endTime); + } else if (configProperties.getCameraConfig().getCameraType() == ConfigProperties.JOYWARE_CAMERA) { + JoywarePtzControlModule.downloadMp4(cameraId, realPath, startTime, endTime); } - if(!code.equals(originalPoint)){ - JoywarePtzControlModule.pic(street.getCamera1Id(),0,orderInfo); - JoywarePtzControlModule.pic(street.getCamera2Id(),0,orderInfo); + return path; + } + + /** + * //times == 1 ,做动作 + * //times == 2 ,拍照 + * //times == 3 ,做动作 + * //times == 4 ,拍照 + * + * @param plcCmdInfo + * @param times + */ + public void action(PlcCmdInfo plcCmdInfo, Integer times, String code) { + Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); + if (street == null) { + log.error("street not found ,plcId :{}", plcCmdInfo.getPlcId()); + return; + } + OrderInfo orderInfo = new OrderInfo(street, plcCmdInfo, times); + String path = null; + /** + * 拍照是C2 C4拍照(取货完成、放货完成) + */ + Boolean needCapture = doNeedCaptureByCode(code); + /*** + * 判断该巷道有几个相机 + * 如果有一个相机,就一个相机转 + * 如果有两个相机,则左侧转camera1 + * 右侧转camera2 + * 没有就不管了 + */ + if (street.getCamera1Id() != null && street.getCamera2Id() != null && street.getCamera1Id() != 0 && street.getCamera2Id() != 0) { + if (orderInfo.getLeftRight() == 1) { + gyrateCameraByCode(street.getCamera1Id(), code); + if (needCapture) { + path = cameraCapture(street.getCamera1Id()); + } + } else { + gyrateCameraByCode(street.getCamera2Id(), code); + if (needCapture) { + path = cameraCapture(street.getCamera2Id()); + } + } + } else { + Integer cameraId = street.getCamera1Id() != null && street.getCamera1Id() != 0 ? street.getCamera1Id() : street.getCamera2Id(); + if (cameraId != null && cameraId != 0) { + gyrateCameraByCode(cameraId, code); + if (needCapture) { + path = cameraCapture(cameraId); + } + } + } + //update order info after capture + if (path != null && needCapture) { + captureUpdateOrderAndStock(orderInfo, path); } } /** - * 根据plc指令转动摄像头到预置点 - * @param cameraId1 - * @param cameraId2 + * need take a photo ?? + * * @param code + * @return */ - public void move(Integer cameraId1,Integer cameraId2,String code){ - List cameraIds = new ArrayList<>(); - if(cameraId1 != null){ - cameraIds.add(cameraId1); + public Boolean doNeedCaptureByCode(String code) { + String picCmd = code.substring(0, 2); + if (picCmd.equals("C2") || picCmd.equals("C4")) { + return true; } - if(cameraId2 != null){ - cameraIds.add(cameraId1); - } - if(cameraIds.size() == 0){ - return; + return false; + } + + /** + * capture picture by camera + * + * @Return pic address + */ + public String cameraCapture(Integer cameraId) { + String path = PathUtil.createFileName("jpg"); + String realPath = configProperties.getSavePath().getMediaPath() + path; + if (configProperties.getCameraConfig().getCameraType() == ConfigProperties.JOYWARE_CAMERA) { + JoywarePtzControlModule.pic(cameraId, 0, realPath); + } else if (configProperties.getCameraConfig().getCameraType() == ConfigProperties.HIK_CAMERA) { + HikPtzControlModule.pic(cameraId, 0, realPath); } - List ioConfigs = ioMapper.selectList(new QueryWrapper().eq("code",code).in("camera_id",cameraIds)); - ioConfigs.forEach(ioConfig->{ - if(ioConfig.getPtzId() != null && ioConfig.getPtzId() > 0){ - log.info("tp ptz , code:{},cameraId:{}",code,cameraId1); - JoywarePtzControlModule.toPtz(ioConfig.getPtzId(),ioConfig.getCameraId()); + return path; + } + + /** + * gyrate camera to target + * + * @param cameraId + * @param code + */ + public void gyrateCameraByCode(Integer cameraId, String code) { + Integer ptzId = cameraService.getPtzIdByCodeAndCameraId(code, cameraId); + if (ptzId != null && ptzId >= 0) { + log.info("gyrate camera by code, code:{},cameraId:{},ptId:{}", code, cameraId, ptzId); + if (configProperties.getCameraConfig().getCameraType() == ConfigProperties.HIK_CAMERA) { + HikPtzControlModule.toPtz(ptzId, cameraId); + } else if (configProperties.getCameraConfig().getCameraType() == ConfigProperties.JOYWARE_CAMERA) { + JoywarePtzControlModule.toPtz(ptzId, cameraId); } - }); + } else { + log.error("ptz not found ,code:{},cameraId:{}", code, cameraId); + } } + /** * 收到告警异常信号 * 1.判断是否有正在进行订单,有的话,不做处理 * 2.没有订单,新增告警记录 + * * @param plcId */ - public void warnStart(String plcId,String signal){ + public void warnStart(String plcId, String signal) { Street street = streetService.getStreetByPlcId(plcId); - if(street == null){ + if (street == null) { return; } - synchronized (plcId.intern()){ + synchronized (plcId.intern()) { //新增 告警 - if(OrderRealtime.getWarnId(street.getId()) == null){ - //不存在正在执行的告警记录,就新增 - Warn warn = new Warn(); - warn.setStartTime(LocalDateTime.now()); - warn.setStreetId(street.getId()); - String orderNum = OrderRealtime.getOrderByStreetId(street.getId()); - if(StringUtils.isEmpty(orderNum)){ - //空的 说明没有正在执行的订单 - log.debug("{}:warn.... no order",plcId); - }else { - //不为空的话,填写工单的位置 - Order order = orderMapper.getOneByOrderNum(orderNum); - if(order != null){ - OrderVO orderVO = new OrderVO(); - BeanUtils.copyProperties(order,orderVO); - String location = orderService.location(orderVO,street); - warn.setLocation(location); - log.debug("{}:warn.... exist order",plcId); - } + if (OrderRealtime.getWarnId(street.getId()) != null) { + log.debug("{}:exist warn", plcId); + return; + } + //不存在正在执行的告警记录,就新增 + Warn warn = new Warn(); + warn.setStartTime(LocalDateTime.now()); + warn.setStreetId(street.getId()); + String orderNum = OrderRealtime.getOrderByStreetId(street.getId()); + if (StringUtils.isEmpty(orderNum)) { + log.debug("{}:warn start...., but no order running", plcId); + } else { + //不为空的话,填写工单的位置 + Order order = orderMapper.getOneByOrderNum(orderNum); + if (order != null) { + //stop the order + log.debug("plcId:{},warn start and stop the order",plcId); + orderStopByWarn(orderNum); + OrderVO orderVO = new OrderVO(); + BeanUtils.copyProperties(order, orderVO); + String location = orderService.location(orderVO, street); + warn.setLocation(location); + warn.setOrderId(order.getId()); } - //没有正在执行的工单 不需要填写location - warn.setSignal(signal); - warnMapper.insert(warn); - OrderRealtime.startWarn(street.getId(),warn.getId()); - }else { - log.debug("{}:exist warn",plcId); } - - + //没有正在执行的工单 不需要填写location + warn.setSignal(signal); + warnMapper.insert(warn); + OrderRealtime.startWarn(street.getId(), warn.getId()); } } @@ -236,143 +303,163 @@ public class PlcService { * 告警结束信号 * 是否存在订单,存在-》保存该订单的视频 * 如果没有订单-》是否存在告警记录-》有告警记录的话,保存视频 + * * @param plcId */ - public void warnStop(String plcId){ + public void warnStop(String plcId) { Street street = streetMapper.getStreetByPlcId(plcId); - if(street == null){ + if (street == null) { return; } - synchronized (plcId.intern()){ - //是否存在未结束的订单 - String orderNum = OrderRealtime.getOrderByStreetId(street.getId()); - if(!StringUtils.isEmpty(orderNum)){ - //存在未结束的订单 - //清了订单缓存,结束订单 - OrderRealtime.stopOrder(street.getId()); - orderService.orderStop(orderNum,street,Boolean.TRUE); - }else { - //没有未结束的订单 - //是否有告警 - Long warnId = OrderRealtime.getWarnId(street.getId()); - if(warnId != null){ - //存在告警 - //先内存中清除该告警 - OrderRealtime.cleanWarn(street.getId()); - Warn warn = warnMapper.selectById(warnId); - if(warn != null){ - //结束该告警,并录像 - warn.setEndTime(LocalDateTime.now()); - if (street.getCamera1Id() != null) { - String path = PathUtil.createFileName("mp4"); - JoywarePtzControlModule.downloadMp4(street.getCamera1Id(), configProperties.getSavePath().getMp4Path() + path, warnId.toString(), warn.getStartTime(), warn.getEndTime()); - warn.setVideoPath1(path); - } - if (street.getCamera2Id() != null) { - String path = PathUtil.createFileName("mp4"); - JoywarePtzControlModule.downloadMp4(street.getCamera2Id(), configProperties.getSavePath().getMp4Path() + path, warnId.toString(), warn.getStartTime(), warn.getEndTime()); - warn.setVideoPath2(path); - } - warnMapper.updateById(warn); - + synchronized (plcId.intern()) { + Long warnId = OrderRealtime.getWarnId(street.getId()); + if (warnId != null) { + //存在告警 + //先内存中清除该告警 + OrderRealtime.cleanWarn(street.getId()); + Warn warn = warnMapper.selectById(warnId); + if (warn != null) { + //结束该告警,并录像 + warn.setEndTime(LocalDateTime.now()); + if (street.getCamera1Id() != null) { + String path = cameraVideo(street.getCamera1Id(),warn.getStartTime(),LocalDateTime.now()); + warn.setVideoPath1(path); } - - + if (street.getCamera2Id() != null) { + String path = cameraVideo(street.getCamera1Id(),warn.getStartTime(),LocalDateTime.now()); + warn.setVideoPath2(path); + } + warnMapper.updateById(warn); } } - } - - } /** - * 工单结束信息 - * 判断有没有告警,有告警的不做处理 - * 没有告警,且存在未结束工单,修改保存工单信息 - * @param plcId - * @param orderNum + * capture ,and update the picture path in order and stock + * + * @param orderInfo + * @param path */ - public void orderStop(String plcId,String orderNum){ - Street street = streetMapper.getStreetByPlcId(plcId); - if(street == null){ - return; - } - synchronized (plcId.intern()){ - orderService.orderStop(orderNum,street,Boolean.FALSE); - OrderRealtime.stopOrder(street.getId()); + public void captureUpdateOrderAndStock(OrderInfo orderInfo, String path) { + synchronized (orderInfo.getOrderNum().intern()) { + Order order = orderMapper.getOneByOrderNum(orderInfo.getOrderNum()); + if (order != null) { + //update picPath in stock + Stock stock = stockMapper.getByShelveIdAndRowColumn(orderInfo.getShelveId(), orderInfo.getRow(), orderInfo.getColumn()); + if (stock == null) { + stock = new Stock(); + stock.setShelveId(orderInfo.getShelveId()); + stock.setColumn(orderInfo.getColumn()); + stock.setRow(orderInfo.getRow()); + stock.setStatus(0); + //if the stock is null,take over path only + stock.setOveroperationPic(path); + stock.setOrderNum(order.getOrderNum()); + stockMapper.insert(stock); + } else { + if (orderInfo.getIsPre()) { + stock.setPreoperationPic(path); + } else { + stock.setOveroperationPic(path); + } + //take the previous picture path the lasted over picture path + //take the lasted picture path the new one + stock.setPreoperationPic(stock.getPreoperationPic()); + stock.setOveroperationPic(path); + stock.setOrderNum(order.getOrderNum()); + stockMapper.updateById(stock); + } + String pics = order.getPicPaths(); + if (StringUtils.isEmpty(pics)) { + order.setPicPaths(path); + } else { + order.setPicPaths(pics + "," + path); + } + Order update = new Order(); + update.setId(order.getId()); + update.setPicPaths(order.getPicPaths()); + log.debug(" update order set pics:{},orderNum:{}", update.getPicPaths(), orderInfo.getOrderNum()); + orderMapper.updateById(update); + // 盘点历史纪录 + + } + } } + /** * 执行动作 旋转360,然后执行C8动作 * - * @Param ptzId 旋转360之后,再转到这个预置点 * @param plcId + * @Param ptzId 旋转360之后,再转到这个预置点 */ - public void turn360AndC8(String plcId){ + public void turn360AndC8(String plcId) { Street street = streetMapper.getStreetByPlcId(plcId); - if(street == null){ + if (street == null) { return; } - if(street.getCamera1Id() != null){ - List ioConfigs = ioMapper.selectList(new QueryWrapper().eq("code","C8").eq("camera_id",street.getCamera1Id())); + if (street.getCamera1Id() != null) { + List ioConfigs = ioMapper.selectList(new QueryWrapper().eq("code", "C8").eq("camera_id", street.getCamera1Id())); Integer ptzId = null; - if(ioConfigs.size() > 0){ + if (ioConfigs.size() > 0) { ptzId = ioConfigs.get(0).getPtzId(); } - JoywarePtzControlModule.turn360C8(street.getCamera1Id(),ptzId); + JoywarePtzControlModule.turn360C8(street.getCamera1Id(), ptzId); } - if(street.getCamera2Id() != null) { - List ioConfigs = ioMapper.selectList(new QueryWrapper().eq("code","C8").eq("camera_id",street.getCamera2Id())); + if (street.getCamera2Id() != null) { + List ioConfigs = ioMapper.selectList(new QueryWrapper().eq("code", "C8").eq("camera_id", street.getCamera2Id())); Integer ptzId = null; - if(ioConfigs.size() > 0){ + if (ioConfigs.size() > 0) { ptzId = ioConfigs.get(0).getPtzId(); } - JoywarePtzControlModule.turn360C8(street.getCamera2Id(),ptzId); + JoywarePtzControlModule.turn360C8(street.getCamera2Id(), ptzId); } } /** * 从货架 行列找到 前后前后两个照片 - * @param plcOrderInfo + * + * @param plcCmdInfo * @param plcId * @param barCodeSys * @param boxNumSys * @param boxNumAlgo */ - public void recordStock(PlcOrderInfo plcOrderInfo, String plcId, String barCodeSys, int boxNumSys, int boxNumAlgo) - { + public void recordStock(PlcCmdInfo plcCmdInfo, String plcId, String barCodeSys, int boxNumSys, int boxNumAlgo) { Street street = streetService.getStreetByPlcId(plcId); - if(street == null){ + if (street == null) { return; } //判断左右 行列号 - Integer leftRight = plcOrderInfo.getLeftRight2(); + Integer leftRight = plcCmdInfo.getLeftRight2(); String shelveId; - if(leftRight == 1){ + if (leftRight == 1) { shelveId = street.getLeftShelveId(); - }else { + } else { shelveId = street.getRightShelveId(); } - Stock stock = stockMapper.getByShelveIdAndRowColumn(shelveId,plcOrderInfo.getRow2(),plcOrderInfo.getColumn2()); - if(stock != null) { + Stock stock = stockMapper.getByShelveIdAndRowColumn(shelveId, plcCmdInfo.getRow2(), plcCmdInfo.getColumn2()); + if (stock != null) { stock.setCategory(barCodeSys); stock.setCount(boxNumSys); - String prevFile = configProperties.getSavePath().getMediaPath()+stock.getPreoperationPic(); - String overFile = configProperties.getSavePath().getMediaPath()+stock.getOveroperationPic(); + String prevFile = configProperties.getSavePath().getMediaPath() + stock.getPreoperationPic(); + String overFile = configProperties.getSavePath().getMediaPath() + stock.getOveroperationPic(); String code = BarCodeScan.detectBestBarCode(overFile); - if(boxNumSys == boxNumAlgo && code.equals(barCodeSys)) { + if (boxNumSys == boxNumAlgo && code.equals(barCodeSys)) { stock.setStatus(StockStatus.SUCCESS.getStatus()); log.info("核对正确"); stockMapper.updateById(stock); - }else { + } else { log.info("核对失败"); stock.setStatus(StockStatus.ERROR.getStatus()); stockMapper.updateById(stock); } - //核对记录 + //核对记录 todo +// StockLog stockLog = new StockLog(); +// stockLog.set } } 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 5102e13..e329e25 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StreetService.java +++ b/web/src/main/java/com/zhehekeji/web/service/StreetService.java @@ -11,7 +11,9 @@ import com.zhehekeji.web.pojo.street.StreetVO; import com.zhehekeji.web.service.robotic.NettyClient; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,8 +33,14 @@ public class StreetService { private NettyClient nettyClient; @Transactional(rollbackFor = Exception.class) - @Cacheable(value="street",key = "#street.id") - public Integer add(Street street) { + + @Caching( + put = { + @CachePut(value = {"street"},key = "#street.id"), + @CachePut(value = {"streetByPlcId"},key = "#street.plcId"), + } + ) + public Street add(Street street) { List shelves = check(street); street.setCreateTime(LocalDateTime.now()); street.setUpdateTime(LocalDateTime.now()); @@ -56,11 +64,10 @@ public class StreetService { } }); thread.start(); - - - return street.getId(); + return street; } + @Cacheable(value = "streetByPlc",key = "#plcId") public Street getStreetByPlcId(String plcId) { Street street = streetMapper.getStreetByPlcId(plcId); if (street == null) { @@ -69,11 +76,21 @@ public class StreetService { return street; } - @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = "street",key = "#id") public void del(Integer id) { + Street street = streetMapper.selectById(id); + if(street != null){ + delByPlcId(street.getPlcId()); + } + delByPlcId(street.getPlcId()); streetMapper.deleteById(id); StreetConn.del(id); + } + //只是为了删除缓存 + @CacheEvict(value = "streetByPlcId",key = "#{plcId}") + public void delByPlcId(String plcId){ + return; } public List check(Street street) { @@ -101,8 +118,12 @@ public class StreetService { return shelves; } - @Transactional(rollbackFor = Exception.class) - @CacheEvict(value="street",key="#street.id") + @Caching( + evict = { + @CacheEvict(key="#street.id"), + @CacheEvict(key="#street.plcId"), + } + ) public void edit(Street street) { check(street); try { @@ -112,6 +133,7 @@ public class StreetService { } } + @Cacheable(value = "street",key = "#id") public Street streetById(Integer id) { return streetMapper.selectById(id); } 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 5f1e9b1..c9dceaf 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 @@ -1,8 +1,8 @@ package com.zhehekeji.web.service.ksec; import com.alibaba.fastjson.JSONObject; -import com.zhehekeji.web.service.OrderAction; -import com.zhehekeji.web.service.PlcOrderInfo; +import com.zhehekeji.web.service.GoodsActionTimes; +import com.zhehekeji.web.service.PlcCmdInfo; import com.zhehekeji.web.service.PlcService; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -39,11 +39,11 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { tcpLogger.info("info:{}",body); log.info("receieve info:{}", ksecInfo); KsecDataInfo dataInfo = ksecInfo.getData(); - PlcOrderInfo plcOrderInfo = null; + PlcCmdInfo plcCmdInfo = null; String srmNumber = null; String cmdName = null; if(dataInfo != null){ - plcOrderInfo = new PlcOrderInfo(dataInfo.getSRMNumber(), dataInfo.getTaskId(), dataInfo.getFromAddrType(), dataInfo.getFromRow(), dataInfo.getFromBay(), dataInfo.getFromLevel(), dataInfo.getToAddrType(), dataInfo.getToRow(), dataInfo.getToBay(), dataInfo.getToLevel()); + plcCmdInfo = new PlcCmdInfo(dataInfo.getSRMNumber(), dataInfo.getTaskId(), dataInfo.getFromAddrType(), dataInfo.getFromRow(), dataInfo.getFromBay(), dataInfo.getFromLevel(), dataInfo.getToAddrType(), dataInfo.getToRow(), dataInfo.getToBay(), dataInfo.getToLevel()); srmNumber = dataInfo.getSRMNumber(); cmdName = dataInfo.getCmdName(); } @@ -53,32 +53,38 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { } else if ("B".equals(ksecInfo.getType())) { //任务 if ("B1".equals(cmdName)) { - plcService.orderStart(plcOrderInfo, srmNumber); + plcService.orderStart(plcCmdInfo); } else if ("B2".equals(cmdName)) { - plcService.orderStop(srmNumber, plcOrderInfo.getOrderNum()); + plcService.orderStop(plcCmdInfo); } } else if ("C".equals(ksecInfo.getType())) { //动作 String code = dataInfo.getCmdName(); - log.info("action code,{} plcId:{},orderInfo:{}", code, srmNumber, plcOrderInfo.toString()); - if (code.equals("C1") || code.equals("C2") || code.equals("C3") || code.equals("C4") || code.equals("C5")) { - // C1-5 是执行动作,需要保存执行到第几步了 - Integer times = OrderAction.put(plcOrderInfo.getOrderNum()); + log.info("action code,{},orderInfo:{}", code, plcCmdInfo.toString()); + if (code.equals("C1") || code.equals("C2") || code.equals("C3") || code.equals("C4")) { + //执行动作,需要保存执行到第几步了 + Integer times = GoodsActionTimes.put(plcCmdInfo.getOrderNum()); //执行动作 - plcService.action(plcOrderInfo, srmNumber, times, code); - } else if (code.equals("C7")) { - //旋转360 然后发送C8命令 - plcService.turn360AndC8(srmNumber); - } else { - // 其他命令执行动作 - plcService.action(plcOrderInfo, srmNumber, 1, code); + plcService.action(plcCmdInfo, times, code); + }else { + log.info("other C code :{}",code); } } else if ("D".equals(ksecInfo.getType())) { - //todo 告警 - + String code = dataInfo.getCmdName(); + if(code.equals("D1")){ + log.info("plcId:{},warn start",plcCmdInfo.getPlcId()); + plcService.action(plcCmdInfo,1,code); + plcService.warnStart(plcCmdInfo.getPlcId(),dataInfo.getWarnCode()); + }else if(code.equals("D2")){ + log.info("plcId:{},warn stop",plcCmdInfo.getPlcId()); + plcService.warnStop(plcCmdInfo.getPlcId()); + }else { + log.info("other D code :{}",code); + } } else if ("E".equals(ksecInfo.getType())) { //盘点 - plcService.recordStock(plcOrderInfo, srmNumber, dataInfo.getCode(), 0, 0); + //找到该货位的最后一张照片与现在的照片比照 + plcService.recordStock(plcCmdInfo, srmNumber, 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 dbff7c4..1fea5d2 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 @@ -1,7 +1,7 @@ package com.zhehekeji.web.service.robotic; -import com.zhehekeji.web.service.OrderAction; -import com.zhehekeji.web.service.PlcOrderInfo; +import com.zhehekeji.web.service.GoodsActionTimes; +import com.zhehekeji.web.service.PlcCmdInfo; import com.zhehekeji.web.service.PlcService; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; @@ -66,7 +66,7 @@ public class ProtocolDecoder extends FixedLengthFrameDecoder { short short6 = in.readShort(); short short7 = in.readShort(); short short8 = in.readShort(); - PlcOrderInfo plcOrderInfo = new PlcOrderInfo(plcId, String.valueOf(taskId), (int) short1, (int) short2, (int) short3, (int) short4, (int) short5, (int) short6, (int) short7, (int) short8); + PlcCmdInfo plcCmdInfo = new PlcCmdInfo(plcId, String.valueOf(taskId), (int) short1, (int) short2, (int) short3, (int) short4, (int) short5, (int) short6, (int) short7, (int) short8); byte maohao = in.readByte(); byte leixing = in.readByte(); @@ -97,7 +97,7 @@ public class ProtocolDecoder extends FixedLengthFrameDecoder { log.debug("receive heart plcId:{}", plcId); } else if (type.equals(ORDER)) { if ("B1".equals(code)) { - log.info("order start ,plcId:{},orderInfo:{}", plcId, plcOrderInfo.toString()); + log.info("order start ,plc info:{}", plcCmdInfo.toString()); //根据后四位是否有条码信息来判断随行模式还是盘点模式 if(b5 == 0 && b6 == 0 && b7 ==0 && b8 ==0) { log.info("随行模式"); @@ -105,33 +105,26 @@ public class ProtocolDecoder extends FixedLengthFrameDecoder { log.info("盘点模式"); log.info("Verification mode. Code:{}, box number(system):{}, box number(algorithm):{}", barCodeSys, boxNumSys, boxNumAlgo); } - plcService.orderStart(plcOrderInfo, plcId); + plcService.orderStart(plcCmdInfo); } else if ("B2".equals(code)) { - log.info("order end, plcId:{},orderInfo:{}", plcId, plcOrderInfo.toString()); - plcService.orderStop(plcId, plcOrderInfo.getOrderNum()); + log.info("order end, plcId:{},orderInfo:{}", plcId, plcCmdInfo.toString()); + plcService.orderStop(plcCmdInfo); if(b5 == 0 && b6 == 0 && b7 ==0 && b8 == 0) { log.info("随行模式"); } else { log.info("盘点模式"); log.info("Verification mode. Code er(algorithm):{}", barCodeSys, boxNumSys, boxNumAlgo); - plcService.recordStock(plcOrderInfo,plcId,barCodeSys,boxNumSys,boxNumAlgo); + plcService.recordStock(plcCmdInfo,plcId,barCodeSys,boxNumSys,boxNumAlgo); } } } else if (type.equals(ACTION)) { - log.info("action code,{} plcId:{},orderInfo:{}", code, plcId, plcOrderInfo.toString()); - if(code.equals("C1") || code.equals("C2") || code.equals("C3") || code.equals("C4") || code.equals("C5")){ - // C1-5 是执行动作,需要保存执行到第几步了 - Integer times = OrderAction.put(plcOrderInfo.getOrderNum()); + log.info("action code,{} plcId:{},orderInfo:{}", code, plcId, plcCmdInfo.toString()); + if(code.equals("C1") || code.equals("C2") || code.equals("C3") || code.equals("C4")){ + // 只有取放货的命令 才能增加 times + Integer times = GoodsActionTimes.put(plcCmdInfo.getOrderNum()); //执行动作 - plcService.action(plcOrderInfo, plcId, times, code); - } else if(code.equals("C7")){ - // C7 C8已废除,这里只兼容robotic 试点项目 - //旋转360 然后发送C8命令 - plcService.turn360AndC8(plcId); - }else { - // 其他命令执行动作 - plcService.action(plcOrderInfo, plcId, 1, code); + plcService.action(plcCmdInfo, times, code); } } else if (type.equals(WARN)) { log.info(" warn code:{}", code); @@ -152,7 +145,7 @@ public class ProtocolDecoder extends FixedLengthFrameDecoder { //执行动作 //times = 1 只执行动作 //code 写作"D{warn}" - plcService.action(plcOrderInfo, plcId, 1, "D" + warn); + plcService.action(plcCmdInfo, 1, "D" + warn); } } else if ("D100".equals(code)) { log.info("warn end ,plcId:{}", plcId); diff --git a/web/src/main/resources/application.yml b/web/src/main/resources/application.yml index e889152..35ee836 100644 --- a/web/src/main/resources/application.yml +++ b/web/src/main/resources/application.yml @@ -10,6 +10,8 @@ spring: suffix: .html servlet: path: /api/ + cache: + type: simple mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml #实体扫描,多个package用逗号或者分号分隔 diff --git a/web/src/main/resources/logback-spring.xml b/web/src/main/resources/logback-spring.xml index ffc8110..577c0e1 100644 --- a/web/src/main/resources/logback-spring.xml +++ b/web/src/main/resources/logback-spring.xml @@ -108,6 +108,8 @@ + +