LogicNodeHelper.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  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> iteration(NodeList node, List<ParamList> paramList)
  68. {
  69. JsonData nodeData = node.nodeData;
  70. string inputField = nodeData["data"]["formData"]["input"]["value"]?.ToString() ?? string.Empty; // 迭代字段
  71. inputField = inputField.Substring(inputField.LastIndexOf(".") + 1);
  72. ParamList inputFieldParam = paramList.FirstOrDefault(x => x.paramName == inputField) ?? new ParamList(); // 迭代字段值
  73. List<ParamList> paramListObj = new List<ParamList>();
  74. paramListObj.Add(new ParamList()
  75. {
  76. nodeId = node.nodeId,
  77. paramName = inputFieldParam.paramName,
  78. paramType = inputFieldParam.paramType,
  79. paramValue = inputFieldParam.paramValue
  80. });
  81. paramListObj.Add(new ParamList()
  82. {
  83. nodeId = node.nodeId,
  84. paramName = "nodeId",
  85. paramType = "string",
  86. paramValue = node.nodeId
  87. });
  88. return paramListObj;
  89. }
  90. /// <summary>
  91. /// 迭代子流程起始节点
  92. /// </summary>
  93. /// <param name="node"></param>
  94. /// <param name="paramList"></param>
  95. public static List<ParamList> iterationChildStart(NodeList node, List<ParamList> paramList)
  96. {
  97. JsonData nodeData = node.nodeData;
  98. string inputField = nodeData["data"]["formData"][node.nodeId]["value"]?.ToString() ?? string.Empty; // 迭代字段
  99. inputField = inputField.Substring(inputField.LastIndexOf(".") + 1);
  100. ParamList inputFieldParam = paramList.FirstOrDefault(x => x.paramName == inputField) ?? new ParamList(); // 迭代字段值
  101. List<ParamList> paramListObj = new List<ParamList>();
  102. paramListObj.Add(new ParamList()
  103. {
  104. nodeId = node.nodeId,
  105. paramAttribute = "iterationInputField",
  106. paramName = inputFieldParam.paramName,
  107. paramType = inputFieldParam.paramType,
  108. paramValue = inputFieldParam.paramValue
  109. });
  110. return paramListObj;
  111. }
  112. /// <summary>
  113. /// 跳出循环节点
  114. /// </summary>
  115. /// <param name="node"></param>
  116. /// <param name="paramList"></param>
  117. public static void iterationBreak(NodeList node, List<ParamList> paramList)
  118. {
  119. }
  120. /// <summary>
  121. /// 代码执行节点
  122. /// </summary>
  123. /// <param name="node"></param>
  124. /// <param name="paramList"></param>
  125. public static void codeExecute(NodeList node, List<ParamList> paramList)
  126. {
  127. JsonData nodeData = node.nodeData;
  128. string code = nodeData["data"]["formData"]["code"]["value"]["code"]["content"].ToString(); // 代码
  129. JsonData outputParam = nodeData["data"]["formData"]["output"]["value"]; // 输出参数
  130. var engine = new Engine();
  131. engine.Execute(code);
  132. foreach (JsonData param in outputParam)
  133. {
  134. string paramName = param["label"].ToString(); // 字段名
  135. paramList.Add(new ParamList()
  136. {
  137. nodeId = node.nodeId,
  138. paramName = paramName,
  139. paramValue = engine.GetValue(paramName).ToString(),
  140. paramType = param["type"][0].ToString(),
  141. });
  142. }
  143. }
  144. /// <summary>
  145. /// 运算符转换
  146. /// </summary>
  147. /// <param name="oper">运算符</param>
  148. /// <returns>转换后的运算符</returns>
  149. public static string operatorTransfer(ParamList param, string oper, string paramValue)
  150. {
  151. if (oper == "equal") //等于
  152. {
  153. if(param.paramType == "string" || param.paramType == "time")
  154. {
  155. return "'" + param.paramValue + "' == '" + paramValue + "'";
  156. }
  157. return param.paramValue + " == " + paramValue;
  158. }
  159. else if (oper == "not_equal") //不等于
  160. {
  161. if(param.paramType == "string" || param.paramType == "time")
  162. {
  163. return "'" + param.paramValue + "' != '" + paramValue + "'";
  164. }
  165. return param.paramValue + " != " + paramValue;
  166. }
  167. else if (oper == "greater") //大于
  168. {
  169. return param.paramValue + " > " + paramValue;
  170. }
  171. else if (oper == "greater_equal") //大于等于
  172. {
  173. return param.paramValue + " >= " + paramValue;
  174. }
  175. else if (oper == "less") //小于
  176. {
  177. return param.paramValue + " < " + paramValue;
  178. }
  179. else if (oper == "less_equal") //小于等于
  180. {
  181. return param.paramValue + " <= " + paramValue;
  182. }
  183. else if (oper == "between") //在之间
  184. {
  185. string[] betweenValues = paramValue.Split(',');
  186. return param.paramValue + " >= " + betweenValues[0] + " && " + param.paramValue + " <= " + betweenValues[1];
  187. }
  188. else if (oper == "not_between") //不在之间
  189. {
  190. string[] betweenValues = paramValue.Split(',');
  191. return "(" + param.paramValue + " < " + betweenValues[0] + " || " + param.paramValue + " > " + betweenValues[1] + ")";
  192. }
  193. else if (oper == "contains") //包含
  194. {
  195. return "Contains('" + param.paramValue + "', '" + paramValue + "')";
  196. }
  197. else if (oper == "not_contains") //不包含
  198. {
  199. return "!Contains('" + param.paramValue + "', '" + paramValue + "')";
  200. }
  201. else if (oper == "starts_with") //以...开头
  202. {
  203. return "StartsWith('" + param.paramValue + "', '" + paramValue + "')";
  204. }
  205. else if (oper == "ends_with") //以...结尾
  206. {
  207. return "EndsWith('" + param.paramValue + "', '" + paramValue + "')";
  208. }
  209. else if (oper == "matches_regex") //匹配正则表达式
  210. {
  211. return "Match('" + param.paramValue + "', '" + paramValue + "')";
  212. }
  213. else if (oper == "not_matches_regex") //不匹配正则表达式
  214. {
  215. return "!Match('" + param.paramValue + "', '" + paramValue + "')";
  216. }
  217. else if (oper == "is_empty")
  218. {
  219. return "IsNullOrEmpty('" + param.paramValue + "')";
  220. }
  221. else if (oper == "is_not_empty") //不为空
  222. {
  223. return "!" + "IsNullOrEmpty('" + param.paramValue + "')";
  224. }
  225. else if (oper == "is_null") //为空
  226. {
  227. return "('" + param.paramValue + "'=='{}' || '" + param.paramValue + "'=='[]')";
  228. }
  229. else if (oper == "is_not_null") //不为空
  230. {
  231. return "('" + param.paramValue + "'!='{}' || '" + param.paramValue + "'!='[]')";
  232. }
  233. else if (oper == "in") //在...中
  234. {
  235. return "In('" + param.paramValue + "', '" + paramValue + "')";
  236. }
  237. else if (oper == "not_in") //不在...中
  238. {
  239. return "!In('" + param.paramValue + "', '" + paramValue + "')";
  240. }
  241. else if (oper == "array_contains") //数组包含
  242. {
  243. return "In('" + param.paramValue + "', '" + paramValue + "')";
  244. }
  245. else if (oper == "array_not_contains") //数组不包含
  246. {
  247. return "!In('" + param.paramValue + "', '" + paramValue + "')";
  248. }
  249. else if (oper == "array_length_equal") //数组长度等于
  250. {
  251. return "ArrayLen('" + param.paramValue + "') == " + paramValue;
  252. }
  253. else if (oper == "array_length_greater")
  254. {
  255. return "ArrayLen('" + param.paramValue + "') > " + paramValue;
  256. }
  257. else if (oper == "array_length_less") //数组长度小于
  258. {
  259. return "ArrayLen('" + param.paramValue + "') < " + paramValue;
  260. }
  261. else if (oper == "is_true") //为真
  262. {
  263. return param.paramValue + " == true";
  264. }
  265. else if (oper == "is_false") //为假
  266. {
  267. return param.paramValue + " == false";
  268. }
  269. else if (oper == "date_equal") //日期等于
  270. {
  271. return "'" + param.paramValue + "' == '" + paramValue + "'";
  272. }
  273. else if (oper == "date_before") //日期之前
  274. {
  275. return "'" + param.paramValue + "' < '" + paramValue + "'";
  276. }
  277. else if (oper == "date_after") //日期之后
  278. {
  279. return "'" + param.paramValue + "' > '" + paramValue + "'";
  280. }
  281. else if (oper == "date_between") //日期之间
  282. {
  283. string[] betweenValues = paramValue.Split(" - ", StringSplitOptions.None);
  284. return "'" + param.paramValue + "' >= '" + betweenValues[0] + "' && '" + param.paramValue + "' <= '" + betweenValues[1] + "'";
  285. }
  286. return "";
  287. }
  288. }
  289. }