using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
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;
using WIDESEAWCS_Core.BaseRepository;
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
{
///
/// 下发四向车新建入库任务
///
///
public void SendRGVNewInTask(List tasks)
{
FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new();
WebResponseContent content = new WebResponseContent();
try
{
Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置");
int i = 0;
foreach (var task in tasks)
{
i++;
fOURBOTnewMovePodTask = new()
{
priority = task.Grade,
podID = task.PalletCode,
desExt = new
{
unload = 0//是否放下容器,0否1是
},
desStationCodes = task.SourceAddress,
desType = 5
};
fOURBOTnewMovePodTask.requestID += i;
try
{
string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize());
FOURBOTReturn fOURBOTReturn = response.DeserializeObject();
content.OK(data: fOURBOTReturn);
if (fOURBOTReturn.returnCode != 0) throw new Exception(fOURBOTReturn.returnUserMsg);
string dataJson = fOURBOTReturn.data.ToString();
FOURBOTnewMovePodTaskResponseData? fOURBO = JsonConvert.DeserializeObject(dataJson);
if (fOURBO == null || fOURBO.taskID == 0)
{
throw new Exception($"未获取到四向车返回的任务ID,返回数据:{response}");
}
//FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID");
task.RGVTaskId = fOURBO.taskID;
task.ExceptionMessage = "";
task.TaskState = (int)TaskStatusEnum.Execut;
}
catch (Exception ex)
{
task.ExceptionMessage = ex.Message;
}
}
_taskService.UpdateData(tasks);
content.OK();
}
catch (Exception ex)
{
content.Error(ex.Message);
}
finally
{
_trackloginfoService.AddTrackLog(fOURBOTnewMovePodTask, content, "下发四向车新建入库任务", "", "");
}
}
#region
///
/// 下发四向车外形检测任务
///
///
public void SendRGVCheckShapeTask(List tasks)
{
FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new();
WebResponseContent content = new WebResponseContent();
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.taskExt = new
{
keepRobot = 1,
keepRobotTimeout = 1
};
fOURBOTnewMovePodTask.desType = 1;
fOURBOTnewMovePodTask.desNodeID = item.NextAddress;
string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize());
FOURBOTReturn fOURBOTReturn = response.DeserializeObject();
content.OK(data: fOURBOTReturn);
if (fOURBOTReturn.returnCode == 0)
{
string dataJson = fOURBOTReturn.data.ToString();
FOURBOTnewMovePodTaskResponseData? fOURBO = JsonConvert.DeserializeObject(dataJson);
if (fOURBO == null || fOURBO.taskID == 0)
{
throw new Exception($"未获取到四向车返回的任务ID,返回数据:{response}");
}
//FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID");
item.RGVTaskId = fOURBO.taskID;
item.TaskState = (int)TaskStatusEnum.TakeFinish;
}
}
_taskService.UpdateData(tasks);
content.OK();
}
catch (Exception ex)
{
content.Error(ex.Message);
}
finally
{
_trackloginfoService.AddTrackLog(fOURBOTnewMovePodTask, content, "下发四向车新建入库任务", "", "");
}
}
#endregion
#region 处理出库任务是否需要移库
///
/// 处理出库任务是否需要移库
///
///
public void IsMoveTask(List tasks)
{
object requestData = null; // 添加变量记录请求数据
WebResponseContent content = new WebResponseContent();
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();
var request = new GetBlockPodContentListDto
{
content = new List
{
new GetBlockPodContentDto
{
candidatePodIDs = PalletCodes,
num = 0 // 0表示全部出,如果需要限制数量可以调整
}
}
};
requestData = request; // 保存请求数据用于日志
//content.candidatePodIDs = tasks.Select(x => x.PalletCode).ToList();
string response = HttpHelper.Post(apiInfo.ApiAddress, request.Serialize());
FOURBOTReturn fOURBOTReturn = response.DeserializeObject();
content.OK(data: fOURBOTReturn);
if (fOURBOTReturn.returnCode == 0)
{
//ReturnBlockPodResultDto getBlockPod = fOURBOTReturn.data as ReturnBlockPodResultDto ?? throw new Exception("未获取到阻碍托盘关系数据");
var dataJson = fOURBOTReturn.data.ToString();
ReturnBlockPodResultDto? getBlockPod = JsonConvert.DeserializeObject(dataJson);
if (getBlockPod.Result.Count == 0)
{
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 != null && item.blockPods.Count > 0)
{
var responseContent = AddMoveTask(item.blockPods, task);//添加移库任务
if (!responseContent.Status) task.ExceptionMessage = responseContent.Message;
else task.TaskState = (int)TaskStatusEnum.RGV_WaitMoveToExecute;
dt_Tasks.Add(task);
}
else
{
task.TaskState = (int)TaskStatusEnum.RGV_WaitSend;
dt_Tasks.Add(task);
}
}
}
_taskService.UpdateData(dt_Tasks);
content.OK();
}
}
catch (Exception ex)
{
content.Error(ex.Message);
}
finally
{
_trackloginfoService.AddTrackLog(requestData, content, "处理出库任务是否需要移库", "", "");
}
}
#endregion
#region 下发外形检测成功任务
///
/// 下发外形检测成功任务
///
///
public void SendCheckShapeingOkTask(List tasks)
{
FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new();
WebResponseContent content = new WebResponseContent();
try
{
Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置");
var tasksToUpdate = new List();
var locationsToUpdate = new List();
var stationsToUpdate = new List();
#region 任务下发
var item = tasks.FirstOrDefault();
if (item != null)
{
try
{
#region 获取货位
var rGVLocationInfo = _rGVLocationInfoService.GetInFreeLocationInfo(item.Roadway.ObjToInt());
if (rGVLocationInfo == null)
{
item.ExceptionMessage = $"未找到终点库区【{item.Roadway}】可用空货位!";
}
#endregion
else
{
fOURBOTnewMovePodTask = new FOURBOTnewMovePodTask
{
priority = item.Grade,
podID = item.PalletCode,
desStorageID = rGVLocationInfo.LocationCode,
//destination = rGVLocationInfo.LocationCode,
desExt = new { unload = 1 }, // 是否放下容器,0否1是
desType = 2
};
fOURBOTnewMovePodTask.taskExt = new
{
autoToRest = 1
};
item.CurrentAddress = item.NextAddress;
item.NextAddress = rGVLocationInfo.LocationCode;
item.TargetAddress = rGVLocationInfo.LocationCode;
item.Roadway = rGVLocationInfo.RoadwayNo;
string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize());
var fOURBOTReturn = response.DeserializeObject();
content.OK(data: fOURBOTReturn);
if (fOURBOTReturn.returnCode == 0)
{
var data = fOURBOTReturn.data.ToString();
var fOURBO = data.DeserializeObject();
item.RGVTaskId = fOURBO.taskID;
item.TaskState = (int)TaskStatusEnum.Puting;
rGVLocationInfo.LocationStatus = LocationStatusEnum.InLock.ObjToInt();
locationsToUpdate.Add(rGVLocationInfo);
#region 释放入库站台
//var stationManger = _stationMangerService.GetInStationInfo(item.SourceAddress);
//if (stationManger != null)
//{
// stationManger.IsOccupied = LocationStatusEnum.Free.ObjToInt();
// stationsToUpdate.Add(stationManger);
//}
content.OK();
#endregion
}
else
{
item.ExceptionMessage = $"四向车接口返回错误:{fOURBOTReturn.returnMsg}";
// 记录失败的任务
content.Error($"四向车接口返回错误:{fOURBOTReturn.returnMsg}");
}
tasksToUpdate.Add(item);
}
}
catch (Exception ex)
{
item.ExceptionMessage = $"处理任务异常:{ex.Message}";
//WriteError($"{nameof(TaskJob)}-{item.TaskId}", ex.Message, ex);
content.Error($"四向车接口返回错误:{ex.Message}");
}
}
#region MyRegion
//foreach (var item in tasks)
//{
// try
// {
// #region 获取货位
// var rGVLocationInfo = _rGVLocationInfoService.GetFreeLocationInfo(item.Roadway);
// if (rGVLocationInfo == null)
// {
// item.ExceptionMessage = $"未找到终点库区【{item.Roadway}】可用空货位!";
// continue;
// }
// #endregion
// fOURBOTnewMovePodTask = new FOURBOTnewMovePodTask
// {
// priority = item.Grade,
// podID = item.PalletCode,
// desStorageID = rGVLocationInfo.LocationCode,
// //destination = rGVLocationInfo.LocationCode,
// desExt = new { unload = 1 }, // 是否放下容器,0否1是
// desType = 2
// };
// fOURBOTnewMovePodTask.taskExt = new
// {
// autoToRest = 1
// };
// item.CurrentAddress = item.NextAddress;
// item.NextAddress = rGVLocationInfo.LocationCode;
// item.TargetAddress = rGVLocationInfo.LocationCode;
// item.Roadway = rGVLocationInfo.RoadwayNo;
// string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize());
// var fOURBOTReturn = response.DeserializeObject();
// content.Data = fOURBOTReturn;
// if (fOURBOTReturn.returnCode == 0)
// {
// var data = fOURBOTReturn.data.ToString();
// var fOURBO = data.DeserializeObject();
// item.RGVTaskId = fOURBO.taskID;
// item.TaskState = (int)TaskStatusEnum.Puting;
// rGVLocationInfo.LocationStatus = LocationStatusEnum.InLock.ObjToInt();
// locationsToUpdate.Add(rGVLocationInfo);
// #region 释放入库站台
// var stationManger = _stationMangerService.GetInStationInfo(item.SourceAddress);
// if (stationManger != null)
// {
// stationManger.IsOccupied = LocationStatusEnum.Free.ObjToInt();
// stationsToUpdate.Add(stationManger);
// }
// content.OK();
// #endregion
// }
// else
// {
// item.ExceptionMessage = $"四向车接口返回错误:{fOURBOTReturn.returnMsg}";
// // 记录失败的任务
// content.Error($"四向车接口返回错误:{fOURBOTReturn.returnMsg}");
// }
// }
// catch (Exception ex)
// {
// item.ExceptionMessage = $"处理任务异常:{ex.Message}";
// //WriteError($"{nameof(TaskJob)}-{item.TaskId}", ex.Message, ex);
// content.Error($"四向车接口返回错误:{ex.Message}");
// }
// tasksToUpdate.Add(item);
//}
#endregion
#endregion
#region 更新数据
// 如果有需要更新的数据,才执行事务
if (tasksToUpdate.Any() || locationsToUpdate.Any() || stationsToUpdate.Any())
{
try
{
_unitOfWorkManage.BeginTran();
if (tasksToUpdate.Any())
_taskService.UpdateData(tasksToUpdate);
if (locationsToUpdate.Any())
_rGVLocationInfoService.UpdateData(locationsToUpdate);
//if (stationsToUpdate.Any())
// _stationMangerService.UpdateData(stationsToUpdate);
_unitOfWorkManage.CommitTran();
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
WriteError(nameof(TaskJob), ex.Message, ex);
}
}
#endregion
}
catch (Exception ex)
{
WriteError(nameof(TaskJob), ex.Message, ex);
content.Error($"下发外形检测任务失败{ex.Message}");
}
finally
{
_trackloginfoService.AddTrackLog(fOURBOTnewMovePodTask, content, "下发外形检测任务失败", "", "");
}
}
#endregion
#region 下发外形检测失败任务
public void SendCheckShapeingNGTask(List tasks)
{
FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new();
WebResponseContent content = new WebResponseContent();
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.StationCode;
fOURBOTnewMovePodTask.priority = item.Grade;
fOURBOTnewMovePodTask.podID = item.PalletCode;
//fOURBOTnewMovePodTask.desNodeID = item.NextAddress;
fOURBOTnewMovePodTask.desStationCodes = item.NextAddress;
fOURBOTnewMovePodTask.desExt = new
{
unload = 1//是否放下容器,0否1是
};
fOURBOTnewMovePodTask.taskExt = new
{
autoToRest = 1
};
fOURBOTnewMovePodTask.desType = 5;
string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize());
FOURBOTReturn fOURBOTReturn = response.DeserializeObject();
content.Data = fOURBOTReturn;
if (fOURBOTReturn.returnCode == 0)
{
//FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID");
string dataJson = fOURBOTReturn.data.ToString();
FOURBOTnewMovePodTaskResponseData? fOURBO = JsonConvert.DeserializeObject(dataJson);
content.OK(data: fOURBO);
if (fOURBO == null || fOURBO.taskID == 0)
{
throw new Exception($"未获取到四向车返回的任务ID,返回数据:{response}");
}
item.RGVTaskId = fOURBO.taskID;
item.TaskState = (int)TaskStatusEnum.Puting;
}
}
_taskService.UpdateData(tasks);
content.OK();
}
catch (Exception ex)
{
content.Error(ex.Message);
}
finally
{
_trackloginfoService.AddTrackLog(fOURBOTnewMovePodTask, content, "下发外形检测失败任务", "", "");
}
}
#endregion
#region 添加移库任务
public WebResponseContent AddMoveTask(List blockPods, Dt_Task task)
{
WebResponseContent content = new WebResponseContent();
try
{
List rGVLocationInfos = _rGVLocationInfoService.Repository.QueryData(x => blockPods.Contains(x.PalletCode));
var Items = _rGVLocationInfoService.GetMoveFreeLocationInfo(rGVLocationInfos);
List tasks = Items.Item1;
List _UpRGVLocationInfos = Items.Item2;
if (tasks.Count < blockPods.Count) throw new Exception("可移库空货位少于需移库托盘数量");
tasks.ForEach(x =>
{
x.TaskNum = _taskService.GetTaskNum(nameof(SequenceEnum.SeqTaskNum));
x.WMSTaskNum = task.WMSTaskNum;
});
rGVLocationInfos.ForEach(x =>
{
x.LocationStatus = LocationStatusEnum.MoveLock.ObjToInt();
});
_UpRGVLocationInfos.ForEach(x =>
{
x.LocationStatus = LocationStatusEnum.MoveLock.ObjToInt();
});
try
{
_unitOfWorkManage.BeginTran();
_rGVLocationInfoService.UpdateData(rGVLocationInfos);
_rGVLocationInfoService.UpdateData(_UpRGVLocationInfos);
_taskService.AddData(tasks);
_unitOfWorkManage.CommitTran();
content.OK();
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
throw new Exception(ex.Message);
}
}
catch (Exception ex)
{
content.Error(ex.Message);
}
return content;
}
#endregion
#region 下发四向车批量移库任务
public void SendMoveTasks(List tasks)
{
WebResponseContent content = new WebResponseContent();
List dt_Tasks = new List();
MoveBlockPodContentDto moveBlock = new MoveBlockPodContentDto();
try
{
Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(MoveBlockPodContentDto)) ?? throw new Exception("未找到四向车批量搬运阻碍托任务接口配置信息!请检查接口配置");
foreach (var item in tasks)
{
MoveBlockPodContentDtoInfo moveBlockInfo = new MoveBlockPodContentDtoInfo()
{
podID = item.PalletCode,
des = item.TargetAddress
};
moveBlock.content.Add(moveBlockInfo);
}
string response = HttpHelper.Post(apiInfo.ApiAddress, moveBlock.Serialize());
FOURBOTReturn fOURBOTReturn = response.DeserializeObject();
content.OK(data: fOURBOTReturn);
if (fOURBOTReturn.returnCode == 0)
{
string dataJson = fOURBOTReturn.data.ToString();
//MoveBlockPodsDataDto moveBlockPodsData = fOURBOTReturn.data as MoveBlockPodsDataDto ?? throw new Exception("未获取到四向车批量搬运阻碍托返回的任务ID");
MoveBlockPodsDataDto? moveBlockPodsData = JsonConvert.DeserializeObject(dataJson);
if (moveBlockPodsData == null || moveBlockPodsData.succList.Count == 0)
{
throw new Exception($"未获取到四向车返回的任务ID,返回数据:{response}");
}
foreach (var item in moveBlockPodsData.succList)
{
if (item.taskID == 0)
continue; // 跳过无效的任务ID
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);
content.OK();
}
}
catch (Exception ex)
{
content.Error(ex.Message);
}
finally
{
_trackloginfoService.AddTrackLog(moveBlock, content, "下发四向车批量移库任务", "", "");
}
}
#endregion
#region 处理待移库后出库任务
public void MoveToExecuteTask(List tasks)
{
try
{
foreach (var item in tasks)
{
var takes = _taskService.Repository.QueryFirst(x => x.Roadway == item.Roadway && x.TaskType == (int)TaskTypeEnum.CPMoveInventory);
if (takes == 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)
{
FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new();
WebResponseContent content = new WebResponseContent();
try
{
Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置");
var i = 0;
foreach (var item in tasks)
{
i++;
var stationManger = _stationMangerService.GetOutStationInfo(item.TargetAddress);
//if (stationManger.IsOccupied != LocationStatusEnum.Free.ObjToInt())
//{
// item.ExceptionMessage = $"出库站台【{stationManger.StationCode}】被占用";
// continue;
//}
item.NextAddress = stationManger.StationCode;
#region 下发出库任务
fOURBOTnewMovePodTask.priority = item.Grade;
fOURBOTnewMovePodTask.podID = item.PalletCode;
//fOURBOTnewMovePodTask.desNodeID = item.NextAddress;
fOURBOTnewMovePodTask.desStationCodes = item.NextAddress;
fOURBOTnewMovePodTask.desExt = new
{
unload = 1//是否放下容器,0否1是
};
fOURBOTnewMovePodTask.taskExt = new
{
autoToRest = 1
};
fOURBOTnewMovePodTask.desType = 5;
fOURBOTnewMovePodTask.requestID = DateTime.Now.ToString("yyyyMMddHHmmss") + i;
string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize());
FOURBOTReturn fOURBOTReturn = response.DeserializeObject();
content.OK(data: fOURBOTReturn);
if (fOURBOTReturn.returnCode == 0)
{
string dataJson = fOURBOTReturn.data.ToString();
FOURBOTnewMovePodTaskResponseData? fOURBO = JsonConvert.DeserializeObject(dataJson);
if (fOURBO == null || fOURBO.taskID == 0)
{
throw new Exception($"未获取到四向车返回的任务ID,返回数据:{response}");
}
item.RGVTaskId = fOURBO.taskID;
item.TaskState = (int)TaskStatusEnum.Execut;
//stationManger.IsOccupied = LocationStatusEnum.Lock.ObjToInt();
//_stationMangerService.UpdateData(stationManger);
}
#endregion
}
_taskService.UpdateData(tasks);
content.OK();
}
catch (Exception ex)
{
content.Error(ex.Message);
}
finally
{
_trackloginfoService.AddTrackLog(fOURBOTnewMovePodTask, content, "下发四向车出库任务", "", "");
}
}
#endregion
}
}