客户端协议

盘点统计
nanjing-yancao-wuliuzhongxin
yiming 4 years ago
parent 62bcc185b0
commit 4f0fc140a7

@ -0,0 +1,36 @@
package com.zhehekeji.web.controller;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.entity.CheckStreetSummary;
import com.zhehekeji.web.entity.CheckSummary;
import com.zhehekeji.web.pojo.empty.EmptyCheckSearch;
import com.zhehekeji.web.service.EmptyCheckService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@Api(tags = "盘点统计")
@RequestMapping("/checkSummary")
@RestController
public class EmptyCheckController {
@Resource
private EmptyCheckService emptyCheckService;
@ApiOperation("盘点统计")
@PostMapping("")
public Result<PageInfo<CheckSummary>> list(@RequestBody EmptyCheckSearch emptyCheckSearch){
return Result.success(emptyCheckService.checkSummaryPageInfo(emptyCheckSearch));
}
@ApiOperation("巷道盘点统计")
@GetMapping("/street/task")
public Result<List<CheckStreetSummary>> CheckStreetSummarys(String taskId){
return Result.success(emptyCheckService.checkStreetSummaries(taskId));
}
}

@ -0,0 +1,46 @@
package com.zhehekeji.web.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class CheckStreetSummary {
@TableId(type = IdType.AUTO)
private Integer id;
private Integer streetId;
@TableField(exist = false)
private String streetName;
private String taskId;
private Integer type;
/**
*
*/
private Integer emptyCount;
/**
*
*/
private Integer emptyGoodsCount;
/**
*
*/
private Integer goodsCount;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
}

@ -0,0 +1,25 @@
package com.zhehekeji.web.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class CheckSummary {
@TableId(type = IdType.AUTO)
private Integer id;
private String taskId;
private Integer type;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
}

