库口逻辑

泸州-视觉+扫码-昆船
LAPTOP-S9HJSOEB\昊天 2 years ago
parent 1ac03d25de
commit 29b826657c

@ -49,7 +49,13 @@ public class ConfigProperties {
private Rfid rfid;
private IntelliBink intelliBink;
@Data
public static class IntelliBink {
private String ip;
private int port;
}
@Data
public static class Rfid {

@ -99,7 +99,7 @@ public class ClientTestController {
// }
return Result.success(msg);
}
/*
@ApiOperation("模拟普天 盘点具体货位 第一步 【发起盘点】")
@GetMapping("/stockCheck/start")
public Result<String> startStockCheck(@ApiParam("巷道标识")@RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId,
@ -169,6 +169,6 @@ public class ClientTestController {
@GetMapping("/realtimeCheck")
public Result<RealtimeCheckMap.CheckInfo> realtimeCheck(@ApiParam("巷道标识") @RequestParam String SRMNumber){
return Result.success(RealtimeCheckMap.getRealtimeCheck(SRMNumber));
}
}*/
}

@ -0,0 +1,11 @@
package com.zhehekeji.web.controller;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "盘点统计")
@RequestMapping("/KuKouController")
@RestController
public class KuKouController {
}

@ -9,8 +9,6 @@ import com.zhehekeji.web.pojo.street.StreetSearch;
import com.zhehekeji.web.pojo.street.StreetVO;
import com.zhehekeji.web.service.LightSourceService;
import com.zhehekeji.web.service.StreetService;
import com.zhehekeji.web.service.client.ClientChanel;
import com.zhehekeji.web.service.client.LCTransmission;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;

