wcs_serve_wuxikate/WcsMain/Business/Convey/HistoryDataHandler/HistoryConveyDataHander.cs
2025-01-03 14:36:27 +08:00

129 lines
4.6 KiB
C#

using Autofac;
using System.Collections.Generic;
using System.Reflection;
using WcsMain.Business.Convey.HistoryDataHandler.HisGetData.I;
using WcsMain.DataBase.Dao;
using WcsMain.DataBase.TableEntity;
using WcsMain.Tcp.Entity.Convey;
using WcsMain.WcsAttribute.AutoFacAttribute;
namespace WcsMain.Business.Convey.HistoryDataHandler;
/// <summary>
/// 传统版本的箱式线数据处理
/// </summary>
/// <param name="routerMethodDao"></param>
[Component]
public class HistoryConveyDataHander(AppRouterMethodDao routerMethodDao, IComponentContext componentContext)
{
private Dictionary<string, IBaseGetData?>? _methodConfig;
private Dictionary<string, AppRouterMethod?>? _areaBaseData;
/// <summary>
/// 处理 PLC 请求分拣路向逻辑
/// </summary>
/// <param name="displayName"></param>
/// <param name="msg"></param>
/// <param name="area"></param>
public void GetData(string? displayName, string msg, string area)
{
LoadingMethodConfig(); // 加载配置信息,仅第一次加载
if (_methodConfig == null || _areaBaseData == null)
{
ConsoleLog.Warning("路由处理参数尚未加载,可能是和数据库服务连接存在异常");
return;
}
var getInstance = _methodConfig.TryGetValue(area ?? "", out var instance);
if (!getInstance || instance == null)
{
ConsoleLog.Warning($"点位:{area} 未配置处理逻辑或者处理逻辑不可用");
return;
}
var areaInfo = _areaBaseData.TryGetValue(area ?? "", out AppRouterMethod? routerMethodData);
if(!areaInfo || routerMethodData == null)
{
ConsoleLog.Warning($"点位:{area} 无可用配置信息");
return;
}
if (msg == "NoRead")
{
instance.ReadFail(displayName, msg, area, routerMethodData);
}
else
{
instance.ReadSuccess(displayName, msg, area, routerMethodData);
}
}
/*************************/
private static readonly object LoadLock = new();
/// <summary>
/// 加载获取路由的参数
/// </summary>
private void LoadingMethodConfig()
{
lock (LoadLock)
{
if (_methodConfig != null && _areaBaseData != null) return;
List<AppRouterMethod>? appRouters = routerMethodDao.Query();
if (appRouters == null) return;
_methodConfig = [];
_areaBaseData = [];
// 扫描创建继承 BaseGetRouter 的类的实例
Dictionary<string, IBaseGetData> classInstances = [];
var assembly = Assembly.GetExecutingAssembly();
var assTypes = assembly.GetTypes();
foreach (var assType in assTypes)
{
var interfaces = assType.GetInterfaces();
foreach (var inteface in interfaces)
{
if (inteface != typeof(IBaseGetData)) continue;
var instance = CreateInstance(assType);
if (instance == null) continue;
classInstances.Add(assType.Name, (IBaseGetData)instance);
}
}
// 将实例和请求点位绑定
foreach (var appRouter in appRouters)
{
if (string.IsNullOrEmpty(appRouter.ClassName)) continue;
var isGetInstance = classInstances.TryGetValue(appRouter.ClassName, out var inst);
if (!isGetInstance) continue;
_methodConfig.TryAdd(appRouter.Area ?? "", inst);
_areaBaseData.TryAdd(appRouter.Area ?? "", appRouter);
}
}
}
/// <summary>
/// 创建实例。自动注入参数
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
private object? CreateInstance(Type type)
{
var constructors = type.GetConstructors();
var constructorList = constructors.ToList();
constructorList = [.. constructorList.OrderByDescending(s => s.GetParameters().Length)];
foreach (var constructor in constructorList)
{
var parameters = constructor.GetParameters();
if (parameters.Length == 0) return Activator.CreateInstance(type);
List<object> arguments = [];
foreach (var parameter in parameters)
{
object par = componentContext.Resolve(parameter.ParameterType);
arguments.Add(par);
}
return Activator.CreateInstance(type, [.. arguments]);
}
return Activator.CreateInstance(type);
}
}