@ -32,6 +32,8 @@ using System.Windows.Media;
using System.Drawing ;
using Brushes = System . Windows . Media . Brushes ;
using Admin.Core.Model.Model_New ;
using Microsoft.IdentityModel.Logging ;
using static Npgsql . Replication . PgOutput . Messages . RelationMessage ;
/ *
* 首 页 信 息
* /
@ -53,8 +55,7 @@ namespace Aucma.Core.CodeBinding.ViewModels
// 静态变量存code2
private static string code2Str = string . Empty ;
// 定时检测数据库有没有pad绑定未放行的数据
System . Timers . Timer timer = new System . Timers . Timer ( 1000 ) ;
public IndexPageViewModel ( )
{
try
@ -69,38 +70,37 @@ namespace Aucma.Core.CodeBinding.ViewModels
MvCodeHelper . ReceiveCode2Event + = receiveCode2 ;
LoadData ( ) ;
// 实时绑定两个条码
realBinding ( ) ;
// pda手持检测plc放行定时器
StartPlcTimer ( ) ;
//实时绑定条码和实时下发plc放行信号
realBindingAndSendPlc ( ) ;
Task . Run ( ( ) = >
{
Thread . Sleep ( 5000 ) ;
receiveCode1 ( "L23000000899" ) ;
Thread . Sleep ( 2000 ) ;
receiveCode2 ( "B23000000824" ) ;
//Thread.Sleep(6000);
//receiveCode1("993000000899");
//receiveCode2("993000000824");
} ) ;
//Task.Run(() =>
//{
// Thread.Sleep(5000);
// receiveCode1("L23000000899");
// Thread.Sleep(2000);
// receiveCode2("B23000000824");
//});
}
catch ( Exception )
catch ( Exception ex )
{
log . Error ( ex ) ;
}
}
public void realBinding ( )
/// <summary>
/// 实时绑定条码和实时下发plc放行信号
/// </summary>
public void realBindingAndSendPlc ( )
{
string tempCode1 ;
string tempCode2 ;
// 实时绑定条码
Task . Run ( ( ) = >
{
while ( true )
{
try
{
if ( ! string . IsNullOrEmpty ( code1Str ) & & ! string . IsNullOrEmpty ( code2Str ) )
@ -115,45 +115,39 @@ namespace Aucma.Core.CodeBinding.ViewModels
catch ( Exception ex )
{
Console . WriteLine ( ex . ToString ( ) ) ;
}
Thread . Sleep ( 10 00) ;
}
Thread . Sleep ( 5 00) ;
}
} ) ;
}
/// <summary>
/// 开启定时器定时读取数据库并下发plc放行信号
/// </summary>
private void StartPlcTimer ( )
{
if ( ! timer . Enabled )
{
timer . Elapsed + = new System . Timers . ElapsedEventHandler ( readDataSendPlc ) ;
timer . AutoReset = true ;
timer . Enabled = false ;
timer . Start ( ) ;
}
}
/// <summary>
/// 定时读取plc扫码信号, 放行完成反馈信号
/// </summary>
private async void readDataSendPlc ( object source , System . Timers . ElapsedEventArgs e )
{
List < CodeBindingRecord > records = await _codeBindingRecordServices . QueryAsync ( x = > x . isPlcPass = = 1 & & x . RecordTime2 > = System . DateTime . Now . AddDays ( - 1 ) , "RECORD_TIME2 desc" ) ;
if ( records ! = null & & records . Count > 0 )
// 实时下发plc放行信号
Task . Run ( ( ) = >
{
CodeBindingRecord record = records [ 0 ] ;
// 下发plc放行信号
if ( SendPlcPass ( ) )
while ( true )
{
record . isPlcPass = 2 ;
await _codeBindingRecordServices . UpdateAsync ( record ) ;
try
{
CodeBindingRecord record = _codeBindingRecordServices . FirstAsync ( x = > x . isPlcPass = = 1 & & x . RecordTime2 > = System . DateTime . Now . AddDays ( - 1 ) ) . Result ;
if ( record ! = null )
{
// 下发plc放行信号
if ( SendPlcPass ( ) )
{
record . isPlcPass = 2 ;
_ = _codeBindingRecordServices . UpdateAsync ( record ) . Result ;
}
}
}
catch ( Exception ex )
{
log . Error ( ex . ToString ( ) ) ;
}
Thread . Sleep ( 500 ) ;
}
}
} ) ;
}
#region 加载DataGrid数据
private async void LoadData ( )
{
@ -186,25 +180,53 @@ namespace Aucma.Core.CodeBinding.ViewModels
// 修改为统计近一天白班或夜班
private async void LoadCharts ( )
{
List < CodeBindCharts > list = await _codeBindingRecordServices . QueryCharts ( ) ;
// 图表赋值
ChartValues < double > achievement = new ChartValues < double > ( ) ;
List < string > chartList = new List < string > ( ) ;
if ( list = = null ) return ;
foreach ( CodeBindCharts item in list )
try
{
App . Current . Dispatcher . Invoke ( ( ) = >
{
ProductionHourList = new List < string > ( ) ;
List < CodeBindCharts > list = _codeBindingRecordServices . QueryCharts ( ) . Result ;
// 图表赋值
ChartValues < double > achievement = new ChartValues < double > ( ) ;
List < string > chartList = new List < string > ( ) ;
if ( list = = null ) return ;
foreach ( CodeBindCharts item in list )
{
achievement . Add ( item . Amount ) ;
ProductionHourList . Add ( item . BoxName . Substring ( 0 , Math . Min ( 7 , item . BoxName . Length ) ) ) ;
}
var column = new ColumnSeries ( ) ;
column . DataLabels = true ;
column . Title = "型号" ;
column . Values = achievement ;
column . Foreground = Brushes . White ;
if ( ModelStatistics . Count > 0 & & ModelStatistics . FirstOrDefault ( ) . Values . Count = = achievement . Count )
{
for ( int i = 0 ; i < achievement . Count ( ) ; i + + )
{
ModelStatistics . FirstOrDefault ( ) . Values [ i ] = achievement . ElementAt ( i ) ;
}
}
else
{
ModelStatistics . Clear ( ) ;
ModelStatistics . Add ( column ) ;
}
} ) ;
}
catch ( Exception )
{
achievement . Add ( item . Amount ) ;
chartList . Add ( item . BoxName ) ;
throw ;
}
var column = new ColumnSeries ( ) ;
column . DataLabels = true ;
column . Title = "型号" ;
column . Values = achievement ;
column . Foreground = Brushes . White ;
ModelStatistics . Add ( column ) ;
ProductionHourList = chartList ;
}
// 测试方法
@ -233,20 +255,20 @@ namespace Aucma.Core.CodeBinding.ViewModels
}
}
/// // <summary>
/// // 条码1扫描时间
/// // </summary>
//private string code1Time = string.Empty ;
//public string Code1Time
// {
// get { return code1Time; }
// set
// {
// code1Time = value;
// OnPropertyChanged(nameof(Code1Time));
// }
// }
/// <summary>
/// 条码1扫描时间
/// </summary>
private string code1Time = string . Empty ;
public string Code1Time
{
get { return code1Time ; }
set
{
code1Time = value ;
OnPropertyChanged ( nameof ( Code1Time ) ) ;
}
}
/// <summary>
/// 条码2
/// </summary>
@ -263,16 +285,17 @@ namespace Aucma.Core.CodeBinding.ViewModels
///// <summary>
///// 条码2扫描时间
///// </summary>
//private string code2Time = string.Empty;
//public string Code2Time
//{
// get { return code2Time; }
// set
// {
// code2Time = value;
// OnPropertyChanged(nameof(Code2Time));
// }
//}
private string code2Time = string . Empty ;
public string Code2Time
{
get { return code2Time ; }
set
{
code2Time = value ;
OnPropertyChanged ( nameof ( Code2Time ) ) ;
}
}
/// <summary>
/// 绑定提示信息
/// </summary>
@ -286,6 +309,7 @@ namespace Aucma.Core.CodeBinding.ViewModels
OnPropertyChanged ( nameof ( BindingInfo ) ) ;
}
}
#region 日产量柱状图X轴日期
/// <summary>
/// 日产量柱状图X轴日期
@ -327,54 +351,16 @@ namespace Aucma.Core.CodeBinding.ViewModels
}
# endregion
/// <summary>
/// code1扫码信息刷新
/// </summary>
/// <param name="materialType"></param>
private void RefreshCode1 ( string code1 , string time )
{
Code1 = code1 ;
// Code1Time = time;
}
/// <summary>
/// code2扫码信息及表格记录刷新
/// </summary>
/// <param name="materialType"></param>
private void RefreshCode2 ( CodeBindingRecord record )
{
Code2 = record . ProductCode ;
// Code2Time = record.RecordTime2.ToString();
if ( record . isPlcPass = = 2 )
{
BindingInfo = "条码【" + record . BoxCode + "】与SN码【" + record . ProductCode + "】绑定成功,下发Plc放行成功" ;
}
else
{
BindingInfo = "条码【" + record . BoxCode + "】与SN码【" + record . ProductCode + "】下发Plc放行失败" ;
}
Application . Current . Dispatcher . Invoke ( ( ) = >
{
// ReaderInfo readerToUpdate = (ReaderInfo)ListItems.Select(item => item.No == 2);
ListItems . Add ( new ReaderInfo ( ) { No = ListItems . Count + 1 , BoxCode = record . BoxCode , ProductCode = record . ProductCode , BoxName = record . BoxName , BindingResult = record . BindingResult , IsPlcPass = record . isPlcPass = = 2 ? "plc放行成功" : "" , RecordTime = record . RecordTime2 . ToString ( ) } ) ;
} ) ;
}
/// <summary>
/// 条码绑定,条码1处理
/// </summary>
/// <param name="materialType"></param>
private async void receiveCode1 ( string code1 )
{
log . Info ( "进入条码1处理函数receiveCode1,code1:" + code1 ) ;
DateTime time = System . DateTime . Now ;
string strTime = time . ToString ( ) ;
// 1.刷新界面条码信息
log . Info ( "扫描到MES条码:" + code1 ) ;
// 全局变量赋值, SN码扫描后使用
code1Str = code1 ;
RefreshCode1 ( code1 , strTime );
RefreshCode1 ( code1 ) ;
# region
// 2.创建任务更新数据库条码1
// CodeBindingRecord codeRecord = new CodeBindingRecord();
@ -393,70 +379,108 @@ namespace Aucma.Core.CodeBinding.ViewModels
//});
//log.Info("条码1记录更新");
# endregion
}
private async void receiveCode2 ( string code2 )
{
log . Info ( "扫描到成品条码:" + code1 ) ;
// 1.刷新界面条码信息
// 全局变量赋值, SN码扫描后使用
code2Str = code2 ;
RefreshCode2 ( code2 ) ;
}
private void RefreshCode1 ( string code1 )
{
DateTime time = System . DateTime . Now ;
Code1 = code1 ;
Code1Time = time . ToString ( ) ;
}
private void RefreshCode2 ( string code2 )
{
DateTime time = System . DateTime . Now ;
Code2 = code2 ;
Code2Time = time . ToString ( ) ;
// Code2 = record.ProductCode;
//// Code2Time = record.RecordTime2.ToString();
// if (record.isPlcPass==2)
// {
// BindingInfo = "条码【" + record.BoxCode + "】与SN码【" + record.ProductCode + "】绑定成功,下发Plc放行成功";
// }
// else
// {
// BindingInfo = "条码【" + record.BoxCode + "】与SN码【" + record.ProductCode + "】下发Plc放行失败";
// }
// Application.Current.Dispatcher.Invoke(() =>
// {
// // ReaderInfo readerToUpdate = (ReaderInfo)ListItems.Select(item => item.No == 2);
// ListItems.Add(new ReaderInfo() { No = ListItems.Count+1, BoxCode = record.BoxCode, ProductCode = record.ProductCode, BoxName = record.BoxName,BindingResult = record.BindingResult, IsPlcPass = record.isPlcPass==2?"plc放行成功":"",RecordTime = record.RecordTime2.ToString() });
// });
}
/// <summary>
/// 条码绑定,条码2处理
/// 提示信息刷新并且存日志
/// </summary>
/// <param name="materialType"></param>
private async void receiveCode2 ( string code2 )
/// <param name=" logStr "></param>
private void RefreshAndWriteLog ( string logStr )
{
log . Info ( "进入条码2处理函数receiveCode2,code2:" + code2 ) ;
// 1.刷新界面条码信息
// 全局变量赋值, SN码扫描后使用
code2Str = code2 ;
DateTime time = System . DateTime . Now ;
BindingInfo = time + ":" + logStr ;
log . Info ( logStr ) ;
}
public void BindingCode ( string code1 , string code2 )
{
try
{
log . Info ( "开始处理条码绑定:" ) ;
RefreshAndWriteLog ( "开始绑定MES条码:" + code1 + " SN条码:" + code2 ) ;
// 1.数据库查询各个工序质检结果,不合格报警
// 2.查询条码绑定记录表(内胆箱壳绑定处就应该插入记录), 绑定SN码
CodeBindingRecord record = _codeBindingRecordServices . FirstAsync ( x = > x . BoxCode = = code1 ) . Result ;
BaseMaterialInfo materialInfo = _baseMaterialInfoServices . FirstAsync ( x = > x . MaterialCode = = code2 . Substring ( 2 , 10 ) ) . Result ;
if ( record = = null )
{
RefreshAndWriteLog ( "未查询到MES条码记录,集存库未绑定箱壳内胆" ) ;
return ;
}
BaseMaterialInfo materialInfo = _baseMaterialInfoServices . FirstAsync ( x = > x . MaterialCode = = code1 . Substring ( 7 , 10 ) ) . Result ;
record . BoxName = materialInfo . MaterialName ;
record . ProductCode = code2 ;
record . RecordTime1 = System . DateTime . Now ;
record . RecordTime2 = System . DateTime . Now ;
record . isPlcPass = 1 ;
record . BindingResult = "成功" ;
// 3.下发plc放行信号
if ( SendPlcPass ( ) )
bool result = _codeBindingRecordServices . UpdateAsync ( record ) . Result ;
if ( result )
{
record . isPlcPass = 2 ;
RefreshAndWriteLog ( "条码【" + record . BoxCode + "】与SN码【" + record . ProductCode + "】绑定成功" ) ;
#region 更新过点数据,插入记录到MATERIAL_COMPLETION表
//PrintBarCode print = await _printBarCodeServices.FirstAsync(x => x.MaterialBarcode == code1);
//if (print != null) return;
//MaterialCompletion completion = new MaterialCompletion();
//completion.OrderCode = print.OrderCode;
//completion.MaterialBarcode = code1;
//completion.MaterialCode = print.MaterialCode;
//completion.MaterialName = print.MaterialName;
//completion.StationName = "1007";
//completion.CompleteDate = DateTime.Now;
//await _iMaterialCompletionServices.AddAsync(completion);
# endregion
}
_codeBindingRecordServices . UpdateAsync ( record ) ;
#region 更新过点数据,插入记录到MATERIAL_COMPLETION表
//PrintBarCode print = await _printBarCodeServices.FirstAsync(x => x.MaterialBarcode == code1);
//if (print != null) return;
//MaterialCompletion completion = new MaterialCompletion();
//completion.OrderCode = print.OrderCode;
//completion.MaterialBarcode = code1;
//completion.MaterialCode = print.MaterialCode;
//completion.MaterialName = print.MaterialName;
//completion.StationName = "1007";
//completion.CompleteDate = DateTime.Now;
//await _iMaterialCompletionServices.AddAsync(completion);
# endregion
// 2.刷新界面信息
RefreshCode2 ( record ) ;
}
catch ( Exception ex )
{
code1Str = string . Empty ;
code2Str = string . Empty ;
Console . WriteLine ( ex . Message . ToString ( ) ) ;
RefreshAndWriteLog ( ex . Message . ToString ( ) ) ;
}
finally
{
@ -511,8 +535,6 @@ namespace Aucma.Core.CodeBinding.ViewModels
{
try
{
lock ( string . Empty )
{
bool isFlag = true ;
var obj = PlcHelper . melsecList . FirstOrDefault ( d = > d . EquipName . Equals ( "条码绑定Plc" ) ) ;
if ( obj ! = null )
@ -539,7 +561,7 @@ namespace Aucma.Core.CodeBinding.ViewModels
{
log . Info ( "获取plc连接对象信息为空" ) ;
}
}
}
catch ( Exception ex )
{