diff --git a/SlnMesnac.Business/SlnMesnac.Business.csproj b/SlnMesnac.Business/SlnMesnac.Business.csproj index d27063c..582b924 100644 --- a/SlnMesnac.Business/SlnMesnac.Business.csproj +++ b/SlnMesnac.Business/SlnMesnac.Business.csproj @@ -1,4 +1,4 @@ - + netstandard2.1 diff --git a/SlnMesnac.Business/base/BaseTaskInfoBusiness.cs b/SlnMesnac.Business/base/BaseTaskInfoBusiness.cs new file mode 100644 index 0000000..28d822c --- /dev/null +++ b/SlnMesnac.Business/base/BaseTaskInfoBusiness.cs @@ -0,0 +1,119 @@ +using Microsoft.Extensions.Logging; +using SlnMesnac.Repository.service; +using System; +using System.Collections.Generic; +using SlnMesnac.Repository; +using SlnMesnac.Repository.service.Impl; +using TouchSocket.Sockets; +using SlnMesnac.Model.domain; +using SlnMesnac.TouchSocket; +using System.Timers; + +namespace SlnMesnac.Business.@base +{ + public class BaseTaskInfoBusiness + { + public Action _Taskaction; + private static BaseTaskInfoBusiness instance; + private ILogger _logger; + private IAirportTaskService _Taskservice; + private IAGVStateService _AGVStateService; + public BaseTaskInfoBusiness(ILogger logger, IAirportTaskService Taskservice, IAGVStateService agvService) + { + _logger = logger; + _Taskservice = Taskservice; + _AGVStateService = agvService; + InitClearTimer(); + } + public static BaseTaskInfoBusiness GetInstance(ILogger logger, IAirportTaskService Taskservice, IAGVStateService agvService) + { + if (instance == null) + { + instance = new BaseTaskInfoBusiness(logger, Taskservice,agvService); + } + return instance; + } + private void InitClearTimer() + { + System.Timers.Timer timer = new System.Timers.Timer + { + Interval = 1000, // 每天执行一次 + AutoReset = false, + + }; + timer.Elapsed += GetAGVTaskInfo; + timer.Start(); + + } + /// + /// 获取任务列表 + /// + private void GetAGVTaskInfo(object source, ElapsedEventArgs e) + { + try + { + List Task = _Taskservice.GetAGVTaskInfos(); + if (Task.Count > 0 && Task != null) + { + foreach (var TaskItem in Task) + { + _logger.LogInformation($"获取任务信息列表"); + //查询AGV设备状态及AMR设备状态 + //这里要看AGV是否会立刻更新状态 + List State = GetAgvState(); + if (State != null && State.Count > 0) + { + foreach (var AgvItem in State) + { + //根据规则筛选最优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); + + } + } + + + } + } + + } + + + + } + catch (Exception ex) + { + + } + } + + private List GetAgvState() + { + List State = null; + try + { + State = _AGVStateService.GetAgvState(); + return State; + } + catch (Exception ex) + { + return State; + } + + } + + + } +} \ No newline at end of file diff --git a/SlnMesnac.Generate/Templates/Service/IServiceCreate.cs b/SlnMesnac.Generate/Templates/Service/IServiceCreate.cs index 272c376..9e6c416 100644 --- a/SlnMesnac.Generate/Templates/Service/IServiceCreate.cs +++ b/SlnMesnac.Generate/Templates/Service/IServiceCreate.cs @@ -33,7 +33,7 @@ namespace SlnMesnac.Generate.Templates.Service { public class IServiceCreate { - private static readonly string templateDir = @"E:\桌面\SlnMesnac\SlnMesnac.Generate\Templates\Service\"; + private static readonly string templateDir = @"F:\Mesnac\2023部门项目\机场AGV调度\HightWay_AirPot_WCS\SlnMesnac.Generate\Templates\Service\"; public bool Create(string tableName, string NameSpace, string outdir) { diff --git a/SlnMesnac.Generate/Templates/Service/IServices.vm b/SlnMesnac.Generate/Templates/Service/IServices.vm index a5b8992..c868c30 100644 --- a/SlnMesnac.Generate/Templates/Service/IServices.vm +++ b/SlnMesnac.Generate/Templates/Service/IServices.vm @@ -6,7 +6,7 @@ using System.Text; namespace ${NameSpace}.service { - public interface I${tableName}Services: IBaseService<${tableName}> + public interface I${tableName}Service: IBaseService<${tableName}> { } diff --git a/SlnMesnac.Generate/Templates/Service/Impl/ServiceCreate.cs b/SlnMesnac.Generate/Templates/Service/Impl/ServiceCreate.cs index 14830ea..1514359 100644 --- a/SlnMesnac.Generate/Templates/Service/Impl/ServiceCreate.cs +++ b/SlnMesnac.Generate/Templates/Service/Impl/ServiceCreate.cs @@ -33,7 +33,7 @@ namespace SlnMesnac.Generate.Templates.Service.Impl { public class ServiceCreate { - private static readonly string templateDir = @"E:\桌面\SlnMesnac\SlnMesnac.Generate\Templates\Service\Impl\"; + private static readonly string templateDir = @"F:\Mesnac\2023部门项目\机场AGV调度\HightWay_AirPot_WCS\SlnMesnac.Generate\Templates\Service\Impl\"; public bool Create(string tableName, string NameSpace, string outdir) { diff --git a/SlnMesnac.Model/domain/AGVState.cs b/SlnMesnac.Model/domain/AGVState.cs index 948029d..3b130b9 100644 --- a/SlnMesnac.Model/domain/AGVState.cs +++ b/SlnMesnac.Model/domain/AGVState.cs @@ -1,45 +1,75 @@ using System; -using System.Collections.Generic; +using System.Linq; using System.Text; +using SqlSugar; -namespace SlnMesnac.Model.domain +namespace SlnMesnac.Repository { - public class AGVState + /// + /// + /// + [SugarTable("AGVState")] + public partial class AGVState { - /// - /// 自增编号 - /// - [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)] - public int ID { get; set; } - - /// - /// AGV编号 - /// - public string AGVNo { get; set; } - - /// - /// AGV类型 - /// - public string AGVType { get; set; } - - /// - /// 任务编号 - /// - public string ?TaskNo { get; set; } - - /// - /// AGV报警状态(1:正常,2:故障) - /// - public string AGVAlarmState { get; set; } - - /// - /// AGV工作状态(1:空闲,2:忙碌) - /// - public string AGVWorkState { get; set; } - - /// - /// 刷新时间 - /// - public DateTime RefreshTime { get; set; } + public AGVState(){ + + + } + /// + /// Desc: + /// Default: + /// Nullable:False + /// + [SugarColumn(IsPrimaryKey=true,IsIdentity=true,ColumnName="ID")] + public int id {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:False + /// + [SugarColumn(ColumnName="AGVNo")] + public string agvno {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:False + /// + [SugarColumn(ColumnName="AGVType")] + public string agvtype {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:False + /// + [SugarColumn(ColumnName="TaskNo")] + public string taskno {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:False + /// + [SugarColumn(ColumnName="AGVAlarmState")] + public string agvalarmstate {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:False + /// + [SugarColumn(ColumnName="AGVWorkState")] + public string agvworkstate {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:False + /// + [SugarColumn(ColumnName="RefreshTime")] + public DateTime refreshtime {get;set;} + } } diff --git a/SlnMesnac.Model/domain/AirportTask.cs b/SlnMesnac.Model/domain/AirportTask.cs index a8cbfe8..1574354 100644 --- a/SlnMesnac.Model/domain/AirportTask.cs +++ b/SlnMesnac.Model/domain/AirportTask.cs @@ -1,75 +1,123 @@ using System; -using System.Collections.Generic; +using System.Linq; using System.Text; +using SqlSugar; -namespace SlnMesnac.Model.domain +namespace SlnMesnac.Repository { - public class AirportTask + /// + /// + /// + [SugarTable("AirportTask")] + public partial class AirportTask { - /// - /// 自增ID - /// - [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)] - public int ID { get; set; } - - /// - /// 任务编号 - /// - public string TaskNo { get; set; } - - /// - /// 传送带编号 - /// - public string ConveyorNo { get; set; } - - /// - /// 航班编号 - /// - public string FlightNo { get; set; } - - /// - /// 机械臂编号 - /// - public string ManipulatorNo { get; set; } - - /// - /// 机械臂小车是否到位 - /// - public string ManipulatorAGVIsArrive { get; set; } - - /// - /// 运载小车编号 - /// - public string AGVNo { get; set; } - - /// - /// 运载小车是否到位 - /// - public string AGVIsArrive { get; set; } - - /// - /// 总行李框数量 - /// - public int TotalCount { get; set; } - - /// - /// 装载行李框数量 - /// - public int LoadCount { get; set; } - - /// - /// 任务状态 - /// - public string TaskState { get; set; } - - /// - /// 起始时间 - /// - public DateTime StartTime { get; set; } - - /// - /// 结束时间 - /// - public DateTime ?FinishTime { get; set; } + public AirportTask(){ + + + } + /// + /// Desc: + /// Default: + /// Nullable:False + /// + [SugarColumn(IsPrimaryKey=true,IsIdentity=true,ColumnName="ID")] + public int id {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:False + /// + [SugarColumn(ColumnName="TaskNo")] + public string taskno {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:True + /// + [SugarColumn(ColumnName="ConveyorNo")] + public string conveyorno {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:True + /// + [SugarColumn(ColumnName="FlightNo")] + public string flightno {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:True + /// + [SugarColumn(ColumnName="ManipulatorNo")] + public string manipulatorno {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:True + /// + [SugarColumn(ColumnName="ManipulatorAGVIsArrive")] + public string manipulatoragvisarrive {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:True + /// + [SugarColumn(ColumnName="AGVNo")] + public string agvno {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:True + /// + [SugarColumn(ColumnName="AGVIsArrive")] + public string agvisarrive {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:True + /// + [SugarColumn(ColumnName="TotalCount")] + public int? totalcount {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:True + /// + [SugarColumn(ColumnName="LoadCount")] + public int? loadcount {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:True + /// + [SugarColumn(ColumnName="TaskState")] + public string taskstate {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:True + /// + [SugarColumn(ColumnName="StartTime")] + public DateTime? starttime {get;set;} + + /// + /// Desc: + /// Default: + /// Nullable:True + /// + [SugarColumn(ColumnName="FinishTime")] + public DateTime? finishtime {get;set;} + } } diff --git a/SlnMesnac.Quartz/Job/GetAgvState_Job.cs b/SlnMesnac.Quartz/Job/GetAgvState_Job.cs new file mode 100644 index 0000000..a421b57 --- /dev/null +++ b/SlnMesnac.Quartz/Job/GetAgvState_Job.cs @@ -0,0 +1,27 @@ +using Microsoft.Extensions.Logging; +using Quartz; +using System; +using System.Threading.Tasks; + +namespace SlnMesnac.Quartz.Job +{ + /// + /// 定时获取设备状态 + /// + public class GetAgvState_Job : IJob + { + private readonly ILogger _logger; + + public GetAgvState_Job(ILogger logger) + { + _logger = logger; + } + + public Task Execute(IJobExecutionContext context) + { + _logger.LogInformation($"获取AGV状态:{DateTime.Now.ToString("HH:mm:ss")}"); + return Task.CompletedTask; + } + + } +} \ No newline at end of file diff --git a/SlnMesnac.Quartz/Job/GetTaskInfo_Job.cs b/SlnMesnac.Quartz/Job/GetTaskInfo_Job.cs new file mode 100644 index 0000000..e06050c --- /dev/null +++ b/SlnMesnac.Quartz/Job/GetTaskInfo_Job.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Quartz; +using SlnMesnac.Business.@base; +using SlnMesnac.Repository; +using SlnMesnac.Repository.service; + +namespace SlnMesnac.Quartz.Job +{ + public class GetTaskInfo_Job : IJob + { + private readonly ILogger _logger; + private IAirportTaskService _service; + private BaseTaskInfoBusiness _taskInfoBusiness; + public GetTaskInfo_Job(ILogger logger, IAirportTaskService service) + { + _logger = logger; + _service = service; + } + public Task Execute(IJobExecutionContext context) + { + + return Task.CompletedTask; + } + + /// + /// 获取任务列表 + /// + private void GetAGVTaskInfo() + { + try + { + List Task = _service.GetTaskInfos(); + } + catch (Exception ex) + { + + } + } + } +} \ No newline at end of file diff --git a/SlnMesnac.Quartz/Job/MyJob.cs b/SlnMesnac.Quartz/Job/MyJob.cs index 297a21c..1393ae1 100644 --- a/SlnMesnac.Quartz/Job/MyJob.cs +++ b/SlnMesnac.Quartz/Job/MyJob.cs @@ -45,7 +45,7 @@ namespace SlnMesnac.Quartz.Job public Task Execute(IJobExecutionContext context) { - _logger.LogInformation($"执行MyJob:{DateTime.Now.ToString("HH:mm:ss")}"); + _logger.LogInformation($"获取机械臂状态:{DateTime.Now.ToString("HH:mm:ss")}"); return Task.CompletedTask; } } diff --git a/SlnMesnac.Quartz/SlnMesnac.Quartz.csproj b/SlnMesnac.Quartz/SlnMesnac.Quartz.csproj index cc2e273..71fb50e 100644 --- a/SlnMesnac.Quartz/SlnMesnac.Quartz.csproj +++ b/SlnMesnac.Quartz/SlnMesnac.Quartz.csproj @@ -11,6 +11,7 @@ + diff --git a/SlnMesnac.Repository/service/IAGVStateService.cs b/SlnMesnac.Repository/service/IAGVStateService.cs new file mode 100644 index 0000000..446a2ba --- /dev/null +++ b/SlnMesnac.Repository/service/IAGVStateService.cs @@ -0,0 +1,26 @@ +using SlnMesnac.Model.domain; +using SlnMesnac.Repository.service.@base; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace SlnMesnac.Repository.service +{ + public interface IAGVStateService: IBaseService + { + /// + /// ѯAGV״̬ + /// + /// + List GetAgvState(); + + /// + /// AGV豸״̬Ϣ + /// + /// + /// + Task UpdateAsync(AGVState record); + + } +} \ No newline at end of file diff --git a/SlnMesnac.Repository/service/IAirportTaskService.cs b/SlnMesnac.Repository/service/IAirportTaskService.cs index bc2f276..3e818b9 100644 --- a/SlnMesnac.Repository/service/IAirportTaskService.cs +++ b/SlnMesnac.Repository/service/IAirportTaskService.cs @@ -1,17 +1,30 @@ -using SlnMesnac.Model.domain; +using SlnMesnac.Model.domain; using SlnMesnac.Repository.service.@base; using System; using System.Collections.Generic; using System.Text; +using System.Threading.Tasks; namespace SlnMesnac.Repository.service { public interface IAirportTaskService : IBaseService { /// - /// 建库 + /// ��ȡվ̨�����б� /// - /// 是否成功 - bool CreateDataBase(); + /// + List GetTaskInfos(); + /// + /// ��ȡ��ִ�������б� + /// + /// + List GetAGVTaskInfos(); + + /// + /// ���������б� + /// + /// + /// + Task UpdateAsync(AirportTask record); } } diff --git a/SlnMesnac.Repository/service/Impl/AGVStateServiceImpl.cs b/SlnMesnac.Repository/service/Impl/AGVStateServiceImpl.cs new file mode 100644 index 0000000..aeadc34 --- /dev/null +++ b/SlnMesnac.Repository/service/Impl/AGVStateServiceImpl.cs @@ -0,0 +1,42 @@ +using Microsoft.Extensions.Logging; +using SlnMesnac.Common; +using SlnMesnac.Model.domain; +using SlnMesnac.Repository.service.@base; +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Threading.Tasks; + +namespace SlnMesnac.Repository.service.Impl +{ + public class AGVStateServiceImpl : BaseServiceImpl, IAGVStateService + { + private ILogger _logger; + public AGVStateServiceImpl(Repository repository, ILogger logger) :base(repository) + { + _logger = logger; + } + public List GetAgvState() + { + List agvStateInfoList = null; + try + { + Expression> exp = x => true; + exp = exp.And(x => x.agvno != "" && (x.taskno == null || x.taskno == "") && x.agvworkstate == ""); + + agvStateInfoList = base._rep.GetList(exp); + } + catch (Exception ex) + { + _logger.LogError($"ͨͻȡϢ쳣:{ex.Message}"); + } + return agvStateInfoList; + } + + public async Task UpdateAsync(AGVState record) + { + 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 760266b..f8f7c6c 100644 --- a/SlnMesnac.Repository/service/Impl/AirportTaskServiceImpl.cs +++ b/SlnMesnac.Repository/service/Impl/AirportTaskServiceImpl.cs @@ -1,41 +1,90 @@ using Microsoft.Extensions.Logging; using SlnMesnac.Model.domain; -using SlnMesnac.Repository.service.@base; +using SlnMesnac.Common; using System; using System.Collections.Generic; +using System.Linq.Expressions; using System.Text; +using SlnMesnac.Repository.service.@base; +using System.Threading.Tasks; +#region << 版 本 注 释 >> +/*-------------------------------------------------------------------- +* 版权所有 (c) 2024 WenJY 保留所有权利。 +* CLR版本:4.0.30319.42000 +* 机器名称:LAPTOP-E0N2L34V +* 命名空间:SlnMesnac.Repository.service.Impl +* 唯一标识:496f8d2b-70e3-4a05-ae18-a9b0fcd06b82 +* +* 创建者:WenJY +* 电子邮箱:wenjy@mesnac.com +* 创建时间:2024-03-27 21:58:35 +* 版本:V1.0.0 +* 描述: +* +*-------------------------------------------------------------------- +* 修改人: +* 时间: +* 修改说明: +* +* 版本:V1.0.0 +*--------------------------------------------------------------------*/ +#endregion << 版 本 注 释 >> namespace SlnMesnac.Repository.service.Impl { public class AirportTaskServiceImpl : BaseServiceImpl, IAirportTaskService { - private ILogger _logger; + private ILogger _logger; - public AirportTaskServiceImpl(Repository repository, ILogger logger) : base(repository) + public AirportTaskServiceImpl(Repository repository, ILogger logger):base(repository) { _logger = logger; } - public bool CreateDataBase() + + /// + /// 获取所有的任务信息 + /// + /// + public List GetTaskInfos() + { + List taskInfos = null; + try + { + String sql = "SELECT 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) + { + _logger.LogError($"获取任务信息异常:{ex.Message}"); + } + return taskInfos; + } + + /// + /// 获取AGV任务信息 + /// + /// + public List GetAGVTaskInfos() { + List taskInfos = null; try { - _rep.AsSugarClient().DbMaintenance.CreateDatabase(); - _rep.AsSugarClient().CodeFirst.InitTables(); - _rep.AsSugarClient().CodeFirst.InitTables(); - _rep.AsSugarClient().CodeFirst.InitTables(); - _rep.AsSugarClient().CodeFirst.InitTables(); - _rep.AsSugarClient().CodeFirst.InitTables(); - _rep.AsSugarClient().CodeFirst.InitTables(); - _rep.AsSugarClient().CodeFirst.InitTables(); - _logger.LogInformation("DataBaseCreateSuccess"); - return true; + 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 "; + taskInfos = base._rep.AsTenant().GetConnection("AGV").Ado.SqlQuery(sql); } catch (Exception ex) { - _logger.LogInformation("Error: " + ex); - return false; + _logger.LogError($"获取AGV任务信息异常:{ex.Message}"); } + return taskInfos; + } + + public async Task UpdateAsync(AirportTask record) + { + bool result = await _rep.UpdateAsync(record); + return result; } } } + diff --git a/SlnMesnac.Repository/service/base/BaseServiceImpl.cs b/SlnMesnac.Repository/service/base/BaseServiceImpl.cs index 2227110..a8d6a54 100644 --- a/SlnMesnac.Repository/service/base/BaseServiceImpl.cs +++ b/SlnMesnac.Repository/service/base/BaseServiceImpl.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Text; +using System.Threading.Tasks; #region << 版 本 注 释 >> /*-------------------------------------------------------------------- diff --git a/SlnMesnac.WPF/MainWindow.xaml b/SlnMesnac.WPF/MainWindow.xaml index fffc1d0..bc74bc5 100644 --- a/SlnMesnac.WPF/MainWindow.xaml +++ b/SlnMesnac.WPF/MainWindow.xaml @@ -18,6 +18,7 @@ + @@ -48,12 +49,10 @@ - - -