新增获取等待任务逻辑

master
CaesarBao 2 weeks ago
parent d66333989c
commit 63b59cca10

@ -3,27 +3,95 @@ 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<List<AirportTask>> AirportTaskEvent;
public Action<AirportTask> _Taskaction;
private static BaseTaskInfoBusiness instance;
private ILogger<BaseTaskInfoBusiness> _logger;
private IAirportTaskService _service;
public BaseTaskInfoBusiness(ILogger<BaseTaskInfoBusiness> logger, IAirportTaskService service)
private IAirportTaskService _Taskservice;
private IAGVStateService _AGVStateService;
public BaseTaskInfoBusiness(ILogger<BaseTaskInfoBusiness> logger, IAirportTaskService Taskservice, IAGVStateService agvService)
{
_logger = logger;
_service = service;
_Taskservice = Taskservice;
_AGVStateService = agvService;
InitClearTimer();
}
public static BaseTaskInfoBusiness GetInstance(ILogger<BaseTaskInfoBusiness> 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,
public void GetTaskInfos()
};
timer.Elapsed += GetAGVTaskInfo;
timer.Start();
}
/// <summary>
/// 获取任务列表
/// </summary>
private void GetAGVTaskInfo(object source, ElapsedEventArgs e)
{
try
{
List<AirportTask> TaskInfos = _service.GetTaskInfos();
List<AirportTask> Task = _Taskservice.GetAGVTaskInfos();
if (Task.Count > 0 && Task != null)
{
foreach (var TaskItem in Task)
{
_logger.LogInformation($"获取任务信息列表");
//查询AGV设备状态及AMR设备状态
//这里要看AGV是否会立刻更新状态
List<AGVState> 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)
{
@ -31,5 +99,21 @@ namespace SlnMesnac.Business.@base
}
}
private List<AGVState> GetAgvState()
{
List<AGVState> State = null;
try
{
State = _AGVStateService.GetAgvState();
return State;
}
catch (Exception ex)
{
return State;
}
}
}
}

@ -6,7 +6,7 @@ using System.Text;
namespace ${NameSpace}.service
{
public interface I${tableName}Services: IBaseService<${tableName}>
public interface I${tableName}Service: IBaseService<${tableName}>
{
}

@ -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)
{

@ -0,0 +1,75 @@
using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace SlnMesnac.Repository
{
///<summary>
///
///</summary>
[SugarTable("AGVState")]
public partial class AGVState
{
public AGVState(){
}
/// <summary>
/// Desc:
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey=true,IsIdentity=true,ColumnName="ID")]
public int id {get;set;}
/// <summary>
/// Desc:
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnName="AGVNo")]
public string agvno {get;set;}
/// <summary>
/// Desc:
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnName="AGVType")]
public string agvtype {get;set;}
/// <summary>
/// Desc:
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnName="TaskNo")]
public string taskno {get;set;}
/// <summary>
/// Desc:
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnName="AGVAlarmState")]
public string agvalarmstate {get;set;}
/// <summary>
/// Desc:
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnName="AGVWorkState")]
public string agvworkstate {get;set;}
/// <summary>
/// Desc:
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnName="RefreshTime")]
public DateTime refreshtime {get;set;}
}
}

@ -0,0 +1,27 @@
using Microsoft.Extensions.Logging;
using Quartz;
using System;
using System.Threading.Tasks;
namespace SlnMesnac.Quartz.Job
{
/// <summary>
/// 定时获取设备状态
/// </summary>
public class GetAgvState_Job : IJob
{
private readonly ILogger<GetAgvState_Job> _logger;
public GetAgvState_Job(ILogger<GetAgvState_Job> logger)
{
_logger = logger;
}
public Task Execute(IJobExecutionContext context)
{
_logger.LogInformation($"获取AGV状态{DateTime.Now.ToString("HH:mm:ss")}");
return Task.CompletedTask;
}
}
}

@ -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<GetTaskInfo_Job> _logger;
private IAirportTaskService _service;
private BaseTaskInfoBusiness _taskInfoBusiness;
public GetTaskInfo_Job(ILogger<GetTaskInfo_Job> logger, IAirportTaskService service)
{
_logger = logger;
_service = service;
}
public Task Execute(IJobExecutionContext context)
{
return Task.CompletedTask;
}
/// <summary>
/// 获取任务列表
/// </summary>
private void GetAGVTaskInfo()
{
try
{
List<AirportTask> Task = _service.GetTaskInfos();
}
catch (Exception ex)
{
}
}
}
}

