LogicHelper.cs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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 Dictionary<string, object> DoLogic(int projectId, string request)
  18. {
  19. var logicProjectService = App.GetService<ILogicProjectService>();
  20. var logicProject = logicProjectService.GetById(projectId);
  21. if(logicProject == null)
  22. {
  23. return new Dictionary<string, object>();
  24. }
  25. string jsonData = logicProject.setData ?? string.Empty;
  26. if(string.IsNullOrEmpty(jsonData))
  27. {
  28. return new Dictionary<string, object>();
  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. Dictionary<string, object> result = new Dictionary<string, object>();
  97. foreach(ParamList item in paramList.Where(m => m.paramAttribute == "endoutput").ToList())
  98. {
  99. result.Add(item.paramName, item.paramValue);
  100. }
  101. return result;
  102. }
  103. /// <summary>
  104. /// 运行逻辑项目的Json数据
  105. /// </summary>
  106. /// <param name="edgeList">边列表</param>
  107. /// <param name="startNodeId">起始节点ID</param>
  108. public static void sortEdge(List<DatabaseInfo> databaseInfos, List<DatabaseTable> tables, List<EdgeList> edgeList, List<NodeList> nodeList, List<ParamList> paramList, string startNodeId)
  109. {
  110. foreach(EdgeList item in edgeList)
  111. {
  112. if(item.source == startNodeId)
  113. {
  114. NodeList node = nodeList.FirstOrDefault(x => x.nodeId == item.target) ?? new NodeList();
  115. switch(node.nodeType)
  116. {
  117. case "ifelse": // 如果-否则节点
  118. var ifElseResult = LogicNodeHelper.ifElse(node, paramList);
  119. if(ifElseResult.Count > 0)
  120. {
  121. foreach(bool result in ifElseResult)
  122. {
  123. if(result)
  124. {
  125. if (node.nodeData.ToJson().Contains("\"parentNode\""))
  126. {
  127. string pNodeId = node.nodeData["parentNode"]?.ToString() ?? string.Empty;
  128. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, pNodeId + "-child-start-node");
  129. }
  130. else
  131. {
  132. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, item.target);
  133. }
  134. break;
  135. }
  136. }
  137. }
  138. break;
  139. case "iteration": // 迭代节点
  140. // var iterationParamList = LogicNodeHelper.iteration(node, paramList);
  141. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, node.nodeId + "-child-start-node");
  142. break;
  143. case "child-start": // 子流程起始节点
  144. var iterationParamList = LogicNodeHelper.iterationChildStart(node, paramList);
  145. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, item.target);
  146. break;
  147. case "break": // 跳出循环
  148. // LogicNodeHelper.iterationBreak(node, paramList);
  149. // 跳出循环后,继续执行循环后面的节点
  150. string parentNodeId = node.nodeData["parentNode"]?.ToString() ?? string.Empty;
  151. EdgeList breakEdge = edgeList.FirstOrDefault(x => x.source == parentNodeId) ?? new EdgeList();
  152. if(string.IsNullOrEmpty(breakEdge.source))
  153. {
  154. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, breakEdge.target);
  155. }
  156. break;
  157. case "loop": // 循环节点
  158. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, node.nodeId + "-child-start-node");
  159. break;
  160. case "code-execute": // 代码执行节点
  161. LogicNodeHelper.codeExecute(node, paramList);
  162. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, item.target);
  163. break;
  164. case "sql-execute": // SQL执行节点
  165. LogicDatabaseNodeHelper.dbSqlQuery(node, databaseInfos, paramList);
  166. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, item.target);
  167. break;
  168. case "insert-data": // 插入数据节点
  169. break;
  170. case "update-data": // 更新数据节点
  171. break;
  172. case "query-data": // 查询数据节点
  173. LogicDatabaseNodeHelper.dbQuery(node, databaseInfos, tables, paramList);
  174. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, item.target);
  175. break;
  176. case "delete-data": // 删除数据节点
  177. break;
  178. case "http-request": // HTTP请求节点
  179. LogicToolNodeHelper.httpRequest(node, paramList);
  180. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, item.target);
  181. break;
  182. case "end": // 结束节点
  183. break;
  184. default:
  185. sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, item.target);
  186. break;
  187. }
  188. }
  189. }
  190. }
  191. }
  192. }