using Log; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Threading.Tasks; using WCS.BaseExtensions; using WCS.Core; using WCS.Entity; namespace WCS.Service.Handlers { /// /// 工作处理器 /// public abstract class WorkHandler : LogicHandler { /// /// 所有被申明的工作处理器 /// protected List Works = new List(); protected WorkHandler() { //所有被声明的处理器 var arr = Assembly.GetEntryAssembly() ?.GetTypes().Where(v => v.IsSubclassOf(typeof(Work))).Where(v => { var attr = v.GetCustomAttribute(); if (attr == null) return false; return attr.Handler == this.GetType(); }); //TODO:加一层关于仓库的管控,通过 var works = arr.Select(v => Activator.CreateInstance(v) as Work).Select(v => { var attr = v.GetType().GetCustomAttribute(); return new WorkInfo { Params = v.GetObjs(), Work = v.Execute, Title = attr.Title, Parallel = attr.Parallel }; }).ToArray(); Works.AddRange(works); } public override sealed void Start() { } /// /// 执行处理中心--中心级 /// /// public override void Update(double milliseconds) { if (ParallelRun) { Parallel.ForEach(Works, DoWork); } else { foreach (var w in Works) { DoWork(w); } } } /// /// 执行级 /// /// protected virtual void DoWork(WorkInfo work) { if (work.Parallel) { Parallel.ForEach(work.Params, p => { Do(work, p); }); } else { foreach (var p in work.Params) { Do(work, p); } } } protected virtual void Do(WorkInfo wi, object p) { var dt = DateTime.Now; var channel = Description + "." + wi.Title + "." + p; var code = ""; if (p is IProtocol protocol) { code = protocol.PROTOCOL().DEVICE.CODE; } try { Ltc.SetChannel(channel); Ltc.Log("开始---------------------------------------"); wi.Work(p); } //下述日志处理方案可根据项目情况自定义 //DoException为基础条件未满足,仅作记录文本日志 catch (DoException ex) { InfoLog.INFO_INFO($"[{code}]--{ex.Message}"); } //WarnException进阶条件未满足,添加数据库,记录文本日志、数据库,上抛WCS,上抛WMS catch (WarnException ex) { if (ex.RECORDTXT) { InfoLog.INFO_WARN($"[{code}]--{ex.Message}"); } if (ex.RECORDDB) { Helpers.LogHelper.AddWCS_EXCEPTION(ex.Message, code, WCS_EXCEPTIONTYPE.无.ToString()); } if (ex.REPORTWCS) { Ltc.Log(ex.GetBaseException().Message); } if (ex.REPORTWMS) { Configs.UploadException?.Invoke(p.ToString(), ex.GetBaseException().Message); } } //未知异常,仅记录文本日志,需定期排查该文件,检查系统是否有未知异常,并处理 catch (Exception ex) { InfoLog.INFO_ERROR($"[{code}]--{ex.Message}--{ex.StackTrace}"); } finally { var dd = (DateTime.Now - dt).TotalMilliseconds; if (dd > 500) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(channel + "耗时" + dd); Console.ResetColor(); } if (dd > 10000) Configs.UploadException?.Invoke(p.ToString(), wi.Title + "执行耗时" + Math.Floor(dd / 1000) + "秒"); Ltc.Log("结束\n"); } } } }