|
@@ -4,67 +4,19 @@ using Model;
|
|
|
using Model.Custom;
|
|
using Model.Custom;
|
|
|
using Model.Source;
|
|
using Model.Source;
|
|
|
|
|
|
|
|
-namespace Util
|
|
|
|
|
|
|
+namespace Util.Logic
|
|
|
{
|
|
{
|
|
|
- public class LogicNodeHelper
|
|
|
|
|
|
|
+ public class LogicDatabaseNodeHelper
|
|
|
{
|
|
{
|
|
|
- /// <summary>
|
|
|
|
|
- /// 如果-否则节点
|
|
|
|
|
- /// </summary>
|
|
|
|
|
- /// <param name="node">节点数据</param>
|
|
|
|
|
- /// <param name="paramList">参数列表</param>
|
|
|
|
|
- public static List<bool> ifElse(NodeList node, List<ParamList> paramList)
|
|
|
|
|
- {
|
|
|
|
|
- List<bool> ifElseResult = new List<bool>(); // 如果-否则节点结果
|
|
|
|
|
- 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;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// 数据库查询节点
|
|
/// 数据库查询节点
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
/// <param name="node">节点数据</param>
|
|
/// <param name="node">节点数据</param>
|
|
|
|
|
+ /// <param name="dbData">数据库信息</param>
|
|
|
|
|
+ /// <param name="tables">数据库表列表</param>
|
|
|
/// <param name="paramList">参数列表</param>
|
|
/// <param name="paramList">参数列表</param>
|
|
|
- public static void dbQuery(NodeList node, DatabaseInfo dbData, List<DatabaseTable> tables, List<ParamList> paramList)
|
|
|
|
|
|
|
+ /// <param name="parentNodeParamList">父节点参数列表</param>
|
|
|
|
|
+ public static void dbQuery(NodeList node, List<DatabaseInfo> databaseInfos, List<DatabaseTable> tables, List<ParamList> paramList)
|
|
|
{
|
|
{
|
|
|
JsonData nodeData = node.nodeData;
|
|
JsonData nodeData = node.nodeData;
|
|
|
JsonData dbInfo = nodeData["data"]["formData"]["dbLabel"]["value"]; // 数据库查询信息
|
|
JsonData dbInfo = nodeData["data"]["formData"]["dbLabel"]["value"]; // 数据库查询信息
|
|
@@ -80,11 +32,12 @@ namespace Util
|
|
|
queryFieldString += fieldName + ",";
|
|
queryFieldString += fieldName + ",";
|
|
|
}
|
|
}
|
|
|
if(string.IsNullOrEmpty(queryFieldString)) queryFieldString = "*";
|
|
if(string.IsNullOrEmpty(queryFieldString)) queryFieldString = "*";
|
|
|
|
|
+ int dbId = int.Parse(dbInfo["dbId"].ToString()); // 数据库ID
|
|
|
int dbTableId = int.Parse(dbInfo["dbTableId"].ToString()); // 数据库表ID
|
|
int dbTableId = int.Parse(dbInfo["dbTableId"].ToString()); // 数据库表ID
|
|
|
var queryTable = tables.FirstOrDefault(x => x.id == dbTableId);
|
|
var queryTable = tables.FirstOrDefault(x => x.id == dbTableId);
|
|
|
if (queryTable != null)
|
|
if (queryTable != null)
|
|
|
{
|
|
{
|
|
|
- string tableName = queryTable.tableName; // 数据库表名
|
|
|
|
|
|
|
+ string tableName = queryTable.tableName ?? string.Empty; // 数据库表名
|
|
|
string sql = "select " + queryFieldString.TrimEnd(',') + " from " + tableName;
|
|
string sql = "select " + queryFieldString.TrimEnd(',') + " from " + tableName;
|
|
|
if (conditions.Count > 0)
|
|
if (conditions.Count > 0)
|
|
|
{
|
|
{
|
|
@@ -127,20 +80,31 @@ namespace Util
|
|
|
{
|
|
{
|
|
|
sql += " limit " + queryLimit;
|
|
sql += " limit " + queryLimit;
|
|
|
}
|
|
}
|
|
|
- SqlSugarClient db = initDb(dbData);
|
|
|
|
|
|
|
+ SqlSugarClient db = initDb(databaseInfos.FirstOrDefault(x => x.id == dbId) ?? new DatabaseInfo());
|
|
|
var items = db.Ado.GetDataTable(sql);
|
|
var items = db.Ado.GetDataTable(sql);
|
|
|
if (items.Rows.Count > 0)
|
|
if (items.Rows.Count > 0)
|
|
|
{
|
|
{
|
|
|
foreach (JsonData field in queryField)
|
|
foreach (JsonData field in queryField)
|
|
|
{
|
|
{
|
|
|
string fieldName = field["label"].ToString(); // 字段名
|
|
string fieldName = field["label"].ToString(); // 字段名
|
|
|
- paramList.Add(new ParamList()
|
|
|
|
|
|
|
+ if (nodeData.ToJson().Contains("\"parentNode\""))
|
|
|
|
|
+ {
|
|
|
|
|
+ var parentParam = paramList.FirstOrDefault(x => x.paramName == fieldName && x.paramAttribute == "iterationInputField");
|
|
|
|
|
+ if(parentParam != null)
|
|
|
|
|
+ {
|
|
|
|
|
+ parentParam.paramValue = items.Rows[0][fieldName]?.ToString() ?? string.Empty;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
{
|
|
{
|
|
|
- nodeId = node.nodeId,
|
|
|
|
|
- paramName = fieldName,
|
|
|
|
|
- paramValue = items.Rows[0][fieldName].ToString(),
|
|
|
|
|
- paramType = field["type"][0].ToString(),
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ paramList.Add(new ParamList()
|
|
|
|
|
+ {
|
|
|
|
|
+ nodeId = node.nodeId,
|
|
|
|
|
+ paramName = fieldName,
|
|
|
|
|
+ paramValue = items.Rows[0][fieldName]?.ToString() ?? string.Empty,
|
|
|
|
|
+ paramType = field["type"][0].ToString(),
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -150,38 +114,52 @@ namespace Util
|
|
|
/// 数据库SQL查询节点
|
|
/// 数据库SQL查询节点
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
/// <param name="node">节点数据</param>
|
|
/// <param name="node">节点数据</param>
|
|
|
|
|
+ /// <param name="dbData">数据库信息</param>
|
|
|
/// <param name="paramList">参数列表</param>
|
|
/// <param name="paramList">参数列表</param>
|
|
|
- public static void dbSqlQuery(NodeList node, DatabaseInfo dbData, List<ParamList> paramList)
|
|
|
|
|
|
|
+ /// <param name="parentNodeParamList">父节点参数列表</param>
|
|
|
|
|
+ public static void dbSqlQuery(NodeList node, List<DatabaseInfo> databaseInfos, List<ParamList> paramList)
|
|
|
{
|
|
{
|
|
|
JsonData nodeData = node.nodeData;
|
|
JsonData nodeData = node.nodeData;
|
|
|
JsonData dbInfo = nodeData["data"]["formData"]["dbLabel"]["value"]; // 数据库查询信息
|
|
JsonData dbInfo = nodeData["data"]["formData"]["dbLabel"]["value"]; // 数据库查询信息
|
|
|
JsonData queryField = nodeData["data"]["formData"]["output"]["value"]; // 查询字段
|
|
JsonData queryField = nodeData["data"]["formData"]["output"]["value"]; // 查询字段
|
|
|
string sql = nodeData["data"]["formData"]["sql"]["value"]["code"]["content"].ToString(); // SQL查询语句
|
|
string sql = nodeData["data"]["formData"]["sql"]["value"]["code"]["content"].ToString(); // SQL查询语句
|
|
|
- SqlSugarClient db = initDb(dbData);
|
|
|
|
|
|
|
+ int dbId = int.Parse(dbInfo["dbId"].ToString()); // 数据库ID
|
|
|
|
|
+ SqlSugarClient db = initDb(databaseInfos.FirstOrDefault(x => x.id == dbId) ?? new DatabaseInfo());
|
|
|
var items = db.Ado.GetDataTable(sql);
|
|
var items = db.Ado.GetDataTable(sql);
|
|
|
if (items.Rows.Count > 0)
|
|
if (items.Rows.Count > 0)
|
|
|
{
|
|
{
|
|
|
foreach (JsonData field in queryField)
|
|
foreach (JsonData field in queryField)
|
|
|
{
|
|
{
|
|
|
string fieldName = field["label"].ToString(); // 字段名
|
|
string fieldName = field["label"].ToString(); // 字段名
|
|
|
- paramList.Add(new ParamList()
|
|
|
|
|
|
|
+ if (nodeData.ToJson().Contains("\"parentNode\""))
|
|
|
|
|
+ {
|
|
|
|
|
+ var parentParam = paramList.FirstOrDefault(x => x.paramName == fieldName && x.paramAttribute == "iterationInputField");
|
|
|
|
|
+ if(parentParam != null)
|
|
|
|
|
+ {
|
|
|
|
|
+ parentParam.paramValue = items.Rows[0][fieldName]?.ToString() ?? string.Empty;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
{
|
|
{
|
|
|
- nodeId = node.nodeId,
|
|
|
|
|
- paramName = fieldName,
|
|
|
|
|
- paramValue = items.Rows[0][fieldName].ToString(),
|
|
|
|
|
- paramType = field["type"][0].ToString(),
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ paramList.Add(new ParamList()
|
|
|
|
|
+ {
|
|
|
|
|
+ nodeId = node.nodeId,
|
|
|
|
|
+ paramName = fieldName,
|
|
|
|
|
+ paramValue = items.Rows[0][fieldName]?.ToString() ?? string.Empty,
|
|
|
|
|
+ paramType = field["type"][0].ToString(),
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public static SqlSugarClient initDb(DatabaseInfo dbInfo)
|
|
public static SqlSugarClient initDb(DatabaseInfo dbInfo)
|
|
|
{
|
|
{
|
|
|
- string server = dbInfo.hostAddress;
|
|
|
|
|
|
|
+ string server = dbInfo.hostAddress ?? string.Empty;
|
|
|
int port = dbInfo.port;
|
|
int port = dbInfo.port;
|
|
|
- string user = dbInfo.username;
|
|
|
|
|
- string password = dbInfo.pwd;
|
|
|
|
|
- string database = dbInfo.dbName;
|
|
|
|
|
|
|
+ string user = dbInfo.username ?? string.Empty;
|
|
|
|
|
+ string password = dbInfo.pwd ?? string.Empty;
|
|
|
|
|
+ string database = dbInfo.dbName ?? string.Empty;
|
|
|
DbType dbType = DbType.MySql;
|
|
DbType dbType = DbType.MySql;
|
|
|
var db = new SqlSugarClient(new ConnectionConfig()
|
|
var db = new SqlSugarClient(new ConnectionConfig()
|
|
|
{
|
|
{
|
|
@@ -192,151 +170,6 @@ namespace Util
|
|
|
return db;
|
|
return db;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /// <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 "";
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// 运算符转换(SQL)
|
|
/// 运算符转换(SQL)
|
|
|
/// </summary>
|
|
/// </summary>
|