LogicNodeHelper.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. using Infrastructure;
  2. using Jint;
  3. using LitJson;
  4. using Model;
  5. using Model.Custom;
  6. using Model.Source;
  7. namespace Util.Logic
  8. {
  9. public class LogicNodeHelper
  10. {
  11. /// <summary>
  12. /// 如果-否则节点
  13. /// </summary>
  14. /// <param name="node">节点数据</param>
  15. /// <param name="paramList">参数列表</param>
  16. /// <param name="parentNodeParamList">父节点参数列表</param>
  17. public static List<bool> ifElse(NodeList node, List<ParamList> paramList)
  18. {
  19. List<bool> ifElseResult = new List<bool>(); // 如果-否则节点结果
  20. JsonData nodeData = node.nodeData;
  21. JsonData ifCondition = nodeData["data"]["formData"]["ifelse"]["value"]; // 如果条件
  22. int ifIndex = 0; // 如果条件索引
  23. foreach (JsonData item in ifCondition)
  24. {
  25. string conditionExpression = ""; // 条件表达式
  26. string logicTag = item["logic"].ToString(); // 逻辑
  27. JsonData conditions = item["conditions"]; // 条件
  28. foreach (JsonData condition in conditions)
  29. {
  30. string oper = condition["operator"].ToString(); // 运算符
  31. string value = condition["value"].ToString(); // 值
  32. string variable = condition["variable"].ToString(); // 变量
  33. if (variable.Contains(".") && variable.Contains("output"))
  34. {
  35. variable = variable.Substring(variable.LastIndexOf(".") + 1);
  36. var param = paramList.FirstOrDefault(x => x.paramName == variable);
  37. if (param != null)
  38. {
  39. string paramValue = param.paramValue;
  40. string paramType = param.paramType;
  41. conditionExpression += operatorTransfer(param, oper, paramValue);
  42. if (logicTag == "and")
  43. {
  44. conditionExpression += " && ";
  45. }
  46. else if (logicTag == "or")
  47. {
  48. conditionExpression += " || ";
  49. }
  50. }
  51. }
  52. }
  53. if (conditionExpression.EndsWith(" && ") || conditionExpression.EndsWith(" || "))
  54. {
  55. conditionExpression = conditionExpression.Substring(0, conditionExpression.Length - 4);
  56. }
  57. ifElseResult.Add(Utils.EvaluateBoolean(conditionExpression));
  58. ifIndex += 1;
  59. }
  60. return ifElseResult;
  61. }
  62. /// <summary>
  63. /// 循环节点
  64. /// </summary>
  65. /// <param name="node">节点数据</param>
  66. /// <param name="paramList">参数列表</param>
  67. public static List<ParamList> loop(NodeList node, List<ParamList> paramList)
  68. {
  69. return iterationChildStart(node, paramList);
  70. }
  71. /// <summary>
  72. /// 迭代节点
  73. /// </summary>
  74. /// <param name="node">节点数据</param>
  75. /// <param name="paramList">参数列表</param>
  76. public static List<ParamList> iteration(NodeList node, List<ParamList> paramList)
  77. {
  78. JsonData nodeData = node.nodeData;
  79. string inputField = nodeData["data"]["formData"]["input"]["value"]?.ToString() ?? string.Empty; // 迭代字段
  80. inputField = inputField.Substring(inputField.LastIndexOf(".") + 1);
  81. ParamList inputFieldParam = paramList.FirstOrDefault(x => x.paramName == inputField) ?? new ParamList(); // 迭代字段值
  82. List<ParamList> paramListObj = new List<ParamList>();
  83. paramListObj.Add(new ParamList()
  84. {
  85. nodeId = node.nodeId,
  86. paramName = inputFieldParam.paramName,
  87. paramType = inputFieldParam.paramType,
  88. paramValue = inputFieldParam.paramValue
  89. });
  90. paramListObj.Add(new ParamList()
  91. {
  92. nodeId = node.nodeId,
  93. paramName = "nodeId",
  94. paramType = "string",
  95. paramValue = node.nodeId
  96. });
  97. return paramListObj;
  98. }
  99. /// <summary>
  100. /// 迭代子流程起始节点
  101. /// </summary>
  102. /// <param name="node"></param>
  103. /// <param name="paramList"></param>
  104. public static List<ParamList> iterationChildStart(NodeList node, List<ParamList> paramList)
  105. {
  106. JsonData nodeData = node.nodeData;
  107. string inputField = nodeData["data"]["formData"][node.nodeId]["value"]?.ToString() ?? string.Empty; // 迭代字段
  108. inputField = inputField.Substring(inputField.LastIndexOf(".") + 1);
  109. ParamList inputFieldParam = paramList.FirstOrDefault(x => x.paramName == inputField) ?? new ParamList(); // 迭代字段值
  110. List<ParamList> paramListObj = new List<ParamList>();
  111. paramListObj.Add(new ParamList()
  112. {
  113. nodeId = node.nodeId,
  114. paramAttribute = "iterationInputField",
  115. paramName = inputFieldParam.paramName,
  116. paramType = inputFieldParam.paramType,
  117. paramValue = inputFieldParam.paramValue
  118. });
  119. return paramListObj;
  120. }
  121. /// <summary>
  122. /// 跳出循环节点
  123. /// </summary>
  124. /// <param name="node"></param>
  125. /// <param name="paramList"></param>
  126. public static void iterationBreak(NodeList node, List<ParamList> paramList)
  127. {
  128. }
  129. /// <summary>
  130. /// 代码执行节点
  131. /// </summary>
  132. /// <param name="node"></param>
  133. /// <param name="paramList"></param>
  134. public static void codeExecute(NodeList node, List<ParamList> paramList)
  135. {
  136. JsonData nodeData = node.nodeData;
  137. string code = nodeData["data"]["formData"]["code"]["value"]["code"]["content"].ToString(); // 代码
  138. JsonData outputParam = nodeData["data"]["formData"]["output"]["value"]; // 输出参数
  139. var engine = new Engine();
  140. engine.Execute(code);
  141. foreach (JsonData param in outputParam)
  142. {
  143. string paramName = param["label"].ToString(); // 字段名
  144. paramList.Add(new ParamList()
  145. {
  146. nodeId = node.nodeId,
  147. paramName = paramName,
  148. paramValue = engine.GetValue(paramName).ToString(),
  149. paramType = param["type"][0].ToString(),
  150. });
  151. }
  152. }
  153. /// <summary>
  154. /// 运算符转换
  155. /// </summary>
  156. /// <param name="oper">运算符</param>
  157. /// <returns>转换后的运算符</returns>
  158. public static string operatorTransfer(ParamList param, string oper, string paramValue)
  159. {
  160. if (oper == "equal") //等于
  161. {
  162. if(param.paramType == "string" || param.paramType == "time")
  163. {
  164. return "'" + param.paramValue + "' == '" + paramValue + "'";
  165. }
  166. return param.paramValue + " == " + paramValue;
  167. }
  168. else if (oper == "not_equal") //不等于
  169. {
  170. if(param.paramType == "string" || param.paramType == "time")
  171. {
  172. return "'" + param.paramValue + "' != '" + paramValue + "'";
  173. }
  174. return param.paramValue + " != " + paramValue;
  175. }
  176. else if (oper == "greater") //大于
  177. {
  178. return param.paramValue + " > " + paramValue;
  179. }
  180. else if (oper == "greater_equal") //大于等于
  181. {
  182. return param.paramValue + " >= " + paramValue;
  183. }
  184. else if (oper == "less") //小于
  185. {
  186. return param.paramValue + " < " + paramValue;
  187. }
  188. else if (oper == "less_equal") //小于等于
  189. {
  190. return param.paramValue + " <= " + paramValue;
  191. }
  192. else if (oper == "between") //在之间
  193. {
  194. string[] betweenValues = paramValue.Split(',');
  195. return param.paramValue + " >= " + betweenValues[0] + " && " + param.paramValue + " <= " + betweenValues[1];
  196. }
  197. else if (oper == "not_between") //不在之间
  198. {
  199. string[] betweenValues = paramValue.Split(',');
  200. return "(" + param.paramValue + " < " + betweenValues[0] + " || " + param.paramValue + " > " + betweenValues[1] + ")";
  201. }
  202. else if (oper == "contains") //包含
  203. {
  204. return "Contains('" + param.paramValue + "', '" + paramValue + "')";
  205. }
  206. else if (oper == "not_contains") //不包含
  207. {
  208. return "!Contains('" + param.paramValue + "', '" + paramValue + "')";
  209. }
  210. else if (oper == "starts_with") //以...开头
  211. {
  212. return "StartsWith('" + param.paramValue + "', '" + paramValue + "')";
  213. }
  214. else if (oper == "ends_with") //以...结尾
  215. {
  216. return "EndsWith('" + param.paramValue + "', '" + paramValue + "')";
  217. }
  218. else if (oper == "matches_regex") //匹配正则表达式
  219. {
  220. return "Match('" + param.paramValue + "', '" + paramValue + "')";
  221. }
  222. else if (oper == "not_matches_regex") //不匹配正则表达式
  223. {
  224. return "!Match('" + param.paramValue + "', '" + paramValue + "')";
  225. }
  226. else if (oper == "is_empty")
  227. {
  228. return "IsNullOrEmpty('" + param.paramValue + "')";
  229. }
  230. else if (oper == "is_not_empty") //不为空
  231. {
  232. return "!" + "IsNullOrEmpty('" + param.paramValue + "')";
  233. }
  234. else if (oper == "is_null") //为空
  235. {
  236. return "('" + param.paramValue + "'=='{}' || '" + param.paramValue + "'=='[]')";
  237. }
  238. else if (oper == "is_not_null") //不为空
  239. {
  240. return "('" + param.paramValue + "'!='{}' || '" + param.paramValue + "'!='[]')";
  241. }
  242. else if (oper == "in") //在...中
  243. {
  244. return "In('" + param.paramValue + "', '" + paramValue + "')";
  245. }
  246. else if (oper == "not_in") //不在...中
  247. {
  248. return "!In('" + param.paramValue + "', '" + paramValue + "')";
  249. }
  250. else if (oper == "array_contains") //数组包含
  251. {
  252. return "In('" + param.paramValue + "', '" + paramValue + "')";
  253. }
  254. else if (oper == "array_not_contains") //数组不包含
  255. {
  256. return "!In('" + param.paramValue + "', '" + paramValue + "')";
  257. }
  258. else if (oper == "array_length_equal") //数组长度等于
  259. {
  260. return "ArrayLen('" + param.paramValue + "') == " + paramValue;
  261. }
  262. else if (oper == "array_length_greater")
  263. {
  264. return "ArrayLen('" + param.paramValue + "') > " + paramValue;
  265. }
  266. else if (oper == "array_length_less") //数组长度小于
  267. {
  268. return "ArrayLen('" + param.paramValue + "') < " + paramValue;
  269. }
  270. else if (oper == "is_true") //为真
  271. {
  272. return param.paramValue + " == true";
  273. }
  274. else if (oper == "is_false") //为假
  275. {
  276. return param.paramValue + " == false";
  277. }
  278. else if (oper == "date_equal") //日期等于
  279. {
  280. return "'" + param.paramValue + "' == '" + paramValue + "'";
  281. }
  282. else if (oper == "date_before") //日期之前
  283. {
  284. return "'" + param.paramValue + "' < '" + paramValue + "'";
  285. }
  286. else if (oper == "date_after") //日期之后
  287. {
  288. return "'" + param.paramValue + "' > '" + paramValue + "'";
  289. }
  290. else if (oper == "date_between") //日期之间
  291. {
  292. string[] betweenValues = paramValue.Split(" - ", StringSplitOptions.None);
  293. return "'" + param.paramValue + "' >= '" + betweenValues[0] + "' && '" + param.paramValue + "' <= '" + betweenValues[1] + "'";
  294. }
  295. return "";
  296. }
  297. }
  298. }