using PlcSiemens.Core.Extension; using ServiceCenter.Extensions; using ServiceCenter.Logs; using ServiceCenter.SqlSugars; using SqlSugar; using System.Collections.Concurrent; using System.ComponentModel; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol.BCR; using WCS.Entity.Protocol.Station; using WCS.WorkEngineering.Extensions; using WCS.WorkEngineering.Model.WMS; using WCS.WorkEngineering.Worlds; using TaskStatus = WCS.Entity.TaskStatus; namespace WCS.WorkEngineering.Systems { /// /// 满轮主线预写入目标地址 /// [BelongTo(typeof(SortingMainLineWorld))] [Description("满轮主线预写入目标地址")] public class 满轮主线预写入目标地址 : DeviceSystem> { protected override bool ParallelDo => true; private static Dictionary CodeMap { get; set; } = new Dictionary(); private static ConcurrentDictionary FlowConfig { get; set; } = new ConcurrentDictionary(); public 满轮主线预写入目标地址() { // 映射 Code 到 devCode 的映射关系 CodeMap = new Dictionary { ["18"] = "22", ["38"] = "41", ["58"] = "61", ["118"] = "122", ["138"] = "141", ["158"] = "161" }; } public override void Do(Device obj) { try { if (!CodeMap.TryGetValue(obj.Entity.Code, out var devCode)) { World.Log($"设备号[{obj.Entity.Code}]未初始化对应关系", LogLevelEnum.High); return; } var dev = new Device(Device.All.First(x => x.Code == devCode), World); dev.Data.Mode = StationMode.Automatic; //从DB83中获取待处理条码组 var pendingBcrList = obj.Data2.GetBcrCodeList().Where(x => !x.IsNullOrEmpty()).ToList(); //从DB525获取已处理条码组 var cacheBcrList = obj.Data3.GetBcrCodeList().ToList(); //筛选出未处理条码组 var codes = pendingBcrList.Where(x => !cacheBcrList.Contains(x)).ToList(); fjSysConfig configFlowError = null; //循环处理所有缓存条码组中没有的条码 foreach (var bcrCode in codes) { WCS_TaskInfo taskInfo = null; fjSysConfig config = null; SqlSugarHelper.Do(_db => { var db = _db.Default; taskInfo = db.Queryable().NoLock().First(x => x.BarCode == bcrCode && x.Status == TaskStatus.NewBuild); if (taskInfo == null) { LogAndRecordError(bcrCode, "找不到匹配的任务", obj.Entity.Code); return; } var key = taskInfo.WarehouseCode + "-Flow"; if (!FlowConfig.TryGetValue(key, out config)) { config = db.Queryable().NoLock().First(x => x.Code == key) ?? new fjSysConfig { SContent = "4" }; FlowConfig.AddOrUpdate(key, config, (k, v) => config); } if (!db.Queryable().NoLock().Any(x => x.Code == key && x.SContent == config.SContent)) { config = db.Queryable().NoLock().First(x => x.Code == key) ?? new fjSysConfig { SContent = "4" }; FlowConfig.AddOrUpdate(key, config, (k, v) => config); } //获取排异错误 if (configFlowError == null) { configFlowError = db.Queryable().NoLock().First(x => x.Code == "FlowErrorAllocation") ?? new fjSysConfig { SContent = "3" }; } }); if (taskInfo == null) { dev.Data.Mode = StationMode.Automatic; continue; } var srmCode = taskInfo.WarehouseCode.WarehouseToSrm(); var flowError = false; //北侧主线 if (obj.Entity.Code == "18" || obj.Entity.Code == "38" || obj.Entity.Code == "58") { if (taskInfo.WarehouseCode.Contains("S")) { flowError = true; } } //南侧主线 else if (obj.Entity.Code == "118" || obj.Entity.Code == "138" || obj.Entity.Code == "158") { if (taskInfo.WarehouseCode.Contains("N")) { flowError = true; } } var path = DevicePath.GetPath(obj.Entity.Code, srmCode); if ((path == null || path is { Points.Count: < 2 }) && !flowError) { var msg = $"{bcrCode}:路径错误,当前位置{obj.Entity.Code},目标位置:{srmCode}"; LogAndRecordError(bcrCode, msg, obj.Entity.Code); dev.Data.Mode = StationMode.Automatic; continue; } var next = path != null ? path.Points[1].Code : devCode; #region 计算应该去哪个分拣库 //应该要去的分拣库 if (taskInfo.WarehouseCode.Contains("N")) { next = config.SContent switch { "1" => "418", "2" => "818", "3" => "1218", _ => next }; } else if (taskInfo.WarehouseCode.Contains("S")) { next = config.SContent switch { "1" => "618", "2" => "1018", "3" => "1418", _ => next }; } if (flowError) { if (taskInfo.WarehouseCode.Contains("N")) { next = configFlowError.SContent switch { "1" => "618", "2" => "1018", "3" => "1418", _ => next }; } else if (taskInfo.WarehouseCode.Contains("S")) { next = configFlowError.SContent switch { "1" => "418", "2" => "818", "3" => "1218", _ => next }; } } #endregion 计算应该去哪个分拣库 //开始赋值 SetStation525Value(obj.Data3, "TaskNumber", taskInfo.ID); SetStation525Value(obj.Data3, "GoodsEnd", next.ToShort()); SetStation525Value(obj.Data3, "BcrCode", bcrCode); obj.Data3.NextIndex = (short)(obj.Data3.NextIndex >= 49 ? 0 : obj.Data3.NextIndex + 1); dev.Data.Mode = StationMode.Automatic; } dev.Data.Mode = StationMode.Automatic; } catch (Exception e) { World.Log($"{e.Message}:---{e.StackTrace}", LogLevelEnum.High); } } public override bool Select(Device dev) { var codes = new List(); if (WorkStart.WareHouses.Contains("FJ1")) codes.AddRange(new List() { "18", "118" }); if (WorkStart.WareHouses.Contains("FJ2")) codes.AddRange(new List() { "38", "58" }); if (WorkStart.WareHouses.Contains("FJ3")) codes.AddRange(new List() { "138", "158" }); return codes.Contains(dev.Code); } private void LogAndRecordError(string barcode, string message, string memo) { World.Log($"{barcode}:{message}", LogLevelEnum.High); var errorInfo = new BaseErrorInfo() { BusName = "主线分流", BarCode = barcode, Message = message, Count = 1, AddTime = DateTime.Now, Memo = memo }; errorInfo.AddBaseErrorInfo(); } /// /// 设置站525的值 /// /// /// /// private void SetStation525Value(IStation525 data3, string propertyName, object value) { var property = data3.GetType().GetProperty($"{propertyName}{data3.NextIndex}"); if (property != null && property.CanWrite) { property.SetValue(data3, value); property.SetValue(data3, value); } } } /// /// 主线分流 /// public class MainlineDiversion { /// /// 任务号 /// public int TaskId { get; set; } /// /// 仓库号 /// public string WarehouseCode { get; set; } } }