using ServiceCenter.Extensions;
using ServiceCenter.Logs;
using ServiceCenter.SqlSugars;
using System.ComponentModel;
using WCS.Core;
using WCS.Entity;
using WCS.Entity.Protocol.Station;
using WCS.WorkEngineering.Extensions;
using WCS.WorkEngineering.Model.WMS;
using WCS.WorkEngineering.WebApi.Controllers;
using WCS.WorkEngineering.WebApi.Models.WMS.Response;
using WCS.WorkEngineering.Worlds;
using TaskStatus = WCS.Entity.TaskStatus;
namespace WCS.WorkEngineering.Systems.环形库
{
///
/// 环形库分配货位
///
[BelongTo(typeof(SortingBranchWorld))]
[Description("环形库分配货位")]
public class 环形库分配货位 : DeviceSystem>
{
protected override bool ParallelDo => true;
public override void Do(Device obj)
{
if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
{
World.Log($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}");
return;
}
if (obj.Data3.Status.HasFlag(StationStatus.Run))
{
World.Log("设备运行中");
return;
}
;
if (!obj.Data3.Status.HasFlag(StationStatus.OT_Status))
{
World.Log("站台货物信息与实际占用不一致");
return;
}
if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status))
{
}
;
if (obj.Data2.Request != 1)
{
World.Log("无请求");
return;
}
WCS_TaskInfo taskInfo = null;
int sideNum = 0;
//开始获取货位号
SqlSugarHelper.Do(db =>
{
var task = db.Default.Queryable().First(v => obj.Data2.TaskNumber == v.ID);
if (task == null)
{
World.Log($"未找到任务[{obj.Data2.TaskNumber}],请人工接入处理!!!!");
return;
}
if (task.Type != TaskType.SetPlate)
{
World.Log($"任务[{obj.Data2.TaskNumber}]任务类型错误,应该是组盘任务,请人工接入处理!!!!");
return;
}
if (task.Status != TaskStatus.FinishOfShunt)
{
World.Log($"任务[{obj.Data2.TaskNumber}]任务状态错误,当前状态应该市分流结束,,请人工接入处理!!!!");
return;
}
var robot = GetRobotDevice(obj.Entity);
if (robot == null)
{
World.Log($"未检索到对应的机械臂设备号", LogLevelEnum.High);
return;
}
if (robot.GetIsDirectPalletizing(db.Default))
{
//获取对应的码垛信息
var ringPalletizingInfo = db.Default.Queryable().Single(x => x.Id == task.TaskGroupKey.ToLong());
// 获取对应码垛工位所有的码垛信息
var ringPalletizingInfos = db.Default.Queryable().Where(x => x.MaDuoGongWei == ringPalletizingInfo.MaDuoGongWei && x.Out == false).ToList();
if (ringPalletizingInfos.Count > 1) //有多条需判断是否能进行放行
{
//获取所有此码垛工位所有已经分配的任务
var ringPalletizingMaDuoGongWeilList = ringPalletizingInfos.Select(x => x.Id.ToString()).ToList();
var tasks = db.Default.Queryable().Where(x => ringPalletizingMaDuoGongWeilList.Contains(x.TaskGroupKey) && x.Status < TaskStatus.Finish && x.ProdLine == 1).ToList();
//暂时不考虑同一个码垛工位,会有出现第一条信息还没被放行,第二条码垛信息就被创建的情况
if (tasks.GroupBy(x => x.TaskGroupKey).Count() != 1)
{
World.Log($"同时有两组未结束的码垛信息被放行,请检查码垛工位{ringPalletizingInfo.MaDuoGongWei}的实际情况,是否存在上组任务未结束或任务乱等情况", LogLevelEnum.High);
return;
}
if (tasks.First().TaskGroupKey == ringPalletizingInfo.Id.ToString())
{
task.LastInteractionPoint = obj.Entity.Code;
task.AddrTo = ringPalletizingInfo.MaDuoGongWei;
task.Device = obj.Entity.Code;
task.ProdLine = 1; //标识放行
task.EditWho = "WCS";
db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.AddrTo, x.LastInteractionPoint, x.ProdLine, x.Device, x.EditWho }).ExecuteCommand();
task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, task.AddrTo, $"直接码垛放行{task.AddrTo}");
//var invNow = db.Default.Queryable().NoLock().First(x => x.ContGrpBarCode == task.BarCode);
//默认信息
sideNum = 1;
taskInfo = task;
}
else
{
World.Log($"同时有两组未结束的码垛信息被放行,请检查码垛工位{ringPalletizingInfo.MaDuoGongWei}的实际情况,是否存在上组任务未结束或任务乱等情况", LogLevelEnum.High);
return;
}
}
else
{
task.LastInteractionPoint = obj.Entity.Code;
task.AddrTo = ringPalletizingInfo.MaDuoGongWei;
task.Device = obj.Entity.Code;
task.ProdLine = 1; //标识放行
task.EditWho = "WCS";
db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.AddrTo, x.LastInteractionPoint, x.ProdLine, x.Device, x.EditWho }).ExecuteCommand();
task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, task.AddrTo, $"直接码垛放行{task.AddrTo}");
//var invNow = db.Default.Queryable().NoLock().First(x => x.ContGrpBarCode == task.BarCode);
//默认信息
sideNum = 1;
taskInfo = task;
}
}
else
{
var res = WmsApi.RingApplyStockInLoc(task.ID, task.Device, obj.Entity.Code, task.GoodsType);
if (res.ResCode != ResponseStatusCodeEnum.Sucess)
{
World.Log(res.ResMsg, ServiceCenter.Logs.LogLevelEnum.High);
return;
}
task.AddrTo = res.ResData.CellNo;
task.Line = res.ResData.Row;
task.Col = res.ResData.Colomn;
task.Layer = res.ResData.Layer;
task.Depth = res.ResData.Row;
task.LastInteractionPoint = obj.Entity.Code;
task.Device = obj.Entity.Code;
task.EditWho = "WCS";
db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.AddrTo, x.Line, x.Col, x.Layer, x.Depth, x.LastInteractionPoint, x.Device, x.EditWho }).ExecuteCommand();
task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, task.AddrTo, $"任务分配货位{task.AddrTo}");
var invNow = db.Default.Queryable().NoLock().First(x => x.ContGrpBarCode == task.BarCode);
sideNum = invNow.SideNum;
taskInfo = task;
}
});
if (taskInfo == null) return;
var next = (taskInfo.AddrNext.ToShort() - 2).ToShort();
obj.Data.TaskNumber = taskInfo.ID;
obj.Data.TaskNumber = taskInfo.ID;
obj.Data.GoodsStart = obj.Entity.Code.ToShort();
obj.Data.GoodsStart = obj.Entity.Code.ToShort();
obj.Data.GoodsEnd = next;
if (sideNum == 2) //反面
{
obj.Data.CmdType = StationCmd.Res6;
obj.Data.CmdType = StationCmd.Res6;
}
obj.Data.GoodsEnd = next;
obj.Data.SetVoucherNo();
}
public override bool Select(Device dev)
{
var codes = new List()
{
"444","644","844","1044","1244","1444",
"426","626","826","1026","1226","1426",
"435","635","835","1035","1235","1435"
};
return codes.Any(x => x == dev.Code);
}
public Device? GetRobotDevice(Device dev)
{
var robotCode = dev.Code switch
{
"435" => "Robot1",
"635" => "Robot2",
"835" => "Robot3",
"1035" => "Robot4",
"1235" => "Robot5",
"1435" => "Robot6",
"444" => "Robot1",
"644" => "Robot2",
"844" => "Robot3",
"1044" => "Robot4",
"1244" => "Robot5",
"1444" => "Robot6",
"426" => "Robot1",
"626" => "Robot2",
"826" => "Robot3",
"1026" => "Robot4",
"1226" => "Robot5",
"1426" => "Robot6",
_ => "99999"
};
return Device.All.FirstOrDefault(v => v.Code == robotCode);
}
}
}