diff --git a/src/Directory.Build.props b/src/Directory.Build.props index ce6d94e81..7fbfb20b1 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,8 +1,8 @@ - 10.2.3 - 10.2.3 + 10.2.4 + 10.2.4 diff --git a/src/Foundation/ThingsGateway.CSScript/CSharpScriptEngineExtension.cs b/src/Foundation/ThingsGateway.CSScript/CSharpScriptEngineExtension.cs index f7a2b6d58..d0dbe383a 100644 --- a/src/Foundation/ThingsGateway.CSScript/CSharpScriptEngineExtension.cs +++ b/src/Foundation/ThingsGateway.CSScript/CSharpScriptEngineExtension.cs @@ -70,6 +70,10 @@ public static class CSharpScriptEngineExtension } } + public static void Remove(string source) + { + Instance.Remove($"{CacheKey}-{source}"); + } private static MemoryCache Instance { get; set; } = new MemoryCache(); diff --git a/src/Gateway/ThingsGateway.RulesEngine/Component/TextNode.cs b/src/Gateway/ThingsGateway.RulesEngine/Component/TextNode.cs index 32ac2076f..8da44d9fe 100644 --- a/src/Gateway/ThingsGateway.RulesEngine/Component/TextNode.cs +++ b/src/Gateway/ThingsGateway.RulesEngine/Component/TextNode.cs @@ -8,5 +8,5 @@ public abstract class TextNode : PlaceholderModel } [ModelValue] - public string Text { get; set; } + public virtual string Text { get; set; } } diff --git a/src/Gateway/ThingsGateway.RulesEngine/Node/Actuator/ExecuteScriptNode.cs b/src/Gateway/ThingsGateway.RulesEngine/Node/Actuator/ExecuteScriptNode.cs index be2318096..8ebcdb918 100644 --- a/src/Gateway/ThingsGateway.RulesEngine/Node/Actuator/ExecuteScriptNode.cs +++ b/src/Gateway/ThingsGateway.RulesEngine/Node/Actuator/ExecuteScriptNode.cs @@ -1,5 +1,6 @@  using ThingsGateway.Gateway.Application; +using ThingsGateway.NewLife; using TouchSocket.Core; @@ -10,11 +11,40 @@ public class ExecuteScriptNode : TextNode, IActuatorNode, IExexcuteExpressionsBa { public ExecuteScriptNode(string id, Point? position = null) : base(id, position) { Title = "ExecuteScriptNode"; Placeholder = "ExecuteScriptNode.Placeholder"; } + private string text; + + [ModelValue] + public override string Text + { + get + { + return text; + } + set + { + if (text != value) + { + try + { + var exexcuteExpressions = CSharpScriptEngineExtension.Do(text); + exexcuteExpressions.TryDispose(); + } + catch + { + + } + CSharpScriptEngineExtension.Remove(text); + } + + text = value; + } + } + Task IActuatorNode.ExecuteAsync(NodeInput input, CancellationToken cancellationToken) { - LogMessage?.Trace($"Execute script"); + Logger?.Trace($"Execute script"); var exexcuteExpressions = CSharpScriptEngineExtension.Do(Text); - exexcuteExpressions.Logger = LogMessage; + exexcuteExpressions.Logger = Logger; return exexcuteExpressions.ExecuteAsync(input, cancellationToken); } diff --git a/src/Gateway/ThingsGateway.RulesEngine/Node/Actuator/VariableRpcNode.cs b/src/Gateway/ThingsGateway.RulesEngine/Node/Actuator/VariableRpcNode.cs index cd0b544a2..3cf3d7975 100644 --- a/src/Gateway/ThingsGateway.RulesEngine/Node/Actuator/VariableRpcNode.cs +++ b/src/Gateway/ThingsGateway.RulesEngine/Node/Actuator/VariableRpcNode.cs @@ -19,13 +19,13 @@ public class VariableRpcNode : VariableNode, IActuatorNode { var data = await value.RpcAsync(input.JToken.ToString(), $"RulesEngine: {RulesEngineName}", cancellationToken).ConfigureAwait(false); if (data.IsSuccess) - LogMessage?.Trace($" VariableRpcNode - VariableName {Text} : execute success"); + Logger?.Trace($" VariableRpcNode - VariableName {Text} : execute success"); else - LogMessage?.Warning($" VariableRpcNode - VariableName {Text} : {data.ErrorMessage}"); + Logger?.Warning($" VariableRpcNode - VariableName {Text} : {data.ErrorMessage}"); return new NodeOutput() { Value = data }; } } - LogMessage?.Warning($" VariableRpcNode - VariableName {Text} : not found"); + Logger?.Warning($" VariableRpcNode - VariableName {Text} : not found"); return new NodeOutput() { }; } diff --git a/src/Gateway/ThingsGateway.RulesEngine/Node/BaseNode.cs b/src/Gateway/ThingsGateway.RulesEngine/Node/BaseNode.cs index 45cd9b32a..07a372b37 100644 --- a/src/Gateway/ThingsGateway.RulesEngine/Node/BaseNode.cs +++ b/src/Gateway/ThingsGateway.RulesEngine/Node/BaseNode.cs @@ -11,5 +11,5 @@ public abstract class BaseNode : NodeModel, INode } public string RulesEngineName { get; set; } - public ILog LogMessage { get; set; } + public ILog Logger { get; set; } } diff --git a/src/Gateway/ThingsGateway.RulesEngine/Node/Expression/ConditionNode.cs b/src/Gateway/ThingsGateway.RulesEngine/Node/Expression/ConditionNode.cs index 41969628e..8790bf178 100644 --- a/src/Gateway/ThingsGateway.RulesEngine/Node/Expression/ConditionNode.cs +++ b/src/Gateway/ThingsGateway.RulesEngine/Node/Expression/ConditionNode.cs @@ -15,9 +15,9 @@ public class ConditionNode : TextNode, IConditionNode Task IConditionNode.ExecuteAsync(NodeInput input, CancellationToken cancellationToken) { - var value = Text.GetExpressionsResult(input.Value, LogMessage); + var value = Text.GetExpressionsResult(input.Value, Logger); var next = value.ToBoolean(false); - LogMessage?.Trace($"Condition result: {next}"); + Logger?.Trace($"Condition result: {next}"); return Task.FromResult(next); } diff --git a/src/Gateway/ThingsGateway.RulesEngine/Node/Expression/DataNode.cs b/src/Gateway/ThingsGateway.RulesEngine/Node/Expression/DataNode.cs index ee6f1eb5a..965675250 100644 --- a/src/Gateway/ThingsGateway.RulesEngine/Node/Expression/DataNode.cs +++ b/src/Gateway/ThingsGateway.RulesEngine/Node/Expression/DataNode.cs @@ -12,10 +12,10 @@ public class DataNode : TextNode, IExpressionNode Task IExpressionNode.ExecuteAsync(NodeInput input, CancellationToken cancellationToken) { - var value = Text.GetExpressionsResult(input.Value, LogMessage); + var value = Text.GetExpressionsResult(input.Value, Logger); NodeOutput nodeOutput = new(); nodeOutput.Value = value; - LogMessage?.Trace($"Data result: {nodeOutput.JToken?.ToString(Newtonsoft.Json.Formatting.Indented)}"); + Logger?.Trace($"Data result: {nodeOutput.JToken?.ToString(Newtonsoft.Json.Formatting.Indented)}"); return Task.FromResult(nodeOutput); } } diff --git a/src/Gateway/ThingsGateway.RulesEngine/Node/Expression/DelayNode.cs b/src/Gateway/ThingsGateway.RulesEngine/Node/Expression/DelayNode.cs index d92524ca2..38972e461 100644 --- a/src/Gateway/ThingsGateway.RulesEngine/Node/Expression/DelayNode.cs +++ b/src/Gateway/ThingsGateway.RulesEngine/Node/Expression/DelayNode.cs @@ -9,7 +9,7 @@ public class DelayNode : NumberNode, IExpressionNode async Task IExpressionNode.ExecuteAsync(NodeInput input, CancellationToken cancellationToken) { - LogMessage?.Trace($"Delay {Number} ms"); + Logger?.Trace($"Delay {Number} ms"); await Task.Delay(Number ?? 0, cancellationToken).ConfigureAwait(false); return new NodeOutput(); } diff --git a/src/Gateway/ThingsGateway.RulesEngine/Node/Expression/ScriptEdit.razor b/src/Gateway/ThingsGateway.RulesEngine/Node/Expression/ScriptEdit.razor index 062e58e02..a663a3d4c 100644 --- a/src/Gateway/ThingsGateway.RulesEngine/Node/Expression/ScriptEdit.razor +++ b/src/Gateway/ThingsGateway.RulesEngine/Node/Expression/ScriptEdit.razor @@ -2,11 +2,20 @@
-
+
+
+
+ + + @(new MarkupString("注意 raw 参数 为 object 类型,需要转换为实际类型操作")) + @(new MarkupString("获取设备类实体,可用 GlobalData.ReadOnlyDevices 字典对象,键为设备名称,值为设备对象")) + @(new MarkupString("获取变量类实体,可用方法 GlobalData.GetVariable(\"设备名称1\",\"变量名称1\") ")) + @(new MarkupString("详细说明查看文档对应内容页面")) +
diff --git a/src/Gateway/ThingsGateway.RulesEngine/Node/INode.cs b/src/Gateway/ThingsGateway.RulesEngine/Node/INode.cs index e73b6369d..2d104165b 100644 --- a/src/Gateway/ThingsGateway.RulesEngine/Node/INode.cs +++ b/src/Gateway/ThingsGateway.RulesEngine/Node/INode.cs @@ -2,12 +2,14 @@ public interface INode { - public TouchSocket.Core.ILog LogMessage { get; set; } + public TouchSocket.Core.ILog Logger { get; set; } } + public interface IConditionNode : INode { public Task ExecuteAsync(NodeInput input, CancellationToken cancellationToken); } + public interface IExpressionNode : INode { public Task ExecuteAsync(NodeInput input, CancellationToken cancellationToken); diff --git a/src/Gateway/ThingsGateway.RulesEngine/Node/Trigger/AlarmChangedTriggerNode.cs b/src/Gateway/ThingsGateway.RulesEngine/Node/Trigger/AlarmChangedTriggerNode.cs index 2f31d0989..20cb3e124 100644 --- a/src/Gateway/ThingsGateway.RulesEngine/Node/Trigger/AlarmChangedTriggerNode.cs +++ b/src/Gateway/ThingsGateway.RulesEngine/Node/Trigger/AlarmChangedTriggerNode.cs @@ -89,13 +89,13 @@ public class AlarmChangedTriggerNode : VariableNode, ITriggerNode, IDisposable { if (FuncDict.TryGetValue(item, out var func)) { - item.LogMessage?.Trace($"Alarm changed: {item.Text}"); + item.Logger?.Trace($"Alarm changed: {item.Text}"); await func.Invoke(new NodeOutput() { Value = alarmVariable }).ConfigureAwait(false); } } catch (Exception ex) { - item.LogMessage?.LogWarning(ex); + item.Logger?.LogWarning(ex); } }, Environment.ProcessorCount, token).ConfigureAwait(false); } diff --git a/src/Gateway/ThingsGateway.RulesEngine/Node/Trigger/DeviceChangedTriggerNode.cs b/src/Gateway/ThingsGateway.RulesEngine/Node/Trigger/DeviceChangedTriggerNode.cs index 0bdf46739..25697a736 100644 --- a/src/Gateway/ThingsGateway.RulesEngine/Node/Trigger/DeviceChangedTriggerNode.cs +++ b/src/Gateway/ThingsGateway.RulesEngine/Node/Trigger/DeviceChangedTriggerNode.cs @@ -71,14 +71,14 @@ public class DeviceChangedTriggerNode : TextNode, ITriggerNode, IDisposable { if (FuncDict.TryGetValue(item, out var func)) { - item.LogMessage?.Trace($"Device changed: {item.Text}"); + item.Logger?.Trace($"Device changed: {item.Text}"); await func.Invoke(new NodeOutput() { Value = deviceDatas }).ConfigureAwait(false); } } catch (Exception ex) { - item.LogMessage?.LogWarning(ex); + item.Logger?.LogWarning(ex); } }, Environment.ProcessorCount, token).ConfigureAwait(false); } diff --git a/src/Gateway/ThingsGateway.RulesEngine/Node/Trigger/TimeIntervalTriggerNode.cs b/src/Gateway/ThingsGateway.RulesEngine/Node/Trigger/TimeIntervalTriggerNode.cs index f5ee04173..7089a82a8 100644 --- a/src/Gateway/ThingsGateway.RulesEngine/Node/Trigger/TimeIntervalTriggerNode.cs +++ b/src/Gateway/ThingsGateway.RulesEngine/Node/Trigger/TimeIntervalTriggerNode.cs @@ -36,14 +36,14 @@ public class TimeIntervalTriggerNode : TextNode, ITriggerNode, IDisposable { if (Func != null) { - LogMessage?.Trace($"Timer: {Text}"); + Logger?.Trace($"Timer: {Text}"); await Func.Invoke(new NodeOutput() { Value = TimeTick.LastTime }).ConfigureAwait(false); } } } catch (Exception ex) { - LogMessage?.LogWarning(ex); + Logger?.LogWarning(ex); } finally { diff --git a/src/Gateway/ThingsGateway.RulesEngine/Node/Trigger/ValueChangedTriggerNode.cs b/src/Gateway/ThingsGateway.RulesEngine/Node/Trigger/ValueChangedTriggerNode.cs index e7c491b29..07d1d1970 100644 --- a/src/Gateway/ThingsGateway.RulesEngine/Node/Trigger/ValueChangedTriggerNode.cs +++ b/src/Gateway/ThingsGateway.RulesEngine/Node/Trigger/ValueChangedTriggerNode.cs @@ -80,14 +80,14 @@ public class ValueChangedTriggerNode : VariableNode, ITriggerNode, IDisposable { if (FuncDict.TryGetValue(item, out var func)) { - item.LogMessage?.Trace($"Variable changed: {item.Text}"); + item.Logger?.Trace($"Variable changed: {item.Text}"); await func.Invoke(new NodeOutput() { Value = variableBasicData }).ConfigureAwait(false); } } catch (Exception ex) { - item.LogMessage?.LogWarning(ex); + item.Logger?.LogWarning(ex); } }, Environment.ProcessorCount, token).ConfigureAwait(false); } diff --git a/src/Gateway/ThingsGateway.RulesEngine/Page/DragAndDrop.razor.cs b/src/Gateway/ThingsGateway.RulesEngine/Page/DragAndDrop.razor.cs index 6b101670a..3c54b78a6 100644 --- a/src/Gateway/ThingsGateway.RulesEngine/Page/DragAndDrop.razor.cs +++ b/src/Gateway/ThingsGateway.RulesEngine/Page/DragAndDrop.razor.cs @@ -97,7 +97,6 @@ public partial class DragAndDrop { try { - System.Console.WriteLine("1"); Value = value; RuleHelpers.Load(_blazorDiagram, Value); } diff --git a/src/Gateway/ThingsGateway.RulesEngine/Services/RulesEngineHostedService.cs b/src/Gateway/ThingsGateway.RulesEngine/Services/RulesEngineHostedService.cs index d7f64ae0b..27694c7f6 100644 --- a/src/Gateway/ThingsGateway.RulesEngine/Services/RulesEngineHostedService.cs +++ b/src/Gateway/ThingsGateway.RulesEngine/Services/RulesEngineHostedService.cs @@ -111,7 +111,7 @@ internal sealed class RulesEngineHostedService : BackgroundService, IRulesEngine private static async Task Start(RulesLog rulesLog, BlazorDiagram item, CancellationToken cancellationToken) { var startNodes = item.Nodes.Where(a => a is StartNode); - startNodes.ForEach(a => (a as INode).LogMessage = rulesLog.Log); + startNodes.ForEach(a => (a as INode).Logger = rulesLog.Log); foreach (var link in startNodes.SelectMany(a => a.PortLinks)) { rulesLog.Log.Trace("Start"); @@ -121,7 +121,7 @@ internal sealed class RulesEngineHostedService : BackgroundService, IRulesEngine private static async Task Analysis(NodeModel targetNode, NodeInput input, ILog log, CancellationToken cancellationToken) { - (targetNode as INode).LogMessage = log; + (targetNode as INode).Logger = log; try { if (targetNode == null) diff --git a/src/Plugin/ThingsGateway.Plugin.DB/Common/Dynamic/IDynamicSQL.cs b/src/Plugin/ThingsGateway.Plugin.DB/Common/Dynamic/IDynamicSQL.cs index b24135dfd..9171b628e 100644 --- a/src/Plugin/ThingsGateway.Plugin.DB/Common/Dynamic/IDynamicSQL.cs +++ b/src/Plugin/ThingsGateway.Plugin.DB/Common/Dynamic/IDynamicSQL.cs @@ -14,7 +14,7 @@ namespace ThingsGateway.Plugin.DB; public abstract class DynamicSQLBase { - public TouchSocket.Core.ILog LogMessage { get; set; } + public TouchSocket.Core.ILog Logger { get; set; } /// /// 建库建表 diff --git a/src/Plugin/ThingsGateway.Plugin.DB/QuestDB/QuestDBProducer.cs b/src/Plugin/ThingsGateway.Plugin.DB/QuestDB/QuestDBProducer.cs index 0c0f10b9c..9507f6d31 100644 --- a/src/Plugin/ThingsGateway.Plugin.DB/QuestDB/QuestDBProducer.cs +++ b/src/Plugin/ThingsGateway.Plugin.DB/QuestDB/QuestDBProducer.cs @@ -153,8 +153,8 @@ public partial class QuestDBProducer : BusinessBaseWithCacheIntervalVariableMode //必须为间隔上传 if (!_driverPropertys.BigTextScriptHistoryTable.IsNullOrEmpty()) { - var hisModel = CSharpScriptEngineExtension.Do(_driverPropertys.BigTextScriptHistoryTable); - hisModel.LogMessage = LogMessage; + DynamicSQLBase? hisModel = CSharpScriptEngineExtension.Do(_driverPropertys.BigTextScriptHistoryTable); + hisModel.Logger = LogMessage; await hisModel.DBInit(db, cancellationToken).ConfigureAwait(false); } diff --git a/src/Plugin/ThingsGateway.Plugin.DB/QuestDB/QuestDBProducer.other.cs b/src/Plugin/ThingsGateway.Plugin.DB/QuestDB/QuestDBProducer.other.cs index cfd2e79fc..201ce0de0 100644 --- a/src/Plugin/ThingsGateway.Plugin.DB/QuestDB/QuestDBProducer.other.cs +++ b/src/Plugin/ThingsGateway.Plugin.DB/QuestDB/QuestDBProducer.other.cs @@ -65,7 +65,7 @@ public partial class QuestDBProducer : BusinessBaseWithCacheIntervalVariableMode if (!_driverPropertys.BigTextScriptHistoryTable.IsNullOrEmpty()) { var getDeviceModel = CSharpScriptEngineExtension.Do(_driverPropertys.BigTextScriptHistoryTable); - getDeviceModel.LogMessage = LogMessage; + getDeviceModel.Logger = LogMessage; await getDeviceModel.DBInsertable(db, dbInserts, cancellationToken).ConfigureAwait(false); diff --git a/src/Plugin/ThingsGateway.Plugin.DB/SqlDB/SqlDbProducer.other.cs b/src/Plugin/ThingsGateway.Plugin.DB/SqlDB/SqlDbProducer.other.cs index fb8d39ce8..abea12222 100644 --- a/src/Plugin/ThingsGateway.Plugin.DB/SqlDB/SqlDbProducer.other.cs +++ b/src/Plugin/ThingsGateway.Plugin.DB/SqlDB/SqlDbProducer.other.cs @@ -75,7 +75,7 @@ public partial class SqlDBProducer : BusinessBaseWithCacheIntervalVariableModel< { var getDeviceModel = CSharpScriptEngineExtension.Do(_driverPropertys.BigTextScriptHistoryTable); - getDeviceModel.LogMessage = LogMessage; + getDeviceModel.Logger = LogMessage; await getDeviceModel.DBInsertable(db, dbInserts, cancellationToken).ConfigureAwait(false); @@ -112,7 +112,7 @@ public partial class SqlDBProducer : BusinessBaseWithCacheIntervalVariableModel< if (!_driverPropertys.BigTextScriptRealTable.IsNullOrEmpty()) { var getDeviceModel = CSharpScriptEngineExtension.Do(_driverPropertys.BigTextScriptRealTable); - getDeviceModel.LogMessage = LogMessage; + getDeviceModel.Logger = LogMessage; await getDeviceModel.DBInsertable(db, datas, cancellationToken).ConfigureAwait(false); return OperResult.Success; diff --git a/src/Plugin/ThingsGateway.Plugin.DB/TDengineDB/TDengineDBProducer.other.cs b/src/Plugin/ThingsGateway.Plugin.DB/TDengineDB/TDengineDBProducer.other.cs index 04756be04..cfa63a082 100644 --- a/src/Plugin/ThingsGateway.Plugin.DB/TDengineDB/TDengineDBProducer.other.cs +++ b/src/Plugin/ThingsGateway.Plugin.DB/TDengineDB/TDengineDBProducer.other.cs @@ -72,7 +72,7 @@ public partial class TDengineDBProducer : BusinessBaseWithCacheIntervalVariableM if (!_driverPropertys.BigTextScriptHistoryTable.IsNullOrEmpty()) { var getDeviceModel = CSharpScriptEngineExtension.Do(_driverPropertys.BigTextScriptHistoryTable); - getDeviceModel.LogMessage = LogMessage; + getDeviceModel.Logger = LogMessage; await getDeviceModel.DBInsertable(db, dbInserts, cancellationToken).ConfigureAwait(false); } diff --git a/src/Version.props b/src/Version.props index 3eb500a84..ea0e90da4 100644 --- a/src/Version.props +++ b/src/Version.props @@ -1,6 +1,6 @@ - 10.2.3 + 10.2.4