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与设备信号交互
///
/// AGV--设备交互
///
///
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);
}
}
///
/// 放货完成
///
///
///
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(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(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(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;
}
///
/// 取货完成
///
///
///
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;
}
///
/// 请求取货
///
///
///
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.OneLayerAllowPickUp) == 1)
{
_taskService.ContinueAgvTask(task.AGVTaskNum);
content.OK();
}
else
{
task.AGVSign = "RequestPickUp";
_taskRepository.UpdateData(task);
content.Error("设备不允许取货");
}
}
else
{
if (elevator.GetValue(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.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;
}
///
/// 请求放货
///
///
///
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.OneLayerAllowPut) == 1)
{
_taskService.ContinueAgvTask(task.AGVTaskNum);
content.OK();
}
else
{
task.AGVSign = "RequestPut";
_taskRepository.UpdateData(task);
content.Error("设备不允许放货");
}
}
else
{
if (elevator.GetValue(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.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
}
}