using AutoMapper;
|
using LogLibrary.Log;
|
using Newtonsoft.Json;
|
using WIDESEAWCS_Common.TaskEnum;
|
using WIDESEAWCS_Core;
|
using WIDESEAWCS_DTO.AGV;
|
using WIDESEAWCS_DTO.TaskInfo;
|
using WIDESEAWCS_IBasicInfoRepository;
|
using WIDESEAWCS_ITaskInfoRepository;
|
using WIDESEAWCS_ITaskInfoService;
|
using WIDESEAWCS_Model.Models;
|
using WIDESEAWCS_QuartzJob;
|
using WIDESEAWCS_Tasks.ConveyorLineJob;
|
using WIDESEAWCS_Tasks.ElevatorJob;
|
|
namespace WIDESEAWCS_Tasks.AGV
|
{
|
public class AGVSignal:IAGVSignal
|
{
|
private readonly ITaskRepository _taskRepository;
|
private readonly ITask_HtyRepository _taskhtyRepository;
|
private readonly ITaskService _taskService;
|
private readonly IDt_StationManagerRepository _stationManagerRepository;
|
private readonly IMapper _mapper;
|
|
public AGVSignal(ITaskRepository taskRepository, ITaskService taskService,IDt_StationManagerRepository stationManagerRepository,ITask_HtyRepository taskhtyRepository, IMapper mapper)
|
{
|
_taskRepository = taskRepository;
|
_taskService = taskService;
|
_stationManagerRepository = stationManagerRepository;
|
_taskhtyRepository = taskhtyRepository;
|
_mapper = mapper;
|
}
|
#region AGV与设备信号交互
|
|
/// <summary>
|
/// AGV--设备交互
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent SignalInteraction(AGVReceiveDTO receiveDTO)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
LogFactory.WriteInfo($"AGV状态上报", $"参数【{JsonConvert.SerializeObject(receiveDTO)}】{Environment.NewLine}{Environment.NewLine}");
|
var task = _taskRepository.QueryFirst(t => t.AGVTaskNum == receiveDTO.orderId);
|
if (task == null)
|
{
|
return content.Error("未找到任务");
|
}
|
|
CommonConveyorLine? commonConveyorLine = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "1001") as CommonConveyorLine;
|
CommonElevator? elevator = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "TSJ1") as CommonElevator;
|
switch (receiveDTO.status)
|
{
|
case 20:
|
content = RequestPickUp(task, commonConveyorLine, elevator);
|
break;
|
case 21:
|
content = PickUpFinish(task, commonConveyorLine, elevator);
|
break;
|
case 22:
|
content = RequestPut(task, commonConveyorLine, elevator);
|
break;
|
case 8:
|
content = PutFinish(task, commonConveyorLine, elevator);
|
break;
|
default:
|
content.Error("未知状态");
|
break;
|
}
|
LogFactory.WriteInfo($"AGV状态上报", $"返回参数【{JsonConvert.SerializeObject(content)}】{Environment.NewLine}{Environment.NewLine}");
|
return content;
|
}
|
catch (Exception ex)
|
{
|
return content.Error(ex.Message);
|
}
|
}
|
|
/// <summary>
|
/// 放货完成
|
/// </summary>
|
/// <param name="task"></param>
|
/// <returns></returns>
|
public WebResponseContent PutFinish(Dt_Task task, CommonConveyorLine commonConveyorLine, CommonElevator elevator)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.AcrossFloorGroup)
|
{
|
if (task.TaskState == (int)TaskAcrossFloorStatusEnum.FirstCarry)
|
{
|
Dt_StationManager stationManager = new Dt_StationManager();
|
string TaskTemplate = string.Empty;
|
if (task.Floor == "1F")
|
{
|
stationManager = _stationManagerRepository.QueryFirst(x => x.stationType == 5 && x.stationFloor == "2F");
|
elevator.SetValue(ElevatorDBName.OneLayerPutFinish, 1);
|
TaskTemplate = "BBB";
|
//请求WMS跨楼层2任务
|
}
|
else
|
{
|
stationManager = _stationManagerRepository.QueryFirst(x => x.stationType == 5 && x.stationFloor == "1F");
|
elevator.SetValue(ElevatorDBName.TwoLayerPutFinish, 1);
|
//请求WMS跨楼层2任务
|
TaskTemplate = "CCC";
|
}
|
task.TaskState = (int)TaskAcrossFloorStatusEnum.FirstCarryFinish;
|
task.ModifyDate = DateTime.Now;
|
task.Modifier = "System";
|
|
Dt_Task_Hty task_Hty = _mapper.Map<Dt_Task_Hty>(task);
|
task_Hty.TaskId = 0;
|
|
_taskRepository.DeleteData(task);
|
_taskhtyRepository.AddData(task_Hty);
|
Random random = new Random();
|
int randomNumber = random.Next(1000, 10000);
|
|
WMSTaskDTO taskDTO = new WMSTaskDTO()
|
{
|
Id = 1,
|
TaskNum = randomNumber,
|
RoadWay = "AGV",
|
TaskType = (int)TaskAcrossFloorTypeEnum.AcrossFloorCarry,
|
TaskState = (int)TaskAcrossFloorStatusEnum.SecondCarry,
|
PalletCode = task.PalletCode,
|
SourceAddress = stationManager.stationChildCode,
|
TargetAddress = task.TargetAddress,
|
Grade = 1,
|
AGVTaskNum = GenerateUniqueId()
|
};
|
Dt_Task SecondCarry = _mapper.Map<Dt_Task>(taskDTO);
|
task.Creater = "WMS";
|
|
SecondCarry.CurrentAddress = stationManager.stationChildCode;
|
|
SecondCarry.NextAddress = task.TargetAddress;
|
|
SecondCarry.Floor = stationManager.stationFloor;
|
|
SecondCarry.AGVSign = "";
|
|
_taskRepository.AddData(SecondCarry);
|
|
_taskService.SendAgvTask(TaskTemplate, SecondCarry.TaskNum);
|
content.OK();
|
}
|
else if (task.TaskState == (int)TaskAcrossFloorStatusEnum.SecondCarry)
|
{
|
task.TaskState = (int)TaskAcrossFloorStatusEnum.SecondCarryFinish;
|
task.ModifyDate = DateTime.Now;
|
task.Modifier = "System";
|
|
Dt_Task_Hty task_Hty = _mapper.Map<Dt_Task_Hty>(task);
|
task_Hty.TaskId = 0;
|
|
_taskRepository.DeleteData(task);
|
_taskhtyRepository.AddData(task_Hty);
|
}
|
}
|
if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.CarryGroup)
|
{
|
_taskService.UpdateTaskStatusToNext(task.TaskNum);
|
}
|
if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
|
{
|
if (task.TaskState == (int)TaskOutStatusEnum.AGV_OutExecuting)
|
{
|
_taskService.UpdateTaskStatusToNext(task.TaskNum);
|
}
|
}
|
else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
|
{
|
commonConveyorLine.SetValue(ConveyorLineDBName.PutFinish, 1, "LK001");
|
commonConveyorLine.Communicator.WriteNoRead("DB100.0", 9990);
|
commonConveyorLine.Communicator.WriteNoRead("DB100.4", Convert.ToInt16(task.TaskNum));
|
task.TaskState = (int)TaskInStatusEnum.Line_InExecuting;
|
_taskRepository.UpdateData(task);
|
content.OK();
|
}
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
|
/// <summary>
|
/// 取货完成
|
/// </summary>
|
/// <param name="task"></param>
|
/// <returns></returns>
|
public WebResponseContent PickUpFinish(Dt_Task task, CommonConveyorLine commonConveyorLine, CommonElevator elevator)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.AcrossFloorGroup)
|
{
|
if (task.TaskState == (int)TaskAcrossFloorStatusEnum.SecondCarry)
|
{
|
if (task.Floor == "1F")
|
{
|
elevator.SetValue(ElevatorDBName.OneLayerPickUpFinish, 1);
|
}
|
else
|
{
|
elevator.SetValue(ElevatorDBName.TwoLayerPickUpFinish, 1);
|
}
|
}
|
}
|
|
if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
|
{
|
commonConveyorLine.SetValue(ConveyorLineDBName.PickUpFinish, 1, "LK001");
|
task.TaskState = (int)TaskOutStatusEnum.AGV_OutExecuting;
|
_taskRepository.UpdateData(task);
|
content.OK();
|
}
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
|
/// <summary>
|
/// 请求取货
|
/// </summary>
|
/// <param name="task"></param>
|
/// <returns></returns>
|
public WebResponseContent RequestPickUp(Dt_Task task, CommonConveyorLine commonConveyorLine, CommonElevator elevator)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.AcrossFloorGroup)
|
{
|
if (task.TaskState == (int)TaskAcrossFloorStatusEnum.SecondCarry)
|
{
|
if (task.Floor == "1F")
|
{
|
if (elevator.GetValue<ElevatorDBName, short>(ElevatorDBName.OneLayerAllowPickUp) == 1)
|
{
|
_taskService.ContinueAgvTask(task.AGVTaskNum);
|
content.OK();
|
}
|
else
|
{
|
task.AGVSign = "RequestPickUp";
|
_taskRepository.UpdateData(task);
|
content.Error("设备不允许取货");
|
}
|
}
|
else
|
{
|
if (elevator.GetValue<ElevatorDBName, short>(ElevatorDBName.TwoLayerAllowPickUp) == 1)
|
{
|
_taskService.ContinueAgvTask(task.AGVTaskNum);
|
content.OK();
|
}
|
else
|
{
|
task.AGVSign = "RequestPickUp";
|
_taskRepository.UpdateData(task);
|
content.Error("设备不允许取货");
|
}
|
}
|
}
|
}
|
|
if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
|
{
|
if (commonConveyorLine.GetValue<ConveyorLineDBName, short>(ConveyorLineDBName.AllowPickUp, "LK001") == 1)
|
{
|
_taskService.ContinueAgvTask(task.AGVTaskNum);
|
task.TaskState = (int)TaskOutStatusEnum.Line_OutFinish;
|
_taskRepository.UpdateData(task);
|
content.OK();
|
}
|
else
|
{
|
task.AGVSign = "RequestPickUp";
|
_taskRepository.UpdateData(task);
|
content.Error("设备不允许取货");
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
task.AGVSign = "RequestPickUp";
|
_taskRepository.UpdateData(task);
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
|
/// <summary>
|
/// 请求放货
|
/// </summary>
|
/// <param name="task"></param>
|
/// <returns></returns>
|
public WebResponseContent RequestPut(Dt_Task task, CommonConveyorLine commonConveyorLine, CommonElevator elevator)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.AcrossFloorGroup)
|
{
|
if (task.TaskState == (int)TaskAcrossFloorStatusEnum.FirstCarry)
|
{
|
if (task.Floor == "1F")
|
{
|
if (elevator.GetValue<ElevatorDBName, short>(ElevatorDBName.OneLayerAllowPut) == 1)
|
{
|
_taskService.ContinueAgvTask(task.AGVTaskNum);
|
content.OK();
|
}
|
else
|
{
|
task.AGVSign = "RequestPut";
|
_taskRepository.UpdateData(task);
|
content.Error("设备不允许放货");
|
}
|
}
|
else
|
{
|
if (elevator.GetValue<ElevatorDBName, short>(ElevatorDBName.TwoLayerAllowPut) == 1)
|
{
|
_taskService.ContinueAgvTask(task.AGVTaskNum);
|
content.OK();
|
}
|
else
|
{
|
task.AGVSign = "RequestPut";
|
_taskRepository.UpdateData(task);
|
content.Error("设备不允许放货");
|
}
|
}
|
}
|
}
|
|
if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
|
{
|
if (commonConveyorLine.GetValue<ConveyorLineDBName, short>(ConveyorLineDBName.AllowPut, "LK001") == 1)
|
{
|
_taskService.ContinueAgvTask(task.AGVTaskNum);
|
content.OK();
|
}
|
else
|
{
|
task.AGVSign = "RequestPut";
|
_taskRepository.UpdateData(task);
|
content.Error("设备不允许取货");
|
}
|
|
}
|
|
}
|
catch (Exception ex)
|
{
|
task.AGVSign = "RequestPut";
|
_taskRepository.UpdateData(task);
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
|
#endregion
|
|
#region 获取AGV任务号
|
|
private static readonly Random _random = new Random();
|
|
|
public static string GenerateUniqueId()
|
{
|
// 获取当前毫秒级时间戳
|
long timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
|
|
// 生成4位随机数(0000-9999)
|
int randomNumber = _random.Next(0, 10000);
|
string randomPart = randomNumber.ToString("D4"); // 补零到4位
|
|
return $"{timestamp}{randomPart}";
|
}
|
#endregion
|
}
|
}
|