lixun před 2 roky
rodič
revize
a1cf75b766

+ 43 - 0
src/YSAI.DAQ/YSAI.Core/enum/Enums.cs

@@ -160,16 +160,34 @@ namespace YSAI.Core.@enum
     /// </summary>
     public enum DaqType
     {
+        /// <summary>
+        /// 数据库采集
+        /// </summary>
         [Description("数据库采集")]
         DB,
+        /// <summary>
+        /// Modbus采集
+        /// </summary>
         [Description("Modbus采集")]
         Modbus,
+        /// <summary>
+        /// OpcUa采集
+        /// </summary>
         [Description("OpcUa采集")]
         OpcUa,
+        /// <summary>
+        /// OpcDa采集
+        /// </summary>
         [Description("OpcDa采集")]
         OpcDa,
+        /// <summary>
+        /// OpcDaHttp采集
+        /// </summary>
         [Description("OpcDaHttp采集")]
         OpcDaHttp,
+        /// <summary>
+        /// S7采集
+        /// </summary>
         [Description("S7采集")]
         S7
     }
@@ -178,11 +196,36 @@ namespace YSAI.Core.@enum
     /// </summary>
     public enum RelayType
     {
+        /// <summary>
+        /// Kafka转发
+        /// </summary>
         [Description("Kafka转发")]
         Kafka,
+        /// <summary>
+        /// Mqtt转发
+        /// </summary>
         [Description("Mqtt转发")]
         Mqtt,
+        /// <summary>
+        /// RabbitMQ转发
+        /// </summary>
         [Description("RabbitMQ转发")]
         RabbitMQ
     }
+    /// <summary>
+    /// 库类型
+    /// </summary>
+    public enum LibType
+    {
+        /// <summary>
+        /// 采集库
+        /// </summary>
+        [Description("采集库")]
+        Daq,
+        /// <summary>
+        /// 转发库
+        /// </summary>
+        [Description("转发库")]
+        Relay
+    }
 }

+ 87 - 10
src/YSAI.DAQ/YSAI.Core/interface/only/IManage.cs

@@ -6,6 +6,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using YSAI.Core.data;
+using YSAI.Core.@enum;
 
 namespace YSAI.Core.@interface.only
 {
@@ -18,27 +19,51 @@ namespace YSAI.Core.@interface.only
         /// 示例
         /// </summary>
         /// <returns>配置文件</returns>
-        Task<IActionResult> Sample();
+        IActionResult Sample();
+        /// <summary>
+        /// 示例
+        /// </summary>
+        /// <returns>配置文件</returns>
+        Task<IActionResult> SampleAsync();
 
         /// <summary>
         /// 设置配置
         /// </summary>
         /// <param name="ConfigFile">配置文件</param>
         /// <returns>统一出参</returns>
-        Task<OperateResult> Setting(IFormFile? ConfigFile);
+        OperateResult Setting(IFormFile? ConfigFile);
+        /// <summary>
+        /// 设置配置
+        /// </summary>
+        /// <param name="ConfigFile">配置文件</param>
+        /// <returns>统一出参</returns>
+        Task<OperateResult> SettingAsync(IFormFile? ConfigFile);
+
+        /// <summary>
+        /// 修改配置
+        /// </summary>
+        /// <param name="ConfigFile">配置文件</param>
+        /// <returns>统一出参</returns>
+        OperateResult Update(IFormFile? ConfigFile);
 
         /// <summary>
         /// 修改配置
         /// </summary>
         /// <param name="ConfigFile">配置文件</param>
         /// <returns>统一出参</returns>
-        Task<OperateResult> Update(IFormFile? ConfigFile);
+        Task<OperateResult> UpdateAsync(IFormFile? ConfigFile);
 
         /// <summary>
         /// 初始化
         /// </summary>
         /// <returns>统一出参</returns>
-        Task<OperateResult> Init();
+        OperateResult Init();
+
+        /// <summary>
+        /// 初始化
+        /// </summary>
+        /// <returns>统一出参</returns>
+        Task<OperateResult> InitAsync();
 
         /// <summary>
         /// 打开
@@ -46,7 +71,23 @@ namespace YSAI.Core.@interface.only
         /// <param name="Name">库名称</param>
         /// <param name="SN">库实例SN</param>
         /// <returns>统一返回结果</returns>
-        Task<OperateResult> On(string Name, string SN);
+        OperateResult On(string Name, string SN);
+
+        /// <summary>
+        /// 打开
+        /// </summary>
+        /// <param name="Name">库名称</param>
+        /// <param name="SN">库实例SN</param>
+        /// <returns>统一返回结果</returns>
+        Task<OperateResult> OnAsync(string Name, string SN);
+
+        /// <summary>
+        /// 关闭
+        /// </summary>
+        /// <param name="Name">库名称</param>
+        /// <param name="SN">库实例SN</param>
+        /// <returns>统一返回结果</returns>
+        OperateResult Off(string Name, string SN);
 
         /// <summary>
         /// 关闭
@@ -54,7 +95,7 @@ namespace YSAI.Core.@interface.only
         /// <param name="Name">库名称</param>
         /// <param name="SN">库实例SN</param>
         /// <returns>统一返回结果</returns>
-        Task<OperateResult> Off(string Name, string SN);
+        Task<OperateResult> OffAsync(string Name, string SN);
 
         /// <summary>
         /// 读取
@@ -63,7 +104,27 @@ namespace YSAI.Core.@interface.only
         /// <param name="SN">库实例SN</param> 
         /// <param name="AddressName">地址</param>
         /// <returns>统一返回结果</returns>
-        Task<OperateResult> Read(string Name, string SN, string AddressName);
+        OperateResult Read(string Name, string SN, string AddressName);
+
+        /// <summary>
+        /// 读取
+        /// </summary>
+        /// <param name="Name">库名称</param>
+        /// <param name="SN">库实例SN</param> 
+        /// <param name="AddressName">地址</param>
+        /// <returns>统一返回结果</returns>
+        Task<OperateResult> ReadAsync(string Name, string SN, string AddressName);
+
+        /// <summary>
+        /// 写入
+        /// </summary>
+        /// <param name="Name">库名称</param>
+        /// <param name="SN">库实例SN</param>
+        /// <param name="AddressName">地址</param>
+        /// <param name="Value">值</param>
+        /// <param name="DType">数据类型</param>
+        /// <returns>统一返回结果</returns>
+        OperateResult Write(string Name, string SN, string AddressName, string Value, DataType DType);
 
         /// <summary>
         /// 写入
@@ -72,8 +133,9 @@ namespace YSAI.Core.@interface.only
         /// <param name="SN">库实例SN</param>
         /// <param name="AddressName">地址</param>
         /// <param name="Value">值</param>
+        /// <param name="DType">数据类型</param>
         /// <returns>统一返回结果</returns>
-        Task<OperateResult> Write(string Name, string SN, string AddressName, string Value);
+        Task<OperateResult> WriteAsync(string Name, string SN, string AddressName, string Value, DataType DType);
 
     }
 
