using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.LocationEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_DTO;
using WIDESEAWCS_DTO.RGV.FOURBOT;
using WIDESEAWCS_DTO.WMS;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_Tasks
{
public partial class TaskJob
{
#region 下发四向车入库任务
///
/// 下发四向车新建入库任务
///
///
public void SendRGVInTask(List tasks)
{
FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new();
try
{
Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置");
foreach (var item in tasks)
{
fOURBOTnewMovePodTask.priority = item.Grade;
fOURBOTnewMovePodTask.podID = item.PalletCode;
fOURBOTnewMovePodTask.destination = item.NextAddress;
fOURBOTnewMovePodTask.desExt = new
{
unload = 0//是否放下容器,0否1是
};
fOURBOTnewMovePodTask.desType = 2;
string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize());
FOURBOTReturn fOURBOTReturn = response.DeserializeObject();
if (fOURBOTReturn.returnCode == 0)
{
FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID");
item.RGVTaskId = fOURBO.taskID;
item.TaskState = (int)TaskStatusEnum.Execut;
}
}
_taskService.UpdateData(tasks);
}
catch (Exception ex)
{
WriteError(nameof(TaskJob), ex.Message, ex);
}
}
#endregion
#region 处理出库任务是否需要移库
///
/// 处理出库任务是否需要移库
///
///
public void IsMoveTask(List tasks)
{
try
{
Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(GetBlockPodContentDto)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置");
List dt_Tasks = new List();
//var PalletCodes = tasks.Select(x => x.PalletCode).ToList();
GetBlockPodContentDto content = new GetBlockPodContentDto();
content.CandidatePodIDs = tasks.Select(x => x.PalletCode).ToList();
string response = HttpHelper.Post(apiInfo.ApiAddress, content.Serialize());
FOURBOTReturn fOURBOTReturn = response.DeserializeObject();
if (fOURBOTReturn.returnCode == 0)
{
ReturnBlockPodResultDto getBlockPod = fOURBOTReturn.data as ReturnBlockPodResultDto ?? throw new Exception("未获取到阻碍托盘关系数据");
foreach (var Result in getBlockPod.Result)
{
foreach (var item in Result.outPods)
{
var task = tasks.First(x => x.PalletCode == item.outPod);
if (item.blockPods.Count > 0)
{
task.TaskState = (int)TaskStatusEnum.RGV_WaitMoveToExecute;
dt_Tasks.Add(task);
AddMoveTask(item.blockPods);
}
else
{
task.TaskState = (int)TaskStatusEnum.RGV_WaitSend;
dt_Tasks.Add(task);
}
}
}
_taskService.UpdateData(dt_Tasks);
}
}
catch (Exception ex)
{
WriteError(nameof(TaskJob), ex.Message, ex);
}
}
#endregion
#region 下发外形检测成功任务
///
/// 下发外形检测成功任务
///
///
public void SendCheckShapeingOkTask(List tasks)
{
FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new();
try
{
Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置");
List rGVLocationInfos = new List();
List stationMangers = new List();
foreach (var item in tasks)
{
#region 获取货位
var rGVLocationInfo = _rGVLocationInfoService.GetFreeLocationInfo(item.Roadway);
if (rGVLocationInfo == null)
{
item.ExceptionMessage = $"未找到终点库区【{item.Roadway}】可用空货位!";
}
#endregion
else
{
item.CurrentAddress = item.NextAddress;
item.NextAddress = rGVLocationInfo.LocationCode;
item.Roadway = rGVLocationInfo.RoadwayNo;
fOURBOTnewMovePodTask.priority = item.Grade;
fOURBOTnewMovePodTask.podID = item.PalletCode;
fOURBOTnewMovePodTask.destination = item.NextAddress;
fOURBOTnewMovePodTask.desExt = new
{
unload = 1//是否放下容器,0否1是
};
fOURBOTnewMovePodTask.desType = 2;
string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize());
FOURBOTReturn fOURBOTReturn = response.DeserializeObject();
if (fOURBOTReturn.returnCode == 0)
{
FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID");
item.RGVTaskId = fOURBO.taskID;
item.TaskState = (int)TaskStatusEnum.Puting;
rGVLocationInfo.LocationStatus = LocationStatusEnum.InLock.ObjToInt();
rGVLocationInfos.Add(rGVLocationInfo);
#region 释放入库站台
Dt_StationManger stationManger = _stationMangerService.GetInStationInfo(item.SourceAddress);
stationManger.IsOccupied = LocationStatusEnum.Free.ObjToInt();
stationMangers.Add(stationManger);
#endregion
}
}
}
_taskService.Db.Ado.BeginTran();
_taskService.UpdateData(tasks);
_rGVLocationInfoService.UpdateData(rGVLocationInfos);
_stationMangerService.UpdateData(stationMangers);
_taskService.Db.Ado.CommitTran();
}
catch (Exception ex)
{
WriteError(nameof(TaskJob), ex.Message, ex);
}
}
#endregion
#region 下发外形检测失败任务
public void SendCheckShapeingNGTask(List tasks)
{
FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new();
try
{
Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置");
foreach (var item in tasks)
{
Dt_StationManger stationManger = _stationMangerService.GetInStationInfo(item.SourceAddress);
item.CurrentAddress = item.NextAddress;
item.NextAddress = stationManger.RGVStationCode;
fOURBOTnewMovePodTask.priority = item.Grade;
fOURBOTnewMovePodTask.podID = item.PalletCode;
fOURBOTnewMovePodTask.destination = item.NextAddress;
fOURBOTnewMovePodTask.desExt = new
{
unload = 1//是否放下容器,0否1是
};
fOURBOTnewMovePodTask.desType = 2;
string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize());
FOURBOTReturn fOURBOTReturn = response.DeserializeObject();
if (fOURBOTReturn.returnCode == 0)
{
FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID");
item.RGVTaskId = fOURBO.taskID;
item.TaskState = (int)TaskStatusEnum.Puting;
}
}
_taskService.UpdateData(tasks);
}
catch (Exception ex)
{
WriteError(nameof(TaskJob), ex.Message, ex);
}
}
#endregion
#region 添加移库任务
public void AddMoveTask(List blockPods)
{
try
{
List tasks = new List();
List _UpRGVLocationInfos = new List();
List rGVLocationInfos = _rGVLocationInfoService.Repository.QueryData(x => blockPods.Contains(x.PalletCode));
var FreeLocationInfos = _rGVLocationInfoService.GetFreeLocationInfos();
if (FreeLocationInfos.Count < 1) throw new Exception($"成品库创建移库任务无可用空货位");
foreach (var item in rGVLocationInfos)
{
Dt_RGVLocationInfo? rGVLocationInfo = FreeLocationInfos.Where(x => x.Layer == item.Layer).OrderBy(n => Math.Abs(n.Row - item.Row)).FirstOrDefault();
rGVLocationInfo ??= FreeLocationInfos.First();
Dt_Task dt_Task = new()
{
TaskNum = _taskService.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
//WMSTaskNum = taskDTO.taskCode,
//WMSId = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
Grade = 1,
PalletCode = item.PalletCode,
Roadway = item.RoadwayNo,
TaskState = TaskStatusEnum.RGV_NewMoveTask.ObjToInt(),
TaskType = TaskTypeEnum.CPMoveInventory.ObjToInt(),
SourceAddress = item.LocationCode,
CurrentAddress = item.LocationCode,
NextAddress = rGVLocationInfo.LocationCode,
TargetAddress = rGVLocationInfo.LocationCode,
Creater = "WCS",
};
tasks.Add(dt_Task);
item.LocationStatus = LocationStatusEnum.MoveLock.ObjToInt();
rGVLocationInfo.LocationStatus = LocationStatusEnum.MoveLock.ObjToInt();
_UpRGVLocationInfos.Add(rGVLocationInfo);
FreeLocationInfos.Remove(rGVLocationInfo);
}
_rGVLocationInfoService.UpdateData(rGVLocationInfos);
_rGVLocationInfoService.UpdateData(_UpRGVLocationInfos);
_taskService.AddData(tasks);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
#endregion
#region 下发四向车批量移库任务
public void SendMoveTasks(List tasks)
{
try
{
List dt_Tasks = new List();
List moveBlocks = new List();
Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(MoveBlockPodContentDto)) ?? throw new Exception("未找到四向车批量搬运阻碍托任务接口配置信息!请检查接口配置");
foreach (var item in tasks)
{
MoveBlockPodContentDto moveBlock = new MoveBlockPodContentDto()
{
podID = item.PalletCode,
des = item.TargetAddress
};
moveBlocks.Add(moveBlock);
}
string response = HttpHelper.Post(apiInfo.ApiAddress, moveBlocks.Serialize());
FOURBOTReturn fOURBOTReturn = response.DeserializeObject();
if (fOURBOTReturn.returnCode == 0)
{
MoveBlockPodsDataDto moveBlockPodsData = fOURBOTReturn.data as MoveBlockPodsDataDto ?? throw new Exception("未获取到四向车批量搬运阻碍托返回的任务ID");
foreach (var item in moveBlockPodsData.succList)
{
var task = tasks.First(x => x.PalletCode == item.podID);
task.RGVTaskId = item.taskID;
task.TaskState = TaskStatusEnum.RGV_MoveTaskSend.ObjToInt();
dt_Tasks.Add(task);
}
_taskService.UpdateData(dt_Tasks);
}
}
catch (Exception ex)
{
WriteError(nameof(TaskJob), ex.Message, ex);
}
}
#endregion
#region 处理待移库后出库任务
public void MoveToExecuteTask(List tasks)
{
try
{
foreach (var item in tasks)
{
if (_taskService.Repository.QueryFirst(x => x.Roadway == item.Roadway && x.TaskType == (int)TaskTypeEnum.CPMoveInventory) == null)
item.TaskState = (int)TaskStatusEnum.RGV_WaitSend;
}
_taskService.UpdateData(tasks);
}
catch (Exception ex)
{
WriteError(nameof(TaskJob), ex.Message, ex);
}
}
#endregion
#region 下发出库任务
public void SendOutTask(List tasks)
{
try
{
FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new();
Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置");
foreach (var item in tasks)
{
var stationManger = _stationMangerService.GetOutStationInfo(item.TargetAddress);
if (stationManger.IsOccupied != LocationStatusEnum.Free.ObjToInt()) continue;
#region 下发出库任务
fOURBOTnewMovePodTask.priority = item.Grade;
fOURBOTnewMovePodTask.podID = item.PalletCode;
fOURBOTnewMovePodTask.destination = item.NextAddress;
fOURBOTnewMovePodTask.desExt = new
{
unload = 0//是否放下容器,0否1是
};
fOURBOTnewMovePodTask.desType = 2;
string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize());
FOURBOTReturn fOURBOTReturn = response.DeserializeObject();
if (fOURBOTReturn.returnCode == 0)
{
FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID");
item.RGVTaskId = fOURBO.taskID;
item.TaskState = (int)TaskStatusEnum.Execut;
stationManger.IsOccupied = LocationStatusEnum.Lock.ObjToInt();
_stationMangerService.UpdateData(stationManger);
}
#endregion
}
_taskService.UpdateData(tasks);
}
catch (Exception ex)
{
WriteError(nameof(TaskJob), ex.Message, ex);
}
}
#endregion
}
}