liulb@mesnac.com 10 months ago
commit 8f210e0c08

@ -2486,9 +2486,9 @@
条码2记录时间
</summary>
</member>
<member name="P:Admin.Core.Model.CodeBindingRecord.isPlcPass">
<member name="P:Admin.Core.Model.CodeBindingRecord.IsPass">
<summary>
plc放行标志2为放行通过1为pda提示需要放行记录
plc放行标志1为自动放行2为手动放行
</summary>
</member>
<member name="P:Admin.Core.Model.CodeBindingRecord.LinerCode">
@ -2756,6 +2756,11 @@
异常类型1=69码校验;2=重复扫描;3=未绑条码;4=未终检)
</summary>
</member>
<member name="P:Admin.Core.Model.ExceptionRecord.Position">
<summary>
所在位置
</summary>
</member>
<member name="T:Admin.Core.Model.ExecutePlanInfo">
<summary>
计划执行表

@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("Admin.Core.FrameWork")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+88718f3b34f7734324ee7cf97223cb04de12229c")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("Admin.Core.FrameWork")]
[assembly: System.Reflection.AssemblyTitleAttribute("Admin.Core.FrameWork")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

@ -1 +1 @@
20767d7337a3656e5cd7e3434c747ce5e30a077ccc10b646dba8956b775fa268
7d60a94dd38c10522cbfe4a021ccb6e9c5da0354

@ -1,9 +1,3 @@
is_global = true
build_property.RootNamespace = Admin.Core.FrameWork
<<<<<<< HEAD
build_property.ProjectDir = E:\c#\AUCMA\最新代码整合\new\Admin.Core.FrameWork\
=======
build_property.ProjectDir = D:\Project\gitea\AUCMA\SCADA\Admin.Core.FrameWork\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
>>>>>>> 97953438a8516959b94be7b8b7960a70eb343705

@ -51,10 +51,10 @@ namespace Admin.Core.Model
[SugarColumn(ColumnName = "RECORD_TIME2")]
public DateTime RecordTime2 { get; set; }
/// <summary>
/// plc放行标志2为放行通过1为pda提示需要放行记录
/// plc放行标志1为自动放行2为手动放行
/// </summary>
[SugarColumn(ColumnName = "IS_PASS")]
public int isPlcPass { get; set; }
public int IsPass { get; set; }
/// <summary>
/// 内胆码

@ -48,7 +48,12 @@ namespace Admin.Core.Model
/// </summary>
[SugarColumn(ColumnName = "EXCEPTION_TYPE")]
public int ExceptionType { get; set; }
/// <summary>
/// 所在位置
/// </summary>
[SugarColumn(ColumnName = "POSITION")]
public string Position { get; set; }
}
}