@@ -85,14 +147,29 @@ namespace YSAI.Core.@interface.only
         /// <summary>
         /// 获取数采库文件集合
         /// </summary>
+        /// <param name="LType">库类型</param>
         /// <returns>rData:库文件名集合</returns>
-        Task<OperateResult> Array();
+        OperateResult Array(LibType LType);
+        /// <summary>
+        /// 获取数采库文件集合
+        /// </summary>
+        /// <param name="LType">库类型</param>
+        /// <returns>rData:库文件名集合</returns>
+        Task<OperateResult> ArrayAsync(LibType LType);
 
+        /// <summary>
+        /// 获取数采库文件实例参数
+        /// </summary>
+        /// <param name="LType">库类型</param>
+        /// <param name="Name">库文件名</param>
+        /// <returns>rData:库文件所需实例参数集合</returns>
+        OperateResult Param(LibType LType, string Name);
         /// <summary>
         /// 获取数采库文件实例参数
         /// </summary>
         /// <param name="Name">库文件名</param>
+        /// <param name="LType">库类型</param>
         /// <returns>rData:库文件所需实例参数集合</returns>
-        Task<OperateResult> Param(string Name);
+        Task<OperateResult> ParamAsync(LibType LType, string Name);
     }
 }

+ 0 - 7
src/YSAI.DAQ/YSAI.Manage.Core/Class1.cs

@@ -1,7 +0,0 @@
-namespace YSAI.Manage.Core
-{
-    public class Class1
-    {
-
-    }
-}

+ 110 - 0
src/YSAI.DAQ/YSAI.Manage.Core/ManageInfoOperate.cs

