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 } }