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.

301 lines
11 KiB
C#

7 months ago
using Microsoft.Extensions.DependencyInjection;
using SlnMesnac.Model.domain;
using SlnMesnac.Model.dto;
using SlnMesnac.Plc;
using SlnMesnac.Rfid;
using SlnMesnac.Serilog;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* (c) 2024 WenJY
* CLR4.0.30319.42000
* LAPTOP-E0N2L34V
* SlnMesnac.Business.base
* b00d95c1-a164-43a3-9f34-2a5d2efb3f34
*
* WenJY
* wenjy@mesnac.com
* 2024-04-12 17:36:19
* V1.0.0
*
*
*--------------------------------------------------------------------
*
*
*
*
* V1.0.0
*--------------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
namespace SlnMesnac.Business.@base
{
public class BaseBusiness
{
private readonly SerilogHelper _logger;
private readonly List<PlcAbsractFactory> _plcFactories;
private readonly List<RfidAbsractFactory> _rfidFactories;
private readonly ISqlSugarClient sqlSugarClient;
private IServiceProvider _serviceProvider;
public BaseBusiness(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
_logger = serviceProvider.GetRequiredService<SerilogHelper>();
sqlSugarClient = serviceProvider.GetRequiredService<ISqlSugarClient>();
using (var scope = _serviceProvider.CreateScope())
{
_plcFactories = scope.ServiceProvider.GetRequiredService<List<PlcAbsractFactory>>();
_rfidFactories = scope.ServiceProvider.GetRequiredService<List<RfidAbsractFactory>>();
}
}
/// <summary>
/// 根据Key获取PLC连接信息
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
/// <exception cref="ArgumentNullException"></exception>
/// <exception cref="InvalidOperationException"></exception>
public PlcAbsractFactory GetPlcByKey(string key)
{
if (_plcFactories == null)
{
throw new ArgumentNullException($"根据Key获取PLC连接信息异常:PLC 连接信息为空");
}
if (string.IsNullOrEmpty(key))
{
throw new ArgumentNullException("根据Key获取PLC连接信息异常:设备Key参数为空");
}
try
{
var info = _plcFactories.Where(x => x.ConfigKey == key).FirstOrDefault();
return info;
}
catch (Exception ex)
{
throw new InvalidOperationException($"根据Key获取PLC连接信息异常:{ex.Message}");
}
}
#region RFID相关
/// <summary>
/// 根据Key获取Rfid连接信息
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
/// <exception cref="ArgumentNullException"></exception>
/// <exception cref="InvalidOperationException"></exception>
public RfidAbsractFactory GetRfidByKey(string key)
{
if (_rfidFactories == null)
{
throw new ArgumentNullException($"根据Key获取RFID连接信息异常:PLC 连接信息为空");
}
if (string.IsNullOrEmpty(key))
{
throw new ArgumentNullException("根据Key获取RFID连接信息异常:设备Key参数为空");
}
try
{
var info = _rfidFactories.Where(x => x.ConfigKey == key).FirstOrDefault();
return info;
}
catch (Exception ex)
{
throw new InvalidOperationException($"根据Key获取RFID连接信息异常:{ex.Message}");
}
}
/// <summary>
/// 使用---根据RFID Key读取RFID信息
/// </summary>
/// <param name="rfidKey"></param>
/// <param name="epcStr"></param>
/// <exception cref="InvalidOperationException"></exception>
public async Task<string> ReadEpcStrByRfidKeyAsync(string rfidKey)
{
try
{
string epcStr = string.Empty;
var rfidEquip = GetRfidByKey(rfidKey);
if (rfidEquip == null || rfidEquip.GetOnlineStatus() == false)
{
return "";
}
List<TagInfo> tagInfoList = await rfidEquip.GetRFIDAsync();
if (tagInfoList == null || tagInfoList.Count == 0) return "";
tagInfoList = tagInfoList.Where(X => X.EPCstring.Length == 12).ToList();
7 months ago
epcStr = tagInfoList.OrderByDescending(x => x.Count).First().EPCstring;
epcStr = epcStr.Replace(" ", "").Replace("\r\n", "").Replace("\0", "").Replace("\n", "");
return epcStr;
}
catch (Exception ex)
{
// throw new InvalidOperationException($"根据RFID Key读取RFID信息异常:{ex.Message}");
return "";
}
}
/// <summary>
/// 连廊使用---根据RFID Key读取RFID信息并返回读取类型:type-0读取失败; type-1读取oktype-2串读
/// </summary>
/// <param name="rfidKey"></param>
/// <param name="epcStr"></param>
/// <exception cref="InvalidOperationException"></exception>
public string ReadEpcStrByRfidKeyAndReturnType(string rfidKey, out int type)
{
try
{
type = 0;
string epcStr = string.Empty;
var rfidEquip = GetRfidByKey(rfidKey);
if (rfidEquip == null || rfidEquip.GetOnlineStatus() == false)
{
return "";
}
List<TagInfo> tagInfoList = rfidEquip.GetRFID();
if (tagInfoList == null || tagInfoList.Count == 0) return "";
//读取到不同RFID的个数
int codeDistinctCount = tagInfoList.Select(x => x.EPCstring).Distinct().Count();
if (codeDistinctCount == 0)
{
type = 0;
}
else if (codeDistinctCount == 1)
{
type = 1;
}
else if (codeDistinctCount > 1)
{
//串读
type = 2;
}
epcStr = tagInfoList.OrderByDescending(x => x.Count).First().EPCstring;
epcStr = epcStr.Replace(" ", "").Replace("\r\n", "").Replace("\0", "").Replace("\n", "");
return epcStr;
}
catch (Exception ex)
{
// throw new InvalidOperationException($"根据RFID Key读取RFID信息异常:{ex.Message}");
type = 0;
return "";
}
}
/// <summary>
/// 使用---根据RFID Key读取RFID信息
/// </summary>
/// <param name="rfidKey"></param>
/// <param name="epcStr"></param>
/// <exception cref="InvalidOperationException"></exception>
public string ReadEpcStrByRfidKey(string rfidKey)
{
try
{
string epcStr = string.Empty;
var rfidEquip = GetRfidByKey(rfidKey);
if (rfidEquip == null || rfidEquip.GetOnlineStatus() == false)
{
return "";
}
List<TagInfo> tagInfoList = rfidEquip.GetRFID();
if (tagInfoList == null || tagInfoList.Count == 0) return "";
epcStr = tagInfoList.OrderByDescending(x => x.Count).First().EPCstring;
epcStr = epcStr.Replace(" ", "").Replace("\r\n", "").Replace("\0", "").Replace("\n", "");
return epcStr;
}
catch (Exception ex)
{
// throw new InvalidOperationException($"根据RFID Key读取RFID信息异常:{ex.Message}");
return "";
}
}
7 months ago
/// <summary>
/// 使用---根据RFID Key读取光电信号
/// 有物体返回true
/// </summary>
/// <param name="rfidKey"></param>
/// <param name="epcStr"></param>
/// <exception cref="InvalidOperationException"></exception>
public async Task<bool> ReadSignalByRfidKeyAsync(string rfidKey)
{
try
{
var rfidEquip = GetRfidByKey(rfidKey);
if (rfidEquip == null || rfidEquip.GetOnlineStatus() == false)
{
return false;
}
bool result = await rfidEquip.GetSignalAsync();
return result;
}
catch (Exception ex)
{
return false;
}
}
#endregion RFID相关
///// <summary>
///// 寻找可用agv算法 -- //根据电量计算选取在线电量最低的未处于充电状态的正常状态的agv
///// </summary>
///// <returns></returns>
//public WcsBaseEquip? GetCanUseAgv()
//{
// List<WcsBaseEquip> agvList = sqlSugarClient.Queryable<WcsBaseEquip>()
// .LeftJoin<WcsTask>((equip, task) => equip.EquipNo == task.NextPointNo)
// .Where((equip, task) => equip.EquipType == 1 && task.NextPointNo == null)
// .Select((equip, task) => equip)
// .ToList();
// try
// {
// if (agvList.Count == 0)
// {
// return null;
// }
// List<string> equipNos = agvList.Select(it => it.EquipNo).ToList();
// //查询在线的不在充电状态的agv
// List<WcsAgvStatus>? agvStatusList = sqlSugarClient.Queryable<WcsAgvStatus>().Where(x => equipNos.Contains(x.EquipNo) && x.Online == "true" && x.Status != "7").ToList();
// if (agvStatusList == null || agvStatusList.Count == 0)
// {
// return null;
// }
// WcsBaseEquip targetAgv = agvList.First(x => x.EquipNo == agvStatusList.OrderBy(x => x.Battery).First().EquipNo);
// return targetAgv;
// }
// catch (Exception ex)
// {
// _logger.Error($"寻找可用agv算法GetCanUseAgv 异常{ex.Message}");
// return null;
// }
//}
}
}