@@ -0,0 +1,110 @@
+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.Core.@interface.only;
+using YSAI.Core.@interface.unify;
+using YSAI.DB;
+using YSAI.Kafka;
+using YSAI.Modbus.client;
+using YSAI.Mqtt.client;
+using YSAI.Opc.da.client;
+using YSAI.Opc.da.http;
+using YSAI.Opc.ua.client;
+using YSAI.RabbitMQ;
+using YSAI.S7.client;
+using YSAI.Unility;
+
+namespace YSAI.Manage.Core
+{
+    /// <summary>
+    /// 信息管理
+    /// </summary>
+    public class ManageInfoOperate : IBaseAbstract, IManageInfo
+    {
+        protected override string LogHead => "[ ManageInfoOperate 操作 ]";
+        protected override string ClassName => "ManageInfoOperate";
+
+        public OperateResult Array(LibType LType)
+        {
+            Depart("Array");
+            try
+            {
+                switch (LType)
+                {
+                    case LibType.Daq:
+                        return Break("Array", true, RData: EnumTool.EnumToList<DaqType>(), RType: ResultType.Json);
+                    case LibType.Relay:
+                        return Break("Array", true, RData: EnumTool.EnumToList<RelayType>(), RType: ResultType.Json);
+                    default:
+                        return Break("Array", false, "错误");
+                }
+            }
+            catch (Exception ex)
+            {
+                return Break("Array", false, ex.Message);
+            }
+        }
+
+        public Task<OperateResult> ArrayAsync(LibType LType)
+        {
+            return Task.Run(() => Array(LType));
+        }
+
+        public OperateResult Param(LibType LType, string Name)
+        {
+            Depart("Param");
+            try
+            {
+                switch (LType)
+                {
+                    case LibType.Daq:
+                        DaqType daqType = (DaqType)Enum.Parse(typeof(DaqType), Name);
+                        switch (daqType)
+                        {
+                            case DaqType.DB:
+                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<DBData.Basics>(), RType: ResultType.Json);
+                            case DaqType.Modbus:
+                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<ModbusClientData.Basics>(), RType: ResultType.Json);
+                            case DaqType.OpcUa:
+                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<OpcUaClientData.Basics>(), RType: ResultType.Json);
+                            case DaqType.OpcDa:
+                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<OpcDaClientData.Basics>(), RType: ResultType.Json);
+                            case DaqType.OpcDaHttp:
+                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<OpcDaHttpData.Basics>(), RType: ResultType.Json);
+                            case DaqType.S7:
+                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<S7ClientData.Basics>(), RType: ResultType.Json);
+                            default:
+                                return Break("Param", false, "输入有误");
+                        }
+                    case LibType.Relay:
+                        RelayType relayType = (RelayType)Enum.Parse(typeof(RelayType), Name);
+                        switch (relayType)
+                        {
+                            case RelayType.Kafka:
+                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<KafkaProducerData.Basics>(), RType: ResultType.Json);
+                            case RelayType.Mqtt:
+                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<MqttClientData.Basics>(), RType: ResultType.Json);
+                            case RelayType.RabbitMQ:
+                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<RabbitMQData.Basics>(), RType: ResultType.Json);
+                            default:
+                                return Break("Param", false, "输入有误");
+                        }
+                }
+            }
+            catch (Exception ex)
+            {
+                return Break("Param", false, ex.Message);
+            }
+            return Break("Param", false, "获取失败,位置原因");
+        }
+
+        public Task<OperateResult> ParamAsync(LibType LType, string Name)
+        {
+            return Task.Run(() => Param(LType,Name));
+        }
+    }
+}

+ 167 - 0
src/YSAI.DAQ/YSAI.Manage.Core/ManageOperate.cs

