using HslCommunication; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using OfficeOpenXml.FormulaParsing.Excel.Functions.Information; using Quartz; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Common; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_DTO.TaskInfo; using WIDESEAWCS_DTO.WMS; using WIDESEAWCS_ISystemServices; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_Tasks.ConveyorLineJob; using WIDESEAWCS_Tasks.ElevatorJob; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class CommonAGVJob : JobBase, IJob { private readonly ITaskRepository _taskRepository; private readonly ITaskService _taskService; private readonly ISys_ConfigService _sys_ConfigService; public CommonAGVJob(ITaskRepository taskRepository,ITaskService taskService,ISys_ConfigService configService) { _taskRepository = taskRepository; _taskService = taskService; _sys_ConfigService = configService; } public Task Execute(IJobExecutionContext context) { var RelocationTask = _taskRepository.QueryData(x => _taskService.TaskAcrossFloorboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskAGVCarryStatusEnum.CarryNew); if (RelocationTask.Count > 0) { foreach (var item in RelocationTask) { AGVSendTask(item); } } #region AGV跨楼层任务 var AcrossFloorTask = _taskRepository.QueryFirst(x => x.TaskState == (int)TaskAcrossFloorStatusEnum.CarryNew); if (AcrossFloorTask != null) { var task = _taskRepository.QueryFirst(x => x.TaskState > (int)TaskAcrossFloorStatusEnum.CarryNew && x.TaskState < (int)TaskAcrossFloorStatusEnum.EndAddressExecuting); if(task == null) { CommonElevator? elevator = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "TSJ1") as CommonElevator; if (elevator != null) { if (elevator.GetValue(ElevatorDBName.Model) == 1) { Relocation(AcrossFloorTask); if (AcrossFloorTask.Floor == "1F") { elevator.SetValue(ElevatorDBName.FlagBit, Convert.ToInt16(1)); elevator.SetValue(ElevatorDBName.StartFloor, Convert.ToInt16(1)); elevator.SetValue(ElevatorDBName.EdnFloor, Convert.ToInt16(2)); Thread.Sleep(1000); elevator.SetValue(ElevatorDBName.StartCommand, Convert.ToInt16(1)); _taskService.SendAgvTask("AAA", AcrossFloorTask.TaskNum); //AcrossFloorTask.TaskState = (int)TaskAcrossFloorStatusEnum.FirstCarry; //_taskRepository.UpdateData(AcrossFloorTask); _taskService.UpdateTaskStatusToNext(AcrossFloorTask.TaskNum); } else { elevator.SetValue(ElevatorDBName.FlagBit, Convert.ToInt16(1)); elevator.SetValue(ElevatorDBName.StartFloor, Convert.ToInt16(2)); elevator.SetValue(ElevatorDBName.EdnFloor, Convert.ToInt16(1)); Thread.Sleep(1000); elevator.SetValue(ElevatorDBName.StartCommand, Convert.ToInt16(1)); _taskService.SendAgvTask("DDD", AcrossFloorTask.TaskNum); //AcrossFloorTask.TaskState = (int)TaskAcrossFloorStatusEnum.FirstCarry; //_taskRepository.UpdateData(AcrossFloorTask); _taskService.UpdateTaskStatusToNext(AcrossFloorTask.TaskNum); } } } } } #endregion #region AGV同层搬运任务 Dt_Task Carry = _taskRepository.QueryFirst(x => _taskService.TaskAGVCarryboundStates.Contains(x.TaskState) && x.TaskState == (int)TaskAGVCarryStatusEnum.CarryNew); if (Carry != null) { Relocation(Carry); AGVSendTask(Carry); } #endregion #region 1楼AGV入库任务 var InTask = _taskRepository.QueryFirst(x => x.TaskState == (int)TaskInStatusEnum.InNew); if (InTask != null) { CommonConveyorLine? conveyorLine = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "1001") as CommonConveyorLine; var OutTask = _taskRepository.QueryFirst(x => x.TaskState >= (int)TaskOutStatusEnum.OutNew && x.TaskState < (int)TaskOutStatusEnum.AGV_OutExecuting); var task = _taskRepository.QueryFirst(x => x.TaskState > (int)TaskInStatusEnum.InNew && x.TaskState < (int)TaskInStatusEnum.SC_InFinish); if (OutTask == null) { if (conveyorLine != null) { short InteractiveSignal = conveyorLine.GetValue(ConveyorLineDBName.InteractiveSignal, "LK001"); var structs = BitConverter.GetBytes(InteractiveSignal).Reverse().ToArray().ToBoolArray(); if ((task != null && task.TaskState == (int)TaskInStatusEnum.SC_InExecuting && !structs[1]) || task == null) { bool IsWrite = false; if (structs[0] && !structs[1]) { IsWrite = conveyorLine.Communicator.WriteNoRead("DB100.0", Convert.ToInt32(0)); Thread.Sleep(1000); IsWrite = conveyorLine.Communicator.WriteNoRead("DB100.0", Convert.ToInt32(9999)); if (!IsWrite) { return Task.CompletedTask; } Relocation(InTask); _taskService.SendAgvTask("LIFANG", InTask.TaskNum); _taskService.UpdateTaskStatusToNext(InTask.TaskNum); } } } } } #endregion return Task.CompletedTask; } public void AGVSendTask(Dt_Task task) { if (task.SourceAddress.Contains("XB001") || task.TargetAddress.Contains("XB001")) { _taskService.SendAgvTask("cattleCarry1", task.TaskNum); task.TaskState = (int)TaskAGVCarryStatusEnum.AGV_CarryExecuting; _taskRepository.UpdateData(task); } else if (task.Floor == "1F") { _taskService.SendAgvTask("forkAutoTemplate1", task.TaskNum); task.TaskState = (int)TaskAGVCarryStatusEnum.AGV_CarryExecuting; _taskRepository.UpdateData(task); } else { _taskService.SendAgvTask("cattleCarry1", task.TaskNum); task.TaskState = (int)TaskAGVCarryStatusEnum.AGV_CarryExecuting; _taskRepository.UpdateData(task); } } public void Relocation(Dt_Task? task) { var taskDto = new RequestTaskDto() { Position = task.SourceAddress, PalletCode = task.PalletCode, TaskNum = task.TaskNum }; // 获取WMSip地址 var configz = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); var wmsBasez = configz.Where(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE).FirstOrDefault()?.ConfigValue; var requestLocation = configz.Where(x => x.ConfigKey == SysConfigKeyConst.AGVIsNeedRelocation).FirstOrDefault()?.ConfigValue; if (wmsBasez == null || requestLocation == null) { throw new InvalidOperationException("WMS IP 未配置"); } var wmsIpAddrss = wmsBasez + requestLocation; var result = HttpHelper.PostAsync(wmsIpAddrss, taskDto.ToJsonString()).Result; WebResponseContent content = JsonConvert.DeserializeObject(result); if (!content.Status) { task.ExceptionMessage = content.Message; _taskRepository.UpdateData(task); return; } // 反序列化任务数据 var taskDTO = JsonConvert.DeserializeObject>(content.Data.ToString()); bool IsAddTask = false; foreach (var t in taskDTO) { if (t.TaskNum == task.TaskNum) { IsAddTask = false; break; } else { IsAddTask = true; } } if (IsAddTask) _taskService.ReceiveWMSTask(taskDTO); var taskNew = _taskRepository.QueryData(x => _taskService.TaskRelocationboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskAGVCarryStatusEnum.CarryNew); if (taskNew.Count > 0) { if (taskNew[0].Floor == "2F") { foreach (var item in taskNew.OrderBy(x => x.Grade).ToList()) { AGVSendTask(item); _taskService.UpdateTaskStatusToNext(item.TaskNum); } } else { foreach (var item in taskNew.OrderByDescending(x => x.Grade).ToList()) { AGVSendTask(item); _taskService.UpdateTaskStatusToNext(item.TaskNum); } } } } } }