internal override void ExecuteInstanceImp(IDbSession session) { //构造流程实例 var processInstance = new ProcessInstanceManager() .CreateNewProcessInstanceObject(base.AppRunner, base.ProcessModel.ProcessEntity, base.ParentProcessInstance, base.InvokedSubProcessNode == null? null : base.InvokedSubProcessNode.ActivityInstance); //构造活动实例 //1. 获取开始节点活动 var startActivity = base.ProcessModel.GetStartActivity(); var startExecutionContext = ActivityForwardContext.CreateStartupContext(base.ProcessModel, processInstance, startActivity, base.ActivityResource); //base.RunWorkItemIteraly(startExecutionContext, session); NodeMediator mediator = NodeMediatorFactory.CreateNodeMediator(startExecutionContext, session); mediator.Linker.FromActivityInstance = RunningActivityInstance; mediator.ExecuteWorkItem(); //构造回调函数需要的数据 WfExecutedResult result = base.WfExecutedResult; result.ProcessInstanceIDStarted = processInstance.ID; result.Status = WfExecutedStatus.Success; }
internal override void ExecuteInstanceImp(IDbSession session) { //修改流程实例为返签状态 var pim = new ProcessInstanceManager(); pim.Reverse(base.BackwardContext.ProcessInstance.ID, base.ActivityResource.AppRunner, session); //创建新任务节点 var backMostPreviouslyActivityInstanceID = GetBackwardMostPreviouslyActivityInstanceID(); var nodeMediatorBackward = new NodeMediatorBackward(base.BackwardContext, session); nodeMediatorBackward.CreateBackwardActivityTaskTransitionInstance(base.BackwardContext.ProcessInstance, base.BackwardContext.BackwardFromActivityInstance, BackwardTypeEnum.Reversed, backMostPreviouslyActivityInstanceID, base.BackwardContext.BackwardToTargetTransitionGUID, TransitionTypeEnum.Backward, TransitionFlyingTypeEnum.NotFlying, base.ActivityResource, session); //构造回调函数需要的数据 WfExecutedResult result = base.WfExecutedResult; result.BackwardTaskReciever = base.BackwardContext.BackwardTaskReciever; result.Status = WfExecutedStatus.Success; }
/// <summary> /// 获取转移数据列表 /// </summary> /// <param name="appInstanceID">应用实例ID</param> /// <param name="processGUID">流程GUID</param> /// <returns>转移实例列表</returns> internal IEnumerable <TransitionInstanceEntity> GetTransitionInstanceList(string appInstanceID, string processGUID) { IEnumerable <TransitionInstanceEntity> list = new List <TransitionInstanceEntity>(); var pim = new ProcessInstanceManager(); var pi = pim.GetProcessInstanceCurrent(appInstanceID, processGUID); if (pi != null) { list = GetTransitionInstanceList(appInstanceID, processGUID, pi.ID); } return(list); }
/// <summary> /// 执行开始节点 /// </summary> /// <param name="activityExecutionObject"></param> /// <param name="processInstance"></param> internal override void ExecuteWorkItem() { try { //写入流程实例 ProcessInstanceManager pim = new ProcessInstanceManager(); pim.Insert(this.Session.Connection, ActivityForwardContext.ProcessInstance, this.Session.Transaction); CompleteAutomaticlly(ActivityForwardContext.ProcessInstance, ActivityForwardContext.ActivityResource, this.Session); //执行开始节点之后的节点集合 ContinueForwardCurrentNode(false); } catch (System.Exception ex) { throw; } }
/// <summary> /// 获取流程发起人信息 /// </summary> /// <param name="processInstanceID"></param> /// <returns></returns> public Performer GetProcessInitiator(int processInstanceID) { Performer performer = null; try { var pim = new ProcessInstanceManager(); performer = pim.GetProcessInitiator(processInstanceID); } catch { throw; } return performer; }
/// <summary> /// 获取运行中的流程实例 /// </summary> /// <param name="runner"></param> /// <returns></returns> public ProcessInstanceEntity GetRunningProcessInstance(WfAppRunner runner) { ProcessInstanceEntity entity = null; IDbConnection conn = SessionFactory.CreateConnection(); try { var pim = new ProcessInstanceManager(); entity = pim.GetRunningProcessInstance(conn, runner.AppName, runner.AppInstanceID, runner.ProcessGUID); } catch { throw; } finally { conn.Close(); } return entity; }
public ProcessInstanceEntity GetProcessInstanceByActivity(int activityInstanceID) { var pim = new ProcessInstanceManager(); var instance = pim.GetByActivity(activityInstanceID); return instance; }
/// <summary> /// 获取流程正常实例数据 /// </summary> /// <param name="runner"></param> /// <returns></returns> public ProcessInstanceEntity GetProcessInstance(WfAppRunner runner, IDbConnection conn = null) { if (conn == null) { conn = SessionFactory.CreateConnection(); } try { var pim = new ProcessInstanceManager(); var processInstance = pim.GetProcessInstanceLatest(runner.AppName, runner.AppInstanceID, runner.ProcessGUID); return processInstance; } catch { throw; } finally { conn.Close(); } }
/// <summary> /// 获取流程实例数据 /// </summary> /// <param name="processInstanceID"></param> /// <returns></returns> public ProcessInstanceEntity GetProcessInstance(int processInstanceID) { var pim = new ProcessInstanceManager(); var instance = pim.GetById(processInstanceID); return instance; }
public static WfRuntimeManager CreateRuntimeInstanceStartup(WfAppRunner runner, ProcessInstanceEntity parentProcessInstance, SubProcessNode subProcessNode, ref WfExecutedResult result) { //检查流程是否可以被启动 var rmins = new WfRuntimeManagerStartup(); rmins.WfExecutedResult = result = new WfExecutedResult(); var pim = new ProcessInstanceManager(); ProcessInstanceEntity processInstance = null; if (subProcessNode == null) { //正常流程启动 processInstance = pim.GetProcessInstanceLatest(runner.AppName, runner.AppInstanceID, runner.ProcessGUID); } else { //子流程启动 processInstance = pim.GetProcessInstanceLatest(runner.AppName, runner.AppInstanceID, subProcessNode.SubProcessGUID); } //不能同时启动多个主流程 if (processInstance != null && processInstance.ParentProcessInstanceID == null && processInstance.ProcessState == (short)ProcessStateEnum.Running) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Started_IsRunningAlready; result.Message = "流程已经处于运行状态,如果要重新启动,请先终止当前流程实例!"; return rmins; } rmins.AppRunner = runner; rmins.ParentProcessInstance = parentProcessInstance; rmins.InvokedSubProcessNode = subProcessNode; //获取流程第一个可办理节点 rmins.ProcessModel = new ProcessModel(runner.ProcessGUID); var firstActivity = rmins.ProcessModel.GetFirstActivity(); rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(firstActivity.ActivityGUID, runner.UserID, runner.UserName); rmins.ActivityResource = new ActivityResource(runner, rmins.AppRunner.NextActivityPerformers); return rmins; }
/// <summary> /// 执行子流程节点 /// </summary> internal override void ExecuteWorkItem() { try { if (base.Linker.FromActivity.ActivityType == ActivityTypeEnum.SubProcessNode) { //检查子流程是否结束 var pim = new ProcessInstanceManager(); bool isCompleted = pim.CheckSubProcessInstanceCompleted(Session.Connection, base.Linker.FromActivityInstance.ID, base.Linker.FromActivityInstance.ActivityGUID, Session.Transaction); if (isCompleted == false) { throw new WfRuntimeException(string.Format("当前子流程:[{0}]并没有到达结束状态,主流程无法向下执行。", base.Linker.FromActivity.ActivityName)); } } //完成当前的任务节点 bool canContinueForwardCurrentNode = CompleteWorkItem(ActivityForwardContext.TaskView.TaskID, ActivityForwardContext.ActivityResource, this.Session); if (canContinueForwardCurrentNode) { //获取下一步节点列表:并继续执行 ContinueForwardCurrentNode(false); } } catch (System.Exception ex) { throw; } }
/// <summary> /// 挂起流程实例 /// </summary> /// <param name="processInstanceID"></param> /// <param name="activityInsId"></param> /// <param name="activityId"></param> /// <param name="runner"></param> /// <returns></returns> public bool SuspendProcess(int taskId, WfAppRunner runner) { bool result = true; try { var pim = new ProcessInstanceManager(); var taskMng = new TaskManager(); TaskEntity taskentity = taskMng.GetTask(taskId); pim.Suspend(taskentity.ProcessInstanceID, runner, SessionFactory.CreateSession()); } catch (Exception ex) { result = false; } return result; }
/// <summary> /// 取消流程 /// </summary> /// <param name="canceller">执行操作的用户</param> /// <returns>执行结果的标志</returns> public bool CancelProcess(WfAppRunner runner) { var pim = new ProcessInstanceManager(); return pim.Cancel(runner); }
/// 恢复流程实例(只针对挂起操作) /// </summary> /// <param name="activityInstanceId">挂起操作的实例ID</param> /// <param name="runner"></param> /// <returns></returns> public bool ResumeProcess(int processInstanceId, WfAppRunner runner) { bool result = true; try { var pim = new ProcessInstanceManager(); pim.Resume(processInstanceId, runner, SessionFactory.CreateSession()); } catch (Exception ex) { result = false; } return result; }
/// <summary> /// 废弃流程 /// </summary> /// <param name="discarder">执行操作的用户</param> /// <returns>执行结果的标志</returns> public bool DiscardProcess(WfAppRunner runner) { var pim = new ProcessInstanceManager(); return pim.Discard(runner); }
/// <summary> /// 自动完成结束节点 /// </summary> /// <param name="processInstance"></param> /// <param name="fromActivityInstance"></param> /// <param name="activityResource"></param> /// <param name="wfLinqDataContext"></param> public GatewayExecutedResult CompleteAutomaticlly(ProcessInstanceEntity processInstance, string transitionGUID, ActivityInstanceEntity fromActivityInstance, ActivityResource activityResource, IDbSession session) { GatewayExecutedResult result = null; var toActivityInstance = base.CreateActivityInstanceObject(base.Linker.ToActivity, processInstance, activityResource.AppRunner); base.ActivityInstanceManager.Insert(toActivityInstance, session); base.ActivityInstanceManager.Complete(toActivityInstance.ID, activityResource.AppRunner, session); //写节点转移实例数据 base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, TransitionTypeEnum.Forward, TransitionFlyingTypeEnum.NotFlying, activityResource.AppRunner, session); //设置流程完成 ProcessInstanceManager pim = new ProcessInstanceManager(); pim.Complete(processInstance.ID, activityResource.AppRunner, session); //发送流程结束消息给流程启动人 return result; }
/// <summary> /// 流程返签,先检查约束条件,然后调用wfruntimeinstance执行 /// </summary> /// <param name="appName"></param> /// <param name="appInstanceID"></param> /// <param name="processGUID"></param> /// <param name="userID"></param> /// <param name="userName"></param> /// <returns></returns> public static WfRuntimeManager CreateRuntimeInstanceReverse(WfAppRunner runner, ref WfExecutedResult result) { var rmins = new WfRuntimeManagerReverse(); rmins.WfExecutedResult = result = new WfExecutedResult(); var pim = new ProcessInstanceManager(); var processInstance = pim.GetProcessInstanceLatest(runner.AppName, runner.AppInstanceID, runner.ProcessGUID); if (processInstance == null || processInstance.ProcessState != (short)ProcessStateEnum.Completed) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Reverse_NotInCompleted; result.Message = string.Format("当前应用:{0},实例ID:{1}, 没有完成的流程实例,无法让流程重新运行!", runner.AppName, runner.AppInstanceID); return rmins; } var tim = new TransitionInstanceManager(); var endTransitionInstance = tim.GetEndTransition(runner.AppName, runner.AppInstanceID, runner.ProcessGUID); var processModel = new ProcessModel(runner.ProcessGUID); var endActivity = processModel.GetActivity(endTransitionInstance.ToActivityGUID); var aim = new ActivityInstanceManager(); var endActivityInstance = aim.GetById(endTransitionInstance.ToActivityInstanceID); bool hasGatewayNode = false; var lastTaskActivityInstance = tim.GetPreviousActivityInstance(endActivityInstance, false, out hasGatewayNode).ToList()[0]; var lastTaskActivity = processModel.GetActivity(lastTaskActivityInstance.ActivityGUID); //封装返签结束点之前办理节点的任务接收人 rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(lastTaskActivityInstance.ActivityGUID, lastTaskActivityInstance.EndedByUserID, lastTaskActivityInstance.EndedByUserName); rmins.ActivityResource = new ActivityResource(runner, rmins.AppRunner.NextActivityPerformers); rmins.AppRunner.AppName = runner.AppName; rmins.AppRunner.AppInstanceID = runner.AppInstanceID; rmins.AppRunner.ProcessGUID = runner.ProcessGUID; rmins.AppRunner.UserID = runner.UserID; rmins.AppRunner.UserName = runner.UserName; rmins.BackwardContext.ProcessInstance = processInstance; rmins.BackwardContext.BackwardToTaskActivity = lastTaskActivity; rmins.BackwardContext.BackwardToTaskActivityInstance = lastTaskActivityInstance; rmins.BackwardContext.BackwardToTargetTransitionGUID = hasGatewayNode == false ? endTransitionInstance.TransitionGUID : String.Empty; rmins.BackwardContext.BackwardFromActivity = endActivity; rmins.BackwardContext.BackwardFromActivityInstance = endActivityInstance; rmins.BackwardContext.BackwardTaskReciever = WfBackwardTaskReciever.Instance(lastTaskActivityInstance.ActivityName, lastTaskActivityInstance.EndedByUserID, lastTaskActivityInstance.EndedByUserName); return rmins; }