|
@@ -0,0 +1,291 @@
|
|
|
|
|
+using Infrastructure;
|
|
|
|
|
+using Jint;
|
|
|
|
|
+using LitJson;
|
|
|
|
|
+using Model;
|
|
|
|
|
+using Model.Custom;
|
|
|
|
|
+using Model.Source;
|
|
|
|
|
+
|
|
|
|
|
+namespace Util.Logic
|
|
|
|
|
+{
|
|
|
|
|
+ public class LogicBasicNodeHelper
|
|
|
|
|
+ {
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 如果-否则节点
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="node">节点数据</param>
|
|
|
|
|
+ /// <param name="paramList">参数列表</param>
|
|
|
|
|
+ /// <param name="parentNodeParamList">父节点参数列表</param>
|
|
|
|
|
+ public static void end(NodeList node, List<ParamList> paramList)
|
|
|
|
|
+ {
|
|
|
|
|
+ JsonData nodeData = node.nodeData;
|
|
|
|
|
+ JsonData outputParam = nodeData["data"]["formData"]["output"]["value"]; // 输出参数
|
|
|
|
|
+ foreach (JsonData item in outputParam)
|
|
|
|
|
+ {
|
|
|
|
|
+ string paramName = item["label"].ToString(); // 参数名
|
|
|
|
|
+ string paramValue = item["value"].ToString(); // 参数值
|
|
|
|
|
+ string paramType = item["type"][0].ToString(); // 参数类型
|
|
|
|
|
+ if(paramValue.Contains("."))
|
|
|
|
|
+ {
|
|
|
|
|
+ paramValue = paramValue.Substring(paramValue.LastIndexOf(".") + 1);
|
|
|
|
|
+ var param = paramList.FirstOrDefault(x => x.paramName == paramValue);
|
|
|
|
|
+ if (param != null)
|
|
|
|
|
+ {
|
|
|
|
|
+ param.paramAttribute = "endoutput";
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ paramList.Add(new ParamList()
|
|
|
|
|
+ {
|
|
|
|
|
+ nodeId = node.nodeId,
|
|
|
|
|
+ paramAttribute = "endoutput",
|
|
|
|
|
+ paramName = paramName,
|
|
|
|
|
+ paramType = paramType,
|
|
|
|
|
+ paramValue = paramValue
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 循环节点
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="node">节点数据</param>
|
|
|
|
|
+ /// <param name="paramList">参数列表</param>
|
|
|
|
|
+ public static List<ParamList> loop(NodeList node, List<ParamList> paramList)
|
|
|
|
|
+ {
|
|
|
|
|
+ return iterationChildStart(node, paramList);
|
|
|
|
|
+ }
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 迭代节点
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="node">节点数据</param>
|
|
|
|
|
+ /// <param name="paramList">参数列表</param>
|
|
|
|
|
+ public static List<ParamList> iteration(NodeList node, List<ParamList> paramList)
|
|
|
|
|
+ {
|
|
|
|
|
+ JsonData nodeData = node.nodeData;
|
|
|
|
|
+ string inputField = nodeData["data"]["formData"]["input"]["value"]?.ToString() ?? string.Empty; // 迭代字段
|
|
|
|
|
+ inputField = inputField.Substring(inputField.LastIndexOf(".") + 1);
|
|
|
|
|
+ ParamList inputFieldParam = paramList.FirstOrDefault(x => x.paramName == inputField) ?? new ParamList(); // 迭代字段值
|
|
|
|
|
+ List<ParamList> paramListObj = new List<ParamList>();
|
|
|
|
|
+ paramListObj.Add(new ParamList()
|
|
|
|
|
+ {
|
|
|
|
|
+ nodeId = node.nodeId,
|
|
|
|
|
+ paramName = inputFieldParam.paramName,
|
|
|
|
|
+ paramType = inputFieldParam.paramType,
|
|
|
|
|
+ paramValue = inputFieldParam.paramValue
|
|
|
|
|
+ });
|
|
|
|
|
+ paramListObj.Add(new ParamList()
|
|
|
|
|
+ {
|
|
|
|
|
+ nodeId = node.nodeId,
|
|
|
|
|
+ paramName = "nodeId",
|
|
|
|
|
+ paramType = "string",
|
|
|
|
|
+ paramValue = node.nodeId
|
|
|
|
|
+ });
|
|
|
|
|
+ return paramListObj;
|
|
|
|
|
+ }
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 迭代子流程起始节点
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="node"></param>
|
|
|
|
|
+ /// <param name="paramList"></param>
|
|
|
|
|
+ public static List<ParamList> iterationChildStart(NodeList node, List<ParamList> paramList)
|
|
|
|
|
+ {
|
|
|
|
|
+ JsonData nodeData = node.nodeData;
|
|
|
|
|
+ string inputField = nodeData["data"]["formData"][node.nodeId]["value"]?.ToString() ?? string.Empty; // 迭代字段
|
|
|
|
|
+ inputField = inputField.Substring(inputField.LastIndexOf(".") + 1);
|
|
|
|
|
+ ParamList inputFieldParam = paramList.FirstOrDefault(x => x.paramName == inputField) ?? new ParamList(); // 迭代字段值
|
|
|
|
|
+ List<ParamList> paramListObj = new List<ParamList>();
|
|
|
|
|
+ paramListObj.Add(new ParamList()
|
|
|
|
|
+ {
|
|
|
|
|
+ nodeId = node.nodeId,
|
|
|
|
|
+ paramAttribute = "iterationInputField",
|
|
|
|
|
+ paramName = inputFieldParam.paramName,
|
|
|
|
|
+ paramType = inputFieldParam.paramType,
|
|
|
|
|
+ paramValue = inputFieldParam.paramValue
|
|
|
|
|
+ });
|
|
|
|
|
+ return paramListObj;
|
|
|
|
|
+ }
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 跳出循环节点
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="node"></param>
|
|
|
|
|
+ /// <param name="paramList"></param>
|
|
|
|
|
+ public static void iterationBreak(NodeList node, List<ParamList> paramList)
|
|
|
|
|
+ {
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 代码执行节点
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="node"></param>
|
|
|
|
|
+ /// <param name="paramList"></param>
|
|
|
|
|
+ public static void codeExecute(NodeList node, List<ParamList> paramList)
|
|
|
|
|
+ {
|
|
|
|
|
+ JsonData nodeData = node.nodeData;
|
|
|
|
|
+ string code = nodeData["data"]["formData"]["code"]["value"]["code"]["content"].ToString(); // 代码
|
|
|
|
|
+ JsonData outputParam = nodeData["data"]["formData"]["output"]["value"]; // 输出参数
|
|
|
|
|
+ var engine = new Engine();
|
|
|
|
|
+ engine.Execute(code);
|
|
|
|
|
+ foreach (JsonData param in outputParam)
|
|
|
|
|
+ {
|
|
|
|
|
+ string paramName = param["label"].ToString(); // 字段名
|
|
|
|
|
+ paramList.Add(new ParamList()
|
|
|
|
|
+ {
|
|
|
|
|
+ nodeId = node.nodeId,
|
|
|
|
|
+ paramName = paramName,
|
|
|
|
|
+ paramValue = engine.GetValue(paramName).ToString(),
|
|
|
|
|
+ paramType = param["type"][0].ToString(),
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 运算符转换
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="oper">运算符</param>
|
|
|
|
|
+ /// <returns>转换后的运算符</returns>
|
|
|
|
|
+ public static string operatorTransfer(ParamList param, string oper, string paramValue)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (oper == "equal") //等于
|
|
|
|
|
+ {
|
|
|
|
|
+ if(param.paramType == "string" || param.paramType == "time")
|
|
|
|
|
+ {
|
|
|
|
|
+ return "'" + param.paramValue + "' == '" + paramValue + "'";
|
|
|
|
|
+ }
|
|
|
|
|
+ return param.paramValue + " == " + paramValue;
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "not_equal") //不等于
|
|
|
|
|
+ {
|
|
|
|
|
+ if(param.paramType == "string" || param.paramType == "time")
|
|
|
|
|
+ {
|
|
|
|
|
+ return "'" + param.paramValue + "' != '" + paramValue + "'";
|
|
|
|
|
+ }
|
|
|
|
|
+ return param.paramValue + " != " + paramValue;
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "greater") //大于
|
|
|
|
|
+ {
|
|
|
|
|
+ return param.paramValue + " > " + paramValue;
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "greater_equal") //大于等于
|
|
|
|
|
+ {
|
|
|
|
|
+ return param.paramValue + " >= " + paramValue;
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "less") //小于
|
|
|
|
|
+ {
|
|
|
|
|
+ return param.paramValue + " < " + paramValue;
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "less_equal") //小于等于
|
|
|
|
|
+ {
|
|
|
|
|
+ return param.paramValue + " <= " + paramValue;
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "between") //在之间
|
|
|
|
|
+ {
|
|
|
|
|
+ string[] betweenValues = paramValue.Split(',');
|
|
|
|
|
+ return param.paramValue + " >= " + betweenValues[0] + " && " + param.paramValue + " <= " + betweenValues[1];
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "not_between") //不在之间
|
|
|
|
|
+ {
|
|
|
|
|
+ string[] betweenValues = paramValue.Split(',');
|
|
|
|
|
+ return "(" + param.paramValue + " < " + betweenValues[0] + " || " + param.paramValue + " > " + betweenValues[1] + ")";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "contains") //包含
|
|
|
|
|
+ {
|
|
|
|
|
+ return "Contains('" + param.paramValue + "', '" + paramValue + "')";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "not_contains") //不包含
|
|
|
|
|
+ {
|
|
|
|
|
+ return "!Contains('" + param.paramValue + "', '" + paramValue + "')";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "starts_with") //以...开头
|
|
|
|
|
+ {
|
|
|
|
|
+ return "StartsWith('" + param.paramValue + "', '" + paramValue + "')";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "ends_with") //以...结尾
|
|
|
|
|
+ {
|
|
|
|
|
+ return "EndsWith('" + param.paramValue + "', '" + paramValue + "')";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "matches_regex") //匹配正则表达式
|
|
|
|
|
+ {
|
|
|
|
|
+ return "Match('" + param.paramValue + "', '" + paramValue + "')";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "not_matches_regex") //不匹配正则表达式
|
|
|
|
|
+ {
|
|
|
|
|
+ return "!Match('" + param.paramValue + "', '" + paramValue + "')";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "is_empty")
|
|
|
|
|
+ {
|
|
|
|
|
+ return "IsNullOrEmpty('" + param.paramValue + "')";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "is_not_empty") //不为空
|
|
|
|
|
+ {
|
|
|
|
|
+ return "!" + "IsNullOrEmpty('" + param.paramValue + "')";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "is_null") //为空
|
|
|
|
|
+ {
|
|
|
|
|
+ return "('" + param.paramValue + "'=='{}' || '" + param.paramValue + "'=='[]')";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "is_not_null") //不为空
|
|
|
|
|
+ {
|
|
|
|
|
+ return "('" + param.paramValue + "'!='{}' || '" + param.paramValue + "'!='[]')";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "in") //在...中
|
|
|
|
|
+ {
|
|
|
|
|
+ return "In('" + param.paramValue + "', '" + paramValue + "')";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "not_in") //不在...中
|
|
|
|
|
+ {
|
|
|
|
|
+ return "!In('" + param.paramValue + "', '" + paramValue + "')";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "array_contains") //数组包含
|
|
|
|
|
+ {
|
|
|
|
|
+ return "In('" + param.paramValue + "', '" + paramValue + "')";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "array_not_contains") //数组不包含
|
|
|
|
|
+ {
|
|
|
|
|
+ return "!In('" + param.paramValue + "', '" + paramValue + "')";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "array_length_equal") //数组长度等于
|
|
|
|
|
+ {
|
|
|
|
|
+ return "ArrayLen('" + param.paramValue + "') == " + paramValue;
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "array_length_greater")
|
|
|
|
|
+ {
|
|
|
|
|
+ return "ArrayLen('" + param.paramValue + "') > " + paramValue;
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "array_length_less") //数组长度小于
|
|
|
|
|
+ {
|
|
|
|
|
+ return "ArrayLen('" + param.paramValue + "') < " + paramValue;
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "is_true") //为真
|
|
|
|
|
+ {
|
|
|
|
|
+ return param.paramValue + " == true";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "is_false") //为假
|
|
|
|
|
+ {
|
|
|
|
|
+ return param.paramValue + " == false";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "date_equal") //日期等于
|
|
|
|
|
+ {
|
|
|
|
|
+ return "'" + param.paramValue + "' == '" + paramValue + "'";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "date_before") //日期之前
|
|
|
|
|
+ {
|
|
|
|
|
+ return "'" + param.paramValue + "' < '" + paramValue + "'";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "date_after") //日期之后
|
|
|
|
|
+ {
|
|
|
|
|
+ return "'" + param.paramValue + "' > '" + paramValue + "'";
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (oper == "date_between") //日期之间
|
|
|
|
|
+ {
|
|
|
|
|
+ string[] betweenValues = paramValue.Split(" - ", StringSplitOptions.None);
|
|
|
|
|
+ return "'" + param.paramValue + "' >= '" + betweenValues[0] + "' && '" + param.paramValue + "' <= '" + betweenValues[1] + "'";
|
|
|
|
|
+ }
|
|
|
|
|
+ return "";
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+}
|