基础版 优化

merge-requests/3/head
qiushui 4 years ago
parent a394004c66
commit 55deeedf78

@ -13,8 +13,9 @@ import java.util.UUID;
public class PathUtil { public class PathUtil {
public static String createFileName(String fileType) { public static String createFileName(String fileType) {
String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd/HH")); LocalDateTime now = LocalDateTime.now();
return time + "/" + UUID.randomUUID() + "."+fileType; String time = now.format(DateTimeFormatter.ofPattern("yyyy/MM/dd/HH"));
return time + "/" + now.format(DateTimeFormatter.ofPattern("mmss"))+UUID.randomUUID() + "."+fileType;
} }
/** /**

@ -2,13 +2,17 @@ package com.zhehekeji.web.config;
import com.github.pagehelper.cache.GuavaCache; import com.github.pagehelper.cache.GuavaCache;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager; import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.concurrent.ConcurrentMapCache;
import org.springframework.cache.support.SimpleCacheManager; import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@Configuration @Configuration
@ -18,6 +22,10 @@ public class CacheConfig {
@Bean @Bean
public CacheManager localCacheManager() { public CacheManager localCacheManager() {
SimpleCacheManager simpleCacheManager = new SimpleCacheManager(); SimpleCacheManager simpleCacheManager = new SimpleCacheManager();
List<Cache> caches = new ArrayList<Cache>();
caches.add(new ConcurrentMapCache("street"));
caches.add(new ConcurrentMapCache("ptz"));
simpleCacheManager.setCaches(caches);
//把各个cache注册到cacheManager中GuavaCache实现了org.springframework.cache.Cache接口 //把各个cache注册到cacheManager中GuavaCache实现了org.springframework.cache.Cache接口
// CacheBuilder cacheBuilder = CacheBuilder.newBuilder(); // CacheBuilder cacheBuilder = CacheBuilder.newBuilder();
// cacheBuilder. // cacheBuilder.

@ -10,10 +10,8 @@ import com.zhehekeji.web.mapper.CameraMapper;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.PostConstruct;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -426,11 +424,12 @@ public class CameraControlController {
@ApiOperation(value = "立即拍照") @ApiOperation(value = "立即拍照")
public Result pic(@PathVariable Integer id) { public Result pic(@PathVariable Integer id) {
checkLogin(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){ if(cameraType == 0){
System.out.println(JoywarePtzControlModule.pic(id,0,orderInfo)); System.out.println(JoywarePtzControlModule.pic(id,0,path));
}else if(cameraType == 1){ }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(); return Result.success();
@ -440,7 +439,7 @@ public class CameraControlController {
@ApiOperation(value = "录像") @ApiOperation(value = "录像")
public Result MP4(@PathVariable Integer id) { public Result MP4(@PathVariable Integer id) {
checkLogin(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(); return Result.success();
} }

@ -102,6 +102,13 @@ public class CameraController {
return Result.success(cameraService.ptz(req.getCameraIOId(),req.getCameraId(),req.getName(),req.getType(),req.getCode())); 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<Integer> getPtzIdByCodeAndCameraId(String code,Integer cameraId) {
return Result.success(cameraService.getPtzIdByCodeAndCameraId(code,cameraId));
}
@PostMapping("/io/toPtz") @PostMapping("/io/toPtz")
@ApiOperation(value = "转至球机IO配置点") @ApiOperation(value = "转至球机IO配置点")
public Result toPtz(@RequestBody CameraIOPtz req) { public Result toPtz(@RequestBody CameraIOPtz req) {

@ -7,7 +7,7 @@ import com.zhehekeji.web.pojo.OrderSaveReq;
import com.zhehekeji.web.pojo.OrderSearch; import com.zhehekeji.web.pojo.OrderSearch;
import com.zhehekeji.web.pojo.OrderVO; import com.zhehekeji.web.pojo.OrderVO;
import com.zhehekeji.web.service.OrderService; 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 com.zhehekeji.web.service.PlcService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -49,16 +49,16 @@ public class OrderController {
@ApiOperation("工单开始信号") @ApiOperation("工单开始信号")
@PostMapping("/start") @PostMapping("/start")
public Result orderStart(@ApiParam("工单号") @RequestBody PlcOrderInfo orderNum, @ApiParam("plc")@RequestParam String plcId){ public Result orderStart(@ApiParam("工单号") @RequestBody PlcCmdInfo plcCmdInfo){
orderNum.setOrderNum(plcId+"_"+orderNum.getTaskId());
plcService.orderStart(orderNum,plcId);
return Result.success(); return Result.success();
} }
@ApiOperation("工单结束信号") @ApiOperation("工单结束信号")
@GetMapping("/stop") @GetMapping("/stop")
public Result orderStop(@ApiParam("工单号") @RequestParam String orderNum,@ApiParam("plc")@RequestParam String plcId){ 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(); return Result.success();
} }

@ -60,7 +60,7 @@ public class PLCController {
@GetMapping("/orderAction") @GetMapping("/orderAction")
@ApiOperation(value = "执行的工单情况") @ApiOperation(value = "执行的工单情况")
public Result<Map> orderAction(){ public Result<Map> orderAction(){
return Result.success(OrderAction.get()); return Result.success(GoodsActionTimes.get());
} }
} }

@ -37,4 +37,7 @@ public class Warn {
@TableField("`signal`") @TableField("`signal`")
private String signal; private String signal;
//发生告警时打断的工单
private Long orderId;
} }

@ -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<Integer, String> 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;
}
}

@ -42,15 +42,7 @@ public class HikLoginModule {
//设置登录超时时间和尝试次数,可选 //设置登录超时时间和尝试次数,可选
int waitTime = 5000; //登录请求响应超时时间设置为5S int waitTime = 5000; //登录请求响应超时时间设置为5S
int tryTimes = 3; //登录时尝试建立链接1次 int tryTimes = 3; //登录时尝试建立链接1次
//netsdk.CLIENT_SetConnectTime(waitTime, tryTimes);
hcNetsdk.NET_DVR_SetConnectTime(waitTime, tryTimes); hcNetsdk.NET_DVR_SetConnectTime(waitTime, tryTimes);
//CaptureReceiveCB captureReceiveCB = SpringContextUtil.getBean(CaptureReceiveCB.class);
//netsdk.CLIENT_SetSnapRevCallBack(captureReceiveCB, null);
return true; return true;
} }

@ -16,9 +16,6 @@ import java.time.LocalDateTime;
*/ */
@Slf4j @Slf4j
public class HikPtzControlModule { 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(); int lUserId = HikLoginModule.CameraConnMap.getConnId(cameraId).intValue();
return HikLoginModule.hcNetsdk.NET_DVR_PTZControl_Other(lUserId, nChannelID, dwPTZCommand, 0); 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) 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); 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); PathUtil.checkDirc(path);
OrderCmdSerial.put(cmdSerial, orderInfo);
int lUserId = HikLoginModule.CameraConnMap.getConnId(cameraId).intValue(); int lUserId = HikLoginModule.CameraConnMap.getConnId(cameraId).intValue();
short wPicSize = 3; short wPicSize = 3;
short wPicQuality = 0; short wPicQuality = 0;
HCNetSDK.NET_DVR_JPEGPARA jpegpara = new HCNetSDK.NET_DVR_JPEGPARA(wPicSize, wPicQuality); 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; return picResult;
} }
@ -251,10 +244,10 @@ public class HikPtzControlModule {
// return LoginModule.hcNetsdk.NET_DVR_CaptureJPEGPicture(CameraConnMap.getConnId(cameraId), nChannelID, jpegpara, ); // 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 //视频结束时间加上5s
end = end.minusMinutes(1); end = end.minusMinutes(1);
start = end.minusSeconds(60); //start = end.minusSeconds(60);
PathUtil.checkDirc(path); PathUtil.checkDirc(path);
//NetSDKLib.NET_TIME startTime = new NetSDKLib.NET_TIME(); //NetSDKLib.NET_TIME startTime = new NetSDKLib.NET_TIME();
//startTime.setTime(start.getYear(), start.getMonthValue(), start.getDayOfMonth(), start.getHour(), start.getMinute(), start.getSecond()); //startTime.setTime(start.getYear(), start.getMonthValue(), start.getDayOfMonth(), start.getHour(), start.getMinute(), start.getSecond());
@ -287,81 +280,10 @@ public class HikPtzControlModule {
if(!ok){ if(!ok){
log.error("download error:{}",HikLoginModule.hcNetsdk.NET_DVR_GetLastError()); 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 name
* @param cameraId ID, * @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) public static void ptz(Integer ptzId, String name, Integer cameraId)
{ {
int dwzCommand = HCNetSDK.SET_PRESET; int dwzCommand = HCNetSDK.SET_PRESET;
@ -387,14 +303,6 @@ public class HikPtzControlModule {
* @param ptzId * @param ptzId
* @param cameraId * @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) public static void toPtz(Integer ptzId, Integer cameraId)
{ {
int dwPTZCommand = HCNetSDK.GOTO_PRESET; int dwPTZCommand = HCNetSDK.GOTO_PRESET;

@ -1,10 +1,7 @@
package com.zhehekeji.web.lib; package com.zhehekeji.web.lib;
import com.zhehekeji.common.util.SpringContextUtil; import com.zhehekeji.common.util.SpringContextUtil;
import com.zhehekeji.web.lib.joyware.CaptureReceiveCB; import com.zhehekeji.web.lib.joyware.*;
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.NetSDKLib.LLong; 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_IN_LOGIN_WITH_HIGHLEVEL_SECURITY;
import com.zhehekeji.web.lib.joyware.NetSDKLib.NET_OUT_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(); 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); public static LLong m_hLoginHandle = new LLong(0);
@ -115,7 +112,7 @@ public class JoywareLoginModule {
public static void attachPTZStatusProc() { public static void attachPTZStatusProc() {
NET_IN_PTZ_STATUS_PROC pIn = new NET_IN_PTZ_STATUS_PROC(); NET_IN_PTZ_STATUS_PROC pIn = new NET_IN_PTZ_STATUS_PROC();
pIn.nChannel = 0; pIn.nChannel = 0;
pIn.cbPTZStatusProc = NET_IN_PTZ_STATUS_PROC.CallBack.CBPTZStatusProcCallBack.getInstance(); pIn.cbPTZStatusProc = CallBack.CBPTZStatusProcCallBack.getInstance();
pIn.write(); pIn.write();
NET_OUT_PTZ_STATUS_PROC pOut = new NET_OUT_PTZ_STATUS_PROC(); NET_OUT_PTZ_STATUS_PROC pOut = new NET_OUT_PTZ_STATUS_PROC();
pOut.write(); pOut.write();

@ -3,7 +3,7 @@ package com.zhehekeji.web.lib;
import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.IntByReference;
import com.zhehekeji.common.util.PathUtil; import com.zhehekeji.common.util.PathUtil;
import com.zhehekeji.core.util.Assert; 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.NetSDKLib;
import com.zhehekeji.web.lib.joyware.ToolKits; import com.zhehekeji.web.lib.joyware.ToolKits;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -18,7 +18,7 @@ import java.time.LocalDateTime;
public class JoywarePtzControlModule { 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); 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(); NetSDKLib.SNAP_PARAMS stuSnapParams = new NetSDKLib.SNAP_PARAMS();
stuSnapParams.Channel = nChannelID; // channel stuSnapParams.Channel = 0; // channel
stuSnapParams.mode = 0; // capture picture mode stuSnapParams.mode = 0; // capture picture mode
stuSnapParams.Quality = 3; // picture quality stuSnapParams.Quality = 3; // picture quality
stuSnapParams.InterSnap = 0; // timer capture picture time interval stuSnapParams.InterSnap = 0; // timer capture picture time interval
stuSnapParams.CmdSerial = OrderCmdSerial.nextSerial(); stuSnapParams.CmdSerial = CaptureCmdSerial.put(realPath);
OrderCmdSerial.put(stuSnapParams.CmdSerial, orderInfo);
IntByReference reserved = new IntByReference(0); IntByReference reserved = new IntByReference(0);
return JoywareLoginModule.netsdk.CLIENT_SnapPictureEx(HikLoginModule.CameraConnMap.getConnId(cameraId), stuSnapParams, reserved); 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 //视频结束时间加上5s
end = end.plusSeconds(5); end = end.plusSeconds(5);
PathUtil.checkDirc(path); PathUtil.checkDirc(path);
@ -259,7 +258,7 @@ public class JoywarePtzControlModule {
download_by_data_type.szSavedFileName = path; download_by_data_type.szSavedFileName = path;
download_by_data_type.emDataType = 3; download_by_data_type.emDataType = 3;
download_by_data_type.emRecordType = 0; download_by_data_type.emRecordType = 0;
download_by_data_type.cbDownLoadPos = mp4ReceiveCB; //download_by_data_type.cbDownLoadPos = mp4ReceiveCB;
download_by_data_type.write(); 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(); 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(); 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); 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) { if (l.longValue() == 0) {
log.error("download error :{}", ToolKits.getErrorCodePrint()); log.error("download error :{}", ToolKits.getErrorCodePrint());
} else {
OrderRealtime.startDownload(l, orderNum);
} }
} }

@ -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<Integer, OrderInfo> 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());
}
}

@ -1,5 +1,7 @@
package com.zhehekeji.web.lib; package com.zhehekeji.web.lib;
import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.service.PlcCmdInfo;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -27,22 +29,46 @@ public class OrderInfo {
*/ */
private Boolean isPre; private Boolean isPre;
/** private Integer leftRight;
* 1: 2 3
*/ public OrderInfo(Street street, PlcCmdInfo plcCmdInfo, Integer times){
// private Integer type; if(street == null){
return;
// @AllArgsConstructor }
// @Getter //拍照,转动 需要知道是哪个货架
// public enum OrderPathType{ //1 判断是左右货架 1:左货架 2右货架
// PUT(1), //判断左右 行列号
// OUTPUT(3),
// GOODS(2), isPre = true;
// if(times % 2 ==0){
// ; isPre = false;
// private Integer type; }
// 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();
}
} }

@ -70,20 +70,4 @@ public class OrderRealtime {
orderMap.remove(streetId); orderMap.remove(streetId);
return orderNum; 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;
}
} }