@@ -0,0 +1,167 @@
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using YSAI.Core.data;
+using YSAI.Core.@enum;
+using YSAI.Core.@interface.only;
+using YSAI.Core.@interface.unify;
+using YSAI.Opc.ua.client;
+using YSAI.Unility;
+
+namespace YSAI.Manage.Core
+{
+    /// <summary>
+    /// 统一管理
+    /// </summary>
+    public class ManageOperate : IBaseAbstract, IManage
+    {
+        protected override string LogHead => "[ ManageOperate 操作 ]";
+        protected override string ClassName => "ManageOperate";
+
+        /// <summary>
+        /// 配置路径
+        /// </summary>
+        private readonly string configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config//AMConfig.json");
+        /// <summary>
+        /// 实例文件路径
+        /// </summary>
+        private readonly string samplePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config//Sample.json");
+
+        public IActionResult Sample()
+        {
+            try
+            {
+                Address address = JsonTool.StringToJsonEntity<Address>(FileTool.FileToString(samplePath));
+                AddressManage addressManage = new AddressManage();
+                addressManage.SN = address.SN;
+                addressManage.AddressArray = address.AddressArray;
+                addressManage.CreationTime = DateTime.Now.ToLocalTime();
+                addressManage.DaqType = DaqType.OpcUa;
+                addressManage.InstanceParam = new OpcUaClientData.Basics() { Name = $"OpcUa", UserName = "123", Password = "123", ServerUrl = "opc.tcp://127.0.0.1:4840", SamplingInterval = 100 };
+                return new FileContentResult(System.Text.Encoding.Default.GetBytes(new List<AddressManage> { addressManage, addressManage, addressManage, addressManage, addressManage, addressManage }.ToJson().JsonFormatting()), "application/octet-stream");
+            }
+            catch (Exception ex)
+            {
+                throw new NotImplementedException("实例获取异常:" + ex.Message);
+            }
+        }
+
+        public Task<IActionResult> SampleAsync()
+        {
+            return Task.Run(() => Sample());
+        }
+
+        public OperateResult Setting(IFormFile? ConfigFile)
+        {
+            //开始记录运行时间
+            Depart("Setting");
+            try
+            {
+                if (ConfigFile == null || ConfigFile.Length == 0)
+                {
+                    return Break("Setting", false, "请选择要上传的文件");
+                }
+                if (!System.IO.File.Exists(configPath))
+                {
+                    OperateResult operateResult = Update(ConfigFile);
+                    if (operateResult.State)
+                    {
+                        return Break("Setting", operateResult.State);
+                    }
+                    return Break("Setting", operateResult.State, operateResult.Message.Split(')')[1]);
+                }
+                else
+                {
+                    return Break("Setting", false, "配置文件已存在,请执行修改配置接口");
+                }
+            }
+            catch (Exception ex)
+            {
+                return Break("Setting", false, $"设置配置异常:{ex.Message}");
+            }
+        }
+
+        public Task<OperateResult> SettingAsync(IFormFile? ConfigFile)
+        {
+            return Task.Run(() => Setting(ConfigFile));
+        }
+
+        public OperateResult Update(IFormFile? ConfigFile)
+        {
+            //开始记录运行时间
+            Depart("Update");
+            try
+            {
+                if (ConfigFile == null || ConfigFile.Length == 0)
+                {
+                    return Break("Update", false, "请选择要上传的文件");
+                }
+                //判断文件夹是否存在,不存在则创建
+                FileTool.GetPathFolderPath(configPath, true);
+                using (var stream = System.IO.File.Create(configPath))
+                {
+                    ConfigFile.CopyToAsync(stream).Wait();
+                }
+                return Break("Update", true);
+            }
+            catch (Exception ex)
+            {
+                return Break("Update", false, $"修改配置异常:{ex.Message}");
+            }
+        }
+
+        public Task<OperateResult> UpdateAsync(IFormFile? ConfigFile)
+        {
+            return Task.Run(() => Update(ConfigFile));
+        }
+
+        public OperateResult Init()
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<OperateResult> InitAsync()
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult Off(string Name, string SN)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<OperateResult> OffAsync(string Name, string SN)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult On(string Name, string SN)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<OperateResult> OnAsync(string Name, string SN)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult Read(string Name, string SN, string AddressName)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<OperateResult> ReadAsync(string Name, string SN, string AddressName)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult Write(string Name, string SN, string AddressName, string Value,DataType DType)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<OperateResult> WriteAsync(string Name, string SN, string AddressName, string Value, DataType DType)
+        {
+            return Task.Run(() => Write(Name, SN, AddressName, Value, DType));
+        }
+    }
+}

+ 13 - 1
src/YSAI.DAQ/YSAI.Manage.Core/YSAI.Manage.Core.csproj

@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <TargetFramework>net6.0</TargetFramework>
@@ -6,6 +6,18 @@
     <Nullable>enable</Nullable>
   </PropertyGroup>
 
+  <ItemGroup>
+    <None Remove="Sample.json" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Content Include="config\Sample.json">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+      <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
+      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
+    </Content>
+  </ItemGroup>
+
   <ItemGroup>
     <ProjectReference Include="..\YSAI.DB\YSAI.DB.csproj" />
     <ProjectReference Include="..\YSAI.Kafka\YSAI.Kafka.csproj" />

src/YSAI.DAQ/YSAI.Manage/Sample.json → src/YSAI.DAQ/YSAI.Manage.Core/config/Sample.json


+ 22 - 39
src/YSAI.DAQ/YSAI.Manage/Controllers/DaqLibInfoController.cs

@@ -8,6 +8,7 @@ using YSAI.Core.@interface.unify;
 using YSAI.DB;
 using YSAI.Kafka;
 using YSAI.Log;
+using YSAI.Manage.Core;
 using YSAI.Modbus.client;
 using YSAI.Mqtt.client;
 using YSAI.Mqtt.service;
