1.使用昆船相关

2.昆船客户端,视觉做服务端
3.光源增加tcp管理
4.纯盘点(新的通信)
5.盘点的时候进入队列,同一巷道只有拍完照才能再拍照
6.删除普天
just-camera
LAPTOP-S9HJSOEB\昊天 2 years ago
parent 7b078cead7
commit 97288f5ccd

@ -0,0 +1 @@
BFEBFBFF000B06710025_38BC_21C3_A29D.

@ -9,7 +9,6 @@ import com.zhehekeji.web.pojo.street.StreetVO;
import com.zhehekeji.web.service.EmptyCheckService;
import com.zhehekeji.web.service.PlcService;
import com.zhehekeji.web.service.StreetService;
import com.zhehekeji.web.service.client.*;
import com.zhehekeji.web.service.putian.PTData;
import com.zhehekeji.web.service.putian.PTEmptyCheckContent;
import com.zhehekeji.web.service.putian.PuTianNettyClient;
@ -34,94 +33,6 @@ public class ClientTestController {
@Resource
private PlcService plcService;
@ApiOperation("模拟普天 空货位盘点【发起】")
@GetMapping("/emptyCheck/start")
public Result<String> startEmptyCheck(@ApiParam("巷道标识")@RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId, @ApiParam("检测第几行")@RequestParam Integer row,
@ApiParam("开始列")@RequestParam Integer startColumn,@ApiParam("结束列")@RequestParam Integer endColumn){
// emptyCheckService.emptyCheckStart(SRMNumber,taskId,row,startColumn,endColumn);
// String msg = ECTransmission.toEmptyCheckStartString(SRMNumber,taskId,row,startColumn,endColumn);
String msg = "";
ClientChanel.write(msg, SRMNumber);
return Result.success(msg);
}
@ApiOperation("模拟普天 空货位盘点 【结束】")
@GetMapping("/emptyCheck/stop")
public Result<String> stopEmptyCheck(@ApiParam("巷道标识")@RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId, @ApiParam("检测第几行")@RequestParam Integer row,
@ApiParam("开始列")@RequestParam Integer startColumn,@ApiParam("结束列")@RequestParam Integer endColumn){
// String msg = ECTransmission.toEmptyCheckEndString(SRMNumber,taskId,row,startColumn,endColumn);
String msg = "";
ClientChanel.write(msg,SRMNumber);
//获取空货位的结果信息
// 返回给普天
//Street street = streetService.getStreetByPlcId(SRMNumber);
//String shevel = null;
Map<String,String> map = emptyCheckService.getAllEmptyStatus(SRMNumber,row,startColumn,endColumn);
// map.forEach((k,v)->{
// PTEmptyCheckContent ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,k,v);
// PTData ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
// PuTianNettyClient.write(ptData);
// });
// if(street.getLeftType() == 0){
// //单伸
// String SingleLeft = emptyCheckService.getEmptyStatus(SRMNumber,taskId,1,1,row,startColumn,endColumn);
// shevel = "L01";
// ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleLeft);
// ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
// PuTianNettyClient.write(ptData);
// String SingleRight = emptyCheckService.getEmptyStatus(SRMNumber,taskId,1,2,row,startColumn,endColumn);
// shevel = "R01";
// ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleRight);
// ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
// PuTianNettyClient.write(ptData);
// }else {
// String SingleInLeft = emptyCheckService.getEmptyStatus(SRMNumber,taskId,1,1,row,startColumn,endColumn);
// shevel = "L01";
// ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleInLeft);
// ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
// PuTianNettyClient.write(ptData);
// String SingleInRight = emptyCheckService.getEmptyStatus(SRMNumber,taskId,1,2,row,startColumn,endColumn);
// shevel = "R01";
// ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleInRight);
// ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
// PuTianNettyClient.write(ptData);
// String SingleOutLeft = emptyCheckService.getEmptyStatus(SRMNumber,taskId,2,1,row,startColumn,endColumn);
// shevel = "L02";
// ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleOutLeft);
// ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
// PuTianNettyClient.write(ptData);
// String SingleOutRight = emptyCheckService.getEmptyStatus(SRMNumber,taskId,2,2,row,startColumn,endColumn);
// shevel = "R02";
// ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleOutRight);
// ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
// PuTianNettyClient.write(ptData);
// }
return Result.success(msg);
}
@ApiOperation("模拟普天 盘点具体货位 第一步 【发起盘点】")
@GetMapping("/stockCheck/start")
public Result<String> startStockCheck(@ApiParam("巷道标识")@RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId,
@ApiParam("货位号,如L0100010002 ,R/L表示左右,01是浅货位02深,0001是X,0002是Y") @RequestParam String goodsLocation,@ApiParam("品规")@RequestParam String code,@ApiParam("数量") @RequestParam Integer count,
@ApiParam("是否是虚拟检测 Y:是 N:不是") @RequestParam String V){
SCTransmission scTransmission = new SCTransmission(SRMNumber,taskId,goodsLocation,code,count,V);
plcService.checkStart(scTransmission);
String msg = scTransmission.toString();
ClientChanel.write(msg,SRMNumber);
return Result.success();
}
@ApiOperation("模拟普天 盘点具体货位 第二步 【取货到载货台完成,客户端拍照】")
@GetMapping("/stockCheck/goodsMoveOver")
public Result<String> goodsMoveOver(@ApiParam("巷道标识") @RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId){
SCTransmission scTransmission = new SCTransmission(SRMNumber,taskId);
String msg = scTransmission.toSC02String();
ClientChanel.write(msg,SRMNumber);
return Result.success();
}
// @ApiOperation("模拟普天 货物入库,顶部拍照 【货位入库】")
// @GetMapping("/intoStock/picOver")
@ -136,39 +47,4 @@ public class ClientTestController {
// return Result.success(ptData.toString());
// }
@ApiOperation("模拟普天 货物入库完成 【货物入库完成】")
@GetMapping("/intoStock/goodsOver")
public Result<String> goodsOver(@ApiParam("巷道标识") @RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId,
@ApiParam("货位号,如L0100010002 ,R/L表示左右,01是浅货位02深,0001是X,0002是Y") @RequestParam String goodsLocation){
//拍入库完成后的照片
String picPath = plcService.IntoStockOver(SRMNumber,taskId,goodsLocation);
//向客户端发送读码指令,等待客户端返回条码
ISTransmission isTransmission = new ISTransmission(SRMNumber,taskId,goodsLocation);
//为防万一先清除code
ClientCodeMap.removeCode(SRMNumber);
ClientChanel.write(isTransmission.toString(),SRMNumber);
//发送结果给普天
//若1分钟内仍为收到 则放弃
Long start = System.currentTimeMillis();
while (ClientCodeMap.getCode(SRMNumber) == null && (System.currentTimeMillis()-start)<60000){
try {
Thread.sleep(300l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String code = ClientCodeMap.getCode(SRMNumber);
PTData ptData = PTData.IntoStock04(SRMNumber,taskId,goodsLocation,picPath,code);
PuTianNettyClient.write(ptData);
return Result.success();
}
@ApiOperation("获取正在盘点的数据,包括条码、图片等信息")
@GetMapping("/realtimeCheck")
public Result<RealtimeCheckMap.CheckInfo> realtimeCheck(@ApiParam("巷道标识") @RequestParam String SRMNumber){
return Result.success(RealtimeCheckMap.getRealtimeCheck(SRMNumber));
}
}

@ -71,6 +71,11 @@ public class StockController {
return Result.success(stockService.statusByRowColumn(rowColumnStatus));
}
@ApiOperation(value = "下一个盘点信息")
@RequestMapping(value = "/nextOne", method = RequestMethod.POST)
public Result<Stock> nextOne(@RequestBody Stock stock) {
return Result.success(stockService.nextOne(stock.getId()));
}
// @GetMapping("/list")
// @ApiOperation(value = "盘点页面 返回map key:货架号 value:库存信息")
// public Result<Map<String, List<Stock>>> stockByStreet(@RequestParam(required = true) Integer streetId) {
@ -134,6 +139,13 @@ public class StockController {
return Result.success(stockService.checkCorrect(stockCheck));
}
@ApiOperation(value = "人工复核错误")
@RequestMapping(value = "/checkCorrectErr", method = RequestMethod.POST)
public Result<Stock> checkErr(@RequestBody StockCheck stockCheck) {
validatorUtil.validate(stockCheck);
return Result.success(stockService.checkCorrectErr(stockCheck));
}
@ApiOperation(value = "人工复核")
@RequestMapping(value = "/checkByMan", method = RequestMethod.POST)
public Result<Stock> checkByMan(@RequestBody CheckByMan checkByMan) {

@ -1,15 +1,18 @@
package com.zhehekeji.web.controller;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.config.ConfigProperties;
import com.zhehekeji.web.entity.LightSource;
import com.zhehekeji.web.entity.Street;
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 com.zhehekeji.web.service.damLightSource.JYDAMEquip;
import com.zhehekeji.web.service.damLightSource.JYDamHelper;
import com.zhehekeji.web.service.hikLightSource.HikControlSocket;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@ -77,42 +80,101 @@ public class StreetController {
@GetMapping("/lightSource/open")
@ApiOperation(value = "开启光源")
public Result openLightSource(){
ClientChanel.keys().forEach(k->{
LCTransmission lcTransmission = new LCTransmission(k,1);
ClientChanel.write(lcTransmission.toString(),k);
List<LightSource> lightSources = lightSourceService.getLightSource();
lightSources.forEach(lightSource -> {
JSONObject obj = JSONObject.parseObject(configProperties.getLightSource().getInfo());
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);
}else if (configProperties.getLightSource().getType() == 3){
LightSourceService.lightController(lightSource.getIp(),lightSource.getPort(),1);
}
});
return Result.success();
}
@GetMapping("/lightSource/close")
@ApiOperation(value = "关闭光源")
public Result closeLightSource(){
ClientChanel.keys().forEach(k->{
LCTransmission lcTransmission = new LCTransmission(k,0);
ClientChanel.write(lcTransmission.toString(),k);
List<LightSource> lightSources = lightSourceService.getLightSource();
lightSources.forEach(lightSource -> {
JSONObject obj = JSONObject.parseObject(configProperties.getLightSource().getInfo());
if(configProperties.getLightSource().getType() == 1){
JYDAMEquip equip = JYDamHelper.Connect(lightSource.getIp(),lightSource.getPort());
JYDamHelper.closeDO(equip,obj.getInteger("index"));
Integer status = JYDamHelper.ReadStatus(equip,obj.getInteger("num"),obj.getInteger("index"));
log.info("ip:{},status:{}",lightSource.getIp(),status);
}else if(configProperties.getLightSource().getType() == 2){
HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),0);
}else if (configProperties.getLightSource().getType() == 3){
LightSourceService.lightController(lightSource.getIp(),lightSource.getPort(),0);
}
});
return Result.success();
}
@GetMapping("/lightSource/open/{streetId}")
@ApiOperation(value = "开启单个巷道光源")
public Result openStreetLightSource(@PathVariable Integer streetId){
Street street = streetService.streetById(streetId);
LCTransmission lcTransmission = new LCTransmission(street.getPlcId(),1);
ClientChanel.write(lcTransmission.toString(),street.getPlcId());
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);
}else if (configProperties.getLightSource().getType() == 3){
LightSourceService.lightController(lightSource.getIp(),lightSource.getPort(),1);
}
});
return Result.success();
}
@GetMapping("/lightSource/close/{streetId}")
@ApiOperation(value = "关闭单个巷道光源")
public Result closeStreetLightSource(@PathVariable Integer streetId){
Street street = streetService.streetById(streetId);
LCTransmission lcTransmission = new LCTransmission(street.getPlcId(),0);
ClientChanel.write(lcTransmission.toString(),street.getPlcId());
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);
}else if (configProperties.getLightSource().getType() == 3){
LightSourceService.lightController(lightSource.getIp(),lightSource.getPort(),0);
}
});
return Result.success();
}
}

