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任务
///
/// 处理海康不同类型的任务,进行不同的业务逻辑处理(配套任务:修改平库货位信息/换层任务记录小车信息(小车位置层);出入库任务处理库位信息)
///
///
public void HIKROBOTTask(List tasks)
{
foreach (var item in tasks)
{
var content = _taskService.SendHIKROBOTTask(item);
}
}
#endregion
#region 处理海康待继续执行任务
public void SendAGVWaitToExecuteTask(List tasks)
{
foreach (var item in tasks)
{
var content = _taskService.SendHIKROBOTTask(item);
}
}
#endregion
#region 下发海康1-6楼的AGV任务
public void SendAGVTask(List 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;
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;
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搬运任务
///
/// 创建空车呼叫任务:根据小车当前位置和目标楼层,设置任务的起点、当前位置和目标点,并下发给海康接口
///
///
/// 当前位置
/// 目标地址
///
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 Tasks)
{
try
{
List Uptasks = new List();
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
///
/// 从地址中提取楼层代码(AA、BB、CC、DD、EE、FF)
///
/// 点位地址
/// 楼层代码
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;
}
}
}