lixun 2 years ago
parent
commit
161aadaf48
56 changed files with 789 additions and 917 deletions
  1. 72 5
      src/YSAI.DAQ/YSAI.Core/data/AddressRelay.cs
  2. 48 11
      src/YSAI.DAQ/YSAI.Core/data/Dispose.cs
  3. 2 2
      src/YSAI.DAQ/YSAI.Core/enum/Enums.cs
  4. 12 8
      src/YSAI.DAQ/YSAI.Core/interface/only/IKafka.cs
  5. 8 8
      src/YSAI.DAQ/YSAI.Core/interface/only/ISubscribe.cs
  6. 11 76
      src/YSAI.DAQ/YSAI.Core/interface/unify/IBase.cs
  7. 96 0
      src/YSAI.DAQ/YSAI.Core/interface/unify/IBaseAbstract.cs
  8. 0 48
      src/YSAI.DAQ/YSAI.Core/interface/unify/IOr.cs
  9. 27 5
      src/YSAI.DAQ/YSAI.Core/interface/unify/IOrAbstract.cs
  10. 49 42
      src/YSAI.DAQ/YSAI.Core/reflection/Reflection.json
  11. 1 1
      src/YSAI.DAQ/YSAI.Core/reflection/ReflectionData.cs
  12. 13 6
      src/YSAI.DAQ/YSAI.Core/reflection/ReflectionOperate.cs
  13. 4 5
      src/YSAI.DAQ/YSAI.Core/script/ScriptOperate.cs
  14. 3 3
      src/YSAI.DAQ/YSAI.Core/serialport/SerialPortOperate.cs
  15. 3 3
      src/YSAI.DAQ/YSAI.Core/socket/tcp/client/SocketTcpClientOperate.cs
  16. 3 3
      src/YSAI.DAQ/YSAI.Core/socket/tcp/service/SocketTcpServiceOperate.cs
  17. 3 3
      src/YSAI.DAQ/YSAI.Core/socket/tcpClient/Operate.cs
  18. 3 3
      src/YSAI.DAQ/YSAI.Core/socket/tcpListener/Operate.cs
  19. 3 3
      src/YSAI.DAQ/YSAI.Core/socket/udp/SocketUdpOperate.cs
  20. 3 3
      src/YSAI.DAQ/YSAI.Core/socket/udpClient/Operate.cs
  21. 3 3
      src/YSAI.DAQ/YSAI.Core/subscribe/SubscribeOperate.cs
  22. 10 9
      src/YSAI.DAQ/YSAI.DB/DBOperate.cs
  23. 1 2
      src/YSAI.DAQ/YSAI.DB/YSAI.DB.csproj
  24. 3 3
      src/YSAI.DAQ/YSAI.Kafka/KafkaAdminOperate.cs
  25. 22 22
      src/YSAI.DAQ/YSAI.Kafka/KafkaConsumerOperate.cs
  26. 12 14
      src/YSAI.DAQ/YSAI.Kafka/KafkaProducerOperate.cs
  27. 1 2
      src/YSAI.DAQ/YSAI.Kafka/YSAI.Kafka.csproj
  28. 8 3
      src/YSAI.DAQ/YSAI.Manage/Controllers/LibInfoController.cs
  29. 57 0
      src/YSAI.DAQ/YSAI.Manage/Or.cs
  30. 0 1
      src/YSAI.DAQ/YSAI.Manage/Program.cs
  31. 0 41
      src/YSAI.DAQ/YSAI.Manage/or/Or.cs
  32. 0 1
      src/YSAI.DAQ/YSAI.Modbus/YSAI.Modbus.csproj
  33. 4 4
      src/YSAI.DAQ/YSAI.Modbus/client/ModbusClientOperate.cs
  34. 1 2
      src/YSAI.DAQ/YSAI.Mqtt/YSAI.Mqtt.csproj
  35. 3 3
      src/YSAI.DAQ/YSAI.Mqtt/client/MqttClientOperate.cs
  36. 3 3
      src/YSAI.DAQ/YSAI.Mqtt/service/MqttServiceOperate.cs
  37. 3 3
      src/YSAI.DAQ/YSAI.Mqtt/service/websocket/MqttWebSocketServiceOperate.cs
  38. 1 2
      src/YSAI.DAQ/YSAI.Opc/YSAI.Opc.csproj
  39. 3 3
      src/YSAI.DAQ/YSAI.Opc/da/client/OpcDaClientOperate.cs
  40. 3 3
      src/YSAI.DAQ/YSAI.Opc/da/http/OpcDaHttpOperate.cs
  41. 3 3
      src/YSAI.DAQ/YSAI.Opc/ua/client/OpcUaClientOperate.cs
  42. 3 3
      src/YSAI.DAQ/YSAI.Opc/ua/service/OpcUaServiceOperate.cs
  43. 3 3
      src/YSAI.DAQ/YSAI.RabbitMQ/RabbitMQConsumerOperate.cs
  44. 1 1
      src/YSAI.DAQ/YSAI.RabbitMQ/RabbitMQData.cs
  45. 3 3
      src/YSAI.DAQ/YSAI.RabbitMQ/RabbitMQPublisherOperate.cs
  46. 1 2
      src/YSAI.DAQ/YSAI.RabbitMQ/YSAI.RabbitMQ.csproj
  47. 1 1
      src/YSAI.DAQ/YSAI.Redis/RedisOperate.cs
  48. 1 2
      src/YSAI.DAQ/YSAI.Redis/YSAI.Redis.csproj
  49. 1 2
      src/YSAI.DAQ/YSAI.S7/YSAI.S7.csproj
  50. 3 3
      src/YSAI.DAQ/YSAI.S7/client/S7ClientOperate.cs
  51. 124 0
      src/YSAI.DAQ/YSAI.Test/TestAll.cs
  52. 1 0
      src/YSAI.DAQ/YSAI.Test/YSAI.Test.csproj
  53. 135 2
      src/YSAI.DAQ/YSAI.TestConsole/Program.cs
  54. 2 2
      src/YSAI.DAQ/YSAI.Unility/JsonTool.cs
  55. 0 527
      src/YSAI.DAQ/YSAI.Unility/PlcDataParseTool.cs
  56. 5 1
      src/YSAI.DAQ/YSAI.Unility/ReflexTool.cs

+ 72 - 5
src/YSAI.DAQ/YSAI.Core/data/AddressRelay.cs

@@ -9,24 +9,30 @@ namespace YSAI.Core.data
 {
     /// <summary>
     /// 地址转发
-    /// 已MQTT为原型,主题 + 内容
     /// </summary>
     public class AddressRelay
     {
         /// <summary>
-        /// MQTT转发数据
+        /// Mqtt转发数据
         /// </summary>
         public MqttRelayParam? MqttRelay { get; set; } = null;
-
+        /// <summary>
+        /// Kafka转发数据
+        /// </summary>
+        public KafkaRelayParam? KafkaRelay { get; set; } = null;
+        /// <summary>
+        /// RabbitMQ转发数据
+        /// </summary>
+        public RabbitMQRelayParam? RabbitMQRelay { get; set; } = null;
         /// <summary>
         /// MQTT转发数据
         /// </summary>
         public class MqttRelayParam
         {
             /// <summary>
-            /// 主题名称
+            /// 主题
             /// </summary>
-            public string TopicName { get; set; }
+            public string Topic { get; set; }
             /// <summary>
             /// 消息是否保留
             /// </summary>
@@ -46,7 +52,68 @@ namespace YSAI.Core.data
             /// </summary>
             public string ReflectionSN { get; set; }
         }
+        /// <summary>
+        /// Kafka生产者转发数据
+        /// </summary>
+        public class KafkaRelayParam
+        {
+            /// <summary>
+            /// 主题
+            /// </summary>
+            public string Topic { get; set; }
+            /// <summary>
+            /// 键
+            /// </summary>
+            public string Key { get; set; }
+            /// <summary>
+            /// 值
+            /// </summary>
+            public string Value { get; set; }
 
+            /// <summary>
+            /// 通过反射得到的转发方法
+            /// </summary>
+            public string ReflectionSN { get; set; }
+        }
+        /// <summary>
+        /// RabbitMQ转发数据
+        /// </summary>
+        public class RabbitMQRelayParam
+        {
+            /// <summary>
+            /// 消息头
+            /// </summary>
+            public string MessageHead { get; set; }
+            /// <summary>
+            /// 消息内容
+            /// </summary>
+            public string MessageContent { get; set; }
+            /// <summary>
+            /// 通道类型
+            /// direct  //用于AMQP直接交换的交换类型。
+            /// fanout  //用于AMQP扇出交换的交换类型。
+            /// headers //用于AMQP报头交换的交换类型。
+            /// topic   //用于AMQP主题交换的交换类型。
+            /// </summary>
+            public string Type { get; set; } = "topic";
+            /// <summary>
+            /// 持久化
+            /// </summary>
+            public bool Durable { get; set; } = true;
+            /// <summary>
+            /// 独有的
+            /// </summary>
+            public bool Exclusive { get; set; } = false;
+            /// <summary>
+            /// 自动删除
+            /// </summary>
+            public bool AutoDelete { get; set; } = false;
+
+            /// <summary>
+            /// 通过反射得到的转发方法
+            /// </summary>
+            public string ReflectionSN { get; set; }
+        }
     }
 
     

+ 48 - 11
src/YSAI.DAQ/YSAI.Core/data/Dispose.cs

@@ -36,12 +36,14 @@ namespace YSAI.Core.data
         /// <returns></returns>
         public static AddressValue? Execute(AddressDetails addressDetails, string value)
         {
+            //日志文件名称
+            string logName = "Dispose.txt";
             try
             {
                 //原始值
                 string originalValue = value;
 
-                //解析
+                //解析s
                 value = Parse(addressDetails, value);
 
                 //异步转发
@@ -59,7 +61,7 @@ namespace YSAI.Core.data
             }
             catch (Exception ex)
             {
-                LogHelper.Error($"执行数据处理异常:{ex.Message}");
+                LogHelper.Error($"处理异常:{ex.Message}", logName);
             }
             return null;
         }
@@ -85,15 +87,18 @@ namespace YSAI.Core.data
         public static string Parse(AddressDetails addressDetails, string value)
         {
             //最新值
-            string NewValue = value;
+            string? NewValue = value;
             if (addressDetails.AddressParseParam != null)
             {
+                //日志文件名称
+                string logName = "Parse.txt";
+
                 try
-                {
+                { 
                     switch (addressDetails.AddressParseParam.ParseType)
                     {
                         case ParseType.MethodAnalysis:
-                            NewValue = reflectionOperate.ExecuteMethod(addressDetails.AddressParseParam.ReflectionSN, new object[] { value }).ToString();
+                            NewValue = reflectionOperate.ExecuteMethod(addressDetails.AddressParseParam.ReflectionSN, new object[] { value })?.ToString();
                             break;
                         case ParseType.ScriptAnalysis:
                             using (ScriptOperate scriptOperate = new ScriptOperate(addressDetails.AddressParseParam.Script))  //通过脚本解析
@@ -101,7 +106,7 @@ namespace YSAI.Core.data
                                 OperateResult operateResult = scriptOperate.Execute(addressDetails.AddressParseParam.Script.ScriptType, addressDetails.AddressParseParam.Script.ScriptCode, addressDetails.AddressParseParam.Script.ScriptFunction, value);
                                 if (operateResult.State)
                                 {
-                                    NewValue = operateResult.RData.ToString();
+                                    NewValue = operateResult.RData?.ToString();
                                 }
                             }
                             break;
@@ -114,7 +119,7 @@ namespace YSAI.Core.data
                 }
                 catch (Exception ex)
                 {
-                    LogHelper.Error("数据解析异常:" + ex.ToString());
+                    LogHelper.Error("解析异常:" + ex.ToString(), logName);
                 }
             }
             return value;
@@ -130,25 +135,57 @@ namespace YSAI.Core.data
         {
             return Task.Run(() =>
             {
+                //日志文件名称
+                string logName = "Relay.txt";
+
                 try
                 {
                     //MQTT转发
                     if (addressDetails.MqttRelay != null)
                     {
-                        OperateResult? operateResult = (reflectionOperate.ExecuteMethod(addressDetails.MqttRelay.ReflectionSN, new object[] { addressDetails.MqttRelay.TopicName, value, addressDetails.MqttRelay.QoSLevel, addressDetails.MqttRelay.Retain }) as Task<OperateResult>).Result;
+                        OperateResult? operateResult = reflectionOperate.ExecuteMethod(addressDetails.MqttRelay.ReflectionSN, new object[] { addressDetails.MqttRelay.Topic, value, addressDetails.MqttRelay.QoSLevel, addressDetails.MqttRelay.Retain }) as OperateResult;
+                        if (operateResult.State)
+                        {
+                            LogHelper.Info($"[ {addressDetails.AddressName} ][ {addressDetails.MqttRelay.Topic} ]转发状态:{operateResult.State}", logName);
+                        }
+                        else
+                        {
+                            LogHelper.Info($"[ {addressDetails.AddressName} ][ {addressDetails.MqttRelay.Topic} ]转发状态:{operateResult.State},{operateResult.Message}", logName);
+                        }
+                    }
+
+                    //RabbitMQ转发
+                    if (addressDetails.RabbitMQRelay != null)
+                    {
+                        OperateResult? operateResult = reflectionOperate.ExecuteMethod(addressDetails.RabbitMQRelay.ReflectionSN, new object[] { addressDetails.RabbitMQRelay.MessageHead, value, addressDetails.RabbitMQRelay.MessageContent, addressDetails.RabbitMQRelay.Type, addressDetails.RabbitMQRelay.Durable, addressDetails.RabbitMQRelay.Exclusive, addressDetails.RabbitMQRelay.AutoDelete }) as OperateResult;
+                        if (operateResult.State)
+                        {
+                            LogHelper.Info($"[ {addressDetails.AddressName} ][ {addressDetails.RabbitMQRelay.MessageHead} ]转发状态:{operateResult.State}", logName);
+                        }
+                        else
+                        {
+                            LogHelper.Info($"[ {addressDetails.AddressName} ][ {addressDetails.RabbitMQRelay.MessageHead} ]转发状态:{operateResult.State},{operateResult.Message}", logName);
+                        }
+                    }
+
+
+                    //Kafka转发
+                    if (addressDetails.KafkaRelay != null)
+                    {
+                        OperateResult? operateResult = reflectionOperate.ExecuteMethod(addressDetails.KafkaRelay.ReflectionSN, new object[] { addressDetails.KafkaRelay.Topic, value, addressDetails.KafkaRelay.Key, addressDetails.KafkaRelay.Value }) as OperateResult;
                         if (operateResult.State)
                         {
-                            LogHelper.Info($"[ {addressDetails.AddressName} ][ {addressDetails.MqttRelay.TopicName} ]地址数据转发状态:{operateResult.State}");
+                            LogHelper.Info($"[ {addressDetails.AddressName} ][ {addressDetails.KafkaRelay.Topic} ]转发状态:{operateResult.State}", logName);
                         }
                         else
                         {
-                            LogHelper.Info($"[ {addressDetails.AddressName} ][ {addressDetails.MqttRelay.TopicName} ]地址数据转发状态:{operateResult.State},{operateResult.Message}");
+                            LogHelper.Info($"[ {addressDetails.AddressName} ][ {addressDetails.KafkaRelay.Topic} ]转发状态:{operateResult.State},{operateResult.Message}", logName);
                         }
                     }
                 }
                 catch (Exception ex)
                 {
-                    LogHelper.Error("数据转发异常:" + ex.ToString());
+                    LogHelper.Error("转发异常:" + ex.ToString(), logName);
                 }
             });
         }

+ 2 - 2
src/YSAI.DAQ/YSAI.Core/enum/Enums.cs

@@ -112,11 +112,11 @@ namespace YSAI.Core.@enum
     public enum ParseType
     {
         /// <summary>
-        /// 代码中定义的具体方法解析
+        /// 代码中定义的具体方法解析[入参string][出参string]
         /// </summary>
         MethodAnalysis,
         /// <summary>
-        /// 动态脚本解析
+        /// 动态脚本解析[入参string][出参string]
         /// </summary>
         ScriptAnalysis
     }

+ 12 - 8
src/YSAI.DAQ/YSAI.Core/interface/only/IKafka.cs

@@ -63,22 +63,26 @@ namespace YSAI.Core.@interface.only
     public interface IKafkaProducer
     {
         /// <summary>
-        /// 批量生产
+        /// 生产
         /// </summary>
         /// <typeparam name="K">键类型</typeparam>
         /// <typeparam name="V">值类型</typeparam>
-        /// <param name="values">数据</param>
-        /// <returns></returns>
-        OperateResult Produce<K, V>(List<(string Topic, K Key, V Value)> values);
+        /// <param name="Topic">主题</param>
+        /// <param name="Key">键</param>
+        /// <param name="Value">值</param>
+        /// <returns>统一出参</returns>
+        OperateResult Produce(string Topic, object Key, object Value);
 
         /// <summary>
-        /// 批量生产
+        /// 生产
         /// </summary>
         /// <typeparam name="K">键类型</typeparam>
         /// <typeparam name="V">值类型</typeparam>
-        /// <param name="values">数据</param>
-        /// <returns></returns>
-        Task<OperateResult> ProduceAsync<K, V>(List<(string Topic, K Key, V Value)> values);
+        /// <param name="Topic">主题</param>
+        /// <param name="Key">键</param>
+        /// <param name="Value">值</param>
+        /// <returns>统一出参</returns>
+        Task<OperateResult> ProduceAsync(string Topic, object Key, object Value);
 
     }
 }

+ 8 - 8
src/YSAI.DAQ/YSAI.Core/interface/only/ISubscribe.cs

@@ -16,30 +16,30 @@ namespace YSAI.Core.@interface.only
         /// <summary>
         /// 添加自定义订阅
         /// </summary>
-        /// <param name="nodes">节点数据</param>
+        /// <param name="addressesArray">节点数据</param>
         /// <returns>统一出参</returns>
-        OperateResult Subscribe(List<AddressDetails> nodes);
+        OperateResult Subscribe(List<AddressDetails> addressesArray);
 
         /// <summary>
         /// 添加自定义订阅
         /// </summary>
-        /// <param name="nodes">节点数据</param>
+        /// <param name="addressesArray">节点数据</param>
         /// <returns>统一出参</returns>
-        Task<OperateResult> SubscribeAsync(List<AddressDetails> nodes);
+        Task<OperateResult> SubscribeAsync(List<AddressDetails> addressesArray);
 
 
 
         /// <summary>
         /// 取消订阅
         /// </summary>
-        /// <param name="nodes">节点数据</param>
+        /// <param name="addressesArray">节点数据</param>
         /// <returns>统一出参</returns>
-        OperateResult UnSubscribe(List<AddressDetails> nodes);
+        OperateResult UnSubscribe(List<AddressDetails> addressesArray);
         /// <summary>
         /// 取消订阅
         /// </summary>
-        /// <param name="nodes">节点数据</param>
+        /// <param name="addressesArray">节点数据</param>
         /// <returns>统一出参</returns>
-        Task<OperateResult> UnSubscribeAsync(List<AddressDetails> nodes);
+        Task<OperateResult> UnSubscribeAsync(List<AddressDetails> addressesArray);
     }
 }