@ -40,7 +40,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;
}
}

@ -36,12 +36,15 @@ namespace SlnMesnac.Quartz
{
q.UseMicrosoftDependencyInjectionJobFactory();
q.ScheduleJob<MyJob>(trigger =>
trigger.WithCronSchedule("*/3 * * * * ?").WithIdentity("MyJob", "MyJobGroup") // 示例每3s执行一次
);
//q.ScheduleJob<MyJob>(trigger =>
// trigger.WithCronSchedule("*/3 * * * * ?").WithIdentity("MyJob", "MyJobGroup") // 示例每3s执行一次
//);
q.ScheduleJob<Job2>(trigger =>
trigger.WithCronSchedule("*/5 * * * * ?").WithIdentity("Job2", "Job2Group") // 示例每5s执行一次
q.ScheduleJob<GetAgvState_Job>(trigger =>
trigger.WithCronSchedule("*/5 * * * * ?").WithIdentity("GetAgvState_Job", "GetAgvState_JobGroup") // 示例每5s执行一次
);
q.ScheduleJob<MyJob>(trigger =>
trigger.WithCronSchedule("*/5 * * * * ?").WithIdentity("MyJob", "GetAgvState_JobGroup") // 示例每5s执行一次
);
});

@ -10,4 +10,9 @@
<PackageReference Include="Quartz.AspNetCore" Version="3.8.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SlnMesnac.Business\SlnMesnac.Business.csproj" />
<ProjectReference Include="..\SlnMesnac.Repository\SlnMesnac.Repository.csproj" />
</ItemGroup>
</Project>

@ -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<AGVState>
{
/// <summary>
/// 查询AGV状态
/// </summary>
/// <returns></returns>
List<AGVState> GetAgvState();
/// <summary>
/// 更新AGV设备状态信息
/// </summary>
/// <param name="record"></param>
/// <returns></returns>
Task<bool> UpdateAsync(AGVState record);
}
}

@ -3,15 +3,28 @@ 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<AirportTask>
{
/// <summary>
/// 获取任务列表
/// 获取站台任务列表
/// </summary>
/// <returns></returns>
List<AirportTask> GetTaskInfos();
/// <summary>
/// 获取待执行任务列表
/// </summary>
/// <returns></returns>
List<AirportTask> GetAGVTaskInfos();
/// <summary>
/// 更新任务列表
/// </summary>
/// <param name="record"></param>
/// <returns></returns>
Task<bool> UpdateAsync(AirportTask record);
}
}

@ -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<AGVState>, IAGVStateService
{
private ILogger<AGVStateServiceImpl> _logger;
public AGVStateServiceImpl(Repository<AGVState> repository, ILogger<AGVStateServiceImpl> logger) :base(repository)
{
_logger = logger;
}
public List<AGVState> GetAgvState()
{
List<AGVState> agvStateInfoList = null;
try
{
Expression<Func<AGVState, bool>> 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<bool> UpdateAsync(AGVState record)
{
bool result = await _rep.UpdateAsync(record);
return result;
}
}
}

@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;
using SlnMesnac.Repository.service.@base;
using System.Threading.Tasks;
#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
@ -50,8 +51,7 @@ namespace SlnMesnac.Repository.service.Impl
List<AirportTask> taskInfos = null;
try
{
String sql = "SELECT ConveyorNo,TaskNo ,MAX(StartTime),TaskState FROM AirportTask group by ConveyorNo ";
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<AirportTask>(sql);
}
catch (Exception ex)
@ -61,7 +61,30 @@ namespace SlnMesnac.Repository.service.Impl
return taskInfos;
}
/// <summary>
/// 获取AGV任务信息
/// </summary>
/// <returns></returns>
public List<AirportTask> GetAGVTaskInfos()
{
List<AirportTask> 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 ";
taskInfos = base._rep.AsTenant().GetConnection("AGV").Ado.SqlQuery<AirportTask>(sql);
}
catch (Exception ex)
{
_logger.LogError($"获取AGV任务信息异常:{ex.Message}");
}
return taskInfos;
}
public async Task<bool> UpdateAsync(AirportTask record)
{
bool result = await _rep.UpdateAsync(record);
return result;
}
}
}

@ -12,6 +12,7 @@ using SlnMesnac.Rfid;
using SlnMesnac.Ioc;
using SlnMesnac.Plc;
using SlnMesnac.Extensions;
using SlnMesnac.Quartz;
using SlnMesnac.TouchSocket;
namespace SlnMesnac.WPF
@ -46,6 +47,9 @@ namespace SlnMesnac.WPF
//注册RFID工厂
//services.AddRfidFactorySetup();
//注册任务调度
//services.AddQuartzSetUp();
}
/// <summary>

