コード例 #1
0
ファイル: WFTask.cs プロジェクト: liuyuedeyv/ScheduleEngine
        public WFTinsEntity CreateTaskIns(WFFinsEntity fins, WFTaskEntity taskEntity)
        {
            var taskSetting = GetTaskInfo(taskEntity);
            var tins        = taskSetting.Init(fins, taskEntity);

            return(tins);
        }
コード例 #2
0
ファイル: WFTask.cs プロジェクト: liuyuedeyv/ScheduleEngine
        public WFTaskSettingEntity GetTaskJobInfo(WFTaskEntity taskEntity)
        {
            var filter        = TableFilter.New().Equals("id", taskEntity.ID);
            var settingEntity = DataAccess.Query(WFTaskSettingEntity.TableCode)
                                .FixField("*").Where(filter).QueryFirst <WFTaskSettingEntity>();

            return(settingEntity);
        }
コード例 #3
0
ファイル: WFTask.cs プロジェクト: liuyuedeyv/ScheduleEngine
        public bool IsMultipleNextTask(WFTaskEntity preTask)
        {
            var filter = TableFilter.New().Equals("BEGINTASKID", preTask.ID);
            var links  = DataAccess.Query(WFLinkEntity.TableCode)
                         .FixField("*").Where(filter).QueryList <WFLinkEntity>().ToList();

            return(links.Count > 1);
        }
コード例 #4
0
        public string GetBisData(string dataId, WFTaskEntity task)
        {
            Console.WriteLine($"业务案件{dataId}获取业务数据……");
            //TODO:从远端获取业务数据
            Dictionary <string, object> data = new Dictionary <string, object>();

            data.Add("dataid", dataId);
            return(_JsonConverter.Serialize(data));
        }
コード例 #5
0
        /// <summary>
        /// 判断是否匹配  {@.*}
        /// </summary>
        /// <param name="wFTaskEntity"></param>
        /// <returns></returns>
        public static bool HasTemplateInfo(this WFTaskEntity wFTaskEntity)
        {
            if (string.IsNullOrWhiteSpace(wFTaskEntity.Setting))
            {
                return(false);
            }
            var reg = new Regex(regStr);

            return(reg.IsMatch(wFTaskEntity.Setting));
        }
コード例 #6
0
ファイル: WFTask.cs プロジェクト: liuyuedeyv/ScheduleEngine
        public BaseTask GetTaskInfo(WFTaskEntity taskEntity)
        {
            ETaskType taskType = taskEntity.Type;
            var       taskInfo = Tasks.Where(t => (t as BaseTask).TaskType == taskType).FirstOrDefault() as BaseTask;

            if (taskInfo == null)
            {
                throw new Exception($"类型{taskType}没有实现");
            }
            return(taskInfo);
        }
コード例 #7
0
ファイル: WFTask.cs プロジェクト: liuyuedeyv/ScheduleEngine
        public WFTaskEntity[] GetPreTasks(WFTaskEntity nextTask)
        {
            var filter = TableFilter.New().Equals("ENDTASKID", nextTask.ID);
            var links  = DataAccess.Query(WFLinkEntity.TableCode)
                         .FixField("*").Where(filter).QueryList <WFLinkEntity>();

            filter = TableFilter.New().In("ID", string.Join(',', links.Select(l => l.Begintaskid).ToArray()));
            var tasks = DataAccess.Query(WFTaskEntity.TableCode).FixField("*")
                        .Where(filter).QueryList <WFTaskEntity>();

            return(tasks.ToArray());
        }
コード例 #8
0
        /// <summary>
        /// 获取变量  {@.*},并且用逗号隔开拼接到一起
        /// </summary>
        /// <param name="wFTaskEntity"></param>
        /// <returns></returns>
        public static string GetTemplateInfo(this WFTaskEntity wFTaskEntity)
        {
            if (string.IsNullOrWhiteSpace(wFTaskEntity.Setting))
            {
                return(string.Empty);
            }
            var    reg    = new Regex(regStr);
            string result = string.Empty;

            foreach (var item in reg.Matches(wFTaskEntity.Setting))
            {
                result += item.ToString() + ",";
            }
            return(result.TrimEnd(','));
        }