+ 11 - 76
src/YSAI.DAQ/YSAI.Core/interface/unify/IBase.cs

@@ -3,110 +3,45 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
-using YSAI.Core.@interface.unify;
 
 namespace YSAI.Core.@interface.unify
 {
-    /// <summary>
-    /// [ 抽象类 ]统一出参
-    /// </summary>
-    public abstract class IBase : IOrAbstract
+    public interface IBase
     {
-    }
 
-    /// <summary>
-    /// [ 抽象类 ]包含一个事件与统一出参
-    /// </summary>
-    public abstract class IBase<E1> : IOrAbstract
+    }
+    public interface IBase<E1> 
     {
         /// <summary>
         /// 信息传递
         /// </summary>
-        public virtual event EventHandler<E1> OnEvent
-        {
-            add { OnEventHandler += value; }
-            remove { OnEventHandler -= value; }
-        }
-        /// <summary>
-        /// 信息传递
-        /// </summary>
-        public EventHandler<E1>? OnEventHandler;
+        event EventHandler<E1> OnEvent;
     }
-
-    /// <summary>
-    /// [ 抽象类 ]包含两个事件与统一出参
-    /// </summary>
-    public abstract class IBase<E1, E2> : IOrAbstract
+    public interface IBase<E1, E2> 
     {
         /// <summary>
         /// 信息传递
         /// </summary>
-        public virtual event EventHandler<E1> OnEvent
-        {
-            add { OnEventHandler += value; }
-            remove { OnEventHandler -= value; }
-        }
-        /// <summary>
-        /// 信息传递
-        /// </summary>
-        public EventHandler<E1>? OnEventHandler;
-
-        /// <summary>
-        /// 信息传递
-        /// </summary>
-        public virtual event EventHandler<E2> OnEventParam
-        {
-            add { OnEventParamHandler += value; }
-            remove { OnEventParamHandler -= value; }
-        }
+        event EventHandler<E1> OnEvent;
         /// <summary>
         /// 信息传递
         /// </summary>
-        public EventHandler<E2>? OnEventParamHandler;
+        event EventHandler<E2> OnEventParam;
     }
 
-    /// <summary>
-    /// [ 抽象类 ]包含三个事件与统一出参
-    /// </summary>
-    public abstract class IBase<E1, E2, E3> : IOrAbstract
+    public interface IBase<E1, E2, E3> 
     {
         /// <summary>
         /// 信息传递
         /// </summary>
-        public virtual event EventHandler<E1> OnEvent
-        {
-            add { OnEventHandler += value; }
-            remove { OnEventHandler -= value; }
-        }
-        /// <summary>
-        /// 信息传递
-        /// </summary>
-        public EventHandler<E1>? OnEventHandler;
-
-        /// <summary>
-        /// 信息传递
-        /// </summary>
-        public virtual event EventHandler<E2> OnEventParam
-        {
-            add { OnEventParamHandler += value; }
-            remove { OnEventParamHandler -= value; }
-        }
+        event EventHandler<E1> OnEvent;
         /// <summary>
         /// 信息传递
         /// </summary>
-        public EventHandler<E2>? OnEventParamHandler;
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        public virtual event EventHandler<E3> OnEventRes
-        {
-            add { OnEventResHandler += value; }
-            remove { OnEventResHandler -= value; }
-        }
+        event EventHandler<E2> OnEventParam;
         /// <summary>
         /// 备用
         /// </summary>
-        public EventHandler<E3>? OnEventResHandler;
+        event EventHandler<E3> OnEventRes;
     }
 }

+ 96 - 0
src/YSAI.DAQ/YSAI.Core/interface/unify/IBaseAbstract.cs

@@ -0,0 +1,96 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using YSAI.Core.@interface.unify;
+
+namespace YSAI.Core.@interface.unify
+{
+    /// <summary>
+    /// [ 抽象类 ]统一出参
+    /// </summary>
+    public abstract class IBaseAbstract : IOrAbstract, IBase
+    {
+    }
+
+    /// <summary>
+    /// [ 抽象类 ]包含一个事件与统一出参
+    /// </summary>
+    public abstract class IBaseAbstract<E1> : IOrAbstract, IBase<E1>
+    {
+        public event EventHandler<E1> OnEvent
+        {
+            add { OnEventHandler += value; }
+            remove { OnEventHandler -= value; }
+        }
+        /// <summary>
+        /// 信息传递
+        /// </summary>
+        protected EventHandler<E1>? OnEventHandler;
+
+    }
+
+    /// <summary>
+    /// [ 抽象类 ]包含两个事件与统一出参
+    /// </summary>
+    public abstract class IBaseAbstract<E1, E2> : IOrAbstract, IBase<E1, E2>
+    {
+        public event EventHandler<E1> OnEvent
+        {
+            add { OnEventHandler += value; }
+            remove { OnEventHandler -= value; }
+        }
+        /// <summary>
+        /// 信息传递
+        /// </summary>
+        protected EventHandler<E1>? OnEventHandler;
+
+        public event EventHandler<E2> OnEventParam
+        {
+            add { OnEventParamHandler += value; }
+            remove { OnEventParamHandler -= value; }
+        }
+        /// <summary>
+        /// 信息传递
+        /// </summary>
+        protected EventHandler<E2>? OnEventParamHandler;
+
+    }
+
+    /// <summary>
+    /// [ 抽象类 ]包含三个事件与统一出参
+    /// </summary>
+    public abstract class IBaseAbstract<E1, E2, E3> : IOrAbstract,IBase<E1,E2,E3>
+    {
+        public event EventHandler<E1> OnEvent
+        {
+            add { OnEventHandler += value; }
+            remove { OnEventHandler -= value; }
+        }
+        /// <summary>
+        /// 信息传递
+        /// </summary>
+        protected EventHandler<E1>? OnEventHandler;
+
+        public event EventHandler<E2> OnEventParam
+        {
+            add { OnEventParamHandler += value; }
+            remove { OnEventParamHandler -= value; }
+        }
+        /// <summary>
+        /// 信息传递
+        /// </summary>
+        protected EventHandler<E2>? OnEventParamHandler;
+
+        public event EventHandler<E3> OnEventRes
+        {
+            add { OnEventResHandler += value; }
+            remove { OnEventResHandler -= value; }
+        }
+        /// <summary>
+        /// 备用
+        /// </summary>
+        protected EventHandler<E3>? OnEventResHandler;
+    }
+}

+ 0 - 48
src/YSAI.DAQ/YSAI.Core/interface/unify/IOr.cs

@@ -1,48 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using YSAI.Core.data;
-using YSAI.Core.@enum;
-using YSAI.Unility;
-
-namespace YSAI.Core.@interface.unify
-{
-    public interface IOr
-    {
-        /// <summary>
-        /// 日志头数据,用于统一返回
-        /// </summary>
-        string LogHead
-        {
-            get;
-        }
-        /// <summary>
-        /// 自身类名,用于统一返回
-        /// </summary>
-        string ClassName
-        {
-            get;
-        }
-        /// <summary>
-        /// 异步统一返回
-        /// </summary>
-        /// <param name="Name">方法名</param>
-        /// <param name="State">状态</param>
-        /// <param name="Message">消息</param>
-        /// <param name="RData">结果值</param>
-        /// <returns>统一结果</returns>
-        Task<OperateResult> BreakAsync(string MethodName, bool State, string? Message = null, object? RData = null, ResultType RType = ResultType.NULL);
-
-        /// <summary>
-        /// 统一返回
-        /// </summary>
-        /// <param name="MethodName">方法名</param>
-        /// <param name="State">状态</param>
-        /// <param name="Message">消息</param>
-        /// <param name="RData">结果值</param>
-        /// <returns>统一结果</returns>
-        OperateResult Break(string MethodName, bool State, string? Message = null, object? RData = null, ResultType RType = ResultType.NULL);
-    }
-}

+ 27 - 5
src/YSAI.DAQ/YSAI.Core/interface/unify/IOrAbstract.cs

@@ -13,24 +13,46 @@ namespace YSAI.Core.@interface.unify
     /// <summary>
     /// 抽象类,实现统一返回
     /// </summary>