@ -11,6 +11,8 @@ import java.time.LocalDateTime;
@Data
public class CheckLog {
@TableId(type = IdType.AUTO)
private Integer id;
private Integer streetId;
@ -39,14 +41,20 @@ public class CheckLog {
private String trayCode;
private Integer status;
private String taskId;
private String checkNum;
private String pic;
@TableField(exist=false)
private String[] pics;
private String lotnum;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@TableField(exist=false)
private String streetName;
}

@ -66,6 +66,10 @@ public class Stock {
@ApiModelProperty("列号")
private Integer column;
@TableField(value = "`task_Id`")
@ApiModelProperty("任务id")
private String taskId;
@ApiModelProperty("0:未盘点 1盘点异常 2核对正确")
private Integer status;

@ -13,9 +13,11 @@ public class CameraDelayTask implements Delayed {
private Integer cameraId;
private String cameraPlcId;
private LocalDateTime startTime;
private LocalDateTime endTime;
private String command;
private String path;
@ -40,6 +42,12 @@ public class CameraDelayTask implements Delayed {
this.delayTime = delayTime;
}
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);

@ -24,6 +24,11 @@ public enum Cmd {
D2,
E,
E1,
SC,
SC01,
SC02,
SC03,
SC04,
;
public static Boolean isBaseAction(String code){

@ -4,13 +4,18 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.web.entity.CheckLog;
import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.mapper.CheckLogMapper;
import com.zhehekeji.web.mapper.StreetMapper;
import com.zhehekeji.web.pojo.stock.CheckLogSearch;
import com.zhehekeji.web.pojo.street.StreetVO;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class CheckLogService {
@ -18,29 +23,29 @@ public class CheckLogService {
@Resource
private CheckLogMapper checkLogMapper;
public PageInfo<CheckLog> list(CheckLogSearch search){
@Resource
private StreetMapper streetMapper;
public PageInfo<CheckLog> list(CheckLogSearch search) {
List<StreetVO> street = streetMapper.list();
Map<Integer, String> streetMap = street.stream().collect(Collectors.toMap(Street::getId, Street::getName));
PageHelper.startPage(search.getPageNum(),search.getPageSize());
PageHelper.startPage(search.getPageNum(), search.getPageSize());
QueryWrapper<CheckLog> wrapper = new QueryWrapper<>();
if(!StringUtils.isEmpty(search.getLotnum())){
wrapper.eq("lotnum",search.getLotnum());
}
if(search.getStartTimestamp() != null && search.getEndTimestamp() != null){
wrapper.ge("create_time",search.getStartTimestamp()).le("create_time",search.getEndTimestamp());
}
if(search.getLeftRight() != null && search.getLeftRight() > 0){
wrapper.eq("`direction`",search.getLeftRight());
}
if(search.getSide() != null && search.getSide() > 0){
wrapper.eq("`side`",search.getSide());
}
if(search.getRow() != null && search.getRow() > 0){
wrapper.eq("`row`",search.getRow());
}
if(search.getColumn() != null && search.getColumn() > 0){
wrapper.eq("`column`",search.getColumn());
wrapper.eq(!StringUtils.isEmpty(search.getLotnum()), "lotnum", search.getLotnum())
.ge(search.getStartTimestamp() != null, "create_time", search.getStartTimestamp())
.le(search.getEndTimestamp() != null, "create_time", search.getEndTimestamp())
.eq(search.getLeftRight() != null && search.getLeftRight() > 0, "`direction`", search.getLeftRight())
.eq(search.getSide() != null && search.getSide() > 0, "`side`", search.getSide())
.eq(search.getRow() != null && search.getRow() > 0, "`row`", search.getRow())
.eq(search.getColumn() != null && search.getColumn() > 0, "`column`", search.getColumn());
List<CheckLog> stockChecks = checkLogMapper.selectList(wrapper);
for (CheckLog checkLog :stockChecks){
checkLog.setStreetName(streetMap.get(checkLog.getStreetId()));
checkLog.setPics(checkLog.getPic().split(";"));
}
List<CheckLog>stockChecks = checkLogMapper.selectList(wrapper);
return new PageInfo<>(stockChecks);
}

@ -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;
@ -221,43 +220,6 @@ 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 CheckStatus emptyStatusByRowColumn(RowColumnStatus rowColumnStatus){
CheckStatus checkStatus = new CheckStatus();
checkStatus.setColumnStart(rowColumnStatus.getColumnStart());

@ -12,6 +12,7 @@ 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.GetPhotoDelayExecutor;
import com.zhehekeji.web.service.client.NettyServer;
import com.zhehekeji.web.service.ksec.KsecNettyClient;
import com.zhehekeji.web.service.putian.PuTianNettyClient;
@ -43,6 +44,8 @@ public class InitService implements ApplicationRunner {
private StreetMapper streetMapper;
@Resource
private PuTianNettyClient puTianNettyClient;
@Resource
private KsecNettyClient ksecNettyClient;
@Resource
private ConfigProperties configProperties;
@ -51,9 +54,9 @@ public class InitService implements ApplicationRunner {
private PlcService plcService;
@Resource
private CameraService cameraService;
@Resource
private NettyServer nettyServer;
@Resource
NettyServer nettyServer;
@Bean
public CameraControlLoginModule cameraControlLoginModule(){
CameraControlLoginModule cameraControlLoginModule = null;
@ -99,15 +102,18 @@ public class InitService implements ApplicationRunner {
if(ksec != null){
StreetConn.init(1,"ksec");
try {
puTianNettyClient.createClient(ksec);
ksecNettyClient.createClient(ksec);
}catch (Exception e){
ksecNettyClient.reconnect(0);
log.error("kesc connect error,url:{},port:{}",ksec.getIp(),ksec.getPort());
}
}else {
log.error("ksec no config");
}
//TaskDelayExecutor.runMp4DownloadExecutor();
TaskDelayExecutor.runMp4DownloadExecutor();
GetPhotoDelayExecutor.runExecutor();
}
class LoginThread extends Thread{

@ -6,6 +6,12 @@ import com.zhehekeji.web.mapper.LightSourceMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
@ -15,6 +21,54 @@ public class LightSourceService {
@Autowired
private LightSourceMapper lightSourceMapper;
/**
*
* @param ip
* @param port
* @param stat 12
*/
public static void lightController(String ip ,Integer port,Integer stat){
Socket socket = new Socket();
OutputStream os = null;
InputStream is = null;
try {
socket.connect(new InetSocketAddress(ip,port),3000);
os = socket.getOutputStream();
is = socket.getInputStream();
int i = 0;
socket.setSoTimeout(1000);
String startCmd = "<1,"+stat+",post>";
byte[]bytes = startCmd.getBytes(StandardCharsets.UTF_8);
os.write(bytes);
} catch (IOException e) {
}finally {
if(os != null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public List<LightSource> getLightSource(){
return lightSourceMapper.selectByMap(new HashMap<>());
}

@ -9,12 +9,17 @@ 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.client.ClientChanel;
import com.zhehekeji.web.service.client.GetPhotoDelayExecutor;
import com.zhehekeji.web.service.client.TransmissionPojo;
import com.zhehekeji.web.service.client.TransmissionType;
import com.zhehekeji.web.service.ksec.KsecDataInfo;
import com.zhehekeji.web.service.ksec.KsecInfo;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
@ -28,6 +33,7 @@ import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @Description plc
* plcId
@ -470,100 +476,6 @@ public class PlcService {
@Resource
private LightSourceMapper lightSourceMapper;
/**
*
* @param plcCmdInfo
* @param cmdCode
* @param wmsCode
* @param wmsTrayCode
* @return
*/
public Boolean check(PlcCmdInfo plcCmdInfo,String cmdCode,String wmsCode,String wmsTrayCode){
long startTime = System.currentTimeMillis();
long end = System.currentTimeMillis();
long s = end - startTime;
log.info("time:{}millisecond",s);
return true;
}
/**
*
* @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.setCategory(scTransmission.getRstCategory());
stock.setCode(scTransmission.getGoodsLocation());
stock.setWmsCategory(scTransmission.getCategory());
//盘点正确 2
//盘点异常 1
Integer status = scTransmission.getRstCount().equals(stock.getWmsCount()) && scTransmission.getRstCategory().equals(stock.getWmsCategory()) ? 2: 1;
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();
@ -660,84 +572,8 @@ public class PlcService {
}
/**
*
* C1
* @param SRMNumber
* @return
*/
public String IntoStockSave(String SRMNumber,String taskId,String goodsLocation,String picName){
String ip ="http://"+ ClientChanel.getIpFromId(SRMNumber)+":9009/pic/";
String[] pics = picName.split(";");
String picNameDataBase = ip+pics[0]+";"+ ip+pics[1];
Order oldOrder = orderMapper.getOneByOrderNum(taskId);
oldOrder.setIntoStockPic(picNameDataBase);
orderMapper.updateById(oldOrder);
return ip+pics[0]+"*"+ ip+pics[1];
}
/**
*
* 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;
}
public String getWebPicPath(){
return configProperties.getIP()+":9007/api/pic/";
}
/**
*
* @param SRMNumber
@ -776,4 +612,117 @@ public class PlcService {
cameraCapture(cameraId,false,0l,path);
return configProperties.getIP()+":9007/api/pic/"+path;
}
public void check(PlcCmdInfo plcCmdInfo, KsecDataInfo dataInfo ) {
Street street = streetService.getStreetByPlcId(dataInfo.getSRMNumber());
//开始盘点具体货位
if(dataInfo.getCmdName().equals("SC01")){
CheckLog checkLog = new CheckLog();
checkLog.setStreetId(street.getId());
checkLog.setLotnum(dataInfo.getLotnum());
checkLog.setDirection(dataInfo.getFromDirection());
checkLog.setSide(dataInfo.getFromSide());
checkLog.setRow(dataInfo.getFromRow());
checkLog.setColumn(dataInfo.getFromColumn());
checkLog.setTaskId((dataInfo.getTaskId()));
//默认未盘点
checkLog.setStatus(StockStatus.PENDING.getStatus());
checkLog.setCreateTime(LocalDateTime.now());
checkLog.setCategory(dataInfo.getTypeNum());
checkLog.setCount(dataInfo.getQuantity());
checkLogMapper.insert(checkLog);
Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(street.getId(),dataInfo.getFromDirection(),dataInfo.getFromSide(),dataInfo.getFromRow(),dataInfo.getFromColumn());
if(stock== null) {
stock = new Stock();
}
stock.setStreetId(street.getId());
stock.setCheckNum(checkLog.getId().toString());
stock.setLotnum(dataInfo.getLotnum());
stock.setDirection(dataInfo.getFromDirection());
stock.setSide(dataInfo.getFromSide());
stock.setRow(dataInfo.getFromRow());
stock.setColumn(dataInfo.getFromColumn());
stock.setCategory(dataInfo.getTypeNum());
stock.setCount(dataInfo.getQuantity());
stock.setTaskId((dataInfo.getTaskId()));
//默认未盘点
stock.setStatus(StockStatus.PENDING.getStatus());
stock.setExportTime(LocalDateTime.now());
if(stock.getId() == null){
stockMapper.insert(stock);
}else stockMapper.updateById(stock);
TransmissionPojo transmissionPojo = new TransmissionPojo( checkLog ,street);
ClientChanel.get(dataInfo.getSRMNumber()).writeAndFlush(transmissionPojo.toString(TransmissionType.ST));
}
//取货完成进行拍照
else if(dataInfo.getCmdName().equals("SC02")){
CheckLog checkLog = checkLogMapper.selectOne(new QueryWrapper<CheckLog>()
.eq("direction",dataInfo.getFromDirection())
.eq("street_id",street.getId())
.orderByDesc("id").last("limit 1"));
TransmissionPojo transmissionPojo = new TransmissionPojo( checkLog,street );
if(GetPhotoDelayExecutor.cameraDelayTasks.size()==0){
//队列中没有任务,发送取图指令
ClientChanel.get(dataInfo.getSRMNumber()).writeAndFlush(transmissionPojo.toString(TransmissionType.GPS));
}
//将取图指令放入队列等待上条取图结束,或队列超时调用
GetPhotoDelayExecutor.addCameraDelayTask(street.getPlcId(),transmissionPojo.toString(TransmissionType.GPS),2000L);
// ClientChanel.get(dataInfo.getSRMNumber()).writeAndFlush();
}
}
public void visualCalculationResults(TransmissionPojo transmissionPojo) {
CheckLog checkLog = checkLogMapper.selectById(transmissionPojo.getCheckId());
Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("check_Num",checkLog.getId()));
if(transmissionPojo.getResult() != null && transmissionPojo.getResult() == 1){
checkLog.setStatus(StockStatus.SUCCESS.getStatus());
stock.setStatus(StockStatus.SUCCESS.getStatus());
}else {
checkLog.setStatus(StockStatus.ERROR.getStatus());
stock.setStatus(StockStatus.ERROR.getStatus());
}
if (transmissionPojo.getPicsPath() != null && transmissionPojo.getPicsPath().length > 0){
String pics = join(transmissionPojo.getPicsPath(), ";");
checkLog.setPic(pics);
stock.setCheckPic(pics);
}
checkLogMapper.updateById(checkLog);
stockMapper.updateById(stock);
}
public static String join(String[] array, String separator) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < array.length; i++) {
sb.append(array[i]);
if (i < array.length - 1) {
sb.append(separator);
}
}
return sb.toString();
}
public KsecInfo getKsecDataInfo(TransmissionPojo transmissionPojo,String type) {
KsecDataInfo ksecDataInfo = new KsecDataInfo();
CheckLog checkLog = checkLogMapper.selectById(transmissionPojo.getCheckId());
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","SC",ksecDataInfo);
return ksecInfo;
}
}

@ -16,7 +16,6 @@ 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;
@ -328,20 +327,6 @@ public class StockService {
stock.setStatus(0);
}
List<StockLog> stockLogs = stockLogMapper.selectList(new QueryWrapper<StockLog>().eq("`row`",stockCheck.getRow()).eq("`column`",stockCheck.getColumn()).eq("street_id",stockCheck.getStreetId()).eq("direction",stockCheck.getDirection()).eq("side",stockCheck.getSide()).orderByDesc("create_time").last(" limit 2"));
if(stockLogs.size() == 1){
stock.setOveroperationPic(stockLogs.get(0).getPic());
}else if(stockLogs.size() == 2){
stock.setOveroperationPic(stockLogs.get(0).getPic());
stock.setPreoperationPic(stockLogs.get(1).getPic());
}
String ip ="http://"+ street.getPlcIp()+":9009/pic/"+stock.getCode()+"/"+stock.getCheckNum()+"/";
stock.setSidePic1(String.format("%s1.png",ip));
stock.setSidePic2(String.format("%s2.png",ip));
stock.setSidePic3(String.format("%s3.png",ip));
stock.setSidePic4(String.format("%s4.png",ip));
stock.setTopPic1(String.format("%s5.png",ip));
stock.setTopPic2(String.format("%s6.png",ip));
return stock;
}
@ -371,8 +356,6 @@ public class StockService {
public Stock checkCorrect(StockCheck stockCheck) {
Stock stock = stockInfo(stockCheck);
Assert.isTrue(stock != null && stock.getId() != null, "该货位暂时没有记录");
Integer oldStatus = stock.getStatus();
Assert.isTrue(StockStatus.ERROR.getStatus().equals(oldStatus), "无需核对");
log.info("check stock correct, street_id:{},direction:{},side:{},row:{},column:{}", stockCheck.getStreetId(),stockCheck.getDirection(),stockCheck.getSide(), stockCheck.getRow(), stockCheck.getColumn());
stock.setStatus(StockStatus.MANUAL.getStatus());
@ -380,6 +363,22 @@ public class StockService {
checkLog(stock);
return stock;
}
/**
*
*
*
* @param stockCheck
*/
public Stock checkCorrectErr(StockCheck stockCheck) {
Stock stock = stockInfo(stockCheck);
Assert.isTrue(stock != null && stock.getId() != null, "该货位暂时没有记录");
log.info("check stock correct, street_id:{},direction:{},side:{},row:{},column:{}", stockCheck.getStreetId(),stockCheck.getDirection(),stockCheck.getSide(), stockCheck.getRow(), stockCheck.getColumn());
stock.setStatus(StockStatus.ERROR.getStatus());
stockMapper.updateById(stock);
checkLog(stock);
return stock;
}
@Resource
private CheckLogMapper checkLogMapper;
@ -419,6 +418,17 @@ public class StockService {
return stock;
}
public Stock nextOne(Long id) {
QueryWrapper<Stock> stockQueryWrapper = new QueryWrapper<>();
stockQueryWrapper.eq("status","0")
.ne(id != null,"id",id)
.orderByDesc("export_time").last("limit 1");
Stock stock =stockMapper.selectOne(stockQueryWrapper);
return stock;
}
// public void init(String shelveId, Integer row, Integer column){
// Map<String,Object> map = new HashMap<>();
// map.put("shelve_id",shelveId);

@ -42,7 +42,7 @@ public class TestService {
PlcCmdInfo plcCmdInfo = new PlcCmdInfo(street.getPlcId(),taskId,1,leftRight,j,i,1,1,1,1,1,1,"");
plcCmdInfo.setTimes(1);
int co = j%3 + 1;
plcService.check(plcCmdInfo,"E"+co,code,code);
//plcService.check(plcCmdInfo,"E"+co,code,code);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {

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

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

@ -2,8 +2,13 @@ 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.ksec.KsecDataInfo;
import com.zhehekeji.web.service.ksec.KsecDecoder;
import com.zhehekeji.web.service.ksec.KsecInfo;
import com.zhehekeji.web.service.ksec.KsecNettyClient;
import com.zhehekeji.web.service.putian.*;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@ -27,9 +32,15 @@ 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 END_CHECK = "EN";
private static String HEART_BEAT = "HB";
private static String END_STRING = "$";
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,15,30, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(20000));
@ -79,211 +90,39 @@ 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();
}
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();
tcpLogger.info("receive client:{}, data length:{}", body, body.length());
TransmissionPojo transmissionPojo = new TransmissionPojo(body);
//心跳进行连接
if(HEART_BEAT.equals(transmissionPojo.getHeader())){
ClientChanel.connect(transmissionPojo.getStreetNumber(),ctx.channel());
}
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());
}
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);
//获取照片后发送进行计算逻辑,并在拍照队列中取出拍照发送
else if(GET_PHOTO_END.equals(transmissionPojo.getHeader())){
ClientChanel.get(transmissionPojo.getStreetNumber()).writeAndFlush(transmissionPojo.toString(TransmissionType.RTS));
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);
//发送给上位机
KsecInfo ksecInfo = plcService.getKsecDataInfo(transmissionPojo,"SC03");
KsecNettyClient.write(ksecInfo);
CameraDelayTask cameraDelayTask = GetPhotoDelayExecutor.getNext(transmissionPojo.getStreetNumber());
if (cameraDelayTask != null) {
TransmissionPojo pojo = new TransmissionPojo(cameraDelayTask.getCommand());
ClientChanel.get(pojo.getStreetNumber()).writeAndFlush(pojo.toString(TransmissionType.GPS));
}
}
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);
//回复客户端,建立连接完成
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);
//照片和结果保存,并发送给上位机
else if(RETURN_CHECK.equals(transmissionPojo.getHeader())){
//保存数据
plcService.visualCalculationResults(transmissionPojo);
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);
//发送给上位机
KsecInfo ksecInfo = plcService.getKsecDataInfo(transmissionPojo,"SC04");
ksecInfo.getData().setTypeNum(transmissionPojo.getCategory());
ksecInfo.getData().setQuantity(transmissionPojo.getCount());
ksecInfo.getData().setCheckRlt(transmissionPojo.getResult());
KsecNettyClient.write(ksecInfo);
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 (body.contains("EMPTY_CLIENT")){
// ClientChanel.connect(EMPTY_CLIENT_NAME, ctx.channel());
// tcpLogger.info("client:{} connect", EMPTY_CLIENT_NAME);
// in.release();
// }
}
}
}
}

@ -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,64 @@
package com.zhehekeji.web.service.client;
import com.zhehekeji.web.lib.CameraDelayTask;
import com.zhehekeji.web.lib.TaskDelayExecutor;
import java.util.Map;
import java.util.concurrent.*;
public class GetPhotoDelayExecutor {
public static DelayQueue<CameraDelayTask> cameraDelayTasks = new DelayQueue<>();
private static ExecutorService exec = Executors.newFixedThreadPool(1);
public static void addCameraDelayTask(String cameraPlcId, String getPhotoCommand, long time) {
CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraPlcId, getPhotoCommand, time);
cameraDelayTasks.add(cameraDelayTask);
}
public static void remove(String getPhotoCommand, String cameraPlcId) {
cameraPlcId = cameraPlcId.intern();
synchronized (cameraPlcId) {
Object[] cameraDelayTask = cameraDelayTasks.toArray();
for (Object cameraDelayTask1 : cameraDelayTask) {
CameraDelayTask cameraDelayTask2 = (CameraDelayTask) cameraDelayTask1;
if (cameraDelayTask2.getCommand().equals(getPhotoCommand)) {
cameraDelayTasks.remove(cameraDelayTask2);
}
}
}
}
public static CameraDelayTask getNext(String cameraPlcId) {
Object[] cameraDelayTask = cameraDelayTasks.toArray();
if (cameraDelayTask.length > 0) {
CameraDelayTask cameraDelayTask2 = (CameraDelayTask) cameraDelayTask[0];
remove(cameraDelayTask2.getCommand(), cameraPlcId);
return cameraDelayTask2;
}
return null;
}
public static void runExecutor() {
exec.execute(new GetPhotoDelayExecutor.Consumer());
}
private static class Consumer implements Runnable {
@Override
public void run() {
while (true) {
try {
cameraDelayTasks.remove(cameraDelayTasks.take());
} 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,75 @@
package com.zhehekeji.web.service.client;
import com.zhehekeji.web.entity.CheckLog;
import com.zhehekeji.web.entity.Street;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Data
public class TransmissionPojo {
private String data;
private String[] dataArray;
private String header;
private String streetNumber;//巷道标识符
private String taskId;
private Integer checkId;
private Integer direction;//左右
private Integer count; //数量
private String category; //品规
private String[] picsPath; //品规
private Integer result;
public TransmissionPojo(CheckLog checkLog , Street street){
this.checkId = checkLog.getId();
this.streetNumber = street.getPlcId();
this.taskId = checkLog.getLotnum();
this.direction = checkLog.getDirection();
this.count = checkLog.getCount();
this.category = checkLog.getCategory();
}
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 + "&" + checkId + "&" + taskId + "&" + direction+ "&" + category + "&" + count;
}else if (type == TransmissionType.RTS) {
return "RTS&" + streetNumber + "&" + checkId + "&" + taskId + "&" + direction + "&" + category + "&" + count;
}
return "";
}
public TransmissionPojo(String data) {
this.data = data;
data = data.replace(">", "");
this.dataArray = data.split("&");
this.header = dataArray[0];
this.streetNumber = dataArray[1];
if (dataArray.length > 2) {
this.checkId = Integer.valueOf(dataArray[2]);
this.taskId = (dataArray[3]);
this.direction = Integer.valueOf(dataArray[4]);
}
if (dataArray.length > 5) {
this.category = dataArray[5];
this.count = Integer.valueOf(dataArray[6]);
}
if (dataArray.length > 7) {
this.result = Integer.valueOf(dataArray[7]);
this.picsPath = dataArray[8].split(";");
}
}
public static void main(String[] args) {
TransmissionPojo transmissionPojo = new TransmissionPojo("RT&6&2121&1&S001&25&1&1.jpg;2.jpg>");
System.out.println(transmissionPojo);
}
}

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

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

@ -33,7 +33,7 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
private static String lastLotnum;
//private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(7,21,30, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(20000));
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(7,21,30, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(20000));
private PlcService plcService;
@ -49,8 +49,8 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
log.debug("no data");
return null;
}
//KescRunnable kescRunnable = new KescRunnable(in,ctx,plcService);
//threadPoolExecutor.execute(kescRunnable);
KescRunnable kescRunnable = new KescRunnable(in,ctx,plcService);
threadPoolExecutor.execute(kescRunnable);
return null;
}
@ -86,17 +86,12 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
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);
}
// //左右换过来
// if(dataInfo.getFromDirection() == 1){
// dataInfo.setFromDirection(2);
// }else {
// dataInfo.setFromDirection(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();
@ -179,33 +174,10 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
// }else {
// log.info("other D code :{}",code);
// }
} else if (Cmd.E.name().equals(ksecInfo.getType())) {
//盘点
//转球机到盘点位 然后拍照
} else if (Cmd.SC.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);
//rfid的逻辑
String code = dataInfo.getCmdName();
if("E1".equals(code)){
plcService.RFIDCheck(plcCmdInfo);
}else {
plcService.RFIDStop(plcCmdInfo);
}
plcService.check(plcCmdInfo, dataInfo);
}
//找到该货位的最后一张照片与现在的照片比照

@ -46,6 +46,7 @@ public class KsecNettyClient {
client.handler(new KescFilter(heart, plcService,this));
// 连接服务端
channel = client.connect(ksec.getIp(), ksec.getPort()).sync().channel();
}
/**
@ -76,7 +77,9 @@ public class KsecNettyClient {
try {
createClient(ksec);
} catch (Exception e) {
if (channel != null) {
channel.close();
}
//没连上 继续
log.error("reconnect error num:{}", num);
//关闭当前链接

@ -3,7 +3,6 @@ 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;
@ -142,35 +141,35 @@ 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 = scTransmission.getRstCount();
String smokeRstCount = rstCount.toString();
String checkRst = scTransmission.getCheckRst();
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 = scTransmission.getRstCount();
// String smokeRstCount = rstCount.toString();
// String checkRst = scTransmission.getCheckRst();
// 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,8 +3,6 @@ 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;

@ -7,14 +7,14 @@ spring:
maxWait: 60000
minEvictableIdleTimeMillis: 300000
minIdle: 15
password: Leaper@123
password: root
poolPreparedStatements: true
testOnBorrow: true
testOnReturn: false
testWhileIdle: false
timeBetweenEvictionRunsMillis: 60000
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://115.236.65.98:12004/lia_duoji_nanjing_wuliu?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
url: jdbc:mysql://127.0.0.1:3306/lia_duo_nanjingyancao?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: root
validationQuery: SELECT 1 FROM DUAL
# --------本服务端口号

Loading…
Cancel
Save