CaesarBao 11 months ago
commit d46e20ede0

@ -11,29 +11,34 @@ namespace SlnMesnac.Business.@base
public class BaseStateRefreshBusiness public class BaseStateRefreshBusiness
{ {
private IAGVStateService _AGVStateService; private IAGVStateService _AGVStateService;
private IManipulatorStateService _ManipulatorStateService;
private ILogger<BaseStateRefreshBusiness> _logger; private ILogger<BaseStateRefreshBusiness> _logger;
private static BaseStateRefreshBusiness instance; private static BaseStateRefreshBusiness instance;
public BaseStateRefreshBusiness(ILogger<BaseStateRefreshBusiness> logger, IAGVStateService agvService, IManipulatorStateService manipulatorStateService) private AirPorthttpClient _airPorthttpClient;
public BaseStateRefreshBusiness(ILogger<BaseStateRefreshBusiness> logger, IAGVStateService agvService, AirPorthttpClient airPorthttpClient)
{ {
_logger = logger; _logger = logger;
_AGVStateService = agvService; _AGVStateService = agvService;
_ManipulatorStateService = manipulatorStateService; _airPorthttpClient = airPorthttpClient;
} }
public static BaseStateRefreshBusiness GetInstance(ILogger<BaseStateRefreshBusiness> logger, IAGVStateService agvService, IManipulatorStateService manipulatorStateService) public static BaseStateRefreshBusiness GetInstance(ILogger<BaseStateRefreshBusiness> logger, IAGVStateService agvService, AirPorthttpClient airPorthttpClient)
{ {
if (instance == null) if (instance == null)
{ {
instance = new BaseStateRefreshBusiness(logger, agvService, manipulatorStateService); instance = new BaseStateRefreshBusiness(logger, agvService, airPorthttpClient);
} }
return instance; return instance;
} }
public bool UpdateAGVStateByResposne(AGVStateRequestEntity request) public bool UpdateAGVStateByResposne()
{ {
try try
{ {
var response = AirPorthttpClient.AGVStateRequest(request); var response = _airPorthttpClient.AGVAllStateRequest();
if(response == null)
{
return false;
}
_AGVStateService.UpdateOrAddByResponse(response); _AGVStateService.UpdateOrAddByResponse(response);
} }
catch (Exception e) catch (Exception e)
@ -43,18 +48,5 @@ namespace SlnMesnac.Business.@base
return true; return true;
} }
public bool UpdateManipulatorStateByResposne(ManipulatorStateRequestEntity request)
{
try
{
var response = AirPorthttpClient.ManipulatorStateRequest(request);
_ManipulatorStateService.UpdateOrAddByResponse(response);
}
catch (Exception e)
{
_logger.LogError("Error:" + e);
}
return true;
}
} }
} }

@ -74,11 +74,6 @@ namespace SlnMesnac.Config
/// </summary> /// </summary>
public string AGVIpConfig { get; set; } public string AGVIpConfig { get; set; }
/// <summary>
/// 机械臂地址配置
/// </summary>
public string ManipulatorIpConfig { get; set; }
/// <summary> /// <summary>
/// 机械臂地址配置 /// 机械臂地址配置
/// </summary> /// </summary>

@ -24,7 +24,7 @@ namespace SlnMesnac.Repository
public int id {get;set;} public int id {get;set;}
/// <summary> /// <summary>
/// Desc: /// Desc:AGV编号
/// Default: /// Default:
/// Nullable:False /// Nullable:False
/// </summary> /// </summary>
@ -32,7 +32,7 @@ namespace SlnMesnac.Repository
public string agvno {get;set;} public string agvno {get;set;}
/// <summary> /// <summary>
/// Desc: /// Desc:AGV类型 1AMR 2: 机械臂
/// Default: /// Default:
/// Nullable:False /// Nullable:False
/// </summary> /// </summary>
@ -40,7 +40,7 @@ namespace SlnMesnac.Repository
public string agvtype {get;set;} public string agvtype {get;set;}
/// <summary> /// <summary>
/// Desc: /// Desc:任务编号
/// Default: /// Default:
/// Nullable:False /// Nullable:False
/// </summary> /// </summary>
@ -48,7 +48,7 @@ namespace SlnMesnac.Repository
public string taskno {get;set;} public string taskno {get;set;}
/// <summary> /// <summary>
/// Desc: /// Desc:AGV报警状态
/// Default: /// Default:
/// Nullable:False /// Nullable:False
/// </summary> /// </summary>
@ -56,7 +56,7 @@ namespace SlnMesnac.Repository
public string agvalarmstate {get;set;} public string agvalarmstate {get;set;}
/// <summary> /// <summary>
/// Desc: /// Desc:AGV工作状态
/// Default: /// Default:
/// Nullable:False /// Nullable:False
/// </summary> /// </summary>
@ -64,7 +64,7 @@ namespace SlnMesnac.Repository
public string agvworkstate {get;set;} public string agvworkstate {get;set;}
/// <summary> /// <summary>
/// Desc: /// Desc:刷新时间
/// Default: /// Default:
/// Nullable:False /// Nullable:False
/// </summary> /// </summary>

