/// <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); }
/// <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="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); } }
/// <summary> /// EOrJoin合并时的节点完成方法 /// 根据前置转移上定义的是否强制分支来判断完成合并节点 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="fromActivity">起始活动</param> /// <param name="fromActivityInstance">起始活动实例</param> /// <param name="runner">运行者</param> /// <param name="session">会话</param> private NodeAutoExecutedResult CompleteAutomaticallyByForcedBranchesCount(ProcessInstanceEntity processInstance, string transitionGUID, ActivityEntity fromActivity, ActivityInstanceEntity fromActivityInstance, WfAppRunner runner, IDbSession session) { NodeAutoExecutedResult result = NodeAutoExecutedResult.CreateGatewayExecutedResult(NodeAutoExecutedStatus.Unknown); IList <TransitionEntity> forcedTransitionList = null; var tokensCountRequired = base.ProcessModel.GetForcedBranchesCountBeforeEOrJoin(GatewayActivity, out forcedTransitionList); if (tokensCountRequired == 0) { result = NodeAutoExecutedResult.CreateGatewayExecutedResult(NodeAutoExecutedStatus.Failed); throw new WfXpdlException(LocalizeHelper.GetEngineMessage("nodemediatoreorjoin.CompleteAutomaticallyByForcedBranchesCount.error")); } //根据强制分支的数目和具体分支来完成增强合并节点 var forcedCount = forcedTransitionList.Where(t => t.TransitionGUID == transitionGUID).Count(); if (forcedCount == 0) { //当前执行的分支不是强制分支,直接返回就可以 result = NodeAutoExecutedResult.CreateGatewayExecutedResult(NodeAutoExecutedStatus.NotForcedBrancheWhenEOrJoin); } else if (forcedCount == 1) { result = CompleteAutomaticallyInternal(processInstance, transitionGUID, fromActivity, fromActivityInstance, tokensCountRequired, runner, session); } return(result); }
/// <summary> /// 创建多实例节点之间回滚时的活动实例,任务数据 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="originalBackwardToActivityInstance">原始退回到的节点实例</param> /// <param name="backwardType">退回类型</param> /// <param name="backSrcActivityInstanceID">源退回节点实例ID</param> /// <param name="activityResource">资源</param> /// <param name="session">会话</param> internal void CreateBackwardActivityTaskOfInnerMultipleInstance(ProcessInstanceEntity processInstance, ActivityInstanceEntity originalBackwardToActivityInstance, BackwardTypeEnum backwardType, int backSrcActivityInstanceID, ActivityResource activityResource, IDbSession session) { //创建回滚到的节点信息 var rollbackPreviousActivityInstance = base.CreateBackwardToActivityInstanceObject(processInstance, backwardType, backSrcActivityInstanceID, 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, base.Session); }
/// <summary> /// OrJoin合并时的节点完成方法 /// 1. 如果有满足条件的OrJoin前驱转移,则会重新生成新的OrJoin节点实例 /// </summary> /// <param name="processInstance"></param> /// <param name="fromTransition"></param> /// <param name="fromActivityInstance"></param> /// <param name="activityResource"></param> /// <param name="wfLinqDataContext"></param> public GatewayExecutedResult CompleteAutomaticlly(ProcessInstanceEntity processInstance, string transitionGUID, ActivityInstanceEntity fromActivityInstance, ActivityResource activityResource, IDbSession session) { var gatewayActivityInstance = base.CreateActivityInstanceObject(base.GatewayActivity, processInstance, activityResource.AppRunner); gatewayActivityInstance.GatewayDirectionTypeID = (short)GatewayDirectionEnum.OrJoin; base.InsertActivityInstance(gatewayActivityInstance, session); base.CompleteActivityInstance(gatewayActivityInstance.ID, activityResource, session); gatewayActivityInstance.ActivityState = (short)ActivityStateEnum.Completed; base.GatewayActivityInstance = gatewayActivityInstance; base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, gatewayActivityInstance, TransitionTypeEnum.Forward, TransitionFlyingTypeEnum.NotFlying, activityResource.AppRunner, session); GatewayExecutedResult result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Successed); return result; }
/// <summary> /// 创建流程跳转上下文对象 /// </summary> /// <param name="jumpforwardActivity"></param> /// <param name="processModel"></param> /// <param name="processInstance"></param> /// <param name="activityResource"></param> /// <returns></returns> internal static ActivityForwardContext CreateJumpforwardContext(ActivityEntity jumpforwardActivity, ProcessModel processModel, ProcessInstanceEntity processInstance, ActivityResource activityResource) { return(new ActivityForwardContext(processModel, processInstance, jumpforwardActivity, activityResource)); }
/// <summary> /// 自动完成结束节点 /// </summary> /// <param name="processInstance"></param> /// <param name="fromActivityInstance"></param> /// <param name="activityResource"></param> /// <param name="wfLinqDataContext"></param> public GatewayExecutedResult CompleteAutomaticlly(ProcessInstanceEntity processInstance, string transitionGUID, ActivityInstanceEntity fromActivityInstance, ActivityResource activityResource, IDbSession session) { GatewayExecutedResult result = null; var toActivityInstance = base.CreateActivityInstanceObject(base.Linker.ToActivity, processInstance, activityResource.AppRunner); base.ActivityInstanceManager.Insert(toActivityInstance, session); base.ActivityInstanceManager.Complete(toActivityInstance.ID, activityResource.AppRunner, session); //写节点转移实例数据 base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, TransitionTypeEnum.Forward, TransitionFlyingTypeEnum.NotFlying, activityResource.AppRunner, session); //设置流程完成 ProcessInstanceManager pim = new ProcessInstanceManager(); pim.Complete(processInstance.ID, activityResource.AppRunner, session); //发送流程结束消息给流程启动人 return(result); }
/// <summary> /// 创建工作项及转移数据 /// </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="processInstance">流程实例</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="fromActivity">起始活动</param> /// <param name="fromActivityInstance">起始活动实例</param> /// <param name="toActivity">目标活动</param> /// <param name="runner">运行者</param> /// <param name="session">会话</param> /// <returns>网关执行结果</returns> public NodeAutoExecutedResult CompleteAutomaticlly(ProcessInstanceEntity processInstance, string transitionGUID, ActivityEntity fromActivity, ActivityInstanceEntity fromActivityInstance, ActivityEntity toActivity, WfAppRunner runner, IDbSession session) { var gatewayActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, runner); base.InsertActivityInstance(gatewayActivityInstance, session); base.CompleteActivityInstance(gatewayActivityInstance.ID, runner, session); gatewayActivityInstance.ActivityState = (short)ActivityStateEnum.Completed; base.Linker.ToActivityInstance = gatewayActivityInstance; //写节点转移实例数据 base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, gatewayActivityInstance, TransitionTypeEnum.Forward, TransitionFlyingTypeEnum.NotFlying, runner, session); NodeAutoExecutedResult result = NodeAutoExecutedResult.CreateGatewayExecutedResult(NodeAutoExecutedStatus.Successed); return(result); }
/// <summary> /// OrJoin合并时的节点完成方法 /// 1. 如果有满足条件的OrJoin前驱转移,则会重新生成新的OrJoin节点实例 /// </summary> /// <param name="processInstance"></param> /// <param name="fromTransition"></param> /// <param name="fromActivityInstance"></param> /// <param name="activityResource"></param> /// <param name="wfLinqDataContext"></param> public GatewayExecutedResult CompleteAutomaticlly(ProcessInstanceEntity processInstance, TransitionEntity fromTransition, ActivityInstanceEntity fromActivityInstance, ActivityResource activityResource, ISession session) { var toActivityInstance = base.CreateActivityInstanceObject(processInstance, activityResource.LogonUser); base.InsertActivityInstance(toActivityInstance, session); base.CompleteActivityInstance(toActivityInstance.ActivityInstanceGUID, activityResource, session); SyncActivityInstanceObjectState(NodeStateEnum.Completed); base.InsertTransitionInstance(processInstance, fromTransition, fromActivityInstance, toActivityInstance, TransitionTypeEnum.Forward, activityResource.LogonUser, session); GatewayExecutedResult result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Successed); return(result); }
/// <summary> /// 根据流程定义,创建新的流程实例 /// </summary> /// <param name="runner">运行者</param> /// <param name="processEntity">流程定义</param> /// <param name="parentProcessInstance">父流程实例</param> /// <param name="subProcessNode">子流程节点</param> /// <returns>流程实例的ID</returns> internal ProcessInstanceEntity CreateNewProcessInstanceObject(WfAppRunner runner, ProcessEntity processEntity, ProcessInstanceEntity parentProcessInstance, ActivityInstanceEntity subProcessNode) { ProcessInstanceEntity entity = new ProcessInstanceEntity(); entity.ProcessGUID = processEntity.ProcessGUID; entity.ProcessName = processEntity.ProcessName; entity.Version = processEntity.Version; entity.AppName = runner.AppName; entity.AppInstanceID = runner.AppInstanceID; entity.ProcessState = (int)ProcessStateEnum.Running; if (parentProcessInstance != null) { //流程的Parent信息 entity.ParentProcessInstanceID = parentProcessInstance.ID; entity.ParentProcessGUID = parentProcessInstance.ProcessGUID; entity.InvokedActivityInstanceID = subProcessNode.ID; entity.InvokedActivityGUID = subProcessNode.ActivityGUID; } entity.CreatedByUserID = runner.UserID; entity.CreatedByUserName = runner.UserName; entity.CreatedDateTime = System.DateTime.Now; entity.LastUpdatedByUserID = runner.UserID; entity.LastUpdatedByUserName = runner.UserName; entity.LastUpdatedDateTime = System.DateTime.Now; return(entity); }
/// <summary> /// 创建多实例节点之间回滚时的活动实例,任务数据 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="originalBackwardToActivityInstance">原始退回到的节点实例</param> /// <param name="backwardType">退回类型</param> /// <param name="backSrcActivityInstanceID">源退回节点实例ID</param> /// <param name="activityResource">资源</param> /// <param name="session">会话</param> internal void CreateBackwardActivityTaskOfInnerMultipleInstance(ProcessInstanceEntity processInstance, ActivityInstanceEntity originalBackwardToActivityInstance, BackwardTypeEnum backwardType, int backSrcActivityInstanceID, ActivityResource activityResource, IDbSession session) { //创建回滚到的节点信息 var rollbackPreviousActivityInstance = base.CreateBackwardToActivityInstanceObject(processInstance, backwardType, backSrcActivityInstanceID, 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); }
/// <summary> /// 自动完成结束节点 /// </summary> /// <param name="processInstance"></param> /// <param name="fromActivityInstance"></param> /// <param name="activityResource"></param> /// <param name="wfLinqDataContext"></param> public GatewayExecutedResult CompleteAutomaticlly(ProcessInstanceEntity processInstance, TransitionEntity fromToTransition, ActivityInstanceEntity fromActivityInstance, ActivityResource activityResource, ISession session) { GatewayExecutedResult result = null; var toActivityInstance = base.CreateActivityInstanceObject(processInstance, activityResource.LogonUser); base.InsertActivityInstance(toActivityInstance, session); base.CompleteActivityInstance(toActivityInstance.ActivityInstanceGUID, activityResource, session); //写节点转移实例数据 base.InsertTransitionInstance(processInstance, fromToTransition, fromActivityInstance, toActivityInstance, TransitionTypeEnum.Forward, activityResource.LogonUser, session); //设置流程完成 ProcessInstanceManager pim = new ProcessInstanceManager(); pim.Complete(processInstance.ProcessInstanceGUID, activityResource.LogonUser, session); return(result); }
/// <summary> /// 获取跨流程XML的消息节点实体对象 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="throwActivity">消息抛出节点</param> /// <param name="throwActivityInstance">消息抛出节点活动实例</param> /// <param name="catchProcessEntity">消息捕获流程实体对象</param> /// <returns>消息接收节点实体</returns> internal static ActivityEntity GetMessageCatchActivity(ProcessInstanceEntity processInstance, ActivityEntity throwActivity, ActivityInstanceEntity throwActivityInstance, out ProcessEntity catchProcessEntity) { ActivityEntity catchActivity = null; var pm = new ProcessManager(); var processEntity = pm.GetByVersion(processInstance.ProcessGUID, processInstance.Version); var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(processEntity.XmlContent); var packageNode = xmlDoc.DocumentElement; var messagesNode = packageNode.SelectSingleNode("Layout/Messages"); var messageNode = messagesNode.SelectSingleNode(string.Format("Message[@from='{0}']", throwActivity.ActivityGUID)); var catchActivityGUID = XMLHelper.GetXmlAttribute(messageNode, "to"); var catchActivityNode = packageNode.SelectSingleNode(string.Format("WorkflowProcesses/Process/Activities/Activity[@id='{0}']", catchActivityGUID)); var catchProcessNode = catchActivityNode.ParentNode.ParentNode; catchProcessEntity = new ProcessEntity(); catchProcessEntity.ProcessGUID = XMLHelper.GetXmlAttribute(catchProcessNode, "id"); catchProcessEntity.Version = XMLHelper.GetXmlAttribute(catchProcessNode, "version"); catchProcessEntity.ProcessName = XMLHelper.GetXmlAttribute(catchProcessNode, "name"); catchProcessEntity.ProcessCode = XMLHelper.GetXmlAttribute(catchProcessNode, "code"); catchActivity = ConvertHelper.ConvertXmlActivityNodeToActivityEntity(catchActivityNode, catchProcessEntity.ProcessGUID); return(catchActivity); }
/// <summary> /// 删除不正常的流程实例(流程在取消状态,才可以进行删除!) /// </summary> /// <param name="processInstanceID"></param> /// <returns></returns> internal bool Delete(int processInstanceID) { bool isDeleted = false; IDbSession session = SessionFactory.CreateSession(); try { ProcessInstanceEntity entity = Repository.GetById <ProcessInstanceEntity>(processInstanceID); if (entity.ProcessState == (int)ProcessStateEnum.Canceled) { Repository.Delete <ProcessInstanceEntity>(session.Connection, processInstanceID, session.Transaction); session.Commit(); isDeleted = true; } else { throw new ProcessInstanceException("流程只有先取消,才可以删除!"); } } catch (System.Exception) { session.Rollback(); throw; } finally { session.Dispose(); } return(isDeleted); }
/// <summary> /// 获取处于运行状态的流程实例 /// </summary> /// <param name="appInstanceID">应用实例ID</param> /// <param name="processGUID">流程GUID</param> /// <param name="session">会话</param> /// <returns>流程实例实体</returns> internal ProcessInstanceEntity GetRunningProcessInstance(string appInstanceID, string processGUID, IDbSession session) { //var sql = @"SELECT // * // FROM WfProcessInstance // WHERE AppInstanceID=@appInstanceID // AND ProcessGUID=@processGUID // AND RecordStatusInvalid=0 // AND (ProcessState=1 OR ProcessState=2) // ORDER BY CreatedDateTime DESC"; ProcessInstanceEntity entity = null; var instanceList = session.GetRepository <ProcessInstanceEntity>().Query(e => e.AppInstanceID == appInstanceID && e.ProcessGUID == processGUID && e.RecordStatusInvalid == 0 && (e.ProcessState == 1 || e.ProcessState == 2)) .OrderByDescending(e => e.CreatedDateTime) .ToList(); if (instanceList != null && instanceList.Count() == 1) { entity = instanceList[0]; } 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) { 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="processModel"></param> /// <param name="processInstance"></param> /// <param name="activity"></param> /// <param name="activityResource"></param> /// <returns></returns> internal static ActivityForwardContext CreateStartupContext(ProcessModel processModel, ProcessInstanceEntity processInstance, ActivityEntity activity, ActivityResource activityResource) { return(new ActivityForwardContext(processModel, processInstance, activity, activityResource)); }
/// <summary> /// 消息发布方法 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="throwActivity">消息活动</param> /// <param name="throwActivityInstance">消息活动实例</param> public void PublishMessage(ProcessInstanceEntity processInstance, ActivityEntity throwActivity, ActivityInstanceEntity throwActivityInstance) { var topic = throwActivity.ActivityTypeDetail.Expression; ProcessEntity catchProcess = null; var catchActivity = XPDLHelper.GetMessageCatchActivity(processInstance, throwActivity, throwActivityInstance, out catchProcess); var appRunner = new WfAppRunner(); appRunner.MessageTopic = topic; appRunner.AppName = throwActivityInstance.AppName; appRunner.AppInstanceID = throwActivityInstance.AppInstanceID; appRunner.AppInstanceCode = throwActivityInstance.AppInstanceCode; appRunner.UserID = throwActivityInstance.CreatedByUserID; appRunner.UserName = throwActivityInstance.CreatedByUserName; var msgRunnerView = new MessageRunnerView(); msgRunnerView.ProcessEntity = catchProcess; msgRunnerView.ActivityEntity = catchActivity; msgRunnerView.WfAppRunner = appRunner; var jsonRunner = JsonConvert.SerializeObject(msgRunnerView); var messageService = MessageQueueServiceFactory.Create(); messageService.Publish(topic, jsonRunner); }
/// <summary> /// 流程数据插入 /// </summary> /// <param name="entity"></param> /// <param name="wfLinqDataContext"></param> /// <returns></returns> internal void Insert(IDbConnection conn, ProcessInstanceEntity entity, IDbTransaction trans) { int newID = Repository.Insert(conn, entity, trans); entity.ID = newID; Debug.WriteLine(string.Format("process instance inserted, Guid:{0}, time:{1}", entity.ID.ToString(), System.DateTime.Now.ToString())); }
/// <summary> /// 流程数据插入 /// </summary> /// <param name="conn">链接</param> /// <param name="entity">流程实例实体</param> /// <param name="trans">事务</param> /// <returns></returns> internal Int32 Insert(IDbConnection conn, ProcessInstanceEntity entity, IDbTransaction trans) { int newID = Repository.Insert(conn, entity, trans); entity.ID = newID; return(newID); }
/// <summary> /// 启动流程 /// </summary> /// <param name="runner">执行者</param> /// <param name="result">结果对象</param> /// <returns>运行时实例对象</returns> public static WfRuntimeManager CreateRuntimeInstanceStartup(WfAppRunner runner, ref WfExecutedResult result) { //检查流程是否可以被启动 var rmins = new WfRuntimeManagerStartup(); rmins.WfExecutedResult = result = new WfExecutedResult(); //正常流程启动 var pim = new ProcessInstanceManager(); ProcessInstanceEntity processInstance = pim.GetProcessInstanceCurrent(runner.AppInstanceID, runner.ProcessGUID); //不能同时启动多个主流程 if (processInstance != null && processInstance.ParentProcessInstanceID == null && processInstance.ProcessState == (short)ProcessStateEnum.Running) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Started_IsRunningAlready; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceStartup.error"); return(rmins); } rmins.AppRunner = runner; //获取流程第一个可办理节点 rmins.ProcessModel = ProcessModelFactory.Create(runner.ProcessGUID, runner.Version); var startActivity = rmins.ProcessModel.GetStartActivity(); var firstActivity = rmins.ProcessModel.GetFirstActivity(); //var firstActivityList = rmins.ProcessModel.GetFirstActivityList(startActivity, runner.Conditions); if (startActivity.ActivityTypeDetail.TriggerType == TriggerTypeEnum.None) { rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(firstActivity.ActivityGUID, runner.UserID, runner.UserName); } else if (startActivity.ActivityTypeDetail.TriggerType == TriggerTypeEnum.Timer || startActivity.ActivityTypeDetail.TriggerType == TriggerTypeEnum.Message) { if (!string.IsNullOrEmpty(runner.UserID)) { rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(firstActivity.ActivityGUID, runner.UserID, runner.UserName); } else { rmins.AppRunner.NextActivityPerformers = rmins.ProcessModel.GetActivityPerformers(firstActivity.ActivityGUID); } } rmins.ActivityResource = new ActivityResource(runner, rmins.AppRunner.NextActivityPerformers); return(rmins); }
/// <summary> /// 流程数据插入 /// </summary> /// <param name="entity">流程实例实体</param> /// <param name="session">会话</param> /// <returns>新实例ID</returns> internal Int32 Insert(ProcessInstanceEntity entity, IDbSession session) { var newEntity = session.GetRepository <ProcessInstanceEntity>().Insert(entity); session.SaveChanges(); return(newEntity.ID); }
public static WfRuntimeManager CreateRuntimeInstanceStartup(WfAppRunner runner, ProcessInstanceEntity parentProcessInstance, SubProcessNode subProcessNode, ref WfExecutedResult result) { //检查流程是否可以被启动 var rmins = new WfRuntimeManagerStartup(); rmins.WfExecutedResult = result = new WfExecutedResult(); var pim = new ProcessInstanceManager(); ProcessInstanceEntity processInstance = null; if (subProcessNode == null) { //正常流程启动 processInstance = pim.GetProcessInstanceLatest(runner.AppName, runner.AppInstanceID, runner.ProcessGUID); } else { //子流程启动 processInstance = pim.GetProcessInstanceLatest(runner.AppName, runner.AppInstanceID, subProcessNode.SubProcessGUID); } //不能同时启动多个主流程 if (processInstance != null && processInstance.ParentProcessInstanceID == null && processInstance.ProcessState == (short)ProcessStateEnum.Running) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Started_IsRunningAlready; result.Message = "流程已经处于运行状态,如果要重新启动,请先终止当前流程实例!"; return(rmins); } //processInstance 为空,此时继续执行启动操作 rmins.AppRunner = runner; rmins.ParentProcessInstance = parentProcessInstance; rmins.InvokedSubProcessNode = subProcessNode; //获取流程第一个可办理节点 rmins.ProcessModel = ProcessModelFactory.Create(runner.ProcessGUID); var firstActivity = rmins.ProcessModel.GetFirstActivity(); rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(firstActivity.ActivityGUID, runner.UserID, runner.UserName); rmins.ActivityResource = new ActivityResource(runner, rmins.AppRunner.NextActivityPerformers); return(rmins); }
public GatewayExecutedResult CompleteAutomaticlly(ProcessInstanceEntity processInstance, TransitionEntity fromTransition, ActivityInstanceEntity fromActivityInstance, ActivityResource activityResource, ISession session) { GatewayExecutedResult result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Unknown); bool canRenewInstance = false; //检查是否有运行中的合并节点实例 ActivityInstanceEntity joinNode = base.ActivityInstanceManager.GetActivityWithRunningState( processInstance.ProcessInstanceGUID, base.Activity.ActivityGUID, session); if (joinNode == null) { canRenewInstance = true; } else { //判断是否可以激活下一步节点 canRenewInstance = (joinNode.CanRenewInstance == 1); if (!canRenewInstance) { result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.FallBehindOfXOrJoin); return(result); } } if (canRenewInstance) { var toActivityInstance = base.CreateActivityInstanceObject(processInstance, activityResource.LogonUser); base.InsertActivityInstance(toActivityInstance, session); base.CompleteActivityInstance(toActivityInstance.ActivityInstanceGUID, activityResource, session); base.SyncActivityInstanceObjectState(NodeStateEnum.Completed); //写节点转移实例数据 base.InsertTransitionInstance(processInstance, fromTransition, fromActivityInstance, toActivityInstance, TransitionTypeEnum.Forward, activityResource.LogonUser, session); result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Successed); } return(result); }
/// <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="processModel"></param> /// <param name="processInstance"></param> /// <param name="activity"></param> /// <param name="activityResource"></param> private ActivityForwardContext(ProcessModel processModel, ProcessInstanceEntity processInstance, ActivityEntity activity, ActivityResource activityResource) { ProcessModel = processModel; ProcessInstance = processInstance; Activity = activity; ActivityResource = activityResource; }
/// <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); }