139 lines
4.7 KiB
C#
139 lines
4.7 KiB
C#
using Autofac;
|
|
using System.Reflection;
|
|
using WcsMain.Business.Convey.DataHandler.GetRouter.I;
|
|
using WcsMain.DataBase.Dao;
|
|
using WcsMain.DataBase.TableEntity;
|
|
using WcsMain.Tcp.Entity.Convey;
|
|
using WcsMain.WcsAttribute.AutoFacAttribute;
|
|
|
|
namespace WcsMain.Business.Convey.DataHandler;
|
|
|
|
/// <summary>
|
|
/// 输送线收到的数据处理基础类
|
|
/// </summary>
|
|
[Component]
|
|
public class BaseConveyDataHandler(AppRouterMethodDao routerMethodDao, IComponentContext componentContext)
|
|
{
|
|
private readonly IComponentContext _componentContext = componentContext;
|
|
private readonly AppRouterMethodDao _routerMethodDao = routerMethodDao;
|
|
|
|
private Dictionary<string, IBaseGetRouter?>? methodConfig;
|
|
|
|
/// <summary>
|
|
/// 处理 PLC 请求分拣路向逻辑
|
|
/// </summary>
|
|
/// <param name="displayName"></param>
|
|
/// <param name="msg"></param>
|
|
public void GetRouter(string? displayName, string msg)
|
|
{
|
|
LoadingMethodConfig(); // 加载配置信息,仅第一次加载
|
|
if(methodConfig == default)
|
|
{
|
|
ConsoleLog.Warning("路由处理参数尚未加载,可能是和数据库服务连接存在异常");
|
|
return;
|
|
}
|
|
GetRouterData? routerData = FormatGetRouterData(msg);
|
|
if(routerData == default )
|
|
{
|
|
ConsoleLog.Warning($"数据不能正常识别,数据:{msg}");
|
|
return;
|
|
}
|
|
var getInstance = methodConfig.TryGetValue(routerData.Area ?? "", out var instance);
|
|
if(!getInstance || instance == default)
|
|
{
|
|
ConsoleLog.Warning($"点位:{routerData.Area} 未配置处理逻辑或者处理逻辑不可用");
|
|
return;
|
|
}
|
|
if(routerData.Code == "NoRead")
|
|
{
|
|
instance.ReadFail(routerData, displayName, msg);
|
|
}
|
|
else
|
|
{
|
|
instance.ReadSuccess(routerData, displayName, msg);
|
|
}
|
|
}
|
|
|
|
/*************************/
|
|
|
|
/// <summary>
|
|
/// 加载获取路由的参数
|
|
/// </summary>
|
|
private void LoadingMethodConfig()
|
|
{
|
|
if (methodConfig != default) return;
|
|
List<AppRouterMethod>? appRouters = _routerMethodDao.Query();
|
|
if (appRouters == default) return;
|
|
methodConfig = [];
|
|
// 扫描创建继承 BaseGetRouter 的类的实例
|
|
Dictionary<string, IBaseGetRouter> 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.GetType() != typeof(IBaseGetRouter)) continue;
|
|
var instance = Activator.CreateInstance(inteface.GetType());
|
|
if (instance == default) continue;
|
|
classInstances.Add(assType.Name, (IBaseGetRouter)instance);
|
|
}
|
|
}
|
|
// 将实例和请求点位绑定
|
|
foreach (var appRouter in appRouters)
|
|
{
|
|
if(string.IsNullOrEmpty(appRouter.ClassName)) continue;
|
|
bool isGetInstance = classInstances.TryGetValue(appRouter.ClassName, out var inst);
|
|
if (!isGetInstance) continue;
|
|
methodConfig.TryAdd(appRouter.Area ?? "", inst);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/****************************** 格式化数据 ***************************/
|
|
|
|
/// <summary>
|
|
/// PLC请求WCS路向的请求体格式化
|
|
/// </summary>
|
|
/// <param name="msg"></param>
|
|
/// <returns></returns>
|
|
private GetRouterData? FormatGetRouterData(string msg)
|
|
{
|
|
if (string.IsNullOrEmpty(msg)) return default;
|
|
msg = msg.Trim().TrimStart('<').TrimEnd('>');
|
|
string[] datas = msg.Split(';');
|
|
if (datas.Length != 14) return default;
|
|
try
|
|
{
|
|
return new GetRouterData
|
|
{
|
|
MsgType = datas[0],
|
|
ClientId = datas[1],
|
|
MsgId = datas[2],
|
|
MsgTag = datas[3],
|
|
Area = datas[4],
|
|
SortStatus = datas[5],
|
|
Code = datas[6],
|
|
Size = datas[7],
|
|
Weight = Convert.ToDecimal(string.IsNullOrEmpty(datas[8]) ? 0 : datas[8]),
|
|
Length = Convert.ToDecimal(string.IsNullOrEmpty(datas[9]) ? 0 : datas[9]),
|
|
Width = Convert.ToDecimal(string.IsNullOrEmpty(datas[10]) ? 0 : datas[10]),
|
|
Hight = Convert.ToDecimal(string.IsNullOrEmpty(datas[11]) ? 0 : datas[11]),
|
|
Spare1 = datas[12],
|
|
Spare2 = datas[13],
|
|
};
|
|
}
|
|
catch (Exception ex) // 防止转换decimal失败
|
|
{
|
|
_ = ex;
|
|
return default;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|