using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Reflection.Emit;
|
using System.Reflection.Metadata;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEAWCS_Common;
|
using WIDESEAWCS_Common.TaskEnum;
|
using WIDESEAWCS_Core;
|
using WIDESEAWCS_Core.Helper;
|
using WIDESEAWCS_DTO;
|
using WIDESEAWCS_DTO.AGV.HIKROBOT;
|
using WIDESEAWCS_DTO.RGV.FOURBOT;
|
using WIDESEAWCS_Model.Models;
|
|
namespace WIDESEAWCS_Tasks
|
{
|
public partial class TaskJob
|
{
|
#region 处理海康AGV任务
|
/// <summary>
|
/// 处理海康不同类型的任务,进行不同的业务逻辑处理(配套任务:修改平库货位信息/换层任务记录小车信息(小车位置层);出入库任务处理库位信息)
|
/// </summary>
|
/// <param name="tasks"></param>
|
public void HIKROBOTTask(List<Dt_Task> tasks)
|
{
|
foreach (var item in tasks)
|
{
|
var content = _taskService.SendHIKROBOTTask(item);
|
}
|
}
|
#endregion
|
|
#region 处理海康待继续执行任务
|
public void SendAGVWaitToExecuteTask(List<Dt_Task> tasks)
|
{
|
foreach (var item in tasks)
|
{
|
var content = _taskService.SendHIKROBOTTask(item);
|
}
|
|
}
|
#endregion
|
|
#region 下发海康1-6楼的AGV任务
|
public void SendAGVTask(List<Dt_Task> tasks)
|
{
|
foreach (var item in tasks)
|
{
|
// 出库任务处理 (从1楼出库到6楼)
|
if (item.TaskType == (int)TaskTypeEnum.Q3CK || item.TaskType == (int)TaskTypeEnum.Q3RK)
|
{
|
// 调用接口获取小车信息
|
var result = _agvcartInfoService.CheckTheCar("MR-Q3-600LE-D(M)(YWGP)");
|
if (result != null && result.Status)
|
{
|
var dataList = result.Data as List<HIKROBOTQueryData>;
|
if (dataList != null && dataList.Any())
|
{
|
// 出库任务:检查是否有在1楼(AA)的小车
|
// Q3CK 是AA→FF的跨楼层任务,只能使用专用小车
|
var code = item.TaskType == (int)TaskTypeEnum.Q3CK ? "AA" : "FF";
|
var specialCarInAA = dataList.FirstOrDefault(d => d.mapCode == code);
|
|
if (specialCarInAA != null)
|
{
|
// 有在1楼的小车,直接执行任务
|
var content = _taskService.SendHIKROBOTTask(item);
|
if (content.Status)
|
{
|
item.TaskState = (int)TaskStatusEnum.Execut;
|
}
|
}
|
else
|
{
|
// 没有专用小车在1楼,需要呼叫专用小车来到1楼
|
var anySpecialCar = dataList.FirstOrDefault();
|
if (anySpecialCar != null)
|
{
|
// 起点:小车当前所在楼层的点位,目标:1楼点位
|
var callCarResult = AddAGVCartInfo(item, anySpecialCar.mapCode, code);
|
if (callCarResult.Status)
|
{
|
// 原任务状态改为等待空车
|
item.TaskState = (int)TaskStatusEnum.WaitingHkAGVMovePosition;
|
}
|
}
|
else
|
{
|
item.ExceptionMessage = "未找到可用AGV小车";
|
}
|
}
|
}
|
}
|
else
|
{
|
item.ExceptionMessage = "获取AGV小车信息失败";
|
}
|
}
|
else if (item.TaskType == (int)TaskTypeEnum.F01)
|
{
|
// F01任务处理:根据目标地址判断需要哪个楼层的小车
|
var result = _agvcartInfoService.CheckTheCar("MR-Q3-600LE-D(M)");
|
|
if (result != null && result.Status)
|
{
|
var dataList = result.Data as List<HIKROBOTQueryData>;
|
if (dataList != null && dataList.Any())
|
{
|
// 从任务的起始地址中提取需要的楼层代码
|
string requiredMapCode = GetMapCodeFromAddress(item.SourceAddress);
|
if (string.IsNullOrEmpty(requiredMapCode))
|
{
|
item.ExceptionMessage = $"无法从目标地址 {item.SourceAddress} 中识别楼层信息";
|
_taskService.UpdateData(item);
|
continue;
|
}
|
|
// 检查是否有在目标楼层的小车
|
var hasRequiredCar = dataList.FirstOrDefault(d => d.mapCode == requiredMapCode);
|
|
if (hasRequiredCar != null)
|
{
|
// 有在目标楼层的小车,直接执行任务
|
var content = _taskService.SendHIKROBOTTask(item);
|
if (content.Status)
|
{
|
item.TaskState = (int)TaskStatusEnum.Execut;
|
}
|
}
|
else
|
{
|
// 没有目标楼层的小车,需要呼叫空车从当前位置到目标楼层
|
var anySpecialCar = dataList.FirstOrDefault(d => d.CarType == "MR-Q3-600LE-D(M)");
|
|
if (anySpecialCar != null)
|
{
|
var callCarResult = AddAGVCartInfo(item, anySpecialCar.mapCode, requiredMapCode);
|
if (callCarResult.Status)
|
{
|
item.TaskState = (int)TaskStatusEnum.WaitingHkAGVMovePosition;
|
}
|
}
|
else
|
{
|
item.ExceptionMessage = "未找到可用AGV小车";
|
}
|
}
|
}
|
}
|
}
|
_taskService.UpdateData(item);
|
}
|
}
|
|
#endregion
|
|
|
#region 处理海康agv搬运任务
|
/// <summary>
|
/// 创建空车呼叫任务:根据小车当前位置和目标楼层,设置任务的起点、当前位置和目标点,并下发给海康接口
|
/// </summary>
|
/// <param name="task"></param>
|
/// <param name="currentMapCode">当前位置</param>
|
/// <param name="targetMapCode">目标地址</param>
|
/// <returns></returns>
|
public WebResponseContent AddAGVCartInfo(Dt_Task task, string currentMapCode, string targetMapCode)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
// 获取起点楼层信息
|
if (!FloorMapping.FloorMap.ContainsKey(currentMapCode))
|
{
|
content.Error($"无效的起点楼层代码:{currentMapCode}");
|
return content;
|
}
|
|
// 获取目标楼层信息
|
if (!FloorMapping.FloorMap.ContainsKey(targetMapCode))
|
{
|
content.Error($"无效的目标楼层代码:{targetMapCode}");
|
return content;
|
}
|
|
var currentFloorInfo = FloorMapping.FloorMap[currentMapCode];
|
var targetFloorInfo = FloorMapping.FloorMap[targetMapCode];
|
|
// 设置任务信息
|
//task.SourceAddress = currentFloorInfo.PointCode; // 起点:小车当前位置的点位
|
//task.CurrentAddress = currentFloorInfo.PointCode; // 当前位置:小车当前位置的点位
|
//task.TargetAddress = targetFloorInfo.PointCode; // 目标点:目标楼层点位
|
//task.NextAddress = targetFloorInfo.PointCode; // 记录目标楼层代码
|
|
Dt_Task newTask = new Dt_Task
|
{
|
WMSTaskNum = "HK_" + task.WMSTaskNum, // 生成唯一的WMS任务号
|
TaskNum = _taskService.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
|
SourceAddress = currentFloorInfo.PointCode,
|
CurrentAddress = currentFloorInfo.PointCode,
|
TargetAddress = targetFloorInfo.PointCode,
|
NextAddress = targetFloorInfo.PointCode,
|
TaskType = (int)TaskTypeEnum.MOVE,
|
Grade = task.Grade,
|
PalletCode = "",
|
TaskState = (int)TaskStatusEnum.CallingHKtransportation,
|
// 复制其他必要字段
|
CreateDate = DateTime.Now,
|
Creater = "System"
|
};
|
var result = _taskService.SendHIKROBOTTask(newTask);
|
if (result.Status)
|
{
|
_taskService.AddData(newTask); // 添加新任务
|
content.OK("空车呼叫任务创建成功", newTask);
|
}
|
else
|
{
|
content.Error("空车呼叫任务下发失败");
|
}
|
return content;
|
}
|
catch (Exception ex)
|
{
|
content.Error($"创建空车呼叫任务失败:{ex.Message}");
|
}
|
return content;
|
}
|
#endregion
|
|
#region 处理agv待空车搬运任务
|
public void SendHKWaitTask(List<Dt_Task> Tasks)
|
{
|
try
|
{
|
List<Dt_Task> Uptasks = new List<Dt_Task>();
|
foreach (var item in Tasks)
|
{
|
var content = _taskService.SendHIKROBOTTask(item);
|
if (content.Status)
|
{
|
item.TaskState = (int)TaskStatusEnum.Execut;
|
Uptasks.Add(item);
|
}
|
}
|
_taskService.UpdateData(Uptasks);
|
|
}
|
catch (Exception ex)
|
{
|
WriteError(nameof(TaskJob), ex.Message, ex);
|
}
|
}
|
#endregion
|
|
/// <summary>
|
/// 从地址中提取楼层代码(AA、BB、CC、DD、EE、FF)
|
/// </summary>
|
/// <param name="address">点位地址</param>
|
/// <returns>楼层代码</returns>
|
private string GetMapCodeFromAddress(string address)
|
{
|
if (string.IsNullOrEmpty(address))
|
return null;
|
|
// 地址格式示例 :AA 对应 0339050AA0309145
|
// keys 是 AA、BB、CC、DD、EE、FF,vule是对应的点位信息
|
foreach (var floorCode in FloorMapping.FloorMap.Keys)
|
{
|
if (address.Contains(floorCode))
|
{
|
return floorCode;//返回的就是AA、BB、CC、DD、EE、FF中的一个,代表对应的楼层
|
}
|
}
|
return null;
|
}
|
|
|
}
|
}
|