@@ -22,65 +23,47 @@ using YSAI.Unility;
 
 namespace YSAI.Manage.Controllers
 {
-   
+    /// <summary>
+    /// 采集库文件信息
+    /// </summary>
     [ApiController]
     [Route("api/[controller]/[action]")]
-    public class DaqLibInfoController : Controller,IManageInfo
+    public class DaqLibInfoController : Controller
     {
         /// <summary>
         /// 配置
         /// </summary>
         private readonly IConfiguration configuration;
         /// <summary>
-        /// 统一操作结果
+        /// 管理信息操作
         /// </summary>
-        private readonly Or operateResult;
+        private readonly ManageInfoOperate manageInfoOperate;
         /// <summary>
         /// 采集库文件信息
         /// </summary>
-        public DaqLibInfoController(IConfiguration configuration, Or operateResult)
+        public DaqLibInfoController(IConfiguration configuration, ManageInfoOperate manageInfoOperate)
         {
             this.configuration = configuration;
-            this.operateResult = operateResult;
-            operateResult.LogHead = "[ DaqLibInfo 操作 ]";
-            operateResult.ClassName = "DaqLibInfo";
+            this.manageInfoOperate = manageInfoOperate;
         }
-
+        /// <summary>
+        /// 获取数采库文件集合
+        /// </summary>
+        /// <returns>rData:库文件名集合</returns>
         [HttpGet]
-        public async Task<OperateResult> Array()
+        public OperateResult Array()
         {
-            //开始记录运行时间
-            operateResult.Depart("Array");
-            return operateResult.Break("Array", true,RData:EnumTool.EnumToList<DaqType>(), RType:ResultType.Json);
+            return manageInfoOperate.Array(LibType.Daq);
         }
-
+        /// <summary>
+        /// 获取数采库文件实例参数
+        /// </summary>
+        /// <param name="Name">库文件名</param>
+        /// <returns>rData:库文件所需实例参数集合</returns>
         [HttpGet]
-        public async Task<OperateResult> Param(string Name)
+        public OperateResult Param(string Name)
         {
-            //开始记录运行时间
-            operateResult.Depart("Param");
-
-            DaqType daqType = (DaqType)Enum.Parse(typeof(DaqType), Name);
-
-            switch (daqType)
-            {
-                case DaqType.DB:
-                    return operateResult.Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<DBData.Basics>(), RType: ResultType.Json);
-                case DaqType.Modbus:
-                    return operateResult.Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<ModbusClientData.Basics>(), RType: ResultType.Json);
-                case DaqType.OpcUa:
-                    return operateResult.Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<OpcUaClientData.Basics>(), RType: ResultType.Json);
-                case DaqType.OpcDa:
-                    return operateResult.Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<OpcDaClientData.Basics>(), RType: ResultType.Json);
-                case DaqType.OpcDaHttp:
-                    return operateResult.Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<OpcDaHttpData.Basics>(), RType: ResultType.Json);
-                case DaqType.S7:
-                    return operateResult.Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<S7ClientData.Basics>(), RType: ResultType.Json);
-                default:
-                    return operateResult.Break("Param", false, "输入有误");
-            }
-
-
+            return manageInfoOperate.Param(LibType.Daq, Name);
         }
     }
 }

+ 106 - 139
src/YSAI.DAQ/YSAI.Manage/Controllers/DaqLibOperateController.cs

@@ -4,6 +4,7 @@ using System.Drawing;
 using System.Text;
 using YSAI.Core.data;
 using YSAI.Core.@interface.only;
+using YSAI.Manage.Core;
 using YSAI.Opc.ua.client;
 using YSAI.Unility;
 using static System.Net.Mime.MediaTypeNames;
@@ -15,7 +16,7 @@ namespace YSAI.Manage.Controllers
     /// </summary>
     [ApiController]
     [Route("api/[controller]/[action]")]