-    public abstract class IOrAbstract : IOr
+    public abstract class IOrAbstract
     {
-        public virtual string LogHead
+        /// <summary>
+        /// 日志头数据,用于统一返回
+        /// </summary>
+        protected virtual string LogHead
         {
             get;
         }
-        public virtual string ClassName
+        /// <summary>
+        /// 自身类名,用于统一返回
+        /// </summary>
+        protected virtual string ClassName
         {
             get;
         }
-        public virtual Task<OperateResult> BreakAsync(string MethodName, bool State, string? Message = null, object? RData = null, ResultType RType = ResultType.NULL)
+        /// <summary>
+        /// 异步统一返回
+        /// </summary>
+        /// <param name="Name">方法名</param>
+        /// <param name="State">状态</param>
+        /// <param name="Message">消息</param>
+        /// <param name="RData">结果值</param>
+        /// <returns>统一结果</returns>
+        protected Task<OperateResult> BreakAsync(string MethodName, bool State, string? Message = null, object? RData = null, ResultType RType = ResultType.NULL)
         {
             return Task.Run(() =>
             {
                 return Break(MethodName, State, Message, RData, RType);
             });
         }
-        public virtual OperateResult Break(string MethodName, bool State, string? Message = null, object? RData = null, ResultType RType = ResultType.NULL)
+        /// <summary>
+        /// 统一返回
+        /// </summary>
+        /// <param name="MethodName">方法名</param>
+        /// <param name="State">状态</param>
+        /// <param name="Message">消息</param>
+        /// <param name="RData">结果值</param>
+        /// <returns>统一结果</returns>
+        protected OperateResult Break(string MethodName, bool State, string? Message = null, object? RData = null, ResultType RType = ResultType.NULL)
         {
             //返回运行时间(毫秒)
             double runTime = RunTimeTool.Instance($"{ClassName}.{MethodName}").StopRecord().milliseconds;

+ 49 - 42
src/YSAI.DAQ/YSAI.Core/reflection/Reflection.json

@@ -12,6 +12,7 @@
               "ClassName": "MqttClientOperate",
               "ConstructorParam": [
                 {
+                  "SN": "YSAI",
                   "ServerIPAddress": "127.0.0.1",
                   "ServerPort": 11819,
                   "ServerLoginID": "ysai",
@@ -33,76 +34,82 @@
                   "MethodName": "On",
                   "MethodParam": null
                 },
-                {
-                  "SN": "[Off]",
-                  "WhetherExecute": false,
-                  "MethodName": "Off",
-                  "MethodParam": null
-                },
                 {
                   "SN": "[PublishSubscribe]",
                   "WhetherExecute": false,
                   "MethodName": "PublishSubscribe",
                   "MethodParam": null
-                },
-                {
-                  "SN": "[AddSubscribe]",
-                  "WhetherExecute": false,
-                  "MethodName": "AddSubscribe",
-                  "MethodParam": null
-                },
-                {
-                  "SN": "[RemoveSubscribe]",
-                  "WhetherExecute": false,
-                  "MethodName": "RemoveSubscribe",
-                  "MethodParam": null
                 }
               ],
-              "EventDatas": [
-                {
-                  "SN": "[OnEvent]",
-                  "EventName": "OnEvent"
-                }
-              ]
+              "EventDatas": null
             }
           ]
         }
       ]
     },
     {
-      "DllPath": "YSAI.Unility.dll",
+      "DllPath": "YSAI.Kafka.dll",
       "IsAbsolutePath": false,
       "NamespaceDatas": [
         {
-          "Namespace": "YSAI.Unility",
+          "Namespace": "YSAI.Kafka",
           "ClassDatas": [
             {
-              "SN": "YSAI.Unility.PlcDataParseTool[Instance]",
-              "ClassName": "PlcDataParseTool",
-              "ConstructorParam": null,
+              "SN": "YSAI.Kafka.KafkaProducerOperate[Instance]",
+              "ClassName": "KafkaProducerOperate",
+              "ConstructorParam": [
+                {
+                  "ClientId": "ysai",
+                  "WaitTime": 1000,
+                  "SN": "YSAI",
+                  "BootstrapServers": "127.0.0.1:8083"
+                }
+              ],
               "MethodDatas": [
                 {
-                  "SN": "[ACDI]",
+                  "SN": "[Produce]",
                   "WhetherExecute": false,
-                  "MethodName": "ACDI",
+                  "MethodName": "Produce",
                   "MethodParam": null
-                },
+                }
+              ],
+              "EventDatas": null
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "DllPath": "YSAI.RabbitMQ.dll",
+      "IsAbsolutePath": false,
+      "NamespaceDatas": [
+        {
+          "Namespace": "YSAI.RabbitMQ",
+          "ClassDatas": [
+            {
+              "SN": "YSAI.RabbitMQ.RabbitMQPublisherOperate[Instance]",
+              "ClassName": "RabbitMQPublisherOperate",
+              "ConstructorParam": [
                 {
-                  "SN": "[ACFA]",
-                  "WhetherExecute": false,
-                  "MethodName": "ACFA",
-                  "MethodParam": null
-                },
+                  "SN": "YSAI",
+                  "ExChangeName": "exYSAI",
+                  "HostName": "localhost",
+                  "Port": 4369,
+                  "UserName": "ysai",
+                  "Password": "ysai"
+                }
+              ],
+              "MethodDatas": [
                 {
-                  "SN": "[SHIS]",
-                  "WhetherExecute": false,
-                  "MethodName": "SHIS",
+                  "SN": "[On]",
+                  "WhetherExecute": true,
+                  "MethodName": "On",
                   "MethodParam": null
                 },
                 {
-                  "SN": "[SANA]",
+                  "SN": "[Publish]",
                   "WhetherExecute": false,
-                  "MethodName": "SANA",
+                  "MethodName": "Publish",
                   "MethodParam": null
                 }
               ],

+ 1 - 1
src/YSAI.DAQ/YSAI.Core/reflection/ReflectionData.cs

@@ -74,7 +74,7 @@ namespace YSAI.Core.reflection
                             /// </summary>
                             public string SN { get; set; }
                             /// <summary>
-                            /// 是否执行,不判断执行状态
+                            /// 是否执行,不判断执行结果状态
                             /// </summary>
                             public bool WhetherExecute { get; set; }
                             /// <summary>

+ 13 - 6
src/YSAI.DAQ/YSAI.Core/reflection/ReflectionOperate.cs

@@ -26,7 +26,7 @@ namespace YSAI.Core.reflection
     /// <summary>
     /// 反射操作
     /// </summary>
-    public class ReflectionOperate : IBase,IDisposable
+    public class ReflectionOperate : IBaseAbstract,IDisposable
     {
         /// <summary>
         /// 文件夹
@@ -70,7 +70,7 @@ namespace YSAI.Core.reflection
                 //实体转JSON字符串
                 string json = JsonTool.JsonEntityToString(basics);
                 //写入文件
-                File.WriteAllText(ConfigFile, JsonTool.ConvertJsonString(json));
+                File.WriteAllText(ConfigFile, JsonTool.JsonFormatting(json));
                 return true;
             }
             catch (Exception ex)
@@ -120,9 +120,9 @@ namespace YSAI.Core.reflection
             }
             return ThisObjList;
         }
-        public override string LogHead => "[ ReflectionOperate 操作 ]";
+        protected override string LogHead => "[ ReflectionOperate 操作 ]";
 
-        public override string ClassName => "ReflectionOperate";
+        protected override string ClassName => "ReflectionOperate";
      
 
         /// <summary>
@@ -311,7 +311,14 @@ namespace YSAI.Core.reflection
                     {
                         for (int i = 0; i < ParamArray.Count(); i++)
                         {
-                            param.Add(Convert.ChangeType(Data[i], ParamArray[i].ParameterType));
+                            if (string.IsNullOrEmpty(ParamArray[i].ParameterType.FullName))
+                            {
+                                param.Add(Data[i]);
+                            }
+                            else
+                            {
+                                param.Add(Convert.ChangeType(Data[i], ParamArray[i].ParameterType));
+                            }
                         }
                     }
                 }
@@ -350,7 +357,7 @@ namespace YSAI.Core.reflection
         /// <param name="MethodSn">方法的唯一标识符</param>
         /// <param name="MethodParam">方法参数</param>
         /// <returns></returns>
-        public object? ExecuteMethod(string SN, object[]? MethodParam = null)
+        public object? ExecuteMethod(string? SN, object[]? MethodParam = null)
         {
 
             ReflectionMethodResult? reflectionMethodResult = GetMethod(SN);

+ 4 - 5
src/YSAI.DAQ/YSAI.Core/script/ScriptOperate.cs

@@ -12,7 +12,7 @@ namespace YSAI.Core.script
     /// <summary>
     /// 脚本操作
     /// </summary>
-    public class ScriptOperate : IBase, IScript
+    public class ScriptOperate : IBaseAbstract, IScript
     {
         private static readonly object Lock = new object();  //锁
         private static List<ScriptOperate> ThisObjList = new List<ScriptOperate>(); //自身对象集合
@@ -55,9 +55,9 @@ namespace YSAI.Core.script
         /// </summary>
         ScriptData.Basics basics;
 
-        public override string LogHead => "[ ScriptOperate 操作 ]";
+        protected override string LogHead => "[ ScriptOperate 操作 ]";
 
-        public override string ClassName => "ScriptOperate";
+        protected override string ClassName => "ScriptOperate";
 
         public void Dispose()
         {
@@ -76,7 +76,7 @@ namespace YSAI.Core.script
             return Task.Run(() => Execute(ScriptParam));
         }
 
-        public OperateResult Execute(ScriptData.ScriptType ScriptType, string ScriptCode, string ScriptFunction, string ScriptParam)
+        public OperateResult Execute(ScriptData.ScriptType ScriptType, string? ScriptCode, string? ScriptFunction, string? ScriptParam)
         {
             //开始记录运行时间
             RunTimeTool.Instance("ScriptOperate.Execute").StartRecord();
@@ -84,7 +84,6 @@ namespace YSAI.Core.script
             {
                 //返回参数
                 string? RetParam = string.Empty;
-                Type? type;
                 //执行脚本
                 switch (ScriptType)
                 {

+ 3 - 3
src/YSAI.DAQ/YSAI.Core/serialport/SerialPortOperate.cs

@@ -15,7 +15,7 @@ namespace YSAI.Core.serialport
     /// <summary>
     /// 串口操作
     /// </summary>
-    public class SerialPortOperate : IBase, IBaseCommunication
+    public class SerialPortOperate : IBaseAbstract, IBaseCommunication
     {
 
         private static readonly object Lock = new object();  //锁
@@ -88,9 +88,9 @@ namespace YSAI.Core.serialport
         /// </summary>
         private bool ResponseState { get; set; }
 
-        public override string LogHead => "[ SerialPortOperate 操作 ]";
+        protected override string LogHead => "[ SerialPortOperate 操作 ]";
 
-        public override string ClassName => "SerialPortOperate";
+        protected override string ClassName => "SerialPortOperate";
 
         public void Dispose()
         {

+ 3 - 3
src/YSAI.DAQ/YSAI.Core/socket/tcp/client/SocketTcpClientOperate.cs

@@ -12,7 +12,7 @@ namespace YSAI.Core.socket.tcp.client
     /// <summary>
     /// 客户端
     /// </summary>
-    public class SocketTcpClientOperate : IBase<SocketTcpClientData.Event>, IBaseCommunication
+    public class SocketTcpClientOperate : IBaseAbstract<SocketTcpClientData.Event>, IBaseCommunication
     {
         private static readonly object Lock = new object();  //锁
         private static List<SocketTcpClientOperate> ThisObjList = new List<SocketTcpClientOperate>(); //自身对象集合
@@ -73,9 +73,9 @@ namespace YSAI.Core.socket.tcp.client
         /// </summary>
         private CancellationTokenSource ThreadMonitorConnectStateSwitch;
 
-        public override string LogHead => "[ SocketTcpClientOperate 操作 ]";
+        protected override string LogHead => "[ SocketTcpClientOperate 操作 ]";
 
-        public override string ClassName => "SocketTcpClientOperate";
+        protected override string ClassName => "SocketTcpClientOperate";
 
 
      

+ 3 - 3
src/YSAI.DAQ/YSAI.Core/socket/tcp/service/SocketTcpServiceOperate.cs

@@ -23,7 +23,7 @@ namespace YSAI.Core.socket.tcp.service
     /// <summary>
     /// 服务端
     /// </summary>
-    public class SocketTcpServiceOperate : IBase<SocketTcpServiceData.Event>, ISocketTcpService
+    public class SocketTcpServiceOperate : IBaseAbstract<SocketTcpServiceData.Event>, ISocketTcpService
     {
 
         private static readonly object Lock = new object();  //锁
@@ -87,9 +87,9 @@ namespace YSAI.Core.socket.tcp.service
         /// </summary>
         private CancellationTokenSource ClientDataMonitorSwitch;
 
-        public override string LogHead => "[ SocketTcpServiceOperate 操作 ]";
+        protected override string LogHead => "[ SocketTcpServiceOperate 操作 ]";
 
-        public override string ClassName => "SocketTcpServiceOperate";
+        protected override string ClassName => "SocketTcpServiceOperate";
 
         
       

+ 3 - 3
src/YSAI.DAQ/YSAI.Core/socket/tcpClient/Operate.cs

@@ -14,7 +14,7 @@ namespace YSAI.Core.socket.tcpClient
     /// <summary>
     /// tcpClient  操作
     /// </summary>
-    public class Operate: IBase<SocketTcpClientData.Event>, IBaseCommunication
+    public class Operate: IBaseAbstract<SocketTcpClientData.Event>, IBaseCommunication
     {
         private static readonly object Lock = new object();  //锁
         private static List<Operate> ThisObjList = new List<Operate>(); //自身对象集合
@@ -86,9 +86,9 @@ namespace YSAI.Core.socket.tcpClient
         /// </summary>
         bool threadMonitorConnectState = false;
 
-        public override string LogHead => "[ SocketTcpClientOperate 操作 ]";
+        protected override string LogHead => "[ SocketTcpClientOperate 操作 ]";
 
-        public override string ClassName => "SocketTcpClientOperate";
+        protected override string ClassName => "SocketTcpClientOperate";
 
         /// <summary>
         /// 线程监控连接状态

+ 3 - 3
src/YSAI.DAQ/YSAI.Core/socket/tcpListener/Operate.cs

@@ -20,7 +20,7 @@ namespace YSAI.Core.socket.tcpListener
     /// <summary>
     /// tcpServer 操作
     /// </summary>
-    public class Operate : IBase<SocketTcpServiceData.Event>, ISocketTcpService
+    public class Operate : IBaseAbstract<SocketTcpServiceData.Event>, ISocketTcpService
     {
 
         private static readonly object Lock = new object();  //锁
@@ -144,9 +144,9 @@ namespace YSAI.Core.socket.tcpListener
         /// </summary>
         public NetworkStream networkStream;
 
-        public override string LogHead => "[ SocketTcpServiceOperate 操作 ]";
+        protected override string LogHead => "[ SocketTcpServiceOperate 操作 ]";
 
-        public override string ClassName => "SocketTcpServiceOperate";
+        protected override string ClassName => "SocketTcpServiceOperate";
 
         /// <summary>
         /// 客户端数据接收

+ 3 - 3
src/YSAI.DAQ/YSAI.Core/socket/udp/SocketUdpOperate.cs

@@ -17,7 +17,7 @@ namespace YSAI.Core.socket.udp
     /// <summary>
     /// socket UDP 客户端
     /// </summary>
-    public class SocketUdpOperate: IBase<SocketUdpData.Event>, ISocketUdp
+    public class SocketUdpOperate: IBaseAbstract<SocketUdpData.Event>, ISocketUdp
     {
 
         private static readonly object Lock = new object();  //锁
@@ -84,9 +84,9 @@ namespace YSAI.Core.socket.udp
         /// </summary>
         private CancellationTokenSource MessageMonitorSwitch;
 
-        public override string LogHead => "[ SocketUdpOperate 操作 ]";
+        protected override string LogHead => "[ SocketUdpOperate 操作 ]";
 
-        public override string ClassName => "SocketUdpOperate";
+        protected override string ClassName => "SocketUdpOperate";
         /// <summary>
         /// 接收信息
         /// </summary>

+ 3 - 3
src/YSAI.DAQ/YSAI.Core/socket/udpClient/Operate.cs

@@ -19,7 +19,7 @@ namespace YSAI.Core.socket.udpClient
     /// <summary>
     /// udpClient 操作
     /// </summary>
-    public class Operate: IBase<SocketUdpData.Event>, ISocketUdp
+    public class Operate: IBaseAbstract<SocketUdpData.Event>, ISocketUdp
     {
 
         private static readonly object Lock = new object();  //锁
@@ -87,9 +87,9 @@ namespace YSAI.Core.socket.udpClient
         /// </summary>
         private CancellationTokenSource MessageMonitorSwitch;
 
-        public override string LogHead => "[ SocketUdpOperate 操作 ]";
+        protected override string LogHead => "[ SocketUdpOperate 操作 ]";
 
-        public override string ClassName => "SocketUdpOperate";
+        protected override string ClassName => "SocketUdpOperate";
 
        
 

+ 3 - 3
src/YSAI.DAQ/YSAI.Core/subscribe/SubscribeOperate.cs

@@ -18,7 +18,7 @@ namespace YSAI.Core.subscription
     /// 1.ConcurrentDictionary<string, AddressValue>   
     /// 2.List<ConcurrentDictionary<string, AddressValue>>  
     /// </summary>
-    public class SubscribeOperate : IBase<SubscribeData.EventParam>, ISubscribe
+    public class SubscribeOperate : IBaseAbstract<SubscribeData.EventParam>, ISubscribe
     {
         private static readonly object Lock = new object();  //锁
         private static List<SubscribeOperate> ThisObjList = new List<SubscribeOperate>(); //自身对象集合
@@ -87,9 +87,9 @@ namespace YSAI.Core.subscription
         /// </summary>
         List<ConcurrentDictionary<string, AddressValue>> UpParamArray;
 
-        public override string LogHead => "[ SubscribeOperate 操作 ]";
+        protected override string LogHead => "[ SubscribeOperate 操作 ]";
 
-        public override string ClassName => "SubscribeOperate";
+        protected override string ClassName => "SubscribeOperate";
 
         /// <summary>
         /// 现场安全字典比对,是否一致

+ 10 - 9
src/YSAI.DAQ/YSAI.DB/DBOperate.cs

@@ -22,7 +22,7 @@ namespace YSAI.DB
     /// <summary>
     /// 数据库操作
     /// </summary>
-    public class DBOperate : IBase,IDB
+    public sealed class DBOperate : IBaseAbstract,IDB
     {
         private static readonly object Lock = new object();  //锁
         private static List<DBOperate> ThisObjList = new List<DBOperate>(); //自身对象集合
@@ -612,10 +612,11 @@ namespace YSAI.DB
         public void Dispose()
         {
             GC.Collect();
+            GC.SuppressFinalize(this);
             ThisObjList.Remove(this);
         }
-        public override string LogHead => "[ DBOperate 操作 ]";
-        public override string ClassName => "DBOperate";
+        protected override string LogHead => "[ DBOperate 操作 ]";
+        protected override string ClassName => "DBOperate";
         public Task<OperateResult> ReadAsync(Address address)
         {
             return Task.Run(() => Read(address));
@@ -623,7 +624,7 @@ namespace YSAI.DB
         public OperateResult Read(Address address)
         {
             //开始记录运行时间
-            RunTimeTool.Instance("DapperOperate.Read").StartRecord();
+            RunTimeTool.Instance($"{ClassName}.Read").StartRecord();
             try
             {
                 List<ConcurrentDictionary<string, AddressValue>> RetData = new List<ConcurrentDictionary<string, AddressValue>>();
@@ -659,11 +660,11 @@ namespace YSAI.DB
                         }
                         catch (Exception ex)
                         {
-                            LogHelper.Error(basics.DBType.ToString(), "DapperOperate.log");
-                            LogHelper.Error(basics.ConnectStr, "DapperOperate.log");
-                            LogHelper.Error($"执行SQL:{sql} 异常:", "DapperOperate.log");
-                            LogHelper.Error(ex.Message, "DapperOperate.log");
-                            LogHelper.Error("以上异常不影响流程", "DapperOperate.log");
+                            LogHelper.Error(basics.DBType.ToString(), $"{ClassName}.log");
+                            LogHelper.Error(basics.ConnectStr, $"{ClassName}.log");
+                            LogHelper.Error($"执行SQL:{sql} 异常:", $"{ClassName}.log");
+                            LogHelper.Error(ex.Message, $"{ClassName}.log");
+                            LogHelper.Error("以上异常不影响流程", $"{ClassName}.log");
                         }
                         if (obj == null)  //查询结果为空
                         {

+ 1 - 2
src/YSAI.DAQ/YSAI.DB/YSAI.DB.csproj

@@ -1,10 +1,9 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
-	  <GenerateDocumentationFile>True</GenerateDocumentationFile>
   </PropertyGroup>
 
 	<ItemGroup>

+ 3 - 3
src/YSAI.DAQ/YSAI.Kafka/KafkaAdminOperate.cs

@@ -18,7 +18,7 @@ namespace YSAI.Kafka
     /// <summary>
     /// 管理员创建主题使用
     /// </summary>
-    public class KafkaAdminOperate:IBase,IKafkaAdmin
+    public sealed class KafkaAdminOperate:IBaseAbstract,IKafkaAdmin
     {
         private static readonly object Lock = new object();  //锁
         private static List<KafkaAdminOperate> ThisObjList = new List<KafkaAdminOperate>(); //自身对象集合
@@ -70,8 +70,8 @@ namespace YSAI.Kafka
             GC.SuppressFinalize(this);
             ThisObjList.Remove(this);
         }
-        public override string LogHead => "[ KafkaAdminOperate 操作 ]";
-        public override string ClassName => "KafkaAdminOperate";
+        protected override string LogHead => "[ KafkaAdminOperate 操作 ]";
+        protected override string ClassName => "KafkaAdminOperate";
         public async Task<OperateResult> CreateTopicsAsync(List<string> Topics)
         {
             //开始记录运行时间

+ 22 - 22
src/YSAI.DAQ/YSAI.Kafka/KafkaConsumerOperate.cs

@@ -11,17 +11,17 @@ using YSAI.Unility;
 
 namespace YSAI.Kafka
 {
-    public class KafkaConsumerOperate<K, V> : IBase, IKafkaConsumer
+    public sealed class KafkaConsumerOperate : IBaseAbstract, IKafkaConsumer
     {
         private static readonly object Lock = new object();  //锁
-        private static List<KafkaConsumerOperate<K, V>> ThisObjList = new List<KafkaConsumerOperate<K, V>>(); //自身对象集合
+        private static List<KafkaConsumerOperate> ThisObjList = new List<KafkaConsumerOperate>(); //自身对象集合
         /// <summary>
         /// 单例模式
         /// </summary>
         /// <returns></returns>
-        public static KafkaConsumerOperate<K, V> Instance(KafkaConsumerData.Basics basics)
+        public static KafkaConsumerOperate Instance(KafkaConsumerData.Basics basics)
         {
-            KafkaConsumerOperate<K, V>? exp = ThisObjList.FirstOrDefault(c => c.basics.Equals(basics));
+            KafkaConsumerOperate? exp = ThisObjList.FirstOrDefault(c => c.basics.Equals(basics));
             if (exp == null)
             {
                 lock (Lock)
@@ -32,7 +32,7 @@ namespace YSAI.Kafka
                     }
                     else
                     {
-                        KafkaConsumerOperate<K, V> exp2 = new KafkaConsumerOperate<K, V>(basics);
+                        KafkaConsumerOperate exp2 = new KafkaConsumerOperate(basics);
                         ThisObjList.Add(exp2);
                         return exp2;
                     }
@@ -65,7 +65,7 @@ namespace YSAI.Kafka
         /// KEY:组ID 
         /// VALUE:(对象,主题名集合)
         /// </summary>
-        private ConcurrentDictionary<string, (IConsumer<K, V> ConsumerObj, List<string> Topics)> SubscribeDataArray { get; set; }
+        private ConcurrentDictionary<string, (IConsumer<object, object> ConsumerObj, List<string> Topics)> SubscribeDataArray { get; set; }
         /// <summary>
         /// 轮询状态
         /// </summary>
@@ -76,29 +76,29 @@ namespace YSAI.Kafka
         /// <summary>
         /// 全局信息事件中状态抛出
         /// </summary>
-        public event EventHandler<KafkaConsumerData.Event<K, V>> OnEvent
+        public event EventHandler<KafkaConsumerData.Event<object, object>> OnEvent
         {
             add { OnEventHandler += value; }
             remove { OnEventHandler -= value; }
         }
-        private EventHandler<KafkaConsumerData.Event<K, V>>? OnEventHandler;
+        private EventHandler<KafkaConsumerData.Event<object, object>>? OnEventHandler;
 
         /// <summary>
         /// 轮询消费
         /// </summary>
         /// <returns></returns>
-        private async Task PollingConsume(IConsumer<K, V> consumer)
+        private async Task PollingConsume(IConsumer<object, object> consumer)
         {
             try
             {
                 while (PollingState)
                 {
                     //超时时间1秒
-                    ConsumeResult<K, V>? result = consumer?.Consume(TimeSpan.FromSeconds(1));
+                    ConsumeResult<object, object>? result = consumer?.Consume(TimeSpan.FromSeconds(1));
 
                     if (result != null)
                     {
-                        OnEventHandler?.Invoke(this, new KafkaConsumerData.Event<K, V>() { State = true, Key = result.Message.Key, Value = result.Message.Value, Topic = result.Topic, Message = $"收到主题:{result.Topic} - Key:{result.Message.Key} - Value:{result.Message.Value}" });
+                        OnEventHandler?.Invoke(this, new KafkaConsumerData.Event<object, object>() { State = true, Key = result.Message.Key, Value = result.Message.Value, Topic = result.Topic, Message = $"收到主题:{result.Topic} - Key:{result.Message.Key} - Value:{result.Message.Value}" });
                         //消息已处理提交偏移量
                         consumer?.Commit();
                     }
@@ -106,7 +106,7 @@ namespace YSAI.Kafka
             }
             catch (Exception ex)
             {
-                OnEventHandler?.Invoke(this, new KafkaConsumerData.Event<K, V>() { State = false, Message = $"轮询消费异常:{ex.Message}" });
+                OnEventHandler?.Invoke(this, new KafkaConsumerData.Event<object, object>() { State = false, Message = $"轮询消费异常:{ex.Message}" });
             }
         }
 
@@ -116,8 +116,8 @@ namespace YSAI.Kafka
             GC.SuppressFinalize(this);
             ThisObjList.Remove(this);
         }
-        public override string LogHead => "[ KafkaConsumerOperate 操作 ]";
-        public override string ClassName => "KafkaConsumerOperate";
+        protected override string LogHead => "[ KafkaConsumerOperate 操作 ]";
+        protected override string ClassName => "KafkaConsumerOperate";
         public Task<OperateResult> ConsumeAsync(string Topic)
         {
             return Task.Run(()=> Consume(Topic));
@@ -131,7 +131,7 @@ namespace YSAI.Kafka
                 //实例化订阅数据集合
                 if (SubscribeDataArray == null)
                 {
-                    SubscribeDataArray = new ConcurrentDictionary<string, (IConsumer<K, V>, List<string>)>();
+                    SubscribeDataArray = new ConcurrentDictionary<string, (IConsumer<object, object>, List<string>)>();
                 }
 
                 if (consumerConfig == null)
@@ -141,13 +141,13 @@ namespace YSAI.Kafka
                 }
 
                 //创建一个实例
-                IConsumer<K, V> consumer = new ConsumerBuilder<K, V>(consumerConfig).Build();
+                IConsumer<object, object> consumer = new ConsumerBuilder<object, object>(consumerConfig).Build();
 
                 //订阅多个主题
                 consumer.Subscribe(Topic);
 
                 //超时时间1秒
-                ConsumeResult<K, V>? result = consumer?.Consume(TimeSpan.FromSeconds(1));
+                ConsumeResult<object, object>? result = consumer?.Consume(TimeSpan.FromSeconds(1));
                 //状态
                 bool state = false;
                 //消息信息
@@ -157,7 +157,7 @@ namespace YSAI.Kafka
                 {
                     state = true;
                     message = $"消费成功,收到主题:{result.Topic} - Key:{result.Message.Key} - Value:{result.Message.Value}";
-                    OnEventHandler?.Invoke(this, new KafkaConsumerData.Event<K, V>() { State = state, Key = result.Message.Key, Value = result.Message.Value, Topic = result.Topic, Message = message });
+                    OnEventHandler?.Invoke(this, new KafkaConsumerData.Event<object, object>() { State = state, Key = result.Message.Key, Value = result.Message.Value, Topic = result.Topic, Message = message });
                     //消息已处理提交偏移量
                     consumer?.Commit();
                 }
@@ -165,7 +165,7 @@ namespace YSAI.Kafka
                 {
                     state = true;
                     message = $"消费失败,未收到消息,执行消费未返回数据";
-                    OnEventHandler?.Invoke(this, new KafkaConsumerData.Event<K, V>() { State = state, Message = message });
+                    OnEventHandler?.Invoke(this, new KafkaConsumerData.Event<object, object>() { State = state, Message = message });
                 }
                 //先关闭此组的订阅
                 consumer?.Unsubscribe();
@@ -194,7 +194,7 @@ namespace YSAI.Kafka
                 //实例化订阅数据集合
                 if (SubscribeDataArray == null)
                 {
-                    SubscribeDataArray = new ConcurrentDictionary<string, (IConsumer<K, V>, List<string>)>();
+                    SubscribeDataArray = new ConcurrentDictionary<string, (IConsumer<object, object>, List<string>)>();
                 }
 
                 if (consumerConfig == null)
@@ -217,7 +217,7 @@ namespace YSAI.Kafka
                 }
 
                 //创建一个实例
-                IConsumer<K, V> consumer = new ConsumerBuilder<K, V>(consumerConfig).Build();
+                IConsumer<object, object> consumer = new ConsumerBuilder<object, object>(consumerConfig).Build();
 
                 //订阅多个主题
                 consumer.Subscribe(Topics);
@@ -229,7 +229,7 @@ namespace YSAI.Kafka
                 PollingConsume(consumer);
 
                 //设置值
-                (IConsumer<K, V>, List<string>) value = (consumer, Topics);
+                (IConsumer<object, object>, List<string>) value = (consumer, Topics);
 
                 //存在更新value 反之添加
                 SubscribeDataArray.AddOrUpdate(basics.GroupId, value, (k, v) => value);

+ 12 - 14
src/YSAI.DAQ/YSAI.Kafka/KafkaProducerOperate.cs

@@ -9,7 +9,7 @@ using YSAI.Unility;
 
 namespace YSAI.Kafka
 {
-    public class KafkaProducerOperate: IBase, IKafkaProducer
+    public sealed class KafkaProducerOperate: IBaseAbstract, IKafkaProducer
     {
         private static readonly object Lock = new object();  //锁
         private static List<KafkaProducerOperate> ThisObjList = new List<KafkaProducerOperate>(); //自身对象集合
@@ -62,9 +62,9 @@ namespace YSAI.Kafka
             GC.SuppressFinalize(this);
             ThisObjList.Remove(this);
         }
-        public override string LogHead => "[ KafkaProducerOperate 操作 ]";
-        public override string ClassName => "KafkaProducerOperate";
-        public OperateResult Produce<K, V>(List<(string Topic, K Key, V Value)> values)
+        protected override string LogHead => "[ KafkaProducerOperate 操作 ]";
+        protected override string ClassName => "KafkaProducerOperate";
+        public OperateResult Produce(string Topic, object Key, object Value)
         {
             //开始记录运行时间
             RunTimeTool.Instance($"{ClassName}.Produce").StartRecord();
@@ -72,8 +72,6 @@ namespace YSAI.Kafka
             {
                 //失败的消息
                 List<string> MessageFail = new List<string>();
-                foreach (var data in values)
-                {
                     if (producerConfig == null)
                     {
                         //创建配置
@@ -89,34 +87,33 @@ namespace YSAI.Kafka
                             //SaslKerberosPrincipal = basics.SaslKerberosPrincipal
                         };
                     }
-                    using (IProducer<K, V> producer = new ProducerBuilder<K, V>(producerConfig).Build())
+                    using (IProducer<object, object> producer = new ProducerBuilder<object, object>(producerConfig).Build())
                     {
                         //返回结果
                         OperateResult? result = null;
                         //发布结果
-                        producer.Produce(data.Topic, new Message<K, V>() { Key = data.Key, Value = data.Value }, Result =>
+                        producer.Produce(Topic, new Message<object, object>() { Key = Key, Value = Value }, Result =>
                         {
                             if (Result.Error.Code != ErrorCode.NoError)
                             {
-                                result = Break("Produce", false, $"主题 [ {data.Topic} ] 发送失败:{Result.Error.Reason}");
+                                result = Break("Produce", false, $"主题 [ {Topic} ] 发送失败:{Result.Error.Reason}");
                             }
                             else
                             {
-                                result = Break("Produce", true, $"主题 [ {data.Topic} ] 发送失败,偏移量:{Result.TopicPartitionOffset}");
+                                result = Break("Produce", true, $"主题 [ {Topic} ] 发送成功,偏移量:{Result.TopicPartitionOffset}");
                             }
                         });
                         //最多等待时间
                         producer.Flush(new TimeSpan(0,0,0,0, basics.WaitTime));
                         if (result == null)
                         {
-                            result = Break("Produce", false, $"主题 [ {data.Topic} ] 发送失败");
+                            result = Break("Produce", false, $"主题 [ {Topic} ] 发送失败");
                         }
                         if (!result.State)
                         {
                             MessageFail.Add(result.Message);
                         }
                     }
-                }
                 if (MessageFail.Count > 0)
                 {
                     return Break("Produce", false, $"批量发送失败,存在发送失败数据:{MessageFail.ToJson()}");
@@ -131,9 +128,10 @@ namespace YSAI.Kafka
                 return Break("Produce", false, ex.Message);
             }
         }
-        public Task<OperateResult> ProduceAsync<K, V>(List<(string Topic, K Key, V Value)> values)
+        
+        public Task<OperateResult> ProduceAsync(string Topic, object Key, object Value)
         {
-            return Task.Run(() => Produce(values));
+            return Task.Run(() => Produce(Topic,Key,Value));
         }
     }
 }

+ 1 - 2
src/YSAI.DAQ/YSAI.Kafka/YSAI.Kafka.csproj

@@ -1,10 +1,9 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
-	  <GenerateDocumentationFile>True</GenerateDocumentationFile>
   </PropertyGroup>
 
   <ItemGroup>

+ 8 - 3
src/YSAI.DAQ/YSAI.Manage/Controllers/LibInfoController.cs

@@ -7,7 +7,6 @@ using YSAI.Core.@interface.unify;
 using YSAI.DB;
 using YSAI.Kafka;
 using YSAI.Log;
-using YSAI.Manage.or;
 using YSAI.Modbus.client;
 using YSAI.Mqtt.client;
 using YSAI.Mqtt.service;
@@ -29,9 +28,15 @@ namespace YSAI.Manage.Controllers
     [Route("api/[controller]/[action]")]
     public class LibInfoController : Controller
     {
-
+        /// <summary>
+        /// 配置
+        /// </summary>
         private readonly IConfiguration configuration;
-        private Or operateResult;
+        /// <summary>
+        /// 统一操作结果
+        /// </summary>
+        private readonly Or operateResult;
+
         public LibInfoController(IConfiguration configuration, Or operateResult)
         {
             this.configuration = configuration;

+ 57 - 0
src/YSAI.DAQ/YSAI.Manage/Or.cs

@@ -0,0 +1,57 @@
+using YSAI.Core.data;
+using YSAI.Core.@enum;
+using YSAI.Core.@interface.unify;
+using YSAI.Log;
+using YSAI.Unility;
+
+namespace YSAI.Manage
+{
+    /// <summary>
+    /// 统一返回结果
+    /// </summary>
+    public class Or
+    {
+        /// <summary>
+        /// 日志头数据,用于统一返回
+        /// </summary>
+        public string LogHead { get; set; }
+        /// <summary>
+        /// 自身类名,用于统一返回
+        /// </summary>
+        public string ClassName { get; set; }
+        /// <summary>
+        /// 异步统一返回
+        /// </summary>
+        /// <param name="Name">方法名</param>
+        /// <param name="State">状态</param>
+        /// <param name="Message">消息</param>
+        /// <param name="RData">结果值</param>
+        /// <returns>统一结果</returns>
+        public Task<OperateResult> BreakAsync(string MethodName, bool State, string? Message = null, object? RData = null, ResultType RType = ResultType.NULL)
+        {
+            return Task.Run(() =>
+            {
+                return Break(MethodName, State, Message, RData, RType);
+            });
+        }
+        /// <summary>
+        /// 统一返回
+        /// </summary>
+        /// <param name="MethodName">方法名</param>
+        /// <param name="State">状态</param>
+        /// <param name="Message">消息</param>
+        /// <param name="RData">结果值</param>
+        /// <returns>统一结果</returns>
+        public OperateResult Break(string MethodName, bool State, string? Message = null, object? RData = null, ResultType RType = ResultType.NULL)
+        {
+            //返回运行时间(毫秒)
+            double runTime = RunTimeTool.Instance($"{ClassName}.{MethodName}").StopRecord().milliseconds;
+            //消息数据组织
+            string message = $"{LogHead} ( {MethodName} {(State ? "成功" : "异常")} ){(string.IsNullOrEmpty(Message) ? "" : $" : {Message}")}";
+            //异常则输出日志
+            if (!State) { LogHelper.Error(message, $"{ClassName}.log"); }
+            //返回状态
+            return new OperateResult(State, message, runTime, RData, RType);
+        }
+    }
+}

+ 0 - 1
src/YSAI.DAQ/YSAI.Manage/Program.cs

@@ -3,7 +3,6 @@ using Microsoft.Extensions.Configuration.Json;
 using System.Reflection;
 using YSAI.Core.@interface.unify;
 using YSAI.Manage.Controllers;
-using YSAI.Manage.or;
 
 namespace YSAI.Manage
 {

+ 0 - 41
src/YSAI.DAQ/YSAI.Manage/or/Or.cs

@@ -1,41 +0,0 @@
-using YSAI.Core.data;
-using YSAI.Core.@enum;
-using YSAI.Core.@interface.unify;
-using YSAI.Log;
-using YSAI.Unility;
-
-namespace YSAI.Manage.or
-{
-    /// <summary>
-    /// 统一返回结果
-    /// </summary>
-    public class Or
-    {
-        public virtual string LogHead
-        {
-            get; set;
-        }
-        public virtual string ClassName
-        {
-            get; set;
-        }
-        public virtual Task<OperateResult> BreakAsync(string MethodName, bool State, string? Message = null, object? RData = null, ResultType RType = ResultType.NULL)
-        {
-            return Task.Run(() =>
-            {
-                return Break(MethodName, State, Message, RData, RType);
-            });
-        }
-        public virtual OperateResult Break(string MethodName, bool State, string? Message = null, object? RData = null, ResultType RType = ResultType.NULL)
-        {
-            //返回运行时间(毫秒)
-            double runTime = RunTimeTool.Instance($"{ClassName}.{MethodName}").StopRecord().milliseconds;
-            //消息数据组织
-            string message = $"{LogHead} ( {MethodName} {(State ? "成功" : "异常")} ){(string.IsNullOrEmpty(Message) ? "" : $" : {Message}")}";
-            //异常则输出日志
-            if (!State) { LogHelper.Error(message, $"{ClassName}.log"); }
-            //返回状态
-            return new OperateResult(State, message, runTime, RData, RType);
-        }
-    }
-}

+ 0 - 1
src/YSAI.DAQ/YSAI.Modbus/YSAI.Modbus.csproj

@@ -4,7 +4,6 @@
     <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
-	<GenerateDocumentationFile>True</GenerateDocumentationFile>
   </PropertyGroup>
 
   <ItemGroup>

+ 4 - 4
src/YSAI.DAQ/YSAI.Modbus/client/ModbusClientOperate.cs

@@ -25,7 +25,7 @@ namespace YSAI.Modbus.client
     /// <summary>
     /// modbus 操作
     /// </summary>
-    public class ModbusClientOperate : IBase, IModbusClient
+    public sealed class ModbusClientOperate : IBaseAbstract, IModbusClient
     {
         private static readonly object Lock = new object();  //锁
         private static List<ModbusClientOperate> ThisObjList = new List<ModbusClientOperate>(); //自身对象集合
@@ -113,7 +113,7 @@ namespace YSAI.Modbus.client
             }
             return null;
         }
-        public virtual ushort Value { get; set; }
+        public ushort Value { get; set; }
         public byte MSB
         {
             get { return (byte)(Value >> 8); }
@@ -182,8 +182,8 @@ namespace YSAI.Modbus.client
 
 
 
-        public override string LogHead => "[ ModbusClientOperate 操作 ]";
-        public override string ClassName => "ModbusClientOperate";
+        protected override string LogHead => "[ ModbusClientOperate 操作 ]";
+        protected override string ClassName => "ModbusClientOperate";
 
         public Task<OperateResult> OnAsync()
         {

+ 1 - 2
src/YSAI.DAQ/YSAI.Mqtt/YSAI.Mqtt.csproj

@@ -1,10 +1,9 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
-    <GenerateDocumentationFile>True</GenerateDocumentationFile>
   </PropertyGroup>
 
   <ItemGroup>

+ 3 - 3
src/YSAI.DAQ/YSAI.Mqtt/client/MqttClientOperate.cs

@@ -19,7 +19,7 @@ namespace YSAI.Mqtt.client
     /// <summary>
     /// Mqtt 客户端
     /// </summary>
-    public class MqttClientOperate : IBase<Event>, Core.@interface.only.IMqttClient
+    public sealed class MqttClientOperate : IBaseAbstract<Event>, Core.@interface.only.IMqttClient
     {
         private static readonly object Lock = new object();  //锁
         private static List<MqttClientOperate> ThisObjList = new List<MqttClientOperate>(); //自身对象集合
@@ -104,9 +104,9 @@ namespace YSAI.Mqtt.client
             ThisObjList.Remove(this);
         }
 
-        public override string LogHead => "[ MqttClientOperate 操作 ]";
+        protected override string LogHead => "[ MqttClientOperate 操作 ]";
 
-        public override string ClassName => "MqttClientOperate";
+        protected override string ClassName => "MqttClientOperate";
 
         public async Task<OperateResult> PublishSubscribeAsync(string Topic, string Value, int QoSLevel = 0, bool Retain = false)
         {

+ 3 - 3
src/YSAI.DAQ/YSAI.Mqtt/service/MqttServiceOperate.cs

@@ -21,7 +21,7 @@ namespace YSAI.Mqtt.service
     /// <summary>
     /// mqtt 服务端
     /// </summary>
-    public class MqttServiceOperate : IBase<Event>, IMqttService
+    public sealed class MqttServiceOperate : IBaseAbstract<Event>, IMqttService
     {
         private static readonly object Lock = new object();  //锁
         private static List<MqttServiceOperate> ThisObjList = new List<MqttServiceOperate>(); //自身对象集合
@@ -205,9 +205,9 @@ namespace YSAI.Mqtt.service
             ThisObjList.Remove(this);
         }
 
-        public override string LogHead => "[ MqttService 操作 ]";
+        protected override string LogHead => "[ MqttService 操作 ]";
 
-        public override string ClassName => "MqttService";
+        protected override string ClassName => "MqttService";
 
         public Task<OperateResult> InitAsync()
         {

+ 3 - 3
src/YSAI.DAQ/YSAI.Mqtt/service/websocket/MqttWebSocketServiceOperate.cs

@@ -18,7 +18,7 @@ namespace YSAI.Mqtt.service.websocket
     /// <summary>
     /// MQTT WEBSOCKET 服务
     /// </summary>
-    public class MqttWebSocketServiceOperate: IBase, IMqttWebSocketService
+    public sealed class MqttWebSocketServiceOperate: IBaseAbstract, IMqttWebSocketService
     {
         private static readonly object Lock = new object();  //锁
         private static List<MqttWebSocketServiceOperate> ThisObjList = new List<MqttWebSocketServiceOperate>(); //自身对象集合
@@ -90,11 +90,11 @@ namespace YSAI.Mqtt.service.websocket
             GC.SuppressFinalize(this);
             ThisObjList.Remove(this);
         }
-        public override string LogHead => "[ MqttWebSocketServiceOperate 操作 ]";
+        protected override string LogHead => "[ MqttWebSocketServiceOperate 操作 ]";
 
         public static string LogHead_Static => "[ MqttWebSocketServiceOperate 操作 ]";
 
-        public override string ClassName => "MqttWebSocketServiceOperate";
+        protected override string ClassName => "MqttWebSocketServiceOperate";
 
         /// <summary>
         /// 信息传递

+ 1 - 2
src/YSAI.DAQ/YSAI.Opc/YSAI.Opc.csproj

@@ -1,11 +1,10 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
     <PlatformTarget>AnyCPU</PlatformTarget>
-	  <GenerateDocumentationFile>True</GenerateDocumentationFile>
   </PropertyGroup>
 
   <ItemGroup>

+ 3 - 3
src/YSAI.DAQ/YSAI.Opc/da/client/OpcDaClientOperate.cs

@@ -14,7 +14,7 @@ namespace YSAI.Opc.da.client
     /// <summary>
     /// OPCDA客户端操作 (请以32位启动)
     /// </summary>
-    public class OpcDaClientOperate: IBase<OpcDaClientData.EventParam>, IOpcDaClient
+    public sealed class OpcDaClientOperate: IBaseAbstract<OpcDaClientData.EventParam>, IOpcDaClient
     {
         private static readonly object Lock = new object();  //锁
         private static List<OpcDaClientOperate> ThisObjList = new List<OpcDaClientOperate>(); //自身对象集合
@@ -219,8 +219,8 @@ namespace YSAI.Opc.da.client
             ThisObjList.Remove(this);
         }
 
-        public override string LogHead => "[ OpcDaClientOperate 操作 ]";
-        public override string ClassName => "OpcDaClientOperate";
+        protected override string LogHead => "[ OpcDaClientOperate 操作 ]";
+        protected override string ClassName => "OpcDaClientOperate";
 
         public OperateResult AddGroup(string GroupName, bool IsSubscribed = false, int UpdateRate = 200)
         {

+ 3 - 3
src/YSAI.DAQ/YSAI.Opc/da/http/OpcDaHttpOperate.cs

@@ -20,7 +20,7 @@ using YSAI.Core.@interface.unify;
 
 namespace YSAI.Opc.da.http
 {
-    public class OpcDaHttpOperate : IBase<OpcDaHttpData.EventParam>, IOpcDaHttp
+    public sealed class OpcDaHttpOperate : IBaseAbstract<OpcDaHttpData.EventParam>, IOpcDaHttp
     {
         /// <summary>
         /// 构造函数
@@ -157,8 +157,8 @@ namespace YSAI.Opc.da.http
             GC.SuppressFinalize(this);
             ThisObjList.Remove(this);
         }
-        public override string LogHead => "[ OpcDaHttpOperate 操作 ]";
-        public override string ClassName => "OpcDaHttpOperate";
+        protected override string LogHead => "[ OpcDaHttpOperate 操作 ]";
+        protected override string ClassName => "OpcDaHttpOperate";
         public OperateResult Request(int requestApi, object? Param = null)
         {
             //开始记录运行时间

+ 3 - 3
src/YSAI.DAQ/YSAI.Opc/ua/client/OpcUaClientOperate.cs

@@ -23,7 +23,7 @@ namespace YSAI.Opc.ua.client
     /// <summary>
     /// OpcUa 客户端 
     /// </summary>
-    public class OpcUaClientOperate : IBase<Event, EventParam>, IOpcUaClient
+    public sealed class OpcUaClientOperate : IBaseAbstract<Event, EventParam>, IOpcUaClient
     {
         private static readonly object Lock = new object();  //锁
         private static List<OpcUaClientOperate> ThisObjList = new List<OpcUaClientOperate>(); //自身对象集合
@@ -691,8 +691,8 @@ namespace YSAI.Opc.ua.client
             ThisObjList.Remove(this);
         }
 
-        public override string LogHead => "[ OpcUaClientOperate 操作 ]";
-        public override string ClassName => "OpcUaClientOperate";
+        protected override string LogHead => "[ OpcUaClientOperate 操作 ]";
+        protected override string ClassName => "OpcUaClientOperate";
 
         public Task<OperateResult> AddSubscribeAsync(ConcurrentDictionary<string, List<AddressDetails>> param, byte Priority = 100)
         {

+ 3 - 3
src/YSAI.DAQ/YSAI.Opc/ua/service/OpcUaServiceOperate.cs

@@ -16,7 +16,7 @@ namespace YSAI.Opc.ua.service
     /// <summary>
     /// OPCUA 服务端
     /// </summary>
-    public class OpcUaServiceOperate: IBase<Event>, IOpcUaService
+    public sealed class OpcUaServiceOperate: IBaseAbstract<Event>, IOpcUaService
     {
         private static readonly object Lock = new object();  //锁
         private static List<OpcUaServiceOperate> ThisObjList = new List<OpcUaServiceOperate>(); //自身对象集合
@@ -204,8 +204,8 @@ namespace YSAI.Opc.ua.service
             ThisObjList.Remove(this);
         }
 
-        public override string LogHead => "[ OpcUaServiceOperate 操作 ]";
-        public override string ClassName => "OpcUaServiceOperate";
+        protected override string LogHead => "[ OpcUaServiceOperate 操作 ]";
+        protected override string ClassName => "OpcUaServiceOperate";
 
         public Task<OperateResult> OnAsync()
         {

+ 3 - 3
src/YSAI.DAQ/YSAI.RabbitMQ/RabbitMQConsumerOperate.cs

@@ -17,10 +17,10 @@ namespace YSAI.RabbitMQ
     /// <summary>
     /// 消费者操作
     /// </summary>
-    public class RabbitMQConsumerOperate : IBase<RabbitMQData.Event>, IRabbitMQConsumer
+    public sealed class RabbitMQConsumerOperate : IBaseAbstract<RabbitMQData.Event>, IRabbitMQConsumer
     {
-        public override string LogHead => "[ RabbitMQConsumerOperate 操作 ]";
-        public override string ClassName => "RabbitMQConsumerOperate";
+        protected override string LogHead => "[ RabbitMQConsumerOperate 操作 ]";
+        protected override string ClassName => "RabbitMQConsumerOperate";
 
         private static readonly object Lock = new object();  //锁
         private static List<RabbitMQConsumerOperate> ThisObjList = new List<RabbitMQConsumerOperate>(); //自身对象集合

+ 1 - 1
src/YSAI.DAQ/YSAI.RabbitMQ/RabbitMQData.cs

@@ -21,7 +21,7 @@ namespace YSAI.RabbitMQ
             /// 唯一标识符
             /// </summary>
             [Description("唯一标识符")]
-            public string? SN { get; set; }
+            public string? SN { get; set; } = Guid.NewGuid().ToString();
             /// <summary>
             /// 交换机名称
             /// </summary>

+ 3 - 3
src/YSAI.DAQ/YSAI.RabbitMQ/RabbitMQPublisherOperate.cs

@@ -16,10 +16,10 @@ namespace YSAI.RabbitMQ
     /// <summary>
     /// 发布者操作
     /// </summary>
-    public class RabbitMQPublisherOperate : IBase, IRabbitMQPublisher
+    public sealed class RabbitMQPublisherOperate : IBaseAbstract, IRabbitMQPublisher
     {
-        public override string LogHead => "[ RabbitMQPublisherOperate 操作 ]";
-        public override string ClassName => "RabbitMQPublisherOperate";
+        protected override string LogHead => "[ RabbitMQPublisherOperate 操作 ]";
+        protected override string ClassName => "RabbitMQPublisherOperate";
 
         private static readonly object Lock = new object();  //锁
         private static List<RabbitMQPublisherOperate> ThisObjList = new List<RabbitMQPublisherOperate>(); //自身对象集合

+ 1 - 2
src/YSAI.DAQ/YSAI.RabbitMQ/YSAI.RabbitMQ.csproj

@@ -1,10 +1,9 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
-	  <GenerateDocumentationFile>True</GenerateDocumentationFile>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 1
src/YSAI.DAQ/YSAI.Redis/RedisOperate.cs

@@ -6,7 +6,7 @@ using System.Text;
 
 namespace YSAI.Redis
 {
-    public class RedisOperate:IDisposable
+    public sealed class RedisOperate:IDisposable
     {
         private static readonly object Lock = new object();  //锁
         private static List<RedisOperate> ThisObjList = new List<RedisOperate>(); //自身对象集合

+ 1 - 2
src/YSAI.DAQ/YSAI.Redis/YSAI.Redis.csproj

@@ -1,10 +1,9 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
-	  <GenerateDocumentationFile>True</GenerateDocumentationFile>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 2
src/YSAI.DAQ/YSAI.S7/YSAI.S7.csproj

@@ -1,10 +1,9 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
-	  <GenerateDocumentationFile>True</GenerateDocumentationFile>
   </PropertyGroup>
 
   <ItemGroup>

+ 3 - 3
src/YSAI.DAQ/YSAI.S7/client/S7ClientOperate.cs

@@ -14,7 +14,7 @@ namespace YSAI.S7.client
     /// <summary>
     /// s7操作
     /// </summary>
-    public class S7ClientOperate : IBase, IS7Client
+    public sealed class S7ClientOperate : IBaseAbstract, IS7Client
     {
         private static readonly object Lock = new object();  //锁
         private static List<S7ClientOperate> ThisObjList = new List<S7ClientOperate>(); //自身对象集合
@@ -72,8 +72,8 @@ namespace YSAI.S7.client
             GC.Collect();
             ThisObjList.Remove(this);
         }
-        public override string LogHead => "[ S7Operate 操作 ]";
-        public override string ClassName => "S7Operate";
+        protected override string LogHead => "[ S7Operate 操作 ]";
+        protected override string ClassName => "S7Operate";
         public Task<OperateResult> OnAsync()
         {
             return Task.Run(() => On());

+ 124 - 0
src/YSAI.DAQ/YSAI.Test/TestAll.cs

@@ -14,6 +14,8 @@ using YSAI.Modbus.client;
 using YSAI.Opc.ua.service;
 using YSAI.Mqtt.service.websocket;
 using YSAI.Modbus.service;
+using YSAI.Kafka;
+using YSAI.RabbitMQ;
 
 namespace YSAI.Test
 {
@@ -431,5 +433,127 @@ namespace YSAI.Test
             Console.ForegroundColor = ConsoleColor.Green;
             Console.WriteLine(e.Message);
         }
+
+
+
+        [TestMethod]
+        public void ´´½¨·´ÉäÅäÖÃ()
+        {
+            //´´½¨ÅäÖÃ
+            Basics basics = new Basics()
+            {
+                DllDatas = new List<Basics.DllData>()
+                {
+                    new Basics.DllData()
+                    {
+                        DllPath="YSAI.Mqtt.dll",
+                        IsAbsolutePath=false,
+                        NamespaceDatas=new List<Basics.DllData.NamespaceData>()
+                        {
+                            new Basics.DllData.NamespaceData()
+                            {
+                                Namespace="YSAI.Mqtt.client",
+                                ClassDatas=new List<Basics.DllData.NamespaceData.ClassData>()
+                                {
+                                    new Basics.DllData.NamespaceData.ClassData()
+                                    {
+                                        ClassName="MqttClientOperate",
+                                        ConstructorParam=new object[]{ new MqttClientData.Basics { QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce, ServerIPAddress = "127.0.0.1", ServerLoginID = "ysai", ServerLoginPassword = "ysai", ServerPort = 11819, SN = "YSAI" } },
+                                        SN="YSAI.Mqtt.MqttClientOperate[Instance]",
+                                        MethodDatas=new List<Basics.DllData.NamespaceData.ClassData.MethodData>()
+                                        {
+                                            new Basics.DllData.NamespaceData.ClassData.MethodData()
+                                            {
+                                                MethodName="Init",
+                                                SN="[Init]",
+                                                WhetherExecute=true
+                                            },
+                                            new Basics.DllData.NamespaceData.ClassData.MethodData()
+                                            {
+                                                MethodName="On",
+                                                SN="[On]",
+                                                WhetherExecute=true
+                                            },
+                                            new Basics.DllData.NamespaceData.ClassData.MethodData()
+                                            {
+                                                MethodName="PublishSubscribe",
+                                                SN="[PublishSubscribe]"
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    },
+                    new Basics.DllData()
+                    {
+                        DllPath="YSAI.Kafka.dll",
+                        IsAbsolutePath=false,
+                        NamespaceDatas=new List<Basics.DllData.NamespaceData>()
+                        {
+                            new Basics.DllData.NamespaceData()
+                            {
+                                Namespace="YSAI.Kafka",
+                                ClassDatas=new List<Basics.DllData.NamespaceData.ClassData>()
+                                {
+                                    new Basics.DllData.NamespaceData.ClassData()
+                                    {
+                                        ClassName="KafkaProducerOperate",
+                                        ConstructorParam=new object[]{ new KafkaProducerData.Basics { BootstrapServers = "127.0.0.1:8083", ClientId = "ysai", SN = "YSAI" } },
+                                        SN="YSAI.Kafka.KafkaProducerOperate[Instance]",
+                                        MethodDatas=new List<Basics.DllData.NamespaceData.ClassData.MethodData>()
+                                        {
+                                            new Basics.DllData.NamespaceData.ClassData.MethodData()
+                                            {
+                                                MethodName="On",
+                                                SN="[On]",
+                                                WhetherExecute=true
+                                            },
+                                            new Basics.DllData.NamespaceData.ClassData.MethodData()
+                                            {
+                                                MethodName="Produce",
+                                                SN="[Produce]"
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    },
+                    new Basics.DllData()
+                    {
+                        DllPath="YSAI.RabbitMQ.dll",
+                        IsAbsolutePath=false,
+                        NamespaceDatas=new List<Basics.DllData.NamespaceData>()
+                        {
+                            new Basics.DllData.NamespaceData()
+                            {
+                                Namespace="YSAI.RabbitMQ",
+                                ClassDatas=new List<Basics.DllData.NamespaceData.ClassData>()
+                                {
+                                    new Basics.DllData.NamespaceData.ClassData()
+                                    {
+                                        ClassName="RabbitMQPublisherOperate",
+                                        ConstructorParam=new object[]{ new RabbitMQData.Basics { ExChangeName = "exYSAI", HostName = "localhost", UserName = "ysai", Password = "ysai", Port = 4369, SN = "YSAI" } },
+                                        SN="YSAI.Kafka.RabbitMQPublisherOperate[Instance]",
+                                        MethodDatas=new List<Basics.DllData.NamespaceData.ClassData.MethodData>()
+                                        {
+                                            new Basics.DllData.NamespaceData.ClassData.MethodData()
+                                            {
+                                                MethodName="Produce",
+                                                SN="[Produce]"
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            };
+
+
+            FileTool.StringToFile(ReflectionOperate.ConfigFile, JsonTool.JsonEntityToString(basics).JsonFormatting());
+        }
     }
 }

+ 1 - 0
src/YSAI.DAQ/YSAI.Test/YSAI.Test.csproj

@@ -27,6 +27,7 @@
     <ProjectReference Include="..\YSAI.Modbus\YSAI.Modbus.csproj" />
     <ProjectReference Include="..\YSAI.Mqtt\YSAI.Mqtt.csproj" />
     <ProjectReference Include="..\YSAI.Opc\YSAI.Opc.csproj" />
+    <ProjectReference Include="..\YSAI.RabbitMQ\YSAI.RabbitMQ.csproj" />
     <ProjectReference Include="..\YSAI.Redis\YSAI.Redis.csproj" />
     <ProjectReference Include="..\YSAI.S7\YSAI.S7.csproj" />
   </ItemGroup>

+ 135 - 2
src/YSAI.DAQ/YSAI.TestConsole/Program.cs

@@ -3,12 +3,19 @@ using System.Collections.Concurrent;
 using System.Drawing;
 using System.Reflection;
 using YSAI.Core.data;
+using YSAI.Core.reflection;
+using YSAI.Core.subscription;
 using YSAI.DB;
+using YSAI.Kafka;
 using YSAI.Log;
+using YSAI.Mqtt.client;
+using YSAI.Mqtt.service.websocket;
 using YSAI.Opc.ua.client;
 using YSAI.Opc.ua.service;
+using YSAI.RabbitMQ;
 using YSAI.Unility;
-
+using static YSAI.Core.reflection.ReflectionData;
+using static YSAI.Core.reflection.ReflectionData.Basics.DllData.NamespaceData;
 namespace YSAI.TestConsole
 {
     internal class Program
@@ -16,8 +23,134 @@ namespace YSAI.TestConsole
         static void Main(string[] args)
         {
 
+            //创建配置
+            Basics basics = new Basics()
+            {
+                DllDatas = new List<Basics.DllData>()
+                {
+                    new Basics.DllData()
+                    {
+                        DllPath="YSAI.Mqtt.dll",
+                        IsAbsolutePath=false,
+                        NamespaceDatas=new List<Basics.DllData.NamespaceData>()
+                        {
+                            new Basics.DllData.NamespaceData()
+                            {
+                                Namespace="YSAI.Mqtt.client",
+                                ClassDatas=new List<Basics.DllData.NamespaceData.ClassData>()
+                                {
+                                    new Basics.DllData.NamespaceData.ClassData()
+                                    {
+                                        ClassName="MqttClientOperate",
+                                        ConstructorParam=new object[]{ new MqttClientData.Basics { QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce, ServerIPAddress = "127.0.0.1", ServerLoginID = "ysai", ServerLoginPassword = "ysai", ServerPort = 11819, SN = "YSAI" } },
+                                        SN="YSAI.Mqtt.MqttClientOperate[Instance]",
+                                        MethodDatas=new List<Basics.DllData.NamespaceData.ClassData.MethodData>()
+                                        {
+                                            new Basics.DllData.NamespaceData.ClassData.MethodData()
+                                            {
+                                                MethodName="Init",
+                                                SN="[Init]",
+                                                WhetherExecute=true
+                                            },
+                                            new Basics.DllData.NamespaceData.ClassData.MethodData()
+                                            {
+                                                MethodName="On",
+                                                SN="[On]",
+                                                WhetherExecute=true
+                                            },
+                                            new Basics.DllData.NamespaceData.ClassData.MethodData()
+                                            {
+                                                MethodName="PublishSubscribe",
+                                                SN="[PublishSubscribe]"
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    },
+                    new Basics.DllData()
+                    {
+                        DllPath="YSAI.Kafka.dll",
+                        IsAbsolutePath=false,
+                        NamespaceDatas=new List<Basics.DllData.NamespaceData>()
+                        {
+                            new Basics.DllData.NamespaceData()
+                            {
+                                Namespace="YSAI.Kafka",
+                                ClassDatas=new List<Basics.DllData.NamespaceData.ClassData>()
+                                {
+                                    new Basics.DllData.NamespaceData.ClassData()
+                                    {
+                                        ClassName="KafkaProducerOperate",
+                                        ConstructorParam=new object[]{ new KafkaProducerData.Basics { BootstrapServers = "127.0.0.1:8083", ClientId = "ysai", SN = "YSAI" } },
+                                        SN="YSAI.Kafka.KafkaProducerOperate[Instance]",
+                                        MethodDatas=new List<Basics.DllData.NamespaceData.ClassData.MethodData>()
+                                        {
+                                            new Basics.DllData.NamespaceData.ClassData.MethodData()
+                                            {
+                                                MethodName="Produce",
+                                                SN="[Produce]"
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    },
+                    new Basics.DllData()
+                    {
+                        DllPath="YSAI.RabbitMQ.dll",
+                        IsAbsolutePath=false,
+                        NamespaceDatas=new List<Basics.DllData.NamespaceData>()
+                        {
+                            new Basics.DllData.NamespaceData()
+                            {
+                                Namespace="YSAI.RabbitMQ",
+                                ClassDatas=new List<Basics.DllData.NamespaceData.ClassData>()
+                                {
+                                    new Basics.DllData.NamespaceData.ClassData()
+                                    {
+                                        ClassName="RabbitMQPublisherOperate",
+                                        ConstructorParam=new object[]{ new RabbitMQData.Basics { ExChangeName = "exYSAI", HostName = "localhost", UserName = "ysai", Password = "ysai", Port = 4369, SN = "YSAI" } },
+                                        SN="YSAI.RabbitMQ.RabbitMQPublisherOperate[Instance]",
+                                        MethodDatas=new List<Basics.DllData.NamespaceData.ClassData.MethodData>()
+                                        {
+                                            new Basics.DllData.NamespaceData.ClassData.MethodData()
+                                            {
+                                                MethodName="On",
+                                                SN="[On]",
+                                                WhetherExecute=true
+                                            },
+                                            new Basics.DllData.NamespaceData.ClassData.MethodData()
+                                            {
+                                                MethodName="Publish",
+                                                SN="[Publish]"
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            };
+
+
+            FileTool.StringToFile(ReflectionOperate.ConfigFile, JsonTool.JsonEntityToString(basics).JsonFormatting());
+
+
+            using (ReflectionOperate reflectOperate = ReflectionOperate.Instance())
+            {
+
+                OperateResult operateResult= reflectOperate.ExecuteMethod("YSAI.Kafka.KafkaProducerOperate[Instance][Produce]",new object[] {"牛逼",string.Empty,"卧槽" }) as OperateResult;
+            }
+
+
+
+
 
-            while (true)
+                while (true)
             {
                 Console.ReadKey();
             }

+ 2 - 2
src/YSAI.DAQ/YSAI.Unility/JsonTool.cs

@@ -12,7 +12,7 @@ namespace YSAI.Unility
     /// <summary>
     /// Json 处理
     /// </summary>
-    public class JsonTool
+    public static class JsonTool
     {
         /// <summary>
         /// JSON实体转string
@@ -80,7 +80,7 @@ namespace YSAI.Unility
         /// </summary>
         /// <param name="str">Json 数据</param>
         /// <returns></returns>
-        public static string ConvertJsonString(string str)
+        public static string JsonFormatting(this string str)
         {
             //格式化json字符串
             JsonSerializer serializer = new JsonSerializer();

+ 0 - 527
src/YSAI.DAQ/YSAI.Unility/PlcDataParseTool.cs

@@ -1,527 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using static YSAI.Unility.PlcDataParseTool._ACFA;
-
-namespace YSAI.Unility
-{
-    /// <summary>
-    /// PLC数据解析工具
-    /// </summary>
-    public class PlcDataParseTool
-    {
-        ///// <summary>
-        ///// 获取消息
-        ///// </summary>
-        //public class Message
-        //{
-        //    public Message()
-        //    {
-        //        if (messageBodies == null)
-        //        {
-        //            messageBodies = JsonTool.StringToJsonEntity<List<MessageBody>>(File.ReadAllText("config//message.json"));
-        //        }
-        //    }
-        //    public string GetMessage(string id)
-        //    {
-        //        if (messageBodies == null)
-        //        {
-        //            messageBodies = JsonTool.StringToJsonEntity<List<MessageBody>>(File.ReadAllText("config//message.json"));
-        //        }
-        //        MessageBody messageBody = messageBodies.Find(c => c.id.Equals(id));
-        //        if (messageBody == null)
-        //        {
-        //            return string.Empty;
-        //        }
-        //        else
-        //        {
-        //            return messageBody.message;
-        //        }
-        //    }
-        //    public List<MessageBody> messageBodies;
-        //    public class MessageBody
-        //    {
-        //        public string id { get; set; }
-        //        public string message { get; set; }
-        //    }
-        //}
-
-
-
-        /// <summary>
-        /// 当前报警消息
-        /// </summary>
-        public class _ACFA
-        {
-            public string 消息数量 { get; set; }
-            public List<dataarr> 消息详情 { get; set; }
-            public class dataarr
-            {
-                public string 消息编号 { get; set; }
-                public string 文本编号 { get; set; }
-                public string 优先级 { get; set; }
-                public string 消息状态 { get; set; }
-            }
-        }
-        /// <summary>
-        /// 当前报警消息
-        /// </summary>
-        /// <param name="data">原始数据</param>
-        /// <returns></returns>
-        public static string ACFA(string data)
-        {
-            //实例化消息类
-            _ACFA message = new _ACFA();
-            //实例化集合对象
-            if (message.消息详情 == null)
-            {
-                message.消息详情 = new List<_ACFA.dataarr>();
-            }
-            //移除两侧大括号
-            data = data.Replace("{", "").Replace("}", "");
-            //转换成字节数据
-            byte[] bytes = ByteTool.StrByteToBytes(data);
-            //获取消息条数
-            int MessageCount = ByteTool.ByteToInt(new byte[] { bytes[70], bytes[71], bytes[72], bytes[73] });
-            //赋值
-            message.消息数量 = MessageCount.ToString();
-            //掐头去尾
-            bytes = ByteTool.BytesDispose(bytes, 74, 0);
-            //得到所需数据(16位16位分割)
-            List<byte[]> bytearr = ByteTool.ByteListSegmentation(bytes, 16);
-            //循环检索
-            foreach (byte[] b in bytearr)
-            {
-                //详情对象
-                _ACFA.dataarr dataarr = new _ACFA.dataarr();
-                //在进行4位4位分割
-                List<byte[]> bytearr2 = ByteTool.ByteListSegmentation(b, 4);
-                for (int i = 0; i < bytearr2.Count; i++)
-                {
-                    switch (i)
-                    {
-                        case 0:   //消息编号
-                            byte[] byte1 = ByteTool.BytesDispose(bytearr2[i], 0, 0);
-                            dataarr.消息编号 = $"{ByteTool.ByteToInt(byte1[3])}.{ByteTool.ByteToInt(byte1[2])}.{ByteTool.ByteToInt(new byte[] { byte1[0], byte1[1] })}";
-                            break;
-                        case 1: //文本ID编号
-                            byte[] byte2 = ByteTool.BytesDispose(bytearr2[i], 0, 0);
-                            dataarr.文本编号 = $"{ByteTool.ByteToInt(byte2[3])}.{ByteTool.ByteToInt(byte2[2])}.{ByteTool.ByteToInt(new byte[] { byte2[0], byte2[1] })}";
-                            break;
-                        case 2:  //优先级
-                            dataarr.优先级 = ByteTool.ByteToInt(bytearr2[i]).ToString();
-                            break;
-                        case 3: //消息状态
-                            dataarr.消息状态 = ByteTool.ByteToInt(bytearr2[i]).ToString();
-                            break;
-                    }
-                }
-                //添加至消息集合
-                message.消息详情.Add(dataarr);
-                if (message.消息详情.Count.Equals(MessageCount))
-                {
-                    break;
-                }
-            }
-            //直接返回转换好的JSON数据
-            return JsonTool.JsonEntityToString(message);
-        }
-
-        /// <summary>
-        /// 当前停机消息
-        /// </summary>
-        public class _ACDI
-        {
-            public string 消息编号 { get; set; }
-            public string 文本编号 { get; set; }
-            public string 优先级 { get; set; }
-        }
-        /// <summary>
-        /// 当前停机消息
-        /// </summary>
-        /// <param name="data">原始数据</param>
-        /// <returns></returns>
-        public static string ACDI(string data)
-        {
-            try
-            {
-                //实例化消息类
-                _ACDI message = new _ACDI();
-                //移除两侧大括号
-                data = data.Replace("{", "").Replace("}", "");
-                //转换成字节数据
-                byte[] bytes = ByteTool.StrByteToBytes(data);
-                //掐头去尾
-                bytes = ByteTool.BytesDispose(bytes, 70, 0);
-                //得到所需数据(4位4位分割)
-                List<byte[]> bytearr = ByteTool.ByteListSegmentation(bytes, 4);
-                //循环检索
-                for (int i = 0; i < bytearr.Count; i++)
-                {
-                    switch (i)
-                    {
-                        case 0:   //消息编号
-                            byte[] byte1 = ByteTool.BytesDispose(bytearr[i], 0, 0);
-                            message.消息编号 = $"{ByteTool.ByteToInt(byte1[3])}.{ByteTool.ByteToInt(byte1[2])}.{ByteTool.ByteToInt(new byte[] { byte1[0], byte1[1] })}";
-                            break;
-                        case 1: //文本ID编号
-                            byte[] byte2 = ByteTool.BytesDispose(bytearr[i], 0, 0);
-                            message.文本编号 = $"{ByteTool.ByteToInt(byte2[3])}.{ByteTool.ByteToInt(byte2[2])}.{ByteTool.ByteToInt(new byte[] { byte2[0], byte2[1] })}";
-                            break;
-                        case 2:  //优先级
-                            message.优先级 = ByteTool.ByteToInt(bytearr[i]).ToString();
-                            break;
-                    }
-
-                }
-                //直接返回转换好的JSON数据
-                return JsonTool.JsonEntityToString(message);
-            }
-            catch (Exception)
-            {
-                return null;
-            }
-        }
-
-        /// <summary>
-        /// 当前停机分析
-        /// </summary>
-        public class _SANA
-        {
-            public string 消息数量 { get; set; }
-            public List<dataarr> 消息详情 { get; set; }
-            public class dataarr
-            {
-                public string 消息编号 { get; set; }
-                public string 文本编号 { get; set; }
-                public string 停机次数 { get; set; }
-                public string 停机类型 { get; set; }
-                public string 停机时长 { get; set; }
-            }
-        }
-        /// <summary>
-        /// 当前停机分析
-        /// </summary>
-        /// <param name="data">原始数据</param>
-        /// <returns></returns>
-        public static string SANA(string data)
-        {
-            //实例化消息类
-            _SANA message = new _SANA();
-            //实例化集合对象
-            if (message.消息详情 == null)
-            {
-                message.消息详情 = new List<_SANA.dataarr>();
-            }
-            //移除两侧大括号
-            data = data.Replace("{", "").Replace("}", "");
-            //转换成字节数据
-            byte[] bytes = ByteTool.StrByteToBytes(data);
-            //获取消息条数
-            int MessageCount = ByteTool.ByteToInt(new byte[] { bytes[70], bytes[71], bytes[72], bytes[73] });
-            //赋值
-            message.消息数量 = MessageCount.ToString();
-            //掐头去尾
-            bytes = ByteTool.BytesDispose(bytes, 74, 0);
-            //得到所需数据(16位16位分割)
-            List<byte[]> bytearr = ByteTool.ByteListSegmentation(bytes, 20);
-            //循环检索
-            foreach (byte[] b in bytearr)
-            {
-                //详情对象
-                _SANA.dataarr dataarr = new _SANA.dataarr();
-                //在进行4位4位分割
-                List<byte[]> bytearr2 = ByteTool.ByteListSegmentation(b, 4);
-                for (int i = 0; i < bytearr2.Count; i++)
-                {
-                    switch (i)
-                    {
-                        case 0:   //消息编号
-                            byte[] byte1 = ByteTool.BytesDispose(bytearr2[i], 0, 0);
-                            dataarr.消息编号 = $"{ByteTool.ByteToInt(byte1[3])}.{ByteTool.ByteToInt(byte1[2])}.{ByteTool.ByteToInt(new byte[] { byte1[0], byte1[1] })}";
-                            break;
-                        case 1: //文本编号
-                            byte[] byte2 = ByteTool.BytesDispose(bytearr2[i], 0, 0);
-                            dataarr.文本编号 = $"{ByteTool.ByteToInt(byte2[3])}.{ByteTool.ByteToInt(byte2[2])}.{ByteTool.ByteToInt(new byte[] { byte2[0], byte2[1] })}";
-                            break;
-                        case 2:  //停机次数
-                            dataarr.停机次数 = ByteTool.ByteToInt(bytearr2[i]).ToString();
-                            break;
-                        case 3: //停机类型
-                            dataarr.停机类型 = ByteTool.ByteToInt(bytearr2[i]).ToString();
-                            break;
-                        case 4: //停机时长
-                            dataarr.停机时长 = ByteTool.ByteToInt(bytearr2[i]).ToString();
-                            break;
-                    }
-                }
-                //添加至消息集合
-                message.消息详情.Add(dataarr);
-                if (message.消息详情.Count.Equals(MessageCount))
-                {
-                    break;
-                }
-            }
-            //直接返回转换好的JSON数据
-            return JsonTool.JsonEntityToString(message);
-        }
-
-        /// <summary>
-        /// 停机流水原因
-        /// </summary>
-        public class _SHIS
-        {
-            public string 消息数量 { get; set; }
-            public List<dataarr> 消息详情 { get; set; }
-            public class dataarr
-            {
-                public string 通过分析记录 { get; set; }
-                public string 消息编号 { get; set; }
-                public string 文本编号 { get; set; }
-                public string 开始时间 { get; set; }
-                public string 结束时间 { get; set; }
-                public string 停机时长 { get; set; }
-                public string 停机编号 { get; set; }
-                public string 详情开始时间 { get; set; }  
-                public string 详情结束时间 { get; set; }
-            }
-        }
-        /// <summary>
-        /// 历史停机原因
-        /// </summary>
-        /// <param name="data">原始数据</param>
-        /// <returns></returns>
-        public static string SHIS(string data)
-        {
-            //实例化消息类
-            _SHIS message = new _SHIS();
-            //实例化集合对象
-            if (message.消息详情 == null)
-            {
-                message.消息详情 = new List<_SHIS.dataarr>();
-            }
-            //移除两侧大括号
-            data = data.Replace("{", "").Replace("}", "");
-            //转换成字节数据
-            byte[] bytes = ByteTool.StrByteToBytes(data);
-            //获取消息条数
-            int MessageCount = ByteTool.ByteToInt(new byte[] { bytes[70], bytes[71], bytes[72], bytes[73] });
-            //赋值
-            message.消息数量 = MessageCount.ToString();
-            //掐头去尾
-            bytes = ByteTool.BytesDispose(bytes, 74, 0);
-            //得到所需数据(16位16位分割)
-            List<byte[]> bytearr = ByteTool.ByteListSegmentation(bytes, 42);
-            //时间
-            DateTime dt;
-            int ri;
-            int yue;
-            int nian;
-            int shi;
-            int fen;
-            int miao;
-
-            //循环检索
-            foreach (byte[] b in bytearr)
-            {
-                //详情对象
-                _SHIS.dataarr dataarr = new _SHIS.dataarr();
-                //在进行4位4位分割
-                List<byte[]> bytearr2 = ByteTool.ByteListSegmentation(b, 4);
-                for (int i = 0; i < bytearr2.Count; i++)
-                {
-                    switch (i)
-                    {
-                        case 0:
-                            dataarr.通过分析记录 = ByteTool.ByteToInt(bytearr2[i]).ToString();
-                            break;
-                        case 1:   //消息编号
-                            byte[] byte1 = ByteTool.BytesDispose(bytearr2[i], 0, 0);
-                            dataarr.消息编号 = $"{ByteTool.ByteToInt(byte1[3])}.{ByteTool.ByteToInt(byte1[2])}.{ByteTool.ByteToInt(new byte[] { byte1[0], byte1[1] })}";
-                            break;
-                        case 2: //文本编号
-                            byte[] byte2 = ByteTool.BytesDispose(bytearr2[i], 0, 0);
-                            dataarr.文本编号 = $"{ByteTool.ByteToInt(byte2[3])}.{ByteTool.ByteToInt(byte2[2])}.{ByteTool.ByteToInt(new byte[] { byte2[0], byte2[1] })}";
-                            break;
-                        case 3:
-                            dt = DateTime.Parse("1970-01-01 00:00:00").AddSeconds(ByteTool.ByteToInt(bytearr2[i]));
-                            dt = dt.AddSeconds(8 * 60 * 60);
-                            dataarr.开始时间 = dt.ToString("yyyy-MM-dd HH:mm:ss");
-                            break;
-                        case 4:
-                            dt = DateTime.Parse("1970-01-01 00:00:00").AddSeconds(ByteTool.ByteToInt(bytearr2[i]));
-                            dt = dt.AddSeconds(8 * 60 * 60);
-                            dataarr.结束时间 = dt.ToString("yyyy-MM-dd HH:mm:ss");
-                            break;
-                        case 5:
-                            dataarr.停机时长 = ByteTool.ByteToInt(bytearr2[i]).ToString();
-                            break;
-                        case 6:
-                            dataarr.停机编号 = ByteTool.ByteToInt(bytearr2[i]).ToString();
-                            break;
-                        case 7:
-                            ri = ByteTool.ByteToInt((byte)Int32.Parse(b[28].ToString(), System.Globalization.NumberStyles.HexNumber));
-                            yue = ByteTool.ByteToInt((byte)Int32.Parse(b[29].ToString(), System.Globalization.NumberStyles.HexNumber));
-                            nian = ByteTool.ByteToInt(new byte[] { b[30], b[31] });
-                            shi = ByteTool.ByteToInt(b[32]);
-                            fen = ByteTool.ByteToInt(b[33]);
-                            miao = ByteTool.ByteToInt(b[34]);
-                            dataarr.详情开始时间 = $"{nian}-{yue}-{ri} {shi}:{fen}:{miao}";
-                            break;
-                        case 8:
-                            ri = ByteTool.ByteToInt((byte)Int32.Parse(b[35].ToString(), System.Globalization.NumberStyles.HexNumber));
-                            yue = ByteTool.ByteToInt((byte)Int32.Parse(b[36].ToString(), System.Globalization.NumberStyles.HexNumber));
-                            nian = ByteTool.ByteToInt(new byte[] { b[37], b[38] });
-                            shi = ByteTool.ByteToInt(b[39]);
-                            fen = ByteTool.ByteToInt(b[40]);
-                            miao = ByteTool.ByteToInt(b[41]);
-                            dataarr.详情结束时间 = $"{nian}-{yue}-{ri} {shi}:{fen}:{miao}";
-                            break;
-                    }
-                }
-                //添加至消息集合
-                message.消息详情.Add(dataarr);
-                if (message.消息详情.Count.Equals(MessageCount))
-                {
-                    break;
-                }
-            }
-            //直接返回转换好的JSON数据
-            return JsonTool.JsonEntityToString(message);
-        }
-
-        /// <summary>
-        /// 班次
-        /// </summary>
-        public class _SHFT
-        {
-            public List<dataarr> 班次 { get; set; }
-            public class dataarr
-            {
-                public string 星期 { get; set; }
-                public string 第一班时间 { get; set; }
-                public string 第二班时间 { get; set; }
-                public string 第三班时间 { get; set; }
-                public string 第四班时间 { get; set; }
-            }
-        }
-        /// <summary>
-        /// 班次
-        /// </summary>
-        /// <param name="data">原始数据</param>
-        /// <returns></returns>
-        public static string SHFT(string data)
-        {
-            //实例化消息类
-            _SHFT message = new _SHFT();
-            //实例化集合对象
-            if (message.班次 == null)
-            {
-                message.班次 = new List<_SHFT.dataarr>();
-            }
-            //移除两侧大括号
-            data = data.Replace("{", "").Replace("}", "");
-            //转换成字节数据
-            byte[] bytes = ByteTool.StrByteToBytes(data);
-            //掐头去尾
-            bytes = ByteTool.BytesDispose(bytes, 297, 0);
-            //得到所需数据(16位16位分割)
-            List<byte[]> bytearr = ByteTool.ByteListSegmentation(bytes, 32);
-            List<byte[]> bytearr3;
-            int index1;
-            int index2;
-            string[] Day = new string[] { "7", "1", "2", "3", "4", "5", "6" };
-            string week = Day[Convert.ToInt32(DateTime.Now.DayOfWeek.ToString("d"))].ToString();
-            int xq =int.Parse(week);
-            //循环检索
-            foreach (byte[] b in bytearr)
-            {
-                //详情对象
-                _SHFT.dataarr dataarr = new _SHFT.dataarr();
-                //在进行4位4位分割
-                List<byte[]> bytearr2 = ByteTool.ByteListSegmentation(b, 8);
-                for (int i = 0; i < bytearr2.Count; i++)
-                {
-                   
-                    switch (i)
-                    {
-                        case 0:
-                            bytearr3 = ByteTool.ByteListSegmentation(bytearr2[i], 4);
-                            index1 = ByteTool.ByteToInt(bytearr3[0]);
-                            index2 = ByteTool.ByteToInt(bytearr3[1]);
-                            dataarr.第一班时间 = $"{SecondToHour(index1)}  -  {SecondToHour(index2)} 点";
-                            break;
-                        case 1:
-                            bytearr3 = ByteTool.ByteListSegmentation(bytearr2[i], 4);
-                            index1 = ByteTool.ByteToInt(bytearr3[0]);
-                            index2 = ByteTool.ByteToInt(bytearr3[1]);
-                            dataarr.第二班时间 = $"{SecondToHour(index1)}  -  {SecondToHour(index2)} 点";
-                            break;
-                        case 2:
-                            bytearr3 = ByteTool.ByteListSegmentation(bytearr2[i], 4);
-                            index1 = ByteTool.ByteToInt(bytearr3[0]);
-                            index2 = ByteTool.ByteToInt(bytearr3[1]);
-                            dataarr.第三班时间 = $"{SecondToHour(index1)} - {SecondToHour(index2)} 点";
-                            break;
-                        case 3:
-                            bytearr3 = ByteTool.ByteListSegmentation(bytearr2[i], 4);
-                            index1 = ByteTool.ByteToInt(bytearr3[0]);
-                            index2 = ByteTool.ByteToInt(bytearr3[1]);
-                            dataarr.第四班时间 = $"{SecondToHour(index1)} - {SecondToHour(index2)} 点";
-                            break;
-                    }
-                   
-                }
-                if (xq > 7)
-                {
-                    xq = 1;
-                }
-                dataarr.星期 = xq++.ToString();
-                //添加至消息集合
-                message.班次.Add(dataarr);
-            }
-            //直接返回转换好的JSON数据
-            return JsonTool.JsonEntityToString(message);
-        }
-
-        /// <summary>
-        /// 秒转换小时
-        /// </summary>
-        /// <param name="time"></param>
-        /// <returns></returns>
-        private static string SecondToHour(double time)
-        {
-            int hour = 0;
-            int minute = 0;
-            int second = 0;
-            second = Convert.ToInt32(time);
-
-            if (second > 60)
-            {
-                minute = second / 60;
-                second = second % 60;
-            }
-            if (minute > 60)
-            {
-                hour = minute / 60;
-                minute = minute % 60;
-            }
-                return (hour % 24 ).ToString() ;
-        }
-
-        /// <summary>
-        /// 时间戳转日期(yyyy-MM-dd)
-        /// </summary>
-        /// <param name="param">数据</param>
-        /// <returns></returns>
-        public static string TimestampToDate(string param)
-        {
-            DateTime dateTime = DateTime.Parse("1970-01-01 00:00:00").AddSeconds(double.Parse(param));
-            return dateTime.ToString("yyyy-MM-dd");
-        }
-
-    }
-}

+ 5 - 1
src/YSAI.DAQ/YSAI.Unility/ReflexTool.cs

@@ -193,7 +193,11 @@ namespace YSAI.Unility
                     }
                     libInstanceParams.Add(libInstanceParam);
                 }
-                return libInstanceParams;
+                if (libInstanceParams.Count > 0)
+                {
+                    return libInstanceParams;
+                }
+                return null;
             }
             catch (Exception)
             {