using Microsoft.Extensions.Logging; using SlnMesnac.Repository.service; using System; using System.Collections.Generic; using System.Threading.Tasks; using SlnMesnac.Repository; using SlnMesnac.Repository.service.Impl; using TouchSocket.Sockets; using SlnMesnac.Model.domain; using SlnMesnac.TouchSocket; using System.Timers; using SlnMesnac.Model.Enum; using HslCommunication.Enthernet; using System.Threading; namespace SlnMesnac.Business.@base { public class BaseTaskInfoBusiness { private TcpServer _tcpServer = null; public Action _Taskaction; public Action _RefreshLogMessageAction; private static BaseTaskInfoBusiness instance; private ILogger _logger; private IAirportTaskService _Taskservice; private IAGVStateService _AGVStateService; public BaseTaskInfoBusiness(ILogger logger, IAirportTaskService Taskservice, IAGVStateService agvService, TcpServer tcpServer) { _logger = logger; _tcpServer = tcpServer; _Taskservice = Taskservice; _AGVStateService = agvService; InitClearTimer(); //doWhileGetAGVTaskInfo(); } public static BaseTaskInfoBusiness GetInstance(ILogger logger, IAirportTaskService Taskservice, IAGVStateService agvService, TcpServer tcpServer) { if (instance == null) { instance = new BaseTaskInfoBusiness(logger, Taskservice,agvService, tcpServer); } return instance; } private void doWhileGetAGVTaskInfo() { try { Task.Run((() => { while (true) { GetAGVTaskInfo(null,null); Task.Delay(1000); } })); } catch (Exception ex) { } } private void InitClearTimer() { System.Timers.Timer timer = new System.Timers.Timer { Interval = 1000, // 每天执行一次 AutoReset = true, }; timer.Elapsed += GetAGVTaskInfo; timer.Start(); } /// /// 获取任务列表 /// private void GetAGVTaskInfo(object source, ElapsedEventArgs e) { try { List Task = _Taskservice.GetAGVTaskInfos(); if (Task != null) { if (Task.Count > 0) { _RefreshLogMessageAction?.Invoke("任务数量:" + Task.Count); foreach (var TaskItem in Task) { //AGV未派发,AMR未派发 if (string.IsNullOrEmpty(TaskItem.agvno) && string.IsNullOrEmpty(TaskItem.manipulatorno)) { _RefreshLogMessageAction?.Invoke($"正在为AGV,AMR分配任务..."); _logger.LogInformation($"正在为AGV,AMR分配任务"); //查询AGV设备状态及AMR设备状态 //这里要看AGV是否会立刻更新状态 CreateAGVTask(TaskItem); //查询机械臂状态 } //AGV已派发,AMR未派发 if (!string.IsNullOrEmpty(TaskItem.agvno) && string.IsNullOrEmpty(TaskItem.manipulatorno)) { //查询AMR状态 CreateAMRTask(TaskItem); _RefreshLogMessageAction?.Invoke($"正在为AMR分配任务..."); _logger.LogInformation($"正在为AMR分配任务"); } //AGV未派发,AMR已派发 if (string.IsNullOrEmpty(TaskItem.agvno) && !string.IsNullOrEmpty(TaskItem.manipulatorno)) { _RefreshLogMessageAction?.Invoke($"正在为AGV分配任务..."); _logger.LogInformation($"正在为AGV分配任务"); } _Taskaction?.Invoke(TaskItem); } } } } catch (Exception ex) { } } /// /// 向AMR派发任务 /// /// /// private bool CreateAMRTask(AirportTask AirportTask) { bool iflag = false; try { iflag = true; List State = GetAgvState(AgvType.AMR); foreach (var AgvItem in State) { //根据规则筛选最优AGV if (AgvItem.agvworkstate == "任务空闲") { _logger.LogInformation($"获取空闲AMR列表"); _RefreshLogMessageAction?.Invoke("执行站台[" + AirportTask.conveyorno + "],下发" + "[" + AirportTask.taskno + "]任务"); //调用派发任务接口,向任务状态为任务空闲的AGV派发任务 bool iTaskflag = true; if (iTaskflag) { _RefreshLogMessageAction?.Invoke("[" + AgvItem.agvno + "]AMR,执行任务[" + AirportTask.taskno + "]"); AgvItem.taskno = AirportTask.taskno; AgvItem.agvworkstate = "任务执行中"; AgvItem.refreshtime = DateTime.Now; _AGVStateService.UpdateAsync(AgvItem); //更新任务信息表状态为执行中 AirportTask.manipulatorno = AgvItem.agvno; AirportTask.taskstate = "执行中"; _Taskservice.UpdateTaskAsync(AirportTask); break; } } } return iflag; } catch (Exception ex) { return iflag; } } /// /// 向AGV派发任务 /// /// private bool CreateAGVTask(AirportTask AirportTask) { bool iflag = false; try { iflag = true; List State = GetAgvState(AgvType.AGV); foreach (var AgvItem in State) { //根据规则筛选最优AGV if (AgvItem.agvworkstate == "任务空闲") { _logger.LogInformation($"获取空闲AGV列表"); _RefreshLogMessageAction?.Invoke("执行站台[" + AirportTask.conveyorno + "],下发" + "[" + AirportTask.taskno + "]任务"); //调用派发任务接口,向任务状态为任务空闲的AGV派发任务 bool iTaskflag = true; if (iTaskflag) { _RefreshLogMessageAction?.Invoke("[" + AgvItem.agvno + "]AGV,执行任务[" + AirportTask.taskno + "]"); AgvItem.taskno = AirportTask.taskno; AgvItem.agvworkstate = "任务执行中"; AgvItem.refreshtime = DateTime.Now; _AGVStateService.UpdateAsync(AgvItem); //更新任务信息表状态为执行中 AirportTask.agvno = AgvItem.agvno; AirportTask.taskstate = "执行中"; _Taskservice.UpdateTaskAsync(AirportTask); break; } } } return iflag; } catch (Exception ex) { return iflag; } } /// /// 获取agv设备状态 /// /// private List GetAgvState(AgvType AgvType) { List State = null; try { State = _AGVStateService.GetAgvState(AgvType); return State; } catch (Exception ex) { return State; } } } }