public async Task <bool> Start(string DefinitionID, Dictionary <string, object> InputData = null) { var token = new TaskToken(); var pi = _ProcessInstances[DefinitionID]; pi.StartTask.Token = token; pi.Tokens.Add(token); pi.Status = ProcessStatus.Running; if (InputData != null) { pi.InputData = InputData; } if (pi.InputData == null) { pi.InputData = new Dictionary <string, object>(); } while (pi.Status == ProcessStatus.Running) { foreach (var t in pi.Tokens) { if (await t.Excute(pi)) { // 令牌数量发生变化,集合更改,重新循环 break; } } } if (pi.Status == ProcessStatus.Finish) { // 异步更新状态 BPMDBService.ProcessDone(pi.ID); // 从缓存中移除已完成的流程实例 _ProcessInstances.Remove(pi.ID); // 通知业务系统流程完成 pi.OB.ProcessFinish(pi); } return(true); }
public void BackUpTasks(Definitions def, List <BPMTaskInstanceEntity> DBTasks) { #region Tasks foreach (var task in DBTasks) { TaskInstance taskInstance = null; var taskID = task.ID.ToString().ToUpper(); switch (task.Type) { case (int)TaskType.Start: { taskInstance = new StartTaskInstance() { Name = task.Name, ID = taskID, SourceID = task.SourceID, From = task.Source.ToString().ToUpper(), To = task.Target.ToString().ToUpper(), Status = (TaskStatus)task.Status, Type = TaskType.Start }; break; } case (int)TaskType.CallApi: { taskInstance = new AutoTaskInstance(UnityContainerHelper.GetServer <IAutoTaskExcute>(task.Name)) { Name = task.Name, ID = taskID, SourceID = task.SourceID, From = task.Source.ToString().ToUpper(), To = task.Target.ToString().ToUpper(), Status = (TaskStatus)task.Status, Type = TaskType.CallApi }; break; } case (int)TaskType.Manual: { var mTask = new ManualTaskInstance() { Name = task.Name, ID = taskID, SourceID = task.SourceID, From = task.Source.ToString().ToUpper(), To = task.Target.ToString().ToUpper(), Status = (TaskStatus)task.Status, Type = TaskType.Manual, UserID = task.UserID }; mTask.IsDone = mTask.Status == TaskStatus.Done; foreach (var item in this.ModelInstanceIDMaps) { if (item.Value.ToUpper() == taskID) { mTask.Owner = def.Process.UserTasks.SingleOrDefault(t => t.ID == item.Key).PotentialOwner; break; } } if (this.OB != null) { mTask.SetObservation(this.OB); } taskInstance = mTask; break; } case (int)TaskType.Sign: { var mTask = new JointlySignTaskInstance() { Name = task.Name, ID = taskID, SourceID = task.SourceID, From = task.Source.ToString().ToUpper(), To = task.Target.ToString().ToUpper(), Status = (TaskStatus)task.Status, Type = TaskType.Manual, UserID = task.UserID, Users = task.Users }; mTask.IsDone = mTask.Status == TaskStatus.Done; foreach (var item in this.ModelInstanceIDMaps) { if (item.Value.ToUpper() == taskID) { mTask.Owner = def.Process.JointlySigns.SingleOrDefault(t => t.ID == item.Key).PotentialOwner; break; } } if (this.OB != null) { mTask.SetObservation(this.OB); } taskInstance = mTask; break; } case (int)TaskType.Empty: { break; } case (int)TaskType.End: { taskInstance = new EndTaskInstance() { Name = task.Name, ID = taskID, SourceID = task.SourceID, From = task.Source.ToString().ToUpper(), To = task.Target.ToString().ToUpper(), Status = (TaskStatus)task.Status, Type = TaskType.End }; break; } } if (taskInstance.Status == TaskStatus.Waiting) { var token = new TaskToken(); taskInstance.Token = token; this.Tokens.Add(token); } this.Tasks.Add(taskID, taskInstance); } #endregion // 连接线 def.Process.SequenceFlows.ForEach(s => { var taskID = generatIds(s.ID); var fromID = generatIds(s.SourceRef); var toID = generatIds(s.TargetRef); this.Sequences.Add(taskID, new SequenceInstance() { Name = s.ID, ID = taskID, To = toID, From = fromID, Condition = s.Condition }); }); // 独立网关 def.Process.ExclusiveGateways.ForEach(g => { var gid = generatIds(g.ID); this.Gateways.Add(gid, new ExclusiveGatewayInstance() { ID = gid, Froms = generatIds(g.Incoming), Tos = generatIds(g.Outgoing), Default = generatIds(g.Default), Type = GatewayType.Exclusive }); }); // 并行网关 def.Process.ParallelGateways.ForEach(g => { var gid = generatIds(g.ID); this.Gateways.Add(gid, new ParallelGatewayInstance() { ID = gid, Froms = generatIds(g.Incoming), Tos = generatIds(g.Outgoing), Type = GatewayType.Parallel, IsJointlySignBegin = g.Type != null && g.Type.Equals("JointlySignBegin"), IsJointlySignEnd = g.Type != null && g.Type.Equals("JointlySignEnd") }); }); }