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.

245 lines
8.9 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<AirportTask> _Taskaction;
public Action<string> _RefreshLogMessageAction;
private static BaseTaskInfoBusiness instance;
private ILogger<BaseTaskInfoBusiness> _logger;
private IAirportTaskService _Taskservice;
private IAGVStateService _AGVStateService;
public BaseTaskInfoBusiness(ILogger<BaseTaskInfoBusiness> logger, IAirportTaskService Taskservice, IAGVStateService agvService, TcpServer tcpServer)
{
_logger = logger;
_tcpServer = tcpServer;
_Taskservice = Taskservice;
_AGVStateService = agvService;
InitClearTimer();
//doWhileGetAGVTaskInfo();
}
public static BaseTaskInfoBusiness GetInstance(ILogger<BaseTaskInfoBusiness> 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();
}
/// <summary>
/// 获取任务列表
/// </summary>
private void GetAGVTaskInfo(object source, ElapsedEventArgs e)
{
try
{
List<AirportTask> 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($"正在为AGVAMR分配任务...");
_logger.LogInformation($"正在为AGVAMR分配任务");
//查询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)
{
}
}
/// <summary>
/// 向AMR派发任务
/// </summary>
/// <param name="AirportTask"></param>
/// <returns></returns>
private bool CreateAMRTask(AirportTask AirportTask)
{
bool iflag = false;
try
{
iflag = true;
List<AGVState> 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;
}
}
/// <summary>
/// 向AGV派发任务
/// </summary>
/// <returns></returns>
private bool CreateAGVTask(AirportTask AirportTask)
{
bool iflag = false;
try
{
iflag = true;
List<AGVState> 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;
}
}
/// <summary>
/// 获取agv设备状态
/// </summary>
/// <returns></returns>
private List<AGVState> GetAgvState(AgvType AgvType)
{
List<AGVState> State = null;
try
{
State = _AGVStateService.GetAgvState(AgvType);
return State;
}
catch (Exception ex)
{
return State;
}
}
}
}