@ -35,7 +35,7 @@ namespace SlnMesnac.Repository.service
/// </summary> /// </summary>
/// <param name="response"></param> /// <param name="response"></param>
/// <returns></returns> /// <returns></returns>
Task<bool> UpdateOrAddByResponse(AGVStateResponseEntity response); Task<bool> UpdateOrAddByResponse(AGVResponseEntity<List<ResponseRobotAtrributeDataEntity>> response);
} }
} }

@ -1,39 +0,0 @@
using SlnMesnac.Model.AirportApiEntity;
using SlnMesnac.Model.domain;
using SlnMesnac.Repository.service.@base;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace SlnMesnac.Repository.service
{
public interface IManipulatorStateService : IBaseService<ManipulatorState>
{
/// <summary>
/// 查询空闲的机械臂信息
/// </summary>
/// <returns></returns>
List<ManipulatorState> GetFreeManipulatorState();
/// <summary>
/// 查询所有机械臂信息
/// </summary>
/// <returns></returns>
List<ManipulatorState> GetAllManipulatorState();
/// <summary>
/// 更新机械臂设备状态信息
/// </summary>
/// <param name="record"></param>
/// <returns></returns>
Task<bool> UpdateAsync(ManipulatorState record);
/// <summary>
/// 更新或插入机械臂设备状态信息
/// </summary>
/// <param name="response"></param>
/// <returns></returns>
Task<bool> UpdateOrAddByResponse(ManipulatorStateResponseEntity response);
}
}

