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)
{
RedisHub.Do(obj.Entity.Code, redis =>
{
var 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()) return;
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" or "1661")
{
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")
{
var srmStation = new string[2];
switch (task.Device)
{
case "SRM1":
srmStation[0] = "2534";
srmStation[1] = "2533";
break;
case "SRM2":
srmStation[0] = "";
srmStation[1] = "";
break;
}
//TODO:暂时不考虑入库卡控
//开始计算当前这个任务要从哪个站台出
//计算两个站台小于取货完成数量的AGV任务
var agv1 = db.Default.Queryable().SplitTable(x => x.Take(2)).Count(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[0]);
var agv2 = db.Default.Queryable().SplitTable(x => x.Take(2)).Count(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[1]);
task.SrmStation = "";
task.AddrTo = agv1 > agv2 ? srmStation[1] : srmStation[0];
}
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);
}
}
});
}
public override bool Select(Device dev)
{
return dev.Code == nameof(NoInteractionSystems);
}
}
}