using PlcSiemens.Core.Extension;
using ServiceCenter.Extensions;
using ServiceCenter.Logs;
using ServiceCenter.Redis;
using ServiceCenter.SqlSugars;
using System.ComponentModel;
using WCS.Core;
using WCS.Entity;
using WCS.Entity.Protocol.Station;
using WCS.WorkEngineering.Extensions;
using WCS.WorkEngineering.Worlds;
using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
using TaskStatus = WCS.Entity.TaskStatus;
namespace WCS.WorkEngineering.Systems
{
///
/// 无交互系统
///
[BelongTo(typeof(NoInteractionWorld))]
[Description("无交互系统")]
public class NoInteractionSystems : DeviceSystem>
{
public NoInteractionSystems()
{
}
protected override bool ParallelDo => true;
protected override bool SaveLogsToFile => true;
public override void Do(Device obj)
{
var key = $"WCS:Lock:无交互系统{obj.Entity.Code}";
RedisHub.Do(key, redis =>
{
try
{
List taskInfos = new List();
SqlSugarHelper.Do(db =>
{
taskInfos = db.Default.Queryable().Where(t => t.Status == Entity.TaskStatus.NewBuild && !(t.Type == TaskType.SetPlate && t.AddrFrom == "Robot")).ToList();
});
if (taskInfos.Any())
{
foreach (var item in taskInfos)
{
try
{
SqlSugarHelper.Do(db =>
{
var task = db.Default.Queryable().Where(t => t.ID == item.ID).First() ?? throw new Exception($"未找到对应的WCS任务[{item.ID}]");
switch (task.Type)
{
case TaskType.SetPlate:
if (task.AddrFrom != "Robot")
{
//更新任务状态
task.Status = TaskStatus.WaitingToExecute;
db.Default.Updateable(task).ExecuteCommand();
task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化入库任务信息");
}
break;
case TaskType.EnterDepot:
//更新任务状态
task.Status = Entity.TaskStatus.WaitingToExecute;
switch (task.WarehouseCode)
{
case "1N":
task.Device = "SRM1";
break;
}
if (task.AddrFrom is "1666")
{
task.Device = "SRM1";
}
//计算下一个地址
var path1 = DevicePath.GetPath(task.AddrFrom, task.Device);
task.AddrNext = path1.Points[1].Code;
task.SrmStation = task.BarCode.Contains("TPA") || task.BarCode.Contains("TPB") ? task.AddrFrom : path1.Points[2].Code;
db.Default.Updateable(task).ExecuteCommand();
task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化入库任务信息");
break;
case TaskType.OutDepot:
{
if (task.Device.Contains("Robot"))
{
var pos = task.AddrFrom.Split("-");
task.Status = Entity.TaskStatus.WaitingToExecute;
task.Line = pos[0].ToShort();
task.Col = pos[1].ToShort();
task.Layer = pos[2].ToShort();
task.Depth = pos[3].ToShort();
db.Default.Updateable(task).ExecuteCommand();
task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
}
else
{
if (task.SrmStation == "1")
{
task.SrmStation = "";
task.AddrTo = "2534";
task.Device = "SRM" + task.WarehouseCode.Substring(0, 1);
}
if (task.SrmStation.IsNullOrEmpty()) //如果没有指定放货站台
{
if (task.Device.IsNullOrEmpty())
{
task.Device = "SRM" + task.Tunnel.GetLastDigit();
}
//获取堆垛机到目标地址的路径信息
var path = DevicePath.GetPath(task.Device, task.AddrTo);
task.SrmStation = path.Points[1].Code;
}
var devs = Device.All.Where(x => x.HasFlag(DeviceFlags.AGV取货站台口)).Select(x => x.Code);
if (devs.Contains(task.SrmStation))
{
//开始处理车间叫料AGV任务任务
db.Default.Insertable(new WCS_AgvTaskInfo()
{
ID = db.GetAgvTaskId(),
TaskType = AGVTaskType.CallMaterial,
Status = AGVTaskStatus.NewBuild,
TaskId = task.ID,
Position = task.WorkBench,
Station = task.SrmStation,
AddWho = "WCS",
AddTime = DateTime.Now
}).SplitTable().ExecuteCommand();
db.Default.Insertable(new WCS_AgvTaskInfo()
{
ID = db.GetAgvTaskId(),
TaskType = AGVTaskType.EnterDepot,
Status = AGVTaskStatus.NewBuild,
TaskId = task.ID,
Position = task.WorkBench,
Station = "2501",
AddWho = "WCS",
AddTime = DateTime.Now
}).SplitTable().ExecuteCommand();
}
//更新任务状态
task.Status = Entity.TaskStatus.WaitingToExecute;
db.Default.Updateable(task).ExecuteCommand();
task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
}
break;
}
case TaskType.Delivery:
break;
case TaskType.EmptyInit:
break;
}
});
}
catch (Exception ex)
{
World.Log(ex.Message, LogLevelEnum.Mid);
continue;
}
}
}
}
catch (Exception ex)
{
World.Log(ex.Message, LogLevelEnum.Mid);
}
});
}
public override bool Select(Device dev)
{
return dev.Code == nameof(NoInteractionSystems);
}
}
}