using ServiceCenter.Logs;
using ServiceCenter.Redis;
using ServiceCenter.SqlSugars;
using System.ComponentModel;
using WCS.Core;
using WCS.Entity;
using WCS.WorkEngineering.Extensions;
using WCS.WorkEngineering.Protocol.Station;
using WCS.WorkEngineering.WebApi.Controllers;
using WCS.WorkEngineering.WebApi.Models.AGV.Response;
using WCS.WorkEngineering.Worlds;
using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
namespace WCS.WorkEngineering.Systems
{
///
/// 出库站台交互
///
[BelongTo(typeof(MainWorld))]
[Description("一楼出库工位处理系统")]
public class 一楼出库工位处理系统 : DeviceSystem
{
protected override bool ParallelDo => true;
protected override bool SaveLogsToFile => true;
public override void Do(Station obj)
{
var key = $"WCS:Lock:{obj.Entity.Code}";
try
{
if (RedisHub.Default.Get(key) != null)
{
throw new KnownException($"[{obj.Entity.Code}]--触发并发管控", LogLevelEnum.High);
}
RedisHub.Default.Set(key, obj.Entity.Code);
//有任务需要执行
if (obj.Data3.Status.HasFlag(StationStatus.PH_Status) && obj.Data3.Status.HasFlag(StationStatus.OT_Status))
{
SqlSugarHelper.Do(db =>
{
//当前站台是否有任务在执行
var task = db.Default.Queryable().First(v => v.ID == obj.Data2.TaskNumber && v.Status == Entity.TaskStatus.ConveyorExecution) ?? throw new KnownException("无可执行任务", LogLevelEnum.Mid);
var agv = db.Default.Queryable().SplitTable(v => v.Take(2)).First(v => v.ID == task.AgvTaskID && v.Status == AGVTaskStatus.NewBuild) ?? throw new KnownException("未找到对应的AGV任务", LogLevelEnum.Mid);
string endPos = "";
if (task.AddrTo == "1021" || task.AddrTo == "1022" || task.AddrTo == "1023" || task.AddrTo == "1024")
{
endPos = "PT" + task.AddrTo;
}
else
{
endPos = task.AddrTo;
}
GenAgvSchedulingTaskResponse res = null;
if (endPos.Contains("A") || endPos.Contains("B") || endPos.Contains("C") || endPos.Contains("D"))
{
res = AgvApi.搬运_wmsStart("PT", agv.Station, endPos, Guid.NewGuid().ToString().Replace("-", ""), "1");
}
else
{
res = AgvApi.叫料出库("PT", agv.Station, endPos, Guid.NewGuid().ToString().Replace("-", ""), "1");
}
agv.Status = AGVTaskStatus.Confirm;
agv.AgvID = res.data;
db.Default.Updateable(agv).SplitTable().ExecuteCommand();
//更新WCS数据
task.Status = Entity.TaskStatus.AGVExecution;
db.Default.Updateable(task).ExecuteCommand();
task.AddWCS_TASK_DTL(db, task.Device, $"任务下发至AGV-AGV任务ID{agv.AgvID}");
});
}
}
finally
{
RedisHub.Default.Del(key);
}
}
public override bool Select(Device dev)
{
return dev.HasFlag(DeviceFlags.一楼出库口);
}
}
}