-    public class DaqLibOperateController : Controller,IManage
+    public class DaqLibOperateController : Controller
     {
         /// <summary>
         /// 配置
@@ -24,179 +25,145 @@ namespace YSAI.Manage.Controllers
         /// <summary>
         /// 统一操作结果
         /// </summary>
-        private readonly Or operateResult;
+        private readonly ManageOperate manageOperate;
+
 
-        /// <summary>
-        /// 配置路径
-        /// </summary>
-        private readonly string configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config//AMConfig.json");
 
         /// <summary>
         /// 点位地址信息操作
         /// </summary>
-        public DaqLibOperateController(IConfiguration configuration, Or operateResult)
+        public DaqLibOperateController(IConfiguration configuration, ManageOperate manageOperate)
         {
             this.configuration = configuration;
-            this.operateResult = operateResult;
-            operateResult.LogHead = "[ DaqLibOperate 操作 ]";
-            operateResult.ClassName = "DaqLibOperate";
+            this.manageOperate = manageOperate;
         }
 
-
+        /// <summary>
+        /// 示例
+        /// </summary>
+        /// <returns>配置文件</returns>
         [HttpGet]
-        public async Task<IActionResult> Sample()
+        public IActionResult Sample()
         {
-            Address address = JsonTool.StringToJsonEntity<Address>(FileTool.FileToString("Sample.json"));
-            AddressManage addressManage = new AddressManage();
-            addressManage.SN = address.SN;
-            addressManage.AddressArray = address.AddressArray;
-            addressManage.CreationTime = DateTime.Now.ToLocalTime();
-            addressManage.DaqType = Core.@enum.DaqType.OpcUa;
-            addressManage.InstanceParam = new OpcUaClientData.Basics() { Name = $"YSAI-OpcUa", UserName = "123", Password = "123", ServerUrl = "opc.tcp://127.0.0.1:4840", SamplingInterval = 100 };
-            return File(System.Text.Encoding.Default.GetBytes(new List<AddressManage> { addressManage, addressManage, addressManage, addressManage, addressManage, addressManage }.ToJson().JsonFormatting()), "application/octet-stream");
+            return manageOperate.Sample();
         }
-
+        /// <summary>
+        /// 设置配置
+        /// </summary>
+        /// <param name="ConfigFile">配置文件</param>
+        /// <returns>统一出参</returns>
         [HttpPost]
-        public async Task<OperateResult> Setting(IFormFile? ConfigFile)
+        public OperateResult Setting(IFormFile? ConfigFile)
         {
-            //开始记录运行时间
-            operateResult.Depart("Setting");
-            try
-            {
-                if (ConfigFile == null || ConfigFile.Length == 0)
-                {
-                    return operateResult.Break("Setting", false, "请选择要上传的文件");
-                }
-                if (!System.IO.File.Exists(configPath))
-                {
-                    //判断文件夹是否存在,不存在则创建
-                    FileTool.GetPathFolderPath(configPath, true);
-
-                    using (var stream = System.IO.File.Create(configPath))
-                    {
-                        await ConfigFile.CopyToAsync(stream);
-                    }
-
-                    return operateResult.Break("Setting", true);
-                }
-                else
-                {
-                    return operateResult.Break("Setting", false, "配置文件已存在,请执行修改配置接口");
-                }
-            }
-            catch (Exception ex)
-            {
-                return operateResult.Break("Setting", false, $"设置配置异常:{ex.Message}");
-            }
+            return manageOperate.Setting(ConfigFile);
         }
-
+        /// <summary>
+        /// 修改配置
+        /// </summary>
+        /// <param name="ConfigFile">配置文件</param>
+        /// <returns>统一出参</returns>
         [HttpPost]
-        public async Task<OperateResult> Update(IFormFile? ConfigFile)
+        public OperateResult Update(IFormFile? ConfigFile)
         {
-            //开始记录运行时间
-            operateResult.Depart("Update");
-            try
-            {
-                if (ConfigFile == null || ConfigFile.Length == 0)
-                {
-                    return operateResult.Break("Update", false, "请选择要上传的文件");
-                }
-                //判断文件夹是否存在,不存在则创建
-                FileTool.GetPathFolderPath(configPath,true);
-                using (var stream = System.IO.File.Create(configPath))
-                {
-                    await ConfigFile.CopyToAsync(stream);
-                }
-                return operateResult.Break("Update", true);
-            }
-            catch (Exception ex)
-            {
-                return operateResult.Break("Update", false, $"修改配置异常:{ex.Message}");
-            }
+            return manageOperate.Update(ConfigFile);
         }
-
+        /// <summary>
+        /// 初始化
+        /// </summary>
+        /// <returns>统一出参</returns>
         [HttpPost]
-        public async Task<OperateResult> Init()
+        public OperateResult Init()
         {
-            //开始记录运行时间
-            operateResult.Depart("Init");
-            try
-            {
-               
-
-                return operateResult.Break("Init", true);
-            }
-            catch (Exception ex)
-            {
-                return operateResult.Break("Init", false, $"初始化异常:{ex.Message}");
-            }
+            return manageOperate.Init();
         }
-
+        /// <summary>
+        /// 打开
+        /// </summary>
+        /// <param name="Name">库名称</param>
+        /// <param name="SN">库实例SN</param>
+        /// <returns>统一返回结果</returns>
         [HttpPost]
-        public async Task<OperateResult> On(string Name, string SN)
+        public OperateResult On(string Name, string SN)
         {
-            //开始记录运行时间
-            operateResult.Depart("On");
-            try
-            {
-
-
-                return operateResult.Break("On", true);
-            }
-            catch (Exception ex)
-            {
-                return operateResult.Break("On", false, $"打开异常:{ex.Message}");
-            }
+            return manageOperate.On(Name, SN);
         }
+        /// <summary>
+        /// 关闭
+        /// </summary>
+        /// <param name="Name">库名称</param>
+        /// <param name="SN">库实例SN</param>
+        /// <returns>统一返回结果</returns>
         [HttpPost]
-        public async Task<OperateResult> Off(string Name, string SN)
+        public OperateResult Off(string Name, string SN)
         {
-            //开始记录运行时间
-            operateResult.Depart("Off");
-            try
-            {
-
-
-                return operateResult.Break("Off", true);
-            }
-            catch (Exception ex)
-            {
-                return operateResult.Break("Off", false, $"关闭异常:{ex.Message}");
-            }
+            return manageOperate.Off(Name, SN);
         }
-
+        /// <summary>
+        /// 读取
+        /// </summary>
+        /// <param name="Name">库名称</param>
+        /// <param name="SN">库实例SN</param> 
+        /// <param name="AddressName">地址</param>
+        /// <returns>统一返回结果</returns>
         [HttpPost]
-        public async Task<OperateResult> Read(string Name, string SN, string AddressName)
+        public OperateResult Read(string Name, string SN, string AddressName)
         {
-            //开始记录运行时间
-            operateResult.Depart("Read");
-            try
-            {
-
-
-                return operateResult.Break("Read", true);
-            }
-            catch (Exception ex)
-            {
-                return operateResult.Break("Read", false, $"读取异常:{ex.Message}");
-            }
+            return manageOperate.Read(Name, SN, AddressName);
+        }
+        /// <summary>
+        /// 写入浮点型数据
+        /// </summary>
+        /// <param name="Name">库名称</param>
+        /// <param name="SN">库实例SN</param>
+        /// <param name="AddressName">地址</param>
+        /// <param name="Value">值</param>
+        /// <returns>统一返回结果</returns>
+        [HttpPost]
+        public OperateResult WriteDouble(string Name, string SN, string AddressName, string Value)
+        {
+            return manageOperate.Write(Name, SN, AddressName, Value, YSAI.Core.@enum.DataType.Double);
         }
 
+        /// <summary>
+        /// 写入整数型数据
+        /// </summary>
+        /// <param name="Name">库名称</param>
+        /// <param name="SN">库实例SN</param>
+        /// <param name="AddressName">地址</param>
+        /// <param name="Value">值</param>
+        /// <returns>统一返回结果</returns>
         [HttpPost]
-        public async Task<OperateResult> Write(string Name, string SN, string AddressName, string Value)
+        public OperateResult WriteInt(string Name, string SN, string AddressName, string Value)
         {
-            //开始记录运行时间
-            operateResult.Depart("Write");
-            try
-            {
+            return manageOperate.Write(Name, SN, AddressName, Value, YSAI.Core.@enum.DataType.Int);
+        }
 
+        /// <summary>
+        /// 写入字符串类型数据
+        /// </summary>
+        /// <param name="Name">库名称</param>
+        /// <param name="SN">库实例SN</param>
+        /// <param name="AddressName">地址</param>
+        /// <param name="Value">值</param>
+        /// <returns>统一返回结果</returns>
+        [HttpPost]
+        public OperateResult WriteString(string Name, string SN, string AddressName, string Value)
+        {
+            return manageOperate.Write(Name, SN, AddressName, Value, YSAI.Core.@enum.DataType.String);
+        }
 
-                return operateResult.Break("Write", true);
-            }
-            catch (Exception ex)
-            {
-                return operateResult.Break("Write", false, $"写入异常:{ex.Message}");
-            }
+        /// <summary>
+        /// 写入布尔类型数据
+        /// </summary>
+        /// <param name="Name">库名称</param>
+        /// <param name="SN">库实例SN</param>
+        /// <param name="AddressName">地址</param>
+        /// <param name="Value">值</param>
+        /// <returns>统一返回结果</returns>
+        [HttpPost]
+        public OperateResult WriteBool(string Name, string SN, string AddressName, string Value)
+        {
+            return manageOperate.Write(Name, SN, AddressName, Value, YSAI.Core.@enum.DataType.Bool);
         }
     }
 }

