LogicHelper.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. using System.Text.RegularExpressions;
  2. using Feign;
  3. using Infrastructure;
  4. using LitJson;
  5. using Model.Custom;
  6. using Model.Source;
  7. using Services;
  8. namespace Util.Logic
  9. {
  10. public class LogicHelper
  11. {
  12. /// <summary>
  13. /// 获取逻辑项目的Json数据
  14. /// </summary>
  15. /// <param name="projectId">项目ID</param>
  16. /// <param name="request">请求参数</param>
  17. public static void GetLogicJsonData(int projectId, string request)
  18. {
  19. var logicProjectService = App.GetService<ILogicProjectService>();
  20. var logicProject = logicProjectService.GetById(projectId);
  21. if(logicProject == null)
  22. {
  23. return;
  24. }
  25. string jsonData = logicProject.setData ?? string.Empty;
  26. if(string.IsNullOrEmpty(jsonData))
  27. {
  28. return;
  29. }
  30. JsonData requestObj = JsonMapper.ToObject(request);
  31. JsonData jsonDataObj = JsonMapper.ToObject(jsonData);
  32. JsonData nodes = jsonDataObj["nodes"]; // 节点数据
  33. List<NodeList> nodeList = new List<NodeList>(); // 节点列表
  34. foreach(JsonData node in nodes)
  35. {
  36. JsonData id = node["id"];
  37. JsonData type = node["type"];
  38. NodeList nodeListObj = new NodeList();
  39. nodeListObj.nodeId = id.ToString();
  40. nodeListObj.nodeType = type.ToString();
  41. nodeListObj.nodeData = node;
  42. nodeList.Add(nodeListObj);
  43. }
  44. List<EdgeList> edgeList = new List<EdgeList>(); // 边列表
  45. JsonData edges = jsonDataObj["edges"]; // 边数据
  46. foreach(JsonData edge in edges)
  47. {
  48. JsonData source = edge["source"];
  49. JsonData target = edge["target"];
  50. EdgeList edgeListObj = new EdgeList();
  51. edgeListObj.source = source.ToString();
  52. edgeListObj.target = target.ToString();
  53. edgeListObj.edgeData = edge;
  54. edgeList.Add(edgeListObj);
  55. }
  56. string startNodeId = "start"; // 起始节点ID
  57. // 获取起始节点数据
  58. List<ParamList> paramList = new List<ParamList>();
  59. NodeList startNode = nodeList.FirstOrDefault(x => x.nodeId == startNodeId) ?? new NodeList();
  60. JsonData nodeData = startNode.nodeData;
  61. JsonData input = nodeData["data"]["formData"]["input"]["value"];
  62. for(int i = 0; i < input.Count; i++)
  63. {
  64. JsonData item = input[i];
  65. string paramName = item["label"].ToString();
  66. string paramType = item["type"][0].ToString();
  67. string paramValue = item["value"].ToString();
  68. ParamList paramListObj = new ParamList();
  69. paramListObj.nodeId = startNodeId;
  70. paramListObj.paramName = paramName;
  71. paramListObj.paramType = paramType;
  72. paramListObj.paramValue = paramValue;
  73. paramList.Add(paramListObj);
  74. }
  75. //获取数据库信息
  76. var matches = Regex.Matches(jsonData, "\"dbId\":.*");
  77. string dbIdList = string.Empty;
  78. foreach(Match match in matches)
  79. {
  80. dbIdList += match.Value.Replace(" ", "").Replace("\"dbId\":", "").Replace("\"", "") + ",";
  81. }
  82. dbIdList = dbIdList.TrimEnd(',');
  83. List<DatabaseInfo> databaseInfos = ISource.getDatabaseInfoListByIds(dbIdList);
  84. // 获取数据库表信息
  85. var tableMatches = Regex.Matches(jsonData, "\"dbTableId\":.*");
  86. string dbTableIdList = string.Empty;
  87. foreach(Match match in tableMatches)
  88. {
  89. dbTableIdList += match.Value.Replace(" ", "").Replace("\"dbTableId\":", "").Replace("\"", "") + ",";
  90. }
  91. dbTableIdList = dbTableIdList.TrimEnd(',');
  92. List<DatabaseTable> tables = ISource.getDatabaseTableListByIds(dbTableIdList);
  93. // 从起始节点开始
  94. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, startNodeId);
  95. }
  96. /// <summary>
  97. /// 运行逻辑项目的Json数据
  98. /// </summary>
  99. /// <param name="edgeList">边列表</param>
  100. /// <param name="startNodeId">起始节点ID</param>
  101. public static void sortEdge(List<DatabaseInfo> databaseInfos, List<DatabaseTable> tables, List<EdgeList> edgeList, List<NodeList> nodeList, List<ParamList> paramList, string startNodeId)
  102. {
  103. foreach(EdgeList item in edgeList)
  104. {
  105. if(item.source == startNodeId)
  106. {
  107. NodeList node = nodeList.FirstOrDefault(x => x.nodeId == item.target) ?? new NodeList();
  108. switch(node.nodeType)
  109. {
  110. case "ifelse": // 如果-否则节点
  111. var ifElseResult = LogicNodeHelper.ifElse(node, paramList);
  112. if(ifElseResult.Count > 0)
  113. {
  114. foreach(bool result in ifElseResult)
  115. {
  116. if(result)
  117. {
  118. if (node.nodeData.ToJson().Contains("\"parentNode\""))
  119. {
  120. string pNodeId = node.nodeData["parentNode"]?.ToString() ?? string.Empty;
  121. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, pNodeId + "-child-start-node");
  122. }
  123. else
  124. {
  125. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, item.target);
  126. }
  127. break;
  128. }
  129. }
  130. }
  131. break;
  132. case "iteration": // 迭代节点
  133. // var iterationParamList = LogicNodeHelper.iteration(node, paramList);
  134. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, node.nodeId + "-child-start-node");
  135. break;
  136. case "child-start": // 子流程起始节点
  137. var iterationParamList = LogicNodeHelper.iterationChildStart(node, paramList);
  138. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, item.target);
  139. break;
  140. case "break": // 跳出循环
  141. // LogicNodeHelper.iterationBreak(node, paramList);
  142. // 跳出循环后,继续执行循环后面的节点
  143. string parentNodeId = node.nodeData["parentNode"]?.ToString() ?? string.Empty;
  144. EdgeList breakEdge = edgeList.FirstOrDefault(x => x.source == parentNodeId) ?? new EdgeList();
  145. if(string.IsNullOrEmpty(breakEdge.source))
  146. {
  147. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, breakEdge.target);
  148. }
  149. break;
  150. case "loop": // 循环节点
  151. break;
  152. case "code-execute": // 代码执行节点
  153. LogicNodeHelper.codeExecute(node, paramList);
  154. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, item.target);
  155. break;
  156. case "sql-execute": // SQL执行节点
  157. LogicDatabaseNodeHelper.dbSqlQuery(node, databaseInfos, paramList);
  158. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, item.target);
  159. break;
  160. case "insert-data": // 插入数据节点
  161. break;
  162. case "update-data": // 更新数据节点
  163. break;
  164. case "query-data": // 查询数据节点
  165. LogicDatabaseNodeHelper.dbQuery(node, databaseInfos, tables, paramList);
  166. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, item.target);
  167. break;
  168. case "delete-data": // 删除数据节点
  169. break;
  170. case "http-request": // HTTP请求节点
  171. LogicToolNodeHelper.httpRequest(node, paramList);
  172. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, item.target);
  173. break;
  174. default:
  175. break;
  176. }
  177. }
  178. }
  179. }
  180. }
  181. }