public static IWorkSheetBase Start <T>(this IWorkSheetBase sheet) where T : IWorkSheetBase { try { if (!HasDataProvider) { throw new Exception("工作流引擎DataProvider为空, 无法启动"); } var sheetInstance = (T)sheet; var workflow = sheetInstance.WorkFlow; foreach (var context in sheetInstance.WorkItems) { var node = context.CurrentNode; var startNode = workflow.Nodes?.First(p => p.Id == workflow.StartNodeId); if (startNode.IsNull()) { throw new Exception($"无法启动工单 #{sheet.Id} , 工单的工作流没有设置起点."); } else { context.CurrentNode = startNode; context.CurrentNode.CurrentState = context.CurrentNode.BeginStatus; context.CurrentUser = DataProvider.GetCurrentUser(sheet, context.CurrentNode.Handler); } } DataProvider.Commit(sheet); DataProvider.LogInfo(sheet, $"工单 #{sheet.Id} 启动成功!", "system"); return(sheet); } catch (Exception ex) { DataProvider.LogInfo(sheet, $"工单 #{sheet.Id} 启动异常!{ex.Message}", "system"); return(sheet); } }
private static void InvokeTransfers(IWorkItemBase item, IWorkSheetBase sheet) { TransferEventArgs args = new TransferEventArgs(); //todo: check changes TransferEventPublisher.Invoke(args); }
public static object Excete(WorkFlowNodeMethod nodeMethod, IWorkSheetBase sheet, IWorkItemBase item, params object[] parameters) { try { var handler = handlers.First(p => p.Key == nodeMethod.Key).Value; handler = handler.CreateInstance(item, sheet); var methods = handler.GetType().GetMethods(); foreach (var method in methods) { if (method.IsPublic && method.Name == nodeMethod.MethodName && method.GetParameters().Length == parameters.Length) { var result = method.Invoke(handler, parameters); return(result); } } } catch (Exception ex) { var message = $"执行工作流节点{nodeMethod.Key}异常,{sheet.Id}/{item.Id}/{nodeMethod.MethodLabel}/{nodeMethod.State}"; WorkFlowEngine.DataProvider.LogError(message, ex); return(new { Result = false, Message = message, Error = ex.Message }); } return(null); }
private static IWorkItemBase Next(this IWorkItemBase context, IWorkSheetBase sheet) { var workNode = context.CurrentNode; var flow = workNode.Flow?.FirstOrDefault(p => p.From.Value == workNode.CurrentState.Value); var nextNode = flow?.To; if (nextNode != null && nextNode.Key != "end") { //节点流转 nextNode = sheet.WorkFlow.Nodes.First(node => node.Id == nextNode.Id); context.CurrentNode = nextNode; //修改下一个节点的初始化状态 context.CurrentNode.CurrentState = nextNode.BeginStatus; context.CurrentUser = DataProvider.GetCurrentUser(sheet, nextNode.Handler); } if (nextNode != null && nextNode.Key == "end") { context.CurrentNode = new WorkFlowNode { Label = "工作流完成", Key = "end", }; } return(context); }
public INodeHandler CreateInstance(IWorkItemBase item, IWorkSheetBase sheet) { var result = new T(); result.WorkItem = item; result.WorkSheet = sheet; return(result); }
public static string Log(this IWorkSheetBase sheet, string message, string currentUser, string workItemId = "") { if (!HasDataProvider) { throw new Exception("没有工作流引擎驱动, 系统暂无法记录您的日志:" + message); } else { return(DataProvider.LogInfo(sheet, message, currentUser, workItemId)); } }
public static object Excete(this WorkFlowNodeMethod method, IWorkSheetBase sheet, IWorkItemBase item, out string message) { message = default(String); if (item.CurrentNode.Key != method.Key) { message = "子工单当前状态不适用此处理方法"; return(null); } try { return(NodeHandlerContainer.Excete(method, sheet, item, method.Parameters.Select(p => p.Value).ToArray())); } catch (System.Exception ex) { message = ex.Message; throw ex; } }
public static IWorkSheetBase Next(this IWorkSheetBase sheet) { if (!HasDataProvider) { throw new Exception("no workflow engine data provider, system cant set worksheet with nextnode"); } foreach (var item in sheet.WorkItems) { item.Next(sheet); if (sheet.WorkItems.All(p => p.CurrentNode.Key == "end")) { DataProvider.Final(sheet); } else { DataProvider.LogInfo(sheet, $"工单{sheet.Id}的子项目{item.Id}当前处理节点流转到{item.CurrentNode.Name},流转到{item.CurrentUser}", "system", item.Id); DataProvider.Commit(sheet); } } return(sheet); }
public static bool CheckRequire(IWorkSheetBase sheet, IWorkItemBase item) { try { var require = WorkFlowEngine.Container.RequireDetail.Find(p => p.Key == item.CurrentNode.Key); if (require.IsNotNull()) { var result = WorkFlowEngine.DataProvider.CheckRequire(sheet, item, require); return(result); } else { return(true); } } catch (Exception ex) { WorkFlowEngine.DataProvider.LogError($"CheckRequire异常", ex); return(true); } }
public static TSheet To <TSheet>(this IWorkSheetBase sheet) where TSheet : IWorkSheetBase { var result = (TSheet)sheet; return(result); }