diff --git a/src/Khd.Core.Domain/Models/DmsBaseAlarmRule.cs b/src/Khd.Core.Domain/Models/DmsBaseAlarmRule.cs new file mode 100644 index 0000000..7a673af --- /dev/null +++ b/src/Khd.Core.Domain/Models/DmsBaseAlarmRule.cs @@ -0,0 +1,39 @@ +using System.ComponentModel.DataAnnotations.Schema; + +namespace Khd.Core.Domain.Models +{ + [Table("dms_base_alarm_rule")] + public class DmsBaseAlarmRule + { + [Column("alarm_rule_id")] + public long AlarmRuleId { get; set; } + + [Column("device_id")] + public long DeviceId { get; set; } + + [Column("alarm_type")] + public string AlarmType { get; set; } + + [Column("alarm_level")] + public string AlarmLevel { get; set; } + + [Column("notice_type")] + public string NoticeType { get; set; } + + [Column("recover_type")] + public string RecoverType { get; set; } + + [Column("continue_time")] + public long ContinueTime { get; set; } + + [Column("alarm_reason")] + public string AlarmReason { get; set; } + + [Column("handle_suggest")] + public string HandleSuggest { get; set; } + + [Column("remark")] + public string Remark { get; set; } + public string Status { get; set; } + } +} diff --git a/src/Khd.Core.Domain/Models/DmsBaseDeviceLedger.cs b/src/Khd.Core.Domain/Models/DmsBaseDeviceLedger.cs new file mode 100644 index 0000000..9b47bee --- /dev/null +++ b/src/Khd.Core.Domain/Models/DmsBaseDeviceLedger.cs @@ -0,0 +1,44 @@ +using System.ComponentModel.DataAnnotations.Schema; + +namespace Khd.Core.Domain.Models +{ + [Table("dms_base_device_ledger")] + public class DmsBaseDeviceLedger + { + [Column("device_id")] + public long DeviceId { get; set; } + + [Column("device_code")] + public string DeviceCode { get; set; } + + [Column("device_name")] + public string DeviceName { get; set; } + + [Column("station_id")] + public string StationId { get; set; } + + [Column("asset_number")] + public string AssetNumber { get; set; } + + [Column("device_location")] + public string DeviceLocation { get; set; } + + [Column("device_type_id")] + public string DeviceTypeId { get; set; } + + [Column("device_spec")] + public string DeviceSpec { get; set; } + + [Column("supplier_id")] + public string SupplierId { get; set; } + + [Column("device_status")] + public string DeviceStatus { get; set; } + + [Column("is_flag")] + public int IsFlag { get; set; } + + [Column("remark")] + public string Remark { get; set; } + } +} diff --git a/src/Khd.Core.Domain/Models/DmsRecordAlarmInfo.cs b/src/Khd.Core.Domain/Models/DmsRecordAlarmInfo.cs new file mode 100644 index 0000000..671fb2b --- /dev/null +++ b/src/Khd.Core.Domain/Models/DmsRecordAlarmInfo.cs @@ -0,0 +1,66 @@ +using System; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Khd.Core.Domain.Models +{ + [Table("dms_record_alarm_info")] + public class DmsRecordAlarmInfo + { + [Column("alarm_id")] + public long AlarmId { get; set; } + + [Column("device_id")] + public long DeviceId { get; set; } + + [Column("alarm_rule_id")] + public long AlarmRuleId { get; set; } + + [Column("alarm_begin_time")] + public DateTime AlarmBeginTime { get; set; } + + [Column("alarm_end_time")] + public DateTime AlarmEndTime { get; set; } + + [Column("continue_time")] + public long ContinueTime { get; set; } + + [Column("alarm_reason")] + public string AlarmReason { get; set; } + + [Column("alarm_data")] + public string AlarmData { get; set; } + + [Column("alarm_status")] + public string AlarmStatus { get; set; } + + [Column("handle_suggest")] + public string HandleSuggest { get; set; } + + [Column("notice_status")] + public string NoticeStatus { get; set; } + + [Column("handle_user")] + public string HandleUser { get; set; } + + [Column("handle_time")] + public DateTime HandleTime { get; set; } + + [Column("cause_analysis")] + public string CauseAnalysis { get; set; } + + [Column("remark")] + public string Remark { get; set; } + + [Column("create_by")] + public string CreateBy { get; set; } + + [Column("create_time")] + public DateTime CreateTime { get; set; } + + [Column("update_by")] + public string UpdateBy { get; set; } + + [Column("update_time")] + public DateTime UpdateTime { get; set; } + } +} diff --git a/src/Khd.Core.Domain/Models/DmsRecordAlarmTime.cs b/src/Khd.Core.Domain/Models/DmsRecordAlarmTime.cs new file mode 100644 index 0000000..ebcbc7a --- /dev/null +++ b/src/Khd.Core.Domain/Models/DmsRecordAlarmTime.cs @@ -0,0 +1,48 @@ +using System; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Khd.Core.Domain.Models +{ + [Table("dms_record_alarm_time")] + public class DmsRecordAlarmTime + { + [Column("alarm_id")] + public long AlarmId { get; set; } + + [Column("device_id")] + public long DeviceId { get; set; } + + [Column("alarm_rule_id")] + public long AlarmRuleId { get; set; } + + [Column("alarm_begin_time")] + public DateTime AlarmBeginTime { get; set; } + + [Column("continue_time")] + public long ContinueTime { get; set; } + + [Column("alarm_reason")] + public string AlarmReason { get; set; } + + [Column("alarm_data")] + public string AlarmData { get; set; } + + [Column("handle_suggest")] + public string HandleSuggest { get; set; } + + [Column("remark")] + public string Remark { get; set; } + + [Column("create_by")] + public string CreateBy { get; set; } + + [Column("create_time")] + public DateTime CreateTime { get; set; } + + [Column("update_by")] + public string UpdateBy { get; set; } + + [Column("update_time")] + public DateTime UpdateTime { get; set; } + } +} diff --git a/src/Khd.Core.EntityFramework/DefaultDbContext.cs b/src/Khd.Core.EntityFramework/DefaultDbContext.cs index 09d0122..dc28d57 100644 --- a/src/Khd.Core.EntityFramework/DefaultDbContext.cs +++ b/src/Khd.Core.EntityFramework/DefaultDbContext.cs @@ -79,5 +79,13 @@ namespace Khd.Core.EntityFramework public DbSet MesBaseBarcodeInfo { get; set; } public DbSet PlcPoint { get; set; } + + public DbSet DmsBaseAlarmRule { get; set; } + + public DbSet DmsBaseDeviceLedger { get; set; } + + public DbSet DmsRecordAlarmInfo { get; set; } + + public DbSet DmsRecordAlarmTime { get; set; } } } \ No newline at end of file diff --git a/src/Khd.Core.Wcs/Global/StaticData.cs b/src/Khd.Core.Wcs/Global/StaticData.cs index a47c554..5aaa5cf 100644 --- a/src/Khd.Core.Wcs/Global/StaticData.cs +++ b/src/Khd.Core.Wcs/Global/StaticData.cs @@ -64,6 +64,8 @@ namespace Khd.Core.Wcs.Global public static List basePlcs = new List(); public static List PlcConfigs { get; set; } public static int DeleteLogDay { get; internal set; } + public static List DmsBaseAlarmRuleList { get; set; } + public static List BigContainerCodes = new List() { "JYHB01020001", "JYHB01020002", "JYHB01020003", "JYHB01020004" }; public static Dictionary> PlcPoints = new Dictionary>(); diff --git a/src/Khd.Core.Wcs/MainCentralControl.cs b/src/Khd.Core.Wcs/MainCentralControl.cs index d424b42..acaa838 100644 --- a/src/Khd.Core.Wcs/MainCentralControl.cs +++ b/src/Khd.Core.Wcs/MainCentralControl.cs @@ -1,5 +1,4 @@ -using Khd.Core.Domain.Models; -using Khd.Core.EntityFramework; +using Khd.Core.EntityFramework; using Khd.Core.Library; using Khd.Core.Wcs.Global; using Khd.Core.Wcs.Wcs; @@ -43,6 +42,7 @@ namespace Khd.Core.Wcs StaticData.basePlcs = dbContext.BasePlc.ToList();//陈工Agv和设备信息推送 StaticData.BaseEquip = dbContext.BaseEquip.ToList();//设备信息 StaticData.BaseDictionary = dbContext.BaseDictionary.ToList();//字典表,Agv任务模板 + StaticData.DmsBaseAlarmRuleList = dbContext.DmsBaseAlarmRule.ToList(); foreach (var plcConfig in StaticData.PlcConfigs) { if (!StaticData.PlcDic.Any(t => t.Key == plcConfig.Code)) @@ -64,6 +64,7 @@ namespace Khd.Core.Wcs //创建定时器 SystemTimer systemTimer = new SystemTimer(_host); systemTimer.Start(); + //创建任务 CreateTaskByRecord createTaskByRecord = new(_host); createTaskByRecord.StartPoint(); diff --git a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs index 96b643c..100b8ad 100644 --- a/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs +++ b/src/Khd.Core.Wcs/Wcs/CreateTaskByRecord.cs @@ -10,7 +10,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using SixLabors.ImageSharp; using System.Data; -using System.Linq; using Z.EntityFramework.Plus; namespace Khd.Core.Wcs.Wcs @@ -1996,7 +1995,7 @@ namespace Khd.Core.Wcs.Wcs foreach (var task in tasks) { var wmsRawStock = rawStock.Where(t => t.palletInfoCode == task.containerNo && t.materialId == order.MaterialId && t.saleOrderId == order.SaleOrderId).ToList(); - decimal? total = wmsRawStock.Sum(t => t.totalAmount)- wmsRawStock.Sum(t => t.frozenAmount); + decimal? total = wmsRawStock.Sum(t => t.totalAmount) - wmsRawStock.Sum(t => t.frozenAmount); needNumber -= total; WmsBaseLocation wmsBaseLocation = AllWmsBaseLocations.Where(t => t.locationCode == task.currPointNo).First(); index = wmsBaseLocation.locRow; diff --git a/src/Khd.Core.Wcs/Wcs/FirstFloor.cs b/src/Khd.Core.Wcs/Wcs/FirstFloor.cs index cf96b8f..8143187 100644 --- a/src/Khd.Core.Wcs/Wcs/FirstFloor.cs +++ b/src/Khd.Core.Wcs/Wcs/FirstFloor.cs @@ -8,7 +8,6 @@ using Masuit.Tools; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Z.EntityFramework.Plus; -using Khd.Core.Domain.Dto.TaskType; namespace Khd.Core.Wcs.Wcs { @@ -524,11 +523,11 @@ namespace Khd.Core.Wcs.Wcs if (Convert.ToInt32(equipstate06Value) == 0) { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); - var wcsTasks = dbContext.WcsTask.Where(t => t.nextPointId == T01 && t.taskStatus<5).OrderBy(t => t.createTime).ToList(); + var wcsTasks = dbContext.WcsTask.Where(t => t.nextPointId == T01 && t.taskStatus < 5).OrderBy(t => t.createTime).ToList(); foreach (var wcsTask in wcsTasks) { _logger.Info($"当前任务?{wcsTask.ToJsonString()}"); - bool hasTask = dbContext.WcsTask.Where(t => t.endPointId == wcsTask.endPointId && t.objid != wcsTask.objid && t.nextPointId != 6).Any(); + bool hasTask = dbContext.WcsTask.Where(t => t.endPointId == wcsTask.endPointId && t.objid != wcsTask.objid && t.nextPointId != 6).Any(); if (!hasTask) { wcsTask.serialNo ??= SystemData.GetSerialNo(dbContext); diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs index 9f81051..b675c0a 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorAGV.cs @@ -1,4 +1,5 @@ -using Khd.Core.Domain.Dto.webapi; +using Khd.Core.Domain.Dto.TaskType; +using Khd.Core.Domain.Dto.webapi; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library; @@ -10,7 +11,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json; using Z.EntityFramework.Plus; -using Khd.Core.Domain.Dto.TaskType; namespace Khd.Core.Wcs.Wcs { @@ -694,7 +694,6 @@ namespace Khd.Core.Wcs.Wcs endTime = DateTime.Now, locationCode = wmsBaseLocation.locationCode, executeStatus = "2", - returnFlag = null, instockAmount = 1, instockType = "2", materialBatchCode = mesBaseBarcodeInfo.barcodeInfo, diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorBearAgv.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorBearAgv.cs index ed007bb..edcf08e 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorBearAgv.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorBearAgv.cs @@ -8,7 +8,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json; using Z.EntityFramework.Plus; -using Khd.Core.Domain.Dto.TaskType; namespace Khd.Core.Wcs.Wcs { diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs index a91e4b7..509c126 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorCTU.cs @@ -1,4 +1,5 @@ -using Khd.Core.Domain.Dto.webapi; +using Khd.Core.Domain.Dto.TaskType; +using Khd.Core.Domain.Dto.webapi; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library; @@ -10,7 +11,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json; using Z.EntityFramework.Plus; -using Khd.Core.Domain.Dto.TaskType; namespace Khd.Core.Wcs.Wcs { @@ -565,7 +565,8 @@ namespace Khd.Core.Wcs.Wcs dbContext.Remove(item); dbContext.SaveChanges(); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 6 }); - }catch (Exception ex) + } + catch (Exception ex) { _logger.Error($"入库异常捕捉:{ex.Message}"); } diff --git a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs index 77c8e02..8b8bddf 100644 --- a/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/FiveFloorPoint.cs @@ -1,4 +1,5 @@ -using Khd.Core.Domain.Models; +using Khd.Core.Domain.Dto.TaskType; +using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library; using Khd.Core.Library.Mapper; @@ -8,7 +9,6 @@ using Masuit.Tools; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Z.EntityFramework.Plus; -using Khd.Core.Domain.Dto.TaskType; namespace Khd.Core.Wcs.Wcs { diff --git a/src/Khd.Core.Wcs/Wcs/FourthFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/FourthFloorPoint.cs index b1c4703..ef560e5 100644 --- a/src/Khd.Core.Wcs/Wcs/FourthFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/FourthFloorPoint.cs @@ -7,7 +7,6 @@ using Khd.Core.Wcs.Global; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Z.EntityFramework.Plus; -using Khd.Core.Domain.Dto.TaskType; namespace Khd.Core.Wcs.Wcs { diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs index e7e6a92..20321c1 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorAGV.cs @@ -1,4 +1,5 @@ -using Khd.Core.Domain.Dto.webapi; +using Khd.Core.Domain.Dto.TaskType; +using Khd.Core.Domain.Dto.webapi; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library; @@ -8,7 +9,6 @@ using Masuit.Tools; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json; -using Khd.Core.Domain.Dto.TaskType; using Z.EntityFramework.Plus; namespace Khd.Core.Wcs.Wcs diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs index f233da1..b8723bf 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorLine.cs @@ -1,4 +1,5 @@ -using Khd.Core.Domain.Models; +using Khd.Core.Domain.Dto.TaskType; +using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library; using Khd.Core.Library.Mapper; @@ -7,7 +8,6 @@ using Khd.Core.Wcs.Global; using Masuit.Tools; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Khd.Core.Domain.Dto.TaskType; namespace Khd.Core.Wcs.Wcs { diff --git a/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs index 8111e8c..94ff384 100644 --- a/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/SecondFloorPoint.cs @@ -1,4 +1,5 @@ -using Khd.Core.Domain.Models; +using Khd.Core.Domain.Dto.TaskType; +using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library; using Khd.Core.Library.Mapper; @@ -6,7 +7,6 @@ using Khd.Core.Plc.S7; using Khd.Core.Wcs.Global; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Khd.Core.Domain.Dto.TaskType; namespace Khd.Core.Wcs.Wcs { diff --git a/src/Khd.Core.Wcs/Wcs/SystemTimer.cs b/src/Khd.Core.Wcs/Wcs/SystemTimer.cs index 54b65b8..b499983 100644 --- a/src/Khd.Core.Wcs/Wcs/SystemTimer.cs +++ b/src/Khd.Core.Wcs/Wcs/SystemTimer.cs @@ -2,19 +2,20 @@ using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library; +using Khd.Core.Library.Mapper; using Khd.Core.Plc.S7; using Khd.Core.Wcs.Global; using Masuit.Tools; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json; -using Khd.Core.Domain.Dto.TaskType; +using Z.EntityFramework.Plus; namespace Khd.Core.Wcs.Wcs { public class SystemTimer { - private readonly LoggerUtils _logger = new (); + private readonly LoggerUtils _logger = new(); private readonly IHost host; public SystemTimer(IHost host) @@ -65,9 +66,98 @@ namespace Khd.Core.Wcs.Wcs IsBackground = true }; deleteLogsThread.Start(); + + //var AgvAlarmThread = new Thread(AgvAlarmLogic) + //{ + // Name = "AgvAlarmThread", + // IsBackground = true + //}; + //AgvAlarmThread.Start(); Console.WriteLine($"{DateTime.Now}: SystemTimer started"); } + private void AgvAlarmLogic() + { + using var scope = host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); + while (true) + { + using var transaction = dbContext.Database.BeginTransaction(); + try + { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + var dmsBaseDeviceLedgers = dbContext.DmsBaseDeviceLedger.ToList(); + var wcsAgvStatuses = dbContext.WcsAgvStatus.ToList(); + var agvStatus = from a in dmsBaseDeviceLedgers + from b in wcsAgvStatuses + where a.DeviceCode == b.RobotCode + select new + { + a.DeviceId, + b.Online, + b.Status + }; + foreach (var item in agvStatus) + { + var dmsBaseAlarmRule = StaticData.DmsBaseAlarmRuleList.Where(t => t.Status == item.Status).FirstOrDefault(); + if (dmsBaseAlarmRule != null) + { + DmsRecordAlarmTime alarmTime = new DmsRecordAlarmTime + { + AlarmBeginTime = DateTime.Now, + AlarmReason = dmsBaseAlarmRule.AlarmReason, + HandleSuggest = dmsBaseAlarmRule.HandleSuggest, + AlarmRuleId = dmsBaseAlarmRule.AlarmRuleId, + ContinueTime = dmsBaseAlarmRule.ContinueTime, + CreateBy = "WCS", + CreateTime = DateTime.Now, + DeviceId = item.DeviceId, + }; + var dmsRecordAlarmInfo = CoreMapper.Map(alarmTime); + dmsRecordAlarmInfo.AlarmStatus = "0"; + dmsRecordAlarmInfo.NoticeStatus = "0"; + dbContext.Add(dmsRecordAlarmInfo); + dbContext.SaveChanges(); + transaction.Commit(); + } + else + { + var alarmTime = dbContext.DmsRecordAlarmTime + .Where(t => t.CreateBy == "WCS") + .Where(t => t.DeviceId == item.DeviceId) + .FirstOrDefault(); + if (alarmTime != null) + { + dbContext.Remove(alarmTime); + dbContext.DmsRecordAlarmInfo + .Where(t => t.AlarmId == alarmTime.AlarmId) + .Update(t => new DmsRecordAlarmInfo + { + AlarmEndTime = DateTime.Now, + UpdateBy = "WCS", + UpdateTime = DateTime.Now + }); + dbContext.SaveChanges(); + transaction.Commit(); + } + } + } + } + catch + { + try + { + transaction.Rollback(); + } + catch + { + + } + } + Thread.Sleep(3000); + } + } + /// /// 定时清除日志文件 /// @@ -192,12 +282,58 @@ namespace Khd.Core.Wcs.Wcs /// private void PlcHearBeat220Logic() { + using var scope = host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); BasePlcpoint HeartBeat30 = StaticData.BasePlcpointList.First(t => t.plcpointNo == "putTray"); + int errorCount = 0; while (true) { try { + if (errorCount > 20) + { + _logger.Error($"Plc220短线重连失败超过{errorCount}次"); + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 15).FirstOrDefault(); + if (dmsRecordAlarmTime == null) + { + var alarmTime = new DmsRecordAlarmTime + { + DeviceId = 15, + AlarmBeginTime = DateTime.Now, + AlarmReason = "Plc220短线重连失败", + HandleSuggest = "检查Plc220网络连接", + AlarmRuleId = 4, + ContinueTime = 10000, + CreateBy = "WCS", + CreateTime = DateTime.Now, + }; + var dmsRecordAlarmInfo = CoreMapper.Map(alarmTime); + dmsRecordAlarmInfo.AlarmStatus = "0"; + dmsRecordAlarmInfo.NoticeStatus = "0"; + dbContext.Add(dmsRecordAlarmInfo); + dbContext.SaveChanges(); + } + } StaticData.PlcDic[2].Read(HeartBeat30.plcpointAddress); + if (errorCount > 0) + { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 15).FirstOrDefault(); + if (dmsRecordAlarmTime != null) + { + dbContext.DmsRecordAlarmTime.Remove(dmsRecordAlarmTime); + dbContext.DmsRecordAlarmInfo.Where(t => t.AlarmId == dmsRecordAlarmTime.AlarmId).Update(t => new DmsRecordAlarmInfo + { + AlarmEndTime = DateTime.Now, + AlarmStatus = "1", + UpdateBy = "WCS", + UpdateTime = DateTime.Now + }); + dbContext.SaveChanges(); + errorCount = 0; + } + } } catch { @@ -208,6 +344,7 @@ namespace Khd.Core.Wcs.Wcs } catch (Exception ex2) { + errorCount++; _logger.Error("Plc短线重连失败" + ex2.Message); } } @@ -220,14 +357,60 @@ namespace Khd.Core.Wcs.Wcs /// private void PlcHeartBeat30Logic() { + using var scope = host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); BasePlcpoint HeartBeat30 = StaticData.BasePlcpointList.First(t => t.plcpointNo == "HeartBeat30"); bool heartBeatCount = false; + int errorCount = 0; while (true) { try { + if (errorCount > 20) + { + _logger.Error($"Plc30短线重连失败超过{errorCount}次"); + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 13).FirstOrDefault(); + if (dmsRecordAlarmTime == null) + { + var alarmTime = new DmsRecordAlarmTime + { + DeviceId = 13, + AlarmBeginTime = DateTime.Now, + AlarmReason = "Plc30短线重连失败", + HandleSuggest = "检查Plc30网络连接", + AlarmRuleId = 4, + ContinueTime = 10000, + CreateBy = "WCS", + CreateTime = DateTime.Now, + }; + var dmsRecordAlarmInfo = CoreMapper.Map(alarmTime); + dmsRecordAlarmInfo.AlarmStatus = "0"; + dmsRecordAlarmInfo.NoticeStatus = "0"; + dbContext.Add(dmsRecordAlarmInfo); + dbContext.SaveChanges(); + } + } heartBeatCount = !heartBeatCount; StaticData.PlcDic[0].WriteToPoint(HeartBeat30.plcpointAddress, heartBeatCount, HeartBeat30.plcpointLength?.ToString()); + if (errorCount > 0) + { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 13).FirstOrDefault(); + if (dmsRecordAlarmTime != null) + { + dbContext.DmsRecordAlarmTime.Remove(dmsRecordAlarmTime); + dbContext.DmsRecordAlarmInfo.Where(t => t.AlarmId == dmsRecordAlarmTime.AlarmId).Update(t => new DmsRecordAlarmInfo + { + AlarmEndTime = DateTime.Now, + AlarmStatus = "1", + UpdateBy = "WCS", + UpdateTime = DateTime.Now + }); + dbContext.SaveChanges(); + errorCount = 0; + } + } } catch { @@ -238,6 +421,7 @@ namespace Khd.Core.Wcs.Wcs } catch (Exception ex2) { + errorCount++; _logger.Error("Plc短线重连失败" + ex2.Message); } } @@ -250,14 +434,60 @@ namespace Khd.Core.Wcs.Wcs /// private void PlcHeartBeat31Logic() { + using var scope = host.Services.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); BasePlcpoint HeartBeat31 = StaticData.BasePlcpointList.First(t => t.plcpointNo == "CTUHeart"); bool heartBeatCount = false; + int errorCount = 0; while (true) { try { + if (errorCount > 20) + { + _logger.Error($"Plc31短线重连失败超过{errorCount}次"); + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 14).FirstOrDefault(); + if (dmsRecordAlarmTime == null) + { + var alarmTime = new DmsRecordAlarmTime + { + DeviceId = 14, + AlarmBeginTime = DateTime.Now, + AlarmReason = "Plc31短线重连失败", + HandleSuggest = "检查Plc31网络连接", + AlarmRuleId = 4, + ContinueTime = 10000, + CreateBy = "WCS", + CreateTime = DateTime.Now, + }; + var dmsRecordAlarmInfo = CoreMapper.Map(alarmTime); + dmsRecordAlarmInfo.AlarmStatus = "0"; + dmsRecordAlarmInfo.NoticeStatus = "0"; + dbContext.Add(dmsRecordAlarmInfo); + dbContext.SaveChanges(); + } + } heartBeatCount = !heartBeatCount; StaticData.PlcDic[1].WriteToPoint(HeartBeat31.plcpointAddress, heartBeatCount, HeartBeat31.plcpointLength?.ToString()); + if (errorCount > 0) + { + dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); + var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 14).FirstOrDefault(); + if (dmsRecordAlarmTime != null) + { + dbContext.DmsRecordAlarmTime.Remove(dmsRecordAlarmTime); + dbContext.DmsRecordAlarmInfo.Where(t => t.AlarmId == dmsRecordAlarmTime.AlarmId).Update(t => new DmsRecordAlarmInfo + { + AlarmEndTime = DateTime.Now, + AlarmStatus = "1", + UpdateBy = "WCS", + UpdateTime = DateTime.Now + }); + dbContext.SaveChanges(); + errorCount = 0; + } + } } catch (Exception ex) { @@ -270,6 +500,7 @@ namespace Khd.Core.Wcs.Wcs } catch (Exception ex2) { + errorCount++; _logger.Error("Plc短线重连失败" + ex2.Message); } } diff --git a/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs b/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs index 7bee580..30b7c08 100644 --- a/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs +++ b/src/Khd.Core.Wcs/Wcs/ThirdFloorAGV.cs @@ -1,4 +1,5 @@ -using Khd.Core.Domain.Dto.webapi; +using Khd.Core.Domain.Dto.TaskType; +using Khd.Core.Domain.Dto.webapi; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library; @@ -10,7 +11,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json; using Z.EntityFramework.Plus; -using Khd.Core.Domain.Dto.TaskType; namespace Khd.Core.Wcs.Wcs { diff --git a/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs b/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs index 82ba5d7..b22963a 100644 --- a/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs +++ b/src/Khd.Core.Wcs/Wcs/ThirdFloorPoint.cs @@ -1,4 +1,5 @@ -using Khd.Core.Domain.Models; +using Khd.Core.Domain.Dto.TaskType; +using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library; using Khd.Core.Library.Mapper; @@ -8,7 +9,6 @@ using Masuit.Tools; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Z.EntityFramework.Plus; -using Khd.Core.Domain.Dto.TaskType; namespace Khd.Core.Wcs.Wcs { diff --git a/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs b/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs index 036e912..8df8d76 100644 --- a/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs +++ b/src/Khd.Core.Wpf/Form/FormBoardT.xaml.cs @@ -26,7 +26,6 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; -using System.Windows.Media.Media3D; using System.Windows.Threading; using Z.EntityFramework.Plus; @@ -288,7 +287,7 @@ namespace Khd.Core.Wpf.Form } } - + private void ReturnOrderTimer(object? obj) { using var scope = _host.Services.CreateScope(); @@ -418,7 +417,7 @@ namespace Khd.Core.Wpf.Form // Step 3: 计算每个申请单物料在各个托盘中的数量 var palletMaterialSummary = wmsRawStocks - .GroupBy(t => new { t.materialId, t.palletInfoCode,t.saleOrderId }) + .GroupBy(t => new { t.materialId, t.palletInfoCode, t.saleOrderId }) .Select(g => new { MaterialId = g.Key.materialId, @@ -452,7 +451,7 @@ namespace Khd.Core.Wpf.Form var orderNumber = from r in result from m in mesBaseMaterialInfos - where r.MaterialId== m.MaterialId + where r.MaterialId == m.MaterialId select new { materiaName = m.MaterialName, @@ -479,8 +478,8 @@ namespace Khd.Core.Wpf.Form // thisOutAmount = t.Sum(x => x.totalAmount) - t.Sum(x => x.frozenAmount) // }); //List endStationCodeOutRaw = wmsRawOutstocks.Where(t => t.endStationCode == baseEquip.endStationCode).ToList(); - - + + //List materialIds = endStationCodeOutRaw.Select(t => t.materialId).ToList(); //List mesBaseMaterialInfos = dbContext.MesBaseMaterialInfo.Where(t => materialIds.Contains(t.MaterialId)).ToList(); //var bill = endStationCodeOutRaw.GroupBy(t => new { t.materialId, t.materialBatch, t.saleOrderId }) @@ -507,7 +506,7 @@ namespace Khd.Core.Wpf.Form // thisOutAmount = b.thisOutAmount, // isSendOver = a.outstockAmount <= (a.realOutstockAmount + b.thisOutAmount) ? "已出完" : "未出完" // }; - + Dispatcher.Invoke(() => { this.OutTaskNumber.ItemsSource = orderNumber; @@ -2125,7 +2124,7 @@ namespace Khd.Core.Wpf.Form try { string containerCode = txtOutBox.Text; - + if (containerCode.Length < 15) return; if (!string.IsNullOrEmpty(containerCode)) @@ -2159,7 +2158,7 @@ namespace Khd.Core.Wpf.Form { try { - outMaterialNameTxt.Text =""; + outMaterialNameTxt.Text = ""; outMaterialSpecTxt.Text = ""; string barCode = txtOutBarCode.Text; string containerCode = txtOutBox.Text; @@ -2368,7 +2367,7 @@ namespace Khd.Core.Wpf.Form HandyControl.Controls.MessageBox.Info("请先扫描容器号和条码!"); } } - catch(Exception ex) + catch (Exception ex) { MessageBox.Show(ex.Message); } @@ -3224,7 +3223,7 @@ namespace Khd.Core.Wpf.Form { BasePlcpoint trayStatus = SystemData.BasePlcpoints.First(t => t.plcpointNo == "trayStatus"); var trayStatusValue = SystemData.PlcDic[0].Read(trayStatus.plcpointAddress); - if(trayStatusValue == null || Convert.ToInt32(trayStatusValue) == 0) + if (trayStatusValue == null || Convert.ToInt32(trayStatusValue) == 0) { HandyControl.Controls.MessageBox.Error("托盘库开启自动状态!"); return; @@ -4157,7 +4156,7 @@ namespace Khd.Core.Wpf.Form // 触发按钮的点击事件 OutRaw(); } - + } } } diff --git a/src/Khd.Core.Wpf/myConverter/TypeDataConverter.cs b/src/Khd.Core.Wpf/myConverter/TypeDataConverter.cs index 216b00f..59a989a 100644 --- a/src/Khd.Core.Wpf/myConverter/TypeDataConverter.cs +++ b/src/Khd.Core.Wpf/myConverter/TypeDataConverter.cs @@ -1,7 +1,6 @@ using Khd.Core.Domain.Dto.TaskType; using System; using System.Globalization; -using System.Linq; using System.Windows.Data; namespace Khd.Core.Wpf.myConverter