using System.Text.RegularExpressions; using System.Web; using Common; using Infrastructure; using Jint; using LitJson; using Model; using Model.Custom; using Model.Source; namespace Util.Logic { public class LogicNodeHelper { /// /// 如果-否则节点 /// /// 节点数据 /// 参数列表 /// 父节点参数列表 public static List ifElse(NodeList node, List paramList, List logDic) { Dictionary condi = new Dictionary(); // 条件参数字典 List ifElseResult = new List(); // 如果-否则节点结果 JsonData nodeData = node.nodeData; JsonData ifCondition = nodeData["data"]["formData"]["ifelse"]["value"]; // 如果条件 string paramAttribute = ""; if (nodeData.ToJson().Contains("\"parentNode\"")) { paramAttribute = "iterationInputField"; } else { paramAttribute = ""; } int ifIndex = 0; // 如果条件索引 foreach (JsonData item in ifCondition) { string conditionExpression = ""; // 条件表达式 string conditionExpressionLog = ""; // 条件表达式日志 string logicTag = item["logic"].ToString(); // 逻辑 JsonData conditions = item["conditions"]; // 条件 foreach (JsonData condition in conditions) { string oper = condition["operator"].ToString(); // 运算符 string value = condition["value"].ToString(); // 值 string variable = condition["variable"].ToString(); // 变量 if (variable.Contains(".")) { string nodeId = variable.Substring(0, variable.IndexOf(":")); variable = variable.Substring(variable.LastIndexOf(".") + 1); if(variable.EndsWith("_Init")) { variable = variable.Replace("_Init", ""); } ParamList param = paramList.FirstOrDefault(x => x.paramName == variable && x.nodeId == nodeId) ?? paramList.FirstOrDefault(x => x.paramName == variable) ?? new ParamList(); if (!string.IsNullOrEmpty(param.paramName)) { // string paramValue = param.paramValueTransfer; value = LogicHelper.MatchExpressionVal(value); if(value.Contains(".")) { string nId = value.Substring(0, value.IndexOf(":")); value = value.Substring(value.LastIndexOf(".") + 1); if(value.EndsWith("_Init")) { value = value.Replace("_Init", ""); } var paramc = paramList.FirstOrDefault(x => x.paramName == value && x.nodeId == nId); if (paramc != null) { value = paramc.paramValueTransfer; } } string paramType = param.paramType; conditionExpression += operatorTransfer(param, oper, value); conditionExpressionLog += operatorTransfer(param, oper, value, true); if (logicTag == "and") { conditionExpression += " && "; conditionExpressionLog += " && "; continue; } else if (logicTag == "or") { conditionExpression += " || "; conditionExpressionLog += " || "; continue; } } else { conditionExpression += "false"; // 如果参数未找到,则条件表达式为false conditionExpressionLog += "false"; // 如果参数未找到,则条件表达式为false if (logicTag == "and") { conditionExpression += " && "; conditionExpressionLog += " && "; } else if (logicTag == "or") { conditionExpression += " || "; conditionExpressionLog += " || "; } } } } if (conditionExpression.EndsWith(" && ") || conditionExpression.EndsWith(" || ")) { conditionExpression = conditionExpression.Substring(0, conditionExpression.Length - 4); } if (conditionExpressionLog.EndsWith(" && ") || conditionExpressionLog.EndsWith(" || ")) { conditionExpressionLog = conditionExpressionLog.Substring(0, conditionExpressionLog.Length - 4); } bool conditionResult = Utils.EvaluateBoolean(conditionExpression); ifElseResult.Add(conditionResult); condi.Add("条件" + ifIndex, conditionExpressionLog); condi.Add("结果" + ifIndex, conditionResult); ifIndex += 1; } // 记录日志 logDic.Add(new LogItem() { title = node.nodeData["data"]["nodeMeta"]["label"].ToString(), param = condi }); return ifElseResult; } /// /// 循环节点 /// /// 节点数据 /// 参数列表 public static List> loop(NodeList node, List paramList, List logDic) { JsonData nodeData = node.nodeData; JsonData inputField = nodeData["data"]["formData"]["loopVar"]["value"]; if(inputField.Count > 0) { string paramType = inputField[0]["type"][0].ToString(); // 字段类型 if(paramType == "array") { string paramValue = inputField[0]["value"].ToString(); // 字段值 Dictionary condi = new Dictionary(); // 条件参数字典 if(paramValue.Contains(".")) { paramValue = paramValue.Substring(paramValue.LastIndexOf(".") + 1); var param = paramList.FirstOrDefault(x => x.paramName == paramValue); if (param != null) { paramValue = param.paramValueTransfer; } } condi.Add("循环来源", paramValue); List> loopResult = Newtonsoft.Json.JsonConvert.DeserializeObject>>(paramValue) ?? new List>(); logDic.Add(new LogItem() { title = node.nodeData["data"]["nodeMeta"]["label"].ToString(), param = condi }); return loopResult; } } return new List>(); } /// /// 迭代节点 /// /// 节点数据 /// 参数列表 public static void iteration(NodeList node, List paramList, List logDic) { 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(); // 迭代字段值 var param = paramList.FirstOrDefault(x => x.paramName == inputField && x.paramAttribute == "iterationInputField"); if(param == null) { paramList.Add(new ParamList() { nodeId = node.nodeId, paramAttribute = "iterationInputField", paramName = inputFieldParam.paramName, paramType = inputFieldParam.paramType, paramValue = inputFieldParam.paramValue }); } else { param.paramName = inputFieldParam.paramName; param.paramType = inputFieldParam.paramType; param.paramValue = inputFieldParam.paramValue; } } /// /// 迭代子流程起始节点 /// /// /// public static void iterationChildStart(NodeList node, List paramList, List logDic) { Dictionary condi = new Dictionary(); // 条件参数字典 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(); // 迭代字段值 bool iterationInputFieldCheck = paramList.Any(x => x.paramName == inputField && x.paramAttribute == "iterationInputField"); if(!iterationInputFieldCheck) { paramList.Add(new ParamList() { nodeId = node.nodeId, paramAttribute = "iterationInputField", paramName = inputFieldParam.paramName, paramType = inputFieldParam.paramType, paramValue = inputFieldParam.paramValue }); condi.Add(inputFieldParam.paramName, inputFieldParam.paramValue); } logDic.Add(new LogItem() { title = node.nodeData["data"]["nodeMeta"]["label"].ToString(), param = condi }); } /// /// 跳出循环节点 /// /// /// public static void iterationBreak(NodeList node, string requestId, List logDic) { string parentNodeId = node.nodeData["parentNode"]?.ToString() ?? string.Empty; RedisServer.Cache.Set("break_" + requestId + "_" + parentNodeId, "1", 60); // 设置循环跳出标志,过期时间10分钟 logDic.Add(new LogItem() { title = node.nodeData["data"]["nodeMeta"]["label"].ToString(), detail = "跳出循环" }); } /// /// 代码执行节点 /// /// /// public static void codeExecute(NodeList node, List paramList, List logDic) { Dictionary condi = new Dictionary(); // 条件参数字典 JsonData nodeData = node.nodeData; JsonData inputParam = nodeData["data"]["formData"]["code"]["value"]["inputVar"]; // 输出参数 Dictionary inputDic = new Dictionary(); foreach (JsonData param in inputParam) { string paramName = param["label"].ToString(); // 字段名 string paramValue = param["value"].ToString(); // 字段值 if(paramValue.Contains(".")) { string nId = paramValue.Substring(0, paramValue.IndexOf(":")); paramValue = paramValue.Substring(paramValue.LastIndexOf(".") + 1); if (paramValue.EndsWith("_Init")) { paramValue = paramValue.Replace("_Init", ""); } var paramc = paramList.FirstOrDefault(x => x.paramName == paramValue && x.nodeId == nId); if (paramc != null) { paramValue = paramc.paramValueTransfer; } } inputDic.Add(paramName, paramValue); } string code = nodeData["data"]["formData"]["code"]["value"]["code"]["content"].ToString(); // 代码 JsonData outputParam = nodeData["data"]["formData"]["output"]["value"]; // 输出参数 var engine = new Engine(); MatchCollection mc = Regex.Matches(code, "\\$\\{.*?\\}"); foreach(Match m in mc) { string field = m.Value.Replace("${", "").Replace("}", ""); code = code.Replace("${" + field + "}", inputDic[field]); code = code.Replace("{" + field + "}", inputDic[field]); } engine.Execute(code); foreach (JsonData param in outputParam) { string paramName = param["label"].ToString(); // 字段名 if (paramName.EndsWith("_Init")) { paramName = paramName.Replace("_Init", ""); } string paramValue = engine.GetValue(paramName).ToString(); var paramItem = paramList.FirstOrDefault(x => x.paramName == paramName); if(paramItem != null) { Utils.WriteLog("代码执行1:" + paramValue + ";"); paramItem.paramValue = paramValue; } else { Utils.WriteLog("代码执行2:" + node.nodeId + "-" + paramValue + ";"); paramList.Add(new ParamList() { nodeId = node.nodeId, paramName = paramName, paramValue = paramValue, paramType = param["type"][0].ToString(), }); } condi.Add(paramName, paramValue); } Utils.WriteLog("代码执行:" + JsonMapper.ToJson(condi) + ";"); logDic.Add(new LogItem() { title = node.nodeData["data"]["nodeMeta"]["label"].ToString(), param = condi, detail = HttpUtility.UrlEncode(code) }); } /// /// 变量聚合节点 /// /// 节点数据 /// 参数列表 /// 父节点参数列表 public static void varAggregate(NodeList node, List paramList, List logDic) { Dictionary condi = new Dictionary(); // 条件参数字典 JsonData nodeData = node.nodeData; JsonData aggregateFields = nodeData["data"]["formData"]["output"]["value"]; // 聚合字段 string paramAttribute = ""; if (nodeData.ToJson().Contains("\"parentNode\"")) { paramAttribute = "iterationInputField"; } foreach (JsonData item in aggregateFields) { string paramName = item["label"].ToString(); // 聚合字段名 bool updateFlag = true; if(paramName.EndsWith("_Init")) { updateFlag = false; paramName = paramName.Replace("_Init", ""); } string paramValue = item["value"].ToString(); // 聚合字段值 string nId = ""; if (paramValue.Contains(":")) { nId = paramValue.Substring(0, paramValue.IndexOf(":")); } if(paramValue.Contains(".")) { paramValue = paramValue.Substring(paramValue.LastIndexOf(".") + 1); var param = paramList.FirstOrDefault(x => x.paramName == paramValue && x.nodeId == nId) ?? paramList.FirstOrDefault(x => x.paramName == paramValue) ?? new ParamList(); paramValue = param.paramValue; } string paramType = item["type"][0].ToString(); // 聚合字段类型 if(!paramList.Any(x => x.paramName == paramName && x.nodeId == nId)) { paramList.Add(new ParamList() { nodeId = node.nodeId, paramAttribute = paramAttribute, paramName = paramName, paramValue = paramValue, paramType = paramType }); condi.Add(paramName, paramValue); } else { var paramItem = paramList.FirstOrDefault(x => x.paramName == paramName && x.nodeId == nId) ?? paramList.FirstOrDefault(x => x.paramName == paramName) ?? new ParamList(); if (paramValue.StartsWith("+")) { int newValue = int.Parse(paramItem.paramValue) + int.Parse(paramValue.TrimStart('+')); paramValue = newValue.ToString(); } if(updateFlag) { paramItem.paramValue = paramValue; condi.Add(paramName, paramValue); } } } logDic.Add(new LogItem() { title = node.nodeData["data"]["nodeMeta"]["label"].ToString(), param = condi }); } /// /// 运算符转换 /// /// 运算符 /// 转换后的运算符 public static string operatorTransfer(ParamList param, string oper, string paramValue, bool isLog = false) { if(param.paramType == "number") { param.paramValue = Function.CheckNum(param.paramValue); } string condiLeftData = param.paramValue; if(isLog) { condiLeftData = param.paramName + "(" + param.paramValue + ")"; } if (oper == "equal") //等于 { if(param.paramType == "string" || param.paramType == "time") { return "'" + condiLeftData + "' == '" + paramValue + "'"; } return condiLeftData + " == " + paramValue; } else if (oper == "not_equal") //不等于 { if(param.paramType == "string" || param.paramType == "time") { return "'" + condiLeftData + "' != '" + paramValue + "'"; } return condiLeftData + " != " + paramValue; } else if (oper == "greater") //大于 { return condiLeftData + " > " + paramValue; } else if (oper == "greater_equal") //大于等于 { return condiLeftData + " >= " + paramValue; } else if (oper == "less") //小于 { return condiLeftData + " < " + paramValue; } else if (oper == "less_equal") //小于等于 { return condiLeftData + " <= " + paramValue; } else if (oper == "between") //在之间 { string[] betweenValues = paramValue.Split(','); return condiLeftData + " >= " + betweenValues[0] + " && " + condiLeftData + " <= " + betweenValues[1]; } else if (oper == "not_between") //不在之间 { string[] betweenValues = paramValue.Split(','); return "(" + condiLeftData + " < " + betweenValues[0] + " || " + condiLeftData + " > " + betweenValues[1] + ")"; } else if (oper == "contains") //包含 { return "Contains('" + condiLeftData + "', '" + paramValue + "')"; } else if (oper == "not_contains") //不包含 { return "!Contains('" + condiLeftData + "', '" + paramValue + "')"; } else if (oper == "starts_with") //以...开头 { return "StartsWith('" + condiLeftData + "', '" + paramValue + "')"; } else if (oper == "ends_with") //以...结尾 { return "EndsWith('" + condiLeftData + "', '" + paramValue + "')"; } else if (oper == "matches_regex") //匹配正则表达式 { return "Match('" + condiLeftData + "', '" + paramValue + "')"; } else if (oper == "not_matches_regex") //不匹配正则表达式 { return "!Match('" + condiLeftData + "', '" + paramValue + "')"; } else if (oper == "is_empty") { return "IsNullOrEmpty('" + condiLeftData + "')"; } else if (oper == "is_not_empty") //不为空 { return "!" + "IsNullOrEmpty('" + condiLeftData + "')"; } else if (oper == "is_null") //为空 { return "('" + condiLeftData + "'=='{}' || '" + condiLeftData + "'=='[]')"; } else if (oper == "is_not_null") //不为空 { return "('" + condiLeftData + "'!='{}' || '" + condiLeftData + "'!='[]')"; } else if (oper == "in") //在...中 { return "In('" + condiLeftData + "', '" + paramValue + "')"; } else if (oper == "not_in") //不在...中 { return "!In('" + condiLeftData + "', '" + paramValue + "')"; } else if (oper == "array_contains") //数组包含 { return "In('" + condiLeftData + "', '" + paramValue + "')"; } else if (oper == "array_not_contains") //数组不包含 { return "!In('" + condiLeftData + "', '" + paramValue + "')"; } else if (oper == "array_length_equal") //数组长度等于 { return "ArrayLen('" + condiLeftData + "') == " + paramValue; } else if (oper == "array_length_greater") { return "ArrayLen('" + condiLeftData + "') > " + paramValue; } else if (oper == "array_length_less") //数组长度小于 { return "ArrayLen('" + condiLeftData + "') < " + paramValue; } else if (oper == "is_true") //为真 { return condiLeftData + " == true"; } else if (oper == "is_false") //为假 { return condiLeftData + " == false"; } else if (oper == "date_equal") //日期等于 { return "'" + condiLeftData + "' == '" + paramValue + "'"; } else if (oper == "date_before") //日期之前 { return "'" + condiLeftData + "' < '" + paramValue + "'"; } else if (oper == "date_after") //日期之后 { return "'" + condiLeftData + "' > '" + paramValue + "'"; } else if (oper == "date_between") //日期之间 { string[] betweenValues = paramValue.Split(" - ", StringSplitOptions.None); return "'" + condiLeftData + "' >= '" + betweenValues[0] + "' && '" + condiLeftData + "' <= '" + betweenValues[1] + "'"; } return ""; } } }