LogicBasicNodeHelper.cs 12 KB

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