mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-04-16 04:46:34 +08:00
1. 修复了流程图转c#代码时,方法存在可选参数,但无法正常生成的问题
2. 添加了对[Global]全局数据节点的代码生成支持
This commit is contained in:
@@ -111,6 +111,7 @@ namespace Serein.Library
|
|||||||
/// C#脚本节点
|
/// C#脚本节点
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Description("base")]
|
[Description("base")]
|
||||||
|
[Obsolete("目前没有支持C#转流程节点的计划")]
|
||||||
NetScript,
|
NetScript,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -72,7 +72,6 @@ namespace Serein.NodeFlow.Services
|
|||||||
return methodName;
|
return methodName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 生成完全的xml注释
|
/// 生成完全的xml注释
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ using Serein.Library.Utils;
|
|||||||
using Serein.NodeFlow.Model.Infos;
|
using Serein.NodeFlow.Model.Infos;
|
||||||
using Serein.NodeFlow.Model.Nodes;
|
using Serein.NodeFlow.Model.Nodes;
|
||||||
using Serein.Script;
|
using Serein.Script;
|
||||||
|
using System;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -182,6 +183,10 @@ namespace Serein.NodeFlow.Services
|
|||||||
{
|
{
|
||||||
CreateMethodCore_Script(sb_main, singleScriptNode, flowContextTypeName, flowContext);
|
CreateMethodCore_Script(sb_main, singleScriptNode, flowContextTypeName, flowContext);
|
||||||
}
|
}
|
||||||
|
else if (flowNode.ControlType == NodeControlType.GlobalData && flowNode is SingleGlobalDataNode globalDataNode)
|
||||||
|
{
|
||||||
|
CreateMethodCore_GlobalData(sb_main, globalDataNode, flowContextTypeName, flowContext);
|
||||||
|
}
|
||||||
else if (flowNode.ControlType == NodeControlType.UI)
|
else if (flowNode.ControlType == NodeControlType.UI)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -232,6 +237,7 @@ namespace Serein.NodeFlow.Services
|
|||||||
|| node.ControlType == NodeControlType.Flipflop
|
|| node.ControlType == NodeControlType.Flipflop
|
||||||
|| node.ControlType == NodeControlType.FlowCall
|
|| node.ControlType == NodeControlType.FlowCall
|
||||||
|| node.ControlType == NodeControlType.Script
|
|| node.ControlType == NodeControlType.Script
|
||||||
|
|| node.ControlType == NodeControlType.GlobalData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var md = node.MethodDetails;
|
var md = node.MethodDetails;
|
||||||
@@ -505,8 +511,8 @@ public async global::System.Threading.Tasks.Task InitAndStartAsync(global::Syste
|
|||||||
for (int index = 0; index < pds.Length; index++)
|
for (int index = 0; index < pds.Length; index++)
|
||||||
{
|
{
|
||||||
ParameterDetails? pd = pds[index];
|
ParameterDetails? pd = pds[index];
|
||||||
ParameterInfo parameterInfo = param[index];
|
ParameterInfo parameterInfo = pd.IsParams ? param[md.ParamsArgIndex] : param[index];
|
||||||
var paramtTypeFullName = parameterInfo.ParameterType.GetFriendlyName();
|
var paramtTypeFullName = pd.IsParams ? parameterInfo.ParameterType.GetElementType().GetFriendlyName() : parameterInfo.ParameterType.GetFriendlyName();
|
||||||
|
|
||||||
if (pd.IsExplicitData)
|
if (pd.IsExplicitData)
|
||||||
{
|
{
|
||||||
@@ -524,16 +530,12 @@ public async global::System.Threading.Tasks.Task InitAndStartAsync(global::Syste
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (parameterInfo.ParameterType == typeof(string))
|
else /*if (parameterInfo.ParameterType == typeof(string))*/
|
||||||
{
|
{
|
||||||
var dataString = EscapeForCSharpString(pd.DataValue);
|
var dataString = EscapeForCSharpString(pd.DataValue);
|
||||||
sb_invoke_login.AppendCode(3, $"global::{paramtTypeFullName} value{index} = \"{dataString}\"; // 获取当前节点的上一节点数据");
|
sb_invoke_login.AppendCode(3, $"global::{paramtTypeFullName} value{index} = \"{dataString}\"; // 获取当前节点的上一节点数据");
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// 处理表达式
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -691,28 +693,16 @@ public async global::System.Threading.Tasks.Task InitAndStartAsync(global::Syste
|
|||||||
var instanceType = flowCallNode.MethodDetails.ActingInstanceType;
|
var instanceType = flowCallNode.MethodDetails.ActingInstanceType;
|
||||||
var returnType = singleScriptNode.MethodDetails.ReturnType;
|
var returnType = singleScriptNode.MethodDetails.ReturnType;
|
||||||
|
|
||||||
//var instanceName = instanceType.ToCamelCase();// $"instance_{instanceType.Name}";
|
|
||||||
|
|
||||||
//var instanceTypeFullName = instanceType.FullName;
|
|
||||||
var returnTypeFullName = returnType == typeof(void) ? "void" : returnType.FullName;
|
var returnTypeFullName = returnType == typeof(void) ? "void" : returnType.FullName;
|
||||||
|
|
||||||
#region 方法内部逻辑
|
#region 方法内部逻辑
|
||||||
StringBuilder sb_invoke_login = new StringBuilder();
|
StringBuilder sb_invoke_login = new StringBuilder();
|
||||||
|
|
||||||
if (flowCallNode.MethodDetails is null) return;
|
if (flowCallNode.MethodDetails is null) return;
|
||||||
//var param = methodInfo.GetParameters();
|
|
||||||
var md = flowCallNode.MethodDetails;
|
var md = flowCallNode.MethodDetails;
|
||||||
var pds = flowCallNode.MethodDetails.ParameterDetailss;
|
var pds = flowCallNode.MethodDetails.ParameterDetailss;
|
||||||
//if (param is null) return;
|
|
||||||
if (pds is null) return;
|
if (pds is null) return;
|
||||||
|
|
||||||
/* for (int index = 0; index < pds.Length; index++)
|
|
||||||
{
|
|
||||||
ParameterDetails? pd = pds[index];
|
|
||||||
ParameterInfo parameterInfo = param[index];
|
|
||||||
var paramtTypeFullName = parameterInfo.ParameterType.FullName;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
var flowDataName = $"flowData{flowApiMethodInfo.ApiMethodName}";
|
var flowDataName = $"flowData{flowApiMethodInfo.ApiMethodName}";
|
||||||
var apiData = $"apiData{flowApiMethodInfo.ApiMethodName}";
|
var apiData = $"apiData{flowApiMethodInfo.ApiMethodName}";
|
||||||
sb_invoke_login.AppendCode(3, $"global::{typeof(object).FullName} {flowDataName} = {flowContext}.GetFlowData(\"{flowApiMethodInfo.ApiMethodName}\").Value;");
|
sb_invoke_login.AppendCode(3, $"global::{typeof(object).FullName} {flowDataName} = {flowContext}.GetFlowData(\"{flowApiMethodInfo.ApiMethodName}\").Value;");
|
||||||
@@ -867,7 +857,6 @@ public async global::System.Threading.Tasks.Task InitAndStartAsync(global::Syste
|
|||||||
private void CreateMethodCore_Script(StringBuilder sb_main, SingleScriptNode singleScriptNode, string? flowContextTypeName, string flowContext)
|
private void CreateMethodCore_Script(StringBuilder sb_main, SingleScriptNode singleScriptNode, string? flowContextTypeName, string flowContext)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
if (!_scriptMethodInfos.TryGetValue(singleScriptNode, out var scriptMethodInfo))
|
if (!_scriptMethodInfos.TryGetValue(singleScriptNode, out var scriptMethodInfo))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@@ -1055,6 +1044,50 @@ public async global::System.Threading.Tasks.Task InitAndStartAsync(global::Syste
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 生成[GlobalData]节点的方法调用
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sb_main"></param>
|
||||||
|
/// <param name="globalDataNode"></param>
|
||||||
|
/// <param name="flowContextTypeName"></param>
|
||||||
|
/// <param name="flowContext"></param>
|
||||||
|
private void CreateMethodCore_GlobalData(StringBuilder sb_main, SingleGlobalDataNode globalDataNode, string? flowContextTypeName, string flowContext)
|
||||||
|
{
|
||||||
|
if (!_globalDataInfos.TryGetValue(globalDataNode, out var globalDataInfo))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var dataSourceNode = globalDataInfo.DataSourceNode;
|
||||||
|
var returnType = dataSourceNode.MethodDetails.ReturnType;
|
||||||
|
|
||||||
|
var keyName = globalDataInfo.KeyName;
|
||||||
|
|
||||||
|
sb_main.AppendCode(2, $"[Description(\"全局数据\")]");
|
||||||
|
sb_main.AppendCode(2, $"private void {globalDataNode.ToNodeMethodName()}(global::{flowContextTypeName} {flowContext})");
|
||||||
|
sb_main.AppendCode(2, $"{{");
|
||||||
|
|
||||||
|
if (typeof(Task).IsAssignableFrom(returnType))
|
||||||
|
{
|
||||||
|
sb_main.AppendCode(3, $"await {dataSourceNode.ToNodeMethodName()}({flowContext}); // 需要立即调用指定方法");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sb_main.AppendCode(3, $"{dataSourceNode.ToNodeMethodName()}({flowContext}); // 需要立即调用指定方法");
|
||||||
|
}
|
||||||
|
var returnTypeFullName = $"global::{returnType.GetFriendlyName()}";
|
||||||
|
string data = nameof(data);
|
||||||
|
sb_main.AppendCode(3, $"{returnTypeFullName} {data} = ({returnTypeFullName}){flowContext}.{nameof(IFlowContext.GetFlowData)}(\"{dataSourceNode.Guid}\").Value; // 获取指定节点的数据");
|
||||||
|
sb_main.AppendCode(3, $"global::{typeof(SereinEnv).FullName}.{nameof(SereinEnv.AddOrUpdateFlowGlobalData)}(\"{keyName}\", {data}); // 设置全局数据");
|
||||||
|
sb_main.AppendCode(3, $"{flowContext}.{nameof(IFlowContext.AddOrUpdate)}(\"{globalDataNode.Guid}\", {data}); // 更新全局数据节点的数据");
|
||||||
|
sb_main.AppendCode(3, $"{flowContext}.{nameof(IFlowContext.AddOrUpdate)}(\"{dataSourceNode.Guid}\", {data}); // 更新全局数据节点数据来源节点的数据");
|
||||||
|
sb_main.AppendCode(2, $"}}"); // 方法结束
|
||||||
|
sb_main.AppendLine(); // 方法结束
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region 全局触发器与分支触发器生成
|
#region 全局触发器与分支触发器生成
|
||||||
@@ -1136,7 +1169,7 @@ public async global::System.Threading.Tasks.Task InitAndStartAsync(global::Syste
|
|||||||
{
|
{
|
||||||
var xmlDescription = $"{$"全局数据,来源于[{info.Node.MethodDetails?.MethodName}]{info.Node.Guid}".ToXmlComments(2)}";
|
var xmlDescription = $"{$"全局数据,来源于[{info.Node.MethodDetails?.MethodName}]{info.Node.Guid}".ToXmlComments(2)}";
|
||||||
sb.AppendCode(2, xmlDescription);
|
sb.AppendCode(2, xmlDescription);
|
||||||
sb.AppendCode(2, $"public global::{info.DataType.FullName} {info.KeyName} {{ get; set; }};");
|
sb.AppendCode(2, $"public global::{info.DataType.FullName} {info.KeyName} {{ get; set; }}");
|
||||||
}
|
}
|
||||||
sb.AppendLine();
|
sb.AppendLine();
|
||||||
sb.AppendCode(1, $"}}");
|
sb.AppendCode(1, $"}}");
|
||||||
|
|||||||
Reference in New Issue
Block a user