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.

253 lines
7.7 KiB
C#

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using SlnMesnac.Config;
using SlnMesnac.Model.domain;
using SlnMesnac.Model.dto;
using SlnMesnac.Plc;
using SlnMesnac.Repository.service;
using SlnMesnac.Rfid;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* (c) 2024 WenJY
* CLR4.0.30319.42000
* LAPTOP-E0N2L34V
* SlnMesnac.Business.base
* ed6470dd-80bf-4a9b-bfae-3c3a46af4c38
*
* WenJY
* wenjy@mesnac.com
* 2024-04-08 17:18:05
* V1.0.0
*
*
*--------------------------------------------------------------------
*
*
*
*
* V1.0.0
*--------------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
namespace SlnMesnac.Business.@base
{
/// <summary>
/// 业务基类
/// </summary>
public class BaseBusiness
{
public readonly ILogger<BaseBusiness> _logger;
/// <summary>
/// 参数配置
/// </summary>
public readonly AppConfig _appConfig;
/// <summary>
/// PLC工厂
/// </summary>
public readonly List<PlcAbsractFactory> _plcFactories;
/// <summary>
/// RFID工厂
/// </summary>
public readonly List<RfidAbsractFactory> _rfidFactories;
/// <summary>
/// 容器
/// </summary>
private IServiceProvider _serviceProvider;
#region 本地缓存信息
private List<BaseConfigInfo> baseConfigInfos;
#endregion
/// <summary>
/// 刷新日志信息
/// </summary>
/// <param name="msg"></param>
public delegate void PrintMessageToListBox(string msg);
public event PrintMessageToListBox? PrintMessageToListBoxEvent;
public BaseBusiness(ILogger<BaseBusiness> logger, AppConfig appConfig, List<PlcAbsractFactory> plcFactories, List<RfidAbsractFactory> rfidFactories, IServiceProvider serviceProvider)
{
_logger = logger;
_appConfig = appConfig;
_plcFactories = plcFactories;
_rfidFactories = rfidFactories;
_serviceProvider = serviceProvider;
using (var scope = _serviceProvider.CreateScope())
{
baseConfigInfos = scope.ServiceProvider.GetRequiredService<List<BaseConfigInfo>>();
}
}
/// <summary>
/// 刷新日志
/// </summary>
/// <param name="msg"></param>
public void RefreshMessage(string msg)
{
_logger.LogInformation(msg);
PrintMessageToListBoxEvent?.Invoke(msg);
}
/// <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}");
}
}
/// <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 void ReadEpcStrByRfidKey(string rfidKey, out string epcStr)
{
try
{
var rfidEquip = GetRfidByKey(rfidKey);
List<TagInfo> tagInfoList = rfidEquip.TimePeriodRead();
epcStr = tagInfoList.OrderByDescending(x => x.Count).First().EPCstring;
}
catch (Exception ex)
{
throw new InvalidOperationException($"根据RFID 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)
{
//TODO 推送设备报警
return null;
}
List<TagInfo> tagInfoList =await rfidEquip.GetRFIDAsync();
epcStr = tagInfoList.OrderByDescending(x => x.Count).First().EPCstring;
return epcStr;
}
catch (Exception ex)
{
// throw new InvalidOperationException($"根据RFID Key读取RFID信息异常:{ex.Message}");
return null;
}
}
/// <summary>
/// 根据configKey获取PLC地址
/// </summary>
/// <param name="configKey"></param>
/// <returns></returns>
/// <exception cref="InvalidOperationException"></exception>
public string GetPlcAddressByConfigKey(string configKey)
{
try
{
if (baseConfigInfos.Count == 0)
{
throw new ArgumentNullException("根据Key获取PLC地址异常:配置集合为空");
}
var result = baseConfigInfos.Where(x => x.ConfigKey == configKey).First().ConfigValue;
return result;
}
catch (Exception ex)
{
throw new InvalidOperationException($"根据Key获取PLC地址异常{configKey}:{ex.Message}");
}
}
}
}