@ -4,12 +4,15 @@ using Admin.Core.IService;
using Admin.Core.Model ;
using Admin.Core.Model.Model_New ;
using Admin.Core.Service ;
using Admin.Core.Socket ;
using Aucma.Core.HwPLc ;
using Aucma.Core.ProductOffLine ;
using Aucma.Core.ProductOffLine.Common ;
using Aucma.Core.ProductOffLine.Config ;
using Aucma.Core.ProductOffLine.Models ;
using Aucma.Core.ProductOffLine.Views ;
using Aucma.Core.Scanner ;
using Castle.Core.Internal ;
using log4net ;
using Microsoft.Extensions.DependencyInjection ;
using Microsoft.Extensions.Hosting ;
@ -53,7 +56,20 @@ namespace Aucma.Core.ProductOffLine.Business
// public OffLineBusiness(){}
#region 变量定义
private readonly List < ScannerModel > allScanners = Appsettings . app < ScannerModel > ( "ScannerServer" ) . ToList ( ) ;
private static List < ScannerModel > allScanners = Appsettings . app < ScannerModel > ( "ScannerServer" ) . ToList ( ) ;
// 内胆扫码器ip
private static string LinerScannerIp = allScanners . First ( x = > x . Name = = "内侧扫码器1" ) . Ip ;
// 箱壳扫码器ip
private static string ShellScannerIp = allScanners . First ( x = > x . Name = = "外侧扫码器2" ) . Ip ;
private SpeechStr speechStr = SpeechStr . Instance ;
// 扫码器标准返回数据长度
private const string BarcodeRef = "6933973114570;1621240AP0098E3D3497" ;
/// <summary>
/// 扫码器1扫到条码的临时数据
/// </summary>
@ -111,11 +127,12 @@ namespace Aucma.Core.ProductOffLine.Business
public OffLineBusiness ( )
{
MvCodeHelper . RefreshMaterialCodeStrEvent + = MaterialBarScan ;
// MvCodeHelper.RefreshMaterialCodeStrEvent += MaterialBarScan;
GunBusiness . RefreshMaterialCodeStrEvent + = MaterialBarScan ;
HandSendPlcWindow . SendPlcPassEvent + = DownLoadPassFlag ;
// test();
TouchSocketService . ReceiveCodeDelegateEvent + = ReceiveAndConsumption ;
TouchSocketService . NoReadReceiveEvent + = NoRead ;
}
#region 变量定义
/// <summary>
@ -125,17 +142,71 @@ namespace Aucma.Core.ProductOffLine.Business
# endregion
public void test ( )
/// <summary>
/// TCP接收NoRead提醒
/// </summary>
public void NoRead ( string ip )
{
// 内侧
if ( LinerScannerIp = = ip )
{
Console . WriteLine ( $"内侧扫码器ip: {ip} 未扫描到条码" ) ;
speechStr . SpeakAsync ( "东侧扫码失败" ) ;
}
else if ( ShellScannerIp = = ip )
{
Console . WriteLine ( $"外侧扫码器ip: {ip} 未扫描到条码" ) ;
speechStr . SpeakAsync ( "西侧扫码失败" ) ;
}
}
#region 成品条码与69码校验
MaterialBarScan ( "15147X0CD0099E3W03410" , "12344" , "10.10.92.141" ) ;
# endregion
/// <summary>
/// TCP接收条码并分割处理
/// </summary>
/// <param name="ip"></param>
/// <param name="asciiStr"></param>
public void ReceiveAndConsumption ( string ip , string asciiStr )
{
try
{
if ( asciiStr . Contains ( ";" ) & & asciiStr . Length = = BarcodeRef . Length )
{
string [ ] splitStr = asciiStr . Split ( ";" ) ;
if ( splitStr . Count ( ) < 2 ) return ;
string code69 = string . Empty ;
string productCode = string . Empty ;
if ( splitStr [ 0 ] . Length = = 13 )
{
code69 = splitStr [ 0 ] ;
productCode = splitStr [ 1 ] ;
}
else if ( splitStr [ 0 ] . Length = = 20 )
{
productCode = splitStr [ 0 ] ;
code69 = splitStr [ 1 ] ;
}
if ( ! code69 . IsNullOrEmpty ( ) & & ! productCode . IsNullOrEmpty ( ) )
{
Task . Run ( ( ) = >
{
MaterialBarScanHandle ( productCode , code69 , ip ) ;
} ) ;
}
}
}
catch ( Exception ex )
{
log . Error ( "接收条码处理异常:" + ex . Message . ToString ( ) ) ;
}
}
public void MaterialBarScan ( string ProductCode , string Code69 , string scannerIp )
{
Task . Run ( ( ) = >
{
MaterialBarScanHandle ( ProductCode , Code69 , scannerIp ) ;
@ -151,10 +222,10 @@ namespace Aucma.Core.ProductOffLine.Business
{
try
{
ScannerModel model = allScanners . FirstOrDefault ( x = > x . Ip = = scannerIp ) ;
int ScannerNo = model . Id ; // 确定是哪个扫码器
log . Info ( "扫码器ip:" + scannerIp + "编号:[" + ScannerNo + "]扫描到条码:" + code ) ;
// ScannerModel model = allScanners.FirstOrDefault(x => x.Ip == scannerIp) ;
// int ScannerNo = model.Id; // 确定是哪个扫码器
// log.Info("扫码器ip:" + scannerIp + "编号:[" + ScannerNo + "]扫描到条码:" + code) ;
int ScannerNo = LinerScannerIp = = scannerIp ? 1 : 2 ;
string materialType = "" ;
bool BackResult = false ;
if ( ScannerNo = = 1 ) //内侧
@ -205,6 +276,7 @@ namespace Aucma.Core.ProductOffLine.Business
}
else
{
speechStr . SpeakAsync ( "更新数据库失败,禁止放行" ) ;
log . Info ( "条码:" + TempOffLineInfo1 . ProductSNCode + "更新Mes数据库失败" ) ;
TempOffLineInfo1 . MsgInfo = TempOffLineInfo1 . MsgInfo + "更新Mes数据库失败" ;
TempOffLineInfo1 . MsgAlarmFlag = true ;
@ -262,6 +334,7 @@ namespace Aucma.Core.ProductOffLine.Business
}
else
{
speechStr . SpeakAsync ( "更新数据库失败,禁止放行" ) ;
log . Info ( "条码:" + TempOffLineInfo2 . ProductSNCode + "更新Mes数据库失败" ) ;
TempOffLineInfo2 . MsgInfo = TempOffLineInfo2 . MsgInfo + "更新Mes数据库失败" ;
TempOffLineInfo2 . MsgAlarmFlag = true ;
@ -292,6 +365,7 @@ namespace Aucma.Core.ProductOffLine.Business
record . ProductSnCode = SNCode ;
record . ProductScanTime = DateTime . Now ;
record . ProductLineCode = appConfig . ProductlineCode ;
record . Position = "成品下线" ;
record . ExceptionMsg = Msg ;
record . ExceptionType = Type ;
await exceptionRecordServices . AddAsync ( record ) ;
@ -330,14 +404,18 @@ namespace Aucma.Core.ProductOffLine.Business
try
{
OffLineInfo info11 = MapperTwo ( TempOffLineInfo ) ;
// log.Info("条码绑定表查到记录:"+JsonHelper.ObjectToJson(bindingRecord1));
info11 . BoxCode = bindingRecord1 . BoxCode ;
// log.Info("条码绑定表查到记录:"+JsonHelper.ObjectToJson(bindingRecord1));
if ( bindingRecord1 ! = null )
{
info11 . BoxCode = bindingRecord1 . BoxCode ;
}
else
{
info11 . BoxCode = "" ;
}
// 产线
info11 . ProductLineCode = appConfig . ProductlineCode . ToString ( ) ;
@ -348,76 +426,87 @@ namespace Aucma.Core.ProductOffLine.Business
OffLineInfo offLineInfo = _offLineInfoServices . FirstAsync ( x = > x . ProductSNCode = = TempOffLineInfo . ProductSNCode ) . Result ;
if ( offLineInfo = = null )
{
info11 . ProductOrderNo = "0000" + info11 . ProductOrderNo ;
int flag = _offLineInfoServices . AddAsync ( info11 ) . Result ;
if ( flag < 0 )
try
{
log . Info ( TempOffLineInfo . ProductSNCode + "插入下线记录失败" ) ;
TempOffLineInfo . MsgInfo = TempOffLineInfo . MsgInfo + "插入下线记录失败" ;
TempOffLineInfo . MsgAlarmFlag = true ;
//界面刷新
RefreshScanMateriaCodeEvent ( TempOffLineInfo ) ;
AddExceptionRecord ( TempOffLineInfo . ProductSNCode , TempOffLineInfo . MsgInfo , 0 ) ;
return false ;
}
if ( bindingRecord1 ! = null & & bindingRecord1 . BoxCode ! = "" )
{
PrintBarCode print = _printBarCodeServices . FirstAsync ( x = > x . MaterialBarcode = = bindingRecord1 . BoxCode ) . Result ;
if ( print ! = null )
{
#region 更新过点数据
MaterialCompletion completion = new MaterialCompletion ( ) ;
completion . OrderCode = print . OrderCode ;
completion . MaterialBarcode = bindingRecord1 . BoxCode ;
completion . MaterialCode = print . MaterialCode ;
completion . MaterialName = print . MaterialName ;
completion . StationName = "1009" ;
completion . CompleteDate = DateTime . Now ;
completion . ProductLineCode = appConfig . ProductlineCode ;
completion . isDownLine = 1 ;
completion . ProductionCode = TempOffLineInfo . ProductSNCode ;
_ = _iMaterialCompletionServices . AddAsync ( completion ) . Result ;
# endregion
////采用箱体码的订单号更新订单
BaseOrderInfo order = _baseOrderInfoServices . FirstAsync ( x = > x . OrderCode = = print . OrderCode ) . Result ;
if ( order = = null )
{
log . Info ( "条码:" + TempOffLineInfo . ProductBarNo + " 订单号:" + TempOffLineInfo . ProductOrderNo + " 查询mes订单失败" ) ;
TempOffLineInfo . MsgInfo = TempOffLineInfo . MsgInfo + "查询mes订单失败" ;
TempOffLineInfo . MsgAlarmFlag = true ;
AddExceptionRecord ( TempOffLineInfo . ProductSNCode , TempOffLineInfo . ProductSNCode + TempOffLineInfo . MsgInfo , 0 ) ;
//界面刷新
RefreshScanMateriaCodeEvent ( TempOffLineInfo ) ;
return false ;
// 不重复上传的条码才更新mes订单完成数
// 修改订单表
////6.更新mes 数据库完成数量和时间(BASE_ORDERINFO) 注意:查询的字段可能需要修改,确保数据一致
}
order . CompleteAmount + + ;
if ( order . CompleteAmount = = order . OrderAmount )
{
order . CompleteDate = DateTime . Now ;
}
order . UpdatedTime = DateTime . Now ;
bool uploadOrder = _baseOrderInfoServices . UpdateAsync ( order ) . Result ;
if ( ! uploadOrder )
{
log . Info ( "条码:" + TempOffLineInfo . ProductBarNo + " 订单号:" + TempOffLineInfo . ProductOrderNo + " 更新mes订单完成数失败" ) ;
TempOffLineInfo . MsgInfo = TempOffLineInfo . MsgInfo + "更新mes订单完成数失败" ;
TempOffLineInfo . MsgAlarmFlag = true ;
AddExceptionRecord ( TempOffLineInfo . ProductSNCode , TempOffLineInfo . ProductSNCode + "更新mes订单完成数失败" , 0 ) ;
//界面刷新
RefreshScanMateriaCodeEvent ( TempOffLineInfo ) ;
return false ;
}
////6.1截取订单号去查询更新BASE_ORDERINFO,全放到service处理
BaseOrderInfo order = _baseOrderInfoServices . FirstAsync ( x = > x . OrderCode = = TempOffLineInfo . ProductOrderNo ) . Result ;
if ( order = = null )
{
log . Info ( "条码:" + TempOffLineInfo . ProductBarNo + " 订单号:" + TempOffLineInfo . ProductOrderNo + " 查询mes订单失败" ) ;
TempOffLineInfo . MsgInfo = TempOffLineInfo . MsgInfo + "查询mes订单失败" ;
TempOffLineInfo . MsgAlarmFlag = true ;
AddExceptionRecord ( TempOffLineInfo . ProductSNCode , TempOffLineInfo . ProductSNCode + TempOffLineInfo . MsgInfo , 0 ) ;
//界面刷新
RefreshScanMateriaCodeEvent ( TempOffLineInfo ) ;
return false ;
}
order . CompleteAmount + + ;
if ( order . CompleteAmount = = order . OrderAmount )
}
}
} catch ( Exception ex )
{
order . CompleteDate = DateTime . Now ;
log . Info ( "添加过点数据异常:" + ex . Message . ToString ( ) ) ;
}
order . UpdatedTime = DateTime . Now ;
bool uploadOrder = _baseOrderInfoServices . UpdateAsync ( order ) . Result ;
if ( ! uploadOrder )
info11 . ProductOrderNo = "0000" + info11 . ProductOrderNo ;
int flag = _offLineInfoServices . AddAsync ( info11 ) . Result ;
if ( flag < 0 )
{
log . Info ( "条码:" + TempOffLineInfo . ProductBarNo + " 订单号:" + TempOffLineInfo . ProductOrderNo + " 更新mes订单完成数失败" ) ;
TempOffLineInfo . MsgInfo = TempOffLineInfo . MsgInfo + " 更新mes订单完成数 失败";
log . Info ( TempOffLineInfo . ProductSNCode + "插入下线记录 失败") ;
TempOffLineInfo . MsgInfo = TempOffLineInfo . MsgInfo + " 插入下线记录 失败";
TempOffLineInfo . MsgAlarmFlag = true ;
AddExceptionRecord ( TempOffLineInfo . ProductSNCode , TempOffLineInfo . ProductSNCode + "更新mes订单完成数失败" , 0 ) ;
//界面刷新
RefreshScanMateriaCodeEvent ( TempOffLineInfo ) ;
AddExceptionRecord ( TempOffLineInfo . ProductSNCode , TempOffLineInfo . MsgInfo , 0 ) ;
return false ;
}
#region 更新过点数据
if ( bindingRecord1 ! = null & & bindingRecord1 . BoxCode ! = "" )
{
PrintBarCode print = _printBarCodeServices . FirstAsync ( x = > x . MaterialBarcode = = bindingRecord1 . BoxCode ) . Result ;
if ( print ! = null )
{
MaterialCompletion completion = new MaterialCompletion ( ) ;
completion . OrderCode = print . OrderCode ;
completion . MaterialBarcode = bindingRecord1 . BoxCode ;
completion . MaterialCode = print . MaterialCode ;
completion . MaterialName = print . MaterialName ;
completion . StationName = "1009" ;
completion . CompleteDate = DateTime . Now ;
completion . ProductLineCode = appConfig . ProductlineCode ;
completion . isDownLine = 1 ;
completion . ProductionCode = TempOffLineInfo . ProductSNCode ;
_ = _iMaterialCompletionServices . AddAsync ( completion ) . Result ;
}
}
# endregion
}
@ -456,29 +545,32 @@ namespace Aucma.Core.ProductOffLine.Business
RefreshScanMateriaCodeEvent ? . Invoke ( TempOffLineInfo ) ;
log . Info ( TempOffLineInfo . ProductSNCode + "条码绑定工位未查询到条码绑定记录,请拆掉包装重新绑定" ) ;
AddExceptionRecord ( TempOffLineInfo . ProductSNCode , TempOffLineInfo . MsgInfo , 3 ) ;
return false ;
speechStr . SpeakAsync ( "条码未绑定,请回到绑定工位" ) ;
// return false;
}
#region 1.质检-未查到终检合格记录即为质检不合格
ReportQualityInsPection qualityList = _reportQualityInspectionServices . JudgeIsQualified ( bindingRecord1 . BoxCode ) ;
if ( qualityList = = null )
if ( bindingRecord1 ! = null )
{
TempOffLineInfo . QualityResult = "失败" ;
TempOffLineInfo . ProductSNCode = BarCode . Trim ( ) ; //产品SN条码*1
TempOffLineInfo . ProductScanTime = System . DateTime . Now ; // 扫码时间*2
TempOffLineInfo . MsgInfo = TempOffLineInfo . ProductSNCode + ":条码终检失败或未终检,请回到终检工位重新检查!" ;
TempOffLineInfo . MsgAlarmFlag = true ;
//界面刷新
// TempOffLineInfo.ProductRefreshFlag = true;
RefreshScanMateriaCodeEvent ? . Invoke ( TempOffLineInfo ) ;
AddExceptionRecord ( TempOffLineInfo . ProductSNCode , TempOffLineInfo . MsgInfo , 4 ) ;
return false ;
}
# endregion
#region 1.质检-未查到终检合格记录即为质检不合格
ReportQualityInsPection qualityList = _reportQualityInspectionServices . JudgeIsQualified ( bindingRecord1 . BoxCode ) ;
if ( qualityList = = null )
{
TempOffLineInfo . QualityResult = "失败" ;
TempOffLineInfo . ProductSNCode = BarCode . Trim ( ) ; //产品SN条码*1
TempOffLineInfo . ProductScanTime = System . DateTime . Now ; // 扫码时间*2
TempOffLineInfo . MsgInfo = TempOffLineInfo . ProductSNCode + ":条码终检失败或未终检,请回到终检工位重新检查!" ;
TempOffLineInfo . MsgAlarmFlag = true ;
//界面刷新
// TempOffLineInfo.ProductRefreshFlag = true;
RefreshScanMateriaCodeEvent ? . Invoke ( TempOffLineInfo ) ;
AddExceptionRecord ( TempOffLineInfo . ProductSNCode , TempOffLineInfo . MsgInfo , 4 ) ;
speechStr . SpeakAsync ( "终检不合格,请重新终检" ) ;
// return false;
}
# endregion
}
TempOffLineInfo . QualityResult = "成功" ;
@ -502,6 +594,7 @@ namespace Aucma.Core.ProductOffLine.Business
{
FArrayList [ 0 ] = "N" ;
FArrayList [ 1 ] = "条码系统查询接口调用失败,请检查网络重新扫描" ;
speechStr . SpeakAsync ( "条码系统查询失败,请检查网络重新扫描" ) ;
}
if ( FArrayList [ 0 ] . ToUpper ( ) = = "Y" ) //查询数据成功
@ -606,7 +699,7 @@ namespace Aucma.Core.ProductOffLine.Business
//界面刷新
// TempOffLineInfo.ProductRefreshFlag = true;
RefreshScanMateriaCodeEvent ? . Invoke ( TempOffLineInfo ) ;
AddExceptionRecord ( TempOffLineInfo . ProductSNCode , TempOffLineInfo . MsgInfo , 5 ) ;
return false ;
}
@ -614,6 +707,7 @@ namespace Aucma.Core.ProductOffLine.Business
}
catch ( Exception ex )
{
speechStr . SpeakAsync ( "条码系统验证异常" ) ;
TempOffLineInfo . MsgInfo = "获取产品条码异常:" + ex . Message ;
TempOffLineInfo . MsgAlarmFlag = true ;
//界面刷新
@ -678,6 +772,7 @@ namespace Aucma.Core.ProductOffLine.Business
}
else
{
speechStr . SpeakAsync ( "条码系统上传失败" ) ;
log . Info ( TempOffLineInfo . ProductSNCode + "上传条码失败:" + strSave ) ;
TempOffLineInfo . MsgInfo = TempOffLineInfo . MsgInfo + ",上传条码失败" + strSave ;
@ -696,6 +791,7 @@ namespace Aucma.Core.ProductOffLine.Business
}
else
{
TempOffLineInfo . MsgInfo = TempOffLineInfo . MsgInfo + ",条码系统保存接口异常" ;
TempOffLineInfo . MsgAlarmFlag = true ;
AddExceptionRecord ( TempOffLineInfo . ProductSNCode , TempOffLineInfo . MsgInfo , 6 ) ;