You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
4.0 KiB
C#

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<AirportTask> _Taskaction;
private static BaseTaskInfoBusiness instance;
private ILogger<BaseTaskInfoBusiness> _logger;
private IAirportTaskService _Taskservice;
private IAGVStateService _AGVStateService;
public BaseTaskInfoBusiness(ILogger<BaseTaskInfoBusiness> logger, IAirportTaskService Taskservice, IAGVStateService agvService)
{
_logger = logger;
_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,
};
timer.Elapsed += GetAGVTaskInfo;
timer.Start();
}
/// <summary>
/// 获取任务列表
/// </summary>
private void GetAGVTaskInfo(object source, ElapsedEventArgs e)
{
try
{
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)
{
}
}
private List<AGVState> GetAgvState()
{
List<AGVState> State = null;
try
{
State = _AGVStateService.GetAgvState();
return State;
}
catch (Exception ex)
{
return State;
}
}
}
}