@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("Admin.Core.RealTimeService")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+729cf301e9ab353dd20c9ec69def8c859af3c743")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("Admin.Core.RealTimeService")]
[assembly: System.Reflection.AssemblyTitleAttribute("Admin.Core.RealTimeService")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

@ -1 +1 @@
35d441d2c06b8acc070021b643d99e568157135ec499290bc740c910bd515ee6
0868e6bde5b49a65a126b91d794e990427a11761

@ -8,6 +8,4 @@ build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = Admin.Core.RealTimeService
build_property.ProjectDir = D:\Project\gitea\AUCMA\SCADA\Admin.Core.RealTimeService\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.ProjectDir = E:\c#\AUCMA\最新代码整合\new\Admin.Core.RealTimeService\

@ -34,6 +34,10 @@ namespace Admin.Core.Service
{
try
{
if (string.IsNullOrEmpty(BoxCode))
{
return null;
}
ReportQualityInsPection record = _qualityInspectionRepository.Db.Ado.SqlQuery<ReportQualityInsPection>($"select * from REPORT_QUALITY_INSPECTION where BAR_CODE = '{BoxCode}' AND STATION_CODE = 2010 AND TREATMENT_MEASURE = 3").FirstOrDefault();
return record;
}

@ -224,6 +224,7 @@ Global
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{CB159E16-8DA0-4125-B42F-BB5381AEDD4D} = {01AE8F7E-F6CB-4B8F-9B04-F9205E2CA3DB}
{14F9C421-C016-4D1F-A0D7-9C1AAB989FCB} = {36DDDB80-7DE0-4A50-991D-24456D673E75}
{33802553-78BF-4D8C-8925-9F7E4E7B6E9B} = {36DDDB80-7DE0-4A50-991D-24456D673E75}
{3A639D2E-F8E1-4E71-B75F-BCE7D02B0FA6} = {36DDDB80-7DE0-4A50-991D-24456D673E75}

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>

@ -31,7 +31,7 @@ namespace Aucma.Core.CodeBinding.Business
/// code1扫码信息刷新
/// </summary>
/// <param name="Code1"></param>
public delegate void BindingReceiveCode(string MesCode, string SnCode);
public delegate void BindingReceiveCode(string MesCode, string SnCode, int flag = 1);
public static event BindingReceiveCode? BindingReceiveCodeEvent;
#region 单例实现
@ -117,7 +117,7 @@ namespace Aucma.Core.CodeBinding.Business
if(!string.IsNullOrEmpty(MESCode) && !string.IsNullOrEmpty(SNCode))
{
// 委托
BindingReceiveCodeEvent?.Invoke(MESCode, SNCode);
BindingReceiveCodeEvent?.Invoke(MESCode, SNCode,2);
SNCode = string.Empty;
MESCode = string.Empty;
}

@ -18,7 +18,7 @@ namespace Aucma.Core.CodeBinding.Common
}
}
public void speech(string str) {
public async void SpeakAsync(string str) {
SpeechSynthesizer speech = new SpeechSynthesizer();
speech.Rate = 3;//设置语速

@ -34,9 +34,9 @@ namespace Aucma.Core.CodeBinding.Models
/// </summary>
public string? BindingResult { get; set; }
/// <summary>
/// plc下传结果
/// 放行方式1-自动2-手动
/// </summary>
public string? IsPlcPass { get; set; }
public string? IsPass { get; set; }
/// <summary>
/// 记录时间
/// </summary>

@ -68,6 +68,16 @@ namespace Aucma.Core.CodeBinding.ViewModels
// sn扫码器ip
private static string SnScannerIp = allScanners.First(x => x.Name == "sn扫码器").Ip;
private SpeechStr speechStr = SpeechStr.Instance;
private string ProductLineCode = Appsettings.app("StationInfo", "ProductLineCode");
// 质检记录
private readonly IReportQualityInspectionServices? _reportQualityInspectionServices;
//异常记录,记录质检失败情况
private readonly IExceptionRecordServices? exceptionRecordServices;
public IndexPageViewModel()
{
@ -76,9 +86,10 @@ namespace Aucma.Core.CodeBinding.ViewModels
_codeBindingRecordServices = App.ServiceProvider.GetService<ICodeBindingRecordServices>();
_baseBomInfoServices = App.ServiceProvider.GetService<IBaseBomInfoServices>();
_baseMaterialInfoServices = App.ServiceProvider.GetService<IBaseMaterialInfoServices>();
_reportQualityInspectionServices = App.ServiceProvider.GetService<IReportQualityInspectionServices>();
_printBarCodeServices = App.ServiceProvider.GetService<IPrintBarCodeServices>();
_iMaterialCompletionServices = App.ServiceProvider.GetService<IMaterialCompletionServices>();
exceptionRecordServices = App.ServiceProvider.GetService<IExceptionRecordServices>();
// Business.MvCodeHelper.ReceiveCodeEvent += ReceiveCode;
// Business.MvCodeHelper.BindingCodeEvent += BindingCode;
// Business.MvCodeHelper.NoReadEvent += ReceiveNoRead;
@ -86,20 +97,15 @@ namespace Aucma.Core.CodeBinding.ViewModels
TouchSocketService.NoReadReceiveEvent += ReceiveNoRead;
GunBusiness.BindingReceiveCodeEvent += BindingCode;
GunBusiness.RefreshMaterialCodeStrEvent += ReceiveCode;
MsgUIColor = "White";
LoadData();
//实时绑定条码和实时下发plc放行信号
realBindingAndSendPlc();
LoadCharts();
//Task.Run(() =>
//{
// Thread.Sleep(4000);
//});
}
catch (Exception ex)
@ -109,7 +115,6 @@ namespace Aucma.Core.CodeBinding.ViewModels
}
/// <summary>
/// 实时绑定条码和实时下发plc放行信号
/// </summary>
@ -118,28 +123,28 @@ namespace Aucma.Core.CodeBinding.ViewModels
string tempCode1;
string tempCode2;
// 实时绑定条码
Task.Run(() =>
{
while (true)
{
try
{
if (!string.IsNullOrEmpty(code1Str) && !string.IsNullOrEmpty(code2Str))
{
BindingCode(code1Str, code2Str);
code1Str = string.Empty;
code2Str = string.Empty;
}
}
catch (Exception ex)
{
code1Str = string.Empty;
code2Str = string.Empty;
Console.WriteLine(ex.ToString());
}
Thread.Sleep(500);
}
});
//Task.Run(() =>
//{
// while (true)
// {
// try
// {
// if (!string.IsNullOrEmpty(code1Str) && !string.IsNullOrEmpty(code2Str))
// {
// BindingCode(code1Str, code2Str);
// code1Str = string.Empty;
// code2Str = string.Empty;
// }
// }
// catch (Exception ex)
// {
// code1Str = string.Empty;
// code2Str = string.Empty;
// Console.WriteLine(ex.ToString());
// }
// Thread.Sleep(500);
// }
//});
// 心跳线程
Task.Run(() =>
@ -234,6 +239,7 @@ namespace Aucma.Core.CodeBinding.ViewModels
ProductCode = record.ProductCode,
BoxName = record.BoxName,
BindingResult = record.BindingResult,
IsPass = record.IsPass==1?"自动":"手动",
RecordTime = record.RecordTime2.ToString()
});
@ -461,17 +467,21 @@ namespace Aucma.Core.CodeBinding.ViewModels
if (scannerIp == MesScannerIp)
{
// log.Info("MES条码NoRead:");
Clear();
SendPlcStop();
RefreshAndWriteLog("MES条码未扫描到,NoRead报警,线体停止,请重新扫描!");
Clear();
RefreshAndWriteLog("MES条码未扫描到,NoRead报警,线体停止,请重新扫描!",true);
}
else if (SnScannerIp == scannerIp)
{
Clear();
{
SendPlcStop();
RefreshAndWriteLog("SN条码未扫描到,NoRead报警,线体停止,请重新扫描!");
Clear();
RefreshAndWriteLog("SN条码未扫描到,NoRead报警,线体停止,请重新扫描!", true);
}
speechStr.SpeakAsync("扫码失败,请补扫");
}
/// <summary>
@ -504,11 +514,18 @@ namespace Aucma.Core.CodeBinding.ViewModels
// 全局变量赋值SN码扫描后使用
code1Str = codeStr;
RefreshCode1(codeStr);
if (!string.IsNullOrEmpty(code1Str) && !string.IsNullOrEmpty(code2Str))
{
BindingCode(code1Str, code2Str);
code1Str = string.Empty;
code2Str = string.Empty;
}
}
else if (SnScannerIp == scannerIp)
{
Clear();
// Clear();
log.Info("扫描到成品条码:" + codeStr);
// 1.刷新界面条码信息
@ -516,6 +533,13 @@ namespace Aucma.Core.CodeBinding.ViewModels
code2Str = codeStr;
RefreshCode2(codeStr);
if (!string.IsNullOrEmpty(code1Str) && !string.IsNullOrEmpty(code2Str))
{
BindingCode(code1Str, code2Str);
code1Str = string.Empty;
code2Str = string.Empty;
}
}
#region
@ -560,36 +584,69 @@ namespace Aucma.Core.CodeBinding.ViewModels
/// 提示信息刷新并且存日志
/// </summary>
/// <param name="logStr"></param>
private void RefreshAndWriteLog(string logStr)
private void RefreshAndWriteLog(string logStr,bool warnflag=false)
{
TimeSpan currentTime = DateTime.Now.TimeOfDay;
// DateTime time = System.DateTime.Now;
string timeString = currentTime.ToString(@"hh\:mm\:ss");
BindingInfo = timeString + ":" + logStr;
if(warnflag)
{
MsgUIColor = "Red";
}
else
{
MsgUIColor = "White";
}
log.Info(BindingInfo);
}
/// <summary>
/// 提示信息-颜色
/// </summary>
public string msgUIColor;
public string MsgUIColor
{
get => msgUIColor;
set => SetProperty(ref msgUIColor, value);
}
/// <summary>
/// 条码绑定
/// </summary>
/// <param name="code1">MES码</param>
/// <param name="code2">SN码</param>
public void BindingCode(string code1, string code2)
/// <param name="flag">1为自动扫描2为手动扫描</param>
public void BindingCode(string code1, string code2,int flag =1)
{
try
{
if (code1.Substring(0, 1) != "B")
{
speechStr.SpeakAsync("扫码失败,请补扫");
RefreshAndWriteLog("MES码:" + code1 + ",扫描错误,请重新扫描!");
SendPlcStop();
return;
}
if (code2.Length != 20)
{
speechStr.SpeakAsync("扫码失败,请补扫");
RefreshAndWriteLog("SN码:" + code2 + ",扫描错误,请重新扫描!");
SendPlcStop();
return;
}
#region 终检校验-未查到终检合格记录即为质检不合格
ReportQualityInsPection qualityList = _reportQualityInspectionServices.JudgeIsQualified(code1);
if (qualityList == null)
{
SendPlcStop();
RefreshAndWriteLog($"终检失败!! 箱体码{code1}未查询到终检合格记录,请重新终检!",true);
speechStr.SpeakAsync("终检失败,请终检");
AddExceptionRecord(code1, $"终检失败!! 箱体码{code1}未查询到终检合格记录,请重新终检!", 4);
return;
}
#endregion
RefreshAndWriteLog("开始绑定MES条码:" + code1 + " SN条码:" + code2);
// 1.数据库查询各个工序质检结果,不合格报警
@ -621,7 +678,7 @@ namespace Aucma.Core.CodeBinding.ViewModels
record.ProductCode = code2;
//record.RecordTime1 = System.DateTime.Now;
record.RecordTime2 = System.DateTime.Now;
record.isPlcPass = 1;
record.IsPass = flag;
record.BindingResult = "成功";
bool result = false;
if (Repeatflag == 0)
@ -659,7 +716,7 @@ namespace Aucma.Core.CodeBinding.ViewModels
}
else
{
RefreshAndWriteLog("条码【" + record.BoxCode + "】与SN码【" + record.ProductCode + "】绑定失败");
RefreshAndWriteLog("条码【" + record.BoxCode + "】与SN码【" + record.ProductCode + "】绑定失败", true);
if (SendPlcStop())
{
RefreshAndWriteLog("条码绑定失败,线体停止");
@ -679,6 +736,31 @@ namespace Aucma.Core.CodeBinding.ViewModels
}
}
/// <summary>
/// 往mes数据库添加异常记录
/// </summary>
/// <param name="SNCode"></param>
/// <param name="Msg"></param>
/// <param name="Type">1=69码校验;2=重复扫描;3=未绑条码;4=未终检</param>
public async void AddExceptionRecord(string BoxCode, string Msg, int Type)
{
try
{
ExceptionRecord record = new ExceptionRecord();
record.ProductSnCode = BoxCode;
record.ProductScanTime = DateTime.Now;
record.ProductLineCode = ProductLineCode;
record.ExceptionMsg = Msg;
record.ExceptionType = Type;
record.Position = "条码绑定";
await exceptionRecordServices.AddAsync(record);
}
catch (Exception ex)
{
log.Info("添加异常记录方法AddExceptionRecord异常:" + ex.Message.ToString());
}
}
#region plc交互
/// <summary>
@ -694,18 +776,22 @@ namespace Aucma.Core.CodeBinding.ViewModels
var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("条码绑定Plc"));
if (obj != null)
{
log.Info("停止信号D7102写1");
log.Info($"NoRead信号,下发停止信号成功,当前箱体码{code1Str},当前成品码{code2Str}");
// 往plc写入停止信号
obj.plc.WriteInt16("D7102", "1");
// 报警信号
obj.plc.WriteInt16("D7101", "1");
result = true;
}
else
{
log.Info($"NoRead信号,下发停止信号失败plc未连接当前箱体码{code1Str},当前成品码{code2Str}");
}
}
catch (Exception ex)
{
log.Error("下发plc停止信号方法出现异常,ex:" + ex);
log.Info($"NoRead信号,下发停止信号异常plc未连接当前箱体码{code1Str},当前成品码{code2Str}");
}
return result;
}

