@ -1,10 +1,10 @@
package com.zhehekeji.web.service.client ;
package com.zhehekeji.web.service.client ;
import com.sun.org.apache.bcel.internal.generic.PUTFIELD ;
import com.zhehekeji.web.entity.Stock ;
import com.zhehekeji.web.entity.Stock ;
import com.zhehekeji.web.service.EmptyCheckService ;
import com.zhehekeji.web.service.EmptyCheckService ;
import com.zhehekeji.web.service.PlcService ;
import com.zhehekeji.web.service.PlcService ;
import com.zhehekeji.web.service.putian.PTData ;
import com.zhehekeji.web.service.putian.* ;
import com.zhehekeji.web.service.putian.PuTianNettyClient ;
import io.netty.buffer.ByteBuf ;
import io.netty.buffer.ByteBuf ;
import io.netty.buffer.Unpooled ;
import io.netty.buffer.Unpooled ;
import io.netty.channel.ChannelHandlerContext ;
import io.netty.channel.ChannelHandlerContext ;
@ -14,6 +14,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory ;
import org.slf4j.LoggerFactory ;
import java.nio.charset.Charset ;
import java.nio.charset.Charset ;
import java.nio.charset.StandardCharsets ;
import java.util.concurrent.ArrayBlockingQueue ;
import java.util.concurrent.ArrayBlockingQueue ;
import java.util.concurrent.ThreadPoolExecutor ;
import java.util.concurrent.ThreadPoolExecutor ;
import java.util.concurrent.TimeUnit ;
import java.util.concurrent.TimeUnit ;
@ -26,13 +27,21 @@ public class Decoder extends DelimiterBasedFrameDecoder {
private static final Logger tcpLogger = LoggerFactory . getLogger ( "tcp" ) ;
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" ;
private static String END_STRING = "$" ;
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor ( 5 , 15 , 30 , TimeUnit . MILLISECONDS , new ArrayBlockingQueue < > ( 20000 ) ) ;
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor ( 5 , 15 , 30 , TimeUnit . MILLISECONDS , new ArrayBlockingQueue < > ( 20000 ) ) ;
private EmptyCheckService emptyCheckService ;
private EmptyCheckService emptyCheckService ;
private PlcService plcService ;
private PlcService plcService ;
public Decoder ( PlcService plcService , EmptyCheckService emptyCheckService ) {
public Decoder ( PlcService plcService , EmptyCheckService emptyCheckService ) {
super ( 200 , true , false , Unpooled . copiedBuffer ( ";" . getBytes ( ) ) ) ;
super ( 20000 , true , false , Unpooled . copiedBuffer ( ">" . getBytes ( ) ) ,
Unpooled . copiedBuffer ( "$" . getBytes ( ) ) ) ;
this . plcService = plcService ;
this . plcService = plcService ;
this . emptyCheckService = emptyCheckService ;
this . emptyCheckService = emptyCheckService ;
}
}
@ -69,7 +78,94 @@ public class Decoder extends DelimiterBasedFrameDecoder {
@Override
@Override
public void run ( ) {
public void run ( ) {
String body = in . toString ( Charset . forName ( "UTF-8" ) ) ;
String body = in . toString ( Charset . forName ( "UTF-8" ) ) ;
tcpLogger . info ( "client:{}" , body ) ;
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 ( ) ) ;
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 ( ) ) ;
TMTransmission tmTransmission = new TMTransmission ( ptCheckContent . getSRMNUmber ( ) , ptCheckContent . getTaskNo ( ) , ptCheckContent . getGoodsLocation ( ) , ptCheckContent . getCode ( ) , ptCheckContent . getCount ( ) , "N" ) ;
// plcService.checkStart(tmTransmission);
String tmTransmissionStr = tmTransmission . toString ( ) ;
ClientChanel . write ( tmTransmissionStr , ptCheckContent . getSRMNUmber ( ) ) ;
in . release ( ) ;
}
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 ( ) ) ;
TMTransmission tmTransmission = new TMTransmission ( ptCheckContent . getSRMNUmber ( ) , ptCheckContent . getTaskNo ( ) ) ;
String tmTransmissionStr = tmTransmission . toSC02String ( ) ;
ClientChanel . write ( tmTransmissionStr , ptCheckContent . getSRMNUmber ( ) ) ;
}
else if ( ptData . getType ( ) . equals ( PTData . Into_Stock_01 ) ) {
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 ( ) ) ;
PuTianNettyClient . write ( resData ) ;
}
}
else {
if ( body . startsWith ( HBTransmission . getHEADER ( ) ) ) {
if ( body . startsWith ( HBTransmission . getHEADER ( ) ) ) {
//心跳
//心跳
HBTransmission hbTransmission = new HBTransmission ( body ) ;
HBTransmission hbTransmission = new HBTransmission ( body ) ;
@ -82,45 +178,62 @@ public class Decoder extends DelimiterBasedFrameDecoder {
TMTransmission tmTransmission = new TMTransmission ( body ) ;
TMTransmission tmTransmission = new TMTransmission ( body ) ;
if ( tmTransmission . isCollectOver ( ) ) {
if ( tmTransmission . isCollectOver ( ) ) {
//给普天发送数据采集完毕指令
//给普天发送数据采集完毕指令
PTData ptData = PTData . StockCheck03 ( tmTransmission . getSRMNumber ( ) , tmTransmission . getTaskNo ( ) , tmTransmission . getGoodsLocation ( ) , "Y ") ;
PTData ptData = PTData . StockCheck03 ( tmTransmission . getSRMNumber ( ) , tmTransmission . getTaskNo ( ) , "1 ") ;
PuTianNettyClient . write ( ptData ) ;
PuTianNettyClient . write ( ptData ) ;
} else {
} else {
//收到盘点结果
//收到盘点结果
Stock stock = plcService . checkEnd ( tmTransmission ) ;
// Stock stock = plcService.checkEnd(tmTransmission);
//将盘点结果发给普天
//将盘点结果发给普天
PTData ptData = PTData . StockCheck04 ( tmTransmission . getSRMNumber ( ) , tmTransmission . getTaskNo ( ) , tmTransmission . getGoodsLocation ( ) , stock ) ;
PTData ptData = PTData . StockCheck04 ( tmTransmission ) ;
PuTianNettyClient . write ( ptData ) ;
PuTianNettyClient . write ( ptData ) ;
//添加到实时信息里
//添加到实时信息里
RealtimeCheckMap . put ( tmTransmission . getSRMNumber ( ) , tmTransmission . checkInfo ( ) ) ;
// RealtimeCheckMap.put(tmTransmission.getSRMNumber(),tmTransmission.checkInfo());
//更新盤點統計
//更新盤點統計
emptyCheckService . updateCheckLastTime ( tmTransmission . getTaskNo ( ) , tmTransmission . getSRMNumber ( ) , stock . getCode ( ) ) ;
// emptyCheckService.updateCheckLastTime(tmTransmission.getTaskNo(),tmTransmission.getSRMNumber(),stock.getCode());
}
}
in . release ( ) ;
in . release ( ) ;
} else if ( body . startsWith ( CETransmission . getHEADER ( ) ) ) {
} else if ( body . startsWith ( CETransmission . getHEADER ( ) ) ) {
//客户端建立连接
//客户端建立连接
CETransmission ceTransmission = new CETransmission ( body ) ;
CETransmission ceTransmission = new CETransmission ( body ) ;
//回复客户端,建立连接完成
//回复客户端,建立连接完成
ctx . channel ( ) . writeAndFlush ( ceTransmission . toString ( ) ) ;
ctx . channel ( ) . writeAndFlush ( ceTransmission . toString ( ) ) ;
ClientChanel . connect ( ceTransmission . getSRMNumber ( ) , ctx . channel ( ) ) ;
ClientChanel . connect ( ceTransmission . getSRMNumber ( ) , ctx . channel ( ) ) ;
tcpLogger . info ( "client:{} connect" , ceTransmission . getSRMNumber ( ) ) ;
tcpLogger . info ( "client:{} connect" , ceTransmission . getSRMNumber ( ) ) ;
in . release ( ) ;
in . release ( ) ;
} else if ( body . startsWith ( ECTransmission . getHEADER ( ) ) ) {
}
else if ( body . startsWith ( ECTransmission . getHEADER ( ) ) ) {
//空货位盘点
//空货位盘点
ECTransmission ecTransmission = new ECTransmission ( body ) ;
ECTransmission ecTransmission = new ECTransmission ( body ) ;
log . info ( "empty result: {}" , body ) ;
//将库位的盘点结果发给普天
StringBuffer strBff = new StringBuffer ( ecTransmission . getSRMNumber ( ) ) ;
strBff . append ( "*" ) . append ( ecTransmission . getTaskId ( ) ) . append ( "*" ) . append ( ecTransmission . getEmptyMsg ( ) ) ;
// strBff.append(",").append(ecTransmission.getIsEmpty());
String content = strBff . toString ( ) ;
PTData ptData = new PTData ( content , PTData . FLOW_R , PTData . EMPTY_CHECK_03 ) ;
PuTianNettyClient . write ( ptData ) ;
//保存空货位条码
//保存空货位条码
EmptyCheckCodeInfo . addCode ( ecTransmission . getSRMNumber ( ) , ecTransmission . getRow ( ) , ecTransmission . getStartColumn ( ) , ecTransmission . getEndColumn ( ) , ecTransmission . getOriginCode ( ) ) ;
EmptyCheckCodeInfo . addCode ( ecTransmission . getSRMNumber ( ) , ecTransmission . getRow ( ) , ecTransmission . getStartColumn ( ) , ecTransmission . getEndColumn ( ) , ecTransmission . getOriginCode ( ) ) ;
//保存空货位信息
//保存空货位信息
emptyCheckService . emptyCheckLog ( ecTransmission ) ;
emptyCheckService . emptyCheckLog ( ecTransmission ) ;
in . release ( ) ;
in . release ( ) ;
} else if ( body . startsWith ( "DC" ) ) {
}
else if ( body . startsWith ( "DC" ) ) {
//客户端断开连接
//客户端断开连接
String [ ] strings = body . split ( "," ) ;
String [ ] strings = body . split ( " & ") ;
if ( strings ! = null & & strings . length = = 2 ) {
if ( strings ! = null & & strings . length = = 2 ) {
tcpLogger . info ( "client:{} disConnect" , strings [ 1 ] ) ;
tcpLogger . info ( "client:{} disConnect" , strings [ 1 ] ) ;
ClientChanel . disConnect ( strings [ 1 ] ) ;
ClientChanel . disConnect ( strings [ 1 ] ) ;
}
}
in . release ( ) ;
in . release ( ) ;
}
}
// else if (body.contains("EMPTY_CLIENT")){
// ClientChanel.connect(EMPTY_CLIENT_NAME, ctx.channel());
// tcpLogger.info("client:{} connect", EMPTY_CLIENT_NAME);
// in.release();
// }
}
}
}
}
}