@ -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);
// }
//
// }
}
}
}

@ -4,6 +4,7 @@ import com.sun.jna.Pointer;
import com.zhehekeji.web.config.ConfigProperties; import com.zhehekeji.web.config.ConfigProperties;
import com.zhehekeji.web.mapper.OrderMapper; import com.zhehekeji.web.mapper.OrderMapper;
import com.zhehekeji.web.mapper.StockMapper; import com.zhehekeji.web.mapper.StockMapper;
import com.zhehekeji.web.service.PlcService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -16,32 +17,26 @@ import java.util.concurrent.TimeUnit;
/** /**
* @Description * @Description
* @Author wangyiming1031@aliyun.com * @Author wangyiming1031@aliyun.com
* @Date 2020/12/14 16:11 * @Date 2020/12/14 16:11
**/ **/
@Component @Component
@Slf4j @Slf4j
public class CaptureReceiveCB implements NetSDKLib.fSnapRev{ public class CaptureReceiveCB implements NetSDKLib.fSnapRev {
@Resource
private OrderMapper orderMapper;
@Resource @Resource
private ConfigProperties configProperties; private ConfigProperties configProperties;
private static String fileType = "jpg"; private static String fileType = "jpg";
@Resource
private StockMapper stockMapper;
/** /**
* 线 * 线
*/ */
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 10, 200, private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 3, 200,
TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10000000)); TimeUnit.MINUTES, new ArrayBlockingQueue<>(10000000));
@Override @Override
public void invoke(NetSDKLib.LLong lLoginID, Pointer pBuf, int RevLen, int EncodeType, int CmdSerial, Pointer dwUser) { 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); threadPoolExecutor.execute(captureRunnable);
} }

