LogicBasicNodeHelper.cs 13 KB

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