+ 19 - 32
src/YSAI.DAQ/YSAI.Manage/Controllers/RelayLibInfoController.cs

@@ -6,6 +6,7 @@ using YSAI.Unility;
 using YSAI.Core.@enum;
 using YSAI.Core.@interface.only;
 using YSAI.Core.data;
+using YSAI.Manage.Core;
 
 namespace YSAI.Manage.Controllers
 {
@@ -14,56 +15,42 @@ namespace YSAI.Manage.Controllers
     /// </summary>
     [ApiController]
     [Route("api/[controller]/[action]")]
-    public class RelayLibInfoController : Controller,IManageInfo
+    public class RelayLibInfoController : Controller
     {
         /// <summary>
         /// 配置
         /// </summary>
         private readonly IConfiguration configuration;
         /// <summary>
-        /// 统一操作结果
+        /// 管理信息操作
         /// </summary>
-        private readonly Or operateResult;
+        private readonly ManageInfoOperate manageInfoOperate;
         /// <summary>
         /// 转发库文件信息
         /// </summary>
-        public RelayLibInfoController(IConfiguration configuration, Or operateResult)
+        public RelayLibInfoController(IConfiguration configuration, ManageInfoOperate manageInfoOperate)
         {
             this.configuration = configuration;
-            this.operateResult = operateResult;
-            operateResult.LogHead = "[ RelayLibInfo 操作 ]";
-            operateResult.ClassName = "RelayLibInfo";
+            this.manageInfoOperate = manageInfoOperate;
         }
-
+        /// <summary>
+        /// 获取转发库文件集合
+        /// </summary>
+        /// <returns>rData:库文件名集合</returns>
         [HttpGet]
-        public async Task<OperateResult> Array()
+        public OperateResult Array()
         {
-            //开始记录运行时间
-            operateResult.Depart("Array");
-            return operateResult.Break("Array", true, RData: EnumTool.EnumToList<RelayType>(), RType: ResultType.Json);
+            return manageInfoOperate.Array(LibType.Relay);
         }
-
+        /// <summary>
+        /// 获取转发库文件实例参数
+        /// </summary>
+        /// <param name="Name">库文件名</param>
+        /// <returns>rData:库文件所需实例参数集合</returns>
         [HttpGet]
-        public async Task<OperateResult> Param(string Name)
+        public OperateResult Param(string Name)
         {
-            //开始记录运行时间
-            operateResult.Depart("Param");
-
-            RelayType daqType = (RelayType)Enum.Parse(typeof(RelayType), Name);
-
-            switch (daqType)
-            {
-                case RelayType.Kafka:
-                    return operateResult.Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<KafkaProducerData.Basics>(), RType: ResultType.Json);
-                case RelayType.Mqtt:
-                    return operateResult.Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<MqttClientData.Basics>(), RType: ResultType.Json);
-                case RelayType.RabbitMQ:
-                    return operateResult.Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<RabbitMQData.Basics>(), RType: ResultType.Json);
-                default:
-                    return operateResult.Break("Param", false, "输入有误");
-            }
-
-            
+            return manageInfoOperate.Param(LibType.Relay, Name);
         }
     }
 }

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