@ -2,14 +2,10 @@ package com.zhehekeji.web.lib.joyware;
import com.sun.jna.Pointer; import com.sun.jna.Pointer;
import com.zhehekeji.common.util.PathUtil; import com.zhehekeji.common.util.PathUtil;
import com.zhehekeji.web.entity.Order; import com.zhehekeji.web.lib.CaptureCmdSerial;
import com.zhehekeji.web.entity.Stock;
import com.zhehekeji.web.lib.OrderCmdSerial;
import com.zhehekeji.web.lib.OrderInfo; import com.zhehekeji.web.lib.OrderInfo;
import com.zhehekeji.web.mapper.OrderMapper; import com.zhehekeji.web.service.PlcService;
import com.zhehekeji.web.mapper.StockMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
@ -30,82 +26,25 @@ public class CaptureRunnable implements Runnable {
private Pointer pBuf; private Pointer pBuf;
private OrderMapper orderMapper;
private StockMapper stockMapper;
public CaptureRunnable(int cmdSerial, String fileType, Integer revLen, String mediaPath, public CaptureRunnable(int cmdSerial, String fileType, Integer revLen, String mediaPath,
Pointer pBuf, OrderMapper orderMapper, StockMapper stockMapper) { Pointer pBuf) {
this.CmdSerial = cmdSerial; this.CmdSerial = cmdSerial;
this.fileType = fileType; this.fileType = fileType;
this.RevLen = revLen; this.RevLen = revLen;
this.mediaPath = mediaPath; this.mediaPath = mediaPath;
this.pBuf = pBuf; this.pBuf = pBuf;
this.orderMapper = orderMapper;
this.stockMapper = stockMapper;
} }
@Override @Override
public void run() { public void run() {
OrderInfo orderInfo = OrderCmdSerial.getOrderInfo(CmdSerial); String path = CaptureCmdSerial.getOrderInfo(CmdSerial);
OrderCmdSerial.remove(CmdSerial); if (path != null) {
if (orderInfo != null) {
String path = PathUtil.createFileName(fileType);
String picPath = savePic(pBuf, RevLen, mediaPath + path); String picPath = savePic(pBuf, RevLen, mediaPath + path);
if (picPath == null) { if (picPath == null) {
return; 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; return;
} }
log.warn("no order");
} }
private String savePic(Pointer pBuf, int RevLen, String path) { private String savePic(Pointer pBuf, int RevLen, String path) {

@ -34,79 +34,5 @@ public class NET_IN_PTZ_STATUS_PROC extends NetSDKLib.SdkStructure{
this.dwSize = this.size(); 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);
// }
//
// }
}
}
}
} }

@ -14,4 +14,7 @@ public interface CameraIOMapper extends BaseMapper<CameraIO> {
"left join (select * from camera_io where camera_id = #{cameraId}) io on io.name = t.name order by t.id") "left join (select * from camera_io where camera_id = #{cameraId}) io on io.name = t.name order by t.id")
List<CameraIO> cameraIOs (@Param("cameraId") Integer cameraId); List<CameraIO> cameraIOs (@Param("cameraId") Integer cameraId);
@Select("select * from camera_io where code = #{code} and camera_id = #{cameraId}")
CameraIO getByCodeAndCameraId(String code,Integer cameraId);
} }