@ -76,6 +76,9 @@ public class Stock {
@ApiModelProperty("操作后的图片")
private String overoperationPic;
@ApiModelProperty("0:没检测 1空货物有托盘 2有货物 3空托盘")
private Integer emptyStatus;
@ApiModelProperty("盘点图片")
private String checkPic;

@ -0,0 +1,16 @@
package com.zhehekeji.web.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zhehekeji.web.entity.CheckStreetSummary;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface CheckStreetSummaryMapper extends BaseMapper<CheckStreetSummary> {
@Select(" select c.*,t.name as streetName from check_street_summary c" +
" left join street t " +
" on c.street_id = t.id" +
" where c.task_id = #{taskId} ")
List<CheckStreetSummary> list(String taskId);
}

@ -0,0 +1,8 @@
package com.zhehekeji.web.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zhehekeji.web.entity.CheckSummary;
import com.zhehekeji.web.entity.LightSource;
public interface CheckSummaryMapper extends BaseMapper<CheckSummary> {
}

@ -0,0 +1,22 @@
package com.zhehekeji.web.pojo.empty;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class EmptyCheckSearch {
private Integer pageSize;
private Integer pageNum;
private String taskId;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
}

@ -0,0 +1,148 @@
package com.zhehekeji.web.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.web.entity.CheckStreetSummary;
import com.zhehekeji.web.entity.CheckSummary;
import com.zhehekeji.web.entity.Stock;
import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.mapper.CheckStreetSummaryMapper;
import com.zhehekeji.web.mapper.CheckSummaryMapper;
import com.zhehekeji.web.mapper.StockMapper;
import com.zhehekeji.web.pojo.empty.EmptyCheckSearch;
import com.zhehekeji.web.service.client.ECTransmission;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@Slf4j
public class EmptyCheckService {
@Resource
private StreetService streetService;
@Resource
private StockMapper stockMapper;
@Resource
private CheckSummaryMapper checkSummaryMapper;
@Resource
private CheckStreetSummaryMapper checkStreetSummaryMapper;
public PageInfo<CheckSummary> checkSummaryPageInfo(EmptyCheckSearch emptyCheckSearch){
PageHelper.startPage(emptyCheckSearch.getPageNum(),emptyCheckSearch.getPageSize());
QueryWrapper<CheckSummary> queryWrapper = new QueryWrapper<>();
if(!StringUtils.isEmpty(emptyCheckSearch.getTaskId())){
queryWrapper.eq("task_id",emptyCheckSearch.getTaskId());
}
if(emptyCheckSearch.getStartTime() != null ){
queryWrapper.gt("start_time",emptyCheckSearch.getStartTime());
}
if(emptyCheckSearch.getEndTime() != null){
queryWrapper.lt("start_time",emptyCheckSearch.getEndTime());
}
List<CheckSummary> checkSummaries = checkSummaryMapper.selectList(queryWrapper);
return new PageInfo<>(checkSummaries);
}
public List<CheckStreetSummary> checkStreetSummaries(String taskId){
return checkStreetSummaryMapper.list(taskId);
}
/**
*
*/
public void CheckSummary(String SRMNumber,String taskId){
Street street = streetService.getStreetByPlcId(SRMNumber);
if(street == null){
log.error(" no SRMNumer:{}",SRMNumber);
return;
}
List<Stock> stockList = stockMapper.selectList(new QueryWrapper<Stock>().eq("street_id",street.getId()));
/**
*
*/
Integer emptyCount = 0;
/**
*
*/
Integer emptyGoodsCount = 0;
/**
*
*/
Integer goodsCount = 0;
for(Stock stock: stockList){
if(stock.getEmptyStatus() == 3){
//没托盘
emptyCount++;
}else if(stock.getEmptyStatus() == 2){
//有货物
goodsCount++;
}else if(stock.getEmptyStatus() == 1){
//有托盘 没货物
emptyGoodsCount++;
}
}
//更新盘点统计
List<CheckStreetSummary> checkStreetSummaries = checkStreetSummaryMapper.selectList(new QueryWrapper<CheckStreetSummary>().eq("street_id",street.getId()).eq("lotnum",taskId));
if(checkStreetSummaries.size() > 0){
CheckStreetSummary checkStreetSummary = checkStreetSummaries.get(0);
checkStreetSummary.setStreetId(street.getId());
checkStreetSummary.setEmptyCount(emptyCount);
checkStreetSummary.setEmptyGoodsCount(emptyGoodsCount);
checkStreetSummary.setGoodsCount(goodsCount);
checkStreetSummary.setEndTime(LocalDateTime.now());
checkStreetSummaryMapper.updateById(checkStreetSummary);
}
}
/**
*
* @param ecTransmission
*/
public void emptyCheckStart(ECTransmission ecTransmission){
Street street = streetService.getStreetByPlcId(ecTransmission.getSRMNumber());
if(street == null){
log.error(" no SRMNumer:{}",ecTransmission.getSRMNumber());
return;
}
Map<String,Object> map = new HashMap<>();
map.put("street_id",street.getId());
stockMapper.deleteByMap(map);
//新增空的盘点统计
CheckStreetSummary checkStreetSummary = new CheckStreetSummary();
checkStreetSummary.setTaskId(ecTransmission.getTaskId());
checkStreetSummary.setStartTime(LocalDateTime.now());
checkStreetSummary.setStreetId(street.getId());
checkStreetSummaryMapper.insert(checkStreetSummary);
}
public void emptyCheckLog(ECTransmission ecTransmission){
Street street = streetService.getStreetByPlcId(ecTransmission.getSRMNumber());
if(street == null){
log.error(" no SRMNumer:{}",ecTransmission.getSRMNumber());
return;
}
Stock stock = new Stock();
stock.setStreetId(street.getId());
stock.setSide(ecTransmission.getSide());
stock.setDirection(ecTransmission.getDirection());
if(ecTransmission.getIsEmpty().equals("N")){
stock.setEmptyStatus(3);
}
stock.setRow(ecTransmission.getRow());
stock.setColumn(ecTransmission.getColumn());
stockMapper.insert(stock);
}
}

@ -12,23 +12,79 @@ import java.util.Set;
*/
public class GoodsEmptyMap {
private static Map<String, Set<String>> shelveEmptyMap = new HashMap<>();
private static Map<String, Map> shelveEmptyInfo = new HashMap<>();
/**
*
* @param SRMNumber
*/
public void startEmptyCheck(String SRMNumber){
shelveEmptyMap.put(SRMNumber,new HashSet<>());
shelveEmptyInfo.put(SRMNumber,new HashMap());
}
public Set<String> getEmptyCheck(String SRMNumber){
return shelveEmptyMap.get(SRMNumber);
}
/**
*
*
* @param SRMNumber
* @param direction
* @param side
* @param row
* @param column
* @param YN
*/
public void Position(){
public void AddEmptyInfos(String SRMNumber,Integer direction,Integer side,Integer row,Integer column,String YN){
Map<Integer,Map> SRMMap = shelveEmptyInfo.get(SRMNumber);
if(SRMMap == null){
SRMMap = new HashMap<>();
}
Map<Integer,Map> directionMap = SRMMap.get(direction);
if(directionMap == null){
directionMap = new HashMap<>();
}
Map<Integer,Set<GoodsInfo>> sideMap = SRMMap.get(side);
if(sideMap == null){
sideMap = new HashMap<>();
}
Set<GoodsInfo> goodsInfos = sideMap.get(side);
if(goodsInfos == null){
goodsInfos = new HashSet<>();
}
GoodsInfo goodsInfo = new GoodsInfo(row, column, YN);
goodsInfos.add(goodsInfo);
sideMap.put(side,goodsInfos);
directionMap.put(direction,sideMap);
shelveEmptyInfo.put(SRMNumber,directionMap);
}
@Data
public static class GoodsInfo{
private Integer row;
private Integer column;
private String YN;
public boolean equals(Object obj){
if(this == obj){
return true;
}
if(obj instanceof GoodsInfo){
//行列相等 则相同
if(((GoodsInfo) obj).getRow() == row && ((GoodsInfo) obj).getColumn() == column){
return true;
}
}
return false;
}
public GoodsInfo(Integer row,Integer column,String YN){
this.column = column;
this.row = row;
this.YN = YN;
}
}
// @Data
// public static class ShelveEmptyMap{
//

@ -8,7 +8,6 @@ import com.zhehekeji.web.lib.hik.HikCameraControlModuleImpl;
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.lib.joyware.NetSDKLib;
import com.zhehekeji.web.mapper.CameraMapper;
import com.zhehekeji.web.mapper.SensorGunMapper;
import com.zhehekeji.web.mapper.StreetMapper;
@ -51,6 +50,8 @@ public class InitService implements ApplicationRunner {
private PlcService plcService;
@Resource
private CameraService cameraService;
@Resource
private NettyServer nettyServer;
@Bean
public CameraControlLoginModule cameraControlLoginModule(){
@ -79,7 +80,7 @@ public class InitService implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
NettyServer.CreateNettyServer(3001);
nettyServer.CreateNettyServer(3001);
//球机登录
List<Camera> cameras = cameraMapper.selectByMap(new HashMap<>(0));
cameras.forEach(camera -> {

@ -1,6 +1,5 @@
package com.zhehekeji.web.service;
import codeDetector.BarcodeDetector;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zhehekeji.common.util.PathUtil;
import com.zhehekeji.web.config.ConfigProperties;
@ -10,9 +9,6 @@ import com.zhehekeji.web.mapper.*;
import com.zhehekeji.web.pojo.OrderVO;
import com.zhehekeji.web.service.RFID.RFIDMap;
import com.zhehekeji.web.service.RFID.RFIDSocket;
import com.zhehekeji.web.service.hikLightSource.HikControlSocket;
import com.zhehekeji.web.service.ksec.KsecNettyClient;
import com.zhehekeji.web.service.sick.SickSocket;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
@ -21,11 +17,8 @@ import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@ -71,6 +64,8 @@ public class PlcService {
private RFIDService rfidService;
@Resource
private CheckLogMapper checkLogMapper;
@Resource
private CheckStreetSummaryMapper checkStreetSummaryMapper;
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1,8,200,TimeUnit.MINUTES,new ArrayBlockingQueue<>(100000));
@ -550,144 +545,28 @@ 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();
Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId());
CronTab.putTime(street.getId());
List<LightSource> lightSources = lightSourceMapper.selectList(new QueryWrapper<LightSource>().eq("street_id",street.getId()));
lightSources.forEach(lightSource -> {
HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),1);
});
Integer cameraId = getCameraByPlcCmd(plcCmdInfo,plcCmdInfo.getLeftRight1());
if(plcCmdInfo.getSeparation1() == 1 && configProperties.getScanCodeMode().getTray() == 2){
//内测
String c = cmdCode + "-" + plcCmdInfo.getLeftRightStr(1) + "-IN";
log.info("camera ptz"+c);
gyrateCameraByCode(cameraId, c);
}else {
gyrateCameraByCode(cameraId, cmdCode);
try {
Thread.sleep(configProperties.getCameraConfig().getDelayCaptureTime());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String path = PathUtil.createFileNameByRowColumn("jpg",cameraId,plcCmdInfo.getRow1(),plcCmdInfo.getColumn1());
cameraCapture(cameraId,false,null,path);
//托盘码
String trayCode = null;
Boolean trayCheck = Boolean.TRUE;
//如果是用扫码枪 扫 托盘码,就直接扫
//if(configProperties.getScanCodeMode().getTray() == 2){
SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(),plcCmdInfo.getLeftRight1());
if(plcCmdInfo.getSeparation1() == 1 && configProperties.getScanCodeMode().getTray() == 2){
//托盘使用sick扫码枪
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(wmsTrayCode)){
//托盘码为空,无货物
//只要扫码枪未识别出条码,即认为盘点正确
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 {
trayCheck = wmsTrayCode.equals(trayCode);
}
}
}
}else if(configProperties.getScanCodeMode().getTray() == 3){
//RFID
RFID rfid = rfidService.getRFIDByPlc(street.getId());
}
OrderInfo orderInfo = new OrderInfo(street,plcCmdInfo,1,cmdCode);
Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(orderInfo.getStreetId(),orderInfo.getLeftRight(),orderInfo.getSeparation(),orderInfo.getRow(),orderInfo.getColumn());
String scanCode = null;
Boolean codeCheck = Boolean.TRUE;
Boolean trayCodeCheck = Boolean.TRUE;
//货物使用球机扫码
if(configProperties.getScanCodeMode().getTray() == 2 && plcCmdInfo.getSeparation1() == 2){
//托盘使用球机扫码
if("".equals(wmsTrayCode)){
//空货物的处理
//如果系统货物为空,则只要扫码识别未出结果,就认为无货物
trayCode = BarcodeDetector.detectBestCodeUntilOK(configProperties.getSavePath().getMediaPath()+path,configProperties.getScanCodeMode().getTrayCodeTypes());
log.info("tray code:{},sys trayCode:{}",trayCode,wmsTrayCode);
if(StringUtils.isEmpty(trayCode)|| trayCode.equals("Unrecognized")){
trayCheck = Boolean.TRUE;
trayCode = "";
}else {
trayCheck = wmsTrayCode.equals(trayCode);
}
}else {
trayCode = BarcodeDetector.detectBestCodeUntilOK(configProperties.getSavePath().getMediaPath()+path,configProperties.getScanCodeMode().getTrayCodeTypes());
if(StringUtils.isEmpty(trayCode)){
log.error("row:{},cloumn:{}",plcCmdInfo.getRow1(),plcCmdInfo.getColumn1());
log.error("detectBestBarCode:{}",trayCode);
trayCode = "识别异常";
trayCheck = Boolean.FALSE;
}else {
trayCheck = wmsTrayCode.equals(trayCode);
}
}
}
log.info("code:{}",scanCode);
//核对异常
Integer status = 1;
//托盘和货物都正确
if(trayCheck && codeCheck){
status = 2;
}
if(stock == null){
stock = new Stock(null,null,plcCmdInfo.getOrderNum(),plcCmdInfo.getLotnum(),scanCode, null,null,wmsCode,null,null,wmsTrayCode,trayCode,orderInfo.getStreetId(),orderInfo.getLeftRight(),orderInfo.getSeparation(),orderInfo.getRow(),orderInfo.getColumn(),status,null,null,path, LocalDateTime.now());
stockMapper.insert(stock);
}else {
stock.setStatus(status);
stock.setLotnum(plcCmdInfo.getLotnum());
stock.setExportTime(LocalDateTime.now());
stock.setCheckPic(path);
stock.setCheckNum(plcCmdInfo.getOrderNum());
stock.setTrayCode(trayCode);
stock.setWmsTrayCode(wmsTrayCode);
stock.setCode(scanCode);
stock.setWmsCode(wmsCode);
stockMapper.updateById(stock);
}
checkLog(stock);
// StockCheckRunnable stockCheckRunnable = new StockCheckRunnable(street,plcCmdInfo,cmdCode,stockMapper,path,checkLogMapper,configProperties.getScanCodeMode().getGoods(),wmsCode,wmsTrayCode,trayCode,trayCheck,configProperties,sensorGun);
// threadPoolExecutor.execute(stockCheckRunnable);
long end = System.currentTimeMillis();
long s = end - startTime;
log.info("time:{}millisecond",s);
return true;
}
public void checkLog(Stock stock){
CheckLog checkLog = new CheckLog();
checkLog.setCheckNum(stock.getCheckNum());

@ -96,22 +96,22 @@ public class StockCheckRunnable implements Runnable {
if(trayCheck && codeCheck){
status = 2;
}
if(stock == null){
stock = new Stock(null,null,plcCmdInfo.getOrderNum(),plcCmdInfo.getLotnum(),scanCode, null,null,wmsCode,null,null,wmsTrayCode,trayCode,orderInfo.getStreetId(),orderInfo.getLeftRight(),orderInfo.getSeparation(),orderInfo.getRow(),orderInfo.getColumn(),status,null,null,path, LocalDateTime.now());
stockMapper.insert(stock);
}else {
stock.setStatus(status);
stock.setLotnum(plcCmdInfo.getLotnum());
stock.setExportTime(LocalDateTime.now());
stock.setCheckPic(path);
stock.setCheckNum(plcCmdInfo.getOrderNum());
stock.setTrayCode(trayCode);
stock.setWmsTrayCode(wmsTrayCode);
stock.setCode(scanCode);
stock.setWmsCode(wmsCode);
stockMapper.updateById(stock);
}
checkLog(stock);
// if(stock == null){
// stock = new Stock(null,null,plcCmdInfo.getOrderNum(),plcCmdInfo.getLotnum(),scanCode, null,null,wmsCode,null,null,wmsTrayCode,trayCode,orderInfo.getStreetId(),orderInfo.getLeftRight(),orderInfo.getSeparation(),orderInfo.getRow(),orderInfo.getColumn(),status,null,null,path, LocalDateTime.now());
// stockMapper.insert(stock);
// }else {
// stock.setStatus(status);
// stock.setLotnum(plcCmdInfo.getLotnum());
// stock.setExportTime(LocalDateTime.now());
// stock.setCheckPic(path);
// stock.setCheckNum(plcCmdInfo.getOrderNum());
// stock.setTrayCode(trayCode);
// stock.setWmsTrayCode(wmsTrayCode);
// stock.setCode(scanCode);
// stock.setWmsCode(wmsCode);
// stockMapper.updateById(stock);
// }
// checkLog(stock);
}
public void checkLog(Stock stock){

@ -3,6 +3,9 @@ package com.zhehekeji.web.service.client;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
@ -10,8 +13,11 @@ import java.util.Map;
/**
* chanel
*/
@Slf4j
public class ClientChanel {
private static final Logger tcpLogger = LoggerFactory.getLogger("tcp");
/**
* key :
*/
@ -29,4 +35,12 @@ public class ClientChanel {
public static Channel get(String key){
return channelMap.get(key);
}
public static void write(String data,String key){
if(channelMap.get(key) != null){
channelMap.get(key).writeAndFlush(data);
}else {
tcpLogger.info("no connect client:{}",key);
}
}
}

@ -1,5 +1,6 @@
package com.zhehekeji.web.service.client;
import com.zhehekeji.web.service.PlcService;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
@ -16,11 +17,12 @@ import java.nio.charset.Charset;
@Slf4j
public class Decoder extends DelimiterBasedFrameDecoder {
private static final Logger tcpLogger = LoggerFactory.getLogger("client_tcp");
private static final Logger tcpLogger = LoggerFactory.getLogger("tcp");
public Decoder() {
private PlcService plcService;
public Decoder(PlcService plcService) {
super(200,true,false, Unpooled.copiedBuffer(";".getBytes()));
this.plcService = plcService;
}
@Override
@ -35,28 +37,26 @@ public class Decoder extends DelimiterBasedFrameDecoder {
//心跳
HBTransmission hbTransmission = new HBTransmission(body);
//回复客户端心跳
ctx.channel().writeAndFlush(hbTransmission.toString());
tcpLogger.info("client:{} heart", hbTransmission.getSRMNumber());
in.release();
} else if(body.startsWith(TMTransmission.getHeader())){
//盘点与空货位扫描相关的指令
//盘点指令
TMTransmission tmTransmission = new TMTransmission(body);
if(tmTransmission.getType() == 1){
//空货位扫描
}else {
//盘点
}
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())){
//空货位盘点
ECTransmission ecTransmission = new ECTransmission(body);
}else if(body.startsWith("DC")){
//客户端断开连接
String [] strings = body.split(",");

@ -0,0 +1,85 @@
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 String SRMNumber;
private String taskId;
private String type;
private String goodsLocation;
private String isEmpty;
/**
* 1: 2
*/
private Integer direction;
/**
* 1 2
*/
private Integer side;
private Integer row;
private Integer column;
public String toString(){
return HEADER + "," + SRMNumber;
}
public static String getHEADER(){
return HEADER;
}
public ECTransmission(String body){
String [] strings = body.split(",");
if(strings != null && strings.length == 4 && HEADER.equals(strings[0])){
SRMNumber = strings[1];
taskId = strings[2];
goodsLocation = strings[3];
isEmpty = strings[4];
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));
}
}
/**
*
* @return
*/
public String toEmptyCheckStartString(){
StringBuffer sb = new StringBuffer(HEADER);
sb.append(Split).append(SRMNumber).append(Split).append("START");
return sb.toString();
}
/**
*
* @return
*/
public String toEmptyCheckEndString(){
StringBuffer sb = new StringBuffer(HEADER);
sb.append(Split).append(SRMNumber).append(Split).append("END");
return sb.toString();
}
}

@ -1,12 +0,0 @@
package com.zhehekeji.web.service.client;
import lombok.Data;
@Data
/**
*
*/
public class EmptyTrayCheckTransmission {
}

@ -1,10 +1,10 @@
package com.zhehekeji.web.service.client;
import com.alibaba.fastjson.JSONObject;
import com.zhehekeji.web.service.ksec.KsecInfo;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.StandardCharsets;
@ -13,10 +13,11 @@ import java.nio.charset.StandardCharsets;
*/
public class Encoder extends MessageToByteEncoder<String> {
private static final Logger tcpLogger = LoggerFactory.getLogger("tcp");
@Override
protected void encode(ChannelHandlerContext channelHandlerContext, String data, ByteBuf byteBuf) throws Exception {
data = data + ";";
tcpLogger.info(data);
byteBuf.writeBytes(data.getBytes(StandardCharsets.UTF_8));
}
}

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

@ -1,5 +1,6 @@
package com.zhehekeji.web.service.client;
import com.zhehekeji.web.service.PlcService;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
@ -8,10 +9,17 @@ import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import lombok.SneakyThrows;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class NettyServer {
public static void CreateNettyServer(int port) throws InterruptedException {
@Resource
private PlcService plcService;
public void CreateNettyServer(int port) throws InterruptedException {
Thread thread = new Thread(new Runnable() {
@SneakyThrows
@Override
@ -29,7 +37,7 @@ public class NettyServer {
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new Decoder());
ch.pipeline().addLast(new Decoder(plcService));
ch.pipeline().addLast(new Encoder());
}}); // 子处理器用于处理workerGroup

@ -5,6 +5,7 @@ import lombok.Data;
/**
*
*
*
*/
@Data
public class TMTransmission {
@ -35,18 +36,20 @@ public class TMTransmission {
private Integer count;
private String visualTest;
private String isDisConnect;
/**
*
* 1: 2
*/
private String checkType;
private Integer direction;
/**
* 1
* 0
* 1 2
*/
private Integer type;
private String isEmpty;
private Integer side;
private static String Split = ",";
@ -54,29 +57,11 @@ public class TMTransmission {
StringBuffer sb = new StringBuffer(header);
sb.append(Split).append(SRMNumber).append(Split).append(taskNo).append(Split)
.append(goodsLocation).append(Split).append(trayNo).append(Split).append(code)
.append(Split).append(count).append(Split).append(count).append(Split).append(checkType);
.append(Split).append(count).append(Split).append(count).append(Split).append(visualTest);
return sb.toString();
}
/**
*
* @return
*/
public String toEmptyCheckStartString(){
StringBuffer sb = new StringBuffer(header);
sb.append(Split).append(SRMNumber).append(Split).append("START");
return sb.toString();
}
/**
*
* @return
*/
public String toEmptyCheckEndString(){
StringBuffer sb = new StringBuffer(header);
sb.append(Split).append(SRMNumber).append(Split).append("END");
return sb.toString();
}
public static String getHeader(){
return header;
@ -84,23 +69,22 @@ public class TMTransmission {
public TMTransmission(String body){
String [] strings = body.split(Split);
if(strings != null && strings.length >0 && strings[0].equals(header)){
if(strings.length == 8){
type = 0;
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]);
checkType = strings[7];
}else if(strings.length == 4){
type = 1;
SRMNumber = strings[1];
goodsLocation = strings[2];
isEmpty = strings[3];
visualTest = strings[7];
isDisConnect = strings[8];
direction = goodsLocation.substring(0).equals("L") ? 1:2;
side = Integer.valueOf(goodsLocation.substring(2,3));
//checkType = strings[7];
if("Y".equals(isDisConnect)){
//需要拆分之前的
}
}
}

@ -14,7 +14,7 @@ spring:
testWhileIdle: false
timeBetweenEvictionRunsMillis: 60000
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://115.236.65.98:12004/lia_duoji_test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
url: jdbc:mysql://115.236.65.98:12004/lia_duoji_nanjing_wuliu?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: root
validationQuery: SELECT 1 FROM DUAL
# --------本服务端口号

Loading…
Cancel
Save