diff --git a/SlnMesnac.Business/base/BaseTaskInfoBusiness.cs b/SlnMesnac.Business/base/BaseTaskInfoBusiness.cs index 28d822c..865e208 100644 --- a/SlnMesnac.Business/base/BaseTaskInfoBusiness.cs +++ b/SlnMesnac.Business/base/BaseTaskInfoBusiness.cs @@ -2,43 +2,73 @@ 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) + 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) + public static BaseTaskInfoBusiness GetInstance(ILogger logger, IAirportTaskService Taskservice, IAGVStateService agvService, TcpServer tcpServer) { if (instance == null) { - instance = new BaseTaskInfoBusiness(logger, Taskservice,agvService); + 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 = false, + AutoReset = true, }; timer.Elapsed += GetAGVTaskInfo; @@ -53,58 +83,154 @@ namespace SlnMesnac.Business.@base try { List Task = _Taskservice.GetAGVTaskInfos(); - if (Task.Count > 0 && Task != null) + if (Task != null) { - foreach (var TaskItem in Task) + if (Task.Count > 0) { - _logger.LogInformation($"获取任务信息列表"); - //查询AGV设备状态及AMR设备状态 - //这里要看AGV是否会立刻更新状态 - List State = GetAgvState(); - if (State != null && State.Count > 0) + _RefreshLogMessageAction?.Invoke("任务数量:" + Task.Count); + foreach (var TaskItem in Task) { - foreach (var AgvItem in State) + //AGV未派发,AMR未派发 + if (string.IsNullOrEmpty(TaskItem.agvno) && string.IsNullOrEmpty(TaskItem.manipulatorno)) { - //根据规则筛选最优AGV - if (AgvItem.agvworkstate == "任务空闲") - { - _logger.LogInformation($"获取空闲AGV列表"); - //调用派发任务接口,向任务状态为任务空闲的AGV派发任务 - AgvItem.taskno = TaskItem.taskno; - AgvItem.agvworkstate = "任务执行中"; - AgvItem.refreshtime = DateTime.Now; - _AGVStateService.UpdateAsync(AgvItem); - - //更新任务信息表状态为执行中 - TaskItem.agvno = AgvItem.agvno; - TaskItem.taskstate = "执行中"; - _Taskservice.UpdateAsync(TaskItem); - _Taskaction?.Invoke(TaskItem); - - } + _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; + } + } - private List GetAgvState() + /// + /// 向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(); + State = _AGVStateService.GetAgvState(AgvType); return State; } catch (Exception ex) diff --git a/SlnMesnac.Config/AppConfig.cs b/SlnMesnac.Config/AppConfig.cs index 1cfc66e..21698a1 100644 --- a/SlnMesnac.Config/AppConfig.cs +++ b/SlnMesnac.Config/AppConfig.cs @@ -58,6 +58,15 @@ namespace SlnMesnac.Config /// public string redisConfig { get; set; } + /// + /// AMR + /// + + public string AMRIP { get; set; } + + public AppConfig Value => this; + + } } diff --git a/SlnMesnac.Model/Enum/AgvType.cs b/SlnMesnac.Model/Enum/AgvType.cs new file mode 100644 index 0000000..e260700 --- /dev/null +++ b/SlnMesnac.Model/Enum/AgvType.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SlnMesnac.Model.Enum +{ + public enum AgvType + { + AGV = 1, + AMR = 2, + } +} diff --git a/SlnMesnac.Repository/service/IAGVStateService.cs b/SlnMesnac.Repository/service/IAGVStateService.cs index 446a2ba..9f361ba 100644 --- a/SlnMesnac.Repository/service/IAGVStateService.cs +++ b/SlnMesnac.Repository/service/IAGVStateService.cs @@ -1,4 +1,5 @@ using SlnMesnac.Model.domain; +using SlnMesnac.Model.Enum; using SlnMesnac.Repository.service.@base; using System; using System.Collections.Generic; @@ -13,7 +14,7 @@ namespace SlnMesnac.Repository.service /// ѯAGV״̬ /// /// - List GetAgvState(); + List GetAgvState(AgvType AgvType); /// /// AGV豸״̬Ϣ diff --git a/SlnMesnac.Repository/service/IAirportTaskService.cs b/SlnMesnac.Repository/service/IAirportTaskService.cs index 6a3d70d..c8095a7 100644 --- a/SlnMesnac.Repository/service/IAirportTaskService.cs +++ b/SlnMesnac.Repository/service/IAirportTaskService.cs @@ -20,11 +20,33 @@ namespace SlnMesnac.Repository.service /// List GetAGVTaskInfos(); + + /// + /// վ̨Ųѯб + /// + /// + Task> GetTaskInfoListAsync(string ConveyorNo); + /// /// б /// /// /// - Task UpdateAsync(AirportTask record); + Task UpdateTaskAsync(AirportTask record); + + + /// + /// + /// + /// + /// + Task AddTaskAsync(AirportTask record); + + /// + /// ɾ + /// + /// + /// + Task DeleteTaskAsync(AirportTask record); } } \ No newline at end of file diff --git a/SlnMesnac.Repository/service/Impl/AGVStateServiceImpl.cs b/SlnMesnac.Repository/service/Impl/AGVStateServiceImpl.cs index aeadc34..1979a4a 100644 --- a/SlnMesnac.Repository/service/Impl/AGVStateServiceImpl.cs +++ b/SlnMesnac.Repository/service/Impl/AGVStateServiceImpl.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Logging; using SlnMesnac.Common; using SlnMesnac.Model.domain; +using SlnMesnac.Model.Enum; using SlnMesnac.Repository.service.@base; using System; using System.Collections.Generic; @@ -16,13 +17,14 @@ namespace SlnMesnac.Repository.service.Impl { _logger = logger; } - public List GetAgvState() + public List GetAgvState(AgvType AgvType) { + string _AgvType = Convert.ToString(((int)AgvType).ToString()); List agvStateInfoList = null; try { Expression> exp = x => true; - exp = exp.And(x => x.agvno != "" && (x.taskno == null || x.taskno == "") && x.agvworkstate == ""); + exp = exp.And(x =>(x.agvno != null || x.agvno != "") && (x.taskno == null || x.taskno == "") && x.agvworkstate == "" && (x.agvalarmstate == null || x.agvalarmstate == "") && x.agvtype == _AgvType); agvStateInfoList = base._rep.GetList(exp); } @@ -38,5 +40,6 @@ namespace SlnMesnac.Repository.service.Impl bool result = await _rep.UpdateAsync(record); return result; } + } } \ No newline at end of file diff --git a/SlnMesnac.Repository/service/Impl/AirportTaskServiceImpl.cs b/SlnMesnac.Repository/service/Impl/AirportTaskServiceImpl.cs index f8f7c6c..2009ff8 100644 --- a/SlnMesnac.Repository/service/Impl/AirportTaskServiceImpl.cs +++ b/SlnMesnac.Repository/service/Impl/AirportTaskServiceImpl.cs @@ -51,7 +51,7 @@ namespace SlnMesnac.Repository.service.Impl List taskInfos = null; try { - String sql = "SELECT ConveyorNo,TaskNo,FlightNo,AGVNo,MAX(StartTime) as StartTime,TaskState, TotalCount ,LoadCount FROM AirportTask group by ConveyorNo "; + String sql = "SELECT id,ConveyorNo,TaskNo,FlightNo,AGVNo,MAX(StartTime) as StartTime,TaskState, TotalCount ,LoadCount FROM AirportTask group by ConveyorNo "; taskInfos = base._rep.AsTenant().GetConnection("AGV").Ado.SqlQuery(sql); } catch (Exception ex) @@ -70,7 +70,7 @@ namespace SlnMesnac.Repository.service.Impl List taskInfos = null; try { - String sql = "SELECT id, ConveyorNo,TaskNo,FlightNo,AGVNo,MAX(StartTime) as StartTime,TaskState, TotalCount ,LoadCount FROM AirportTask WHERE AGVNo IS NULL and TaskState = '等待' group by ConveyorNo "; + String sql = "select *from ( SELECT id, ConveyorNo,TaskNo,FlightNo,AGVNo,ManipulatorNo,MAX(StartTime) as StartTime,TaskState, TotalCount ,LoadCount FROM AirportTask group by ConveyorNo )"; taskInfos = base._rep.AsTenant().GetConnection("AGV").Ado.SqlQuery(sql); } catch (Exception ex) @@ -80,11 +80,30 @@ namespace SlnMesnac.Repository.service.Impl return taskInfos; } - public async Task UpdateAsync(AirportTask record) + public async Task> GetTaskInfoListAsync(string ConveyorNo) + { + List list = null; + list = await _rep.GetListAsync(x=>x.conveyorno == ConveyorNo); + return list; + } + + + public async Task UpdateTaskAsync(AirportTask record) { bool result = await _rep.UpdateAsync(record); return result; } + + public async Task AddTaskAsync(AirportTask record) + { + bool result = await _rep.InsertAsync(record); + return result; + } + public async Task DeleteTaskAsync(AirportTask record) + { + bool iFlag = await _rep.DeleteAsync(record); + return iFlag; + } } } diff --git a/SlnMesnac.TouchSocket/TcpServer.cs b/SlnMesnac.TouchSocket/TcpServer.cs index 70f8afc..c3f0ae5 100644 --- a/SlnMesnac.TouchSocket/TcpServer.cs +++ b/SlnMesnac.TouchSocket/TcpServer.cs @@ -42,6 +42,8 @@ namespace SlnMesnac.TouchSocket public delegate void RefreshClientInfo(TcpService tcpService); public event RefreshClientInfo? RefreshClientInfoEvent; + public Action RefreshStateAction; + public TcpServer(ILogger logger,TcpService tcpService) { _logger = logger; @@ -59,10 +61,12 @@ namespace SlnMesnac.TouchSocket _service.Connected = (client, e) => { _logger.LogInformation($"客户端{client.IP}接入服务成功"); RefreshClientInfoEvent?.Invoke(_service); + RefreshStateAction?.Invoke(client.IP,true); return EasyTask.CompletedTask; }; _service.Disconnected = (client, e) => { _logger.LogInformation($"客户端{client.IP}断开连接"); + RefreshStateAction?.Invoke(client.IP, false); RefreshClientInfoEvent?.Invoke(_service); return EasyTask.CompletedTask; }; @@ -70,7 +74,13 @@ namespace SlnMesnac.TouchSocket { //从客户端收到信息 var mes = Encoding.UTF8.GetString(e.ByteBlock.Buffer, 0, e.ByteBlock.Len);//注意:数据长度是byteBlock.Len - + _logger.LogInformation($"客户端{client.IP}:"+ mes); + //区分一下指令类型,委托传参 + + if (mes == "heartbeat") + { + RefreshStateAction?.Invoke(client.IP, true); + } byte[] receivedBuffer = new byte[e.ByteBlock.Len]; Array.Copy(e.ByteBlock.Buffer, 0, receivedBuffer, 0, e.ByteBlock.Len); ReceivedClientBufferEvent?.Invoke(receivedBuffer); diff --git a/SlnMesnac.TouchSocket/TouchSocketSetup.cs b/SlnMesnac.TouchSocket/TouchSocketSetup.cs index 4634ac4..ea36ae7 100644 --- a/SlnMesnac.TouchSocket/TouchSocketSetup.cs +++ b/SlnMesnac.TouchSocket/TouchSocketSetup.cs @@ -37,11 +37,11 @@ namespace SlnMesnac.TouchSocket public static IApplicationBuilder UseTouchSocketExtensions(this IApplicationBuilder app) { - // var _server = app.ApplicationServices.GetService(); - // _server.Init(20108); + var _server = app.ApplicationServices.GetService(); + _server.Init(6001); - var _apiServer = app.ApplicationServices.GetService(); - _apiServer.Init(); + // var _apiServer = app.ApplicationServices.GetService(); + // _apiServer.Init(); return app; } } diff --git a/SlnMesnac.WPF/MainWindow.xaml b/SlnMesnac.WPF/MainWindow.xaml index bc74bc5..0444fba 100644 --- a/SlnMesnac.WPF/MainWindow.xaml +++ b/SlnMesnac.WPF/MainWindow.xaml @@ -31,7 +31,7 @@ - + @@ -72,7 +72,7 @@ - + - @@ -190,7 +190,7 @@ - + @@ -221,12 +221,12 @@ - + - + + --> + diff --git a/SlnMesnac.WPF/Page/IndexPage/AddTaskContent.xaml b/SlnMesnac.WPF/Page/IndexPage/AddTaskContent.xaml new file mode 100644 index 0000000..1d481e2 --- /dev/null +++ b/SlnMesnac.WPF/Page/IndexPage/AddTaskContent.xaml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +