Jelajahi Sumber

添加逻辑配置执行接口

lichunlei 3 bulan lalu
induk
melakukan
825f46f37c

+ 47 - 0
Controllers/Client/LogicNodeController.cs

@@ -0,0 +1,47 @@
+using Vo;
+using Microsoft.AspNetCore.Mvc;
+using Model;
+using Services;
+using Model.Base;
+using Vo.Admin;
+using Dto.Client;
+using Mapster;
+using Infrastructure;
+using Util.Logic;
+
+namespace Controllers.Client
+{
+    /// <summary>
+    /// LogicNode)Controller
+    /// </summary>
+    // [Route("${Router}$")]
+    // [ApiExplorerSettings(GroupName = "LogicNode")]
+    public class LogicNodeController : BaseController
+    {
+        /// <summary>
+        /// api分组接口
+        /// </summary>
+        private readonly ILogicNodeService _LogicNodeService;
+
+
+        public LogicNodeController(ILogicNodeService LogicNodeService)
+        {
+            _LogicNodeService = LogicNodeService;
+
+        }
+
+        /// <summary>
+        /// 进入逻辑项目
+        /// </summary>
+        /// <returns>ok</returns>
+        [HttpPost]
+        [Route("/v1/omega_logic/public/enter")]
+        public IActionResult enter([FromBody] EnterLogicProjectDto param)
+        {
+            Dictionary<string, object> result = LogicHelper.DoLogic(param.projectId, param.request);
+            return SUCCESS(result);
+        }
+
+
+    }
+}

+ 22 - 0
Model/Dto/Client/EnterLogicProjectDto.cs

@@ -0,0 +1,22 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using Model.Base;
+
+namespace Dto.Client
+{
+    /// <summary>
+    /// 进入逻辑项目
+    /// </summary>
+    public class EnterLogicProjectDto
+    {
+        /// <summary>
+        /// 项目ID
+        /// </summary>
+        public int projectId { get; set; }
+
+        /// <summary>
+        /// 请求数据
+        /// </summary>
+        public string request { get; set; }
+    }
+}

+ 291 - 0
Util/Logic/LogicBasicNodeHelper.cs

