|
@@ -1,135 +1,200 @@
|
|
-using ServiceCenter.Logs;
|
|
|
|
-using System.Collections.Concurrent;
|
|
|
|
|
|
+using System.Collections.Concurrent;
|
|
using System.ComponentModel;
|
|
using System.ComponentModel;
|
|
-using System.Diagnostics;
|
|
|
|
|
|
+using Dapper;
|
|
|
|
+using FreeRedis;
|
|
|
|
+using Npgsql;
|
|
|
|
+using ServiceCenter.Logs;
|
|
|
|
+using ServiceCenter.SqlSugars;
|
|
using WCS.Core;
|
|
using WCS.Core;
|
|
using LogInfo = ServiceCenter.Logs.LogInfo;
|
|
using LogInfo = ServiceCenter.Logs.LogInfo;
|
|
|
|
|
|
-namespace WCS.WorkEngineering.Worlds
|
|
|
|
|
|
+namespace WCS.WorkEngineering.Worlds;
|
|
|
|
+
|
|
|
|
+/// <summary>
|
|
|
|
+/// 主世界,所有的系统(交互点)默认在该世界下执行。
|
|
|
|
+/// 如有系统需独立,请自行增加对应世界
|
|
|
|
+/// 新增世界应当继承此世界,而不是直接继承World
|
|
|
|
+/// </summary>
|
|
|
|
+[Description("主世界")]
|
|
|
|
+public class MainWorld : World
|
|
{
|
|
{
|
|
/// <summary>
|
|
/// <summary>
|
|
- /// 主世界,所有的系统(交互点)默认在该世界下执行。
|
|
|
|
- /// 如有系统需独立,请自行增加对应世界
|
|
|
|
- /// 新增世界应当继承此世界,而不是直接继承World
|
|
|
|
|
|
+ /// 数据队列
|
|
|
|
+ /// </summary>
|
|
|
|
+ public static ConcurrentQueue<ProtocolProxyBase> DataQueue = new();
|
|
|
|
+
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// redis链接
|
|
|
|
+ /// </summary>
|
|
|
|
+ public static RedisClient Redis = new(Configs.DebugRedisUrl);
|
|
|
|
+
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 日志队列
|
|
|
|
+ /// </summary>
|
|
|
|
+ protected ConcurrentQueue<KeyLog> Logs = new();
|
|
|
|
+
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 构造函数
|
|
/// </summary>
|
|
/// </summary>
|
|
- [Description("主世界")]
|
|
|
|
- public class MainWorld : World
|
|
|
|
|
|
+ public MainWorld()
|
|
{
|
|
{
|
|
- /// <summary>
|
|
|
|
- /// 构造函数
|
|
|
|
- /// </summary>
|
|
|
|
- public MainWorld()
|
|
|
|
- {
|
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
|
|
- /// <summary>
|
|
|
|
- /// 日志队列
|
|
|
|
- /// </summary>
|
|
|
|
- protected ConcurrentQueue<KeyLog> Logs = new ConcurrentQueue<KeyLog>();
|
|
|
|
-
|
|
|
|
- /// <summary>
|
|
|
|
- /// 世界执行周期间隔
|
|
|
|
- /// 单位:毫秒
|
|
|
|
- /// </summary>
|
|
|
|
- protected override int Interval => 300;
|
|
|
|
-
|
|
|
|
- /// <summary>
|
|
|
|
- /// 更新前执行,重写改方法后请自行添加执行内容
|
|
|
|
- /// 执行内容:清空日志队列
|
|
|
|
- /// </summary>
|
|
|
|
- protected override void BeforeUpdate(List<WorkTimes> list)
|
|
|
|
- {
|
|
|
|
- // 清空日志队列,确保日志队列中只会有当前周期日志
|
|
|
|
- Logs.Clear();
|
|
|
|
- }
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 世界执行周期间隔
|
|
|
|
+ /// 单位:毫秒
|
|
|
|
+ /// </summary>
|
|
|
|
+ protected override int Interval => 300;
|
|
|
|
|
|
- /// <summary>
|
|
|
|
- /// 更新后执行,重写改方法后请自行添加执行内容
|
|
|
|
- /// 执行内容:清空日志队列
|
|
|
|
- /// </summary>
|
|
|
|
- protected override void AfterUpdate(List<WorkTimes> list)
|
|
|
|
- {
|
|
|
|
- //LogHub.WorldPublish(Logs, this.GetType().Name);
|
|
|
|
- LogHub.WorldPublish(Logs, this.GetType().Name);
|
|
|
|
- }
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 更新前执行,重写改方法后请自行添加执行内容
|
|
|
|
+ /// 执行内容:清空日志队列
|
|
|
|
+ /// </summary>
|
|
|
|
+ protected override void BeforeUpdate(List<WorkTimes> list)
|
|
|
|
+ {
|
|
|
|
+ // 清空日志队列,确保日志队列中只会有当前周期日志
|
|
|
|
+ Logs.Clear();
|
|
|
|
+ }
|
|
|
|
|
|
- /// <summary>
|
|
|
|
- /// 异常处理,重写改方法后请自行添加执行内容
|
|
|
|
- /// 执行内容:Exception as KnownException并添加至日志队列
|
|
|
|
- /// </summary>
|
|
|
|
- /// <param name="channel"></param>
|
|
|
|
- /// <param name="exception"></param>
|
|
|
|
- /// <exception cref="NotImplementedException"></exception>
|
|
|
|
- protected override void OnError(Channel channel, Exception exception)
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 更新后执行,重写改方法后请自行添加执行内容
|
|
|
|
+ /// 执行内容:清空日志队列
|
|
|
|
+ /// </summary>
|
|
|
|
+ protected override void AfterUpdate(List<WorkTimes> list)
|
|
|
|
+ {
|
|
|
|
+ //LogHub.WorldPublish(Logs, this.GetType().Name);
|
|
|
|
+ using (var conn = new NpgsqlConnection(SqlSugarHelper._PLC))
|
|
{
|
|
{
|
|
- if (exception is KnownException)
|
|
|
|
- {
|
|
|
|
- var ex = exception as KnownException;
|
|
|
|
- var log = new LogInfo { Level = ex.Level, Type = ErrorTypeEnum.Kown, LogUpLoad = ex.logUpLoad, Message = ex.Message };
|
|
|
|
- Logs.Enqueue(new KeyLog { Channel = channel, Log = log, Time = DateTime.Now });
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
|
|
+ var frameStr = Frame.ToString("yyyy-MM-dd HH:mm:ss.ffffff");
|
|
|
|
+ conn.Open();
|
|
|
|
+ var trans = conn.BeginTransaction();
|
|
|
|
+ try
|
|
{
|
|
{
|
|
- var log = new LogInfo { Level = LogLevelEnum.High, Type = ErrorTypeEnum.Unkown, LogUpLoad = LogUpLoadEnum.UpLoadWMS, Message = exception.Message };
|
|
|
|
- Logs.Enqueue(new KeyLog { Channel = channel, Log = log, Time = DateTime.Now });
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+// var sSql = "SELECT coalesce(max(Ver),0) FROM LocationData";
|
|
|
|
+// var ver = conn.Query<long>(sSql).First();
|
|
|
|
|
|
- /// <summary>
|
|
|
|
- /// 日志处理,重写改方法后请自行添加执行内容
|
|
|
|
- /// 执行内容:LogInfo as KeyLog并添加至日志队列
|
|
|
|
- /// </summary>
|
|
|
|
- /// <param name="channel"></param>
|
|
|
|
- /// <param name="logObj"></param>
|
|
|
|
- /// <exception cref="NotImplementedException"></exception>
|
|
|
|
- protected override void OnLog(Channel channel, object logObj)
|
|
|
|
- {
|
|
|
|
- if (channel == null) return;
|
|
|
|
- if (logObj.GetType() == typeof(string))
|
|
|
|
- {
|
|
|
|
- Logs.Enqueue(new KeyLog
|
|
|
|
|
|
+// LocationData[] ldarr = null;
|
|
|
|
+// using (var wms = new SqlConnection(Configs.wmsConnString))
|
|
|
|
+// {
|
|
|
|
+// sSql = @"select '" + frameStr + @"' Frame,F_No Code,F_line Line,F_cell Col,F_layer Layer,F_depth Depth,F_roadway Tunnel, F_status Status,F_isStop IsStop,cast(F_Version as bigint)Ver
|
|
|
|
+//from dbo.BASE_LOCATION with(nolock) where F_Version>" + ver;
|
|
|
|
+// ldarr = wms.Query<LocationData>(sSql).ToArray();
|
|
|
|
+// }
|
|
|
|
+
|
|
|
|
+// if (ldarr.Length > 0)
|
|
|
|
+// {
|
|
|
|
+// var ps = typeof(LocationData).GetProperties();
|
|
|
|
+// var cols = string.Join(',', ps.Select(v => v.Name));
|
|
|
|
+// var pCols = string.Join(',', ps.Select(v => $"@{v.Name}"));
|
|
|
|
+// sSql = $"insert into {nameof(LocationData)}({cols}) values({pCols})";
|
|
|
|
+// var rc = conn.Execute(sSql, ldarr);
|
|
|
|
+// //fi.Ver = ldarr.Max(v => v.Ver);
|
|
|
|
+// }
|
|
|
|
+ if (DataQueue.Count > 0)
|
|
{
|
|
{
|
|
- Channel = channel,
|
|
|
|
- Log = new LogInfo()
|
|
|
|
|
|
+ var gs = DataQueue.GroupBy(v => new { type = v.ProtocolDataType, itype = v.ProtocolType }).ToList();
|
|
|
|
+ foreach (var g in gs)
|
|
{
|
|
{
|
|
- Level = LogLevelEnum.High,
|
|
|
|
- LogUpLoad = LogUpLoadEnum.UpLoadWMS,
|
|
|
|
- Message = logObj as string,
|
|
|
|
- },
|
|
|
|
- Time = DateTime.Now
|
|
|
|
- });
|
|
|
|
|
|
+ var cmd = $"insert into {g.Key.type.Name} values('{frameStr}',@Code,";
|
|
|
|
+ cmd += string.Join(',', g.Key.itype.GetProperties().Select(v => $"@{v.Name}")) + ")";
|
|
|
|
+ var arr = g.ToArray();
|
|
|
|
+ conn.Execute(cmd, arr);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (DataQueue.Count > 0) conn.Execute($"insert into Frames(Frame) values('{frameStr}')");
|
|
|
|
+ trans.Commit();
|
|
}
|
|
}
|
|
- else
|
|
|
|
|
|
+ catch (Exception ex)
|
|
{
|
|
{
|
|
- var log = (LogInfo)logObj;
|
|
|
|
- Logs.Enqueue(new KeyLog { Channel = channel, Log = log, Time = DateTime.Now });
|
|
|
|
|
|
+ trans.Rollback();
|
|
|
|
+ throw;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ DataQueue.Clear();
|
|
}
|
|
}
|
|
|
|
|
|
- /// <summary>
|
|
|
|
- /// 日志处理,重写改方法后请自行添加执行内容
|
|
|
|
- /// </summary>
|
|
|
|
- /// <param name="channel"></param>
|
|
|
|
- /// <param name="msg"></param>
|
|
|
|
- /// <exception cref="NotImplementedException"></exception>
|
|
|
|
- protected override void OnInternalLog(Channel channel, string msg)
|
|
|
|
|
|
+ LogHub.WorldPublish(Logs, GetType().Name);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 异常处理,重写改方法后请自行添加执行内容
|
|
|
|
+ /// 执行内容:Exception as KnownException并添加至日志队列
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <param name="channel"></param>
|
|
|
|
+ /// <param name="exception"></param>
|
|
|
|
+ /// <exception cref="NotImplementedException"></exception>
|
|
|
|
+ protected override void OnError(Channel channel, Exception exception)
|
|
|
|
+ {
|
|
|
|
+ if (exception is KnownException)
|
|
|
|
+ {
|
|
|
|
+ var ex = exception as KnownException;
|
|
|
|
+ var log = new LogInfo
|
|
|
|
+ { Level = ex.Level, Type = ErrorTypeEnum.Kown, LogUpLoad = ex.logUpLoad, Message = ex.Message };
|
|
|
|
+ Logs.Enqueue(new KeyLog { Channel = channel, Log = log, Time = DateTime.Now });
|
|
|
|
+ }
|
|
|
|
+ else
|
|
{
|
|
{
|
|
- var log = new LogInfo { Level = LogLevelEnum.Low, Message = msg };
|
|
|
|
- if (msg != "开始" && msg != "结束")
|
|
|
|
|
|
+ var log = new LogInfo
|
|
{
|
|
{
|
|
- Logs.Enqueue(new KeyLog { Channel = channel, Log = log, Time = DateTime.Now });
|
|
|
|
- }
|
|
|
|
|
|
+ Level = LogLevelEnum.High, Type = ErrorTypeEnum.Unkown, LogUpLoad = LogUpLoadEnum.UpLoadWMS,
|
|
|
|
+ Message = exception.Message
|
|
|
|
+ };
|
|
|
|
+ Logs.Enqueue(new KeyLog { Channel = channel, Log = log, Time = DateTime.Now });
|
|
}
|
|
}
|
|
|
|
+ }
|
|
|
|
|
|
- /// <summary>
|
|
|
|
- /// 获取日志,重写改方法后请自行添加执行内容
|
|
|
|
- /// </summary>
|
|
|
|
- /// <param name="channel"></param>
|
|
|
|
- /// <returns></returns>
|
|
|
|
- /// <exception cref="NotImplementedException"></exception>
|
|
|
|
- protected override IEnumerable<string> GetChannelMsg(Channel channel)
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 日志处理,重写改方法后请自行添加执行内容
|
|
|
|
+ /// 执行内容:LogInfo as KeyLog并添加至日志队列
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <param name="channel"></param>
|
|
|
|
+ /// <param name="logObj"></param>
|
|
|
|
+ /// <exception cref="NotImplementedException"></exception>
|
|
|
|
+ protected override void OnLog(Channel channel, object logObj)
|
|
|
|
+ {
|
|
|
|
+ if (channel == null) return;
|
|
|
|
+ if (logObj.GetType() == typeof(string))
|
|
|
|
+ {
|
|
|
|
+ Logs.Enqueue(new KeyLog
|
|
|
|
+ {
|
|
|
|
+ Channel = channel,
|
|
|
|
+ Log = new LogInfo
|
|
|
|
+ {
|
|
|
|
+ Level = LogLevelEnum.High,
|
|
|
|
+ LogUpLoad = LogUpLoadEnum.UpLoadWMS,
|
|
|
|
+ Message = logObj as string
|
|
|
|
+ },
|
|
|
|
+ Time = DateTime.Now
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ else
|
|
{
|
|
{
|
|
- return Logs.Where(v => v.Channel.ToString() == channel.ToString()).Select(v => v.Log.ToString());
|
|
|
|
|
|
+ var log = (LogInfo)logObj;
|
|
|
|
+ Logs.Enqueue(new KeyLog { Channel = channel, Log = log, Time = DateTime.Now });
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-}
|
|
|
|
|
|
+
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 日志处理,重写改方法后请自行添加执行内容
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <param name="channel"></param>
|
|
|
|
+ /// <param name="msg"></param>
|
|
|
|
+ /// <exception cref="NotImplementedException"></exception>
|
|
|
|
+ protected override void OnInternalLog(Channel channel, string msg)
|
|
|
|
+ {
|
|
|
|
+ var log = new LogInfo { Level = LogLevelEnum.Low, Message = msg };
|
|
|
|
+ if (msg != "开始" && msg != "结束") Logs.Enqueue(new KeyLog { Channel = channel, Log = log, Time = DateTime.Now });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 获取日志,重写改方法后请自行添加执行内容
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <param name="channel"></param>
|
|
|
|
+ /// <returns></returns>
|
|
|
|
+ /// <exception cref="NotImplementedException"></exception>
|
|
|
|
+ protected override IEnumerable<string> GetChannelMsg(Channel channel)
|
|
|
|
+ {
|
|
|
|
+ return Logs.Where(v => v.Channel.ToString() == channel.ToString()).Select(v => v.Log.ToString());
|
|
|
|
+ }
|
|
|
|
+}
|