基础版 优化

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

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

@ -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<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接口
// CacheBuilder cacheBuilder = CacheBuilder.newBuilder();
// cacheBuilder.

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

@ -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<Integer> getPtzIdByCodeAndCameraId(String code,Integer cameraId) {
return Result.success(cameraService.getPtzIdByCodeAndCameraId(code,cameraId));
}
@PostMapping("/io/toPtz")
@ApiOperation(value = "转至球机IO配置点")
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.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();
}

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

@ -37,4 +37,7 @@ public class Warn {
@TableField("`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 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;
}

@ -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;

@ -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();

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

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

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

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

@ -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) {

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

@ -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")
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 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();
}
/**
* 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){
CameraIO cameraIO = ioMapper.selectById(ioId);
Assert.notNull(cameraIO,"IO配置不存在");

@ -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<String,Integer> orderActions = new HashMap<>();
private static Map<String, Integer> 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<String,Integer> get(){
public static Map<String, Integer> get() {
return orderActions;
}
}

@ -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) {

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

@ -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<Street> streets = streetMapper.selectByMap(new HashMap<>(0));
List<Integer> connIds = StreetConn.connList();
return (streets.size() - connIds.size());
@ -64,171 +64,238 @@ public class PlcService {
/**
* robotic plcIdplcId,plcIdsrmNumber
* @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<Order>().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<Integer> 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<CameraIO> ioConfigs = ioMapper.selectList(new QueryWrapper<CameraIO>().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<CameraIO> ioConfigs = ioMapper.selectList(new QueryWrapper<CameraIO>().eq("code","C8").eq("camera_id",street.getCamera1Id()));
if (street.getCamera1Id() != null) {
List<CameraIO> ioConfigs = ioMapper.selectList(new QueryWrapper<CameraIO>().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<CameraIO> ioConfigs = ioMapper.selectList(new QueryWrapper<CameraIO>().eq("code","C8").eq("camera_id",street.getCamera2Id()));
if (street.getCamera2Id() != null) {
List<CameraIO> ioConfigs = ioMapper.selectList(new QueryWrapper<CameraIO>().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
}
}

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

@ -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();

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

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

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

Loading…
Cancel
Save