|  | @@ -2,7 +2,6 @@
 | 
	
		
			
				|  |  |  using System.Collections.Generic;
 | 
	
		
			
				|  |  |  using System.ComponentModel;
 | 
	
		
			
				|  |  |  using System.Linq;
 | 
	
		
			
				|  |  | -using System.Reflection;
 | 
	
		
			
				|  |  |  using System.Threading;
 | 
	
		
			
				|  |  |  using System.Threading.Tasks;
 | 
	
		
			
				|  |  |  using WCS.Entity;
 | 
	
	
		
			
				|  | @@ -35,8 +34,9 @@ namespace WCS.Core
 | 
	
		
			
				|  |  |          private static readonly List<LogicHandler> Handlers = new();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  | -        /// 日志委托
 | 
	
		
			
				|  |  | +        /// 日志委托,暂时弃用
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
		
			
				|  |  | +        [Obsolete]
 | 
	
		
			
				|  |  |          public static Action<string, string, string> DbLog;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
	
		
			
				|  | @@ -353,128 +353,6 @@ namespace WCS.Core
 | 
	
		
			
				|  |  |          protected abstract void Execute(T dev);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    /// <summary>
 | 
	
		
			
				|  |  | -    /// 工作处理器
 | 
	
		
			
				|  |  | -    /// </summary>
 | 
	
		
			
				|  |  | -    public abstract class WorkHandler : LogicHandler
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        /// <summary>
 | 
	
		
			
				|  |  | -        /// 所有被申明的工作处理器
 | 
	
		
			
				|  |  | -        /// </summary>
 | 
	
		
			
				|  |  | -        protected List<WorkInfo> Works = new List<WorkInfo>();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        protected WorkHandler()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            var arr = Assembly.GetEntryAssembly()
 | 
	
		
			
				|  |  | -                ?.GetTypes().Where(v => v.IsSubclassOf(typeof(Work))).Where(v =>
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                var attr = v.GetCustomAttribute<WorkTitleAttribute>();
 | 
	
		
			
				|  |  | -                if (attr == null)
 | 
	
		
			
				|  |  | -                    return false;
 | 
	
		
			
				|  |  | -                return attr.Handler == this.GetType();
 | 
	
		
			
				|  |  | -            });
 | 
	
		
			
				|  |  | -            var works = arr.Select(v => Activator.CreateInstance(v) as Work).Select(v =>
 | 
	
		
			
				|  |  | -             {
 | 
	
		
			
				|  |  | -                 var attr = v.GetType().GetCustomAttribute<WorkTitleAttribute>();
 | 
	
		
			
				|  |  | -                 return new WorkInfo { Params = v.GetObjs(), Work = v.Execute, Title = attr.Title, Parallel = attr.Parallel };
 | 
	
		
			
				|  |  | -             }).ToArray();
 | 
	
		
			
				|  |  | -            Works.AddRange(works);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        public override sealed void Start()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        /// <summary>
 | 
	
		
			
				|  |  | -        /// 执行处理中心
 | 
	
		
			
				|  |  | -        /// </summary>
 | 
	
		
			
				|  |  | -        /// <param name="milliseconds"></param>
 | 
	
		
			
				|  |  | -        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.ToString();
 | 
	
		
			
				|  |  | -            try
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                Ltc.SetChannel(channel);
 | 
	
		
			
				|  |  | -                Ltc.Log("开始---------------------------------------");
 | 
	
		
			
				|  |  | -                wi.Work(p);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            catch (Exception ex)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                Ltc.Log(ex.GetBaseException().Message);
 | 
	
		
			
				|  |  | -                Log(wi, p, ex);
 | 
	
		
			
				|  |  | -                Configs.UploadException?.Invoke(p.ToString(), ex.GetBaseException().Message);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            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");
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        protected virtual void Log(WorkInfo wi, object p, Exception ex)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            try
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                var msg = Description + "--" + wi.Title + "--";
 | 
	
		
			
				|  |  | -                if (p is IProtocol)
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    msg += (p as IProtocol).PROTOCOL().DEVICE.CODE;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                var con = ex.GetBaseException().Message.Split("|");
 | 
	
		
			
				|  |  | -                msg = msg + ":" + con[0];
 | 
	
		
			
				|  |  | -                //Console.WriteLine(msg);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                DbLog.Invoke(msg, con[1], con[2]);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            catch (Exception)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                //TODO:增加一个异常记录
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      public class WorkTitleAttribute : Attribute
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          public Type Handler { get; set; }
 |