@@ -1,76 +0,0 @@
-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="MethodName">方法名</param>
-        public void Depart(string MethodName)
-        {
-            RunTimeTool.Instance($"{ClassName}.{MethodName}").StartRecord();
-        }
-
-        /// <summary>
-        /// 出发,记录运行时间
-        /// </summary>
-        /// <param name="MethodName">方法名</param>
-        public Task DepartAsync(string MethodName)
-        {
-            return Task.Run(() => Depart(MethodName));
-        }
-
-        /// <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);
-        }
-    }
-}

+ 6 - 2
src/YSAI.DAQ/YSAI.Manage/Program.cs

@@ -3,6 +3,7 @@ using Microsoft.Extensions.Configuration.Json;
 using System.Reflection;
 using YSAI.Core.@interface.unify;
 using YSAI.Manage.Controllers;
+using YSAI.Manage.Core;
 using YSAI.Opc.ua.service.core;
 
 namespace YSAI.Manage
@@ -13,7 +14,10 @@ namespace YSAI.Manage
         {
             var builder = WebApplication.CreateBuilder(args);
 
-            builder.Services.AddSingleton<Or>();
+            //注入管理信息类
+            builder.Services.AddSingleton<ManageInfoOperate>();
+            //注入管理类
+            builder.Services.AddSingleton<ManageOperate>();
 
             // Add services to the container.
             builder.Services.AddControllers().AddJsonOptions(options =>
@@ -22,8 +26,8 @@ namespace YSAI.Manage
                 options.JsonSerializerOptions.PropertyNamingPolicy = null;
             });
 
-            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
             builder.Services.AddEndpointsApiExplorer();
+            //Swagger 显示注释
             builder.Services.AddSwaggerGen((o) =>
             {
                 var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.XML";

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

@@ -15,6 +15,7 @@
     <ProjectReference Include="..\YSAI.Core\YSAI.Core.csproj" />
     <ProjectReference Include="..\YSAI.DB\YSAI.DB.csproj" />
     <ProjectReference Include="..\YSAI.Kafka\YSAI.Kafka.csproj" />
+    <ProjectReference Include="..\YSAI.Manage.Core\YSAI.Manage.Core.csproj" />
     <ProjectReference Include="..\YSAI.Modbus\YSAI.Modbus.csproj" />
     <ProjectReference Include="..\YSAI.Mqtt\YSAI.Mqtt.csproj" />
     <ProjectReference Include="..\YSAI.Opc\YSAI.Opc.csproj" />