|
|
using Microsoft.Extensions.Logging;
|
|
|
using SlnMesnac.Model.AirportApiEntity;
|
|
|
using SlnMesnac.Repository;
|
|
|
using SlnMesnac.Repository.service;
|
|
|
using SlnMesnac.TouchSocket;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
namespace SlnMesnac.Business.@base
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// AGV状态刷新类
|
|
|
/// </summary>
|
|
|
public class BaseStateRefreshBusiness
|
|
|
{
|
|
|
private IAGVStateService _AGVStateService;
|
|
|
private IAGVSettingService _aGVSettingService;
|
|
|
private ILogger<BaseStateRefreshBusiness> _logger;
|
|
|
private static BaseStateRefreshBusiness instance;
|
|
|
private AirPorthttpClient _airPorthttpClient;
|
|
|
System.Timers.Timer updateTimer;
|
|
|
|
|
|
public BaseStateRefreshBusiness(ILogger<BaseStateRefreshBusiness> logger, IAGVStateService agvService, AirPorthttpClient airPorthttpClient, IAGVSettingService aGVSettingService)
|
|
|
{
|
|
|
_logger = logger;
|
|
|
_AGVStateService = agvService;
|
|
|
_airPorthttpClient = airPorthttpClient;
|
|
|
_aGVSettingService = aGVSettingService;
|
|
|
|
|
|
updateTimer = new System.Timers.Timer(1000);
|
|
|
updateTimer.Elapsed += async (sender, e) => await TimerUpadteAGVState();
|
|
|
}
|
|
|
|
|
|
public static BaseStateRefreshBusiness GetInstance(ILogger<BaseStateRefreshBusiness> logger, IAGVStateService agvService, AirPorthttpClient airPorthttpClient, IAGVSettingService aGVSettingService)
|
|
|
{
|
|
|
if (instance == null)
|
|
|
{
|
|
|
instance = new BaseStateRefreshBusiness(logger, agvService, airPorthttpClient, aGVSettingService);
|
|
|
}
|
|
|
return instance;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// AGV状态查询控制
|
|
|
/// </summary>
|
|
|
/// <param name="state"></param>
|
|
|
public void AGVStateUpdateTimerOperation(TimerControl state)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
switch (state)
|
|
|
{
|
|
|
case TimerControl.Start:
|
|
|
updateTimer.Start();
|
|
|
break;
|
|
|
case TimerControl.Stop:
|
|
|
updateTimer.Stop();
|
|
|
break;
|
|
|
case TimerControl.Dispose:
|
|
|
updateTimer.Dispose();
|
|
|
break;
|
|
|
default:
|
|
|
_logger.LogError("未知状态");
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
_logger.LogError("AGV状态操作失败!" + ex.Message);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
public async Task TimerUpadteAGVState()
|
|
|
{
|
|
|
if (!await UpdateALLAGVStateByResposne())
|
|
|
{
|
|
|
_logger.LogError("AGV状态更新失败");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 调用接口更新所有AGV的状态
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
public async Task<bool> UpdateALLAGVStateByResposne()
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
var response = _airPorthttpClient.AGVAllStateRequest();
|
|
|
if(response == null)
|
|
|
{
|
|
|
_logger.LogError($"AgvStateResponse返回空值!");
|
|
|
return false;
|
|
|
}
|
|
|
if(response.code == 0 || response.Data == null)
|
|
|
{
|
|
|
_logger.LogError($"返回错误信息:{response.message}");
|
|
|
return false;
|
|
|
}
|
|
|
List<AGVState> records = new List<AGVState>();
|
|
|
foreach (var entity in response.Data)
|
|
|
{
|
|
|
var taskStateRespose = _airPorthttpClient.AGVGetTaskStateDetailRequest(new AGVRequestTaskStateDetailEntity()
|
|
|
{
|
|
|
taskId = entity.TaskID
|
|
|
});
|
|
|
if (taskStateRespose == null)
|
|
|
{
|
|
|
_logger.LogError($"taskStateRespose返回空值!");
|
|
|
return false;
|
|
|
}
|
|
|
if (taskStateRespose.code == 0 || taskStateRespose.Data == null)
|
|
|
{
|
|
|
_logger.LogError($"返回错误信息:{taskStateRespose.message}");
|
|
|
return false;
|
|
|
}
|
|
|
AGVState record = new AGVState()
|
|
|
{
|
|
|
agvno = entity.Guid,
|
|
|
agvalarmstate = entity.AgvMoveStatus != 6 ? "正常" : "异常",
|
|
|
agvtype = _aGVSettingService.GetAgvSettingByID(entity.Guid),
|
|
|
agvworkstate = AGVStatusSelect(entity.AgvMoveStatus),
|
|
|
refreshtime = DateTime.Now,
|
|
|
taskno = entity.TaskID,
|
|
|
taskstate = AGVTaskStatusSelect(taskStateRespose.Data.state)
|
|
|
};
|
|
|
records.Add(record);
|
|
|
}
|
|
|
return await _AGVStateService.UpdateOrAddRecords(records);
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
_logger.LogError("AGV状态更新错误 Error:" + e);
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// AGV运动状态对照
|
|
|
/// </summary>
|
|
|
/// <param name="no"></param>
|
|
|
/// <returns></returns>
|
|
|
public static string AGVStatusSelect(int no)
|
|
|
{
|
|
|
switch (no)
|
|
|
{
|
|
|
case 0: return "暂无信息";
|
|
|
case 1: return "待机";
|
|
|
case 2: return "执行任务";
|
|
|
case 3: return "充电中";
|
|
|
case 4: return "暂停";
|
|
|
case 5: return "急停";
|
|
|
case 6: return "异常";
|
|
|
case 7: return "建图中";
|
|
|
case 8: return "等待";
|
|
|
case 9: return "调度控制";
|
|
|
case 51: return "同步";
|
|
|
case 52: return "脱机";
|
|
|
default: return "未知代码";
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// AGV任务状态代码匹配
|
|
|
/// </summary>
|
|
|
/// <param name="no"></param>
|
|
|
/// <returns></returns>
|
|
|
public static string AGVTaskStatusSelect(int no)
|
|
|
{
|
|
|
switch (no)
|
|
|
{
|
|
|
case 0: return "已终止";
|
|
|
case 1: return "待执行";
|
|
|
case 2: return "正在执行";
|
|
|
case 3: return "已完成";
|
|
|
case 4: return "已取消";
|
|
|
case 5: return "已暂停";
|
|
|
case 6: return "匹配中";
|
|
|
case 7: return "核验中";
|
|
|
default: return "未知代码";
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public enum TimerControl
|
|
|
{
|
|
|
Start = 1,
|
|
|
Stop = 2,
|
|
|
Dispose = 3
|
|
|
}
|
|
|
}
|