using PlcSiemens.Core.Extension;
using ServiceCenter.Extensions;
using ServiceCenter.Logs;
using ServiceCenter.SqlSugars;
using SqlSugar;
using System.ComponentModel;
using WCS.Core;
using WCS.Entity;
using WCS.Entity.Protocol.Station;
using WCS.WorkEngineering.Extensions;
using WCS.WorkEngineering.WebApi.Controllers;
using WCS.WorkEngineering.Worlds;
using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
using TaskStatus = WCS.Entity.TaskStatus;
namespace WCS.WorkEngineering.Systems
{
///
/// 分流点
///
//[BelongTo(typeof(SortingBranchWorld))]
[Description("环形库分流点")]
public class 环形库分流点 : DeviceSystem>
{
protected override bool ParallelDo => true;
protected override bool SaveLogsToFile => true;
public override void Do(Device obj)
{
if (obj.Data.VoucherNo != obj.Data2.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}", LogLevelEnum.High);
if (obj.Data3.Status.HasFlag(StationStatus.Run)) throw new KnownException("设备运行中", LogLevelEnum.Low);
if (!obj.Data3.Status.HasFlag(StationStatus.OT_Status)) throw new KnownException("站台货物信息与实际占用不一致", LogLevelEnum.Low);
if (obj.Data2.Request != 1) throw new KnownException("无请求", LogLevelEnum.Mid);
var isPut = false;
var nextAdd = GetNext(obj);
int taskId = 0;
SqlSugarHelper.Do(_db =>
{
var db = _db.Default;
var taskInfo = db.Queryable().First(v => v.ID == obj.Data2.TaskNumber && v.Status == TaskStatus.WaitingToExecute && !v.BarCode.Contains("Error"));
if (obj.Data2.TaskNumber == 1)
{
var type = obj.Data4.Length.ToInt().ToString();
//找到一条起点是当前位置且状态小于2的任务
taskInfo = db.Queryable().OrderBy(x => x.AddTime).First(x => x.AddrFrom == obj.Entity.Code && x.Status == TaskStatus.WaitingToExecute && x.BarCode.Contains("Error") && x.AddrNext == null);
if (taskInfo == null)
{
WmsApi.PalletizingCreateseErrorTasks(obj.Entity.Code, type);
return;
}
}
else
if (taskInfo == null) throw new KnownException($"未找到对应的WCS任务{obj.Data2.TaskNumber}", LogLevelEnum.Mid);
switch (obj.Entity.Code)
{
case "418":
if (taskInfo.WarehouseCode != "1N") throw new KnownException($"当前任务应该当前往{taskInfo.WarehouseCode}库", LogLevelEnum.Mid);
break;
case "618":
if (taskInfo.WarehouseCode != "1S") throw new KnownException($"当前任务应该当前往{taskInfo.WarehouseCode}库", LogLevelEnum.Mid);
break;
case "818":
if (taskInfo.WarehouseCode != "2N") throw new KnownException($"当前任务应该当前往{taskInfo.WarehouseCode}库", LogLevelEnum.Mid);
break;
case "1018":
if (taskInfo.WarehouseCode != "2S") throw new KnownException($"当前任务应该当前往{taskInfo.WarehouseCode}库", LogLevelEnum.Mid);
break;
case "1218":
if (taskInfo.WarehouseCode != "3N") throw new KnownException($"当前任务应该当前往{taskInfo.WarehouseCode}库", LogLevelEnum.Mid);
break;
case "1418":
if (taskInfo.WarehouseCode != "3S") throw new KnownException($"当前任务应该当前往{taskInfo.WarehouseCode}库", LogLevelEnum.Mid);
break;
};
taskId = taskInfo.ID;
if (obj.Data4.Length.ToInt() != 9) //09工字轮在环形库分流点只分配下一个地址,不作任何变更
{
taskInfo.AddrNext = nextAdd.ToString();
taskInfo.Status = TaskStatus.FinishOfShunt;
taskInfo.EditTime = DateTime.Now;
taskInfo.WarehouseCode = taskInfo.WarehouseCode.Contains("R") ? taskInfo.WarehouseCode : taskInfo.WarehouseCode + "R";
taskInfo.AddrTo = "Robot";
taskInfo.GoodsType = obj.Data4.Length.ToInt();
db.Updateable(taskInfo).ExecuteCommand();
taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, nextAdd.ToString(), "工字轮完成环形库分流");
}
else
{
taskInfo.AddrNext = nextAdd.ToString();
taskInfo.EditTime = DateTime.Now;
taskInfo.GoodsType = obj.Data4.Length.ToInt();
db.Updateable(taskInfo).ExecuteCommand();
taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, nextAdd.ToString(), "工字轮途径环形库分流点");
}
isPut = true;
});
if (!isPut) return;
obj.Data.TaskNumber = taskId;
obj.Data.GoodsStart = obj.Entity.Code.ToShort();
obj.Data.GoodsEnd = nextAdd;
obj.Data.VoucherNo++;
World.Log($"执行记录:任务号[{taskId}]-[{obj.Data.VoucherNo}]");
}
public override bool Select(Device dev)
{
return dev.Code is "418" or "618" or "818" or "1018" or "1218" or "1418";
}
///
/// 计算非零九的去向
///
///
///
public short GetNext(Device obj)
{
return obj.Data4.Length switch
{
9 => obj.Entity.Code switch
{
"418" => 455,
"618" => 655,
"818" => 855,
"1018" => 1055,
"1218" => 1255,
"1418" => 1455,
_ => 9999
},
18 => obj.Entity.Code switch
{
"418" => 442,
"618" => 642,
"818" => 842,
"1018" => 1042,
"1218" => 1242,
"1418" => 1442,
_ => 9999
},
50 => obj.Entity.Code switch
{
"418" => 424,
"618" => 624,
"818" => 824,
"1018" => 1024,
"1218" => 1224,
"1418" => 1424,
_ => 9999
},
34 => obj.Entity.Code switch
{
"418" => 433,
"618" => 633,
"818" => 833,
"1018" => 1033,
"1218" => 1233,
"1418" => 1433,
_ => 9999
},
_ => 9999
};
}
}
}