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; }
}
}