@@ -0,0 +1,291 @@
+using Infrastructure;
+using Jint;
+using LitJson;
+using Model;
+using Model.Custom;
+using Model.Source;
+
+namespace Util.Logic
+{
+    public class LogicBasicNodeHelper
+    {
+        /// <summary>
+        /// 如果-否则节点
+        /// </summary>
+        /// <param name="node">节点数据</param>
+        /// <param name="paramList">参数列表</param>
+        /// <param name="parentNodeParamList">父节点参数列表</param>
+        public static void end(NodeList node, List<ParamList> paramList)
+        {
+            JsonData nodeData = node.nodeData;
+            JsonData outputParam = nodeData["data"]["formData"]["output"]["value"]; // 输出参数
+            foreach (JsonData item in outputParam)
+            {
+                string paramName = item["label"].ToString(); // 参数名
+                string paramValue = item["value"].ToString(); // 参数值
+                string paramType = item["type"][0].ToString(); // 参数类型
+                if(paramValue.Contains("."))
+                {
+                    paramValue = paramValue.Substring(paramValue.LastIndexOf(".") + 1);
+                    var param = paramList.FirstOrDefault(x => x.paramName == paramValue);
+                    if (param != null)
+                    {
+                        param.paramAttribute = "endoutput";
+                    }
+                }
+                else
+                { 
+                    paramList.Add(new ParamList()
+                    {
+                        nodeId = node.nodeId,
+                        paramAttribute = "endoutput",
+                        paramName = paramName,
+                        paramType = paramType,
+                        paramValue = paramValue
+                    });
+                }
+            }
+        }
+
+
+        /// <summary>
+        /// 循环节点
+        /// </summary>
+        /// <param name="node">节点数据</param>
+        /// <param name="paramList">参数列表</param>
+        public static List<ParamList> loop(NodeList node, List<ParamList> paramList)
+        { 
+            return iterationChildStart(node, paramList);
+        }
+        /// <summary>
+        /// 迭代节点
+        /// </summary>
+        /// <param name="node">节点数据</param>
+        /// <param name="paramList">参数列表</param>
+        public static List<ParamList> iteration(NodeList node, List<ParamList> paramList)
+        {
+            JsonData nodeData = node.nodeData;
+            string inputField = nodeData["data"]["formData"]["input"]["value"]?.ToString() ?? string.Empty; // 迭代字段
+            inputField = inputField.Substring(inputField.LastIndexOf(".") + 1);
+            ParamList inputFieldParam = paramList.FirstOrDefault(x => x.paramName == inputField) ?? new ParamList(); // 迭代字段值
+            List<ParamList> paramListObj = new List<ParamList>();
+            paramListObj.Add(new ParamList()
+            {
+                nodeId = node.nodeId,
+                paramName = inputFieldParam.paramName,
+                paramType = inputFieldParam.paramType,
+                paramValue = inputFieldParam.paramValue
+            });
+            paramListObj.Add(new ParamList()
+            {
+                nodeId = node.nodeId,
+                paramName = "nodeId",
+                paramType = "string",
+                paramValue = node.nodeId
+            });
+            return paramListObj;
+        }
+        /// <summary>
+        /// 迭代子流程起始节点
+        /// </summary>
+        /// <param name="node"></param>
+        /// <param name="paramList"></param>
+        public static List<ParamList> iterationChildStart(NodeList node, List<ParamList> paramList)
+        { 
+            JsonData nodeData = node.nodeData;
+            string inputField = nodeData["data"]["formData"][node.nodeId]["value"]?.ToString() ?? string.Empty; // 迭代字段
+            inputField = inputField.Substring(inputField.LastIndexOf(".") + 1);
+            ParamList inputFieldParam = paramList.FirstOrDefault(x => x.paramName == inputField) ?? new ParamList(); // 迭代字段值
+            List<ParamList> paramListObj = new List<ParamList>();
+            paramListObj.Add(new ParamList()
+            {
+                nodeId = node.nodeId,
+                paramAttribute = "iterationInputField",
+                paramName = inputFieldParam.paramName,
+                paramType = inputFieldParam.paramType,
+                paramValue = inputFieldParam.paramValue
+            });
+            return paramListObj;
+        }
+        /// <summary>
+        /// 跳出循环节点
+        /// </summary>
+        /// <param name="node"></param>
+        /// <param name="paramList"></param>
+        public static void iterationBreak(NodeList node, List<ParamList> paramList)
+        { 
+
+        }
+
+        /// <summary>
+        /// 代码执行节点
+        /// </summary>
+        /// <param name="node"></param>
+        /// <param name="paramList"></param>
+        public static void codeExecute(NodeList node, List<ParamList> paramList)
+        { 
+            JsonData nodeData = node.nodeData;
+            string code = nodeData["data"]["formData"]["code"]["value"]["code"]["content"].ToString(); // 代码
+            JsonData outputParam = nodeData["data"]["formData"]["output"]["value"]; // 输出参数
+            var engine = new Engine();
+            engine.Execute(code);
+            foreach (JsonData param in outputParam)
+            {
+                string paramName = param["label"].ToString(); // 字段名
+                paramList.Add(new ParamList()
+                {
+                    nodeId = node.nodeId,
+                    paramName = paramName,
+                    paramValue = engine.GetValue(paramName).ToString(),
+                    paramType = param["type"][0].ToString(),
+                });
+            }
+        }
+
+        /// <summary>
+        /// 运算符转换
+        /// </summary>
+        /// <param name="oper">运算符</param>
+        /// <returns>转换后的运算符</returns>
+        public static string operatorTransfer(ParamList param, string oper, string paramValue)
+        {
+            if (oper == "equal") //等于
+            { 
+                if(param.paramType == "string" || param.paramType == "time")
+                {
+                    return "'" + param.paramValue + "' == '" + paramValue + "'";
+                }
+                return param.paramValue + " == " + paramValue;
+            }
+            else if (oper == "not_equal") //不等于
+            {
+                if(param.paramType == "string" || param.paramType == "time")
+                {
+                    return "'" + param.paramValue + "' != '" + paramValue + "'";
+                }
+                return param.paramValue + " != " + paramValue;
+            }
+            else if (oper == "greater") //大于
+            {
+                return param.paramValue + " > " + paramValue;
+            }
+            else if (oper == "greater_equal") //大于等于
+            {
+                return param.paramValue + " >= " + paramValue;
+            }
+            else if (oper == "less") //小于
+            {
+                return param.paramValue + " < " + paramValue;
+            }
+            else if (oper == "less_equal") //小于等于
+            {
+                return param.paramValue + " <= " + paramValue;
+            }
+            else if (oper == "between") //在之间
+            {
+                string[] betweenValues = paramValue.Split(',');
+                return param.paramValue + " >= " + betweenValues[0] + " && " + param.paramValue + " <= " + betweenValues[1];
+            }
+            else if (oper == "not_between") //不在之间
+            {
+                string[] betweenValues = paramValue.Split(',');
+                return "(" + param.paramValue + " < " + betweenValues[0] + " || " + param.paramValue + " > " + betweenValues[1] + ")";
+            }
+            else if (oper == "contains") //包含
+            {
+                return "Contains('" + param.paramValue + "', '" + paramValue + "')";
+            }
+            else if (oper == "not_contains") //不包含
+            {
+                return "!Contains('" + param.paramValue + "', '" + paramValue + "')";
+            }
+            else if (oper == "starts_with") //以...开头
+            {
+                return "StartsWith('" + param.paramValue + "', '" + paramValue + "')";
+            }
+            else if (oper == "ends_with") //以...结尾
+            {
+                return "EndsWith('" + param.paramValue + "', '" + paramValue + "')";
+            }
+            else if (oper == "matches_regex") //匹配正则表达式
+            {
+                return "Match('" + param.paramValue + "', '" + paramValue + "')";
+            }
+            else if (oper == "not_matches_regex") //不匹配正则表达式
+            {
+                return "!Match('" + param.paramValue + "', '" + paramValue + "')";
+            }
+            else if (oper == "is_empty")
+            {
+                return "IsNullOrEmpty('" + param.paramValue + "')";
+            }
+            else if (oper == "is_not_empty") //不为空
+            {
+                return "!" + "IsNullOrEmpty('" + param.paramValue + "')";
+            }
+            else if (oper == "is_null") //为空
+            {
+                return "('" + param.paramValue + "'=='{}' || '" + param.paramValue + "'=='[]')";
+            }
+            else if (oper == "is_not_null") //不为空
+            {
+                return "('" + param.paramValue + "'!='{}' || '" + param.paramValue + "'!='[]')";
+            }
+            else if (oper == "in") //在...中
+            {
+                return "In('" + param.paramValue + "', '" + paramValue + "')";
+            }
+            else if (oper == "not_in") //不在...中
+            {
+                return "!In('" + param.paramValue + "', '" + paramValue + "')";
+            }
+            else if (oper == "array_contains") //数组包含
+            {
+                return "In('" + param.paramValue + "', '" + paramValue + "')";
+            }
+            else if (oper == "array_not_contains") //数组不包含 
+            {
+                return "!In('" + param.paramValue + "', '" + paramValue + "')";
+            }
+            else if (oper == "array_length_equal") //数组长度等于
+            {
+                return "ArrayLen('" + param.paramValue + "') == " + paramValue;
+            }
+            else if (oper == "array_length_greater")
+            {
+                return "ArrayLen('" + param.paramValue + "') > " + paramValue;
+            }
+            else if (oper == "array_length_less") //数组长度小于
+            {
+                return "ArrayLen('" + param.paramValue + "') < " + paramValue;
+            }
+            else if (oper == "is_true") //为真
+            {
+                return param.paramValue + " == true";
+            }
+            else if (oper == "is_false") //为假
+            {
+                return param.paramValue + " == false";
+            }
+            else if (oper == "date_equal") //日期等于
+            {
+                return "'" + param.paramValue + "' == '" + paramValue + "'";
+            }
+            else if (oper == "date_before") //日期之前
+            {
+                return "'" + param.paramValue + "' < '" + paramValue + "'";
+            }
+            else if (oper == "date_after") //日期之后
+            {
+                return "'" + param.paramValue + "' > '" + paramValue + "'";
+            }
+            else if (oper == "date_between") //日期之间
+            {
+                string[] betweenValues = paramValue.Split(" - ", StringSplitOptions.None);
+                return "'" + param.paramValue + "' >= '" + betweenValues[0] + "' && '" + param.paramValue + "' <= '" + betweenValues[1] + "'";
+            }
+            return "";
+        }
+    
+    }
+}