@ -60,15 +60,32 @@ namespace Aucma.Core.CodeBinding.ViewModels
timer.Tick += Timer_Tick;
timer.Start();
Scanner1State(false);
Scanner2State(false);
Scanner2State(false);
PlcState(false);
// Job_AllState_Quartz.RefreshStateEvent += RefreshStatus;
// MvCodeHelper.RefreshStateEvent += RefreshScanner;
TouchSocketService.RefreshStateEvent += RefreshScanner;
GunBusiness.InstanceSerialPort3();
updatePlcState();
// InitHikRobot();
}
private void updatePlcState()
{
Task.Run(() =>
{
Thread.Sleep(4000);
var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("条码绑定Plc"));
if (obj.plc.IsConnected)
{
PlcState(true);
}
else
{
PlcState(false);
}
});
}
#region 开启海康扫码器
public void InitHikRobot()

@ -41,7 +41,7 @@ namespace Aucma.Core.CodeBinding.ViewModels
{
Application.Current.Dispatcher.Invoke(() =>
{
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() });
ListItems.Add(new ReaderInfo() { No = ListItems.Count + 1, BoxCode = record.BoxCode, ProductCode = record.ProductCode, BoxName = record.BoxName, BindingResult = record.BindingResult, IsPass = record.IsPass == 1 ? "自动" : "手动", RecordTime = record.RecordTime2.ToString() });
});
}
@ -114,7 +114,7 @@ namespace Aucma.Core.CodeBinding.ViewModels
foreach (CodeBindingRecord record in list)
{
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() });
ListItems.Add(new ReaderInfo() { No = ListItems.Count + 1, BoxCode = record.BoxCode, ProductCode = record.ProductCode, BoxName = record.BoxName, BindingResult = record.BindingResult, IsPass = record.IsPass == 1 ? "自动" : "手动", RecordTime = record.RecordTime2.ToString() });
}
}));