コード例 #9
0
ファイル: WorkFlow.cs プロジェクト: liuyuedeyv/ScheduleEngine
        private string GetBisData(WFTaskEntity taskEntity, string dataId, string serviceId, string tinsId, out bool isMultipleNextTask)
        {
            //从远端获取数据的条件:
            //1、只有接下来有多个节点并且当前节点不等于并行节点,才会去远端获取数据
            //2、当前节点的配置信息中用到的变量,则需要去远端解析
            bool hasTemplateInfo = taskEntity.HasTemplateInfo();

            isMultipleNextTask = _WFTask.IsMultipleNextTask(taskEntity) && taskEntity.Type != ETaskType.BingXing;
            string jsonData = string.Empty;

            if (isMultipleNextTask || hasTemplateInfo)
            {
                jsonData = _WFTask.GetTaskInfo(taskEntity).GetBisData(taskEntity, dataId, serviceId, hasTemplateInfo ? EAccessMessageType.GetVariable : EAccessMessageType.GetWorkflowServiceBisdata);
            }
            return(jsonData);
        }
コード例 #10
0
 /// <summary>
 /// 替换模板中的 {@.*}信息
 /// </summary>
 /// <param name="taskEntity"></param>
 /// <param name="jsonData"></param>
 public static void ReplaceTemplateInfo(this WFTaskEntity taskEntity, string jsonData)
 {
     if (!string.IsNullOrWhiteSpace(taskEntity.Setting) && !string.IsNullOrWhiteSpace(jsonData))
     {
         var reg = new Regex(regStr);
         // 匹配模板: "Exchange:{@Exchange},ServerName:{@sserverName}";
         var obj = Newtonsoft.Json.JsonConvert.DeserializeObject <Newtonsoft.Json.Linq.JObject>(jsonData);
         foreach (var item in reg.Matches(taskEntity.Setting))
         {
             var tmp = item.ToString();
             if (obj.TryGetValue(tmp, StringComparison.CurrentCultureIgnoreCase, out JToken token))
             {
                 taskEntity.Setting = taskEntity.Setting.Replace(tmp, token.ToString());
             }
         }
     }
 }
コード例 #11
0
        /// <summary>
        /// 初始任务节点程实例信息
        /// </summary>
        public virtual WFTinsEntity Init(WFFinsEntity fins, WFTaskEntity taskEntity)
        {
            WFTinsEntity tins = new WFTinsEntity();

            tins.Add();
            tins.Finsid   = fins.ID;
            tins.Flowid   = taskEntity.Flowid;
            tins.Taskid   = taskEntity.ID;
            tins.Taskname = taskEntity.Name;
            tins.Sdate    = System.DateTime.Now;
            if (taskEntity.Type == ETaskType.End || taskEntity.Type == ETaskType.Start)
            {
                tins.Edate = System.DateTime.Now;
            }
            _DataAccess.Update(tins);

            return(tins);
        }
コード例 #12
0
ファイル: WFTask.cs プロジェクト: liuyuedeyv/ScheduleEngine
        public WFTaskEntity[] GetNextTasks(WFTaskEntity preTask, WFTinsEntity tinsEntity, string bisJsonData)
        {
            var filter = TableFilter.New().Equals("BEGINTASKID", preTask.ID);
            var links  = DataAccess.Query(WFLinkEntity.TableCode)
                         .FixField("*").Where(filter).QueryList <WFLinkEntity>().ToList();

            if (preTask.Type != ETaskType.BingXing && links.Count() > 1)
            {
                var dataList = new List <WFJsonDataEntity>();
                dataList.Add(_JsonConverter.Deserialize <WFJsonDataEntity>(bisJsonData));
                foreach (var link in links.OrderByDescending(l => l.Priority))
                {
                    bool hitRule = false;
                    if (string.IsNullOrWhiteSpace(link.Filter))
                    {
                        hitRule = true;
                    }
                    else
                    {
                        var conditionFilter = _JsonConverter.Deserialize <TableFilter>(link.Filter);
                        hitRule = dataList.QueryDynamic(conditionFilter).Count() == 1;
                    }
                    if (hitRule)
                    {
                        links = new List <WFLinkEntity>();
                        links.Add(link);
                        break;
                    }
                }
            }

            if (links.Count() == 1)
            {
                filter = TableFilter.New().Equals("ID", string.Join(',', links.Select(l => l.Endtaskid).ToArray()));
            }
            else
            {
                filter = TableFilter.New().In("ID", string.Join(',', links.Select(l => l.Endtaskid).ToArray()));
            }
            var tasks = DataAccess.Query(WFTaskEntity.TableCode).FixField("*")
                        .Where(filter).QueryList <WFTaskEntity>();

            return(tasks.ToArray());
        }
