/// <summary> /// 结束节点活动及转移实例化,没有任务数据 /// </summary> /// <param name="toActivity">当前Activity</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 override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity, ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner); base.ActivityInstanceManager.Insert(toActivityInstance, session); base.ActivityInstanceManager.Complete(toActivityInstance.ID, activityResource.AppRunner, session); //写节点转移实例数据 base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); }
internal WfTransitionInstance CreateTransitionInstanceObject(WfProcessInstance processInstance, string transitionId, WfActivityInstance fromActivityInstance, WfActivityInstance toActivityInstance, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, WfAppRunner runner, int conditionParseResult) { var entity = new WfTransitionInstance(); entity.Fid = UUIDUtils.Fid; entity.ProcessUid = processInstance.ProcessUid; entity.ProcessInsUid = processInstance.Fid; entity.TransitionNodeId = transitionId; entity.TransitionType = transitionType.ToString();// WfTransitionInstanceType.Forward; entity.JumpType = (int)flyingType; //构造活动节点数据 entity.SourceActivityInsUid = fromActivityInstance.Fid; entity.SourceActivityNodeId = fromActivityInstance.NodeId; entity.SourceActivityNodeType = fromActivityInstance.ActivityType; entity.SourceActivityNodeName = fromActivityInstance.ActivityName; entity.TargetActivityInsUid = toActivityInstance.Fid; entity.TargetActivityNodeId = toActivityInstance.NodeId; entity.TargetActivityNodeType = toActivityInstance.ActivityType; entity.TargetActivityNodeName = toActivityInstance.ActivityName; entity.WalkState = conditionParseResult; //entity.CreatedByUserID = runner.UserID; //entity.CreatedByUserName = runner.UserName; //entity.CreatedDateTime = System.DateTime.Now; return(entity); }
/// <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 override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity, ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { //实例化Activity var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner); //进入运行状态 toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; toActivityInstance.AssignedToUserIDs = GenerateActivityAssignedUserIDs( activityResource.NextActivityPerformers[toActivity.ActivityGUID]); toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames( activityResource.NextActivityPerformers[toActivity.ActivityGUID]); //插入活动实例数据 base.ActivityInstanceManager.Insert(toActivityInstance, session); //插入任务数据 base.CreateNewTask(toActivityInstance, activityResource, session); //插入转移数据 InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); }
/// <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 override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity, ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { if (toActivity.ActivityTypeDetail.ComplexType == ComplexTypeEnum.SignTogether) { CreateMultipleInstance(toActivity, processInstance, fromActivityInstance, transitionGUID, transitionType, flyingType, activityResource, session); } else { //实例化Activity var toActivityInstance = CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner); //进入运行状态 var performerList = activityResource.NextActivityPerformers[toActivity.ActivityGUID]; toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; toActivityInstance.AssignedToUserIDs = GenerateActivityAssignedUserIDs(performerList); toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames(performerList); //插入活动实例数据 base.ActivityInstanceManager.Insert(toActivityInstance, session); //插入任务数据 base.CreateNewTask(toActivityInstance, activityResource, session); //插入转移数据 InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); //启动子流程 WfExecutedResult startedResult = null; var subProcessNode = (SubProcessNode)toActivity.Node; subProcessNode.ActivityInstance = toActivityInstance; WfAppRunner subRunner = CopyActivityForwardRunner(activityResource.AppRunner, new Performer(activityResource.AppRunner.UserID, activityResource.AppRunner.UserName), subProcessNode); var runtimeInstance = WfRuntimeManagerFactory.CreateRuntimeInstanceStartupSub(subRunner, processInstance, subProcessNode, performerList, ref startedResult); runtimeInstance.OnWfProcessExecuted += runtimeInstance_OnWfProcessStarted; runtimeInstance.Execute(Session); } }
/// <summary> /// 创建工作项及转移数据 /// </summary> /// <param name="processInstance"></param> /// <param name="fromToTransition"></param> /// <param name="fromActivityInstance"></param> /// <param name="activityResource"></param> /// <param name="session"></param> internal void CreateActivityTaskAndTransitionInstances(ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, TransitionEntity fromToTransition, TransitionTypeEnum transitionType, ActivityResource activityResource, ISession session) { //实例化Activity var toActivityInstance = base.CreateActivityInstanceObject(processInstance, activityResource.LogonUser); //进入运行状态 toActivityInstance.State = (short)NodeStateEnum.Ready; //插入活动实例数据 base.InsertActivityInstance(toActivityInstance, session); //插入任务数据 CreateNewTask(activityResource, session); //插入转移数据 base.InsertTransitionInstance(processInstance, fromToTransition, fromActivityInstance, toActivityInstance, transitionType, activityResource.LogonUser, session); }
/// <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 override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity, WfProcessInstance processInstance, WfActivityInstance fromActivityInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType) { //实例化Activity var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, AppRunner); //进入运行状态 toActivityInstance.ActivityState = ActivityStateEnum.Ready.ToString(); toActivityInstance.AssignedToUserIds = GenerateActivityAssignedUserIDs(toActivity.Performers); toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames(toActivity.Performers); //插入活动实例数据 base.ActivityInstanceManager.Insert(toActivityInstance); //插入任务数据 base.CreateNewTask(toActivityInstance, toActivity); //插入转移数据 InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, AppRunner); }
/// <summary> /// 会签类型的主节点, 多实例节点处理 /// </summary> /// <param name="processInstance"></param> /// <param name="fromToTransition"></param> /// <param name="fromActivityInstance"></param> /// <param name="activityResource"></param> /// <param name="session"></param> internal void CreateMultipleInstance(ActivityEntity toActivity, ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, String transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { //实例化主节点Activity var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner); //主节点实例数据 toActivityInstance.ActivityState = (short)ActivityStateEnum.Suspended; toActivityInstance.ComplexType = (short)ComplexTypeEnum.MultipleInstance; if (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Parallel) { toActivityInstance.CompleteOrder = toActivity.ActivityTypeDetail.CompleteOrder; } toActivityInstance.AssignedToUsers = GenerateActivityAssignedUsers( 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.AssignedToUsers = plist[i].UserID.ToString(); 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); } }
internal TransitionInstanceEntity CreateTransitionInstanceObject(ProcessInstanceEntity processInstance, TransitionEntity transition, ActivityInstanceEntity fromActivityInstance, ActivityInstanceEntity toActivityInstance, TransitionTypeEnum transitionType, WfLogonUser logonUser, byte conditionParseResult) { var entity = new TransitionInstanceEntity(); entity.AppName = processInstance.AppName; entity.AppInstanceID = processInstance.AppInstanceID; entity.TransitionInstanceGUID = Guid.NewGuid(); entity.ProcessGUID = processInstance.ProcessGUID; entity.ProcessInstanceGUID = processInstance.ProcessInstanceGUID; entity.TransitionGUID = transition.TransitionGUID; entity.TransitionType = (byte)transitionType; entity.FromActivityGUID = transition.FromActivityGUID; entity.FromActivityInstanceGUID = fromActivityInstance.ActivityInstanceGUID; entity.FromActivityType = fromActivityInstance.ActivityType; entity.FromActivityName = fromActivityInstance.ActivityName; entity.ToActivityGUID = transition.ToActivityGUID; entity.ToActivityInstanceGUID = toActivityInstance.ActivityInstanceGUID; entity.ToActivityType = toActivityInstance.ActivityType; entity.ToActivityName = toActivityInstance.ActivityName; entity.ConditionParseResult = conditionParseResult; entity.CreatedByUserID = logonUser.UserID; entity.CreatedByUserName = logonUser.UserName; entity.CreatedDateTime = System.DateTime.Now; return(entity); }
internal TransitionInstanceEntity CreateTransitionInstanceObject(ProcessInstanceEntity processInstance, String transitionGUID, ActivityInstanceEntity fromActivityInstance, ActivityInstanceEntity toActivityInstance, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, WfAppRunner runner, byte conditionParseResult) { var entity = new TransitionInstanceEntity(); entity.AppName = processInstance.AppName; entity.AppInstanceID = processInstance.AppInstanceID; entity.ProcessGUID = processInstance.ProcessGUID; entity.ProcessInstanceID = processInstance.ID; entity.TransitionGUID = transitionGUID; entity.TransitionType = (byte)transitionType; entity.FlyingType = (byte)flyingType; //构造活动节点数据 entity.FromActivityGUID = fromActivityInstance.ActivityGUID; entity.FromActivityInstanceID = fromActivityInstance.ID; entity.FromActivityType = fromActivityInstance.ActivityType; entity.FromActivityName = fromActivityInstance.ActivityName; entity.ToActivityGUID = toActivityInstance.ActivityGUID; entity.ToActivityInstanceID = toActivityInstance.ID; entity.ToActivityType = toActivityInstance.ActivityType; entity.ToActivityName = toActivityInstance.ActivityName; entity.ConditionParseResult = conditionParseResult; entity.CreatedByUserID = runner.UserID; entity.CreatedByUserName = runner.UserName; entity.CreatedDateTime = System.DateTime.Now; return entity; }
/// <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">Session</param> internal virtual void CreateActivityTaskTransitionInstance(ActivityEntity toActivity, WfProcessInstance processInstance, WfActivityInstance fromActivityInstance, String transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType ) { }
/// <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">Session</param> internal virtual void CreateActivityTaskTransitionInstance(ActivityEntity toActivity, ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, String transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { }
/// <summary> /// 退回是加签情况下的处理: /// 要退回的节点是加签节点 /// 只实例化当初的加签主节点 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="backwardToTaskActvity">退回的活动节点</param> /// <param name="fromActivityInstance">运行节点实例</param> /// <param name="backwardType">退回类型</param> /// <param name="previousMainInstance">前主节点实例</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="transitionType">转移类型</param> /// <param name="flyingType">跳跃类型</param> /// <param name="activityResource">资源</param> /// <param name="session">数据上下文</param> internal void CreateBackwardActivityTaskRepateSignForwardMainNodeOnly(ProcessInstanceEntity processInstance, ActivityEntity backwardToTaskActvity, ActivityInstanceEntity fromActivityInstance, BackwardTypeEnum backwardType, ActivityInstanceEntity previousMainInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { // 退回是加签情况下的处理: // 要退回的节点是加签节点 // 只实例化当初的加签主节点 //重新封装任务办理人为AssignedToUsers, AssignedToUsernames var performerList = AntiGenerateActivityPerformerList(previousMainInstance); activityResource.NextActivityPerformers.Clear(); activityResource.NextActivityPerformers = new Dictionary <string, PerformerList>(); activityResource.NextActivityPerformers.Add(backwardToTaskActvity.ActivityGUID, performerList); //实例化Activity var toActivityInstance = base.CreateBackwardToActivityInstanceObject(processInstance, backwardType, previousMainInstance.ID, activityResource.AppRunner); //进入准备运行状态 toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; toActivityInstance.AssignedToUserIDs = previousMainInstance.AssignedToUserIDs; toActivityInstance.AssignedToUserNames = previousMainInstance.AssignedToUserNames; toActivityInstance.ComplexType = null;//previousMainInstance.ComplexType;发起加签前状态为null toActivityInstance.CompleteOrder = previousMainInstance.CompleteOrder; toActivityInstance.SignForwardType = previousMainInstance.SignForwardType; //插入活动实例数据 base.ActivityInstanceManager.Insert(toActivityInstance, session); base.ReturnDataContext.ActivityInstanceID = toActivityInstance.ID; base.ReturnDataContext.ProcessInstanceID = toActivityInstance.ProcessInstanceID; //插入任务数据 base.CreateNewTask(toActivityInstance, activityResource, session); //插入转移数据 base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); }
/// <summary> /// 创建退回时的流转节点对象、任务和转移数据 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="fromActivityInstance">运行节点实例</param> /// <param name="backwardToTaskActivity">退回到的节点</param> /// <param name="backwardType">退回类型</param> /// <param name="transitionType">转移类型</param> /// <param name="flyingType">跳跃类型</param> /// <param name="activityResource">资源</param> /// <param name="session">会话</param> internal void CreateBackwardActivityTaskTransitionInstance(ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, ActivityEntity backwardToTaskActivity, BackwardTypeEnum backwardType, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { var previousActivityInstance = this.ActivityInstanceManager.GetPreviousActivityInstanceSimple(fromActivityInstance, backwardToTaskActivity.ActivityGUID, session); if (previousActivityInstance == null) { throw new WorkflowException(LocalizeHelper.GetEngineMessage("nodesendback.CreateBackwardActivityTaskTransitionInstance.error")); } //实例化Activity var toActivityInstance = this.ActivityInstanceManager.CreateBackwardActivityInstanceObject( processInstance.AppName, processInstance.AppInstanceID, processInstance.AppInstanceCode, processInstance.ID, backwardToTaskActivity, backwardType, fromActivityInstance.ID, previousActivityInstance.ID, activityResource.AppRunner); //进入准备运行状态 toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; //人员来自步骤列表的用户数据 toActivityInstance.AssignedToUserIDs = SendBackOperation.BackwardToTaskPerformer.UserID; toActivityInstance.AssignedToUserNames = SendBackOperation.BackwardToTaskPerformer.UserName; //插入活动实例数据 this.ActivityInstanceManager.Insert(toActivityInstance, session); //插入任务数据 this.TaskManager.Insert(toActivityInstance, SendBackOperation.BackwardToTaskPerformer, activityResource.AppRunner, session); //插入转移数据 InsertTransitionInstance(processInstance, fromActivityInstance, toActivityInstance, TransitionTypeEnum.Backward, TransitionFlyingTypeEnum.NotFlying, this.SendBackOperation.ActivityResource.AppRunner, session); }
/// <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 override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity, ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { //判断是否是会签节点,如果是创建会签节点 if (toActivity.ActivityType == ActivityTypeEnum.MultipleInstanceNode) { if (toActivity.ActivityTypeDetail.ComplexType == ComplexTypeEnum.SignForward) //加签节点生成,跟普通任务节点生成一样 { //实例化Activity var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner); //进入运行状态 toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; toActivityInstance = GenerateActivityAssignedUserInfo(toActivityInstance, activityResource); //插入活动实例数据 base.ActivityInstanceManager.Insert(toActivityInstance, session); //插入任务数据 base.CreateNewTask(toActivityInstance, activityResource, session); //插入转移数据 InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); } else if (toActivity.ActivityTypeDetail.ComplexType == ComplexTypeEnum.SignTogether) //会签节点会生成多个实例子节点 { //创建会签节点的主节点,以及会签主节点下的实例子节点记录 CreateMultipleInstance(toActivity, processInstance, fromActivityInstance, transitionGUID, transitionType, flyingType, activityResource, session); } else { throw new ApplicationException("虽然是会签节点,但是其子类型未知!"); } } else { throw new ApplicationException("不是会签节点,无法创建活动及任务实例!"); } }
/// <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 override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity, WfProcessInstance processInstance, WfActivityInstance fromActivityInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType) { //实例化Activity var toActivityInstance = CreateActivityInstanceObject(toActivity, processInstance, AppRunner); //进入运行状态 toActivityInstance.ActivityState = ActivityStateEnum.Ready.ToString(); toActivityInstance.AssignedToUserIds = GenerateActivityAssignedUserIDs( toActivity.Performers); toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames( toActivity.Performers); //插入活动实例数据 base.ActivityInstanceManager.Insert(toActivityInstance); //插入任务数据 base.CreateNewTask(toActivityInstance, toActivity); //插入转移数据 InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, AppRunner); //启动子流程 WfExecutedResult startedResult = null; var subProcessNode = (SubProcessNode)toActivity.Node; subProcessNode.ActivityInstance = fromActivityInstance; WfAppRunner subRunner = CopyActivityForwardRunner(AppRunner, new Performer() { UserId = AppRunner.UserId, UserName = AppRunner.UserName }, subProcessNode); var runtimeInstance = WfRuntimeManagerFactory.CreateRuntimeInstanceStartup(subRunner, _serviceProvider, processInstance, subProcessNode, ref startedResult); runtimeInstance.OnWfProcessExecuted += runtimeInstance_OnWfProcessStarted; runtimeInstance.Execute(); }
/// <summary> /// 最后一个会签多实例子节点的撤销操作 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="fromActivityInstance">运行节点</param> /// <param name="originalBackwardToActivityInstance">初始退回到的节点实例</param> /// <param name="backwardType">退回类型</param> /// <param name="transitionType">转移类型</param> /// <param name="flyingType">跳跃类型</param> /// <param name="activityResource">资源</param> /// <param name="session">会话</param> internal void CreateBackwardActivityTaskTransitionOfLastMultipleInstance(ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, ActivityInstanceEntity originalBackwardToActivityInstance, BackwardTypeEnum backwardType, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { //创建回滚到的节点信息 var rollbackPreviousActivityInstance = base.ActivityInstanceManager.CreateBackwardActivityInstanceObject(processInstance.AppName, processInstance.AppInstanceID, processInstance.AppInstanceCode, processInstance.ID, this.SendBackOperation.BackwardToTaskActivity, backwardType, fromActivityInstance.ID, originalBackwardToActivityInstance.ID, activityResource.AppRunner); rollbackPreviousActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; rollbackPreviousActivityInstance.MIHostActivityInstanceID = originalBackwardToActivityInstance.MIHostActivityInstanceID; rollbackPreviousActivityInstance.CompleteOrder = originalBackwardToActivityInstance.CompleteOrder; rollbackPreviousActivityInstance.ComplexType = originalBackwardToActivityInstance.ComplexType; rollbackPreviousActivityInstance.SignForwardType = originalBackwardToActivityInstance.SignForwardType; //人员来自步骤列表的用户数据 rollbackPreviousActivityInstance.AssignedToUserIDs = base.SendBackOperation.BackwardToTaskPerformer.UserID; //多实例节点为单一用户任务 rollbackPreviousActivityInstance.AssignedToUserNames = base.SendBackOperation.BackwardToTaskPerformer.UserName; //插入新活动实例数据 base.ActivityInstanceManager.Insert(rollbackPreviousActivityInstance, session); //创建新任务数据 //插入任务数据 base.TaskManager.Insert(rollbackPreviousActivityInstance, base.SendBackOperation.BackwardToTaskPerformer, activityResource.AppRunner, session); //插入转移数据 base.InsertTransitionInstance(processInstance, fromActivityInstance, rollbackPreviousActivityInstance, TransitionTypeEnum.Backward, TransitionFlyingTypeEnum.NotFlying, this.SendBackOperation.ActivityResource.AppRunner, session); }
/// <summary> /// 创建活动任务转移实例数据 /// </summary> /// <param name="toActivity"></param> /// <param name="processInstance"></param> /// <param name="fromActivityInstance"></param> /// <param name="transitionGUID"></param> /// <param name="transitionType"></param> /// <param name="flyingType"></param> /// <param name="activityResource"></param> /// <param name="session"></param> internal override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity, ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { //判断是否是会签节点,如果是创建会签节点 if (toActivity.ActivityTypeDetail != null && toActivity.ActivityTypeDetail.ComplexType == ComplexTypeEnum.SignTogether) { //创建会签节点的主节点,以及会签主节点下的实例子节点记录 CreateMultipleInstance(toActivity, processInstance, fromActivityInstance, transitionGUID, transitionType, flyingType, activityResource, session); } else { //实例化Activity var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner); //进入运行状态 toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; toActivityInstance.AssignedToUserIDs = GenerateActivityAssignedUserIDs( activityResource.NextActivityPerformers[toActivity.ActivityGUID]); toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames( activityResource.NextActivityPerformers[toActivity.ActivityGUID]); //插入活动实例数据 base.ActivityInstanceManager.Insert(toActivityInstance, session); //插入任务数据 base.CreateNewTask(toActivityInstance, activityResource, session); //插入转移数据 InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); } }
/// <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 override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity, ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { Boolean isParallel = false; if (fromActivityInstance.ActivityType == (short)ActivityTypeEnum.GatewayNode) { var processModel = ProcessModelFactory.Create(processInstance.ProcessGUID, processInstance.Version); var activityNode = processModel.GetActivity(fromActivityInstance.ActivityGUID); isParallel = processModel.IsAndSplitMI(activityNode); } if (isParallel) { var entity = new ActivityInstanceEntity(); var plist = activityResource.NextActivityPerformers[toActivity.ActivityGUID]; //创建并行多实例分支 for (var i = 0; i < plist.Count; i++) { var performer = plist[i]; CreateSubProcessNode(toActivity, processInstance, fromActivityInstance, transitionGUID, transitionType, flyingType, activityResource, performer, session); } } else { if (toActivity.ActivityTypeDetail.ComplexType == ComplexTypeEnum.SignTogether) { CreateMultipleInstance(toActivity, processInstance, fromActivityInstance, transitionGUID, transitionType, flyingType, activityResource, session); } else { CreateSubProcessNode(toActivity, processInstance, fromActivityInstance, transitionGUID, transitionType, flyingType, activityResource, null, session); } } }
/// <summary> /// 创建退回时的流转节点对象、任务和转移数据 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="fromActivityInstance">运行节点实例</param> /// <param name="backwardType">退回类型</param> /// <param name="backMostPreviouslyActivityInstanceID">退回节点实例ID</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="transitionType">转移类型</param> /// <param name="flyingType">跳跃类型</param> /// <param name="activityResource">资源</param> /// <param name="session">会话</param> internal void CreateBackwardActivityTaskTransitionInstance(ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, BackwardTypeEnum backwardType, int backMostPreviouslyActivityInstanceID, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { //实例化Activity var toActivityInstance = base.CreateBackwardToActivityInstanceObject(processInstance, backwardType, backMostPreviouslyActivityInstanceID, activityResource.AppRunner); //进入准备运行状态 toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; toActivityInstance.AssignedToUserIDs = base.GenerateActivityAssignedUserIDs( activityResource.NextActivityPerformers[base.BackwardContext.BackwardToTaskActivity.ActivityGUID]); toActivityInstance.AssignedToUserNames = base.GenerateActivityAssignedUserNames( activityResource.NextActivityPerformers[base.BackwardContext.BackwardToTaskActivity.ActivityGUID]); //插入活动实例数据 base.ActivityInstanceManager.Insert(toActivityInstance, session); base.ReturnDataContext.ActivityInstanceID = toActivityInstance.ID; base.ReturnDataContext.ProcessInstanceID = toActivityInstance.ProcessInstanceID; //插入任务数据 base.CreateNewTask(toActivityInstance, activityResource, session); //插入转移数据 base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); }
/// <summary> /// 插入连线实例的方法 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="fromActivityInstance">来源活动实例</param> /// <param name="toActivityInstance">目的活动实例</param> /// <param name="transitionType">转移类型</param> /// <param name="flyingType">飞跃类型</param> /// <param name="runner">运行者</param> /// <param name="session">会话</param> /// <returns></returns> internal virtual void InsertTransitionInstance(WfProcessInstance processInstance, string transitionGUID, WfActivityInstance fromActivityInstance, WfActivityInstance toActivityInstance, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType) { var tim = new TransitionInstanceManager(_serviceProvider); var transitionInstanceObject = tim.CreateTransitionInstanceObject(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, _runner, (byte)ConditionParseResultEnum.Passed); tim.Insert(transitionInstanceObject); }
/// <summary> /// 最后一个会签多实例子节点的撤销操作 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="fromActivityInstance">运行节点</param> /// <param name="originalBackwardToActivityInstance">初始退回到的节点实例</param> /// <param name="backwardType">退回类型</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="transitionType">转移类型</param> /// <param name="flyingType">跳跃类型</param> /// <param name="activityResource">资源</param> /// <param name="session">会话</param> internal void CreateBackwardActivityTaskTransitionOfLastMultipleInstance(ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, ActivityInstanceEntity originalBackwardToActivityInstance, BackwardTypeEnum backwardType, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { //创建回滚到的节点信息 var rollbackPreviousActivityInstance = base.CreateBackwardToActivityInstanceObject(processInstance, backwardType, fromActivityInstance.ID, originalBackwardToActivityInstance.ID, activityResource.AppRunner); rollbackPreviousActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; rollbackPreviousActivityInstance.MIHostActivityInstanceID = originalBackwardToActivityInstance.MIHostActivityInstanceID; rollbackPreviousActivityInstance.CompleteOrder = originalBackwardToActivityInstance.CompleteOrder; rollbackPreviousActivityInstance.ComplexType = originalBackwardToActivityInstance.ComplexType; rollbackPreviousActivityInstance.SignForwardType = originalBackwardToActivityInstance.SignForwardType; rollbackPreviousActivityInstance.AssignedToUserIDs = originalBackwardToActivityInstance.AssignedToUserIDs; //多实例节点为单一用户任务 rollbackPreviousActivityInstance.AssignedToUserNames = originalBackwardToActivityInstance.AssignedToUserNames; //插入新活动实例数据 base.ActivityInstanceManager.Insert(rollbackPreviousActivityInstance, session); base.ReturnDataContext.ActivityInstanceID = rollbackPreviousActivityInstance.ID; base.ReturnDataContext.ProcessInstanceID = rollbackPreviousActivityInstance.ProcessInstanceID; //创建新任务数据 base.CreateNewTask(rollbackPreviousActivityInstance, activityResource, session); //插入转移数据 base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, rollbackPreviousActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); }
/// <summary> /// 插入连线实例的方法 /// </summary> /// <param name="processInstance"></param> /// <param name="fromToTransition"></param> /// <param name="fromActivityInstance"></param> /// <param name="toActivityInstance"></param> /// <param name="conditionParseResult"></param> /// <param name="wfLinqDataContext"></param> /// <returns></returns> internal virtual void InsertTransitionInstance(ProcessInstanceEntity processInstance, TransitionEntity fromToTransition, ActivityInstanceEntity fromActivityInstance, ActivityInstanceEntity toActivityInstance, TransitionTypeEnum transitionType, WfLogonUser logonUser, ISession session) { var tim = new TransitionInstanceManager(); var transitionInstanceObject = tim.CreateTransitionInstanceObject(processInstance, fromToTransition, fromActivityInstance, toActivityInstance, transitionType, logonUser, (byte)ConditionParseResultEnum.Passed); tim.Insert(transitionInstanceObject, session); }
/// <summary> /// 插入连线实例的方法 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="transitionId">转移ID</param> /// <param name="fromActivityInstance">起始活动实例</param> /// <param name="toActivityInstance">到达活动实例</param> /// <param name="transitionType">转移类型</param> /// <param name="flyingType">跳跃类型</param> /// <param name="runner">执行者</param> /// <param name="session">Session</param> internal virtual void InsertTransitionInstance(WfProcessInstance processInstance, String transitionId, WfActivityInstance fromActivityInstance, WfActivityInstance toActivityInstance, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, WfAppRunner runner) { var tim = new TransitionInstanceManager(_dataAccessor, _loggerFactory); var transitionInstanceObject = tim.CreateTransitionInstanceObject(processInstance, transitionId, fromActivityInstance, toActivityInstance, transitionType, flyingType, runner, (byte)ConditionParseResultEnum.Passed); tim.Insert(transitionInstanceObject); }
/// <summary> /// 插入连线实例的方法 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="fromActivityInstance">来源活动实例</param> /// <param name="toActivityInstance">目的活动实例</param> /// <param name="transitionType">转移类型</param> /// <param name="flyingType">飞跃类型</param> /// <param name="runner">运行者</param> /// <param name="session">会话</param> /// <returns></returns> internal virtual void InsertTransitionInstance(ProcessInstanceEntity processInstance, string transitionGUID, ActivityInstanceEntity fromActivityInstance, ActivityInstanceEntity toActivityInstance, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, WfAppRunner runner, IDbSession session) { var tim = new TransitionInstanceManager(); var transitionInstanceObject = tim.CreateTransitionInstanceObject(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, runner, (byte)ConditionParseResultEnum.Passed); tim.Insert(session.Connection, transitionInstanceObject, session.Transaction); }
/// <summary> /// 创建退回时的流转节点对象、任务和转移数据 /// </summary> /// <param name="processInstance"></param> /// <param name="fromActivityInstance"></param> /// <param name="backMostPreviouslyActivityInstanceID"></param> /// <param name="transitionGUID"></param> /// <param name="transitionType"></param> /// <param name="flyingType"></param> /// <param name="activityResource"></param> /// <param name="session"></param> internal void CreateBackwardActivityTaskTransitionInstance(ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, BackwardTypeEnum backwardType, int backMostPreviouslyActivityInstanceID, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { //实例化Activity var toActivityInstance = base.CreateBackwardToActivityInstanceObject(processInstance, backwardType, backMostPreviouslyActivityInstanceID, activityResource.AppRunner); //进入运行状态 toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; toActivityInstance.AssignedToUsers = base.GenerateActivityAssignedUsers( activityResource.NextActivityPerformers[base.BackwardContext.BackwardToTaskActivity.ActivityGUID]); //插入活动实例数据 base.ActivityInstanceManager.Insert(toActivityInstance, session); //插入任务数据 base.CreateNewTask(toActivityInstance, activityResource, session); //插入转移数据 base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); }
/// <summary> /// 插入连线实例的方法 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="fromActivityInstance">起始活动实例</param> /// <param name="toActivityInstance">到达活动实例</param> /// <param name="transitionType">转移类型</param> /// <param name="flyingType">跳跃类型</param> /// <param name="runner">执行者</param> /// <param name="session">Session</param> /// <returns>新转移实例ID</returns> internal virtual int InsertTransitionInstance(ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, ActivityInstanceEntity toActivityInstance, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, WfAppRunner runner, IDbSession session) { var transition = SendBackOperation.ProcessModel.GetForwardTransition(toActivityInstance.ActivityGUID, fromActivityInstance.ActivityGUID); var transitionGUID = transition != null ? transition.TransitionGUID : WfDefine.WF_XPDL_SEND_BACK_UNKNOWN_GUID; var transitionInstanceObject = this.TransitionInstanceManager.CreateTransitionInstanceObject(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, runner, (byte)ConditionParseResultEnum.Passed); var newID = this.TransitionInstanceManager.Insert(session.Connection, transitionInstanceObject, session.Transaction); return(newID); }
/// <summary> /// 结束节点活动及转移实例化,没有任务数据 /// </summary> /// <param name="toActivity">当前Activity</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">Session</param> internal override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity, WfProcessInstance processInstance, WfActivityInstance fromActivityInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType) { var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, AppRunner); base.ActivityInstanceManager.Insert(toActivityInstance); base.ActivityInstanceManager.Complete(toActivityInstance.Fid, AppRunner); //写节点转移实例数据 base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, AppRunner); }
/// <summary> /// 创建退回时的流转节点对象、任务和转移数据 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="fromActivityInstance">运行节点实例</param> /// <param name="backwardType">退回类型</param> /// <param name="backMostPreviouslyActivityInstanceID">退回节点实例ID</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="transitionType">转移类型</param> /// <param name="flyingType">跳跃类型</param> /// <param name="activityResource">资源</param> /// <param name="session">会话</param> internal void CreateBackwardActivityTaskTransitionInstance(WfProcessInstance processInstance, WfActivityInstance fromActivityInstance, BackwardTypeEnum backwardType, string backMostPreviouslyActivityInstanceID, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType) { //实例化Activity var toActivityInstance = base.CreateBackwardToActivityInstanceObject(processInstance, fromActivityInstance, backwardType, backMostPreviouslyActivityInstanceID, this.AppRunner); //进入准备运行状态 toActivityInstance.ActivityState = ActivityStateEnum.Ready.ToString(); toActivityInstance.AssignedToUserIds = base.GenerateActivityAssignedUserIDs(this.BackwardContext.BackwardToTaskActivity.Performers); toActivityInstance.AssignedToUserNames = base.GenerateActivityAssignedUserNames(this.BackwardContext.BackwardToTaskActivity.Performers); //插入活动实例数据 base.ActivityInstanceManager.Insert(toActivityInstance); base.ReturnDataContext.ActivityInstanceUid = toActivityInstance.Fid; base.ReturnDataContext.ProcessInstanceUid = toActivityInstance.ProcessInsUid; //插入任务数据 base.CreateNewTask(toActivityInstance, this.BackwardContext.BackwardToTaskActivity); //插入转移数据 base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, AppRunner); }
/// <summary> /// 退回是会签情况下的处理: /// 要退回的节点是会签节点 /// 1) 全部实例化会签节点下的多实例节点 /// 2) 只取得办理完成的节点,而且保证CompleteOrder的唯一性 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="backwardToTaskActvity">退回到的活动节点</param> /// <param name="fromActivityInstance">运行节点</param> /// <param name="backwardType">退回类型</param> /// <param name="previousMainInstance">前主节点实例</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="transitionType">转移类型</param> /// <param name="flyingType">跳跃类型</param> /// <param name="activityResource">资源</param> /// <param name="session">会话</param> internal void CreateBackwardActivityTaskRepeatedSignTogetherMultipleInstance(ProcessInstanceEntity processInstance, ActivityEntity backwardToTaskActvity, ActivityInstanceEntity fromActivityInstance, BackwardTypeEnum backwardType, ActivityInstanceEntity previousMainInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { //上一步节点是会签节点的退回处理 //需要重新实例化会签节点上的所有办理人的任务 //重新封装任务办理人为AssignedToUsers, AssignedToUsernames var performerList = AntiGenerateActivityPerformerList(previousMainInstance); activityResource.NextActivityPerformers.Clear(); activityResource.NextActivityPerformers = new Dictionary <string, PerformerList>(); activityResource.NextActivityPerformers.Add(backwardToTaskActvity.ActivityGUID, performerList); //重新生成会签节点的多实例数据 CreateMultipleInstance(backwardToTaskActvity, processInstance, fromActivityInstance, transitionGUID, transitionType, flyingType, activityResource, session); }
/// <summary> /// 创建转移实例数据 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="fromActivityInstance">来源活动实例</param> /// <param name="toActivityInstance">目的活动实例</param> /// <param name="transitionType">转移类型</param> /// <param name="flyingType">飞越类型</param> /// <param name="runner">执行者</param> /// <param name="conditionParseResult">条件解析结果</param> /// <returns>转移实例</returns> internal TransitionInstanceEntity CreateTransitionInstanceObject(ProcessInstanceEntity processInstance, String transitionGUID, ActivityInstanceEntity fromActivityInstance, ActivityInstanceEntity toActivityInstance, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, WfAppRunner runner, byte conditionParseResult) { var entity = new TransitionInstanceEntity(); entity.AppName = processInstance.AppName; entity.AppInstanceID = processInstance.AppInstanceID; entity.ProcessGUID = processInstance.ProcessGUID; entity.ProcessInstanceID = processInstance.ID; entity.TransitionGUID = transitionGUID; entity.TransitionType = (byte)transitionType; entity.FlyingType = (byte)flyingType; //构造活动节点数据 entity.FromActivityGUID = fromActivityInstance.ActivityGUID; entity.FromActivityInstanceID = fromActivityInstance.ID; entity.FromActivityType = fromActivityInstance.ActivityType; entity.FromActivityName = fromActivityInstance.ActivityName; entity.ToActivityGUID = toActivityInstance.ActivityGUID; entity.ToActivityInstanceID = toActivityInstance.ID; entity.ToActivityType = toActivityInstance.ActivityType; entity.ToActivityName = toActivityInstance.ActivityName; entity.ConditionParseResult = conditionParseResult; entity.CreatedByUserID = runner.UserID; entity.CreatedByUserName = runner.UserName; entity.CreatedDateTime = System.DateTime.Now; return(entity); }
/// <summary> /// 会签类型的主节点, 多实例节点处理 /// </summary> /// <param name="processInstance"></param> /// <param name="fromToTransition"></param> /// <param name="fromActivityInstance"></param> /// <param name="activityResource"></param> /// <param name="session"></param> internal 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); //启动子流程 IDbSession subSession = SessionFactory.CreateSession(); WfExecutedResult startedResult = null; var subProcessNode = (SubProcessNode)toActivity.Node; subProcessNode.ActivityInstance = entity; //在流程实例表中记录激活子流程的活动节点ID WfAppRunner subRunner = CopyActivityForwardRunner(activityResource.AppRunner, plist[i], subProcessNode); var runtimeInstance = WfRuntimeManagerFactory.CreateRuntimeInstanceStartup(subRunner, processInstance, subProcessNode, 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); } } }
/// <summary> /// 退回是会签情况下的处理: /// 要退回的节点是会签节点 /// 1) 全部实例化会签节点下的多实例节点 /// 2) 只取得办理完成的节点,而且保证CompleteOrder的唯一性 /// </summary> /// <param name="processInstance"></param> /// <param name="originalBackwardToActivityInstance"></param> /// <param name="backwardType"></param> /// <param name="backSrcActivityInstanceID"></param> /// <param name="activityResource"></param> /// <param name="session"></param> internal void CreateBackwardActivityTaskRepeatedSignTogetherMultipleInstance(ProcessInstanceEntity processInstance, ActivityEntity backwardToTaskActvity, ActivityInstanceEntity fromActivityInstance, BackwardTypeEnum backwardType, ActivityInstanceEntity previousMainInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { //上一步节点是会签节点的退回处理 //需要重新实例化会签节点上的所有办理人的任务 //重新封装任务办理人为AssignedToUsers, AssignedToUsernames var performerList = AntiGenerateActivityPerformerList(previousMainInstance); activityResource.NextActivityPerformers.Clear(); activityResource.NextActivityPerformers = new Dictionary<string, PerformerList>(); activityResource.NextActivityPerformers.Add(backwardToTaskActvity.ActivityGUID, performerList); //重新生成会签节点的多实例数据 CreateMultipleInstance(backwardToTaskActvity, processInstance, fromActivityInstance, transitionGUID, transitionType, flyingType, activityResource, session); }
/// <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 override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity, ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { int newActivityInstanceID = 0; Boolean isParallel = false; if (fromActivityInstance.ActivityType == (short)ActivityTypeEnum.GatewayNode) { //并发多实例分支判断(AndSplit Multiple) var processModel = ProcessModelFactory.Create(processInstance.ProcessGUID, processInstance.Version); var activityNode = processModel.GetActivity(fromActivityInstance.ActivityGUID); isParallel = processModel.IsAndSplitMI(activityNode); } if (isParallel) { //并行多实例容器 var entity = new ActivityInstanceEntity(); var plist = activityResource.NextActivityPerformers[toActivity.ActivityGUID]; //创建并行多实例分支 for (var i = 0; i < plist.Count; i++) { entity = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner); entity.AssignedToUserIDs = plist[i].UserID; entity.AssignedToUserNames = plist[i].UserName; entity.ActivityState = (short)ActivityStateEnum.Ready; //插入活动实例数据 entity.ID = base.ActivityInstanceManager.Insert(entity, session); //插入任务 base.TaskManager.Insert(entity, plist[i], activityResource.AppRunner, session); //插入转移数据 InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, entity, transitionType, flyingType, activityResource.AppRunner, session); } } else { //普通任务节点 var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner); //进入运行状态 toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; toActivityInstance = GenerateActivityAssignedUserInfo(toActivityInstance, activityResource); //插入活动实例数据 newActivityInstanceID = base.ActivityInstanceManager.Insert(toActivityInstance, session); //插入任务数据 base.CreateNewTask(toActivityInstance, activityResource, session); //插入转移数据 InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); //调用外部事件的注册方法 var delegateContext = new DelegateContext { AppInstanceID = processInstance.AppInstanceID, ProcessGUID = processInstance.ProcessGUID, ProcessInstanceID = processInstance.ID, ActivityGUID = toActivity.ActivityGUID, ActivityCode = toActivity.ActivityCode, ActivityResource = activityResource }; DelegateExecutor.InvokeExternalDelegate(session, EventFireTypeEnum.OnActivityCreated, activityResource.AppRunner.DelegateEventList, delegateContext); } }
/// <summary> /// 退回是加签情况下的处理: /// 要退回的节点是加签节点 /// 只实例化当初的加签主节点 /// </summary> /// <param name="processInstance"></param> /// <param name="backwardToTaskActvity"></param> /// <param name="fromActivityInstance"></param> /// <param name="backwardType"></param> /// <param name="previousMainInstance"></param> /// <param name="transitionGUID"></param> /// <param name="transitionType"></param> /// <param name="flyingType"></param> /// <param name="activityResource"></param> /// <param name="session"></param> internal void CreateBackwardActivityTaskRepateSignForwardMainNodeOnly(ProcessInstanceEntity processInstance, ActivityEntity backwardToTaskActvity, ActivityInstanceEntity fromActivityInstance, BackwardTypeEnum backwardType, ActivityInstanceEntity previousMainInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { // 退回是加签情况下的处理: // 要退回的节点是加签节点 // 只实例化当初的加签主节点 //重新封装任务办理人为AssignedToUsers, AssignedToUsernames var performerList = AntiGenerateActivityPerformerList(previousMainInstance); activityResource.NextActivityPerformers.Clear(); activityResource.NextActivityPerformers = new Dictionary<string, PerformerList>(); activityResource.NextActivityPerformers.Add(backwardToTaskActvity.ActivityGUID, performerList); //实例化Activity var toActivityInstance = base.CreateBackwardToActivityInstanceObject(processInstance, backwardType, previousMainInstance.ID, activityResource.AppRunner); //进入准备运行状态 toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; toActivityInstance.AssignedToUserIDs = previousMainInstance.AssignedToUserIDs; toActivityInstance.AssignedToUserNames = previousMainInstance.AssignedToUserNames; toActivityInstance.ComplexType = previousMainInstance.ComplexType; toActivityInstance.CompleteOrder = previousMainInstance.CompleteOrder; toActivityInstance.SignForwardType = previousMainInstance.SignForwardType; //插入活动实例数据 base.ActivityInstanceManager.Insert(toActivityInstance, session); //插入任务数据 base.CreateNewTask(toActivityInstance, activityResource, session); //插入转移数据 base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); }
/// <summary> /// 创建工作项及转移数据 /// </summary> /// <param name="toActivity"></param> /// <param name="processInstance"></param> /// <param name="fromActivityInstance"></param> /// <param name="transitionGUID"></param> /// <param name="transitionType"></param> /// <param name="flyingType"></param> /// <param name="activityResource"></param> /// <param name="session"></param> internal virtual void CreateActivityTaskTransitionInstance(ActivityEntity toActivity, ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, String transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { }
internal override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity, ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { if (toActivity.ActivityTypeDetail.ComplexType == ComplexTypeEnum.SignTogether) { CreateMultipleInstance(toActivity, processInstance, fromActivityInstance, transitionGUID, transitionType, flyingType, activityResource, session); } else { //实例化Activity var toActivityInstance = CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner); //进入运行状态 toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; toActivityInstance.AssignedToUserIDs = GenerateActivityAssignedUserIDs( activityResource.NextActivityPerformers[toActivity.ActivityGUID]); toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames( activityResource.NextActivityPerformers[toActivity.ActivityGUID]); //插入活动实例数据 base.ActivityInstanceManager.Insert(toActivityInstance, session); //插入任务数据 base.CreateNewTask(toActivityInstance, activityResource, session); //插入转移数据 InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); //启动子流程 WfExecutedResult startedResult = null; var subProcessNode = (SubProcessNode)toActivity.Node; subProcessNode.ActivityInstance = toActivityInstance; WfAppRunner subRunner = CopyActivityForwardRunner(activityResource.AppRunner, new Performer(activityResource.AppRunner.UserID, activityResource.AppRunner.UserName), subProcessNode); var runtimeInstance = WfRuntimeManagerFactory.CreateRuntimeInstanceStartup(subRunner, processInstance, subProcessNode, ref startedResult); runtimeInstance.Execute(Session); } }
/// <summary> /// 插入连线实例的方法 /// </summary> /// <param name="processInstance"></param> /// <param name="fromToTransition"></param> /// <param name="fromActivityInstance"></param> /// <param name="toActivityInstance"></param> /// <param name="conditionParseResult"></param> /// <param name="wfLinqDataContext"></param> /// <returns></returns> internal virtual void InsertTransitionInstance(ProcessInstanceEntity processInstance, string transitionGUID, ActivityInstanceEntity fromActivityInstance, ActivityInstanceEntity toActivityInstance, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, WfAppRunner runner, IDbSession session) { var tim = new TransitionInstanceManager(); var transitionInstanceObject = tim.CreateTransitionInstanceObject(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, runner, (byte)ConditionParseResultEnum.Passed); tim.Insert(session.Connection, transitionInstanceObject, session.Transaction); }