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; /// /// 输送线收到的数据处理基础类 /// [Component] public class BaseConveyDataHandler(AppRouterMethodDao routerMethodDao, IComponentContext componentContext) { private readonly IComponentContext _componentContext = componentContext; private readonly AppRouterMethodDao _routerMethodDao = routerMethodDao; private Dictionary? methodConfig; /// /// 处理 PLC 请求分拣路向逻辑 /// /// /// 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); } } /*************************/ /// /// 加载获取路由的参数 /// private void LoadingMethodConfig() { if (methodConfig != default) return; List? appRouters = _routerMethodDao.Query(); if (appRouters == default) return; methodConfig = []; // 扫描创建继承 BaseGetRouter 的类的实例 Dictionary 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); } } /****************************** 格式化数据 ***************************/ /// /// PLC请求WCS路向的请求体格式化 /// /// /// 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; } } }