using Microsoft.Extensions.Logging;
using SlnMesnac.Config;
using SlnMesnac.Model.AirportApiEntity;
using SlnMesnac.Model.domain;
using SlnMesnac.Model.Enum;
using SlnMesnac.Repository;
using SlnMesnac.Repository.service;
using SlnMesnac.TouchSocket;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace SlnMesnac.Business.@base
{
///
/// AGV业务类
///
public class BaseAGVBusiness
{
private ILogger _logger;
private static BaseAGVBusiness instance;
private AppConfig _appConfig;
private AirPorthttpClient _airPorthttpClient;
private IAGVStateService _AGVStateService;
private IAGVMapPointService _AGVMapPointService;
public BaseAGVBusiness(ILogger logger,
AirPorthttpClient airPorthttpClient,
IAGVStateService AGVStateService,
IAGVMapPointService aGVMapPointService,
AppConfig appConfig)
{
_logger = logger;
_airPorthttpClient = airPorthttpClient;
_AGVStateService = AGVStateService;
_AGVMapPointService = aGVMapPointService;
_appConfig = appConfig;
}
public static BaseAGVBusiness GetInstance(ILogger logger,
AirPorthttpClient airPorthttpClient,
IAGVStateService AGVStateService,
IAGVMapPointService aGVMapPointService,
AppConfig appConfig)
{
if (instance == null)
{
instance = new BaseAGVBusiness(logger, airPorthttpClient, AGVStateService, aGVMapPointService, appConfig);
}
return instance;
}
///
/// 封装任务类
///
///
///
///
///
///
///
///
public AGVRequestAddTaskEntity NewTaskEntity(string AGVGUID, string JobGUID, string PointGUID, string ParamName, string TaskName = "AGVCTask", string RobotType = "S800")
{
AGVRequestAddTaskEntity aGVRequestAddTaskEntity = new AGVRequestAddTaskEntity()
{
businessOrderId = TaskName,
priority = 0,
RobotType = RobotType,
robotId = AGVGUID,
group = "",
taskSource = "agvc",
taskType = 0,
verifyStatus = 0,
enableSplitCar = 0,
load = new List()
{
new LoadsEntity()
{
jobid = JobGUID,
location = PointGUID,
param = new List()
{
new ParamEntity()
{
paramname = ParamName,
paramvalue = PointGUID,
}
},
robotPort = ""
}
},
};
return aGVRequestAddTaskEntity;
}
///
/// 发送封装的任务类
///
/// 任务ID
public string DownloadTask(string AGVGUID, string JobGUID, string PointGUID, string ParamName, string TaskName = "AGVCTask", string RobotType = "S800")
{
try
{
var result = _airPorthttpClient.AGVAddTaskRequest(NewTaskEntity(AGVGUID, JobGUID, PointGUID, ParamName, TaskName, RobotType));
if (result.code == 0)
{
return result.Data.guid;
}
else
{
_logger.LogError("错误响应:" + result.message);
return string.Empty;
}
}
catch (Exception ex)
{
_logger.LogError($"接口发生错误:{ex.Message}");
return string.Empty;
}
}
///
/// 结束指定AGV的任务
///
/// AGV小车编号
///
public bool EndAGVTask(string AGVGUID)
{
try
{
AGVState agvState = _AGVStateService.GetSingleAGVState(AGVGUID);
if (agvState == null)
{
return false;
}
if (agvState.agvworkstate != "待机")
{
var response = _airPorthttpClient.AGVOperationalTaskRequest(new AGVRequestOperationalTaskEntity()
{
taskid = agvState.taskno,
state = 0,
operatingSource = "agvc",
operatingUser = "agvc",
remark = "agvcEnd"
});
if (response.code == 0)
{
_logger.LogInformation($"AGV {agvState.agvno} 任务 {agvState.taskno} 结束成功");
return true;
}
else
{
_logger.LogError($"AGV {agvState.agvno} 任务 {agvState.taskno} 结束失败 ERROR:{response.message}");
return false;
}
}
else if (agvState.agvworkstate == "待机")
{
_logger.LogError($"AGV {agvState.agvno} 现在无任务");
return false;
}
else
{
_logger.LogError($"AGV {agvState.agvno} 终止任务失败!");
return false;
}
}
catch (Exception ex)
{
_logger.LogError($"AGV任务结束失败 ERROR:{ex.Message}");
return false;
}
}
///
/// 获取活跃地图的点位更新到数据库
///
///
public bool GetActiveMapPoint()
{
var result = _airPorthttpClient.AGVMapActiveRequest();
if (result == null)
{
_logger.LogError("AGV活跃地图获取返回Null");
return false;
}
if (result.code != 0)
{
_logger.LogError("AGV活跃地图获取错误,内容:" + result.message);
return false;
}
if (result.Data == null)
{
_logger.LogError("活跃地图获取无数据");
return false;
}
string mapID = result.Data.guid;
var res = _airPorthttpClient.AGVMapPositionRequest(mapID);
if (res == null)
{
_logger.LogError("地图点位获取返回Null");
return false;
}
if (res.code != 0)
{
_logger.LogError($"地图点位获取错误,内容:{res.message}");
}
if (res.Data == null)
{
_logger.LogError("地图点位获取无数据");
return false;
}
List list = new List();
foreach (var a in res.Data)
{
list.Add(new AGVMapPoint()
{
MapID = a.mapId,
PointGuid = a.guid,
PointName = a.name,
PointType = a.type.ToString(),
MapName = a.name,
});
}
return _AGVMapPointService.DeleteAndAddAgvMapPoint(list);
}
///
/// 结束当前任务 清除报警 下发任务
///
///
///
/// 新任务GUID
public string EndTaskAndClearErrorAndDownloadTask(string agvguid, string jobName)
{
bool result = false;
try
{
//终止小车当前任务
result = EndTaskAndClearError(agvguid);
var param = _appConfig.JobConfig.Where(x => x.JobName == jobName).First();
//调用小车到抓取位置
return DownloadTask(agvguid, param.JobGUID, param.PointGUID, param.PointParamName);
}
catch (Exception ex)
{
return string.Empty;
}
}
///
/// 结束任务并清除报警 延迟1s
///
public bool EndTaskAndClearError(string agvguid)
{
bool result1 = false, result2 = false;
try
{
Task.Run(() =>
{
result1 = EndAGVTask(agvguid);
Task.Delay(500);
result2 = ClaerError(agvguid);
});
return result1 && result2;
}
catch (Exception ex)
{
_logger.LogError("结束任务并清除报警发生异常 " + ex);
return false;
}
}
///
/// 清除报警 延迟500ms
///
public bool ClaerError(string agvguid)
{
bool result = false;
try
{
Task.Run(() =>
{
var response = _airPorthttpClient.AGVErrorClear(_appConfig.AGVConfig.Where(x => x.AGVGUID == agvguid).First().AGVIp);
Task.Delay(500);
if (response == null)
{
_logger.LogError("清除报警返回空数据");
result = false;
return false;
}
if(response.code == 0)
{
_logger.LogError("清除报警成功");
result = true;
return true;
}
else
{
_logger.LogError("清除报警失败 message:" + response.message);
result = false;
return false;
}
});
return result;
}
catch (Exception ex)
{
_logger.LogError("清除报警发生异常 " + ex);
return false;
}
}
///
/// 筛选一辆空闲且指定类型剩余可用空间最大的AGV, 返回GUID
///
///
public AGVState GetBestAGV(AgvType agvType)
{
try
{
List lists = _AGVStateService.GetAgvState(agvType).Where(x => x.agvworkstate == "待机").ToList();
AGVState agv = lists.Where(x => x.stackcount == lists.Min(x => x.stackcount)).FirstOrDefault();
//var list = _AGVStateService
return agv;
}
catch(Exception ex)
{
_logger.LogError($"AGV筛选发生错误:{ex.Message}");
return null;
}
}
///
/// AGV任务状态代码匹配
///
///
///
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 "未知代码";
}
}
}
}