public async Task <ActionResult> Add(LeaveViewModel leave) { string processGUID = leave.ProcessGUID; //验证不通过,重新填写表单 if (!ModelState.IsValid) { return(View()); } IWorkflowService service = new WorkflowService(); //流程开始第一步 ActivityEntity firstActivity = service.GetFirstActivity(leave.ProcessGUID); //该处较上一版本有变化,上一版本为GUID类型 string firstActivityGUID = firstActivity.ActivityGUID; IList <NodeView> nextActivity = service.GetNextActivity(leave.ProcessGUID, firstActivityGUID, GetCondition("days-" + leave.Days)); //表示有下一位审批者 if (nextActivity.Count() > 0) { //下一步角色ID审批者 string outerId = nextActivity[0].Roles[0].ID.ToString(); //这里只取第一个审批者,WebDemo 是弹窗形式选择 //审批用户id IEnumerable <int> userId = RoleManager.FindById(Convert.ToInt32(outerId)).Users.Select(t => t.UserId); ApplicationUser user = await UserManager.FindByIdAsync(Convert.ToInt32(userId.ToList()[0])); //提交请假信息 LeaveEntity leaveE = new LeaveEntity() { FromDate = leave.BeginTime, ToDate = leave.EndTime, Days = leave.Days, LeaveType = leave.LeaveType, CurrentActivityText = "", Status = 0, CreatedUserID = Convert.ToInt32(User.Identity.GetUserId()), CreatedUserName = User.Identity.Name, CreatedDate = DateTime.Now }; HrsLeaveResult result = new WorkFlowManager().Insert(leaveE); if (result.Successed) { WfAppRunner initiator = new WfAppRunner(); initiator.AppName = "请假流程"; initiator.AppInstanceID = result.ResultIdentities.ToString(); initiator.ProcessGUID = processGUID; initiator.UserID = User.Identity.GetUserId(); initiator.UserName = User.Identity.Name; initiator.Conditions = GetCondition(string.Format("days-{0}", leave.Days)); WfExecutedResult startedResult = service.StartProcess(initiator); if (startedResult.Status != WfExecutedStatus.Success) { //给出提示 } //送往下一步 PerformerList pList = new PerformerList(); //这里使用真实姓名代替 pList.Add(new Performer(user.Id.ToString(), user.RealName)); initiator.NextActivityPerformers = new Dictionary <String, PerformerList>(); initiator.NextActivityPerformers.Add(nextActivity[0].ActivityGUID, pList); WfExecutedResult runAppResult = service.RunProcessApp(initiator); if (runAppResult.Status != WfExecutedStatus.Success) { this.Content("<script>alert('" + runAppResult.Message + "');</script>"); } //保存业务数据 BizAppFlowEntity AppFlowEntity = new BizAppFlowEntity(); AppFlowEntity.AppName = "流程发起"; AppFlowEntity.AppInstanceID = result.ResultIdentities.ToString(); AppFlowEntity.ActivityName = "流程发起"; AppFlowEntity.Remark = string.Format("申请人:{0}-{1}", User.Identity.GetUserId(), User.Identity.Name); AppFlowEntity.ChangedTime = DateTime.Now; AppFlowEntity.ChangedUserID = User.Identity.GetUserId(); AppFlowEntity.ChangedUserName = User.Identity.Name; HrsLeaveResult resultBiz = new WorkFlowManager().Insert(AppFlowEntity); if (resultBiz.Successed) { //给出前台提示 this.Content("", "<script>alert('流程发起成功');</script>"); } } } else { //显示前台错误,人事人员审批失败 ModelState.AddModelError("Human", "该用户暂时不可提交审批,未查询到该用户的下一位审批者"); return(View()); } return(RedirectToAction("MySlickflow", "Slickflow")); }
private void runtimeInstance_OnWfProcessStarted(object sender, WfEventArgs args) { _startedResult = args.WfExecutedResult; }
/// <summary> /// 会签类型的主节点, 多实例节点处理 /// </summary> /// <param name="toActivity">目的活动</param> /// <param name="processInstance">流程实例</param> /// <param name="fromActivityInstance">来源活动实例</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="transitionType">转移类型</param> /// <param name="flyingType">飞跃类型</param> /// <param name="activityResource">活动资源</param> /// <param name="session">数据上下文</param> internal new void CreateMultipleInstance(ActivityEntity toActivity, ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, String transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { //实例化主节点Activity var toActivityInstance = CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner); //主节点实例数据 toActivityInstance.ActivityState = (short)ActivityStateEnum.Suspended; toActivityInstance.ComplexType = (short)ComplexTypeEnum.SignTogether; if (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Parallel) { toActivityInstance.CompleteOrder = toActivity.ActivityTypeDetail.CompleteOrder; } toActivityInstance.AssignedToUserIDs = GenerateActivityAssignedUserIDs( activityResource.NextActivityPerformers[toActivity.ActivityGUID]); //插入主节点实例数据 base.ActivityInstanceManager.Insert(toActivityInstance, session); //插入主节点转移数据 InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); //插入会签子节点实例数据 var plist = activityResource.NextActivityPerformers[toActivity.ActivityGUID]; ActivityInstanceEntity entity = new ActivityInstanceEntity(); for (short i = 0; i < plist.Count; i++) { entity = base.ActivityInstanceManager.CreateActivityInstanceObject(toActivityInstance); entity.AssignedToUserIDs = plist[i].UserID; entity.AssignedToUserNames = plist[i].UserName; entity.MIHostActivityInstanceID = toActivityInstance.ID; entity.CompleteOrder = (short)(i + 1); //只有第一个节点处于运行状态,其它节点挂起 if ((i > 0) && (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Sequence)) { entity.ActivityState = (short)ActivityStateEnum.Suspended; } //插入活动实例数据,并返回活动实例ID entity.ID = base.ActivityInstanceManager.Insert(entity, session); //插入任务数据 base.TaskManager.Insert(entity, plist[i], activityResource.AppRunner, session); //启动子流程 using (var subSession = DbFactory.CreateSession()) { WfExecutedResult startedResult = null; var subProcessNode = (SubProcessNode)toActivity.Node; subProcessNode.ActivityInstance = entity; //在流程实例表中记录激活子流程的活动节点ID WfAppRunner subRunner = CopyActivityForwardRunner(activityResource.AppRunner, plist[i], subProcessNode); var runtimeInstance = WfRuntimeManagerFactory.CreateRuntimeInstanceStartupSub(subRunner, processInstance, subProcessNode, plist, ref startedResult); if (runtimeInstance.WfExecutedResult.Status == WfExecutedStatus.Exception) { throw new WfRuntimeException(runtimeInstance.WfExecutedResult.Message); } runtimeInstance.Execute(subSession); //如果是串行会签,只有第一个子流程可以运行,其它子流程处于挂起状态 if ((i > 0) && (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Sequence)) { var startResult = (WfExecutedResult)runtimeInstance.WfExecutedResult; base.ProcessInstanceManager.Suspend(startedResult.ProcessInstanceIDStarted, subRunner, subSession); } } } }
public async Task <ActionResult> Approval(string type = "agree", string processGUID = "", int instanceId = 0, double days = 0) { var resolveRequest = HttpContext.Request; resolveRequest.InputStream.Seek(0, System.IO.SeekOrigin.Begin); string jsonString = new System.IO.StreamReader(resolveRequest.InputStream).ReadToEnd(); try { IWorkflowService service = new WorkflowService(); WfAppRunner runner = new WfAppRunner(); runner.AppInstanceID = instanceId.ToString(); runner.ProcessGUID = processGUID; runner.UserID = User.Identity.GetUserId(); IList <NodeView> NodeViewList = service.GetNextActivityTree(runner, GetCondition("days-" + days)); var leave = JsonConvert.DeserializeObject <LeaveEntity>(jsonString); leave.ID = instanceId; //调用流程 WfAppRunner initiator = new WfAppRunner(); initiator.AppName = "请假流程"; initiator.AppInstanceID = instanceId.ToString(); initiator.ProcessGUID = processGUID; initiator.UserID = User.Identity.GetUserId(); initiator.UserName = User.Identity.GetUserName(); initiator.Conditions = GetCondition(string.Format("days-{0}", days)); //后续节点不用传入条件表达式 //获取下一步审批人信息 //下一步角色ID审批者 PerformerList pList = new PerformerList(); if (NodeViewList[0].Roles.Count > 0) { string outerId = NodeViewList[0].Roles[0].ID.ToString(); //这里只取第一个审批者,WebDemo 是弹窗形式选择 //审批用户id IEnumerable <int> userId = RoleManager.FindById(Convert.ToInt32(outerId)).Users.Select(t => t.UserId); ApplicationUser user = await UserManager.FindByIdAsync(Convert.ToInt32(userId.ToList()[0])); //送往下一步 pList.Add(new Performer(user.Id.ToString(), user.RealName)); } initiator.NextActivityPerformers = new Dictionary <String, PerformerList>(); initiator.NextActivityPerformers.Add(NodeViewList[0].ActivityGUID, pList); WfExecutedResult runAppResult = service.RunProcessApp(initiator); if (runAppResult.Status != WfExecutedStatus.Success) { } ProcessEntity processEntity = service.GetProcessById(processGUID); if (processEntity != null) { ActivityInstanceEntity activityInstanceEntity = service.GetActivityInstance(instanceId); if (activityInstanceEntity != null) { //CurrentActivityText = activityInstanceEntity.ActivityName; } } new WorkFlowManager().UpdateHrsLeave(leave); } catch (Exception ex) { return(Json(new { success = false, message = ex.Message })); } return(Json(new { success = true, message = "执行成功" })); }
//送往下一步 protected void btnSendNext_Click(object sender, EventArgs e) { try { string processGUID = this.txtProcessGUID.Value.ToString(); string stepGuid = this.hiddenStepGuid.Value.ToString(); int stepUserID = Helper.ConverToInt32(this.hiddenStepUser.Value.ToString().Trim()); decimal days = Helper.ConverToDecimal(this.txtDays.Value); string instanceId = this.hiddenInstanceId.Value; string DepManagerRemark = this.txtDepmanagerRemark.Value; string DirectorRemark = this.txtDirectorRemark.Value; string DeputyGeneralRemark = this.txtDeputyGeneralRemark.Value; string GeneralManagerRemark = this.txtGeneralManagerRemark.Value; int activityInstanceID = Helper.ConverToInt32(hiddenActivityInstanceID.Value); string CurrentActivityText = string.Empty;; int nextUserID = 0; string nextUserName = string.Empty; SysUserEntity userEntity = WorkFlows.GetSysUserModel(stepUserID); if (userEntity != null && userEntity.ID > 0) { nextUserID = userEntity.ID; nextUserName = userEntity.UserName; } DateTime now = DateTime.Now; if (!string.IsNullOrEmpty(instanceId)) { //调用流程 IWorkflowService service = new WorkflowService(); WfAppRunner initiator = new WfAppRunner(); initiator.AppName = "请假流程"; initiator.AppInstanceID = instanceId; initiator.ProcessGUID = processGUID; initiator.UserID = LoginUserID.ToString(); initiator.UserName = LoginUserName; initiator.Conditions = GetCondition(string.Format("days-{0}", days)); //送往下一步 PerformerList pList = new PerformerList(); pList.Add(new Performer(nextUserID.ToString(), nextUserName)); initiator.NextActivityPerformers = new Dictionary <String, PerformerList>(); initiator.NextActivityPerformers.Add(stepGuid, pList); WfExecutedResult runAppResult = service.RunProcessApp(initiator); if (runAppResult.Status != WfExecutedStatus.Success) { base.RegisterStartupScript("", "<script>alert('" + runAppResult.Message + "');</script>"); return; } ProcessEntity processEntity = service.GetProcessById(processGUID); if (processEntity != null) { ActivityInstanceEntity activityInstanceEntity = service.GetActivityInstance(activityInstanceID); if (activityInstanceEntity != null) { CurrentActivityText = activityInstanceEntity.ActivityName; } } try { //保存业务数据 BizAppFlowEntity AppFlowEntity = new Entity.BizAppFlowEntity(); AppFlowEntity.AppName = "请假流程"; AppFlowEntity.AppInstanceID = instanceId.ToString(); AppFlowEntity.ActivityName = CurrentActivityText; AppFlowEntity.Remark = string.Format("申请人:{0}-{1}", LoginUserID, LoginUserName) + CurrentActivityText; AppFlowEntity.ChangedTime = now; AppFlowEntity.ChangedUserID = LoginUserID; AppFlowEntity.ChangedUserName = LoginUserName; WorkFlows.AddBizAppFlow(AppFlowEntity); } catch (Exception ex) { } try { HrsLeaveEntity hrsLeaveEntity = new Entity.HrsLeaveEntity(); hrsLeaveEntity.ID = Helper.ConverToInt32(instanceId); hrsLeaveEntity.DepManagerRemark = DepManagerRemark; hrsLeaveEntity.DirectorRemark = DirectorRemark; hrsLeaveEntity.DeputyGeneralRemark = DeputyGeneralRemark; hrsLeaveEntity.GeneralManagerRemark = GeneralManagerRemark; hrsLeaveEntity.CurrentActivityText = CurrentActivityText; WorkFlows.UpdateHrsLeave(hrsLeaveEntity); } catch (Exception ex) { } base.RegisterStartupScript("", "<script>alert('办理成功');window.location.href='FlowList.aspx';</script>"); } } catch (Exception ex) { base.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('流程发起出现异常 EXCEPTION:" + ex.ToString() + "');</script>"); } }
//送往下一步 protected void btnSendNext_Click(object sender, EventArgs e) { try { DateTime now = DateTime.Now; string CurrentActivityText = string.Empty; string currentOpinionRemark = string.Empty; string processGUID = this.txtProcessGUID.Value.ToString(); decimal days = Helper.ConverToDecimal(this.txtDays.Value); string instanceId = this.hiddenInstanceId.Value; string DepManagerRemark = this.txtDepmanagerRemark.Value; string DirectorRemark = this.txtDirectorRemark.Value; string DeputyGeneralRemark = this.txtDeputyGeneralRemark.Value; string GeneralManagerRemark = this.txtGeneralManagerRemark.Value; int activityInstanceID = Helper.ConverToInt32(hiddenActivityInstanceID.Value); string strNextActivityPerformers = hiddenNextActivityPerformers.Value.ToString().Trim(); IDictionary <string, PerformerList> nextActivityPerformers = NextActivityPerformers(strNextActivityPerformers); if (nextActivityPerformers == null) { base.RegisterStartupScript("", "<script>alert('请选择办理步骤或办理人员');</script>"); return; } switch (hiddenPerformField.Value.ToString()) { case "DepManager": //部门经理 currentOpinionRemark = this.txtDepmanagerRemark.Value; break; case "Director": //主管总监 currentOpinionRemark = this.txtDirectorRemark.Value; break; case "Deputy": //副总经理 currentOpinionRemark = this.txtDeputyGeneralRemark.Value; break; case "General": //总经理 currentOpinionRemark = this.txtGeneralManagerRemark.Value; break; } if (!string.IsNullOrEmpty(instanceId)) { //调用流程 IWorkflowService service = new WorkflowService(); WfAppRunner initiator = new WfAppRunner(); initiator.AppName = "请假流程"; initiator.AppInstanceID = instanceId; initiator.ProcessGUID = processGUID; initiator.UserID = LoginUserID.ToString(); initiator.UserName = LoginUserName; initiator.Conditions = GetCondition(string.Format("days-{0}", days)); initiator.NextActivityPerformers = nextActivityPerformers; WfExecutedResult runAppResult = service.RunProcessApp(initiator); if (runAppResult.Status != WfExecutedStatus.Success) { base.RegisterStartupScript("", "<script>alert('" + runAppResult.Message + "');</script>"); return; } ActivityInstanceEntity activityInstanceEntity = service.GetActivityInstance(activityInstanceID); if (activityInstanceEntity != null) { CurrentActivityText = activityInstanceEntity.ActivityName; } try { //保存业务数据 BizAppFlowEntity AppFlowEntity = new Entity.BizAppFlowEntity(); AppFlowEntity.AppName = "请假流程"; AppFlowEntity.AppInstanceID = instanceId.ToString(); AppFlowEntity.ActivityName = CurrentActivityText; AppFlowEntity.Remark = string.Format("{0}(ID:{1}) {2}", LoginUserName, LoginUserID, currentOpinionRemark); AppFlowEntity.ChangedTime = now; AppFlowEntity.ChangedUserID = LoginUserID.ToString(); AppFlowEntity.ChangedUserName = LoginUserName; WorkFlows.AddBizAppFlow(AppFlowEntity); } catch (Exception ex) { } try { HrsLeaveEntity hrsLeaveEntity = new Entity.HrsLeaveEntity(); hrsLeaveEntity.ID = Helper.ConverToInt32(instanceId); hrsLeaveEntity.DepManagerRemark = DepManagerRemark; hrsLeaveEntity.DirectorRemark = DirectorRemark; hrsLeaveEntity.DeputyGeneralRemark = DeputyGeneralRemark; hrsLeaveEntity.GeneralManagerRemark = GeneralManagerRemark; hrsLeaveEntity.CurrentActivityText = CurrentActivityText; WorkFlows.UpdateHrsLeave(hrsLeaveEntity); } catch (Exception ex) { } base.RegisterStartupScript("", "<script>alert('办理成功');window.location.href='FlowList.aspx';</script>"); } } catch (Exception ex) { base.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('流程发起出现异常 EXCEPTION:" + ex.ToString() + "');</script>"); } }
private void runtimeInstance_OnWfProcessSentBack(object sender, WfEventArgs args) { _sendbackResult = args.WfExecutedResult; waitHandler.Set(); }
/// <summary> /// 退回操作 /// </summary> /// <param name="runner">执行者</param> /// <param name="result">结果对象</param> /// <returns>运行时实例对象</returns> internal static WfRuntimeManager CreateRuntimeInstanceSendBack(WfAppRunner runner, ref WfExecutedResult result) { var rmins = new WfRuntimeManagerSendBack(); rmins.WfExecutedResult = result = new WfExecutedResult(); //没有指定退回节点信息 if (runner.NextPerformerType != NextPerformerIntTypeEnum.Traced && (runner.NextActivityPerformers == null || runner.NextActivityPerformers.Count == 0)) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_IsNull; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceSendBack.null.error"); return(rmins); } //先查找当前用户正在办理的运行节点 var aim = new ActivityInstanceManager(); TaskViewEntity taskView = null; var runningNode = aim.GetRunningNode(runner, out taskView); if (runningNode == null) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_NotInRunning; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceSendBack.nonerun.error"); return(rmins); } if (aim.IsMineTask(runningNode, runner.UserID) == false) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_NotMineTask; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceSendBack.nonetask.error"); return(rmins); } var activityType = EnumHelper.ParseEnum <ActivityTypeEnum>(runningNode.ActivityType.ToString()); if (XPDLHelper.IsSimpleComponentNode(activityType) == false) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_NotTaskNode; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceSendBack.nottask.error"); return(rmins); } //获取上一步节点信息 var hasGatewayPassed = false; var processInstance = (new ProcessInstanceManager()).GetById(runningNode.ProcessInstanceID); var processModel = ProcessModelFactory.Create(processInstance.ProcessGUID, processInstance.Version); var previousStepChecker = new PreviousStepChecker(); var previousActivityList = previousStepChecker.GetPreviousActivityList(runningNode, processModel, out hasGatewayPassed); //判断退回是否有效 if (previousActivityList == null || previousActivityList.Count == 0) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_IsNull; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceSendBack.empty.error"); return(rmins); } //前端用户指定退回步骤的模式 if (runner.NextPerformerType != NextPerformerIntTypeEnum.Traced) { if (runner.NextActivityPerformers == null || runner.NextActivityPerformers.Count == 0) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_IsNull; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceSendBack.noneperformer.error"); return(rmins); } //检查节点是否一致 if (previousActivityList.Count == 1) { var onlyActivityGUID = previousActivityList[0].ActivityGUID; var isOnly = true; foreach (var step in runner.NextActivityPerformers) { if (step.Key != onlyActivityGUID) { isOnly = false; break; } } //存在不一致的退回节点 if (isOnly == false) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_IsTooManyPrevious; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceSendBack.notunique.error"); return(rmins); } } } else { //Traced 用于直接返回上一步使用,测试模式 var prevActivity = previousActivityList[0]; var performerList = PerformerBuilder.CreatePerformerList(runningNode.CreatedByUserID, runningNode.CreatedByUserName); runner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(prevActivity.ActivityGUID, performerList); } //创建运行时 rmins.TaskView = taskView; rmins.RunningActivityInstance = runningNode; rmins.ProcessInstanceID = runningNode.ProcessInstanceID; rmins.ProcessInstance = processInstance; rmins.ProcessModel = processModel; rmins.AppRunner.AppName = runner.AppName; rmins.AppRunner.AppInstanceID = runner.AppInstanceID; rmins.AppRunner.UserID = runner.UserID; rmins.AppRunner.UserName = runner.UserName; rmins.AppRunner.NextActivityPerformers = runner.NextActivityPerformers; //设置退回选项类 var sendbackOperation = new SendBackOperation(); sendbackOperation.BackwardType = BackwardTypeEnum.Sendback; sendbackOperation.ProcessInstance = processInstance; sendbackOperation.BackwardFromActivityInstance = runningNode; sendbackOperation.HasGatewayPassed = hasGatewayPassed; sendbackOperation.ActivityResource = new ActivityResource(runner, rmins.AppRunner.NextActivityPerformers); sendbackOperation.ProcessModel = processModel; sendbackOperation.IsCancellingBrothersNode = (runner.ControlParameterSheet != null && runner.ControlParameterSheet.IsCancellingBrothersNode == 1) ? true : false; rmins.SendBackOperation = sendbackOperation; return(rmins); }
/// <summary> /// 退回操作的处理逻辑 /// </summary> /// <param name="session">会话</param> internal override void ExecuteInstanceImp(IDbSession session) { WfExecutedResult result = base.WfExecutedResult; var runner = this.AppRunner; var runningNode = this.RunningActivityInstance; var sendbackOperation = base.SendBackOperation; if (runningNode.MIHostActivityInstanceID == null) { //普通节点 sendbackOperation.CurrentNodeOperationType = SendBackOperationTypeEnum.Normal; foreach (var step in runner.NextActivityPerformers) { var prevActivityGUID = step.Key; var prevActivity = this.ProcessModel.GetActivity(prevActivityGUID); sendbackOperation.BackwardToTaskActivity = prevActivity; if (this.ProcessModel.IsTaskNode(prevActivity)) { //退回到也是普通节点 sendbackOperation.PreviousNodeOperationType = SendBackOperationTypeEnum.Normal; } else if (this.ProcessModel.IsMINode(prevActivity) == true) { if (this.ProcessModel.IsMISequence(prevActivity) == true) { //退回到会签节点 //模式:串行会签的最后一步 sendbackOperation.PreviousNodeOperationType = SendBackOperationTypeEnum.MISPreviousIsLastOne; } else { //退回到会签节点 //模式:并行会签节点 sendbackOperation.PreviousNodeOperationType = SendBackOperationTypeEnum.MIPAllIsInCompletedState; } } else { throw new ApplicationException("不支持的退回节点类型,请联系技术人员!"); } //执行退回方法 //只要出现多个步骤人员选项,就需要生成同样的多笔退回活动记录和相应的待办任务 var performerList = step.Value; DistributeEachPerformerTask(sendbackOperation, step.Value, session); } } else { //会签节点 sendbackOperation.CurrentNodeOperationType = SendBackOperationTypeEnum.MultipleInstance; foreach (var step in runner.NextActivityPerformers) { var prevActivityGUID = step.Key; var prevActivity = this.ProcessModel.GetActivity(prevActivityGUID); sendbackOperation.BackwardToTaskActivity = prevActivity; //判断会签模式的子类型,然后进行退回处理 if (runningNode.CompleteOrder == 1) { //只有串行模式下有CompleteOrder的值为 1 //串行模式多实例的第一个执行节点,此时可退回到上一步 sendbackOperation.CurrentMultipleInstanceDetailType = SendBackOperationTypeEnum.MISFirstOneIsRunning; } else if (runningNode.CompleteOrder > 1) { //已经是中间节点,只能退回到上一步多实例子节点 sendbackOperation.CurrentMultipleInstanceDetailType = SendBackOperationTypeEnum.MISOneIsRunning; } else if (runningNode.CompleteOrder == -1) { sendbackOperation.CurrentMultipleInstanceDetailType = SendBackOperationTypeEnum.MIPOneIsRunning; } else { throw new ApplicationException("不支持的退回节点类型,请联系技术人员!"); } //执行退回方法 //只要出现多个步骤人员选项,就需要生成同样的多笔退回活动记录和相应的待办任务 var performerList = step.Value; DistributeEachPerformerTask(sendbackOperation, step.Value, session); } } //更新运行节点状态 SetRunningNodeSendBack(session); //构造回调函数需要的数据 result.Status = WfExecutedStatus.Success; }
/// <summary> /// 事件回调 /// </summary> /// <param name="runtimeType"></param> /// <param name="result"></param> internal void Callback(WfExecutedResult result) { WfEventArgs args = new WfEventArgs(result); _onWfProcessExecuted(this, args); }
public IHttpActionResult StartProcess(ODataActionParameters parameters) { WfRunner WfRunner = parameters["WfRunner"] as WfRunner; var WfAppRunner = WfRunner.ToAppRunner(); IWorkflowService wfService = new WorkflowService(); IDbConnection conn = new SqlConnection(DBConfig.ConnectionString); conn.Open(); IDictionary <string, Slickflow.Engine.Common.PerformerList> NextActivityPerformers = WfAppRunner.NextActivityPerformers; int ProcInstID; IDbTransaction trans = null; try { trans = conn.BeginTransaction(); WfExecutedResult result = wfService.StartProcess(conn, WfAppRunner, trans); int newProcessInstanceID = result.ProcessInstanceIDStarted; if (result.Status == WfExecutedStatus.Success) { trans.Commit(); ProcInstID = newProcessInstanceID; //return Ok(ProcInstID); } else { trans.Rollback(); return(BadRequest(result.Message)); } } catch (WorkflowException w) { trans.Rollback(); return(BadRequest(w.Message)); } finally { trans.Dispose(); if (conn.State == ConnectionState.Open) { conn.Close(); } } conn.Open(); try { WfAppRunner.NextActivityPerformers = NextActivityPerformers; trans = conn.BeginTransaction(); WfExecutedResult result = wfService.RunProcessApp(conn, WfAppRunner, trans); if (result.Status == WfExecutedStatus.Success) { trans.Commit(); return(Ok(ProcInstID)); } else { trans.Rollback(); return(BadRequest(result.Message)); } } catch (WorkflowException w) { trans.Rollback(); return(BadRequest(w.Message)); } finally { trans.Dispose(); if (conn.State == ConnectionState.Open) { conn.Close(); } } }
/// <summary> /// 流程返签,先检查约束条件,然后调用wfruntimeinstance执行 /// </summary> /// <param name="runner">执行者</param> /// <param name="result">结果对象</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.AppInstanceID, runner.ProcessGUID); if (processInstance == null || processInstance.ProcessState != (short)ProcessStateEnum.Completed) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Reverse_NotInCompleted; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceReverse.error"); return(rmins); } //用于注册事件时候的流程ID rmins.ProcessInstanceID = processInstance.ID; var tim = new TransitionInstanceManager(); var endTransitionInstance = tim.GetEndTransition(runner.AppName, runner.AppInstanceID, runner.ProcessGUID); var processModel = ProcessModelFactory.Create(processInstance.ProcessGUID, processInstance.Version); var endActivity = processModel.GetActivity(endTransitionInstance.ToActivityGUID); var aim = new ActivityInstanceManager(); var endActivityInstance = aim.GetById(endTransitionInstance.ToActivityInstanceID); bool hasGatewayNode = false; var npc = new PreviousStepChecker(); var lastTaskActivityInstance = npc.GetPreviousActivityInstanceList(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.BackwardTaskReceiver = WfBackwardTaskReceiver.Instance(lastTaskActivityInstance.ActivityName, lastTaskActivityInstance.EndedByUserID, lastTaskActivityInstance.EndedByUserName); return(rmins); }
/// <summary> /// 创建撤销处理运行时 /// </summary> /// <param name="runner">撤销人</param> /// <param name="result">创建结果</param> /// <returns>运行时管理器</returns> internal static WfRuntimeManager CreateRuntimeInstanceWithdraw(WfAppRunner runner, ref WfExecutedResult result) { var rmins = new WfRuntimeManagerSendBack(); rmins.WfExecutedResult = result = new WfExecutedResult(); if (runner.TaskID == null) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Withdraw_ErrorArguments; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceWithdraw.missingtaskid.error"); return(rmins); } //获取已经完成任务的信息 var tm = new TaskManager(); var taskDone = tm.GetTaskView(runner.TaskID.Value); if (tm.IsMine(taskDone, runner.UserID) == false) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_NotMineTask; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceWithdraw.nonetask.error"); return(rmins); } //赋值下一步办理列表 runner.NextActivityPerformers = NextStepUtility.CreateNextStepPerformerList(taskDone.ActivityGUID, taskDone.AssignedToUserID, taskDone.AssignedToUserName); //没有指定退回节点信息 if (runner.NextActivityPerformers == null || runner.NextActivityPerformers.Count == 0) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_IsNull; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceWithdraw.noneperformer.error"); return(rmins); } //获取待办任务 var tim = new TransitionInstanceManager(); var nextStepList = tim.GetTargetActivityInstanceList(taskDone.ActivityInstanceID).ToList(); ActivityInstanceEntity runningNode = nextStepList.Count > 0 ? nextStepList[0] : null; if (runningNode == null) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_NotInRunning; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceWithdraw.nonerun.error"); return(rmins); } var activityType = EnumHelper.ParseEnum <ActivityTypeEnum>(runningNode.ActivityType.ToString()); if (XPDLHelper.IsSimpleComponentNode(activityType) == false) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_NotTaskNode; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceWithdraw.nottask.error"); return(rmins); } //获取待办任务(模拟待办任务用户做退回处理) var taskToDo = tm.GetTaskViewByActivity(runningNode.ProcessInstanceID, runningNode.ID); runner.UserID = taskToDo.AssignedToUserID; runner.UserName = taskToDo.AssignedToUserName; //获取上一步节点信息 var hasGatewayPassed = false; var processInstance = (new ProcessInstanceManager()).GetById(runningNode.ProcessInstanceID); var previousStepChecker = new PreviousStepChecker(); var processModel = ProcessModelFactory.Create(taskToDo.ProcessGUID, taskToDo.Version); var previousActivityList = previousStepChecker.GetPreviousActivityList(runningNode, processModel, out hasGatewayPassed); //判断退回是否有效 if (previousActivityList == null || previousActivityList.Count == 0) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_IsNull; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceWithdraw.empty.error"); return(rmins); } //检查节点是否一致 if (previousActivityList.Count == 1) { var onlyActivityGUID = previousActivityList[0].ActivityGUID; var isOnly = true; foreach (var step in runner.NextActivityPerformers) { if (step.Key != onlyActivityGUID) { isOnly = false; break; } } //存在不一致的退回节点 if (isOnly == false) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_IsTooManyPrevious; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceWithdraw.notunique.error"); return(rmins); } } //创建运行时 rmins.TaskView = taskToDo; rmins.RunningActivityInstance = runningNode; rmins.ProcessInstanceID = runningNode.ProcessInstanceID; rmins.ProcessInstance = processInstance; rmins.ProcessModel = processModel; rmins.AppRunner.AppName = runner.AppName; rmins.AppRunner.AppInstanceID = runner.AppInstanceID; rmins.AppRunner.UserID = runner.UserID; rmins.AppRunner.UserName = runner.UserName; rmins.AppRunner.NextActivityPerformers = runner.NextActivityPerformers; //设置退回选项类 var sendbackOperation = new SendBackOperation(); sendbackOperation.BackwardType = BackwardTypeEnum.Withdrawed; sendbackOperation.ProcessInstance = processInstance; sendbackOperation.BackwardFromActivityInstance = runningNode; sendbackOperation.HasGatewayPassed = hasGatewayPassed; sendbackOperation.ActivityResource = new ActivityResource(runner, rmins.AppRunner.NextActivityPerformers); sendbackOperation.ProcessModel = processModel; sendbackOperation.IsCancellingBrothersNode = true; //撤销时默认撤销各个并行分支 rmins.SendBackOperation = sendbackOperation; return(rmins); }
/// <summary> /// 创建跳转实例信息 /// </summary> /// <param name="runner">执行者</param> /// <param name="result">结果对象</param> /// <returns>运行时实例对象</returns> public static WfRuntimeManager CreateRuntimeInstanceJump(WfAppRunner runner, ref WfExecutedResult result) { var rmins = new WfRuntimeManagerJump(); rmins.WfExecutedResult = result = new WfExecutedResult(); if (string.IsNullOrEmpty(runner.AppName) || String.IsNullOrEmpty(runner.AppInstanceID) || runner.ProcessGUID == null || runner.NextActivityPerformers == null) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Jump_ErrorArguments; result.Message = "方法参数错误,无法运行流程!"; return(rmins); } //流程跳转时,只能跳转到一个节点 if (runner.NextActivityPerformers.Count() > 1) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Jump_OverOneStep; result.Message = string.Format("不能跳转到多个节点!节点数:{0}", runner.NextActivityPerformers.Count()); return(rmins); } //获取当前运行节点信息 var aim = new ActivityInstanceManager(); TaskViewEntity taskView = null; var runningNode = aim.GetRunningNode(runner, out taskView); //传递runner变量 rmins.TaskView = taskView; rmins.AppRunner = runner; 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; var processModel = ProcessModelFactory.Create(taskView.ProcessGUID, taskView.Version); rmins.ProcessModel = processModel; #region 考虑回跳方式 ////获取跳转节点信息 //var jumpActivityGUID = runner.NextActivityPerformers.First().Key; //var jumpActivityInstanceList = aim.GetActivityInstance(runner.AppInstanceID, runner.ProcessGUID, jumpActivityGUID); //if (jumpActivityInstanceList != null // && jumpActivityInstanceList.Count > 0) //{ // //跳转到曾经执行过的节点上,可以作为跳回方式处理 // rmins.IsBackward = true; // rmins.BackwardContext.ProcessInstance = (new ProcessInstanceManager()).GetById(runningNode.ProcessInstanceID); // rmins.BackwardContext.BackwardToTaskActivity = processModel.GetActivity(jumpActivityGUID); // //获取当前运行节点的上一步节点 // bool hasGatewayNode = false; // var tim = new TransitionInstanceManager(); // var lastTaskTransitionInstance = tim.GetLastTaskTransition(runner.AppName, // runner.AppInstanceID, runner.ProcessGUID); // var previousActivityInstance = tim.GetPreviousActivityInstance(runningNode, true, // out hasGatewayNode).ToList()[0]; // //仅仅是回跳到上一步节点,即按SendBack方式处理 // if (previousActivityInstance.ActivityGUID == jumpActivityGUID) // { // rmins.BackwardContext.BackwardToTaskActivityInstance = previousActivityInstance; // rmins.BackwardContext.BackwardToTargetTransitionGUID = // hasGatewayNode == false ? lastTaskTransitionInstance.TransitionGUID : System.Guid.Empty; //如果中间有Gateway节点,则没有直接相连的TransitonGUID // rmins.BackwardContext.BackwardFromActivity = processModel.GetActivity(runningNode.ActivityGUID); // rmins.BackwardContext.BackwardFromActivityInstance = runningNode; // rmins.BackwardContext.BackwardTaskReciever = WfBackwardTaskReciever.Instance( // previousActivityInstance.ActivityName, // previousActivityInstance.EndedByUserID.Value, // previousActivityInstance.EndedByUserName); // rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers( // previousActivityInstance.ActivityGUID, // previousActivityInstance.EndedByUserID.Value, // previousActivityInstance.EndedByUserName); // } // else // { // //回跳到早前节点 // var jumptoActivityInstance = jumpActivityInstanceList[0]; // if (jumptoActivityInstance.ActivityState != (short)ActivityStateEnum.Completed) // { // result.Status = WfExecutedStatus.Exception; // result.Exception = WfJumpException.NotActivityBackCompleted; // result.Message = string.Format("回跳到的节点不在完成状态,无法重新回跳!"); // return rmins; // } // rmins.BackwardContext.BackwardToTaskActivityInstance = jumptoActivityInstance; // //判断两个节点是否有Transition的定义存在 // var transition = processModel.GetForwardTransition(runningNode.ActivityGUID, runner.JumpbackActivityGUID.Value); // rmins.BackwardContext.BackwardToTargetTransitionGUID = transition != null ? transition.TransitionGUID : System.Guid.Empty; // rmins.BackwardContext.BackwardFromActivity = processModel.GetActivity(runningNode.ActivityGUID); // rmins.BackwardContext.BackwardFromActivityInstance = runningNode; // rmins.BackwardContext.BackwardTaskReciever = WfBackwardTaskReciever.Instance( // jumptoActivityInstance.ActivityName, // jumptoActivityInstance.EndedByUserID.Value, // jumptoActivityInstance.EndedByUserName); // rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers( // jumptoActivityInstance.ActivityGUID, // jumptoActivityInstance.EndedByUserID.Value, // jumptoActivityInstance.EndedByUserName); // } // //获取资源数据 // var activityResourceBack = new ActivityResource(rmins.AppRunner, // rmins.AppRunner.NextActivityPerformers, // runner.Conditions); // rmins.ActivityResource = activityResourceBack; //} //else //{ // //跳转到从未执行过的节点上 // var activityResource = new ActivityResource(runner, runner.NextActivityPerformers, runner.Conditions); // rmins.ActivityResource = activityResource; // rmins.RunningActivityInstance = runningNode; //} #endregion //跳转到从未执行过的节点上 var activityResource = new ActivityResource(runner, runner.NextActivityPerformers, runner.Conditions); rmins.ActivityResource = activityResource; rmins.RunningActivityInstance = runningNode; return(rmins); }
private void runtimeInstance_OnWfProcessReversed(object sender, WfEventArgs args) { _reversedResult = args.WfExecutedResult; waitHandler.Set(); }
/// <summary> /// 撤销操作 /// 包括: /// 1) 正常流转 /// 2) 多实例节点流转 /// </summary> /// <param name="runner">执行者</param> /// <param name="result">结果对象</param> /// <returns>运行时实例对象</returns> internal static WfRuntimeManager CreateRuntimeInstanceWithdraw(WfAppRunner runner, ref WfExecutedResult result) { WfRuntimeManager rmins = new WfRuntimeManagerWithdraw(); rmins.WfExecutedResult = result = new WfExecutedResult(); var aim = new ActivityInstanceManager(); var runningActivityInstanceList = aim.GetRunningActivityInstanceList(runner.AppInstanceID, runner.ProcessGUID).ToList(); WithdrawOperationTypeEnum withdrawOperation = WithdrawOperationTypeEnum.Default; //当前没有运行状态的节点存在,流程不存在,或者已经结束或取消 if (runningActivityInstanceList == null || runningActivityInstanceList.Count() == 0) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Withdraw_NotInReady; result.Message = "当前没有运行状态的节点存在,流程不存在,或者已经结束或取消"; return(rmins); } if (runningActivityInstanceList.Count() == 1) //如果只有1个运行节点 { //先判断节点的状态是否是有效状态 var runningNode = runningActivityInstanceList[0]; if (runningNode.ActivityState != (short)ActivityStateEnum.Ready && runningNode.ActivityState != (short)ActivityStateEnum.Suspended) //只有准备或挂起状态的节点可以撤销 { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Withdraw_NotInReady; result.Message = string.Format("无法撤销到上一步,因为要撤销的节点为空,或不在【待办/挂起】状态,当前状态: {0}", runningNode.ActivityState);//,节点状态:{0} runningNode.ActivityState 为空报错20150514 return(rmins); } //判断是否是多实例节点的子节点 if (runningNode.MIHostActivityInstanceID != null) { if (runningNode.CompleteOrder == 1) { //只有串行模式下有CompleteOrder的值为 1 //串行模式多实例的第一个执行节点,此时上一步骤可以撤销 withdrawOperation = WithdrawOperationTypeEnum.MISFirstOneIsRunning; } else if (runningNode.CompleteOrder > 1) { //串行模式多实例内部撤销,其中只有1个节点处于运行状态 withdrawOperation = WithdrawOperationTypeEnum.MISOneIsRunning; } else if (runningNode.CompleteOrder == -1) { //并行模式下CompleteOrder的值为 -1,此时只剩余最后一个 //要撤销的话,是对并行会签节点的内部撤销,即认为是重新办理,找到当前运行人的节点,置状态为待办状态就可以 withdrawOperation = WithdrawOperationTypeEnum.MIPSeveralIsRunning; } } else { //当前运行节点是普通节点模式 withdrawOperation = WithdrawOperationTypeEnum.Normal; } } else if (runningActivityInstanceList.Count() > 1) //有多个并行运行节点存在 { //判断多实例主节点下的子节点是否都处于待办状态,如果是,则上一步可以撤销回去,否则不可以撤销 var firstActivityInstance = runningActivityInstanceList[0]; if (firstActivityInstance.MIHostActivityInstanceID != null) { bool isAllInReadyState = true; var allChildNodeList = aim.GetActivityMultipleInstance(firstActivityInstance.MIHostActivityInstanceID.Value, firstActivityInstance.ProcessInstanceID); foreach (var ai in allChildNodeList) { if (ai.ActivityState != (short)ActivityStateEnum.Ready && ai.ActivityState != (short)ActivityStateEnum.Suspended) { isAllInReadyState = false; break; } } if (isAllInReadyState == true) { //子节点全部处于待办状态 withdrawOperation = WithdrawOperationTypeEnum.MIPAllIsInReadyState; } else { //部分子节点有完成的 withdrawOperation = WithdrawOperationTypeEnum.MIPSeveralIsRunning; } } else { //有其它非多实例的并行节点,暂时不处理,后期实现该功能 result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Withdraw_HasTooMany; result.Message = "有多个可以撤销回去的节点,而且不是多实例节点,此功能暂时不支持!"; return(rmins); } } //根据不同分支场景,创建不同撤销运行时管理器 return(CreateRuntimeInstanceWithdrawByCase(runningActivityInstanceList, withdrawOperation, runner, ref result)); }
/// <summary> /// 创建跳转实例信息 /// </summary> /// <param name="runner">执行者</param> /// <param name="result">结果对象</param> /// <returns>运行时实例对象</returns> public static WfRuntimeManager CreateRuntimeInstanceJump(WfAppRunner runner, ref WfExecutedResult result) { var rmins = new WfRuntimeManagerJump(); rmins.WfExecutedResult = result = new WfExecutedResult(); if (string.IsNullOrEmpty(runner.AppName) || String.IsNullOrEmpty(runner.AppInstanceID) || runner.ProcessGUID == null || runner.NextActivityPerformers == null) { //缺失方法参数 result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Jump_ErrorArguments; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceJump.missing.error"); return(rmins); } //流程跳转时,只能跳转到一个节点 if (runner.NextActivityPerformers.Count() > 1) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Jump_OverOneStep; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceJump.jump.error", runner.NextActivityPerformers.Count().ToString()); return(rmins); } //获取当前运行节点信息 var aim = new ActivityInstanceManager(); TaskViewEntity taskView = null; var runningNode = aim.GetRunningNode(runner, out taskView); //传递runner变量 rmins.TaskView = taskView; rmins.AppRunner = runner; 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; //用于流程注册时间调用时候的流程实例ID提供 rmins.ProcessInstanceID = runningNode.ProcessInstanceID; var processModel = ProcessModelFactory.Create(taskView.ProcessGUID, taskView.Version); rmins.ProcessModel = processModel; #region 考虑回跳方式 //获取跳转节点信息 var jumpBackActivityGUID = runner.NextActivityPerformers.First().Key; var jumpBackActivityInstance = aim.GetActivityInstanceLatest(runningNode.ProcessInstanceID, jumpBackActivityGUID); if (jumpBackActivityInstance != null) { //跳转到曾经执行过的节点上,可以作为跳回方式处理 rmins.IsBackward = true; rmins.BackwardContext.ProcessInstance = (new ProcessInstanceManager()).GetById(runningNode.ProcessInstanceID); rmins.BackwardContext.BackwardToTaskActivity = processModel.GetActivity(jumpBackActivityGUID); //获取当前运行节点的上一步节点 bool hasGatewayNode = false; var tim = new TransitionInstanceManager(); var lastTaskTransitionInstance = tim.GetLastTaskTransition(runner.AppName, runner.AppInstanceID, runner.ProcessGUID); var npc = new PreviousStepChecker(); var previousActivityInstance = npc.GetPreviousActivityInstanceList(runningNode, true, out hasGatewayNode).ToList()[0]; //仅仅是回跳到上一步节点,即按SendBack方式处理 if (previousActivityInstance.ActivityGUID == jumpBackActivityGUID) { rmins.BackwardContext.BackwardToTaskActivityInstance = previousActivityInstance; rmins.BackwardContext.BackwardToTargetTransitionGUID = hasGatewayNode == false ? lastTaskTransitionInstance.TransitionGUID : WfDefine.WF_XPDL_GATEWAY_BYPASS_GUID; //如果中间有Gateway节点,则没有直接相连的TransitonGUID rmins.BackwardContext.BackwardFromActivity = processModel.GetActivity(runningNode.ActivityGUID); rmins.BackwardContext.BackwardFromActivityInstance = runningNode; rmins.BackwardContext.BackwardTaskReceiver = WfBackwardTaskReceiver.Instance( previousActivityInstance.ActivityName, previousActivityInstance.EndedByUserID, previousActivityInstance.EndedByUserName); rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers( previousActivityInstance.ActivityGUID, previousActivityInstance.EndedByUserID, previousActivityInstance.EndedByUserName); } else { //回跳到早前节点 if (jumpBackActivityInstance.ActivityState != (short)ActivityStateEnum.Completed) { //回跳节点不在完成状态 result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Jump_NotActivityBackCompleted; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceJump.back.error"); return(rmins); } rmins.BackwardContext.BackwardToTaskActivityInstance = jumpBackActivityInstance; //判断两个节点是否有Transition的定义存在 var transition = processModel.GetForwardTransition(runningNode.ActivityGUID, jumpBackActivityGUID); rmins.BackwardContext.BackwardToTargetTransitionGUID = transition != null ? transition.TransitionGUID : WfDefine.WF_XPDL_GATEWAY_BYPASS_GUID; rmins.BackwardContext.BackwardFromActivity = processModel.GetActivity(runningNode.ActivityGUID); rmins.BackwardContext.BackwardFromActivityInstance = runningNode; rmins.BackwardContext.BackwardTaskReceiver = WfBackwardTaskReceiver.Instance( jumpBackActivityInstance.ActivityName, jumpBackActivityInstance.EndedByUserID, jumpBackActivityInstance.EndedByUserName); rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers( jumpBackActivityInstance.ActivityGUID, jumpBackActivityInstance.EndedByUserID, jumpBackActivityInstance.EndedByUserName); } //获取资源数据 var activityResourceBack = new ActivityResource(rmins.AppRunner, rmins.AppRunner.NextActivityPerformers, runner.Conditions); rmins.ActivityResource = activityResourceBack; } else { //跳转到从未执行过的节点上 var activityResource = new ActivityResource(runner, runner.NextActivityPerformers, runner.Conditions); rmins.ActivityResource = activityResource; rmins.RunningActivityInstance = runningNode; } #endregion return(rmins); }