+ 12 - 3
Util/Logic/LogicHelper.cs

@@ -15,18 +15,18 @@ namespace Util.Logic
         /// </summary>
         /// <param name="projectId">项目ID</param>
         /// <param name="request">请求参数</param>
-        public static void GetLogicJsonData(int projectId, string request)
+        public static Dictionary<string, object> DoLogic(int projectId, string request)
         {
             var logicProjectService = App.GetService<ILogicProjectService>();
             var logicProject = logicProjectService.GetById(projectId);
             if(logicProject == null)
             {
-                return;
+                return new Dictionary<string, object>();
             }
             string jsonData = logicProject.setData ?? string.Empty;
             if(string.IsNullOrEmpty(jsonData))
             {
-                return;
+                return new Dictionary<string, object>();
             }
             JsonData requestObj = JsonMapper.ToObject(request);
             JsonData jsonDataObj = JsonMapper.ToObject(jsonData);
@@ -96,6 +96,13 @@ namespace Util.Logic
 
             // 从起始节点开始
             sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, startNodeId);
+            // 返回结果
+            Dictionary<string, object> result = new Dictionary<string, object>();
+            foreach(ParamList item in paramList.Where(m => m.paramAttribute == "endoutput").ToList())
+            {
+                result.Add(item.paramName, item.paramValue);
+            }
+            return result;
         }
 
         /// <summary>
@@ -177,6 +184,8 @@ namespace Util.Logic
                             LogicToolNodeHelper.httpRequest(node, paramList);
                             sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, item.target);
                             break;
+                        case "end": // 结束节点
+                            break;
                         default:
                             sortEdge(databaseInfos, tables, edgeList, nodeList, paramList, item.target);
                             break;