@ -141,10 +141,12 @@
<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center" Margin="100 0 0 0 ">
<Label Content="提示信息 " FontSize="20" Foreground="#FFFFFF"/>
<TextBox TextWrapping="Wrap" IsReadOnly="True" Text="{Binding BindingInfo}" Width="600" Height="200" FontSize="18" Foreground="#FFFFFF"/>
<TextBox TextWrapping="Wrap" IsReadOnly="True" Text="{Binding BindingInfo}" Width="600" Height="200" FontSize="18" Foreground="{Binding MsgUIColor}"/>
</StackPanel>
</Grid>
<Button Cursor="Hand" Content="空板启动" Background="#FF9900" BorderBrush="#FF9900" Click="Button_Click" Width="100" HorizontalAlignment="Left" VerticalAlignment="Bottom" Grid.Row="2" />
</Grid>
<Grid Grid.Column="1">
@ -214,7 +216,8 @@
<DataGridTextColumn Binding="{Binding ProductCode}" Header="成品条码" Width="4*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}"/>
<DataGridTextColumn Binding="{Binding BoxName}" Header="产品型号" Width="4*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}"/>
<DataGridTextColumn Binding="{Binding BindingResult}" Header="绑定结果" Width="2*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}"/>
<DataGridTextColumn Binding="{Binding IsPass}" Header="绑定方式" Width="2*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}"/>
<DataGridTextColumn Binding="{Binding RecordTime,StringFormat=\{0:yyyy-MM-dd HH:mm\}}" Header="记录时间" Width="4*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}"/>
</DataGrid.Columns>
</DataGrid>

@ -16,6 +16,7 @@ using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Aucma.Core.HwPLc;
using RabbitMQ.Client;
namespace Aucma.Core.CodeBinding.Views
{
@ -35,52 +36,56 @@ namespace Aucma.Core.CodeBinding.Views
}
private void Button_Click(object sender, RoutedEventArgs e)
public void Button_Click(object sender, RoutedEventArgs e)
{
if (SendPlcPass())
MessageBoxResult result = MessageBox.Show("请先确认当前无未绑定箱体,如导致未绑定箱体将无法下线!!\n\n系统将会记录您当前行为,请谨慎使用该功能!!\n\n是否继续启动?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (result == MessageBoxResult.Yes)
{
MessageBox.Show("放行成功");
}
else
{
MessageBox.Show("放行失败plc未连接");
}
}
/// <summary>
/// 下发plc放行信号
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
private bool SendPlcPass()
{
bool result = false;
try
{
var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("条码绑定Plc"));
if (obj != null)
if (SendPlcPass())
{
//log.Info("停止信号D7102写1");
// 停止信号复位
obj.plc.WriteInt16("D7102", "0");
// 报警信号复位
obj.plc.WriteInt16("D7101", "0");
result = true;
MessageBox.Show("放行成功");
}
else
{
result = false;
MessageBox.Show("放行失败plc未连接");
}
} }
}
catch (Exception ex)
/// <summary>
/// 下发plc放行信号
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public bool SendPlcPass()
{
result = false;
// log.Error("下发plc停止信号方法出现异常,ex:" + ex);
}
return result;
}
bool result = false;
try
{
var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("条码绑定Plc"));
if (obj != null)
{
//log.Info("停止信号D7102写1");
// 停止信号复位
obj.plc.WriteInt16("D7102", "0");
// 报警信号复位
obj.plc.WriteInt16("D7101", "0");
result = true;
}
else
{
result = false;
}
}
catch (Exception ex)
{
result = false;
// log.Error("下发plc停止信号方法出现异常,ex:" + ex);
}
return result;
}
}