@ -26,13 +26,18 @@ namespace SlnMesnac.Repository.service.Impl
try try
{ {
Expression<Func<AGVState, bool>> exp = x => true; Expression<Func<AGVState, bool>> exp = x => true;
exp = exp.And(x =>(x.agvno != null || x.agvno != "") && (x.taskno == null || x.taskno == "") && x.agvworkstate == "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" && (x.agvalarmstate == null || x.agvalarmstate == "") && x.agvtype == _AgvType); exp = exp.And(x =>
(x.agvno != null || x.agvno != "")
&& (x.taskno == null || x.taskno == "")
&& x.agvworkstate == "空闲"
&& (x.agvalarmstate == null || x.agvalarmstate == "")
&& x.agvtype == _AgvType);
agvStateInfoList = base._rep.GetList(exp); agvStateInfoList = base._rep.GetList(exp);
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError($"<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>AGV<EFBFBD><EFBFBD>Ϣ<EFBFBD>:{ex.Message}"); _logger.LogError($"AGV状态获取错误:{ex.Message}");
} }
return agvStateInfoList; return agvStateInfoList;
} }
@ -46,7 +51,7 @@ namespace SlnMesnac.Repository.service.Impl
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError($"<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>AGV<EFBFBD><EFBFBD>Ϣ<EFBFBD>:{ex.Message}"); _logger.LogError($"所有AGV状态获取错误:{ex.Message}");
} }
return agvStateInfoList; return agvStateInfoList;
} }
@ -57,34 +62,43 @@ namespace SlnMesnac.Repository.service.Impl
return result; return result;
} }
public async Task<bool> UpdateOrAddByResponse(AGVStateResponseEntity response) public async Task<bool> UpdateOrAddByResponse(AGVResponseEntity<List<ResponseRobotAtrributeDataEntity>> response)
{
List<AGVState> records = new List<AGVState>();
foreach (var entity in response.Data)
{ {
AGVState record = new AGVState() AGVState record = new AGVState()
{ {
agvno = response.AGVNo, agvno = entity.Guid,
agvalarmstate = response.AGVAlarmState, agvalarmstate = entity.AgvMoveStatus != 6 ? "正常" : "异常",
agvtype = response.AGVType, agvtype = entity.Name,
agvworkstate = response.AGVWorkState, agvworkstate = entity.AgvMoveStatus == 1 ? "空闲" : "忙碌",
refreshtime = DateTime.Now, refreshtime = DateTime.Now,
taskno = response.TaskNo, taskno = entity.TaskID,
}; };
records.Add(record);
}
bool result = false; bool result = false;
try try
{ {
var list = GetAllAGVState(); var list = GetAllAGVState();
if (list.Where(x => x.agvno == response.AGVNo).Count() == 0) foreach (var r in records)
{ {
result = _rep.Insert(record); if (list.Where(x => x.agvno == r.agvno).Count() == 0)
{
result = _rep.Insert(r);
} }
else else
{ {
record.id = list.Where(x => x.agvno == response.AGVNo).FirstOrDefault().id; r.id = list.Where(x => x.agvno == r.agvno).FirstOrDefault().id;
result = await _rep.UpdateAsync(record); result = await _rep.UpdateAsync(r);
}
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError($"<EFBFBD><EFBFBD>е<EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣:{ex.Message}"); _logger.LogError($"AGV状态更新错误{ex.Message}");
} }
return result; return result;
} }

@ -1,92 +0,0 @@
using Microsoft.Extensions.Logging;
using SlnMesnac.Common;
using SlnMesnac.Model.AirportApiEntity;
using SlnMesnac.Model.domain;
using SlnMesnac.Repository.service.@base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace SlnMesnac.Repository.service.Impl
{
public class ManipulatorStateServiceImpl : BaseServiceImpl<ManipulatorState>, IManipulatorStateService
{
private ILogger<ManipulatorStateServiceImpl> _logger;
public ManipulatorStateServiceImpl(Repository<ManipulatorState> rep, ILogger<ManipulatorStateServiceImpl> logger) : base(rep)
{
_logger = logger;
}
public List<ManipulatorState> GetAllManipulatorState()
{
var list = new List<ManipulatorState>();
try
{
list = base._rep.GetList();
}
catch (Exception ex)
{
_logger.LogError($"所有机械臂状态信息获取异常:{ex.Message}");
}
return list;
}
public List<ManipulatorState> GetFreeManipulatorState()
{
var list = new List<ManipulatorState>();
try
{
list = base._rep.GetList()
.Where(x => x.ManipulatorNo != "" && (x.TaskNo == null || x.TaskNo == "") && x.ManipulatorWorkState == "任务空闲")
.ToList();
}
catch (Exception ex)
{
_logger.LogError($"空闲机械臂状态信息获取异常:{ex.Message}");
}
return list;
}
public async Task<bool> UpdateAsync(ManipulatorState record)
{
bool result = await _rep.UpdateAsync(record);
return result;
}
public async Task<bool> UpdateOrAddByResponse(ManipulatorStateResponseEntity response)
{
ManipulatorState record = new ManipulatorState()
{
ManipulatorNo = response.ManipulatorNo,
ManipulatorAlarmState = response.ManipulatorAlarmState,
ManipulatorWorkState = response.ManipulatorWorkState,
TaskNo = response.TaskNo,
RefreshTime = DateTime.Now,
};
bool result = false;
try
{
var list = GetAllManipulatorState();
if (list.Where(x => x.ManipulatorNo == response.ManipulatorNo).Count() == 0)
{
result = _rep.Insert(record);
}
else
{
record.ID = list.Where(x => x.ManipulatorNo == response.ManipulatorNo).FirstOrDefault().ID;
result = await _rep.UpdateAsync(record);
}
}
catch(Exception ex)
{
_logger.LogError($"机械臂状态信息更新异常:{ex.Message}");
}
return result;
}
}
}

@ -15,11 +15,13 @@ using TouchSocket.Rpc;
using TouchSocket.Sockets; using TouchSocket.Sockets;
using TouchSocket.WebApi; using TouchSocket.WebApi;
using JsonSerializer = System.Text.Json.JsonSerializer; using JsonSerializer = System.Text.Json.JsonSerializer;
using Serilog;
using Serilog.Events;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace SlnMesnac.TouchSocket namespace SlnMesnac.TouchSocket
{ {
public class AirPorthttpClient : BackgroundService public class AirPorthttpClient
{ {
private readonly AppConfig _appConfig; private readonly AppConfig _appConfig;
private readonly ILogger<AirPorthttpClient> _logger; private readonly ILogger<AirPorthttpClient> _logger;
@ -31,71 +33,146 @@ namespace SlnMesnac.TouchSocket
} }
public static WebApiClient AirportAGVClient; public static WebApiClient AirportAGVClient;
public static WebApiClient AirportManipulatorClient;
private WebApiClient CreateWebApiClient(string IpHost) private WebApiClient CreateWebApiClient(string IpHost)
{ {
var client = new WebApiClient(); var client = new WebApiClient();
try try
{ {
_logger.LogInformation("正在连接:" + IpHost);
client.Connect(IpHost); client.Connect(IpHost);
_logger.LogInformation(IpHost + "连接成功"); _logger.LogInformation(IpHost + "连接成功");
return client;
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError("ERROR: " + ex.Message); _logger.LogError("ERROR: " + ex.Message);
return null; return null;
} }
return client;
} }
protected override Task ExecuteAsync(CancellationToken stoppingToken) public void init()
{ {
try try
{ {
AirportAGVClient = CreateWebApiClient(_appConfig.AGVIpConfig); AirportAGVClient = CreateWebApiClient(_appConfig.AGVIpConfig);
AirportManipulatorClient = CreateWebApiClient(_appConfig.ManipulatorIpConfig);
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError("ERROR: " + ex.Message); _logger.LogError("ERROR: " + ex.Message);
return Task.FromException(ex);
} }
return Task.CompletedTask;
} }
/// <summary> /// <summary>
/// AGV呼叫请求 /// 获取到的JToken类型转换为实体类
/// </summary> /// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns> /// <returns></returns>
public static string AGVCallRequest() public T JTokenToEntity<T>(JToken value) where T : class
{ {
JToken responseValue = AirportAGVClient.InvokeT<JToken>("POST:", null, new AGVSingalEntity()); if (value == null)
{
return responseValue.ToString(); return null;
} }
string json = value.ToString();
/// <summary>
/// AGV状态请求
/// </summary>
/// <param name="aGVStateRequest"></param>
/// <returns></returns>
public static AGVStateResponseEntity AGVStateRequest(AGVStateRequestEntity aGVStateRequest)
{
JToken responseValue = AirportAGVClient.InvokeT<JToken>("POST:/m1/5051269-4712337-default/apitest/AGVtest", null, aGVStateRequest);
if (responseValue == null)
{
return new AGVStateResponseEntity();
}
string json = responseValue.ToString();
if (string.IsNullOrEmpty(json)) if (string.IsNullOrEmpty(json))
{ {
return new AGVStateResponseEntity(); return null;
} }
AGVStateResponseEntity aGVStateResponseEntity = new AGVStateResponseEntity(); T ResponseEntity;
aGVStateResponseEntity = JsonSerializer.Deserialize<AGVStateResponseEntity>(json); ResponseEntity = JsonSerializer.Deserialize<T>(json);
return aGVStateResponseEntity; return ResponseEntity;
}
/// <summary>
/// AGV下发任务请求
/// </summary>
/// <param name="requestValue"></param>
/// <returns></returns>
public AGVResponseEntity<ResponseAddTaskDataEntity> AGVAddTaskRequest(AGVRequestAddTaskEntity requestValue)
{
if (AirportAGVClient == null)
{
return null;
}
JToken responseValue = AirportAGVClient.InvokeT<JToken>("POST:/api/task/addTask", null, requestValue);
return JTokenToEntity<AGVResponseEntity<ResponseAddTaskDataEntity>>(responseValue);
}
/// <summary>
/// 取消/终止任务请求
/// </summary>
/// <param name="requestValue"></param>
/// <returns></returns>
public AGVResponseEntity<object> AGVOperationalTaskRequest(AGVRequestOperationalTaskEntity requestValue)
{
if (AirportAGVClient == null)
{
return null;
}
JToken responseValue = AirportAGVClient.InvokeT<JToken>("POST:/api/task/operationalTask", null, requestValue);
return JTokenToEntity<AGVResponseEntity<object>>(responseValue);
}
/// <summary>
/// 查询任务状态请求
/// </summary>
/// <param name="requestValue"></param>
/// <returns></returns>
public AGVResponseEntity<ResponseTaskStateDetailDataEntity> AGVGetTaskStateDetailRequest(AGVRequestTaskStateDetailEntity requestValue)
{
if (AirportAGVClient == null)
{
return null;
}
JToken responseValue = AirportAGVClient.InvokeT<JToken>("PUT:/api/task/getTaskStateDetail", null, requestValue);
return JTokenToEntity<AGVResponseEntity<ResponseTaskStateDetailDataEntity>>(responseValue);
}
/// <summary>
/// 获取所有AGV信息请求
/// </summary>
/// <returns></returns>
public AGVResponseEntity<List<ResponseRobotAtrributeDataEntity>> AGVAllStateRequest()
{
if (AirportAGVClient == null)
{
return null;
}
JToken responseValue = AirportAGVClient.InvokeT<JToken>("GET:/api/task/robot/getRobot", null);
return JTokenToEntity<AGVResponseEntity<List<ResponseRobotAtrributeDataEntity>>>(responseValue);
}
/// <summary>
/// 获取当前激活地图信息请求
/// </summary>
/// <returns></returns>
public AGVResponseEntity<ResponseActiveMapDataEntity> AGVMapActiveRequest()
{
if (AirportAGVClient == null)
{
return null;
}
JToken responseValue = AirportAGVClient.InvokeT<JToken>("GET:/api/v1.0.0/Maps/mapActive", null);
return JTokenToEntity<AGVResponseEntity<ResponseActiveMapDataEntity>>(responseValue);
}
/// <summary>
/// 获取当前地图所有位置点请求
/// </summary>
/// <param name="requestValue"></param>
/// <returns></returns>
public AGVResponseEntity<List<ResponseMapPositionDataEntity>> AGVMapPositionRequest(string requestValue)
{
if (AirportAGVClient == null)
{
return null;
}
JToken responseValue = AirportAGVClient.InvokeT<JToken>("GET:/api/v1.0.0/Positions?mapId={0}", null, requestValue);
return JTokenToEntity<AGVResponseEntity<List<ResponseMapPositionDataEntity>>>(responseValue);
} }
} }
} }