コード例 #13
0
        public override string GetBisData(WFTaskEntity taskEntity, string dataId, string serviceId, EAccessMessageType messageType)
        {
            //从tasksetting获取配置的远程对象代码,调取远方模型进行预算,返回结果
            string jsonData = "{}";

            if (!string.IsNullOrWhiteSpace(taskEntity.Setting))
            {
                var finisid = this._WfFinsDal.GetIdByDataIdAndFlowId(dataId, taskEntity.Flowid);
                var tinsid  = this._WftinsDal.GetIdByFinsIdAndTaskId(finisid, taskEntity.ID);

                var settingModel = _jsonConverter.Deserialize <ObjectSettingModel>(taskEntity.Setting);
                if (settingModel != null)
                {
                    jsonData = _IAppAccessService.GetModelTaskBisdata(serviceId, dataId, settingModel.ObjectCode).GetAwaiter().GetResult();
                }
                _WfTdataDal.Add(taskEntity.Flowid, finisid, taskEntity.ID, tinsid, jsonData);
            }
            return(jsonData);
        }
コード例 #14
0
        public int UpdateTemplate(WFFlowEntity flowEntity)
        {
            if (null == flowEntity)
            {
                throw new ArgumentException($"{nameof(flowEntity)} is not null");
            }
            using (var trans = TransHelper.BeginTrans())
            {
                foreach (var task in flowEntity?.Tasks ?? new List <WFTaskEntity>())
                {
                    var taskEntity = new WFTaskEntity();
                    taskEntity.State = task.State;
                    if (task.State == EDBEntityState.Added)
                    {
                        taskEntity.Flowid = flowEntity.ID;
                        taskEntity.Name   = task.Name;
                    }
                    taskEntity.ID   = task.ID;
                    taskEntity.X    = task.X;
                    taskEntity.Y    = task.Y;
                    taskEntity.Type = task.Type;
                    taskEntity.Name = task.Name;
                    DataAccess.Update(taskEntity);
                }
                foreach (var link in flowEntity?.Links ?? new List <WFLinkEntity>())
                {
                    var linkEntity = new WFLinkEntity();
                    linkEntity.State = link.State;
                    if (link.State == EDBEntityState.Added)
                    {
                        linkEntity.Flowid = flowEntity.ID;
                    }
                    linkEntity.ID          = link.ID;
                    linkEntity.Begintaskid = link.Begintaskid;
                    linkEntity.Endtaskid   = link.Endtaskid;
                    var count = DataAccess.Update(linkEntity);
                }
                trans.Commit();
            }

            return(1);
        }
