using Infrastructure; using LitJson; using Model; using Model.Custom; using Model.Source; namespace Util { public class LogicNodeHelper { /// /// 如果-否则节点 /// /// 节点数据 /// 参数列表 public static List ifElse(NodeList node, List paramList) { List ifElseResult = new List(); // 如果-否则节点结果 JsonData nodeData = node.nodeData; JsonData ifCondition = nodeData["data"]["formData"]["ifelse"]["value"]; // 如果条件 int ifIndex = 0; // 如果条件索引 foreach (JsonData item in ifCondition) { string conditionExpression = ""; // 条件表达式 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(".") && variable.Contains("output")) { variable = variable.Substring(variable.LastIndexOf(".") + 1); var param = paramList.FirstOrDefault(x => x.paramName == variable); if (param != null) { string paramValue = param.paramValue; string paramType = param.paramType; conditionExpression += operatorTransfer(param, oper, paramValue); if (logicTag == "and") { conditionExpression += " && "; } else if (logicTag == "or") { conditionExpression += " || "; } } } } if (conditionExpression.EndsWith(" && ") || conditionExpression.EndsWith(" || ")) { conditionExpression = conditionExpression.Substring(0, conditionExpression.Length - 4); } ifElseResult.Add(Utils.EvaluateBoolean(conditionExpression)); ifIndex += 1; } return ifElseResult; } /// /// 数据库查询节点 /// /// 节点数据 /// 参数列表 public static void dbQuery(NodeList node, DatabaseInfo dbData, List tables, List paramList) { JsonData nodeData = node.nodeData; JsonData dbInfo = nodeData["data"]["formData"]["dbLabel"]["value"]; // 数据库查询信息 JsonData queryField = nodeData["data"]["formData"]["output"]["value"]; // 查询字段 JsonData conditions = nodeData["data"]["formData"]["ifelse"]["value"][0]["conditions"]; // 条件 JsonData sortConditions = nodeData["data"]["formData"]["sort"]["value"]; // 条件 string queryLimit = nodeData["data"]["formData"]["queryLimit"]["value"].ToString(); // 查询上限 string logicTag = nodeData["data"]["formData"]["ifelse"]["value"][0]["logic"].ToString(); // 逻辑 string queryFieldString = ""; foreach (JsonData field in queryField) { string fieldName = field["label"].ToString(); // 字段名 queryFieldString += fieldName + ","; } if(string.IsNullOrEmpty(queryFieldString)) queryFieldString = "*"; int dbTableId = int.Parse(dbInfo["dbTableId"].ToString()); // 数据库表ID var queryTable = tables.FirstOrDefault(x => x.id == dbTableId); if (queryTable != null) { string tableName = queryTable.tableName; // 数据库表名 string sql = "select " + queryFieldString.TrimEnd(',') + " from " + tableName; if (conditions.Count > 0) { sql += " where "; } foreach (JsonData condition in conditions) { string oper = condition["operator"].ToString(); // 运算符 string value = condition["value"].ToString(); // 值 string variable = condition["variable"].ToString(); // 变量 if (variable.Contains(".") && variable.Contains("output")) { variable = variable.Substring(variable.LastIndexOf(".") + 1); var param = paramList.FirstOrDefault(x => x.paramName == variable) ?? new ParamList(); string paramValue = param.paramValue; sql += operatorTransferForSql(param, oper, paramValue, variable); sql += " " + logicTag + " "; } } if (sql.EndsWith(" " + logicTag + " ")) { sql = sql.Substring(0, sql.Length - logicTag.Length - 2); } if (sortConditions.Count > 0) { sql += " order by "; foreach (JsonData sortCondition in sortConditions) { string variable = sortCondition["variable"].ToString(); // 变量 if (variable.Contains(".")) { variable = variable.Substring(variable.LastIndexOf(".") + 1); } string sort = sortCondition["sort"].ToString(); // 排序 sql += variable + " " + sort + ","; } sql = sql.TrimEnd(','); } if (!string.IsNullOrEmpty(queryLimit)) { sql += " limit " + queryLimit; } SqlSugarClient db = initDb(dbData); var items = db.Ado.GetDataTable(sql); if (items.Rows.Count > 0) { foreach (JsonData field in queryField) { string fieldName = field["label"].ToString(); // 字段名 paramList.Add(new ParamList() { nodeId = node.nodeId, paramName = fieldName, paramValue = items.Rows[0][fieldName].ToString(), paramType = field["type"][0].ToString(), }); } } } } /// /// 数据库SQL查询节点 /// /// 节点数据 /// 参数列表 public static void dbSqlQuery(NodeList node, DatabaseInfo dbData, List paramList) { JsonData nodeData = node.nodeData; JsonData dbInfo = nodeData["data"]["formData"]["dbLabel"]["value"]; // 数据库查询信息 JsonData queryField = nodeData["data"]["formData"]["output"]["value"]; // 查询字段 string sql = nodeData["data"]["formData"]["sql"]["value"]["code"]["content"].ToString(); // SQL查询语句 SqlSugarClient db = initDb(dbData); var items = db.Ado.GetDataTable(sql); if (items.Rows.Count > 0) { foreach (JsonData field in queryField) { string fieldName = field["label"].ToString(); // 字段名 paramList.Add(new ParamList() { nodeId = node.nodeId, paramName = fieldName, paramValue = items.Rows[0][fieldName].ToString(), paramType = field["type"][0].ToString(), }); } } } public static SqlSugarClient initDb(DatabaseInfo dbInfo) { string server = dbInfo.hostAddress; int port = dbInfo.port; string user = dbInfo.username; string password = dbInfo.pwd; string database = dbInfo.dbName; DbType dbType = DbType.MySql; var db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = "server=" + server + ";port=" + port + ";user=" + user + ";password=" + password + ";database=" + database + ";charset=utf8;", DbType = dbType, IsAutoCloseConnection = true, }); return db; } /// /// 运算符转换 /// /// 运算符 /// 转换后的运算符 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 ""; } /// /// 运算符转换(SQL) /// /// 运算符 /// 转换后的运算符 public static string operatorTransferForSql(ParamList param, string oper, string paramValue, string fieldName) { if (oper == "equal") //等于 { if(param.paramType == "string" || param.paramType == "time") { return fieldName + "='" + paramValue + "'"; } return fieldName + "=" + paramValue; } else if (oper == "not_equal") //不等于 { if(param.paramType == "string" || param.paramType == "time") { return fieldName + "!='" + paramValue + "'"; } return fieldName + "!=" + paramValue; } else if (oper == "greater") //大于 { return fieldName + ">" + paramValue; } else if (oper == "greater_equal") //大于等于 { return fieldName + " >= " + paramValue; } else if (oper == "less") //小于 { return fieldName + " < " + paramValue; } else if (oper == "less_equal") //小于等于 { return fieldName + " <= " + paramValue; } else if (oper == "between") //在之间 { string[] betweenValues = paramValue.Split(','); return fieldName + " >= " + betweenValues[0] + " and " + fieldName + " <= " + betweenValues[1]; } else if (oper == "not_between") //不在之间 { string[] betweenValues = paramValue.Split(','); return "(" + fieldName + " < " + betweenValues[0] + " or " + fieldName + " > " + betweenValues[1] + ")"; } else if (oper == "contains") //包含 { return fieldName + " like '%" + paramValue + "%'"; } else if (oper == "not_contains") //不包含 { return fieldName + " not like '%" + paramValue + "%'"; } else if (oper == "starts_with") //以...开头 { return fieldName + " like '" + paramValue + "%'"; } else if (oper == "ends_with") //以...结尾 { return fieldName + " like '%" + paramValue + "'"; } else if (oper == "is_empty") { return fieldName + " is null"; } else if (oper == "is_not_empty") //不为空 { return fieldName + " is not null"; } else if (oper == "is_null") //为空 { return fieldName + " is null"; } else if (oper == "is_not_null") //不为空 { return fieldName + " is not null"; } else if (oper == "in") //在...中 { if(param.paramType == "string" || param.paramType == "time") { paramValue = paramValue.Replace(",", "','"); return fieldName + " in ('" + paramValue + "')"; } return fieldName + " in (" + paramValue + ")"; } else if (oper == "not_in") //不在...中 { if(param.paramType == "string" || param.paramType == "time") { paramValue = paramValue.Replace(",", "','"); return fieldName + " in ('" + paramValue + "')"; } return fieldName + " not in (" + paramValue + ")"; } else if (oper == "array_contains") //数组包含 { if(param.paramType == "string" || param.paramType == "time") { paramValue = paramValue.Replace(",", "','"); return fieldName + " in ('" + paramValue + "')"; } return fieldName + " in (" + paramValue + ")"; } else if (oper == "array_not_contains") //数组不包含 { if(param.paramType == "string" || param.paramType == "time") { paramValue = paramValue.Replace(",", "','"); return fieldName + " not in ('" + paramValue + "')"; } return fieldName + " not in (" + paramValue + ")"; } else if (oper == "array_length_equal") //数组长度等于 { return "Length(" + fieldName + ")=" + paramValue; } else if (oper == "array_length_greater") { return "Length(" + fieldName + ") > " + paramValue; } else if (oper == "array_length_less") //数组长度小于 { return "Length(" + fieldName + ") < " + paramValue; } else if (oper == "is_true") //为真 { return fieldName + "=true"; } else if (oper == "is_false") //为假 { return fieldName + "=false"; } else if (oper == "date_equal") //日期等于 { return fieldName + "='" + paramValue + "'"; } else if (oper == "date_before") //日期之前 { return fieldName + " < '" + paramValue + "'"; } else if (oper == "date_after") //日期之后 { return fieldName + " > '" + paramValue + "'"; } else if (oper == "date_between") //日期之间 { string[] betweenValues = paramValue.Split(" - ", StringSplitOptions.None); return fieldName + " >= '" + betweenValues[0] + "' and " + fieldName + " <= '" + betweenValues[1] + "'"; } return ""; } } }