@ -93,8 +93,6 @@ namespace SlnMesnac.TouchSocket
ReceiveStackWorkDoneEvent += StackResultSend; ReceiveStackWorkDoneEvent += StackResultSend;
ReceiveManualExceptionDealDoneEvent += ManualExceptionDealDone; ReceiveManualExceptionDealDoneEvent += ManualExceptionDealDone;
} }
public void Init(int serverPort) public void Init(int serverPort)

@ -5,6 +5,7 @@ using System.Text;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using TouchSocket.Sockets; using TouchSocket.Sockets;
using TouchSocket.WebApi; using TouchSocket.WebApi;
using SlnMesnac.Config;
#region << 版 本 注 释 >> #region << 版 本 注 释 >>
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
@ -39,8 +40,10 @@ namespace SlnMesnac.TouchSocket
public static IApplicationBuilder UseTouchSocketExtensions(this IApplicationBuilder app) public static IApplicationBuilder UseTouchSocketExtensions(this IApplicationBuilder app)
{ {
var _server = app.ApplicationServices.GetService<TcpServer>(); var _server = app.ApplicationServices.GetService<TcpServer>();
_server.Init(6001); var _httpclient = app.ApplicationServices.GetService<AirPorthttpClient>();
_server.Init(6001);
_httpclient.init();
// var _apiServer = app.ApplicationServices.GetService<WebApiServer>(); // var _apiServer = app.ApplicationServices.GetService<WebApiServer>();
// _apiServer.Init(); // _apiServer.Init();
return app; return app;

@ -46,7 +46,7 @@ namespace SlnMesnac.WPF
services.AddPlcFactorySetup(); services.AddPlcFactorySetup();
//注册httpClient //注册httpClient
services.AddHostedService<AirPorthttpClient>(); //services.AddHostedService<AirPorthttpClient>();
//注册TCPServer //注册TCPServer
//services.AddHostedService<TcpServer>(); //services.AddHostedService<TcpServer>();

@ -53,7 +53,6 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
private ILogger<BaseStateRefreshBusiness> _stateBusinessLogger; private ILogger<BaseStateRefreshBusiness> _stateBusinessLogger;
private IAirportTaskService _taskservice; private IAirportTaskService _taskservice;
private IAGVStateService _agvstateService; private IAGVStateService _agvstateService;
private IManipulatorStateService _monipulatorstateService;
private BaseTaskInfoBusiness _taskInfoBusiness; private BaseTaskInfoBusiness _taskInfoBusiness;
private BaseStateRefreshBusiness _StateRefreshBusiness; private BaseStateRefreshBusiness _StateRefreshBusiness;
private DispatcherTimer _timer; private DispatcherTimer _timer;
@ -110,7 +109,6 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
#region 测试数据 #region 测试数据
LoadTaskInfo(); LoadTaskInfo();
//Thread.Sleep(5000); //Thread.Sleep(5000);
//_tcpServer.SendReplyGetManualException( //_tcpServer.SendReplyGetManualException(

@ -82,8 +82,7 @@
"redisConfig": "175.27.215.92:6379,password=redis@2023", "redisConfig": "175.27.215.92:6379,password=redis@2023",
"AGVIpConfig": "127.0.0.1:4523", "AGVIpConfig": "http://192.168.40.81:5102",
"ManipulatorIpConfig": "127.0.0.1:4523",
"TCPVisionConfig": "127.0.0.1:6000" "TCPVisionConfig": "127.0.0.1:6000"
} }

Loading…
Cancel
Save