コード例 #15
0
        public override bool RunTask(WFTaskEntity taskEntity, WFFinsEntity fins, WFTinsEntity tinsEntity, WFTEventEntity enventEntity)
        {
            // 根据tasksetting 节点的配置信息读取要发送到的远端地址
            //可以是多个地址
            if (!string.IsNullOrWhiteSpace(taskEntity.Setting))
            {
                var list = _jsonConverter.Deserialize <List <SendHttpModel> >(taskEntity.Setting);
                if (list != null)
                {
                    Dictionary <string, string> dicPostdata = null;
                    foreach (var item in list)
                    {
                        //Console.WriteLine($"发送数据到远端{item.Url}");

                        dicPostdata = new Dictionary <string, string>();
                        dicPostdata.Add("callbackTag", enventEntity.ID);
                        dicPostdata.Add("customTag", item.CustomTag);
                        dicPostdata.Add("dataId", enventEntity.Dataid);
                        var content    = new FormUrlEncodedContent(dicPostdata);
                        var httpClient = _httpClientFactory.CreateClient();
                        try
                        {
                            var response = httpClient.PostAsync(item.Url, content).GetAwaiter().GetResult();
                            if (response.IsSuccessStatusCode)
                            {
                                response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
                            }
                            else
                            {
                                var a = "";
                            }
                        }
                        catch (HttpRequestException ex)
                        {
                            throw new HttpRequestException($"{ex.Message},RunTask url:{item.Url} content:{_jsonConverter.Serialize(dicPostdata) }");
                        }
                    }
                    return(false);
                }
            }
            return(true);
        }
コード例 #16
0
        /// <summary>
        /// 获取业务数据
        /// </summary>
        public virtual string GetBisData(WFTaskEntity taskEntity, string dataId, string serviceId, EAccessMessageType messageType)
        {
            //调取远方模型进行,返回结果
            string jsonData = string.Empty;
            //根据serviceId 和dataid 获取 finsid 和tinsid

            var finisid = this._WfFinsDal.GetIdByDataIdAndFlowId(dataId, taskEntity.Flowid);
            var tinsid  = this._WftinsDal.GetIdByFinsIdAndTaskId(finisid, taskEntity.ID);

            if (messageType == EAccessMessageType.GetVariable)
            {
                jsonData = _IAppAccessService.GetVaribleTaskBisdata(serviceId, dataId, taskEntity.GetTemplateInfo()).GetAwaiter().GetResult();
            }
            else
            {
                jsonData = _IAppAccessService.GetWorkflowServiceBisdata(serviceId, dataId).GetAwaiter().GetResult();
            }
            _WfTdataDal.Add(taskEntity.Flowid, finisid, taskEntity.ID, tinsid, jsonData);

            return(jsonData);
        }
コード例 #17
0
 public override bool RunTask(WFTaskEntity taskEntity, WFFinsEntity fins, WFTinsEntity tinsEntity, WFTEventEntity enventEntity)
 {
     //TODO:发送数据到MQ
     // 根据tasksetting 节点的配置信息读取要发送到的远端地址
     //可以是多个地址
     if (!string.IsNullOrWhiteSpace(taskEntity.Setting))
     {
         var obj = _JsonConverter.Deserialize <SendMQModel>(taskEntity.Setting);
         if (obj != null)
         {
             var dicPostdata = new Dictionary <string, string>();
             dicPostdata.Add("callbackTag", enventEntity.ID);
             dicPostdata.Add("customTag", obj.CustomTag);
             dicPostdata.Add("dataId", enventEntity.Dataid);
             byte[] body = System.Text.Encoding.UTF8.GetBytes(_JsonConverter.Serialize(dicPostdata));
             _ChannelService.SendMsg(model =>
             {
                 model.BasicPublish(obj.Exchange, obj.RoutingKey ?? "", body, "");
             }, obj.ServerName);
         }
     }
     return(false);
 }
コード例 #18
0
        /// <summary>
        /// 执行具体任务
        /// </summary>
        public virtual bool RunTask(WFTaskEntity taskEntity, WFFinsEntity fins, WFTinsEntity tinsEntity, WFTEventEntity mqEntity)
        {
            //System.Console.WriteLine($"{taskEntity.Type}节点{tinsEntity.Taskname}开始执行……");

            return(true);
        }
コード例 #19
0
 public override bool RunTask(WFTaskEntity taskEntity, WFFinsEntity fins, WFTinsEntity tinsEntity, WFTEventEntity mqEntity)
 {
     //结束节点不需要做具体任务
     return(false);
 }
コード例 #20
0
 public override string GetBisData(WFTaskEntity taskEntity, string dataId, string serviceId, EAccessMessageType messageType)
 {
     //结束节点不用获取业务数据
     return(string.Empty);
 }