using HslCommunication; using Newtonsoft.Json; using Newtonsoft.Json.Linq; 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) { #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) { 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); } 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); } } } } } #endregion #region AGV同层搬运任务 var CarryTask = _taskRepository.QueryData(x => x.TaskType == (int)TaskAGVCarryTypeEnum.CarryReloction && x.TaskState == (int)TaskAGVCarryStatusEnum.CarryNew); var Carry = _taskRepository.QueryFirst(x => x.TaskState == (int)TaskAGVCarryStatusEnum.CarryNew); if (CarryTask .Count>0) { foreach (var item in CarryTask) { AGVSendTask(item); } } if (Carry != null) { var task = _taskRepository.QueryFirst(x => x.TaskState > (int)TaskAGVCarryStatusEnum.CarryNew); if (task == null) { var taskDto = new RequestTaskDto() { Position = Carry.SourceAddress, PalletCode = Carry.PalletCode, TaskNum = Carry.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) { Carry.ExceptionMessage = content.Message; _taskRepository.UpdateData(Carry); return null; } // 反序列化任务数据 var taskDTO = JsonConvert.DeserializeObject>(content.Data.ToString()); bool IsAddTask = false; foreach (var t in taskDTO) { if (t.TaskNum == Carry.TaskNum) { IsAddTask = true; break; } else { IsAddTask = true; } } if (IsAddTask) _taskService.ReceiveWMSTask(taskDTO); var taskNew = _taskRepository.QueryData(x => x.TaskType == (int)TaskAGVCarryTypeEnum.CarryReloction && x.TaskState == (int)TaskAGVCarryStatusEnum.CarryNew); if (taskNew.Count > 0) { if (taskNew[0].Remark == "2") { foreach (var item in taskNew.OrderBy(x => x.Grade).ToList()) { AGVSendTask(item); } } else { foreach (var item in taskNew.OrderByDescending(x => x.Grade).ToList()) { AGVSendTask(item); } } } AGVSendTask(Carry); } } #endregion #region 1楼AGV入库任务 var InTask = _taskRepository.QueryFirst(x => x.TaskState == (int)TaskInStatusEnum.InNew); if (InTask != null) { 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_InExecuting); if (OutTask == null && task == null) { CommonConveyorLine? conveyorLine = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "1001") as CommonConveyorLine; if (conveyorLine != null) { bool IsWrite = false; short InteractiveSignal = conveyorLine.GetValue(ConveyorLineDBName.InteractiveSignal, "LK001"); var structs = BitConverter.GetBytes(InteractiveSignal).Reverse().ToArray().ToBoolArray(); if (structs[0]) { IsWrite = conveyorLine.Communicator.WriteNoRead("DB100.0", 0); Thread.Sleep(1000); IsWrite = conveyorLine.Communicator.WriteNoRead("DB100.0", 9999); if (!IsWrite) { return Task.CompletedTask; } _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); } } } }