@ -42,8 +42,10 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
public partial class IndexContentViewModel: ObservableObject
{
private ILogger<IndexContentViewModel> _logger;
private IAirportTaskService _service;
private ILogger<BaseTaskInfoBusiness> _taskBusinessLogger;
private IAirportTaskService _taskservice;
private IAGVStateService _agvstateService;
private BaseTaskInfoBusiness _taskInfoBusiness;
private DispatcherTimer _timer;
@ -51,7 +53,17 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
{
LogMessages = new ObservableCollection<string>();
_service = App.ServiceProvider.GetService<IAirportTaskService>();
_taskBusinessLogger = App.ServiceProvider.GetService<ILogger<BaseTaskInfoBusiness>>();
_taskservice = App.ServiceProvider.GetService<IAirportTaskService>();
_agvstateService = App.ServiceProvider.GetService<IAGVStateService>();
_taskInfoBusiness = BaseTaskInfoBusiness.GetInstance(_taskBusinessLogger, _taskservice, _agvstateService);
_taskInfoBusiness._Taskaction += task =>
{
TaskItems = new ObservableCollection<AirportTask>
{
task
};
};
this.Init();
}
@ -59,9 +71,8 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
{
#region 测试数据
List<AirportTask> AirportTaskItem = _service.GetTaskInfos();
List<AirportTask> AirportTaskItem = _taskservice.GetTaskInfos();
TaskItems = new ObservableCollection<AirportTask>(AirportTaskItem);
// TaskItems = new ObservableCollection<AirportTask>
// {
// new AirportTask { TaskCode = "1", StationName = "1#站台", TaskDetails = "入库P04->C01", Status = "任务状态:执行中" },

@ -2,6 +2,9 @@
using GalaSoft.MvvmLight.Command;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using SlnMesnac.Business.@base;
using SlnMesnac.Repository.service;
using SlnMesnac.TouchSocket;
using SlnMesnac.WPF.Page.Generate;
using SlnMesnac.WPF.Page.IndexPage;
using System;
@ -12,6 +15,9 @@ namespace SlnMesnac.WPF.ViewModel
public class MainWindowViewModel: ViewModelBase
{
private readonly ILogger<MainWindowViewModel> _logger;
private readonly ILogger<BaseTaskInfoBusiness> _BaseTaskInfoBusinesslogger;
private IAirportTaskService _Taskservice;
private IAGVStateService _AGVStateService;
//代码生成
private readonly GenerateControl generateControl = new GenerateControl();
@ -82,7 +88,11 @@ namespace SlnMesnac.WPF.ViewModel
{
_logger = App.ServiceProvider.GetService<ILogger<MainWindowViewModel>>();
_Taskservice = App.ServiceProvider.GetService<IAirportTaskService>();
_AGVStateService = App.ServiceProvider.GetService<IAGVStateService>();
_BaseTaskInfoBusinesslogger = App.ServiceProvider.GetService<ILogger<BaseTaskInfoBusiness>>();
BaseTaskInfoBusiness.GetInstance(_BaseTaskInfoBusinesslogger, _Taskservice, _AGVStateService);
ControlOnClickCommand = new RelayCommand<object>(obj => ControlOnClick(obj));
FormControlCommand = new RelayCommand<object>(x => FormControl(x));

@ -10,16 +10,16 @@
"AppConfig": {
"logPath": "F:\\Mesnac\\2023部门项目\\机场AGV调度\\HightWay_AirPot_WCS\\SlnMesnac.WPF\\bin\\Debug\\net6.0-windows\\log",
"SqlConfig": [
{
"configId": "mes",
"dbType": 1,
"connStr": "server=.;uid=sa;pwd=123456;database=JiangYinMENS"
},
{
"configId": "mcs",
"dbType": 3,
"connStr": "Data Source=175.27.215.92/helowin;User ID=aucma_scada;Password=aucma"
},
//{
// "configId": "mes",
// "dbType": 1,
// "connStr": "server=.;uid=sa;pwd=123456;database=JiangYinMENS"
//},
//{
// "configId": "mcs",
// "dbType": 3,
// "connStr": "Data Source=175.27.215.92/helowin;User ID=aucma_scada;Password=aucma"
//},
{
"configId": "AGV",
"dbType": 2,

Loading…
Cancel
Save