Merge branch 'liuzhou-yancao' into 'master'

Liuzhou yancao

See merge request duoji/backend-duoji-monitor!6
merge-requests/7/head
wang.yiming 4 years ago
commit f3b5cfa730

@ -51,6 +51,17 @@ public class ConfigProperties {
private Long delayCaptureTime;
private Long runningDelayCaptureTime;
private Long C1DelayCaptureTime;
private Long C2DelayCaptureTime;
private Long C2OutDelayCaptureTime;
private Long C3DelayCaptureTime;
private Long C4DelayCaptureTime;
private Long C4OutDelayCaptureTime;
private Long B2DelayTime;
private Long B2OutDelayTime;
private Long delayDownloadMp4;
}

@ -323,7 +323,8 @@ public class CameraControlController {
@ApiOperation(value = "录像")
public Result MP4(@PathVariable Integer id) {
checkLogin(id);
cameraControlModule.downloadMp4(id,"D:\\work\\"+LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+".mp4", LocalDateTime.now().minusMinutes(10),LocalDateTime.now().minusMinutes(8));
LocalDateTime localDateTime = LocalDateTime.of(2022,7,21,8,20);
cameraControlModule.downloadMp4(id,"E:\\work\\"+localDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+".mp4", localDateTime,localDateTime.plusMinutes(3));
return Result.success();
}

@ -3,12 +3,16 @@ package com.zhehekeji.web.controller;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonParser;
import com.github.pagehelper.PageInfo;
import com.sun.jna.ptr.IntByReference;
import com.zhehekeji.common.util.ValidatorUtil;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.entity.Camera;
import com.zhehekeji.web.entity.CameraIO;
import com.zhehekeji.web.entity.CameraIOConfig;
import com.zhehekeji.web.lib.CameraConnMap;
import com.zhehekeji.web.lib.CameraControlModule;
import com.zhehekeji.web.lib.joyware.JoywareLoginModuleImpl;
import com.zhehekeji.web.lib.joyware.NetSDKLib;
import com.zhehekeji.web.pojo.camera.CameraConfigSearchReq;
import com.zhehekeji.web.pojo.camera.CameraIOPtz;
import com.zhehekeji.web.pojo.street.StreetSearch;
@ -133,6 +137,25 @@ public class CameraController {
return Result.success();
}
@PostMapping("/{cameraId}/io/xy")
@ApiOperation(value = "获取球机的当前位置坐标")
public Result xy(@PathVariable Integer cameraId) {
NetSDKLib.NET_PTZ_LOCATION_INFO ptzLocationInfo = new NetSDKLib.NET_PTZ_LOCATION_INFO();
IntByReference intRetLen = new IntByReference();
int nType = NetSDKLib.NET_DEVSTATE_PTZ_LOCATION;
ptzLocationInfo.write();
boolean bRet = JoywareLoginModuleImpl.netsdk.CLIENT_QueryDevState(CameraConnMap.getConnId(cameraId), nType, ptzLocationInfo.getPointer(), ptzLocationInfo.size(), intRetLen, 3000);
ptzLocationInfo.read();
String s = "水平:%d,垂直:%d";
if (bRet) {
String ss = String.format(s,ptzLocationInfo.nPTZPan,ptzLocationInfo.nPTZTilt);
log.info(ss);
return Result.success(ss);
}
return Result.success(s);
}
@GetMapping("/downloadConfig")
@ApiOperation(value = "视频直播配置")
public Result downloadConfig() throws IOException {

@ -10,6 +10,7 @@ import com.zhehekeji.web.pojo.stock.*;
import com.zhehekeji.web.service.StockService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -27,6 +28,7 @@ import java.util.Map;
@Api(value = "Stock", tags = "库存管理")
@RestController
@RequestMapping("/stock")
@Slf4j
public class StockController {
@Resource
@ -87,7 +89,7 @@ public class StockController {
OutputStream os = response.getOutputStream();
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("盘点" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")), "UTF-8");
String fileName = URLEncoder.encode("盘点" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")), "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
List<StockExportExcel> excels = stockService.exportExcels(streetId);
EasyExcel.write(os, StockExportExcel.class).sheet().doWrite(excels);
@ -99,7 +101,7 @@ public class StockController {
OutputStream os = response.getOutputStream();
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("全部巷道盘点结果" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")), "UTF-8");
String fileName = URLEncoder.encode("全部巷道盘点结果" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")), "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
List<StockExportExcel> excels = stockService.exportAllExcels();
EasyExcel.write(os, StockExportExcel.class).sheet().doWrite(excels);
@ -115,8 +117,13 @@ public class StockController {
@ApiOperation(value = "获取盘点信息")
@RequestMapping(value = "/checkInfo", method = RequestMethod.POST)
public Result<Stock> checkInfo(@RequestBody StockCheckSearch stockCheck) {
int a = Integer.valueOf(stockCheck.getSRMNumber());
String ss = String.format("%03d", a);
stockCheck.setSRMNumber(ss);
validatorUtil.validate(stockCheck);
Stock stock = new Stock();
log.info("stockCheck:{}",stockCheck);
Stock stock = stockService.stock(stockCheck);
log.info("stockCheck:res:{}",stock);
return Result.success(stock);
}
@ -134,4 +141,14 @@ public class StockController {
return Result.success(stockService.checkByMan(checkByMan));
}
public static void main(String[] args) {
String s = "4";
String ss = String.format("%03d", 4);
System.out.println(ss);
String bb = "10";
String bbb = String.format("%03d", 10);
System.out.println(bbb);
}
}

@ -77,6 +77,7 @@ public class StreetController {
}
@GetMapping("/lightSource/open")
@ApiOperation(value = "开启光源")
public Result openLightSource(){
@ -124,6 +125,46 @@ public class StreetController {
return Result.success();
}
@GetMapping("/lightSource/open/{streetId}")
@ApiOperation(value = "开启单个巷道光源")
public Result openStreetLightSource(@PathVariable Integer streetId){
List<LightSource> lightSources = lightSourceService.getLightSourceByStreetId(streetId);
lightSources.forEach(lightSource -> {
if(configProperties.getLightSource().getType() == 1){
JYDAMEquip equip = JYDamHelper.Connect(lightSource.getIp(),lightSource.getPort());
JYDamHelper.openDO(equip,configProperties.getLightSource().getIndex());
Integer status = JYDamHelper.ReadStatus(equip,configProperties.getLightSource().getNum(),configProperties.getLightSource().getIndex());
log.info("ip:{},status:{}",lightSource.getIp(),status);
equip.DisConnect();
}else if(configProperties.getLightSource().getType() == 2){
HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),1);
}
});
return Result.success();
}
@GetMapping("/lightSource/close/{streetId}")
@ApiOperation(value = "关闭单个巷道光源")
public Result closeStreetLightSource(@PathVariable Integer streetId){
List<LightSource> lightSources = lightSourceService.getLightSourceByStreetId(streetId);
lightSources.forEach(lightSource -> {
if(configProperties.getLightSource().getType() == 1){
JYDAMEquip equip = JYDamHelper.Connect(lightSource.getIp(),lightSource.getPort());
JYDamHelper.closeDO(equip,configProperties.getLightSource().getIndex());
Integer status = JYDamHelper.ReadStatus(equip,configProperties.getLightSource().getNum(),configProperties.getLightSource().getIndex());
log.info("ip:{},status:{}",lightSource.getIp(),status);
equip.DisConnect();
}else if(configProperties.getLightSource().getType() == 2){
HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),0);
}
});
return Result.success();
}

@ -35,6 +35,7 @@ public class Camera {
private String status;
private Integer rtcServerPort;
@ApiModelProperty(value = "预置点 增长值",hidden = true)
private Integer ptzId;

@ -28,6 +28,7 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule {
*
*/
public boolean ptzControlUpStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
log.info("up start");
return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL,
lParam1, lParam2, 0, 0);
@ -35,6 +36,7 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule {
}
public boolean ptzControlUpEnd(Integer cameraId, int nChannelID) {
log.info("up end");
return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL,
0, 0, 0, 1);
@ -44,12 +46,14 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule {
*
*/
public boolean ptzControlDownStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
log.info("down start");
return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL,
lParam1, lParam2, 0, 0);
}
public boolean ptzControlDownEnd(Integer cameraId, int nChannelID) {
log.info("down end");
return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL,
0, 0, 0, 1);
@ -59,12 +63,14 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule {
*
*/
public boolean ptzControlLeftStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
log.info("left start");
return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL,
lParam1, lParam2, 0, 0);
}
public boolean ptzControlLeftEnd(Integer cameraId, int nChannelID) {
log.info("left end");
return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL,
0, 0, 0, 1);
@ -74,12 +80,14 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule {
*
*/
public boolean ptzControlRightStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
log.info("right start");
return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL,
lParam1, lParam2, 0, 0);
}
public boolean ptzControlRightEnd(Integer cameraId, int nChannelID) {
log.info("right end");
return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL,
0, 0, 0, 1);
@ -89,12 +97,14 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule {
*
*/
public boolean ptzControlLeftUpStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
log.info("up left start");
return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP,
lParam1, lParam2, 0, 0);
}
public boolean ptzControlLeftUpEnd(Integer cameraId, int nChannelID) {
log.info("up left end");
return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP,
0, 0, 0, 1);
@ -104,12 +114,14 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule {
*
*/
public boolean ptzControlRightUpStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
log.info("up right start");
return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTTOP,
lParam1, lParam2, 0, 0);
}
public boolean ptzControlRightUpEnd(Integer cameraId, int nChannelID) {
log.info("up right end");
return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTTOP,
0, 0, 0, 1);
@ -119,6 +131,7 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule {
*
*/
public boolean ptzControlLeftDownStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
log.info(" left down start");
Boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN,
lParam1, lParam2, 0, 0);
@ -129,6 +142,7 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule {
}
public boolean ptzControlLeftDownEnd(Integer cameraId, int nChannelID) {
log.info(" left down end");
return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN,
0, 0, 0, 1);
@ -138,12 +152,14 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule {
*
*/
public boolean ptzControlRightDownStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
log.info(" right down start");
return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTDOWN,
lParam1, lParam2, 0, 0);
}
public boolean ptzControlRightDownEnd(Integer cameraId, int nChannelID) {
log.info(" right down end");
return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTDOWN,
0, 0, 0, 1);
@ -276,10 +292,10 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule {
NetSDKLib.LLong l = JoywareLoginModuleImpl.netsdk.CLIENT_DownloadByDataType(CameraConnMap.getConnId(cameraId), download_by_data_type.getPointer(), net_out_download_by_data_type.getPointer(), 8000);
if(l.longValue() != 0){
log.info("start download mp4 path:{},startTime:{} ,endTime:{},now:{},status:{}", path, start, end, LocalDateTime.now(),l.longValue());
log.info("start download mp4 path:{},startTime:{} ,endTime:{},now:{},status:{},cameraId:{}", path, start, end, LocalDateTime.now(),l.longValue(),cameraId);
}else {
log.error("download mp4 error:{},startTime:{} ,endTime:{}",ToolKits.getErrorCodePrint(),start,end);
log.error("download mp4 error:{},startTime:{} ,endTime:{},cameraId:{}",ToolKits.getErrorCodePrint(),start,end,cameraId);
}
}
@ -306,6 +322,7 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule {
* @param cameraId
*/
public void toPtz(Integer ptzId, Integer cameraId) {
log.info("to ptz,ptzId:{},cameraId:{}",ptzId,cameraId);
int dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_MOVE_CONTROL;
Boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId), 0, dwPTZCommand, 0, ptzId, 0, 0, null);
if (!ok) {

@ -7,7 +7,7 @@ import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Data
public class StockCheckSearch {
public class StockCheckSearch {
@NotEmpty(message = "巷道标识符不能为空")
@ApiModelProperty("巷道标识符")

@ -11,12 +11,15 @@ public class StockExportExcel {
@ExcelProperty(index = 0, value = "巷道名称")
private String streetName;
@ExcelProperty(index = 6, value = "盘点批次号")
@ExcelProperty(index = 7, value = "盘点批次号")
private String lotnum;
@ExcelProperty(index = 4, value = "条码")
private String code;
@ExcelProperty(index = 5, value = "WMS条码")
private String wmsCode;
@ExcelProperty(index = 1, value = "货架号")
private String shelveId;
@ -29,10 +32,10 @@ public class StockExportExcel {
@ExcelProperty(index = 3, value = "列")
private Integer column;
@ExcelProperty(index = 5, value = "盘点结果", converter = StockStatusConvert.class)
@ExcelProperty(index = 6, value = "盘点结果", converter = StockStatusConvert.class)
private Integer status;
@ExcelProperty(index = 7, value = "时间", converter = LocalDateTimeConvert.class)
@ExcelProperty(index = 8, value = "时间", converter = LocalDateTimeConvert.class)
private LocalDateTime exportTime;
}

@ -317,7 +317,6 @@ public class CameraService {
}
public void cameraLogin(Camera camera){
NetSDKLib.LLong lLong = cameraControlLoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword());
if(lLong != null){
log.info("camera login success,cameraId:{},ip:{}",camera.getId(),camera.getIp());

@ -1,7 +1,15 @@
package com.zhehekeji.web.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zhehekeji.web.config.ConfigProperties;
import com.zhehekeji.web.entity.LightSource;
import com.zhehekeji.web.mapper.LightSourceMapper;
import com.zhehekeji.web.service.damLightSource.JYDAMEquip;
import com.zhehekeji.web.service.damLightSource.JYDamHelper;
import com.zhehekeji.web.service.hikLightSource.HikControlSocket;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import net.sf.cglib.core.Local;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@ -9,10 +17,18 @@ import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@Component
@EnableScheduling
@ -21,20 +37,66 @@ public class CronTab {
@Resource
private ConfigProperties configProperties;
@Resource
private LightSourceMapper lightSourceMapper;
private static LocalDateTime now;
private static Map<Integer,Long> lightTimeMap = new HashMap<>();
//10分钟
private static BigInteger timeDIff = BigInteger.valueOf(10*60*1000);
private static int gByte = 1024* 1024 * 1024;
@Scheduled(cron = "0 0 0 * * ?")
//@Scheduled(cron = "0 0/1 * * * *")
public void file() {
log.info(" corn delete file");
now = LocalDateTime.now();
File dir = new File(configProperties.getSavePath().getMediaPath());
long space = dir.getFreeSpace() / gByte;
log.info(" free space :{}",space);
if(space > 150){
return;
}
checkFileTime(dir,configProperties.getDeleteFileDays());
File dir2 = new File(configProperties.getSavePath().getMp4Path());
checkFileTime(dir2,configProperties.getDeleteFileDays());
}
public static void putTime(Integer streetId){
lightTimeMap.put(streetId,System.currentTimeMillis());
}
@Scheduled(cron = "0 0/1 * * * ?")
public void lightStatus() {
log.debug(" lightStatus");
long timeStamp = System.currentTimeMillis();
Iterator<Map.Entry<Integer, Long>> it = lightTimeMap.entrySet().iterator();
while (it.hasNext()){
Map.Entry<Integer, Long> entry = it.next();
if((BigInteger.valueOf(timeStamp).subtract(BigInteger.valueOf(entry.getValue()))).compareTo(timeDIff) > 0){
List<LightSource> lightSources = lightSourceMapper.selectList(new QueryWrapper<LightSource>().eq("street_id",entry.getKey()));
lightSources.forEach(lightSource -> {
if(configProperties.getLightSource().getType() == 1){
JYDAMEquip equip = JYDamHelper.Connect(lightSource.getIp(),lightSource.getPort());
JYDamHelper.closeDO(equip,configProperties.getLightSource().getIndex());
Integer status = JYDamHelper.ReadStatus(equip,configProperties.getLightSource().getNum(),configProperties.getLightSource().getIndex());
log.info("ip:{},status:{}",lightSource.getIp(),status);
equip.DisConnect();
}else if(configProperties.getLightSource().getType() == 2){
HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),0);
}
});
it.remove();
}
}
}
public static void checkFileTime(File dir,int days) {
if(!dir.exists()){
return;

@ -1,5 +1,6 @@
package com.zhehekeji.web.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zhehekeji.web.entity.LightSource;
import com.zhehekeji.web.mapper.LightSourceMapper;
import org.springframework.beans.factory.annotation.Autowired;
@ -17,4 +18,8 @@ public class LightSourceService {
public List<LightSource> getLightSource(){
return lightSourceMapper.selectByMap(new HashMap<>());
}
public List<LightSource> getLightSourceByStreetId(Integer streetId){
return lightSourceMapper.selectList(new QueryWrapper<LightSource>().eq("street_id",streetId));
}
}

@ -1,5 +1,6 @@
package com.zhehekeji.web.service;
import codeDetector.BarcodeDetector;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zhehekeji.common.util.PathUtil;
import com.zhehekeji.web.config.ConfigProperties;
@ -8,6 +9,7 @@ import com.zhehekeji.web.lib.*;
import com.zhehekeji.web.mapper.*;
import com.zhehekeji.web.pojo.OrderVO;
import com.zhehekeji.web.service.RFID.RFIDSocket;
import com.zhehekeji.web.service.hikLightSource.HikControlSocket;
import com.zhehekeji.web.service.ksec.KsecNettyClient;
import com.zhehekeji.web.service.sick.SickSocket;
import lombok.extern.slf4j.Slf4j;
@ -151,13 +153,18 @@ public class PlcService {
update.setLeftRight2(plcCmdInfo.getLeftRight2());
update.setColumn2(plcCmdInfo.getColumn2());
update.setRow2(plcCmdInfo.getRow2());
LocalDateTime endDownLoadTime = endTime.plusSeconds(5);
Duration duration = Duration.between(order.getStartTime(),endDownLoadTime);
if(duration.toMinutes() > 50){
endDownLoadTime = order.getStartTime().plusMinutes(50);
}
if (street.getCamera1Id() != null) {
String path = cameraVideo(street.getCamera1Id(),order.getStartTime(),endTime.plusSeconds(5));
String path = cameraVideo(street.getCamera1Id(),order.getStartTime(),endDownLoadTime);
update.setVideoPath1(path);
}
if (street.getCamera2Id() != null) {
String path = cameraVideo(street.getCamera2Id(),order.getStartTime(),endTime.plusSeconds(5));
String path = cameraVideo(street.getCamera2Id(),order.getStartTime(),endDownLoadTime);
update.setVideoPath2(path);
}
orderMapper.updateById(update);
@ -201,7 +208,7 @@ public class PlcService {
* @param plcCmdInfo
* @param times
*/
public void action(PlcCmdInfo plcCmdInfo, Integer times, String code) {
public void action(PlcCmdInfo plcCmdInfo, Integer times, String code) throws InterruptedException {
Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId());
if (street == null) {
log.error("street not found ,plcId :{}", plcCmdInfo.getPlcId());
@ -209,9 +216,7 @@ public class PlcService {
}
OrderInfo orderInfo = new OrderInfo(street, plcCmdInfo, times, code);
String path = null;
/**
* C2 C4
*/
Boolean needCapture = doNeedCaptureByCode(orderInfo.getCmdCode());
/***
*
@ -223,22 +228,43 @@ public class PlcService {
Integer cameraId = getCameraByPlcCmd(plcCmdInfo,orderInfo.getLeftRight());
gyrateCameraByCode(cameraId,orderInfo.getCmdCode());
if(needCapture){
Boolean delay = false;
if(code.startsWith("C1") || code.startsWith("C3")){
delay = true;
}
Boolean delay = true;
Integer row = 0;
Integer column = 0;
Integer sep = 0;
if(times<=2){
row = plcCmdInfo.getRow1();
column = plcCmdInfo.getColumn1();
sep = plcCmdInfo.getSeparation1();
}else {
row = plcCmdInfo.getRow2();
column = plcCmdInfo.getColumn2();
sep = plcCmdInfo.getSeparation2();
}
path = PathUtil.createFileNameByRowColumn("jpg",cameraId,row,column);
long delayTime = 0;
if(code.startsWith("C1")){
path = cameraCapture(cameraId,delay,configProperties.getCameraConfig().getDelayCaptureTime(),path);
delayTime = configProperties.getCameraConfig().getC1DelayCaptureTime();
}else if(code.startsWith("C2")){
if(sep == 1){
delayTime = configProperties.getCameraConfig().getC2DelayCaptureTime();
}else {
delayTime = configProperties.getCameraConfig().getC2OutDelayCaptureTime();
}
}else if(code.startsWith("C3")){
delayTime = configProperties.getCameraConfig().getC3DelayCaptureTime();
}else if(code.startsWith("C4")){
if(sep == 1){
delayTime = configProperties.getCameraConfig().getC4DelayCaptureTime();
}else {
delayTime = configProperties.getCameraConfig().getC4OutDelayCaptureTime();
}
}
path = PathUtil.createFileNameByRowColumn("jpg",cameraId,row,column);
path = cameraCapture(cameraId,delay,delayTime,path);
}
//update order info after capture
if (path != null && needCapture) {
@ -248,10 +274,10 @@ public class PlcService {
if(times == 2){
if(street.getCamera2Id() != null){
gyrateCameraByCodeTimeLater(street.getCamera2Id(),"C5",configProperties.getCameraConfig().getDelayCaptureTime()+100);
gyrateCameraByCodeTimeLater(street.getCamera2Id(),"C5",configProperties.getCameraConfig().getC2OutDelayCaptureTime()+500);
}
if(street.getCamera1Id() != null){
gyrateCameraByCodeTimeLater(street.getCamera1Id(),"C5",configProperties.getCameraConfig().getDelayCaptureTime()+100);
gyrateCameraByCodeTimeLater(street.getCamera1Id(),"C5",configProperties.getCameraConfig().getC2OutDelayCaptureTime()+500);
}
}
}
@ -554,17 +580,35 @@ public class PlcService {
}
@Resource
private LightSourceMapper lightSourceMapper;
public Boolean check(PlcCmdInfo plcCmdInfo,String cmdCode,String wmsCode,String wmsTrayCode){
long startTime = System.currentTimeMillis();
Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId());
CronTab.putTime(street.getId());
List<LightSource> lightSources = lightSourceMapper.selectList(new QueryWrapper<LightSource>().eq("street_id",street.getId()));
lightSources.forEach(lightSource -> {
HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),1);
});
Integer cameraId = getCameraByPlcCmd(plcCmdInfo,plcCmdInfo.getLeftRight1());
gyrateCameraByCode(cameraId, cmdCode);
try {
Thread.sleep(configProperties.getCameraConfig().getDelayCaptureTime());
} catch (InterruptedException e) {
e.printStackTrace();
if(plcCmdInfo.getSeparation1() == 1 && configProperties.getScanCodeMode().getTray() == 2){
//内测
String c = cmdCode + "-" + plcCmdInfo.getLeftRightStr(1) + "-IN";
log.info("camera ptz"+c);
gyrateCameraByCode(cameraId, c);
}else {
gyrateCameraByCode(cameraId, cmdCode);
try {
Thread.sleep(configProperties.getCameraConfig().getDelayCaptureTime());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String path = PathUtil.createFileNameByRowColumn("jpg",cameraId,plcCmdInfo.getRow1(),plcCmdInfo.getColumn1());
cameraCapture(cameraId,false,null,path);
//托盘码
@ -572,10 +616,10 @@ public class PlcService {
Boolean trayCheck = Boolean.TRUE;
//如果是用扫码枪 扫 托盘码,就直接扫
//if(configProperties.getScanCodeMode().getTray() == 2){
SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(),plcCmdInfo.getLeftRight1());
if(plcCmdInfo.getSeparation1() == 1 && configProperties.getScanCodeMode().getTray() == 2){
//托盘使用sick扫码枪
SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(),plcCmdInfo.getLeftRight1());
if(sensorGun == null){
trayCode = "识别异常";
trayCheck = Boolean.FALSE;
@ -610,17 +654,92 @@ public class PlcService {
//RFID
RFID rfid = rfidService.getRFIDByPlc(street.getId());
}
StockCheckRunnable stockCheckRunnable = new StockCheckRunnable(street,plcCmdInfo,cmdCode,stockMapper,path,checkLogMapper,configProperties.getScanCodeMode().getGoods(),wmsCode,wmsTrayCode,trayCode,trayCheck,configProperties);
threadPoolExecutor.execute(stockCheckRunnable);
OrderInfo orderInfo = new OrderInfo(street,plcCmdInfo,1,cmdCode);
Stock stock = stockMapper.getByShelveIdAndRowColumn(orderInfo.getShelveId(),orderInfo.getRow(),orderInfo.getColumn());
String scanCode = null;
Boolean codeCheck = Boolean.TRUE;
Boolean trayCodeCheck = Boolean.TRUE;
//货物使用球机扫码
if(configProperties.getScanCodeMode().getTray() == 2 && plcCmdInfo.getSeparation1() == 2){
//托盘使用球机扫码
if("".equals(wmsTrayCode)){
//空货物的处理
//如果系统货物为空,则只要扫码识别未出结果,就认为无货物
trayCode = BarcodeDetector.detectBestCodeUntilOK(configProperties.getSavePath().getMediaPath()+path,configProperties.getScanCodeMode().getTrayCodeTypes());
log.info("tray code:{},sys trayCode:{}",trayCode,wmsTrayCode);
if(StringUtils.isEmpty(trayCode)|| trayCode.equals("Unrecognized")){
trayCheck = Boolean.TRUE;
trayCode = "";
}else {
trayCheck = wmsTrayCode.equals(trayCode);
}
}else {
trayCode = BarcodeDetector.detectBestCodeUntilOK(configProperties.getSavePath().getMediaPath()+path,configProperties.getScanCodeMode().getTrayCodeTypes());
if(StringUtils.isEmpty(trayCode)){
log.error("row:{},cloumn:{}",plcCmdInfo.getRow1(),plcCmdInfo.getColumn1());
log.error("detectBestBarCode:{}",trayCode);
trayCode = "识别异常";
trayCheck = Boolean.FALSE;
}else {
trayCheck = wmsTrayCode.equals(trayCode);
}
}
}
log.info("code:{}",scanCode);
//核对异常
Integer status = 1;
//托盘和货物都正确
if(trayCheck && codeCheck){
status = 2;
}
if(stock == null){
stock = new Stock(null,null,plcCmdInfo.getOrderNum(),plcCmdInfo.getLotnum(),scanCode, null,null,wmsCode,null,null,wmsTrayCode,trayCode,orderInfo.getShelveId(),orderInfo.getRow(),orderInfo.getColumn(),status,null,null,path, LocalDateTime.now());
stockMapper.insert(stock);
}else {
stock.setStatus(status);
stock.setLotnum(plcCmdInfo.getLotnum());
stock.setExportTime(LocalDateTime.now());
stock.setCheckPic(path);
stock.setCheckNum(plcCmdInfo.getOrderNum());
stock.setTrayCode(trayCode);
stock.setWmsTrayCode(wmsTrayCode);
stock.setCode(scanCode);
stock.setWmsCode(wmsCode);
stockMapper.updateById(stock);
}
checkLog(stock);
// StockCheckRunnable stockCheckRunnable = new StockCheckRunnable(street,plcCmdInfo,cmdCode,stockMapper,path,checkLogMapper,configProperties.getScanCodeMode().getGoods(),wmsCode,wmsTrayCode,trayCode,trayCheck,configProperties,sensorGun);
// threadPoolExecutor.execute(stockCheckRunnable);
long end = System.currentTimeMillis();
long s = end - startTime;
log.info("time:{}millisecond",s);
return true;
}
public void checkLog(Stock stock){
CheckLog checkLog = new CheckLog();
checkLog.setCheckNum(stock.getCheckNum());
checkLog.setPic(stock.getCheckPic());
checkLog.setShelveId(stock.getShelveId());
checkLog.setCode(stock.getCode());
checkLog.setWmsCode(stock.getWmsCode());
checkLog.setStatus(stock.getStatus());
checkLog.setRow(stock.getRow());
checkLog.setColumn(stock.getColumn());
checkLog.setCreateTime(LocalDateTime.now());
checkLog.setTrayCode(stock.getTrayCode());
checkLog.setWmsTrayCode(stock.getWmsTrayCode());
checkLog.setLotnum(stock.getLotnum());
checkLogMapper.insert(checkLog);
}
public void truncateStock(){
stockMapper.truncate();
}
public ConfigProperties getConfigProperties(){
return configProperties;
}
}

@ -3,11 +3,13 @@ package com.zhehekeji.web.service;
import codeDetector.BarcodeDetector;
import com.zhehekeji.web.config.ConfigProperties;
import com.zhehekeji.web.entity.CheckLog;
import com.zhehekeji.web.entity.SensorGun;
import com.zhehekeji.web.entity.Stock;
import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.lib.OrderInfo;
import com.zhehekeji.web.mapper.CheckLogMapper;
import com.zhehekeji.web.mapper.StockMapper;
import com.zhehekeji.web.service.sick.SickSocket;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
@ -33,8 +35,10 @@ public class StockCheckRunnable implements Runnable {
private ConfigProperties configProperties;
private SensorGun sensorGun;
public StockCheckRunnable(Street street, PlcCmdInfo plcCmdInfo, String cmdCode, StockMapper stockMapper,String path,CheckLogMapper checkLogMapper,Integer goodsActionTimes,String wmsCode,String wmsTrayCode,String trayCode,Boolean trayCheck,ConfigProperties configProperties){
public StockCheckRunnable(Street street, PlcCmdInfo plcCmdInfo, String cmdCode, StockMapper stockMapper, String path, CheckLogMapper checkLogMapper, Integer goodsActionTimes, String wmsCode, String wmsTrayCode, String trayCode, Boolean trayCheck, ConfigProperties configProperties, SensorGun sensorGun){
this.street = street;
this.plcCmdInfo = plcCmdInfo;
this.cmdCode = cmdCode;
@ -47,7 +51,7 @@ public class StockCheckRunnable implements Runnable {
this.trayCode = trayCode;
this.trayCheck = trayCheck;
this.configProperties = configProperties;
this.sensorGun = sensorGun;
}
@Override
@ -58,29 +62,7 @@ public class StockCheckRunnable implements Runnable {
Boolean codeCheck = Boolean.TRUE;
Boolean trayCodeCheck = Boolean.TRUE;
//货物使用球机扫码
/*if(configProperties.getScanCodeMode().getGoods() == 1){
if("".equals(wmsCode)){
//空货物的处理
//如果系统货物为空,则只要扫码识别未出结果,就认为无货物
scanCode = BarcodeDetector.detectBestCodeUntilOK(configProperties.getSavePath().getMediaPath()+path,configProperties.getScanCodeMode().getGoodsCodeTypes());
if(StringUtils.isEmpty(scanCode)|| scanCode.equals("Unrecognized")){
codeCheck = Boolean.TRUE;
scanCode = "";
}else {
codeCheck = wmsCode.equals(scanCode);
}
}else {
scanCode = BarcodeDetector.detectBestCodeUntilOK(configProperties.getSavePath().getMediaPath()+path,configProperties.getScanCodeMode().getGoodsCodeTypes());
if(StringUtils.isEmpty(scanCode)){
log.error("row:{},cloumn:{}",plcCmdInfo.getRow1(),plcCmdInfo.getColumn1());
log.error("detectBestBarCode:{}",scanCode);
scanCode = "识别异常";
codeCheck = Boolean.FALSE;
}else {
codeCheck = wmsCode.equals(scanCode);
}
}
}*/
if(configProperties.getScanCodeMode().getTray() == 2 && plcCmdInfo.getSeparation1() == 2){
//托盘使用球机扫码
if("".equals(wmsTrayCode)){
@ -102,9 +84,10 @@ public class StockCheckRunnable implements Runnable {
trayCode = "识别异常";
trayCheck = Boolean.FALSE;
}else {
trayCheck = wmsCode.equals(trayCode);
trayCheck = wmsTrayCode.equals(trayCode);
}
}
}
log.info("code:{}",scanCode);
//核对异常

@ -270,6 +270,7 @@ public class StockService {
stockExportExcel.setCode(stock.getTrayCode());
stockExportExcel.setLotnum(stock.getLotnum());
stockExportExcel.setColumn(stock.getColumn());
stockExportExcel.setWmsCode(stock.getWmsTrayCode());
//stockExportExcel.setCount(stock.getCount());
stockExportExcel.setRow(stock.getRow());
stockExportExcel.setStreetName(street.getName());

@ -370,38 +370,45 @@ public class StreetService {
*/
public String getShevelId(String SRMNumber,Integer direction,Integer separation){
Street street = getStreetByPlcId(SRMNumber);
if(street == null){
return null;
}
return getShevelIdByStreet(street,direction,separation);
}
public String getShevelId(Integer streetId,Integer direction,Integer separation){
Street street = streetById(streetId);
if(street == null){
return null;
}
return getShevelIdByStreet(street,direction,separation);
}
public String getShevelIdByStreet(Street street,Integer direction,Integer separation){
//判断单双伸 type=1 单伸 2为双伸
log.info("street:{},direction:{},sep:{}",street,direction,separation);
//todo 左右互换
//判断单双伸 type=0 单伸 1为双伸
Integer type;
if(direction == 1){
if(direction == 2){
type = street.getLeftType();
}else {
type = street.getRightType();
}
if(type == 1){
if(type == 0){
//单伸只需要判断左右
if(direction == 1){
if(direction == 2){
return street.getLeftShelveId();
}else {
return street.getRightShelveId();
}
}else {
//双伸,还需要判断内外
if(direction == 1){
if(direction == 2){
if(separation == 1){
return street.getLeftInsideShelveId();
}else {
return street.getRightShelveId();
return street.getLeftOutsideShelveId();
}
}else {
if(separation == 1){

@ -37,7 +37,7 @@ public class KescFilter extends ChannelInitializer<SocketChannel> {
//4秒发一次心跳
ph.addLast(new IdleStateHandler(0, 4, 0, TimeUnit.SECONDS));
ByteBuf byteBuf = Unpooled.copiedBuffer(">".getBytes());
ph.addLast(new KsecDecoder(1000,byteBuf,plcService));
ph.addLast(new KsecDecoder(10000,byteBuf,plcService));
ph.addLast(new KescEncoder());
ph.addLast(new KescNettyHandler(ksecInfo,nettyClient));
}

@ -15,6 +15,9 @@ import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import java.nio.charset.Charset;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* TCP JSON
@ -30,6 +33,8 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
private static String lastLotnum;
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(7,21,30, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(20000));
private PlcService plcService;
public KsecDecoder(int maxFrameLength, ByteBuf delimiter, PlcService plcService) {
@ -41,116 +46,164 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
in = (ByteBuf) super.decode(ctx, in);
if(in == null){
log.info("no data");
log.debug("no data");
return null;
}
String body = in.toString(Charset.forName("UTF-8"));
if (body.startsWith("<")){
// 去掉首尾标识符
body = body.substring(1, body.length());
KsecInfo ksecInfo = JSONObject.parseObject(body, KsecInfo.class);
KsecDataInfo dataInfo = ksecInfo.getData();
String lotnum = dataInfo.getLotnum();
PlcCmdInfo plcCmdInfo = null;
String srmNumber = null;
String cmdName = null;
if(dataInfo != null){
plcCmdInfo = new PlcCmdInfo(dataInfo.getSRMNumber(), dataInfo.getTaskId(), dataInfo.getFromSide(), dataInfo.getFromDirection(), dataInfo.getFromColumn(), dataInfo.getFromRow(), dataInfo.getFromSeparation(),dataInfo.getToSide(), dataInfo.getToDirection(), dataInfo.getToColumn(), dataInfo.getToRow(),dataInfo.getToSeparation(),lotnum);
srmNumber = dataInfo.getSRMNumber();
cmdName = dataInfo.getCmdName();
}
if (Cmd.A.name().equals(ksecInfo.getType())) {
//心跳
log.debug("receieve heart ");
} else if (Cmd.B.name().equals(ksecInfo.getType())) {
tcpLogger.info("info:{}",body);
//任务
if (Cmd.B1.name().equals(cmdName)) {
//昆船盘点模式下也会发B1 ,但是不会发送B2
//这里判断下,是否存在盘点批次号 若存在既是盘点的B1,无需处理若不存在lotnum则是随行的B1
if(StringUtils.isEmpty(dataInfo.getLotnum())){
//任务开始 旋转到原点位
plcService.gyrateCamera(plcCmdInfo,Cmd.C5.name());
plcService.orderStart(plcCmdInfo);
}else {
log.info("check move");
}
} else if (Cmd.B2.name().equals(cmdName)) {
plcService.gyrateCamera(plcCmdInfo,Cmd.C5.name());
plcService.orderStop(plcCmdInfo);
}
} else if (Cmd.C.name().equals(ksecInfo.getType())) {
tcpLogger.info("info:{}",body);
//动作
String code = dataInfo.getCmdName();
log.info("action code,{},orderInfo:{}", code, plcCmdInfo.toString());
if (Cmd.isBaseAction(code)) {
//执行动作,需要保存执行到第几步了
Integer times = GoodsActionTimes.put(plcCmdInfo.getOrderNum());
plcCmdInfo.setTimes(times);
code = code + "-" + plcCmdInfo.getLeftRightStr(times) + plcCmdInfo.getInOutStr(times);
//执行动作
plcService.action(plcCmdInfo, times, code);
}else {
log.info("other C code :{}",code);
}
} else if (Cmd.D.name().equals(ksecInfo.getType())) {
tcpLogger.info("info:{}",body);
String code = dataInfo.getCmdName();
if(code.equals(Cmd.D1.name())){
log.info("plcId:{},warn start",plcCmdInfo.getPlcId());
//根据告警code转动camera
String warnCode = dataInfo.getWarnCode();
if(!StringUtils.isEmpty(warnCode)){
String warnCode0 = Cmd.D1.name()+"-"+warnCode.split(",")[0];
plcService.warnAction(plcCmdInfo,warnCode0);
}
plcService.warnStart(plcCmdInfo.getPlcId(),dataInfo.getWarnCode());
}else if(code.equals(Cmd.D2.name())){
log.info("plcId:{},warn stop",plcCmdInfo.getPlcId());
plcService.warnStop(plcCmdInfo.getPlcId());
}else {
log.info("other D code :{}",code);
}
} else if (Cmd.E.name().equals(ksecInfo.getType())) {
tcpLogger.info("info:{}",body);
//盘点
//转球机到盘点位 然后拍照
if(!StringUtils.isEmpty(lotnum) && !lotnum.equals(lastLotnum)){
//需要把stock表truncate
FileUtil.save(lotnum,"lastLotnum");
tcpLogger.info("truncate table ,last lotnum:{},new lotnum:{}",lastLotnum,lotnum);
plcService.truncateStock();
lastLotnum = lotnum;
}
plcCmdInfo.setTimes(1);
Boolean ok = plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode(), dataInfo.getTrayCode());
if(ok){
ksecInfo.getData().setAckStatus(1);
}else {
ksecInfo.getData().setAckStatus(0);
}
ctx.channel().writeAndFlush(ksecInfo);
}
//找到该货位的最后一张照片与现在的照片比照
//plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0);
}
in.release();
KescRunnable kescRunnable = new KescRunnable(in,ctx,plcService);
threadPoolExecutor.execute(kescRunnable);
return null;
}
public class StopThread extends Thread {
public static class KescRunnable implements Runnable{
private ByteBuf in;
private PlcCmdInfo plcCmdInfo;
private ChannelHandlerContext ctx;
public StopThread(PlcCmdInfo plcCmdInfo){
this.plcCmdInfo = plcCmdInfo;
private PlcService plcService;
public KescRunnable(ByteBuf body,ChannelHandlerContext ctx,PlcService plcService){
this.in = body;
this.ctx = ctx;
this.plcService = plcService;
}
@Override
public void run() {
plcService.orderStop(plcCmdInfo);
String body = in.toString(Charset.forName("UTF-8"));
tcpLogger.info(body);
if (body.startsWith("<")){
// 去掉首尾标识符
body = body.substring(1, body.length());
KsecInfo ksecInfo = JSONObject.parseObject(body, KsecInfo.class);
if (Cmd.A.name().equals(ksecInfo.getType())) {
in.release();
return ;
}
KsecDataInfo dataInfo = ksecInfo.getData();
String lotnum = dataInfo.getLotnum();
PlcCmdInfo plcCmdInfo = null;
String srmNumber = null;
String cmdName = null;
if(dataInfo != null){
//左右换过来
if(dataInfo.getFromDirection() == 1){
dataInfo.setFromDirection(2);
}else {
dataInfo.setFromDirection(1);
}
if(dataInfo.getToDirection() != null && dataInfo.getToDirection() == 1){
dataInfo.setToDirection(2);
}else {
dataInfo.setToDirection(1);
}
plcCmdInfo = new PlcCmdInfo(dataInfo.getSRMNumber(), dataInfo.getTaskId(), dataInfo.getFromSide(), dataInfo.getFromDirection(), dataInfo.getFromColumn(), dataInfo.getFromRow(), dataInfo.getFromSeparation(),dataInfo.getToSide(), dataInfo.getToDirection(), dataInfo.getToColumn(), dataInfo.getToRow(),dataInfo.getToSeparation(),lotnum);
srmNumber = dataInfo.getSRMNumber();
cmdName = dataInfo.getCmdName();
}
if (Cmd.A.name().equals(ksecInfo.getType())) {
//心跳
log.debug("receieve heart ");
} else if (Cmd.B.name().equals(ksecInfo.getType())) {
//任务
if (Cmd.B1.name().equals(cmdName)) {
//昆船盘点模式下也会发B1 ,但是不会发送B2
//这里判断下,是否存在盘点批次号 若存在既是盘点的B1,无需处理若不存在lotnum则是随行的B1
if(StringUtils.isEmpty(dataInfo.getLotnum())){
//任务开始 旋转到原点位
plcService.gyrateCamera(plcCmdInfo,Cmd.C5.name());
plcService.orderStart(plcCmdInfo);
}else {
log.info("check move");
}
} else if (Cmd.B2.name().equals(cmdName)) {
//B2 C4 一起发的需要停止等B2
//这里判断是不是双伸
if(plcCmdInfo.getSeparation2() == 2){
//深测货架延迟
try {
Thread.sleep(plcService.getConfigProperties().getCameraConfig().getB2OutDelayTime());
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
//浅侧延迟
try {
Thread.sleep(plcService.getConfigProperties().getCameraConfig().getB2DelayTime());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
plcService.gyrateCamera(plcCmdInfo,Cmd.C5.name());
plcService.orderStop(plcCmdInfo);
}
} else if (Cmd.C.name().equals(ksecInfo.getType())) {
//动作
String code = dataInfo.getCmdName();
log.info("action code,{},orderInfo:{}", code, plcCmdInfo.toString());
if (Cmd.isBaseAction(code)) {
//执行动作,需要保存执行到第几步了
Integer times = GoodsActionTimes.put(plcCmdInfo.getOrderNum());
plcCmdInfo.setTimes(times);
code = code + "-" + plcCmdInfo.getLeftRightStr(times) + plcCmdInfo.getInOutStr(times);
//执行动作
try {
plcService.action(plcCmdInfo, times, code);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
log.info("other C code :{}",code);
}
} else if (Cmd.D.name().equals(ksecInfo.getType())) {
//柳州去掉告警
// String code = dataInfo.getCmdName();
// if(code.equals(Cmd.D1.name())){
// log.info("plcId:{},warn start",plcCmdInfo.getPlcId());
// //根据告警code转动camera
// String warnCode = dataInfo.getWarnCode();
// if(!StringUtils.isEmpty(warnCode)){
// String warnCode0 = Cmd.D1.name()+"-"+warnCode.split(",")[0];
// plcService.warnAction(plcCmdInfo,warnCode0);
// }
// plcService.warnStart(plcCmdInfo.getPlcId(),dataInfo.getWarnCode());
// }else if(code.equals(Cmd.D2.name())){
// log.info("plcId:{},warn stop",plcCmdInfo.getPlcId());
// plcService.warnStop(plcCmdInfo.getPlcId());
// }else {
// log.info("other D code :{}",code);
// }
} else if (Cmd.E.name().equals(ksecInfo.getType())) {
//盘点
//转球机到盘点位 然后拍照
if(!StringUtils.isEmpty(lotnum) && !lotnum.equals(lastLotnum)){
//需要把stock表truncate
FileUtil.save(lotnum,"lastLotnum");
tcpLogger.info("truncate table ,last lotnum:{},new lotnum:{}",lastLotnum,lotnum);
plcService.truncateStock();
lastLotnum = lotnum;
}
plcCmdInfo.setTimes(1);
Boolean ok = plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode(), dataInfo.getTrayCode());
if(ok){
ksecInfo.getData().setAckStatus(1);
}else {
ksecInfo.getData().setAckStatus(0);
}
ctx.channel().writeAndFlush(ksecInfo);
}
//找到该货位的最后一张照片与现在的照片比照
//plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0);
}
in.release();
}
}
}

@ -52,11 +52,16 @@ public class ProtocolDecoder extends FixedLengthFrameDecoder {
//不是包头 丢
return null;
}
CharSequence plc = in.readCharSequence(6, Charset.defaultCharset());
String plcId = plc.toString();
ByteBuf plc = in.readBytes(6);
String plcId = plc.toString(Charset.defaultCharset());
//CharSequence plc = in.readBytes(6, Charset.defaultCharset());
//String plcId = plc.toString();
// OA=心跳 OB=工单 OC=任务 OD=告警
CharSequence typeChar = in.readCharSequence(2, Charset.defaultCharset());
String type = typeChar.toString();
// CharSequence typeChar = in.readCharSequence(2, Charset.defaultCharset());
// String type = typeChar.toString();
ByteBuf typeChar = in.readBytes(2);
String type = typeChar.toString(Charset.defaultCharset());
int taskId = in.readInt();
short short1 = in.readShort();
short short2 = in.readShort();

@ -23,19 +23,25 @@ public class SickSocket {
public static String readOCR(String ip,int port){
Socket socket = new Socket();
String code = null;
String code = "NoRead";
OutputStream os = null;
InputStream is = null;
try {
socket.connect(new InetSocketAddress(ip,port),3000);
os = socket.getOutputStream();
writeCmd(os);
is = socket.getInputStream();
code = read(is);
tcpLogger.info(code);
if(code!= null){
code = code.replace("\\n","");
int i = 0;
while ("NoRead".equals(code) && i <= 4){
writeCmd(os);
code = read(is);
tcpLogger.info("count:{},ip:{},code:{}",i,ip,code);
if(code!= null){
code = code.replace("\\n","");
}
i++;
}
} catch (IOException e) {
tcpLogger.error("sick time out,ip:{},info:{}",ip,e);
log.error("sick time out,ip:{},info:{}",ip,e);

@ -14,7 +14,7 @@ spring:
testWhileIdle: false
timeBetweenEvictionRunsMillis: 60000
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://127.0.0.1:3306/lia_duoji?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
url: jdbc:mysql://192.168.77.91:3306/lia_duoji?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: root
validationQuery: SELECT 1 FROM DUAL
# --------本服务端口号
@ -34,6 +34,21 @@ cameraConfig:
videoServer: 127.0.0.1:8083
#相机抓图延迟 毫秒,这个延迟是等待球机球机转动到位,然后拍照的
delayCaptureTime: 3500
#随行模式下的相机抓图延迟 毫秒,这个延迟是等待球机球机转动到位,然后拍照的
# 发了C1之后多久拍照
C1DelayCaptureTime: 1500
# 内侧货架 发了C2 之后多久拍照
C2DelayCaptureTime: 1500
# 外侧货架 发了C2 之后多久拍照
C2OutDelayCaptureTime: 2500
# 发了C3之后多久拍照
C3DelayCaptureTime: 1500
C4DelayCaptureTime: 1500
C4OutDelayCaptureTime: 1500
# 发了B2之后多久转原点位
B2DelayTime: 2000
# 外侧货架发了B2多久转原点位
B2OutDelayTime: 2000
# 下载mp4延迟 海康的下载mp4需要2分钟
# 利珀延迟10s就可
# 单位毫秒

Loading…
Cancel
Save