@ -19,6 +19,9 @@ import com.zhehekeji.web.pojo.camera.IOImport;
import com.zhehekeji.web.pojo.street.StreetSearch; import com.zhehekeji.web.pojo.street.StreetSearch;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; 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.dao.DuplicateKeyException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -147,31 +150,38 @@ public class CameraService {
* @param IOId * @param IOId
* @param cameraId * @param cameraId
*/ */
@CacheEvict(value = "ptz",key = "#cameraId+'-'+#code")
public synchronized Integer ptz(Integer IOId, Integer cameraId, String name,Integer type,String code) { public synchronized Integer ptz(Integer IOId, Integer cameraId, String name,Integer type,String code) {
Camera camera = cameraMapper.selectById(cameraId); Camera camera = cameraMapper.selectById(cameraId);
Assert.notNull(camera, "球机不存在"); Assert.notNull(camera, "球机不存在");
Integer cameraPtzId = camera.getPtzId() == null ? 0 : camera.getPtzId();
CameraIO cameraIO = null; CameraIO cameraIO = null;
int ptzId = cameraPtzId + 1; int ptzId = 0;
if (IOId == null || IOId == 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 = new CameraIO();
cameraIO.setCameraId(cameraId); cameraIO.setCameraId(camera.getId());
cameraIO.setUpdateTime(LocalDateTime.now()); cameraIO.setUpdateTime(LocalDateTime.now());
cameraIO.setName(name); cameraIO.setName(name);
cameraIO.setPtzId(ptzId); cameraIO.setPtzId(ptzId);
cameraIO.setCode(code); cameraIO.setCode(code);
conver(cameraIO,type); conver(cameraIO,0);
ioMapper.insert(cameraIO); try {
ioMapper.insert(cameraIO);
}catch (DuplicateKeyException e){
Assert.isTrue(false,"code已存在:"+code);
}
camera.setPtzId(ptzId); camera.setPtzId(ptzId);
cameraMapper.updateById(camera); cameraMapper.updateById(camera);
return ptzId;
} else { } else {
//修改 //修改
cameraIO = ioMapper.selectById(IOId); cameraIO = ioMapper.selectById(IOId);
Assert.notNull(cameraIO, "IO不存在"); Assert.notNull(cameraIO, "IO不存在");
//将ptzId赋值为旧的不能用新的负责SDK里面就是新增预置点 //将ptzId赋值为旧的不能用新的
ptzId = cameraIO.getPtzId(); ptzId = cameraIO.getPtzId();
//cameraIO.setPtzId(ptzId);
cameraIO.setUpdateTime(LocalDateTime.now()); cameraIO.setUpdateTime(LocalDateTime.now());
conver(cameraIO,type); conver(cameraIO,type);
ioMapper.updateById(cameraIO); ioMapper.updateById(cameraIO);
@ -185,6 +195,21 @@ public class CameraService {
return cameraIO.getId(); return cameraIO.getId();
} }
/**
* codecaameraId使
* @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){ public Integer getPtzId(Integer ioId){
CameraIO cameraIO = ioMapper.selectById(ioId); CameraIO cameraIO = ioMapper.selectById(ioId);
Assert.notNull(cameraIO,"IO配置不存在"); Assert.notNull(cameraIO,"IO配置不存在");

@ -7,44 +7,46 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
* @Description * @Description
* @Author * @Author
* @Date 2021/1/20 13:54 * @Date 2021/1/20 13:54
**/ **/
@Data @Data
@Slf4j @Slf4j
public class OrderAction { public class GoodsActionTimes {
private static Map<String,Integer> orderActions = new HashMap<>(); private static Map<String, Integer> orderActions = new HashMap<>();
/** /**
* *
* 4 * 4
*
* @param orderNum * @param orderNum
* @return * @return
*/ */
public static Integer put(String orderNum){ public static Integer put(String orderNum) {
synchronized (orderNum.intern()){ //对订单号加锁 统计数量
if(orderActions.get(orderNum) == null){ synchronized (orderNum.intern()) {
orderActions.put(orderNum,1); if (orderActions.get(orderNum) == null) {
orderActions.put(orderNum, 1);
return 1; return 1;
} }
int times = orderActions.get(orderNum); int times = orderActions.get(orderNum);
times++; times++;
//该订单的任务达到4次了不会再有任务了清除缓存 //该订单的任务达到4次了不会再有任务了清除缓存
//具体看取货、放货、货物库内转移的流程 //具体看取货、放货、货物库内转移的流程
if(times >= 4){ if (times >= 4) {
log.info("remove oderNum:{},times:{}",orderNum,times); log.info("remove oderNum:{},times:{}", orderNum, times);
orderActions.remove(orderNum); orderActions.remove(orderNum);
}else { } else {
orderActions.put(orderNum,times); orderActions.put(orderNum, times);
log.info("oderNum:{},times:{}",orderNum,times); log.info("oderNum:{},times:{}", orderNum, times);
} }
return times; return times;
} }
} }
public static Map<String,Integer> get(){ public static Map<String, Integer> get() {
return orderActions; return orderActions;
} }
} }

@ -82,47 +82,6 @@ public class OrderService {
return order.getId(); 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){ public String location(OrderVO orderVO,Street street){
//from to 模型 //from to 模型
if (orderVO.getInOut1() != null && orderVO.getInOut2() != null) { if (orderVO.getInOut1() != null && orderVO.getInOut2() != null) {

@ -7,7 +7,7 @@ import lombok.NoArgsConstructor;
@Data @Data
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class PlcOrderInfo { public class PlcCmdInfo {
/** /**
* Id * Id
@ -56,7 +56,9 @@ public class PlcOrderInfo {
private String orderNum; 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.taskId = taskId;
this.inOut1 = inOut1; this.inOut1 = inOut1;
this.leftRight1 = leftRight1; this.leftRight1 = leftRight1;
@ -66,6 +68,7 @@ public class PlcOrderInfo {
this.leftRight2 = leftRight2; this.leftRight2 = leftRight2;
this.column2 = column2; this.column2 = column2;
this.row2 = row2; this.row2 = row2;
this.plcId = plcId;
this.orderNum = plcId+"_"+taskId; this.orderNum = plcId+"_"+taskId;
} }
} }

@ -10,21 +10,19 @@ import com.zhehekeji.web.pojo.OrderVO;
import com.zhehekeji.web.pojo.stock.StockStatus; import com.zhehekeji.web.pojo.stock.StockStatus;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
/** /**
* @Description plc * @Description plc
* plcId * plcId
* @Author qiushui * @Author qiushui
* @Date 2021/1/19 13:45 * @Date 2021/1/19 13:45
**/ **/
@Service @Service
@Slf4j @Slf4j
@ -50,13 +48,15 @@ public class PlcService {
private CameraIOMapper ioMapper; private CameraIOMapper ioMapper;
@Resource @Resource
private StockService stockService; private StockService stockService;
@Resource
private CameraService cameraService;
/** /**
* *
*/ */
private static String originalPoint = "C6"; private static String originalPoint = "C6";
public Integer plcStatus(){ public Integer plcStatus() {
List<Street> streets = streetMapper.selectByMap(new HashMap<>(0)); List<Street> streets = streetMapper.selectByMap(new HashMap<>(0));
List<Integer> connIds = StreetConn.connList(); List<Integer> connIds = StreetConn.connList();
return (streets.size() - connIds.size()); return (streets.size() - connIds.size());
@ -64,171 +64,238 @@ public class PlcService {
/** /**
* robotic plcIdplcId,plcIdsrmNumber * robotic plcIdplcId,plcIdsrmNumber
* @param plcOrderInfo *
* @param plcId * @param plcCmdInfo
*/ */
public void orderStart(PlcOrderInfo plcOrderInfo,String plcId) { public void orderStart(PlcCmdInfo plcCmdInfo) {
Order order = new Order(); Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId());
order.setOrderNum(plcOrderInfo.getOrderNum()); if (street != null) {
order.setStatus(0); Order order = new Order();
order.setStartTime(LocalDateTime.now()); order.setOrderNum(plcCmdInfo.getOrderNum());
Street street = streetService.getStreetByPlcId(plcId); order.setStatus(0);
if(street != null){ order.setStartTime(LocalDateTime.now());
OrderRealtime.startOrder(street.getId(), plcOrderInfo.getOrderNum());
order.setStreetId(street.getId()); order.setStreetId(street.getId());
order.setInOut1(plcOrderInfo.getInOut1()); order.setInOut1(plcCmdInfo.getInOut1());
order.setLeftRight1(plcOrderInfo.getLeftRight1()); order.setLeftRight1(plcCmdInfo.getLeftRight1());
order.setColumn1(plcOrderInfo.getColumn1()); order.setColumn1(plcCmdInfo.getColumn1());
order.setRow1(plcOrderInfo.getRow1()); order.setRow1(plcCmdInfo.getRow1());
order.setInOut2(plcOrderInfo.getInOut2()); //todo 昆船的项目 ,取货 放货是独立的
order.setLeftRight2(plcOrderInfo.getLeftRight2()); //取货是是不知道放货的位置的所以订单开始的时候只写1位置
order.setColumn2(plcOrderInfo.getColumn2()); //订单结束写2位置
order.setRow2(plcOrderInfo.getRow2());
orderMapper.insert(order); orderMapper.insert(order);
//orderMapper.update(order, new UpdateWrapper<Order>().eq("order_num", orderNum)); OrderRealtime.startOrder(street.getId(), plcCmdInfo.getOrderNum());
} }
} }
/** /**
* //times == 1 ,做动作 *
* //times == 2 ,拍照 *
* //times == 3 ,做动作 *
* //times == 4 ,拍照 *
* @param plcOrderInfo * @param plcCmdInfo
* @param plcId
* @param times
*/ */
public void action(PlcOrderInfo plcOrderInfo,String plcId,Integer times,String code){ public void orderStop(PlcCmdInfo plcCmdInfo) {
Street street = streetService.getStreetByPlcId(plcId); LocalDateTime endTime = LocalDateTime.now();
if(street == null){ Street street = streetMapper.getStreetByPlcId(plcCmdInfo.getPlcId());
if (street == null) {
return; return;
} }
//拍照,转动 需要知道是哪个货架 Order order = orderMapper.getOneByOrderNum(plcCmdInfo.getOrderNum());
//1 判断是左右货架 1:左货架 2右货架 if (order == null) {
//判断左右 行列号 log.error("订单结束信号订单不存在orderNum:{}", plcCmdInfo.getOrderNum());
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);
return; return;
} }
//找到球机IO配置的预置点 OrderRealtime.stopOrder(street.getId());
if(!originalPoint.equals(code)){ Order update = new Order();
if(leftRight == 1){ update.setId(order.getId());
code = code+"-L"; update.setEndTime(endTime);
}else if(leftRight == 2){ if (street.getCamera1Id() != null) {
code = code+"-R"; String path = cameraVideo(street.getCamera1Id(),order.getStartTime(),endTime);
} order.setVideoPath1(path);
} }
log.info("预置点:{}",code); if (street.getCamera2Id() != null) {
//2 得到相应的货架号(目前订单 只支持单伸货架) String path = cameraVideo(street.getCamera2Id(),order.getStartTime(),endTime);
//todo 后面可能会有双伸这里要改plc那里也要改 order.setVideoPath2(path);
String shelveId;
if(leftRight == 1){
shelveId = street.getLeftShelveId();
}else {
shelveId = street.getRightShelveId();
} }
if(StringUtils.isEmpty(shelveId) || row == 0 || column == 0){ orderMapper.updateById(update);
log.error("异常的任务号找不到对应的货架或行列号。orderInfo:{},plcId:{},time:{}",plcOrderInfo.toString(),plcId,times);
}
public void orderStopByWarn(String orderNum){
Order order = orderMapper.getOneByOrderNum(orderNum);
if(order == null){
return; return;
} }
OrderInfo orderInfo = new OrderInfo(0L,plcOrderInfo.getOrderNum(),shelveId,row,column,code,isPre); Order upd = new Order();
// CameraCaptureMap.put(street.getCamera1Id(),orderInfo); upd.setId(order.getId());
// CameraCaptureMap.put(street.getCamera2Id(),orderInfo); upd.setEndTime(LocalDateTime.now());
move(street.getCamera1Id(), street.getCamera2Id(), code); //warn flag
Stock stock = stockMapper.getByShelveIdAndRowColumn(shelveId,row,column); //default 0 : normal
if(stock != null){ upd.setStatus(1);
stock.setStatus(StockStatus.PENDING.getStatus()); orderMapper.updateById(upd);
stockMapper.updateById(stock); }
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)){ return path;
JoywarePtzControlModule.pic(street.getCamera1Id(),0,orderInfo); }
JoywarePtzControlModule.pic(street.getCamera2Id(),0,orderInfo);
/**
* //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 * need take a photo ??
* @param cameraId1 *
* @param cameraId2
* @param code * @param code
* @return
*/ */
public void move(Integer cameraId1,Integer cameraId2,String code){ public Boolean doNeedCaptureByCode(String code) {
List<Integer> cameraIds = new ArrayList<>(); String picCmd = code.substring(0, 2);
if(cameraId1 != null){ if (picCmd.equals("C2") || picCmd.equals("C4")) {
cameraIds.add(cameraId1); return true;
} }
if(cameraId2 != null){ return false;
cameraIds.add(cameraId1); }
}
if(cameraIds.size() == 0){ /**
return; * 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<CameraIO> ioConfigs = ioMapper.selectList(new QueryWrapper<CameraIO>().eq("code",code).in("camera_id",cameraIds)); return path;
ioConfigs.forEach(ioConfig->{ }
if(ioConfig.getPtzId() != null && ioConfig.getPtzId() > 0){
log.info("tp ptz , code:{},cameraId:{}",code,cameraId1); /**
JoywarePtzControlModule.toPtz(ioConfig.getPtzId(),ioConfig.getCameraId()); * 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. * 1.
* 2. * 2.
*
* @param plcId * @param plcId
*/ */
public void warnStart(String plcId,String signal){ public void warnStart(String plcId, String signal) {
Street street = streetService.getStreetByPlcId(plcId); Street street = streetService.getStreetByPlcId(plcId);
if(street == null){ if (street == null) {
return; return;
} }
synchronized (plcId.intern()){ synchronized (plcId.intern()) {
//新增 告警 //新增 告警
if(OrderRealtime.getWarnId(street.getId()) == null){ if (OrderRealtime.getWarnId(street.getId()) != null) {
//不存在正在执行的告警记录,就新增 log.debug("{}:exist warn", plcId);
Warn warn = new Warn(); return;
warn.setStartTime(LocalDateTime.now()); }
warn.setStreetId(street.getId()); //不存在正在执行的告警记录,就新增
String orderNum = OrderRealtime.getOrderByStreetId(street.getId()); Warn warn = new Warn();
if(StringUtils.isEmpty(orderNum)){ warn.setStartTime(LocalDateTime.now());
//空的 说明没有正在执行的订单 warn.setStreetId(street.getId());
log.debug("{}:warn.... no order",plcId); String orderNum = OrderRealtime.getOrderByStreetId(street.getId());
}else { if (StringUtils.isEmpty(orderNum)) {
//不为空的话,填写工单的位置 log.debug("{}:warn start...., but no order running", plcId);
Order order = orderMapper.getOneByOrderNum(orderNum); } else {
if(order != null){ //不为空的话,填写工单的位置
OrderVO orderVO = new OrderVO(); Order order = orderMapper.getOneByOrderNum(orderNum);
BeanUtils.copyProperties(order,orderVO); if (order != null) {
String location = orderService.location(orderVO,street); //stop the order
warn.setLocation(location); log.debug("plcId:{},warn start and stop the order",plcId);
log.debug("{}:warn.... exist 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 * @param plcId
*/ */
public void warnStop(String plcId){ public void warnStop(String plcId) {
Street street = streetMapper.getStreetByPlcId(plcId); Street street = streetMapper.getStreetByPlcId(plcId);
if(street == null){ if (street == null) {
return; return;
} }
synchronized (plcId.intern()){ synchronized (plcId.intern()) {
//是否存在未结束的订单 Long warnId = OrderRealtime.getWarnId(street.getId());
String orderNum = OrderRealtime.getOrderByStreetId(street.getId()); if (warnId != null) {
if(!StringUtils.isEmpty(orderNum)){ //存在告警
//存在未结束的订单 //先内存中清除该告警
//清了订单缓存,结束订单 OrderRealtime.cleanWarn(street.getId());
OrderRealtime.stopOrder(street.getId()); Warn warn = warnMapper.selectById(warnId);
orderService.orderStop(orderNum,street,Boolean.TRUE); if (warn != null) {
}else { //结束该告警,并录像
//没有未结束的订单 warn.setEndTime(LocalDateTime.now());
//是否有告警 if (street.getCamera1Id() != null) {
Long warnId = OrderRealtime.getWarnId(street.getId()); String path = cameraVideo(street.getCamera1Id(),warn.getStartTime(),LocalDateTime.now());
if(warnId != null){ warn.setVideoPath1(path);
//存在告警
//先内存中清除该告警
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);
} }
if (street.getCamera2Id() != null) {
String path = cameraVideo(street.getCamera1Id(),warn.getStartTime(),LocalDateTime.now());
warn.setVideoPath2(path);
}
warnMapper.updateById(warn);
} }
} }
} }
} }
/** /**
* * capture ,and update the picture path in order and stock
* *
* * @param orderInfo
* @param plcId * @param path
* @param orderNum
*/ */
public void orderStop(String plcId,String orderNum){ public void captureUpdateOrderAndStock(OrderInfo orderInfo, String path) {
Street street = streetMapper.getStreetByPlcId(plcId); synchronized (orderInfo.getOrderNum().intern()) {
if(street == null){ Order order = orderMapper.getOneByOrderNum(orderInfo.getOrderNum());
return; if (order != null) {
} //update picPath in stock
synchronized (plcId.intern()){ Stock stock = stockMapper.getByShelveIdAndRowColumn(orderInfo.getShelveId(), orderInfo.getRow(), orderInfo.getColumn());
orderService.orderStop(orderNum,street,Boolean.FALSE); if (stock == null) {
OrderRealtime.stopOrder(street.getId()); 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 * 360,C8
* *
* @Param ptzId 360
* @param plcId * @param plcId
* @Param ptzId 360
*/ */
public void turn360AndC8(String plcId){ public void turn360AndC8(String plcId) {
Street street = streetMapper.getStreetByPlcId(plcId); Street street = streetMapper.getStreetByPlcId(plcId);
if(street == null){ if (street == null) {
return; return;
} }
if(street.getCamera1Id() != null){ if (street.getCamera1Id() != null) {
List<CameraIO> ioConfigs = ioMapper.selectList(new QueryWrapper<CameraIO>().eq("code","C8").eq("camera_id",street.getCamera1Id())); List<CameraIO> ioConfigs = ioMapper.selectList(new QueryWrapper<CameraIO>().eq("code", "C8").eq("camera_id", street.getCamera1Id()));
Integer ptzId = null; Integer ptzId = null;
if(ioConfigs.size() > 0){ if (ioConfigs.size() > 0) {
ptzId = ioConfigs.get(0).getPtzId(); ptzId = ioConfigs.get(0).getPtzId();
} }
JoywarePtzControlModule.turn360C8(street.getCamera1Id(),ptzId); JoywarePtzControlModule.turn360C8(street.getCamera1Id(), ptzId);
} }
if(street.getCamera2Id() != null) { if (street.getCamera2Id() != null) {
List<CameraIO> ioConfigs = ioMapper.selectList(new QueryWrapper<CameraIO>().eq("code","C8").eq("camera_id",street.getCamera2Id())); List<CameraIO> ioConfigs = ioMapper.selectList(new QueryWrapper<CameraIO>().eq("code", "C8").eq("camera_id", street.getCamera2Id()));
Integer ptzId = null; Integer ptzId = null;
if(ioConfigs.size() > 0){ if (ioConfigs.size() > 0) {
ptzId = ioConfigs.get(0).getPtzId(); ptzId = ioConfigs.get(0).getPtzId();
} }
JoywarePtzControlModule.turn360C8(street.getCamera2Id(),ptzId); JoywarePtzControlModule.turn360C8(street.getCamera2Id(), ptzId);
} }
} }
/** /**
* *
* @param plcOrderInfo *
* @param plcCmdInfo
* @param plcId * @param plcId
* @param barCodeSys * @param barCodeSys
* @param boxNumSys * @param boxNumSys
* @param boxNumAlgo * @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); Street street = streetService.getStreetByPlcId(plcId);
if(street == null){ if (street == null) {
return; return;
} }
//判断左右 行列号 //判断左右 行列号
Integer leftRight = plcOrderInfo.getLeftRight2(); Integer leftRight = plcCmdInfo.getLeftRight2();
String shelveId; String shelveId;
if(leftRight == 1){ if (leftRight == 1) {
shelveId = street.getLeftShelveId(); shelveId = street.getLeftShelveId();
}else { } else {
shelveId = street.getRightShelveId(); shelveId = street.getRightShelveId();
} }
Stock stock = stockMapper.getByShelveIdAndRowColumn(shelveId,plcOrderInfo.getRow2(),plcOrderInfo.getColumn2()); Stock stock = stockMapper.getByShelveIdAndRowColumn(shelveId, plcCmdInfo.getRow2(), plcCmdInfo.getColumn2());
if(stock != null) { if (stock != null) {
stock.setCategory(barCodeSys); stock.setCategory(barCodeSys);
stock.setCount(boxNumSys); stock.setCount(boxNumSys);
String prevFile = configProperties.getSavePath().getMediaPath()+stock.getPreoperationPic(); String prevFile = configProperties.getSavePath().getMediaPath() + stock.getPreoperationPic();
String overFile = configProperties.getSavePath().getMediaPath()+stock.getOveroperationPic(); String overFile = configProperties.getSavePath().getMediaPath() + stock.getOveroperationPic();
String code = BarCodeScan.detectBestBarCode(overFile); String code = BarCodeScan.detectBestBarCode(overFile);
if(boxNumSys == boxNumAlgo && code.equals(barCodeSys)) { if (boxNumSys == boxNumAlgo && code.equals(barCodeSys)) {
stock.setStatus(StockStatus.SUCCESS.getStatus()); stock.setStatus(StockStatus.SUCCESS.getStatus());
log.info("核对正确"); log.info("核对正确");
stockMapper.updateById(stock); stockMapper.updateById(stock);
}else { } else {
log.info("核对失败"); log.info("核对失败");
stock.setStatus(StockStatus.ERROR.getStatus()); stock.setStatus(StockStatus.ERROR.getStatus());
stockMapper.updateById(stock); stockMapper.updateById(stock);
} }
//核对记录 //核对记录 todo
// StockLog stockLog = new StockLog();
// stockLog.set
} }
} }

@ -11,7 +11,9 @@ import com.zhehekeji.web.pojo.street.StreetVO;
import com.zhehekeji.web.service.robotic.NettyClient; import com.zhehekeji.web.service.robotic.NettyClient;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -31,8 +33,14 @@ public class StreetService {
private NettyClient nettyClient; private NettyClient nettyClient;
@Transactional(rollbackFor = Exception.class) @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<String> shelves = check(street); List<String> shelves = check(street);
street.setCreateTime(LocalDateTime.now()); street.setCreateTime(LocalDateTime.now());
street.setUpdateTime(LocalDateTime.now()); street.setUpdateTime(LocalDateTime.now());
@ -56,11 +64,10 @@ public class StreetService {
} }
}); });
thread.start(); thread.start();
return street;
return street.getId();
} }
@Cacheable(value = "streetByPlc",key = "#plcId")
public Street getStreetByPlcId(String plcId) { public Street getStreetByPlcId(String plcId) {
Street street = streetMapper.getStreetByPlcId(plcId); Street street = streetMapper.getStreetByPlcId(plcId);
if (street == null) { if (street == null) {
@ -69,11 +76,21 @@ public class StreetService {
return street; return street;
} }
@Transactional(rollbackFor = Exception.class) @CacheEvict(value = "street",key = "#id")
public void del(Integer id) { public void del(Integer id) {
Street street = streetMapper.selectById(id);
if(street != null){
delByPlcId(street.getPlcId());
}
delByPlcId(street.getPlcId());
streetMapper.deleteById(id); streetMapper.deleteById(id);
StreetConn.del(id); StreetConn.del(id);
}
//只是为了删除缓存
@CacheEvict(value = "streetByPlcId",key = "#{plcId}")
public void delByPlcId(String plcId){
return;
} }
public List<String> check(Street street) { public List<String> check(Street street) {
@ -101,8 +118,12 @@ public class StreetService {
return shelves; return shelves;
} }
@Transactional(rollbackFor = Exception.class) @Caching(
@CacheEvict(value="street",key="#street.id") evict = {
@CacheEvict(key="#street.id"),
@CacheEvict(key="#street.plcId"),
}
)
public void edit(Street street) { public void edit(Street street) {
check(street); check(street);
try { try {
@ -112,6 +133,7 @@ public class StreetService {
} }
} }
@Cacheable(value = "street",key = "#id")
public Street streetById(Integer id) { public Street streetById(Integer id) {
return streetMapper.selectById(id); return streetMapper.selectById(id);
} }

@ -1,8 +1,8 @@
package com.zhehekeji.web.service.ksec; package com.zhehekeji.web.service.ksec;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhehekeji.web.service.OrderAction; import com.zhehekeji.web.service.GoodsActionTimes;
import com.zhehekeji.web.service.PlcOrderInfo; import com.zhehekeji.web.service.PlcCmdInfo;
import com.zhehekeji.web.service.PlcService; import com.zhehekeji.web.service.PlcService;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
@ -39,11 +39,11 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
tcpLogger.info("info:{}",body); tcpLogger.info("info:{}",body);
log.info("receieve info:{}", ksecInfo); log.info("receieve info:{}", ksecInfo);
KsecDataInfo dataInfo = ksecInfo.getData(); KsecDataInfo dataInfo = ksecInfo.getData();
PlcOrderInfo plcOrderInfo = null; PlcCmdInfo plcCmdInfo = null;
String srmNumber = null; String srmNumber = null;
String cmdName = null; String cmdName = null;
if(dataInfo != 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(); srmNumber = dataInfo.getSRMNumber();
cmdName = dataInfo.getCmdName(); cmdName = dataInfo.getCmdName();
} }
@ -53,32 +53,38 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
} else if ("B".equals(ksecInfo.getType())) { } else if ("B".equals(ksecInfo.getType())) {
//任务 //任务
if ("B1".equals(cmdName)) { if ("B1".equals(cmdName)) {
plcService.orderStart(plcOrderInfo, srmNumber); plcService.orderStart(plcCmdInfo);
} else if ("B2".equals(cmdName)) { } else if ("B2".equals(cmdName)) {
plcService.orderStop(srmNumber, plcOrderInfo.getOrderNum()); plcService.orderStop(plcCmdInfo);
} }
} else if ("C".equals(ksecInfo.getType())) { } else if ("C".equals(ksecInfo.getType())) {
//动作 //动作
String code = dataInfo.getCmdName(); String code = dataInfo.getCmdName();
log.info("action code,{} plcId:{},orderInfo:{}", code, srmNumber, plcOrderInfo.toString()); log.info("action code,{},orderInfo:{}", code, plcCmdInfo.toString());
if (code.equals("C1") || code.equals("C2") || code.equals("C3") || code.equals("C4") || code.equals("C5")) { if (code.equals("C1") || code.equals("C2") || code.equals("C3") || code.equals("C4")) {
// C1-5 是执行动作,需要保存执行到第几步了 //执行动作,需要保存执行到第几步了
Integer times = OrderAction.put(plcOrderInfo.getOrderNum()); Integer times = GoodsActionTimes.put(plcCmdInfo.getOrderNum());
//执行动作 //执行动作
plcService.action(plcOrderInfo, srmNumber, times, code); plcService.action(plcCmdInfo, times, code);
} else if (code.equals("C7")) { }else {
//旋转360 然后发送C8命令 log.info("other C code :{}",code);
plcService.turn360AndC8(srmNumber);
} else {
// 其他命令执行动作
plcService.action(plcOrderInfo, srmNumber, 1, code);
} }
} else if ("D".equals(ksecInfo.getType())) { } 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())) { } else if ("E".equals(ksecInfo.getType())) {
//盘点 //盘点
plcService.recordStock(plcOrderInfo, srmNumber, dataInfo.getCode(), 0, 0); //找到该货位的最后一张照片与现在的照片比照
plcService.recordStock(plcCmdInfo, srmNumber, dataInfo.getCode(), 0, 0);
} }
} }
in.release(); in.release();

@ -1,7 +1,7 @@
package com.zhehekeji.web.service.robotic; package com.zhehekeji.web.service.robotic;
import com.zhehekeji.web.service.OrderAction; import com.zhehekeji.web.service.GoodsActionTimes;
import com.zhehekeji.web.service.PlcOrderInfo; import com.zhehekeji.web.service.PlcCmdInfo;
import com.zhehekeji.web.service.PlcService; import com.zhehekeji.web.service.PlcService;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
@ -66,7 +66,7 @@ public class ProtocolDecoder extends FixedLengthFrameDecoder {
short short6 = in.readShort(); short short6 = in.readShort();
short short7 = in.readShort(); short short7 = in.readShort();
short short8 = 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 maohao = in.readByte();
byte leixing = in.readByte(); byte leixing = in.readByte();
@ -97,7 +97,7 @@ public class ProtocolDecoder extends FixedLengthFrameDecoder {
log.debug("receive heart plcId:{}", plcId); log.debug("receive heart plcId:{}", plcId);
} else if (type.equals(ORDER)) { } else if (type.equals(ORDER)) {
if ("B1".equals(code)) { 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) { if(b5 == 0 && b6 == 0 && b7 ==0 && b8 ==0) {
log.info("随行模式"); log.info("随行模式");
@ -105,33 +105,26 @@ public class ProtocolDecoder extends FixedLengthFrameDecoder {
log.info("盘点模式"); log.info("盘点模式");
log.info("Verification mode. Code:{}, box number(system):{}, box number(algorithm):{}", barCodeSys, boxNumSys, boxNumAlgo); 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)) { } else if ("B2".equals(code)) {
log.info("order end, plcId:{},orderInfo:{}", plcId, plcOrderInfo.toString()); log.info("order end, plcId:{},orderInfo:{}", plcId, plcCmdInfo.toString());
plcService.orderStop(plcId, plcOrderInfo.getOrderNum()); plcService.orderStop(plcCmdInfo);
if(b5 == 0 && b6 == 0 && b7 ==0 && b8 == 0) { if(b5 == 0 && b6 == 0 && b7 ==0 && b8 == 0) {
log.info("随行模式"); log.info("随行模式");
} else { } else {
log.info("盘点模式"); log.info("盘点模式");
log.info("Verification mode. Code er(algorithm):{}", barCodeSys, boxNumSys, boxNumAlgo); 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)) { } else if (type.equals(ACTION)) {
log.info("action code,{} plcId:{},orderInfo:{}", code, plcId, plcOrderInfo.toString()); log.info("action code,{} plcId:{},orderInfo:{}", code, plcId, plcCmdInfo.toString());
if(code.equals("C1") || code.equals("C2") || code.equals("C3") || code.equals("C4") || code.equals("C5")){ if(code.equals("C1") || code.equals("C2") || code.equals("C3") || code.equals("C4")){
// C1-5 是执行动作,需要保存执行到第几步了 // 只有取放货的命令 才能增加 times
Integer times = OrderAction.put(plcOrderInfo.getOrderNum()); Integer times = GoodsActionTimes.put(plcCmdInfo.getOrderNum());
//执行动作 //执行动作
plcService.action(plcOrderInfo, plcId, times, code); plcService.action(plcCmdInfo, times, code);
} else if(code.equals("C7")){
// C7 C8已废除这里只兼容robotic 试点项目
//旋转360 然后发送C8命令
plcService.turn360AndC8(plcId);
}else {
// 其他命令执行动作
plcService.action(plcOrderInfo, plcId, 1, code);
} }
} else if (type.equals(WARN)) { } else if (type.equals(WARN)) {
log.info(" warn code:{}", code); log.info(" warn code:{}", code);
@ -152,7 +145,7 @@ public class ProtocolDecoder extends FixedLengthFrameDecoder {
//执行动作 //执行动作
//times = 1 只执行动作 //times = 1 只执行动作
//code 写作"D{warn}" //code 写作"D{warn}"
plcService.action(plcOrderInfo, plcId, 1, "D" + warn); plcService.action(plcCmdInfo, 1, "D" + warn);
} }
} else if ("D100".equals(code)) { } else if ("D100".equals(code)) {
log.info("warn end ,plcId:{}", plcId); log.info("warn end ,plcId:{}", plcId);

@ -10,6 +10,8 @@ spring:
suffix: .html suffix: .html
servlet: servlet:
path: /api/ path: /api/
cache:
type: simple
mybatis-plus: mybatis-plus:
mapper-locations: classpath*:mapper/**/*.xml mapper-locations: classpath*:mapper/**/*.xml
#实体扫描多个package用逗号或者分号分隔 #实体扫描多个package用逗号或者分号分隔

@ -108,6 +108,8 @@
<appender-ref ref="tcpAppender"/> <appender-ref ref="tcpAppender"/>
</logger> </logger>
<logger name="com.zhehekeji.web.mapper" level="DEBUG" />
<!--info和error分开打印ERROR > WARN > INFO > DEBUG > TRACE--> <!--info和error分开打印ERROR > WARN > INFO > DEBUG > TRACE-->
<root level="INFO"> <root level="INFO">
<appender-ref ref="CONSOLE"/> <appender-ref ref="CONSOLE"/>

Loading…
Cancel
Save