@ -12,6 +12,8 @@ import java.time.LocalDateTime;
@Data
public class CheckLog {
@TableId(type = IdType.AUTO)
private Integer id;
private Integer streetId;
@TableField(exist = false)
private String streetName;
@ -44,6 +46,7 @@ public class CheckLog {
private Integer status;
private String checkNum;
private String taskId;
private String pic;

@ -0,0 +1,19 @@
package com.zhehekeji.web.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
@TableName("kukou")
@Data
public class KuKou {
private int id;
private int count;
private String code;
private String path;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
}

@ -1,5 +1,6 @@
package com.zhehekeji.web.lib;
import com.zhehekeji.web.service.client.TransmissionPojo;
import lombok.AllArgsConstructor;
import lombok.Data;
@ -11,24 +12,29 @@ import java.util.concurrent.TimeUnit;
@AllArgsConstructor
public class CameraDelayTask implements Delayed {
private Integer cameraId;
private Integer cameraId;
private LocalDateTime startTime;
private String cameraPlcId;
private LocalDateTime startTime;
private LocalDateTime endTime;
private TransmissionPojo transmissionPojo;
private String path;
private LocalDateTime endTime;
private String command;
private String path;
/**
* 0 : mp4 1:jpeg
*/
private Integer type;
private Integer type;
private long executeTime;
private long executeTime;
private long delayTime;
private long delayTime;
private Integer ptzId;
private Integer ptzId;
public CameraDelayTask(Integer cameraId, LocalDateTime startTime, LocalDateTime endTime, String path, Integer type, long delayTime) {
this.cameraId = cameraId;
@ -40,6 +46,22 @@ public class CameraDelayTask implements Delayed {
this.delayTime = delayTime;
}
public CameraDelayTask(String cameraPlcId, String command, long delayTime,TransmissionPojo transmissionPojo) {
this.cameraPlcId = cameraPlcId;
this.command = command;
this.executeTime = System.currentTimeMillis()+delayTime;
this.delayTime = delayTime;
this.transmissionPojo = transmissionPojo;
}
public CameraDelayTask(String cameraPlcId, String command, long delayTime) {
this.cameraPlcId = cameraPlcId;
this.command = command;
this.executeTime = System.currentTimeMillis()+delayTime;
this.delayTime = delayTime;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(this.executeTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);

@ -12,7 +12,6 @@ import com.zhehekeji.web.mapper.StockMapper;
import com.zhehekeji.web.pojo.empty.EmptyCheckSearch;
import com.zhehekeji.web.pojo.stock.CheckStatus;
import com.zhehekeji.web.pojo.stock.RowColumnStatus;
import com.zhehekeji.web.service.client.ECTransmission;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@ -21,7 +20,6 @@ import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@Service
@Slf4j
@ -221,42 +219,42 @@ public class EmptyCheckService {
}
return map;
}
public void emptyCheckLog(ECTransmission ecTransmission){
Street street = streetService.getStreetByPlcId(ecTransmission.getSRMNumber());
if(street == null){
log.error(" no SRMNumer:{}",ecTransmission.getSRMNumber());
return;
}
EmptyCheck emptyCheck = emptyCheckMapper.getOne(street.getId(),ecTransmission.getDirection(),ecTransmission.getSide(),ecTransmission.getRow(),ecTransmission.getColumn());
if(emptyCheck == null){
emptyCheck = new EmptyCheck();
emptyCheck.setStreetId(street.getId());
emptyCheck.setOrderNum(ecTransmission.getTaskId());
emptyCheck.setSide(ecTransmission.getSide());
emptyCheck.setDirection(ecTransmission.getDirection());
//0:未盘点 1有货 2无货
if(ecTransmission.getIsEmpty().equals("0")){
emptyCheck.setEmptyStatus(2);
}else {
emptyCheck.setEmptyStatus(1);
}
emptyCheck.setRow(ecTransmission.getRow());
emptyCheck.setColumn(ecTransmission.getColumn());
}else {
emptyCheck.setOrderNum(ecTransmission.getTaskId());
if(ecTransmission.getIsEmpty().equals("0")){
log.info("goodsLocation:{}, status: {}", ecTransmission.getGoodsLocation(), ecTransmission.getIsEmpty());
emptyCheck.setEmptyStatus(2);
}else {
log.info("goodsLocation:{}, status: {}", ecTransmission.getGoodsLocation(), ecTransmission.getIsEmpty());
emptyCheck.setEmptyStatus(1);
}
}
emptyCheckMapper.insertOrUpdate(emptyCheck);
}
//
// public void emptyCheckLog(ECTransmission ecTransmission){
// Street street = streetService.getStreetByPlcId(ecTransmission.getSRMNumber());
// if(street == null){
// log.error(" no SRMNumer:{}",ecTransmission.getSRMNumber());
// return;
// }
// EmptyCheck emptyCheck = emptyCheckMapper.getOne(street.getId(),ecTransmission.getDirection(),ecTransmission.getSide(),ecTransmission.getRow(),ecTransmission.getColumn());
//
// if(emptyCheck == null){
// emptyCheck = new EmptyCheck();
// emptyCheck.setStreetId(street.getId());
// emptyCheck.setOrderNum(ecTransmission.getTaskId());
// emptyCheck.setSide(ecTransmission.getSide());
// emptyCheck.setDirection(ecTransmission.getDirection());
// //0:未盘点 1有货 2无货
// if(ecTransmission.getIsEmpty().equals("0")){
// emptyCheck.setEmptyStatus(2);
// }else {
// emptyCheck.setEmptyStatus(1);
// }
// emptyCheck.setRow(ecTransmission.getRow());
// emptyCheck.setColumn(ecTransmission.getColumn());
// }else {
// emptyCheck.setOrderNum(ecTransmission.getTaskId());
// if(ecTransmission.getIsEmpty().equals("0")){
// log.info("goodsLocation:{}, status: {}", ecTransmission.getGoodsLocation(), ecTransmission.getIsEmpty());
// emptyCheck.setEmptyStatus(2);
// }else {
// log.info("goodsLocation:{}, status: {}", ecTransmission.getGoodsLocation(), ecTransmission.getIsEmpty());
// emptyCheck.setEmptyStatus(1);
// }
// }
// emptyCheckMapper.insertOrUpdate(emptyCheck);
//
// }
public CheckStatus emptyStatusByRowColumn(RowColumnStatus rowColumnStatus){
CheckStatus checkStatus = new CheckStatus();

@ -9,16 +9,12 @@ import com.zhehekeji.web.lib.hik.HikLoginModuleImpl;
import com.zhehekeji.web.lib.joyware.JoywareCameraControlModuleImpl;
import com.zhehekeji.web.lib.joyware.JoywareLoginModuleImpl;
import com.zhehekeji.web.mapper.CameraMapper;
import com.zhehekeji.web.mapper.SensorGunMapper;
import com.zhehekeji.web.mapper.StreetMapper;
import com.zhehekeji.web.service.client.ClientChanel;
import com.zhehekeji.web.service.client.NettyServer;
import com.zhehekeji.web.service.ksec.KsecNettyClient;
import com.zhehekeji.web.service.putian.PuTianNettyClient;
import com.zhehekeji.web.service.robotic.NettyClient;
import com.zhehekeji.web.service.sick.SickNettyClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.util.StringUtil;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Bean;

@ -74,6 +74,7 @@ public class PlcCmdInfo {
private String wmsCode;
private String wmsTrayCode;
private String trayCode;
private Boolean trayCheck;
public PlcCmdInfo(String plcId, String taskId, Integer side1, Integer leftRight1, Integer column1, Integer row1, Integer separation1, Integer side2, Integer leftRight2, Integer column2, Integer row2, Integer separation2,String lotnum) {
this.taskId = taskId;

@ -2,20 +2,21 @@ package com.zhehekeji.web.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zhehekeji.common.util.PathUtil;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.config.ConfigProperties;
import com.zhehekeji.web.entity.*;
import com.zhehekeji.web.lib.*;
import com.zhehekeji.web.mapper.*;
import com.zhehekeji.web.pojo.OrderVO;
import com.zhehekeji.web.pojo.camera.CameraPtzPojo;
import com.zhehekeji.web.pojo.stock.StockStatus;
import com.zhehekeji.web.service.RFID.RFIDMap;
import com.zhehekeji.web.service.RFID.RFIDSocket;
import com.zhehekeji.web.service.client.ClientChanel;
import com.zhehekeji.web.service.client.ECResultMessage;
import com.zhehekeji.web.service.client.SCTransmission;
import com.zhehekeji.web.entity.EmptyCheckPic;
import com.zhehekeji.web.service.hikLightSource.HikControlSocket;
import com.zhehekeji.web.service.client.ClientChanel;
import com.zhehekeji.web.service.client.TransmissionPojo;
import com.zhehekeji.web.service.ksec.KsecDataInfo;
import com.zhehekeji.web.service.ksec.KsecInfo;
import com.zhehekeji.web.service.lbScanCode.ReentrantLockExample;
import com.zhehekeji.web.service.sick.SickSocket;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
@ -24,13 +25,13 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.net.SocketTimeoutException;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* @Description plc
@ -157,6 +158,8 @@ public class PlcService {
}
}
/**
*
*
@ -341,6 +344,81 @@ public class PlcService {
}
}
}
@Resource
ReentrantLockExample reentrantLockExample;
String scan(PlcCmdInfo plcCmdInfo,Street street,String path){
Boolean trayCheck = Boolean.FALSE;
String trayCode = "";
log.info("扫码类型:" + configProperties.getScanCodeMode().getTray());
//使用sick扫码枪
if(plcCmdInfo.getSeparation1()==1) {
//托盘使用sick扫码枪
SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(), plcCmdInfo.getLeftRight1());
if (sensorGun == null) {
trayCode = "扫码枪未配置";
trayCheck = Boolean.FALSE;
log.error("no sensor gun config in database ,street id:{},direction:{}", street.getId(), plcCmdInfo.getLeftRight1());
} else {
trayCode = SickSocket.readOCR(sensorGun.getIp(), sensorGun.getPort());
log.info("sensor tray code:{}", trayCode);
if ("".equals(plcCmdInfo.getWmsCode())) {
//托盘码为空,无货物
//只要扫码枪未识别出条码,即认为盘点正确
if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) {
trayCode = "无货物";
trayCheck = Boolean.TRUE;
} else {
trayCode = "扫码枪识别异常";
trayCheck = Boolean.FALSE;
log.warn("sick ocr error:{}", trayCode);
}
} else {
if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) {
trayCode = "扫码枪识别异常";
trayCheck = Boolean.FALSE;
log.warn("sick ocr error:{}", trayCode);
} else {
//扫到与货码相同
if(trayCode.equals(plcCmdInfo.getWmsCode())){
trayCheck = Boolean.TRUE;
}
}
}
}
}else {
trayCode = reentrantLockExample.identify(path,configProperties.getIntelliBink().getIp(),configProperties.getIntelliBink().getPort());
if(trayCode != null && !"".equals(trayCode)){
if ("".equals(plcCmdInfo.getWmsCode())) {
//托盘码为空,无货物
//只要扫码枪未识别出条码,即认为盘点正确
if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) {
trayCode = "无货物";
trayCheck = Boolean.TRUE;
} else {
trayCode = "扫码枪识别异常";
trayCheck = Boolean.FALSE;
log.warn("sick ocr error:{}", trayCode);
}
} else {
if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) {
trayCode = "扫码枪识别异常";
trayCheck = Boolean.FALSE;
log.warn("sick ocr error:{}", trayCode);
} else {
//扫到与货码相同
if(trayCode.equals(plcCmdInfo.getWmsCode())){
trayCheck = Boolean.TRUE;
}
}
}
}
}
plcCmdInfo.setTrayCode(trayCode);
return trayCode;
}
public Boolean check(PlcCmdInfo plcCmdInfo,String cmdCode,String wmsCode,String wmsTrayCode,String wmsCatagary){
@ -485,7 +563,8 @@ public class PlcService {
}
}
}
}else if(configProperties.getScanCodeMode().getGoods() == 3){
}else
if(configProperties.getScanCodeMode().getGoods() == 3){
Set<String> tags = new HashSet<>();
try {
RFIDCheck(plcCmdInfo);
@ -858,84 +937,84 @@ public class PlcService {
* @param scTransmission
* @return
*/
public Stock checkStart(SCTransmission scTransmission){
log.info("【开始盘点货位】save stock info ,taskId:{},SRMNumber:{}goodsLocation:{}",scTransmission.getTaskNo(),scTransmission.getSRMNumber(),scTransmission.getGoodsLocation());
Street street = streetService.getStreetByPlcId(scTransmission.getSRMNumber());
Integer row = Integer.valueOf(scTransmission.getGoodsLocation().substring(8,10));
Integer column = Integer.valueOf(scTransmission.getGoodsLocation().substring(5,8));
Integer leftRight = Integer.valueOf(scTransmission.getGoodsLocation().substring(4,5));
Integer inout = Integer.valueOf(scTransmission.getGoodsLocation().substring(11,12));
Stock old = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(street.getId(),leftRight,inout,row,column);
if(old == null){
old = new Stock();
old.setCount(null);
old.setCode(null);
old.setCategory(null);
old.setCheckNum(scTransmission.getTaskNo());
old.setLotnum(scTransmission.getTaskNo());
old.setRow(row);
old.setColumn(column);
old.setDirection(leftRight);
old.setSide(inout);
old.setWmsCode(scTransmission.getGoodsLocation());
old.setWmsCategory(scTransmission.getCategory());
old.setWmsCount(scTransmission.getCount());
old.setStreetId(street.getId());
old.setExportTime(LocalDateTime.now());
old.setWmsTrayCode("");
stockMapper.insert(old);
}else {
old.setLotnum(scTransmission.getTaskNo());
old.setExportTime(LocalDateTime.now());
old.setWmsCode(scTransmission.getGoodsLocation());
old.setWmsCount(scTransmission.getCount());
old.setCheckNum(scTransmission.getTaskNo());
old.setWmsTrayCode("");
stockMapper.updateById(old);
}
return old;
}
/**
*
* @param scTransmission
* @return
*/
public Stock checkEnd(SCTransmission scTransmission){
log.info("【盘点货位结果返回】update stock info ,taskId:{},SRMNumber:{},goodsLocation:{}",scTransmission.getTaskNo(),scTransmission.getSRMNumber(),scTransmission.getGoodsLocation());
Street street = streetService.getStreetByPlcId(scTransmission.getSRMNumber());
Integer row = Integer.valueOf(scTransmission.getGoodsLocation().substring(8,10));
Integer column = Integer.valueOf(scTransmission.getGoodsLocation().substring(5,8));
Integer leftRight = Integer.valueOf(scTransmission.getGoodsLocation().substring(4,5));
Integer inout = Integer.valueOf(scTransmission.getGoodsLocation().substring(11,12));
Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(street.getId(),leftRight,inout,row,column);
if(stock != null){
//暂时不盘点数量
//stock.setCount(scTransmission.getRstCount());
stock.setCount(scTransmission.getRstCategory().equals(stock.getWmsCategory())?scTransmission.getCount():0);
stock.setCategory(scTransmission.getRstCategory());
stock.setCode(scTransmission.getGoodsLocation());
stock.setWmsCategory(scTransmission.getCategory());
//盘点正确 2
//盘点异常 1
//暂时不盘点数量
Integer status = scTransmission.getRstCategory().equals(stock.getWmsCategory()) ? 2: 1;
//Integer status = ;
stock.setStatus(status);
stock.setTrayCode(scTransmission.getTrayNo());
stockMapper.updateById(stock);
log.info("update check info,taskId:{},SRMNumber:{},goodsLocation:{}",stock.getCheckNum(),scTransmission.getSRMNumber(),scTransmission.getGoodsLocation());
}else {
log.info("check end,but no stock info ,taskId:{},SRMNumber:{},goodsLocation:{}",scTransmission.getTaskNo(),scTransmission.getSRMNumber(),scTransmission.getGoodsLocation());
stock = new Stock();
stock.setCount(scTransmission.getCount());
stock.setCode(scTransmission.getCode());
stock.setStatus(1);
}
// checkLog(stock);
return stock;
}
// public Stock checkStart(SCTransmission scTransmission){
// log.info("【开始盘点货位】save stock info ,taskId:{},SRMNumber:{}goodsLocation:{}",scTransmission.getTaskNo(),scTransmission.getSRMNumber(),scTransmission.getGoodsLocation());
// Street street = streetService.getStreetByPlcId(scTransmission.getSRMNumber());
// Integer row = Integer.valueOf(scTransmission.getGoodsLocation().substring(8,10));
// Integer column = Integer.valueOf(scTransmission.getGoodsLocation().substring(5,8));
// Integer leftRight = Integer.valueOf(scTransmission.getGoodsLocation().substring(4,5));
// Integer inout = Integer.valueOf(scTransmission.getGoodsLocation().substring(11,12));
// Stock old = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(street.getId(),leftRight,inout,row,column);
// if(old == null){
// old = new Stock();
// old.setCount(null);
// old.setCode(null);
// old.setCategory(null);
// old.setCheckNum(scTransmission.getTaskNo());
// old.setLotnum(scTransmission.getTaskNo());
// old.setRow(row);
// old.setColumn(column);
// old.setDirection(leftRight);
// old.setSide(inout);
// old.setWmsCode(scTransmission.getGoodsLocation());
// old.setWmsCategory(scTransmission.getCategory());
// old.setWmsCount(scTransmission.getCount());
// old.setStreetId(street.getId());
// old.setExportTime(LocalDateTime.now());
// old.setWmsTrayCode("");
// stockMapper.insert(old);
// }else {
// old.setLotnum(scTransmission.getTaskNo());
// old.setExportTime(LocalDateTime.now());
// old.setWmsCode(scTransmission.getGoodsLocation());
// old.setWmsCount(scTransmission.getCount());
// old.setCheckNum(scTransmission.getTaskNo());
// old.setWmsTrayCode("");
// stockMapper.updateById(old);
// }
// return old;
// }
//
// /**
// * 保存盘点结果
// * @param scTransmission
// * @return
// */
// public Stock checkEnd(SCTransmission scTransmission){
// log.info("【盘点货位结果返回】update stock info ,taskId:{},SRMNumber:{},goodsLocation:{}",scTransmission.getTaskNo(),scTransmission.getSRMNumber(),scTransmission.getGoodsLocation());
// Street street = streetService.getStreetByPlcId(scTransmission.getSRMNumber());
// Integer row = Integer.valueOf(scTransmission.getGoodsLocation().substring(8,10));
// Integer column = Integer.valueOf(scTransmission.getGoodsLocation().substring(5,8));
// Integer leftRight = Integer.valueOf(scTransmission.getGoodsLocation().substring(4,5));
// Integer inout = Integer.valueOf(scTransmission.getGoodsLocation().substring(11,12));
// Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(street.getId(),leftRight,inout,row,column);
// if(stock != null){
//
// //暂时不盘点数量
// //stock.setCount(scTransmission.getRstCount());
// stock.setCount(scTransmission.getRstCategory().equals(stock.getWmsCategory())?scTransmission.getCount():0);
// stock.setCategory(scTransmission.getRstCategory());
// stock.setCode(scTransmission.getGoodsLocation());
// stock.setWmsCategory(scTransmission.getCategory());
// //盘点正确 2
// //盘点异常 1
// //暂时不盘点数量
// Integer status = scTransmission.getRstCategory().equals(stock.getWmsCategory()) ? 2: 1;
// //Integer status = ;
// stock.setStatus(status);
// stock.setTrayCode(scTransmission.getTrayNo());
// stockMapper.updateById(stock);
// log.info("update check info,taskId:{},SRMNumber:{},goodsLocation:{}",stock.getCheckNum(),scTransmission.getSRMNumber(),scTransmission.getGoodsLocation());
// }else {
// log.info("check end,but no stock info ,taskId:{},SRMNumber:{},goodsLocation:{}",scTransmission.getTaskNo(),scTransmission.getSRMNumber(),scTransmission.getGoodsLocation());
// stock = new Stock();
// stock.setCount(scTransmission.getCount());
// stock.setCode(scTransmission.getCode());
// stock.setStatus(1);
// }
//// checkLog(stock);
// return stock;
// }
public void checkLog(Stock stock){
CheckLog checkLog = new CheckLog();
@ -1052,57 +1131,57 @@ public class PlcService {
* C1
* @return
*/
@Transactional
public synchronized List<EmptyCheckPic> emptyCheck04(ECResultMessage ecResultMessage ){
EmptyCheckPic emptyCheckPic = new EmptyCheckPic(
ecResultMessage.getEmptyCheckMsg().substring(ecResultMessage.getEmptyCheckMsg()
.lastIndexOf(";",ecResultMessage.getEmptyCheckMsg().lastIndexOf(";")-1)+1,
ecResultMessage.getEmptyCheckMsg().lastIndexOf(",")),ecResultMessage.getTaskId(),ecResultMessage.getSRMNumber());
Street street = streetService.getStreetByPlcId(ecResultMessage.getSRMNumber());
if (street == null){
log.error("SRMNum: {} 对应的巷道不存在", ecResultMessage.getSRMNumber());
}
String leftOrRight = emptyCheckPic.getLeftOrRight().equals("2") ? "-R" :"-L";
//南京烟草物流只有一个相机
Integer cameraId = street.getCamera1Id() == null ? street.getCamera2Id():street.getCamera1Id();
//浅相机
//转动拍照
gyrateCameraByCode(cameraId,"C2-IN"+leftOrRight);
//等待2s再拍照
try {
Thread.sleep(3000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
String path = PathUtil.createFileNameByRowColumn("jpg",cameraId,
Integer.parseInt(emptyCheckPic.getRow()),
Integer.parseInt(emptyCheckPic.getColumn()),
emptyCheckPic.getInputString()+emptyCheckPic.getTaskCode()+"-IN");
cameraCapture(cameraId,false,0l,path );
emptyCheckPic.setShallowPic(path);
if( emptyCheckPic.getLeftOrRight().equals("1") ?street.getLeftType().equals(1) :street.getRightType().equals(1)){
//深相机
//转动拍照
gyrateCameraByCode(cameraId,"C2-OUT"+leftOrRight);
//等待2s再拍照
try {
Thread.sleep(3000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
path = path.replace("-IN","-OUT");
cameraCapture(cameraId,false,0l,path );
emptyCheckPic.setDeepPic(path );
}
emptyCheckPicMapper.insert(emptyCheckPic);
List<EmptyCheckPic> emptyCheckPics = emptyCheckPicMapper.selectList(new QueryWrapper<EmptyCheckPic>().eq("task_code",emptyCheckPic.getTaskCode()));
return emptyCheckPics;
}
// @Transactional
// public synchronized List<EmptyCheckPic> emptyCheck04(ECResultMessage ecResultMessage ){
// EmptyCheckPic emptyCheckPic = new EmptyCheckPic(
// ecResultMessage.getEmptyCheckMsg().substring(ecResultMessage.getEmptyCheckMsg()
// .lastIndexOf(";",ecResultMessage.getEmptyCheckMsg().lastIndexOf(";")-1)+1,
// ecResultMessage.getEmptyCheckMsg().lastIndexOf(",")),ecResultMessage.getTaskId(),ecResultMessage.getSRMNumber());
// Street street = streetService.getStreetByPlcId(ecResultMessage.getSRMNumber());
// if (street == null){
// log.error("SRMNum: {} 对应的巷道不存在", ecResultMessage.getSRMNumber());
// }
// String leftOrRight = emptyCheckPic.getLeftOrRight().equals("2") ? "-R" :"-L";
// //南京烟草物流只有一个相机
// Integer cameraId = street.getCamera1Id() == null ? street.getCamera2Id():street.getCamera1Id();
//
// //浅相机
// //转动拍照
// gyrateCameraByCode(cameraId,"C2-IN"+leftOrRight);
// //等待2s再拍照
// try {
// Thread.sleep(3000l);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
//
// String path = PathUtil.createFileNameByRowColumn("jpg",cameraId,
// Integer.parseInt(emptyCheckPic.getRow()),
// Integer.parseInt(emptyCheckPic.getColumn()),
// emptyCheckPic.getInputString()+emptyCheckPic.getTaskCode()+"-IN");
//
// cameraCapture(cameraId,false,0l,path );
// emptyCheckPic.setShallowPic(path);
// if( emptyCheckPic.getLeftOrRight().equals("1") ?street.getLeftType().equals(1) :street.getRightType().equals(1)){
//
// //深相机
// //转动拍照
// gyrateCameraByCode(cameraId,"C2-OUT"+leftOrRight);
// //等待2s再拍照
// try {
// Thread.sleep(3000l);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
//
// path = path.replace("-IN","-OUT");
// cameraCapture(cameraId,false,0l,path );
// emptyCheckPic.setDeepPic(path );
// }
// emptyCheckPicMapper.insert(emptyCheckPic);
// List<EmptyCheckPic> emptyCheckPics = emptyCheckPicMapper.selectList(new QueryWrapper<EmptyCheckPic>().eq("task_code",emptyCheckPic.getTaskCode()));
// return emptyCheckPics;
// }
public String getWebPicPath(){
@ -1146,4 +1225,30 @@ public class PlcService {
cameraCapture(cameraId,false,0l,path);
return configProperties.getIP()+":9007/api/pic/"+path;
}
public KsecInfo getKsecDataInfo(TransmissionPojo transmissionPojo, String type) {
KsecDataInfo ksecDataInfo = new KsecDataInfo();
CheckLog checkLog = checkLogMapper.selectById(transmissionPojo.getCheckId());
if(checkLog!=null) {
ksecDataInfo.setLotnum(checkLog.getLotnum());
ksecDataInfo.setSRMNumber(transmissionPojo.getStreetNumber());
ksecDataInfo.setCmdName(type);
ksecDataInfo.setTaskId(checkLog.getTaskId().toString());
ksecDataInfo.setFromDirection(checkLog.getDirection());
ksecDataInfo.setFromColumn(checkLog.getColumn());
ksecDataInfo.setFromRow(checkLog.getRow());
ksecDataInfo.setFromSide(checkLog.getSide());
ksecDataInfo.setCode(checkLog.getCode());
ksecDataInfo.setTrayCode(checkLog.getTrayCode());
ksecDataInfo.setLotnum(checkLog.getLotnum());
}
KsecInfo ksecInfo = new KsecInfo("KC", "E", ksecDataInfo);
return ksecInfo;
}
}

@ -1,7 +1,5 @@
package com.zhehekeji.web.service;
import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.pagehelper.PageHelper;
@ -17,19 +15,14 @@ import com.zhehekeji.web.mapper.StockMapper;
import com.zhehekeji.web.mapper.StreetMapper;
import com.zhehekeji.web.pojo.category.PageSearch;
import com.zhehekeji.web.pojo.stock.*;
import com.zhehekeji.web.service.client.ClientChanel;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@Service
@Slf4j

@ -31,7 +31,6 @@ 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;
import java.util.Map;

@ -1,32 +0,0 @@
package com.zhehekeji.web.service.client;
import lombok.Data;
@Data
/**
*
*/
public class CETransmission {
private static String HEADER = "CE";
private static String Split = "&";
private String SRMNumber;
public String toString(){
return HEADER + Split + SRMNumber;
}
public static String getHEADER(){
return HEADER;
}
public CETransmission(String body){
String [] strings = body.split(Split);
if(strings != null && strings.length == 2 && HEADER.equals(strings[0])){
SRMNumber = strings[1];
}
}
}

@ -2,15 +2,14 @@ package com.zhehekeji.web.service.client;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.InetSocketAddress;
import java.time.LocalDateTime;
import java.util.*;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**

@ -1,25 +0,0 @@
package com.zhehekeji.web.service.client;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
public class ClientCodeMap {
/**
* 线map
*/
protected static Map<String,String> codeMap = new Hashtable<>();
public static void putCode(String SRMNumber,String code){
codeMap.put(SRMNumber,code);
}
public static String getCode(String SRMNumber){
return codeMap.get(SRMNumber);
}
public static void removeCode(String SRMNumber){
codeMap.remove(SRMNumber);
}
}

@ -1,10 +1,10 @@
package com.zhehekeji.web.service.client;
import com.zhehekeji.web.entity.EmptyCheckPic;
import com.zhehekeji.web.entity.Stock;
import com.zhehekeji.web.lib.CameraDelayTask;
import com.zhehekeji.web.service.EmptyCheckService;
import com.zhehekeji.web.service.PlcService;
import com.zhehekeji.web.service.putian.*;
import com.zhehekeji.web.service.ksec.KsecInfo;
import com.zhehekeji.web.service.ksec.KsecNettyClient;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
@ -14,7 +14,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.Charset;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@ -27,9 +26,18 @@ public class Decoder extends DelimiterBasedFrameDecoder {
private static final Logger tcpLogger = LoggerFactory.getLogger("tcp");
public static String PT_CLIENT = "PT";
private static String WCS_CLIENT = "WCS";
private static String EMPTY_CLIENT = "EMPTY";
public static String START_CHECK = "ST";
private static String GET_PHOTO = "GP";
private static String GET_PHOTO_END = "GPE";
private static String RETURN_CHECK = "RTE";
private static String FOLLOW_GET_PHOTO_END = "SGPE";
private static String END_CHECK = "EN";
private static String HEART_BEAT = "HB";
private static String CONNECT_START = "CE";
private static String END_STRING = "$";
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,15,30, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(20000));
@ -79,206 +87,46 @@ public class Decoder extends DelimiterBasedFrameDecoder {
@Override
public void run() {
String body = in.toString(Charset.forName("UTF-8"));
tcpLogger.info("receive client:{}, data length:{}",body, body.length());
//普天发送的报文里带"#"
if(body.contains("#")){
ClientChanel.connect(WCS_CLIENT, ctx.channel());
tcpLogger.info("client:{} connect", WCS_CLIENT);
PTData ptData = new PTData(body+END_STRING);
if(ptData.getType().equals(PTData.HEART_TYPE) ||
ptData.getFlowControl().equals(PTData.FLOW_A)){
//心跳 什么都不处理,因为netty长链接断开会感知
//普天回复的消息也不用处理
}
// else if (ptData.getType().equals(PT_CLIENT)){
// ClientChanel.connect(WCS_CLIENT, ctx.channel());
// tcpLogger.info("client:{} connect", WCS_CLIENT);
// }
else if (ptData.getType().equals(PTData.EMPTY_CHECK_01)){
log.info("空货位检测开始");
PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.EMPTY_CHECK_01);
PuTianNettyClient.write(ptDataSend);
PTEmptyCheckContent emptyCheckContent = PTEmptyCheckContent.EmptyCheck(ptData.getContent());
String startEmptyCheckStr = ECTransmission.toEmptyCheckStartString(emptyCheckContent.getSRMNUmber(),emptyCheckContent.getTaskNo());
//通知客户端开始检测
ClientChanel.write(startEmptyCheckStr,emptyCheckContent.getSRMNUmber());
in.release();
}
else if (ptData.getType().equals(PTData.EMPTY_CHECK_02)){
log.info("空货位检测结束");
PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.EMPTY_CHECK_02);
PuTianNettyClient.write(ptDataSend);
PTEmptyCheckContent emptyCheckContent = PTEmptyCheckContent.EmptyCheck(ptData.getContent());
String endEmptyCheckStr = ECTransmission.toEmptyCheckEndString(emptyCheckContent.getSRMNUmber(), emptyCheckContent.getTaskNo());
// //通知客户端结束检测
ClientChanel.write(endEmptyCheckStr, emptyCheckContent.getSRMNUmber());
//ClientChanel.write(endEmptyCheckStr, emptyCheckContent.getSRMNUmber());
in.release();
tcpLogger.info("receive client:{}, data length:{}", body, body.length());
TransmissionPojo transmissionPojo = new TransmissionPojo(body);
//心跳进行连接
if(HEART_BEAT.equals(transmissionPojo.getHeader()) || CONNECT_START.equals(transmissionPojo.getHeader())){
ClientChanel.connect(transmissionPojo.getStreetNumber(),ctx.channel());
}
//获取照片后发送进行计算逻辑,并在拍照队列中取出拍照发送
else if(GET_PHOTO_END.equals(transmissionPojo.getHeader())){
if(transmissionPojo.getTaskId() != null && !"0".equals(transmissionPojo.getTaskId())) {
ClientChanel.get(transmissionPojo.getStreetNumber()).writeAndFlush(transmissionPojo.toString(TransmissionType.RTS));
// GetPhotoDelayExecutor.addCameraDelayTask(transmissionPojo.getStreetNumber(), transmissionPojo.toString(TransmissionType.RTS), 3000);
}
else if (ptData.getType().equals(PTData.STOCK_CHECK_01)){
log.info("具体货位盘点");
PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.STOCK_CHECK_01);
PuTianNettyClient.write(ptDataSend);
//发送给客户端
PTCheckContent ptCheckContent = PTCheckContent.CheckContentSC01(ptData.getContent());
SCTransmission scTransmission = new SCTransmission(ptCheckContent.getSRMNUmber(),ptCheckContent.getTaskNo(),ptCheckContent.getGoodsLocation(),ptCheckContent.getCode(), ptCheckContent.getCount(), "N");
plcService.checkStart(scTransmission);
String scTransmissionStr = scTransmission.toString();
ClientChanel.write(scTransmissionStr,ptCheckContent.getSRMNUmber());
in.release();
try {
Thread.sleep(50L);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
else if (ptData.getType().equals(PTData.STOCK_CHECK_02)){
log.info("盘点具体货位 ,货物已取到载货台");
PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.STOCK_CHECK_02);
PuTianNettyClient.write(ptDataSend);
PTCheckContent ptCheckContent = PTCheckContent.CheckContentSC02(ptData.getContent());
SCTransmission scTransmission = new SCTransmission(ptCheckContent.getSRMNUmber(),ptCheckContent.getTaskNo());
String scTransmissionStr = scTransmission.toSC02String();
ClientChanel.write(scTransmissionStr,ptCheckContent.getSRMNUmber());
//删除队列的拍照数据
GetPhotoDelayExecutor.remove(transmissionPojo.getStreetNumber(),transmissionPojo);
//读取下一个发送
CameraDelayTask cameraDelayTask = GetPhotoDelayExecutor.nextOne(transmissionPojo.getStreetNumber(),transmissionPojo.toString(TransmissionType.GPS));
if (cameraDelayTask != null) {
TransmissionPojo pojo = new TransmissionPojo(cameraDelayTask.getCommand());
ClientChanel.get(pojo.getStreetNumber()).writeAndFlush(pojo.toString(TransmissionType.GPS));
}
else if (ptData.getType().equals(PTData.Into_Stock_01)){
//这边入库顶部拍照要换成用客户端顶部的两个相机拍照上位机发送的IS01入库拍照指令后给客户端发送顶部拍照指令客户端拍到两张照片后会发送拍照信息给web端web端再发给上位机。
log.info("普天入库顶部拍照");
PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.Into_Stock_01);
//保存order标表
PTOrderContent ptOrderContent = PTOrderContent.OrderContentIS01And03(ptData.getContent(),",");
String picPath = plcService.IntoStock(ptOrderContent.getSRMNUmber(), ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation());
//返回普天
PTData resData = PTData.IntoStock02(ptOrderContent.getSRMNUmber(), ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation(),picPath);
tcpLogger.info("普天入库顶部拍照发送给客户端:"+"IS&" +ptOrderContent.getSRMNUmber()+"&"+ ptOrderContent.getTaskNo()+"&"+ ptOrderContent.getGoodsLocation(), ptOrderContent.getSRMNUmber());
ClientChanel.write("IS&" +ptOrderContent.getSRMNUmber()+"&"+ ptOrderContent.getTaskNo()+"&"+ ptOrderContent.getGoodsLocation(), ptOrderContent.getSRMNUmber());
//PuTianNettyClient.write(resData);
//
// log.info("入库顶部拍照");
// PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.Into_Stock_01);
// PuTianNettyClient.write(ptDataSend);
// //保存order标表
// PTOrderContent ptOrderContent = PTOrderContent.OrderContentIS01And03(ptData.getContent());
// String srmNumber = ptOrderContent.getSRMNUmber();
//// if (srmNumber.length() < 3){
//// Integer number = Integer.valueOf(srmNumber);
//// srmNumber = String.format("%03d", number);
//// }
// String picPath = plcService.IntoStock(srmNumber, ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation());
// //返回普天
// PTData resData = PTData.IntoStock02(ptOrderContent.getSRMNUmber(), ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation(),picPath);
// PuTianNettyClient.write(resData);
}
else if (ptData.getType().equals(PTData.Into_Stock_03)){
log.info("入库侧面拍照");
PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.Into_Stock_03);
PuTianNettyClient.write(ptDataSend);
PTOrderContent ptOrderContent = PTOrderContent.OrderContentIS01And03(ptData.getContent(), ",");
String srmNumber = ptOrderContent.getSRMNUmber();
// if (srmNumber.length() < 3){
// Integer number = Integer.valueOf(srmNumber);
// srmNumber = String.format("%03d", number);
// }
String picPath = plcService.IntoStockOver(srmNumber, ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation());
PTData resData = PTData.IntoStock04(ptOrderContent.getSRMNUmber(), ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation(), picPath, ptOrderContent.getGoodsLocation());
//重置相机水平方向
plcService.verticalAdjustmentByStreet( ptOrderContent.getSRMNUmber());
PuTianNettyClient.write(resData);
}
}
else{
if(body.startsWith(HBTransmission.getHEADER())) {
//心跳
HBTransmission hbTransmission = new HBTransmission(body);
//回复客户端心跳
ctx.channel().writeAndFlush(hbTransmission.toString());
ClientChanel.connect(hbTransmission.getSRMNumber(), ctx.channel());
//tcpLogger.info("client:{} heart", hbTransmission.getSRMNumber());
in.release();
} else if(body.startsWith(SCTransmission.getHeader())){
//盘点指令
SCTransmission scTransmission = new SCTransmission(body);
if(scTransmission.isCollectOver()){
//给普天发送数据采集完毕指令
PTData ptData = PTData.StockCheck03(scTransmission.getSRMNumber(),scTransmission.getTaskNo(),"1");
PuTianNettyClient.write(ptData);
}else {
//收到盘点结果
Stock stock = plcService.checkEnd(scTransmission);
//将盘点结果发给普天
PTData ptData = PTData.StockCheck04(scTransmission);
PuTianNettyClient.write(ptData);
//添加到实时信息里
RealtimeCheckMap.put(scTransmission.getSRMNumber(),scTransmission.checkInfo());
//更新盤點統計
// emptyCheckService.updateCheckLastTime(tmTransmission.getTaskNo(),tmTransmission.getSRMNumber(),stock.getCode());
}
in.release();
}else if(body.startsWith(CETransmission.getHEADER())){
//客户端建立连接
CETransmission ceTransmission = new CETransmission(body);
//回复客户端,建立连接完成
//照片和结果保存,并发送给上位机
else if(RETURN_CHECK.equals(transmissionPojo.getHeader())){
//保存数据
ctx.channel().writeAndFlush(ceTransmission.toString());
ClientChanel.connect(ceTransmission.getSRMNumber(), ctx.channel());
tcpLogger.info("client:{} connect", ceTransmission.getSRMNumber());
in.release();
}
else if(body.startsWith(ECTransmission.getHEADER())){
//空货位盘点
ECResultMessage ecResultMessage = new ECResultMessage(body);
log.info("empty result: {}", body);
//将库位的盘点结果发给普天
StringBuffer strBff = new StringBuffer(ecResultMessage.getSRMNumber());
strBff.append("*").append(ecResultMessage.getTaskId()).append("*").append(ecResultMessage.getEmptyCheckMsg());
// strBff.append(",").append(ecTransmission.getIsEmpty());
String content = strBff.toString();
PTData ptData = new PTData(content, PTData.FLOW_R, PTData.EMPTY_CHECK_03);
PuTianNettyClient.write(ptData);
//返回结尾货位两侧的照片(EC04)(易高发送)
//照片
List<EmptyCheckPic> emptyCheckPics = plcService.emptyCheck04(ecResultMessage);
String webPicPath = plcService.getWebPicPath();
if(emptyCheckPics.size() > 1){
StringBuffer strBffPic = new StringBuffer(ecResultMessage.getSRMNumber());
strBffPic.append(",").append(ecResultMessage.getTaskId()).append(",").append(EmptyCheckPic.getShelfCodeEntityConverter(emptyCheckPics,webPicPath));
PTData ptDataEmptyCheck04 = new PTData(strBffPic.toString(), PTData.FLOW_R, PTData.EMPTY_CHECK_04);
PuTianNettyClient.write(ptDataEmptyCheck04);
}
//保存空货位条码
// EmptyCheckCodeInfo.addCode(ecTransmission.getSRMNumber(),ecTransmission.getRow(),ecTransmission.getStartColumn(), ecTransmission.getEndColumn(), ecTransmission.getOriginCode());
//保存空货位信息
List<ECTransmission> ecTransmissionList = ecResultMessage.getEcTransMissionList();
for (ECTransmission ecTransmission : ecTransmissionList) {
emptyCheckService.emptyCheckLog(ecTransmission);
}
in.release();
}
else if(body.startsWith("IS")){
//这边入库顶部拍照要换成用客户端顶部的两个相机拍照上位机发送的IS01入库拍照指令后给客户端发送顶部拍照指令客户端拍到两张照片后会发送拍照信息给web端web端再发给上位机。
log.info("客户端入库顶部拍照");
//保存order标表
PTOrderContent ptOrderContent = PTOrderContent.OrderContentIS01And03(body.substring(3));
String picPath = plcService.IntoStockSave(ptOrderContent.getSRMNUmber(), ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation(),ptOrderContent.getPics());
//返回普天
PTData resData = PTData.IntoStock02(ptOrderContent.getSRMNUmber(), ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation(),picPath);
PuTianNettyClient.write(resData);
tcpLogger.info("客户端返回信息:"+resData);
in.release();
}
else if(body.startsWith("DC")){
//客户端断开连接
String [] strings = body.split("&");
if(strings != null && strings.length == 2){
tcpLogger.info("client:{} disConnect", strings[1]);
ClientChanel.disConnect(strings[1]);
}
in.release();
}
}
//照片和结果保存,并发送给上位机
else if(FOLLOW_GET_PHOTO_END.equals(transmissionPojo.getHeader())){
}
}
}
}

@ -1,50 +0,0 @@
package com.zhehekeji.web.service.client;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Data
/**
*
*
* EC&6&17455&UL061001050111,1;UL061002050111,0;UL061003050111,1;>
* UL061001050111,1 ,01
*/
public class ECResultMessage {
private static String HEADER = "EC";
private static String SPLIT = "&";
private static String SPLIT_EMP = ";";
private String SRMNumber;
private String taskId;
private String emptyCheckMsg;
private List<ECTransmission> ecTransMissionList;
public ECResultMessage(String body){
ecTransMissionList = new ArrayList<>();
log.info("body: {}", body);
String [] strings = body.split(SPLIT);
if(strings != null && strings.length == 4 && HEADER.equals(strings[0])){
SRMNumber = strings[1];
taskId = strings[2];
emptyCheckMsg = strings[3];
log.info("srmNumber:{}, taskId:{},emptyCheckMsg:{}", SRMNumber, taskId, emptyCheckMsg);
String[] checkMsgStrs = emptyCheckMsg.split(SPLIT_EMP);
for (String checkMsgStr : checkMsgStrs) {
if (!checkMsgStr.isEmpty() && checkMsgStr.contains(",")){
log.info("checkMsgStr: {}", checkMsgStr);
String[] msgStrs = checkMsgStr.split(",");
String goodsLocation = msgStrs[0];
String empty = msgStrs[1];
ECTransmission ecTransmission = new ECTransmission(SRMNumber, taskId, goodsLocation, empty);
ecTransMissionList.add(ecTransmission);
}
}
}
}
}

@ -1,125 +0,0 @@
package com.zhehekeji.web.service.client;
import lombok.Data;
@Data
/**
*
*
* EC,SRM001,BY201710250940368150001,START;
* EC,SRM001,BY201710250940368150001,R010002001() Y/N;
* EC,SRM001,BY201710250940368150001,END ;()
*
*/
public class ECTransmission {
private static String HEADER = "EC";
private static String Split = "&";
// private static String Split = ",";
private String SRMNumber;
private String taskId;
private String type;
private String goodsLocation;
private String isEmpty;
private String emptyMsg;
/**
* 1: 2
*/
private Integer direction;
/**
* 1 2
*/
private Integer side;
private Integer row;
private Integer column;
private Integer startColumn;
private Integer endColumn;
/**
*
*/
private String originCode;
// public String toString(){
// return HEADER + Split + SRMNumber;
// }
public static String getHEADER(){
return HEADER;
}
public ECTransmission(String body){
String [] strings = body.split(Split);
if(strings != null && strings.length == 4 && HEADER.equals(strings[0])){
SRMNumber = strings[1];
taskId = strings[2];
// goodsLocation = strings[3];
// isEmpty = strings[4];
emptyMsg = strings[3];
// direction = goodsLocation.substring(0).equals("L") ? 1:2;
// side = Integer.valueOf(goodsLocation.substring(2,3));
// row = Integer.valueOf(goodsLocation.substring(3,6));
// column = Integer.valueOf(goodsLocation.substring(6,9));
}else if(strings != null && strings.length == 8 && HEADER.equals(strings[0])){
//todo length == 9
SRMNumber = strings[1];
taskId = strings[2];
startColumn = Integer.valueOf(strings[4]);
endColumn = Integer.valueOf(strings[5]);
goodsLocation = strings[6];
direction = goodsLocation.substring(0).equals("L") ? 1:2;
side = Integer.valueOf(goodsLocation.substring(2,3));
row = Integer.valueOf(goodsLocation.substring(3,6));
column = Integer.valueOf(goodsLocation.substring(6,9));
//todo 7 8
originCode = "ddddd";
isEmpty = strings[7];
}
}
public ECTransmission(String srmNumber, String id, String location, String empty){
SRMNumber = srmNumber;
taskId = id;
goodsLocation = location;
isEmpty = empty;
// UL061001050111
row = Integer.valueOf(goodsLocation.substring(8,10));
column = Integer.valueOf(goodsLocation.substring(5,8));
direction = Integer.valueOf(goodsLocation.substring(4,5));
side = Integer.valueOf(goodsLocation.substring(11,12));
}
/**
*
* @return
*/
public static String toEmptyCheckStartString(String SRMNumber, String taskId){
StringBuffer sb = new StringBuffer(HEADER);
sb.append(Split).append(SRMNumber).append(Split).append(taskId).append(Split).append("START");
return sb.toString();
}
/**
*
* @return
*/
public static String toEmptyCheckEndString(String SRMNumber, String taskId){
StringBuffer sb = new StringBuffer(HEADER);
sb.append(Split).append(SRMNumber).append(Split).append(taskId).append(Split).append("END");
return sb.toString();
}
}

@ -1,41 +0,0 @@
package com.zhehekeji.web.service.client;
import lombok.Data;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
*
*/
@Data
public class EmptyCheckCodeInfo {
private static Map<String, Set<String>> allCode = new HashMap<>();
public static void start(String SRMNumber, String taskNo){
String key = String.format("{}-{}",SRMNumber, taskNo);
allCode.remove(key);
}
public static void addCode(String SRMNumber,Integer row,Integer startColumn,Integer endColumn,String code){
String key = String.format("{}-{}-{}-{}",SRMNumber,row,startColumn,endColumn);
Set<String> codes = allCode.get(key);
if(codes == null){
codes = new HashSet<>();
}
codes.add(code);
}
public static Set<String> getAllCode(String SRMNumber, String taskNo){
String key = String.format("{}-{}",SRMNumber, taskNo);
return allCode.get(key);
}
public static void stop(String SRMNumber,Integer row,Integer startColumn,Integer endColumn){
String key = String.format("{}-{}-{}-{}",SRMNumber,row,startColumn,endColumn);
allCode.remove(key);
}
}

@ -0,0 +1,207 @@
package com.zhehekeji.web.service.client;
import com.zhehekeji.common.util.SpringContextUtil;
import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.lib.CameraDelayTask;
import com.zhehekeji.web.service.PlcService;
import com.zhehekeji.web.service.ksec.KsecInfo;
import com.zhehekeji.web.service.ksec.KsecNettyClient;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* GetPhotoDelayExecutor
*/
@Slf4j
public class GetPhotoDelayExecutor {
// 延时队列存放CameraDelayTask任务
public static Map<String, DelayQueue<CameraDelayTask>> cameraDelayTaskMap = new ConcurrentHashMap<>();
// 线程池,用于执行延时任务
public static DelayQueue<CameraDelayTask> delayTasks = new DelayQueue<>();
private static ExecutorService exec = Executors.newFixedThreadPool(15);
/**
*
*
* @param plcId PLC
* @param getPhotoCommand
* @param time
*/
public static void addCameraDelayTask(String plcId, String getPhotoCommand, long time,TransmissionPojo transmissionPojo) {
// 如果队列为空,则直接发送命令
if(cameraDelayTaskMap.get(plcId)==null || cameraDelayTaskMap.get(plcId).size() == 0) {
if( ClientChanel.get(plcId) != null){
log.info("队列中无数据,输出"+getPhotoCommand);
ClientChanel.get(plcId).writeAndFlush(getPhotoCommand);
}else {
log.info("队列中无数据,未找到通信"+plcId);
}
}
// 创建一个CameraDelayTask对象并将其添加到队列中
CameraDelayTask cameraDelayTask = new CameraDelayTask(plcId, getPhotoCommand, time,transmissionPojo);
if(cameraDelayTaskMap.get(plcId)!=null){
cameraDelayTaskMap.get(plcId).add(cameraDelayTask);
}else {
cameraDelayTaskMap.put(plcId,new DelayQueue<>());
cameraDelayTaskMap.get(plcId).add(cameraDelayTask);
}
delayTasks.add(cameraDelayTask);
}
/**
* PLC
*
* @param plcId
*/
public static CameraDelayTask remove(String plcId, TransmissionPojo transmissionPojo) {
synchronized (plcId) {
// 将延时队列中的任务转换为数组,便于遍历和移除
Object[] objects = cameraDelayTaskMap.get(plcId).toArray();
if(objects.length > 0) {
for(Object object : objects){
CameraDelayTask cameraDelayTask = (CameraDelayTask)object;
if (cameraDelayTask != null
&& cameraDelayTask.getTransmissionPojo().getTaskId().equals(transmissionPojo.getTaskId())
&& cameraDelayTask.getTransmissionPojo().getCheckId().equals(transmissionPojo.getCheckId())
&& cameraDelayTask.getTransmissionPojo().getDirection().equals(transmissionPojo.getDirection())) {
cameraDelayTaskMap.get(plcId).remove(cameraDelayTask);
return cameraDelayTask;
}
}
}
}
return null;
}
public static CameraDelayTask removeTask(String plcId, TransmissionPojo transmissionPojo) {
synchronized (plcId){
// 将延时队列中的任务转换为数组,便于遍历和移除
Object[] objects = delayTasks.toArray();
if(objects.length > 0) {
for(Object object : objects){
CameraDelayTask cameraDelayTask = (CameraDelayTask)object;
if (cameraDelayTask != null
&& cameraDelayTask.getTransmissionPojo().getTaskId().equals(transmissionPojo.getTaskId())
&& cameraDelayTask.getTransmissionPojo().getCheckId().equals(transmissionPojo.getCheckId())
&& cameraDelayTask.getTransmissionPojo().getDirection().equals(transmissionPojo.getDirection())) {
delayTasks.remove(cameraDelayTask);
return cameraDelayTask;
}
}
}
}
return null;
}
public static CameraDelayTask nextOne(String plcId, String getPhotoCommand) {
plcId = plcId.intern();
synchronized (plcId) {
// 将延时队列中的任务转换为数组,便于遍历和移除
Object[] objects = cameraDelayTaskMap.get(plcId).toArray();
if(objects.length > 0) {
CameraDelayTask cameraDelayTask = (CameraDelayTask)objects[0];
if (cameraDelayTask != null) {
return cameraDelayTask;
}
}
}
return null;
}
/**
*
*/
public static void runExecutor(List<Street> streets ) {
for (Street street: streets){
exec.execute(new Consumer(street));
}
exec.execute(new TaskConsumer());
}
/**
* ConsumerRunnable
*/
private static class Consumer implements Runnable {
private Street street;
Consumer(Street street){
this.street = street;
}
/**
*
*/
@Override
public void run() {
while (true) {
try {
// 从Spring上下文中获取PlcService实例
PlcService plcService = SpringContextUtil.getBean(PlcService.class);
// 从延时队列中获取并移除一个任务
if (cameraDelayTaskMap.get(street.getPlcId())!=null) {
CameraDelayTask cameraDelayTask = cameraDelayTaskMap.get(street.getPlcId()).take();
// if (cameraDelayTask != null) {
// // 构造传输对象,并将任务命令等信息设置进去
// TransmissionPojo transmissionPojo = new TransmissionPojo(cameraDelayTask.getCommand());
// // 调用PLC服务模拟发送数据到上位机
// KsecInfo ksecInfo = plcService.getKsecDataInfo(transmissionPojo, "E");
// ksecInfo.getData().setTypeNum(transmissionPojo.getCategory());
// ksecInfo.getData().setQuantity(transmissionPojo.getCount());
// ksecInfo.getData().setCheckRlt(0);
// // 将信息发送给上位机
// if (!transmissionPojo.getTaskId().equals("0"))
// KsecNettyClient.write(ksecInfo);
// }
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private static class TaskConsumer implements Runnable {
/**
*
*/
@Override
public void run() {
while (true) {
try {
// 从Spring上下文中获取PlcService实例
PlcService plcService = SpringContextUtil.getBean(PlcService.class);
// 从延时队列中获取并移除一个任务
CameraDelayTask cameraDelayTask = delayTasks.take();
if (cameraDelayTask != null) {
// 构造传输对象,并将任务命令等信息设置进去
TransmissionPojo transmissionPojo = new TransmissionPojo(cameraDelayTask.getCommand());
// 调用PLC服务模拟发送数据到上位机
KsecInfo ksecInfo = plcService.getKsecDataInfo(transmissionPojo, "E");
ksecInfo.getData().setTypeNum(transmissionPojo.getCategory());
ksecInfo.getData().setQuantity(transmissionPojo.getCount());
ksecInfo.getData().setCheckRlt(0);
// 将信息发送给上位机
if (!transmissionPojo.getTaskId().equals("0"))
KsecNettyClient.write(ksecInfo);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}

@ -1,36 +0,0 @@
package com.zhehekeji.web.service.client;
import lombok.Data;
@Data
/**
*
*/
public class HBTransmission {
private static String HEADER = "HB";
private static String Split = "&";
private String SRMNumber;
public String toString(){
return HEADER + Split + SRMNumber;
}
public static String getHEADER(){
return HEADER;
}
public HBTransmission(String body){
String [] strings = body.split(Split);
if(strings != null && strings.length == 2 && HEADER.equals(strings[0])){
SRMNumber = strings[1];
}
}
public static void main(String[] args) {
HBTransmission ceTransmission= new HBTransmission("HB&1");
System.out.println(ceTransmission);
}
}

@ -1,44 +0,0 @@
package com.zhehekeji.web.service.client;
import lombok.Data;
@Data
public class ISTransmission {
private static String HEADER = "IS";
private static String Split = ",";
private String SRMNumber;
private String taskId;
private String goodsLocation;
private String code;
public String toString(){
StringBuffer sb = new StringBuffer();
sb.append(HEADER).append(Split).append(SRMNumber).append(Split).append(taskId).append(Split).append(goodsLocation);
if(code != null){
sb.append(Split).append(code);
}
return sb.toString();
}
public ISTransmission(String SRMNumber,String taskId,String goodsLocation){
this.SRMNumber = SRMNumber;
this.goodsLocation = goodsLocation;
this.taskId = taskId;
}
public ISTransmission(String msg){
String [] strings = msg.split(Split);
HEADER = strings[0];
SRMNumber = strings[1];
goodsLocation = strings[2];
if(strings.length == 4){
code = strings[3];
}
}
}

@ -1,34 +0,0 @@
package com.zhehekeji.web.service.client;
import lombok.Data;
@Data
/**
*
*/
public class LCTransmission {
private static String HEADER = "LC";
private String SRMNumber;
/**
* 1: 0
*/
private Integer status;
public String toString(){
return HEADER + "&" + SRMNumber+"&"+status;
}
public static String getHEADER(){
return HEADER;
}
public LCTransmission(String SRMNumber,Integer status){
this.SRMNumber = SRMNumber;
this.status = status;
}
}

@ -1,13 +0,0 @@
package com.zhehekeji.web.service.client;
import org.springframework.stereotype.Component;
/**
*
*/
@Component
public class MessageConverter {
}

@ -1,87 +0,0 @@
package com.zhehekeji.web.service.client;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
@Data
public class RealtimeCheckMap {
private static Map<String,CheckInfo> map = new HashMap<>();
public static void put(String SRMNumber,CheckInfo checkInfo){
checkInfo.setTime(LocalDateTime.now());
String ip ="http://"+ClientChanel.getIpFromId(SRMNumber)+":9009/pic/"+checkInfo.getCheckCode()+"/"+checkInfo.getTaskNo()+"/";
checkInfo.setIP(ip);
checkInfo.setSidePic1(String.format("%s1.png",ip));
checkInfo.setSidePic2(String.format("%s2.png",ip));
checkInfo.setSidePic3(String.format("%s3.png",ip));
checkInfo.setSidePic4(String.format("%s4.png",ip));
checkInfo.setTopPic1(String.format("%s5.png",ip));
checkInfo.setTopPic2(String.format("%s6.png",ip));
map.put(SRMNumber,checkInfo);
}
public static CheckInfo getRealtimeCheck(String SRMNumber){
return map.get(SRMNumber);
}
@Data
public static class CheckInfo{
private Integer row;
private Integer column;
private Integer side;
private Integer direction;
private String WMSCode;
private String WMSCategory;
private Integer WMSCount;
private String checkCode;
private String checkCategory;
private Integer checkCount;
private Integer status;
private String topPic1;
private String topPic2;
private String sidePic1;
private String sidePic2;
private String sidePic3;
private String sidePic4;
private String IP;
private String taskNo;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime time;
public Integer getStatus(){
if(WMSCode.equals(checkCount) && checkCount.equals(WMSCount)){
return 1;
}
return 0;
}
}
}

@ -1,181 +0,0 @@
package com.zhehekeji.web.service.client;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@Slf4j
/**
*
*
*
*/
@Data
public class SCTransmission {
private static String header = "SC";
private String SRMNumber;
/**
*
*/
private String taskNo;
/**
*
*/
private String goodsLocation;
/**
*
*/
private String trayNo;
private String code;
/**
*
*/
private String category;
private Integer count;
/**
*
*/
private String rstCategory;
private Integer rstCount;
private String visualTest;
private String isDisConnect;
/**
*
*/
private String checkRst;
/**
* 1: 2
*/
private Integer direction;
/**
* 1 2
*/
private Integer side;
private static String Split = "&";
private boolean collectOver;
public String toString(){
StringBuffer sb = new StringBuffer(header);
sb.append(Split).append(SRMNumber).append(Split).append(goodsLocation).append(Split)
.append(taskNo).append(Split).append(code)
.append(Split).append(count).append(Split).append(visualTest);
return sb.toString();
}
public String toSC02String(){
return header+Split+SRMNumber+Split+taskNo;
}
public static String getHeader(){
return header;
}
// public SCTransmission(String body){
// String [] strings = body.split(Split);
// if(strings != null && strings.length >= 9 && strings[0].equals(header)){
// if(strings.length == 9){
// SRMNumber = strings[1];
// taskNo = strings[2];
// goodsLocation = strings[3];
// trayNo = strings[4];
// code = strings[5];
// count = Integer.valueOf(strings[6]);
// visualTest = strings[7];
// isDisConnect = strings[8];
// direction = goodsLocation.substring(0).equals("L") ? 1:2;
// side = Integer.valueOf(goodsLocation.substring(2,3));
// //checkType = strings[7];
// collectOver = false;
// if("Y".equals(isDisConnect)){
// //需要拆分之前的
// }
// }
//
// }else if(strings.length == 3){
// //是盘点数据采集完成的信号
// collectOver = true;
// SRMNumber = strings[1];
// taskNo = strings[2];
// //goodsLocation = strings[3];
// }
// }
//TM&6&UL062009050111&2121&11010019&30&NULL&NULL
public SCTransmission(String body){
log.info("tmtrans body: {}", body);
String [] strings = body.split(Split);
if(strings != null && strings.length >= 9 && strings[0].equals(header)){
if(strings.length == 9){
SRMNumber = strings[1];
goodsLocation = strings[2];
taskNo = strings[3];
category = strings[4];
count = Integer.valueOf(strings[5]);
rstCategory = strings[6];
rstCount = Integer.valueOf(strings[7]);
checkRst = strings[8];
collectOver = false;
log.info("taskNo:{}, srmNumber:{}, goodsLocation:{}", taskNo, SRMNumber, goodsLocation);
// if("Y".equals(isDisConnect)){
// //需要拆分之前的
// }
}
}else if(strings.length == 3){
//是盘点数据采集完成的信号
collectOver = true;
SRMNumber = strings[1];
taskNo = strings[2];
//goodsLocation = strings[3];
}
}
public SCTransmission(String SRMNumber,String taskId,String goodsLocation,String code,Integer count,String visual){
this.SRMNumber = SRMNumber;
this.taskNo = taskId;
this.goodsLocation = goodsLocation;
this.code = code;
this.count = count;
this.trayNo = "Unknown";
this.visualTest = visual;
}
public SCTransmission(String SRMNumber,String taskId){
this.SRMNumber = SRMNumber;
this.taskNo = taskId;
}
public RealtimeCheckMap.CheckInfo checkInfo(){
log.info("cheinfo start");
RealtimeCheckMap.CheckInfo checkInfo = new RealtimeCheckMap.CheckInfo();
Integer row = Integer.valueOf(goodsLocation.substring(8,10));
Integer column = Integer.valueOf(goodsLocation.substring(5,8));
Integer leftRight = Integer.valueOf(goodsLocation.substring(4,5));
Integer inout = Integer.valueOf(goodsLocation.substring(11,12));
checkInfo.setDirection(leftRight);
checkInfo.setColumn(column);
checkInfo.setRow(row);
checkInfo.setSide(inout);
checkInfo.setTaskNo(this.taskNo);
// checkInfo.setWMSCategory(category);
// checkInfo.setWMSCount(count);
// checkInfo.setWMSCode(code);
checkInfo.setCheckCode(goodsLocation);
checkInfo.setCheckCount(rstCount);
//checkInfo.setCheckCategory();
return checkInfo;
}
}

@ -0,0 +1,164 @@
package com.zhehekeji.web.service.client;
import com.zhehekeji.web.entity.CheckLog;
import com.zhehekeji.web.entity.Street;
import lombok.Data;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
@Data
public class TransmissionPojo {
private String data;
private String[] dataArray;
private String header;
private String streetNumber;//巷道标识符
private Integer row;//行
private Integer column;//列
private String pcd;//点位文件路径
private String taskId;
private String checkId;
private Integer direction;//左右
private Integer count = 0; //数量
private String category = ""; //品规
private Set<String> picsPath; //照片
private Integer result;
public TransmissionPojo(CheckLog checkLog , Street street){
this.checkId = checkLog.getId().toString();
this.streetNumber = street.getPlcId();
this.taskId = checkLog.getLotnum();
this.row = checkLog.getRow();
this.column = checkLog.getColumn();
this.direction = checkLog.getDirection();
this.count = checkLog.getCount();
if(checkLog.getCategory() != null && checkLog.getCategory().contains("/")) {
this.category = checkLog.getCategory().split("/")[0];
}else {
this.category = checkLog.getCategory();
}
}
/**
* 30
*
* @param number
* @param length 3
* @return
*/
public static String convertNumberToFixedLengthChars(int number, int length) {
if (length < 1) {
throw new IllegalArgumentException("Length must be a positive integer.");
}
String numStr = Integer.toString(number);
while (numStr.length() < length) {
numStr = "0" + numStr;
}
return numStr;
}
public TransmissionPojo( Street street,Integer row , Integer column,Integer direction,String orderId){
this.streetNumber = street.getPlcId();
this.row = row;
this.taskId = "0";
this.direction = direction;
this.column = column;
this.checkId = convertNumberToFixedLengthChars(row, 3) + convertNumberToFixedLengthChars(column, 3);
}
public String toString(TransmissionType type) {
this.header = type.toString();
if (type == TransmissionType.ST) {
return "ST&" + streetNumber + "&" + checkId + "&" + taskId + "&" + direction ;
}else if (type == TransmissionType.GPS) {
return "GPS&" + streetNumber +"/"+row +"/"+column+ "&" + checkId + "&" + taskId + "&" + direction+ "&" + category + "&" + count;
}else if (type == TransmissionType.RTS) {
return "RTS&" + streetNumber +"/"+row +"/"+column+ "&" + checkId + "&" + taskId + "&" + direction + "&" + category + "&" + count;
}
return "";
}
public TransmissionPojo(String data) {
this.data = data;
data = data.replace(">", "");
this.dataArray = data.split("&");
this.header = dataArray[0];
if(dataArray[1].contains("/")) {
String[] dataArr = dataArray[1].split("/");
this.streetNumber = dataArr[0];
this.row = Integer.valueOf(dataArr[1]);
if(dataArr.length > 2) {
this.column = Integer.valueOf(dataArr[2]);
}
}else {
this.streetNumber = dataArray[1];
}
if (dataArray.length > 2) {
this.checkId = dataArray[2];
this.taskId = (dataArray[3]);
if(dataArray[4] != null && !"".equals(dataArray[4]) && !"null".equals(dataArray[4])) {
this.direction = Integer.valueOf(dataArray[4]);
}
}
if (dataArray.length > 5) {
if(dataArray[5] != null &&!"".equals(dataArray[5]) && !"null".equals(dataArray[5]) ) {
this.category = dataArray[5];
}
if( dataArray.length > 6 && dataArray[6] != null && !"".equals(dataArray[6]) && ! "null".equals(dataArray[5])) {
this.count = Integer.valueOf(dataArray[6]);
}
}
if (dataArray.length > 7) {
this.result = Integer.parseInt(dataArray[7])==0 ?0:1;
//不记录2d图像
//String path2D = "/fileData/"+this.taskId+"/"+this.checkId+"/"+this.direction+".jpg";
String path3D ;
if((this.taskId!=null) && !"".equals(this.taskId)){
path3D = "/fileData/"+this.taskId+"/"+this.checkId+"/"+(this.direction+2)+".PNG";
}else {
path3D = "/fileData/"+this.checkId+"/"+(this.direction+2)+".PNG";
}
Set<String> strings = new HashSet<>();
//strings.add(path2D);
strings.add(path3D);
// 将数组中的元素添加到 Set 集合中
if(dataArray.length > 8 && dataArray[8].split(";").length>0) {
String[] s = dataArray[8].split(";");
for (int i = 0; i < s.length; i++) {
s[i] = s[i].replace("\\\\","/");
s[i] = s[i].replace("\\","/");
if(s[i].startsWith(".")) {
s[i] = s[i].replaceFirst(".", ""); // 移除单个字符
}
// 或者
// stringArray[i] = stringArray[i].replaceAll(regexToRemove, ""); // 使用正则表达式移除字符类别
}
Collections.addAll(strings,s);
strings.remove("");
}
this.picsPath = strings;
}
if(this.taskId != null && !"".equals(this.taskId) && this.checkId != null && !"".equals(this.checkId))
this.pcd = "/fileData/"+this.taskId+"/"+this.checkId+"/"+(this.direction+2)+".pcd";
}
public static void main(String[] args) {
//2024-05-31 17:52:07,909 INFO (Decoder.java:96)- receive client:RTE&001/1/9&2812&&2&0341&30&1&.\fileData\\2812\4.PNG;\fileData\\2812\2_0341_rlt.jpg&.\fileData\\2812\4.pcd, data length:106
TransmissionPojo transmissionPojo = new TransmissionPojo("RTE&001/1/9&2812&&2&0341&30&1&.\\fileData\\\\2812\\4.PNG;\\fileData\\\\2812\\2_0341_rlt.jpg&.\\fileData\\\\2812\\4.pcd>");
System.out.println(transmissionPojo);
}
}

@ -0,0 +1,14 @@
package com.zhehekeji.web.service.client;
public enum TransmissionType {
ST ,
GPS ,
GPE ,
SGPS ,
SGPE ,
RTS ,
RTE ,
EN ,
ZHB ;
}

@ -38,6 +38,10 @@ public class KsecDataInfo {
private Integer ackStatus;
private String trayCode;
private String categoryName;
private String typeNum;
private Integer quantity;
private Integer checkRlt;
/**
*

@ -2,11 +2,16 @@ package com.zhehekeji.web.service.lbScanCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
@ -14,6 +19,7 @@ import java.util.concurrent.locks.ReentrantLock;
import static java.lang.Thread.sleep;
@Slf4j
@Service
public class ReentrantLockExample {
private static Lock lock = new ReentrantLock();
@ -21,24 +27,30 @@ public class ReentrantLockExample {
public int getCount() {
lock.lock();
try {
return count;
} finally {
lock.unlock();
}
}
private static void writeCmd(OutputStream os) throws IOException {
String startCmd = "start";
String startCmd = "start:1";
byte[]bytes = startCmd.getBytes(StandardCharsets.UTF_8);
os.write(bytes);
}
private String readUntil(char terminator) throws IOException {
StringBuilder sb = new StringBuilder();
return sb.toString();
}
private static String read(InputStream inStream) throws IOException {
BufferedReader bd = new BufferedReader(new InputStreamReader(inStream));
return bd.readLine();
int c;
StringBuilder sb = new StringBuilder();
while ((c = bd.read()) != -1) {
char ch = (char) c;
sb.append(ch);
if (ch == ';') {
break;
}
}
return sb.toString();
}
public static void main(String[] args) {
@ -51,6 +63,53 @@ public class ReentrantLockExample {
thread.start();
}
}
/**
*
*
* @param dirPath
*/
public static void createDirectories(Path dirPath) {
try {
Files.createDirectories(dirPath);
System.out.println("目录创建成功:" + dirPath);
} catch (Exception e) {
System.err.println("目录创建失败:" + e.getMessage());
}
}
/**
*
*
* @param sourcePath
* @param targetPath
*/
public static void copyFile(Path sourcePath, Path targetPath) {
try {
// 使用 Files.copy 方法复制文件
Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
System.out.println("文件复制成功!");
} catch (Exception e) {
System.err.println("文件复制失败:" + e.getMessage());
}
}
public String identify(String imgPath,String ip,int port){
// 定义源文件路径
Path sourcePath = Paths.get(imgPath);
// 定义目标文件路径
Path targetPath = Paths.get("D:\\data\\media\\industrialCamera\\jpg\\1.jpg");
// 创建目标目录(如果不存在)
Path targetDir = targetPath.getParent();
createDirectories(targetDir);
// 复制文件
copyFile(sourcePath, targetPath);
return readOCR(ip,port);
}
public static String readOCR(String ip,int port){
Socket socket = new Socket();

@ -1,9 +1,7 @@
package com.zhehekeji.web.service.putian;
//import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
import com.zhehekeji.web.entity.Stock;
import com.zhehekeji.web.service.client.ClientChanel;
import com.zhehekeji.web.service.client.SCTransmission;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -144,43 +142,43 @@ public class PTData {
/**
*
*/
public static PTData StockCheck04(SCTransmission scTransmission){
StringBuffer contentSB = new StringBuffer();
String SRMNumber = scTransmission.getSRMNumber();
String goodsLocation = scTransmission.getGoodsLocation();
String taskId = scTransmission.getTaskNo();
String smokeCategory = scTransmission.getCategory();
String smokeCount = scTransmission.getCount().toString();
String smokeRstCategory = scTransmission.getRstCategory();
Integer rstCount = 0;
String checkRst = "0";
if(Objects.equals(scTransmission.getRstCategory(), scTransmission.getCategory())){
rstCount = scTransmission.getCount();
checkRst = "1";
}
String smokeRstCount = rstCount.toString();
String ip ="http://"+ClientChanel.getIpFromId(scTransmission.getSRMNumber())+":9009/pic/"+scTransmission.getGoodsLocation()+"/"
+scTransmission.getTaskNo()+"/";
String pic1 = ip + 1 + ".png";
String pic2 = ip + 2 + ".png";
String pic3 = ip + 3 + ".png";
String pic4 = ip + 4 + ".png";
String pic5 = ip + 5 + ".png";
String pic6 = ip + 6 + ".png";
contentSB.append(SRMNumber).append(",").append(goodsLocation).append(",")
.append(taskId).append(",").append(smokeCategory).append(",").append(smokeCount)
.append(",").append(smokeRstCategory).append(",").append(smokeRstCount)
.append(",").append(checkRst).append(",").append(pic1)
.append("*").append(pic2).append("*").append(pic3).append("*").append(pic4).append("*").append(pic5).append("*").append(pic6);
log.info("stock check message:{}", contentSB.toString());
PTData ptData = new PTData(contentSB.toString(),FLOW_R,STOCK_CHECK_04);
return ptData;
}
public static PTData EmptyStatusResponse(PTEmptyCheckContent ptEmptyCheckContent){
return new PTData(ptEmptyCheckContent.toResponseString(),FLOW_NO_NEED_RES,EMPTY_CHECK_03);
}
// public static PTData StockCheck04(SCTransmission scTransmission){
// StringBuffer contentSB = new StringBuffer();
// String SRMNumber = scTransmission.getSRMNumber();
// String goodsLocation = scTransmission.getGoodsLocation();
// String taskId = scTransmission.getTaskNo();
// String smokeCategory = scTransmission.getCategory();
// String smokeCount = scTransmission.getCount().toString();
// String smokeRstCategory = scTransmission.getRstCategory();
// Integer rstCount = 0;
// String checkRst = "0";
// if(Objects.equals(scTransmission.getRstCategory(), scTransmission.getCategory())){
//
// rstCount = scTransmission.getCount();
// checkRst = "1";
// }
//
// String smokeRstCount = rstCount.toString();
// String ip ="http://"+ ClientChanel.getIpFromId(scTransmission.getSRMNumber())+":9009/pic/"+scTransmission.getGoodsLocation()+"/"
// +scTransmission.getTaskNo()+"/";
// String pic1 = ip + 1 + ".png";
// String pic2 = ip + 2 + ".png";
// String pic3 = ip + 3 + ".png";
// String pic4 = ip + 4 + ".png";
// String pic5 = ip + 5 + ".png";
// String pic6 = ip + 6 + ".png";
// contentSB.append(SRMNumber).append(",").append(goodsLocation).append(",")
// .append(taskId).append(",").append(smokeCategory).append(",").append(smokeCount)
// .append(",").append(smokeRstCategory).append(",").append(smokeRstCount)
// .append(",").append(checkRst).append(",").append(pic1)
// .append("*").append(pic2).append("*").append(pic3).append("*").append(pic4).append("*").append(pic5).append("*").append(pic6);
// log.info("stock check message:{}", contentSB.toString());
// PTData ptData = new PTData(contentSB.toString(),FLOW_R,STOCK_CHECK_04);
// return ptData;
// }
// public static PTData EmptyStatusResponse(PTEmptyCheckContent ptEmptyCheckContent){
// return new PTData(ptEmptyCheckContent.toResponseString(),FLOW_NO_NEED_RES,EMPTY_CHECK_03);
// }
public String toString(){
StringBuffer sb = new StringBuffer();

@ -3,16 +3,10 @@ package com.zhehekeji.web.service.putian;
import com.zhehekeji.web.config.ConfigProperties;
import com.zhehekeji.web.service.EmptyCheckService;
import com.zhehekeji.web.service.PlcService;
import com.zhehekeji.web.service.client.Decoder;
import com.zhehekeji.web.service.client.Encoder;
import com.zhehekeji.web.service.ksec.KescFilter;
import com.zhehekeji.web.service.ksec.KsecInfo;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@ -94,4 +94,8 @@ scanCodeMode:
trayCodeTypes:
- 14
# 照片 視頻保存多久
deleteFileDays: 30
deleteFileDays: 30
intelliBlink:
ip: 127.0.0.1
port: 3002

Loading…
Cancel
Save