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.

197 lines
6.8 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.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
}
}