@ -213,8 +213,10 @@
}
],
"StationInfo": {
"StationCode": "1010"
"StationCode": "1010",
"ProductLineCode": "CX_02"
},
"PLCServer": [
{
"Id": 1,

@ -85,7 +85,7 @@ namespace Aucma.Core.HwPLc
melsecMcNet.Port = port;
// 如果网络不太理想,配置了两个端口,一个有问题,立即切换另一个的话,可以配置如下的代码
// melsecMcNet.GetPipeSocket().SetMultiPorts(new int[] { 5552, 5553, 5554, 5555});
// melsecMcNet.GetPipeSocket().SetMultiPorts(new int[] { 2014, 2015});
try
{
// 先关闭再重连,防止多次重连

@ -26,7 +26,7 @@ namespace Aucma.Core.Palletiz.Business
{
internal class InStoreBusiness
{
private static readonly log4net.ILog _logger = LogManager.GetLogger(typeof(InStoreBusiness));
private static readonly log4net.ILog log = LogManager.GetLogger(typeof(InStoreBusiness));
private readonly IProductOffLineServices _offlineService;
@ -118,7 +118,7 @@ namespace Aucma.Core.Palletiz.Business
}
catch (Exception e)
{
_logger.Error($"Buffer缓冲异常:{e.Message}");
log.Error($"Buffer缓冲异常:{e.Message}");
}
}
@ -154,9 +154,14 @@ namespace Aucma.Core.Palletiz.Business
RefreshProductInfoEvent?.Invoke(asciiStr,prodInfo.ProductModel,prodInfo.ProductOrderNo);
GetSpaceInfoByMaterialType(spaceArea, prodInfo, out BaseSpaceInfo laseSpaceinfo,
bool getSpaceResult = GetSpaceInfoByMaterialType(spaceArea, prodInfo, out BaseSpaceInfo laseSpaceinfo,
out BaseSpaceInfo spaceinfo);
if(!getSpaceResult)
{
msg = $"未找到货道,请检查该型号是否有货道";
RefreshMsgEvent?.Invoke(msg);
return;
}
bool result = false;
@ -186,8 +191,7 @@ namespace Aucma.Core.Palletiz.Business
recordInstore.EntryPattern = 0;
}
_ = _recordInstoreServices.AddAsync(recordInstore).Result;
#endregion
if (!result)
@ -214,7 +218,8 @@ namespace Aucma.Core.Palletiz.Business
//刷新页面
AddDataEvent?.Invoke(recordInstore);
}
_ = _recordInstoreServices.AddAsync(recordInstore).Result;
}
@ -266,8 +271,9 @@ namespace Aucma.Core.Palletiz.Business
/// <param name="spaceinfo"></param>
/// <param name="isBig"></param>
/// <exception cref="ArgumentException"></exception>
private void GetSpaceInfoByMaterialType(string spaceArea, ProductOffline prodInfo, out BaseSpaceInfo laseSpaceinfo, out BaseSpaceInfo spaceinfo, bool isBig = false)
private bool GetSpaceInfoByMaterialType(string spaceArea, ProductOffline prodInfo, out BaseSpaceInfo laseSpaceinfo, out BaseSpaceInfo spaceinfo, bool isBig = false)
{
bool result = false;
List<BaseSpaceInfo> spaceinfos = null;
if (isBig)
{
@ -280,26 +286,36 @@ namespace Aucma.Core.Palletiz.Business
}
if (spaceinfos == null)
if (spaceinfos == null || spaceinfos.Count==0)
{
throw new ArgumentException($"通过物料型号获取货道信息异常:根据成品信息获取货道信息为空");
log.Info($"通过物料型号获取货道信息异常:根据成品信息获取货道信息为空");
laseSpaceinfo = null;
spaceinfo = null;
return false;
}
spaceinfos = spaceinfos.OrderBy(x => x.ObjId).ToList();
MatchSpaceInfoByPlc(ref spaceinfos);
if (spaceinfos == null)
if (spaceinfos == null || spaceinfos.Count==0)
{
throw new ArgumentException($"通过物料型号获取货道信息异常:通过PLC匹配可用货道信息为空");
log.Info($"通过物料型号获取货道信息异常:根据成品信息获取货道信息为空");
laseSpaceinfo = null;
spaceinfo = null;
return false;
}
FiltrateSpaceInfo(spaceinfos, out laseSpaceinfo, out spaceinfo);
if (spaceinfo == null)
if (spaceinfo == null || spaceinfos.Count==0)
{
throw new ArgumentException($"通过物料型号获取货道信息异常:未获取到匹配的货道信息");
log.Info($"通过物料型号获取货道信息异常:根据成品信息获取货道信息为空");
laseSpaceinfo = null;
spaceinfo = null;
return false;
}
return true;
}
@ -346,7 +362,7 @@ namespace Aucma.Core.Palletiz.Business
/// <exception cref="ArgumentException"></exception>
private void FiltrateSpaceInfo(List<BaseSpaceInfo> spaceinfos, out BaseSpaceInfo laseSpaceinfo, out BaseSpaceInfo spaceinfo)
{
if (spaceinfos == null)
if (spaceinfos == null || spaceinfos.Count == 0)
{
throw new ArgumentException($"筛选货道信息异常:传入货道信息参数为空");
}
@ -512,7 +528,7 @@ namespace Aucma.Core.Palletiz.Business
/// <param name="client"></param>
private void NoReadHandle(string client)
{
_logger.Error($"客户端:{client};读取失败!!!!!!");
log.Error($"客户端:{client};读取失败!!!!!!");
}
/// <summary>

@ -197,7 +197,7 @@
"PlcType": "Melsec",
"Enabled": true,
"IP": "10.10.92.80", //10.10.92.80
"Port": 2015
"Port": 2014
}
],
"StoreInfo": {

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>

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

@ -5,7 +5,7 @@ using System.Speech.Synthesis;
using System.Text;
using System.Threading.Tasks;
namespace Aucma.Core.CodeBinding.Common
namespace Aucma.Core.ProductOffLine.Common
{
public class SpeechStr
{
@ -18,7 +18,7 @@ namespace Aucma.Core.CodeBinding.Common
}
}
public void speech(string str) {
public void SpeakAsync(string str) {
SpeechSynthesizer speech = new SpeechSynthesizer();
speech.Rate = 3;//设置语速

@ -68,7 +68,7 @@ namespace Aucma.Core.ProductOffLine
services.AddScannerSetup();
//socket连接扫码器
// services.AddTouchSocketSetup();
services.AddTouchSocketSetup();
//任务调度
@ -97,7 +97,7 @@ namespace Aucma.Core.ProductOffLine
/// </summary>
/// <param name="app"></param>
/// <param name="env"></param>
public void Configure(IApplicationBuilder app, IScannerService scannerService, IRunPlcService runPlcService)//, ISysTasksQzService tasksQzService, ISchedulerCenter schedulerCenter,ITouchSocketService socket
public void Configure(IApplicationBuilder app, IScannerService scannerService, IRunPlcService runPlcService, ITouchSocketService socket)//, ISysTasksQzService tasksQzService, ISchedulerCenter schedulerCenter,ITouchSocketService socket
{
// 使用静态文件
app.UseStaticFiles();
@ -112,7 +112,7 @@ namespace Aucma.Core.ProductOffLine
app.UsePlcMildd(runPlcService);
// Socket连接扫码器
// app.UseTouchSocketMildd(socket);
app.UseTouchSocketMildd(socket);
}

@ -54,11 +54,12 @@ namespace Aucma.Core.ProductOffLine.ViewModels
// 成品下线操作mes数据
private readonly IOffLineInfoServices? _offLineInfoServices = App.ServiceProvider.GetService<IOffLineInfoServices>();
// System.Timers.Timer timer = new System.Timers.Timer(500);//界面刷新定时器
private readonly IBaseBomInfoServices? _baseBomInfoServices;
private OffLineBusiness offLineBusiness = OffLineBusiness.Instance;
private static double aaa = 100.0;
int a = 0;
public List<WorkTime> listTime;
public IndexPageViewModel()
{
OffLineBusiness.RefreshScanMateriaCodeEvent += ModelToPage;
@ -66,11 +67,11 @@ namespace Aucma.Core.ProductOffLine.ViewModels
MainWindowViewModel.RefreshFirstPageChartsEvent += RefreshCharts;
_offLineInfoServices = App.ServiceProvider.GetService<IOffLineInfoServices>();
_baseBomInfoServices = App.ServiceProvider.GetService<IBaseBomInfoServices>();
RefreshCharts();
listTime = _baseBomInfoServices.getWorkTime().Result;
}
/// <summary>
@ -319,97 +320,112 @@ namespace Aucma.Core.ProductOffLine.ViewModels
private async void InitEveryDayMethod(List<OffLineInfo> list)
{
Application.Current.Dispatcher.Invoke(() =>
try
{
ProductionHourList.Clear();
Achievement.Clear();
#region 小时产量统计
List<WorkTime> listTime = _baseBomInfoServices.getWorkTime().Result;
if (listTime == null) return;
// List<string> xList = new List<string>();
foreach (WorkTime workTime in listTime)
{
// xList.Add(workTime.startTime.Hour.ToString());
ProductionHourList.Add(workTime.startTime.Hour.ToString());
}
// ProductionHourList = xList;
// y轴
if (list == null || list.Count <= 0) return;
var result = list.GroupBy(x => x.ProductScanTime.Hour) // 按照小时进行分组
.Select(g => new
{
Hour = g.Key.ToString(), // 小时
Count = g.Count() // 统计每个小时的个数
}).ToList();
if (list == null) return;
// 当日下线记录
List<OffLineInfo> offList = _offLineInfoServices.QueryAsync(x => x.ProductScanTime >= listTime[0].startTime && x.ProductScanTime <= listTime[11].startTime).Result;
ChartValues<ObservablePoint> achievement2 = new ChartValues<ObservablePoint>();
int i = 0;
foreach (string item in ProductionHourList)
Application.Current.Dispatcher.Invoke(() =>
{
var target = result.Where(x => x.Hour == item).FirstOrDefault();
if (target != null)
ProductionHourList.Clear();
Achievement.Clear();
#region 小时产量统计
if (listTime == null)
{
achievement2.Add(new ObservablePoint(i, target.Count));
listTime = _baseBomInfoServices.getWorkTime().Result;
if (listTime == null) return;
}
else
// List<string> xList = new List<string>();
foreach (WorkTime workTime in listTime)
{
achievement2.Add(new ObservablePoint(i, 0));
// xList.Add(workTime.startTime.Hour.ToString());
ProductionHourList.Add(workTime.startTime.Hour.ToString());
}
i++;
}
var column2 = new ColumnSeries();
column2.DataLabels = true;
column2.Title = "产量";
column2.Values = achievement2;
column2.Foreground = Brushes.White;
Achievement.Add(column2);
#endregion
#region 型号统计
List<string> nameList = new List<string>();
ChartValues<int> achievement = new ChartValues<int>();
var column = new ColumnSeries();
List<OffLineInfo> offList = _offLineInfoServices.QueryAsync(x => x.ProductScanTime >= listTime[0].startTime && x.ProductScanTime <= listTime[11].startTime).Result;
var modelList = offList.GroupBy(x => x.ProductModel);
foreach (var item in modelList)
{
achievement.Add(item.Count());
nameList.Add(item.Key);
}
column.DataLabels = true;
column.Title = "型号";
column.Values = achievement;
column.Foreground = Brushes.White;
// ProductionHourList = xList;
// y轴
if (list == null || list.Count <= 0) return;
var result = list.GroupBy(x => x.ProductScanTime.Hour) // 按照小时进行分组
.Select(g => new
{
Hour = g.Key.ToString(), // 小时
Count = g.Count() // 统计每个小时的个数
}).ToList();
// x轴
MaterialNameList = null;
MaterialNameList = nameList;
// y轴
//if (ModelStatistics.Count > 0)
//{
// for (int j = 0; j < modelList.Count(); j++)
// {
// Achievement.FirstOrDefault().Values[j] = modelList.ElementAt(j).Count();
// }
ChartValues<ObservablePoint> achievement2 = new ChartValues<ObservablePoint>();
int i = 0;
foreach (string item in ProductionHourList)
{
var target = result.Where(x => x.Hour == item).FirstOrDefault();
if (target != null)
{
achievement2.Add(new ObservablePoint(i, target.Count));
}
else
{
achievement2.Add(new ObservablePoint(i, 0));
}
i++;
}
//}
//else
//{
ModelStatistics.Clear();
ModelStatistics.Add(column);
// }
var column2 = new ColumnSeries();
column2.DataLabels = true;
column2.Title = "产量";
column2.Values = achievement2;
column2.Foreground = Brushes.White;
Achievement.Add(column2);
#endregion
#region 型号统计
// List<string> nameList = new List<string>();
ChartValues<int> achievement = new ChartValues<int>();
var column = new ColumnSeries();
MaterialNameList.Clear();
// List<OffLineInfo> offList = _offLineInfoServices.QueryAsync(x => x.ProductScanTime >= listTime[0].startTime && x.ProductScanTime <= listTime[11].startTime).Result;
var modelList = offList.GroupBy(x => x.ProductModel);
foreach (var item in modelList)
{
achievement.Add(item.Count());
// nameList.Add(item.Key);
MaterialNameList.Add(item.Key);
}
column.DataLabels = true;
column.Title = "型号";
column.Values = achievement;
column.Foreground = Brushes.White;
// x轴
// MaterialNameList = null;
// MaterialNameList = nameList;
// y轴
//if (ModelStatistics.Count > 0)
//{
// for (int j = 0; j < modelList.Count(); j++)
// {
// Achievement.FirstOrDefault().Values[j] = modelList.ElementAt(j).Count();
// }
//}
//else
//{
ModelStatistics.Clear();
ModelStatistics.Add(column);
// }
#endregion
#endregion
});
});
}
catch (Exception ex)
{
log.Info($"刷新图表方法InitEveryDayMethod异常:{ex.Message}");
}
}
private async void InitEveryDayMethod11(List<OffLineInfo> list)
@ -552,9 +568,13 @@ namespace Aucma.Core.ProductOffLine.ViewModels
{
try
{
List<WorkTime> listTime = _baseBomInfoServices.getWorkTime().Result;
if (listTime == null) return null;
// List<WorkTime> listTime = _baseBomInfoServices.getWorkTime().Result;
if (listTime == null)
{
listTime = _baseBomInfoServices.getWorkTime().Result;
if (listTime == null) return null;
}
List<OffLineInfo> list = _offLineInfoServices.Query(x => x.ProductScanTime >= listTime[0].startTime && x.ProductScanTime <= listTime[11].endTime && x.ProductLineCode == "CX_02");
OffLineQty = list.Count.ToString();
if (list == null || list.Count <= 0) return null;

@ -15,6 +15,9 @@ using Admin.Core.Tasks;
using Aucma.Core.ProductOffLine.Business;
using Aucma.Core.HwPLc;
using Aucma.Core.ProductOffLine.Config;
using Admin.Core.Socket;
using Aucma.Core.Scanner;
using System.Collections.Generic;
namespace Aucma.Core.ProductOffLine.ViewModels
{
@ -35,6 +38,13 @@ namespace Aucma.Core.ProductOffLine.ViewModels
#endregion
private AppConfig appConfig = AppConfig.Instance;
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 static readonly log4net.ILog log = LogManager.GetLogger(typeof(MainWindowViewModel));
private IndexPageView firstPage = new IndexPageView();//首页
@ -49,8 +59,8 @@ namespace Aucma.Core.ProductOffLine.ViewModels
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += Timer_Tick;
timer.Start();
MvCodeHelper.RefreshStateEvent += RefreshScanner;
// MvCodeHelper.RefreshStateEvent += RefreshScanner;
TouchSocketService.RefreshStateEvent += RefreshScanner;
MesDbState(true);
PlcState(false);
//PlcState(true);
@ -62,18 +72,18 @@ namespace Aucma.Core.ProductOffLine.ViewModels
}
#region 开启海康扫码器和扫码枪
#region 开启海康扫码器和扫码枪--扫码器改用TCP通信
public void InitHikRobotAndGun()
{
try
{
Task.Run(() =>
{
Thread.Sleep(2000);
//Task.Run(() =>
//{
// Thread.Sleep(2000);
Business.MvCodeHelper.Shell();
});
// Business.MvCodeHelper.Shell();
//});
Task.Run(() =>
{
@ -92,7 +102,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels
PlcState(false);
}
Business.MvCodeHelper.Liner();
// Business.MvCodeHelper.Liner();
});
@ -108,11 +118,11 @@ namespace Aucma.Core.ProductOffLine.ViewModels
public void RefreshScanner(string ip,bool flag)
{
if (ip == "外侧")
if (ip == ShellScannerIp)
{
Scanner1State(flag); ;
Scanner1State(flag); ;
}
else if(ip == "内侧")
else if(ip == LinerScannerIp)
{
Scanner2State(flag);
}

@ -1,6 +1,7 @@
using Admin.Core.IService;
using Admin.Core.Model;
using Admin.Core.Service;
using Aucma.Core.ProductOffLine.Config;
using Aucma.Core.ProductOffLine.Models;
using Aucma.Core.ProductOffLine.Views;
using CommunityToolkit.Mvvm.ComponentModel;
@ -32,6 +33,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels
public RelayCommand<object> MouseClickCommand { get; set; }
private readonly IExceptionRecordServices? exceptionRecordServices;
private AppConfig appConfig = AppConfig.Instance;
public SelectQualityViewModel()
{
@ -57,7 +59,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels
{
try
{
List<ExceptionRecord> list = await exceptionRecordServices.QueryAsync(x=>x.ProductScanTime>=DateTime.Today);
List<ExceptionRecord> list = await exceptionRecordServices.QueryAsync(x=> x.ProductLineCode==appConfig.ProductlineCode && x.Position=="成品下线" && x.ProductScanTime>=DateTime.Today);
if (list == null || list.Count == 0) {
App.Current.Dispatcher.Invoke(() =>
{

@ -52,6 +52,25 @@ namespace Aucma.Core.ProductOffLine.ViewModels
List<OffLineInfo> list = _offLineInfoServices.QueryAsync(x => x.ProductScanTime >= DateTime.Now.AddDays(-2)).Result;
if (list == null || list.Count <= 0) return;
list = list.OrderByDescending(x => x.ProductScanTime).ToList();
// 按型号统计
var countByProductModel = list.GroupBy(x => x.ProductModel).Select(group => new
{
ProductCode = group.First().ProductCode,
ProductRemark = group.First().ProductRemark,
ProductModel = group.Key,
Count = group.Count()
}).ToList();
// 按订单统计
var countOrderModel = list.GroupBy(x => x.ProductOrderNo).Select(group => new
{
ProductOrderNo = group.Key,
ProductCode = group.First().ProductCode,
ProductRemark = group.First().ProductRemark,
ProductModel = group.First().ProductModel,
Count = group.Count()
}).ToList();
Application.Current.Dispatcher.Invoke(() =>
{
@ -62,29 +81,14 @@ namespace Aucma.Core.ProductOffLine.ViewModels
ListItems.Add(new TempInfo() { No = ListItems.Count + 1, ProductOrderNo = record.ProductOrderNo, ProductSNCode = record.ProductSNCode, ProductModel = record.ProductModel, ProductRemark = record.ProductRemark, ProductScanTime = record.ProductScanTime });
}
// 按型号统计
var countByProductModel = list.GroupBy(x => x.ProductModel).Select(group => new
{
ProductCode = group.First().ProductCode,
ProductRemark = group.First().ProductRemark,
ProductModel = group.Key,
Count = group.Count()
}).ToList();
foreach (var item in countByProductModel)
{
TotalItem.Add(new TempInfo() { No = TotalItem.Count + 1, ProductCode = item.ProductCode, ProductModel = item.ProductModel, ProductRemark = item.ProductRemark, Count = item.Count });
}
// 按订单统计
var countOrderModel = list.GroupBy(x => x.ProductOrderNo).Select(group => new
{
ProductOrderNo = group.Key,
ProductCode = group.First().ProductCode,
ProductRemark = group.First().ProductRemark,
ProductModel = group.First().ProductModel,
Count = group.Count()
}).ToList();
foreach (var item in countOrderModel)
{
OrderListItem.Add(new TempInfo() { No = OrderListItem.Count + 1, ProductOrderNo =item.ProductOrderNo, ProductCode = item.ProductCode, ProductModel = item.ProductModel, ProductRemark = item.ProductRemark, Count = item.Count });
@ -197,7 +201,24 @@ namespace Aucma.Core.ProductOffLine.ViewModels
{
list = list.OrderByDescending(x => x.ProductScanTime).ToList();
var countByProductModel = list.GroupBy(x => x.ProductModel).Select(group => new
{
ProductCode = group.First().ProductCode,
ProductRemark = group.First().ProductRemark,
ProductModel = group.Key,
Count = group.Count()
}).ToList();
// 按订单统计
var countOrderModel = list.GroupBy(x => x.ProductOrderNo).Select(group => new
{
ProductOrderNo = group.Key,
ProductCode = group.First().ProductCode,
ProductRemark = group.First().ProductRemark,
ProductModel = group.First().ProductModel,
Count = group.Count()
}).ToList();
Application.Current.Dispatcher.Invoke(() =>
{
ListItems.Clear();
@ -209,33 +230,18 @@ namespace Aucma.Core.ProductOffLine.ViewModels
ListItems.Add(new TempInfo() { No = ListItems.Count + 1, ProductOrderNo = record.ProductOrderNo, ProductSNCode = record.ProductSNCode, ProductModel = record.ProductModel, ProductRemark = record.ProductRemark, ProductScanTime = record.ProductScanTime });
}
var countByProductModel = list.GroupBy(x => x.ProductModel).Select(group => new
{
ProductCode = group.First().ProductCode,
ProductRemark = group.First().ProductRemark,
ProductModel = group.Key,
Count = group.Count()
}).ToList();
foreach (var item in countByProductModel)
{
TotalItem.Add(new TempInfo() { No = TotalItem.Count + 1, ProductCode = item.ProductCode, ProductModel = item.ProductModel, ProductRemark = item.ProductRemark, Count = item.Count });
}
// 按订单统计
var countOrderModel = list.GroupBy(x => x.ProductOrderNo).Select(group => new
{
ProductOrderNo = group.Key,
ProductCode = group.First().ProductCode,
ProductRemark = group.First().ProductRemark,
ProductModel = group.First().ProductModel,
Count = group.Count()
}).ToList();
foreach (var item in countOrderModel)
{
OrderListItem.Add(new TempInfo() { No = OrderListItem.Count + 1, ProductOrderNo = item.ProductOrderNo, ProductCode = item.ProductCode, ProductModel = item.ProductModel, ProductRemark = item.ProductRemark, Count = item.Count });
}
});
}
}

@ -256,7 +256,7 @@
<lvc:CartesianChart.AxisY>
<lvc:Axis FontSize="15" MinValue="0" >
<lvc:Axis.Separator>
<lvc:Separator Step="10" Visibility="Hidden" StrokeThickness="1" StrokeDashArray="3" Stroke="#404F56" >
<lvc:Separator Step="50" Visibility="Hidden" StrokeThickness="1" StrokeDashArray="3" Stroke="#404F56" >
</lvc:Separator>
</lvc:Axis.Separator>
</lvc:Axis>
@ -288,7 +288,7 @@
<lvc:CartesianChart.AxisY>
<lvc:Axis FontSize="15" MinValue="0">
<lvc:Axis.Separator>
<lvc:Separator Step="50" Visibility="Hidden" StrokeThickness="1" StrokeDashArray="3" Stroke="#404F56" >
<lvc:Separator Step="400" Visibility="Hidden" StrokeThickness="1" StrokeDashArray="3" Stroke="#404F56" >
</lvc:Separator>
</lvc:Axis.Separator>
</lvc:Axis>

@ -203,6 +203,10 @@
},
"ScannerGun": { //
"Enabled": false
},
"TouchSocket": {
"Enabled": true,
"Address": "10.10.92.232:5000"
}
},
"ScannerServer": [

Loading…
Cancel
Save