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); }
public bool TurnTask(string taskId, WfAppRunner runner) { TaskManager tim = new TaskManager(_dataAccessor, _loggerFactory); WfTask task = tim.GetTask(taskId); if (task == null) { throw new FapException("任务不存在"); } Performer turner = runner.Turners[0]; ActivityInstanceManager aim = new ActivityInstanceManager(_dataAccessor, _loggerFactory); WfActivityInstance activity = aim.GetByFid(task.ActivityInsUid); activity.AssignedToUserIds = activity.AssignedToUserIds.Replace(runner.UserId, turner.UserId); activity.AssignedToUserNames = activity.AssignedToUserNames.Replace(runner.UserName, turner.UserName); aim.Update(activity); task.ExecutorEmpUid = turner.UserId; task.ExecutorEmpName = turner.UserName; task.UpdateBy = runner.UserId; task.UpdateName = runner.UserName; task.UpdateDate = DateTimeUtils.CurrentDateStr; tim.Update(task); TaskAdviceManager tam = new TaskAdviceManager(_dataAccessor, _applicationContext, _loggerFactory); tam.RecordWhenTurnTask(runner.ProcessUid, runner.CurrNodeId, runner.Comment, turner.UserId, turner.UserName); return(true); }
private async Task SendProgress(string nextStepId, string assignToUserIds, string assignToUserNames, JsonModel jsonModel, WfProcessInstance processInstance, WfProcess process, WfActivityInstance currActIns) { var nextAct = process.GetActivity(nextStepId); if (nextAct == null) { jsonModel.statusCode = 300; jsonModel.message = $"流程 {process.Name}的节点 {nextStepId} 找不到!"; return; } var nextActInstance = CreateActivityInstance(process, processInstance, nextAct, WfActivityState.Running, assignToUserIds, assignToUserNames); nextActInstance.PreActInstanceId = currActIns.Id; processInstance.CurrActivityName = nextActInstance.ActivityName; await WfActivityInstanceRepository.SaveAsync(nextActInstance); }
public GatewayExecutedResult CompleteAutomaticlly(WfProcessInstance processInstance, string transitionGUID, WfActivityInstance fromActivityInstance) { var gatewayActivityInstance = base.CreateActivityInstanceObject(base.GatewayActivity, processInstance); gatewayActivityInstance.DirectionType = GatewayDirectionEnum.OrSplit.ToString(); base.InsertActivityInstance(gatewayActivityInstance); base.CompleteActivityInstance(gatewayActivityInstance.Fid); gatewayActivityInstance.ActivityState = ActivityStateEnum.Completed.ToString(); base.GatewayActivityInstance = gatewayActivityInstance; //写节点转移实例数据 base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, gatewayActivityInstance, TransitionTypeEnum.Forward, TransitionFlyingTypeEnum.NotFlying); GatewayExecutedResult 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">会话</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="activityInsUid"></param> /// <returns></returns> internal bool IsComplete(string activityInsUid) { WfActivityInstance wfActivityInstance = _dataAccessor.Get <WfActivityInstance>(activityInsUid, false); string activityType = wfActivityInstance.ActivityType; string method = wfActivityInstance.ApproverMethod; //检查是否当前节点已经审批完成,否则不查找下一级节点 if ((activityType == WfActivityType.TaskNode || activityType == WfActivityType.TimerNode) && method == ApproverMethodEnum.Queue.ToString()) { //队列中存在等待状态的 即为未完成 DynamicParameters param = new DynamicParameters(); param.Add("ActivityInsUid", activityInsUid); int count = _dataAccessor.Count("WfTask", $"ActivityInsUid=@ActivityInsUid and TaskState='{WfTaskState.Waiting}'", param); return(count > 0 ? false : true); } else if (activityType == WfActivityType.SignNode) { //会签,检查通过率 DynamicParameters param = new DynamicParameters(); param.Add("ActivityInsUid", activityInsUid); int totalCount = _dataAccessor.Count("WfTask", $"ActivityInsUid=@ActivityInsUid", param); int completeCount = _dataAccessor.Count("WfTask", $"ActivityInsUid=@ActivityInsUid and TaskState='{WfTaskState.Completed}'", param); if (completeCount / totalCount * 100 >= wfActivityInstance.PassingRate) { return(true); } else { return(false); } } return(true); }
/// <summary> /// 更新活动节点的Token数目 /// </summary> /// <param name="activityId"></param> /// <param name="runner"></param> /// <param name="wfLinqDataContext"></param> internal void IncreaseTokensHad(string activityInsId, WfAppRunner runner) { WfActivityInstance activityInstance = GetByFid(activityInsId); activityInstance.TokensHad += 1; Update(activityInstance); }
/// <summary> /// 根据主节点复制子节点 /// </summary> /// <param name="main"></param> /// <returns></returns> internal WfActivityInstance CreateActivityInstanceObject(WfActivityInstance main) { WfActivityInstance instance = new WfActivityInstance(); instance.Fid = UUIDUtils.Fid; instance.ActivityName = main.ActivityName; instance.ActivityType = main.ActivityType; instance.DirectionType = main.DirectionType; instance.ProcessInsUid = main.ProcessInsUid; instance.AppName = main.AppName; instance.BillUid = main.BillUid; instance.ProcessState = main.ProcessState; instance.AppEmpUid = main.AppEmpUid; instance.TokensRequired = 1; instance.TokensHad = 1; instance.AssignedToUserIds = main.AssignedToUserIds; instance.AssignedToUserNames = main.AssignedToUserNames; instance.ActivityState = main.ActivityState; instance.CanRenewInstance = 0; instance.StartTime = DateTimeUtils.CurrentDateTimeStr; instance.NodeId = main.NodeId; instance.NodeName = main.NodeName; instance.BusinessUid = main.BusinessUid; instance.AppStartTime = main.AppStartTime; return(instance); }
/// <summary> /// OrJoin合并时的节点完成方法 /// 1. 如果有满足条件的OrJoin前驱转移,则会重新生成新的OrJoin节点实例 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="fromActivityInstance">起始活动实例</param> /// <param name="activityResource">活动资源</param> /// <param name="session">会话</param> public GatewayExecutedResult CompleteAutomaticlly(WfProcessInstance processInstance, string transitionGUID, WfActivityInstance fromActivityInstance) { //检查是否有运行中的合并节点实例 WfActivityInstance joinNode = base.ActivityInstanceManager.GetActivityInstanceRunning( processInstance.Fid, base.GatewayActivity.ActivityID); int tokensRequired = 0; int tokensHad = 0; if (joinNode == null) { var joinActivityInstance = base.CreateActivityInstanceObject(base.GatewayActivity, processInstance); //计算总需要的Token数目 joinActivityInstance.TokensRequired = GetTokensRequired(processInstance.Fid); joinActivityInstance.TokensHad = 1; tokensRequired = joinActivityInstance.TokensRequired; //进入运行状态 joinActivityInstance.ActivityState = ActivityStateEnum.Running.ToString(); //joinActivityInstance.DirectionType =GatewayDirectionEnum.AndJoin.ToString(); base.InsertActivityInstance(joinActivityInstance); base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, joinActivityInstance, TransitionTypeEnum.Forward, TransitionFlyingTypeEnum.NotFlying); } else { //更新节点的活动实例属性 base.GatewayActivityInstance = joinNode; tokensRequired = base.GatewayActivityInstance.TokensRequired; tokensHad = base.GatewayActivityInstance.TokensHad; //更新Token数目 base.ActivityInstanceManager.IncreaseTokensHad(base.GatewayActivityInstance.Fid, base._runner); base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, joinNode, TransitionTypeEnum.Forward, TransitionFlyingTypeEnum.NotFlying); } if ((tokensHad + 1) == tokensRequired) { //如果达到完成节点的Token数,则设置该节点状态为完成 base.CompleteActivityInstance(base.GatewayActivityInstance.Fid); base.GatewayActivityInstance.ActivityState = ActivityStateEnum.Completed.ToString(); } GatewayExecutedResult result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Successed); return(result); }
/// <summary> /// 插入任务数据 /// </summary> /// <param name="activity"></param> /// <param name="performer"></param> /// <param name="runner"></param> internal void Insert(WfActivityInstance activity, Performer performer, int sort, string taskState = "Handling", bool isSignTask = false) { Insert(activity, performer.UserId, performer.UserName, sort, taskState, isSignTask); }
/// <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="processInstance">流程实例</param> /// <param name="activity">活动</param> /// <param name="runner">执行者</param> protected WfActivityInstance CreateActivityInstanceObject(ActivityEntity activity, WfProcessInstance processInstance, WfAppRunner runner) { WfActivityInstance entity = ActivityInstanceManager.CreateActivityInstanceObject( processInstance, activity, runner); return(entity); }
public GatewayExecutedResult CompleteAutomaticlly(WfProcessInstance processInstance, string transitionGUID, WfActivityInstance fromActivityInstance) { GatewayExecutedResult result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Unknown); bool canRenewInstance = false; //检查是否有运行中的合并节点实例 WfActivityInstance joinNode = base.ActivityInstanceManager.GetActivityInstanceRunning( processInstance.Fid, base.GatewayActivity.ActivityID); if (joinNode == null) { canRenewInstance = true; } else { //判断是否可以激活下一步节点 canRenewInstance = (joinNode.CanRenewInstance == 1); if (!canRenewInstance) { result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.FallBehindOfXOrJoin); return(result); } } if (canRenewInstance) { var gatewayActivityInstance = base.CreateActivityInstanceObject(base.GatewayActivity, processInstance); gatewayActivityInstance.DirectionType = GatewayDirectionEnum.XOrJoin.ToString(); base.InsertActivityInstance(gatewayActivityInstance); base.CompleteActivityInstance(gatewayActivityInstance.Fid); gatewayActivityInstance.ActivityState = ActivityStateEnum.Completed.ToString(); base.GatewayActivityInstance = gatewayActivityInstance; //写节点转移实例数据 base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, gatewayActivityInstance, TransitionTypeEnum.Forward, TransitionFlyingTypeEnum.NotFlying); 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">会话</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="source"></param> /// <param name="instance"></param> internal void Renew(WfActivityInstance sourceActivity, WfActivityInstance newInstance, string taskState = "Handling", bool isSignTask = false) { var performer = new Performer() { UserId = sourceActivity.AssignedToUserIds, UserName = sourceActivity.AssignedToUserNames }; Insert(newInstance, performer, 1, taskState, isSignTask); }
/// <summary> /// 插入任务数据 /// </summary> /// <param name="activity"></param> /// <param name="performers"></param> /// <param name="wfLinqDataContext"></param> internal void Insert(WfActivityInstance activity, IList <Performer> performers, string taskState = "Handling", bool isSignTask = false) { int i = 0; foreach (Performer performer in performers) { i++; Insert(activity, performer, i, taskState, isSignTask); } }
/// <summary> /// 活动实例完成 /// </summary> /// <param name="activityInsUid"></param> /// <param name="runner"></param> internal void Complete(string activityInsUid, WfAppRunner runner, bool isLogic = true) { WfActivityInstance activityInstance = _dataAccessor.Get <WfActivityInstance>(activityInsUid, false); activityInstance.ActivityState = WfActivityInstanceState.Completed; activityInstance.ApproveState = runner.ApproveState; activityInstance.EndTime = DateTimeUtils.CurrentDateTimeStr; _dataAccessor.Update <WfActivityInstance>(activityInstance); #region 活动节点完成逻辑 #endregion }
/// <summary> /// 创建退回类型的活动实例对象 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="backwardType">退回类型</param> /// <param name="backSrcActivityInstanceID">退回的活动实例ID</param> /// <param name="runner">登录用户</param> /// <returns></returns> protected WfActivityInstance CreateBackwardToActivityInstanceObject(WfProcessInstance processInstance, WfActivityInstance activityInstance, BackwardTypeEnum backwardType, string backSrcActivityInstanceID, WfAppRunner runner) { WfActivityInstance entity = ActivityInstanceManager.CreateBackwardActivityInstanceObject( processInstance, this.BackwardContext.BackwardToTaskActivity, activityInstance, backwardType, this.BackwardContext.BackwardToTaskActivity.ActivityID, runner); return(entity); }
/// <summary> /// 读取节点的上一步节点信息 /// </summary> /// <param name="runningActivity">当前节点</param> /// <param name="hasPassedGatewayNode">是否经由路由节点</param> /// <returns></returns> internal List <WfActivityInstance> GetPreviousActivity(WfActivityInstance runningActivity, bool isSendback, out bool hasPassedGatewayNode) { hasPassedGatewayNode = false; var transitionList = GetTransitionList(runningActivity.ProcessInsUid).ToList(); string backSrcActivityInstanceId = ""; if (isSendback == true && runningActivity.BackSrcActivityId != null) { //节点时曾经发生退回的节点 backSrcActivityInstanceId = runningActivity.BackSrcActivityId; } else { if (!string.IsNullOrWhiteSpace(runningActivity.MainActivityId))//如果是会签节点找到主节点ID { backSrcActivityInstanceId = runningActivity.MainActivityId; } else { backSrcActivityInstanceId = runningActivity.Fid; } } var aim = new ActivityInstanceManager(_dataAccessor, _loggerFactory); var runningTransitionList = transitionList.Where(o => o.TargetActivityInsUid == backSrcActivityInstanceId).ToList(); List <WfActivityInstance> previousActivityList = new List <WfActivityInstance>(); foreach (var entity in runningTransitionList) { //如果是逻辑节点,则继续查找 if (entity.SourceActivityNodeType == WfActivityType.GatewayNode) { GetPreviousOfGatewayActivity(transitionList, entity.SourceActivityNodeId, previousActivityList); hasPassedGatewayNode = true; } else { previousActivityList.Add(aim.GetByFid(entity.SourceActivityNodeId)); } } return(previousActivityList); }
/// <summary> /// 创建活动实例的对象 /// </summary> /// <param name="activityEntity"></param> /// <param name="processInstance"></param> /// <returns></returns> internal WfActivityInstance CreateActivityInstanceObject(WfProcessInstance processIns, ActivityEntity activityEntity, WfAppRunner runner) { WfActivityInstance activity = new WfActivityInstance(); activity.Fid = UUIDUtils.Fid; activity.ActivityName = activityEntity.ActivityName; activity.ProcessUid = processIns.ProcessUid; activity.ActivityType = activityEntity.ActivityType.ToString(); activity.ApproverMethod = activityEntity.ApproverMethod.ToString(); activity.DirectionType = activityEntity.GatewayDirectionType.ToString(); activity.ProcessInsUid = processIns.Fid; activity.NodeId = activityEntity.ActivityID; activity.NodeName = activityEntity.ActivityCode; activity.AppName = runner.AppName; activity.BillUid = runner.BillUid; activity.TokensRequired = 1; activity.TokensHad = 1; activity.AssignedToUserIds = runner.UserId; activity.AssignedToUserNames = runner.UserName; activity.ActivityState = WfActivityInstanceState.Ready; activity.CanRenewInstance = 0; activity.BusinessUid = runner.BusinessUid; activity.AppEmpUid = processIns.AppEmpUid; activity.AppStartTime = processIns.StartTime; activity.ProcessState = processIns.ProcessState; activity.StartTime = DateTimeUtils.CurrentDateTimeStr; if (activityEntity.BillTemplate.IsMissing()) { activity.FormTemplate = processIns.FormTemplateUid; } else { activity.FormTemplate = activityEntity.BillTemplate; } if (activityEntity.FieldItems != null && activityEntity.FieldItems.Any()) { activity.FormPower = activityEntity.FieldItems.ToJson(); } activity.PassingRate = activityEntity.PassRate; activity.AutoExecTime = DateTimeUtils.DateTimeFormat(DateTime.Now.AddMinutes(activityEntity.Expiration)); activity.MessageSetting = $"{{'approver':{(activityEntity.NoticeApprover ? 1 : 0)},'applicant':{(activityEntity.NoticeApplicant ? 1 : 0)},'mail':{(activityEntity.IsMail ? 1 : 0)},'message':{(activityEntity.IsMessage ? 1 : 0)}}}"; return(activity); }
/// <summary> /// 插入任务数据(创建任务) /// </summary> /// <param name="activity"></param> /// <param name="performerID"></param> /// <param name="performerName"></param> /// <param name="runnerID"></param> /// <param name="runnerName"></param> private void Insert(WfActivityInstance activityIns, string performerID, string performerName, int sort, string taskState = "Handling", bool isSignTask = false) { WfTask task = new WfTask(); task.AppName = activityIns.AppName; task.BillUid = activityIns.BillUid; task.TaskName = string.Format("{0}-{1}", activityIns.AppName, activityIns.NodeName); task.ActivityInsUid = activityIns.Fid; task.ProcessUid = activityIns.ProcessUid; task.ProcessInsUid = activityIns.ProcessInsUid; task.NodeId = activityIns.NodeId; task.NodeName = activityIns.NodeName; task.TaskType = WfTaskType.Manual; task.TaskActivityType = activityIns.ActivityType; task.ExecutorEmpUid = performerID; task.ExecutorEmpName = performerName; if ((activityIns.ActivityType == WfActivityType.TaskNode || activityIns.ActivityType == WfActivityType.TimerNode) && activityIns.ApproverMethod == ApproverMethodEnum.Queue.ToString() && sort > 1) { //当节点为普通节点审批方式为顺序完成的时候,第二个审批人需要等待 taskState = WfTaskState.Waiting; } task.TaskState = taskState; //1-办理状态 task.TaskStartTime = DateTimeUtils.CurrentDateTimeStr; task.ApproverSort = sort; task.RecordState = 1; task.BusinessUid = activityIns.BusinessUid; //task.BizName = activityInstance.BizName; task.AppEmpUid = activityIns.AppEmpUid; task.AppStartTime = activityIns.AppStartTime; task.ProcessState = activityIns.ProcessState; task.IsSignTask = isSignTask ? 1 : 0; //插入任务数据 Insert(task); if (task.TaskState == WfTaskState.Handling) { SendMessage(activityIns, task); } }
/// <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> /// 由节点分配的人员信息生成PerformerList数据结构 /// </summary> /// <param name="activityInstance">活动实例</param> /// <returns>人员列表</returns> protected PerformerList AntiGenerateActivityPerformerList(WfActivityInstance activityInstance) { var performerList = new PerformerList(); if (!string.IsNullOrEmpty(activityInstance.AssignedToUserIds) && !string.IsNullOrEmpty(activityInstance.AssignedToUserNames)) { var assignedToUserIDs = activityInstance.AssignedToUserIds.Split(','); var assignedToUserNames = activityInstance.AssignedToUserNames.Split(','); for (var i = 0; i < assignedToUserIDs.Length; i++) { performerList.Add(new Performer { UserId = assignedToUserIDs[i], UserName = assignedToUserNames[i] }); } } return(performerList); }
/// <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> /// 创建任务的虚方法 /// 1. 对于自动执行的工作项,无需重写该方法 /// 2. 对于人工执行的工作项,需要重写该方法,插入待办的任务数据 /// </summary> /// <param name="activityResource">活动资源</param> /// <param name="activity">活动实例</param> internal virtual void CreateNewTask(WfActivityInstance toActivityInstance, ActivityEntity activity) { if (activity.Performers == null) { throw new WorkflowException("无法创建任务,流程流转下一步的办理人员不能为空!"); } if (this.AppRunner.NextActivity != null && this.AppRunner.NextActivity.ActivityID == toActivityInstance.NodeId && (this.AppRunner.NextActivity.Performers?.Any() ?? false)) { //采用指定审批人 TaskManager.Insert(toActivityInstance, this.AppRunner.NextActivity.Performers); } else { //采用默认审批人 TaskManager.Insert(toActivityInstance, activity.Performers); } }
/// <summary> /// 生成回退节点 /// </summary> /// <param name="processInstance"></param> /// <param name="process"></param> /// <param name="currActIns"></param> /// <returns></returns> private async Task FallBackProgress(WfProcessInstance processInstance, WfProcess process, WfActivityInstance currActIns, string backStepId) { var preActInstance = await WfActivityInstanceRepository.GetLatestActivityAsync(processInstance.Id, backStepId); var backActivity = process.GetActivity(backStepId); var backActInstance = CreateActivityInstance(process, processInstance, backActivity, WfActivityState.Running, preActInstance.AssignToUserIds, preActInstance.AssignToUserNames); backActInstance.PreActInstanceId = preActInstance.PreActInstanceId; backActInstance.BackActivityInstanceId = currActIns.Id; processInstance.CurrActivityName = backActInstance.ActivityName; currActIns.ActivityState = WfActivityState.Sendbacked; await WfActivityInstanceRepository.SaveAsync(backActInstance); }
/// <summary> /// 创建活动实例的对象 /// </summary> /// <param name="activityNode"></param> /// <param name="processInstance"></param> /// <returns></returns> internal WfActivityInstance CreateBackwardActivityInstanceObject(WfProcessInstance process, ActivityEntity activityNode, WfActivityInstance activity, BackwardTypeEnum backwardType, string backSrcActivityId, WfAppRunner runner) { WfActivityInstance instance = new WfActivityInstance(); instance.Fid = UUIDUtils.Fid; instance.ActivityName = activityNode.ActivityName; instance.ActivityType = activityNode.ActivityType.ToString(); instance.DirectionType = activityNode.GatewayDirectionType.ToString(); instance.ProcessInsUid = process.Fid; instance.NodeId = activityNode.ActivityID; instance.NodeName = activityNode.ActivityName; instance.AppName = activity.AppName; instance.BillUid = activity.BillUid; instance.BackwardType = backwardType.ToString(); instance.BackSrcActivityId = backSrcActivityId; instance.TokensRequired = 1; instance.TokensHad = 1; instance.AssignedToUserIds = runner.UserId; instance.AssignedToUserNames = runner.UserName; instance.UpdateDate = DateTimeUtils.CurrentDateTimeStr; instance.ActivityState = WfActivityInstanceState.Ready; instance.CanRenewInstance = 0; activity.BusinessUid = process.BusinessUid; instance.AppEmpUid = process.AppEmpUid; instance.StartTime = process.StartTime; instance.ProcessState = process.ProcessState; instance.StartTime = DateTimeUtils.CurrentDateTimeStr; if (activityNode.FieldItems.Any()) { instance.FormPower = activityNode.FieldItems.ToJson(); } return(instance); }
/// <summary> /// 创建新流程实例,根据流程模板 /// </summary> /// <param name="runner"></param> /// <param name="func"></param> /// <param name="service"></param> /// <returns></returns> internal WfProcessInstance CreateProcessInstance(WfAppRunner runner, WfProcessInstance parentProcessInstance, WfActivityInstance subProcessNode, Action <WfAppRunner, WfProcessInstance, WfProcess> func) { WfProcess wfProcess = _dataAccessor.Get <WfProcess>(runner.ProcessUid, false); WfProcessInstance wfProcessInstance = new WfProcessInstance(); wfProcessInstance.Fid = UUIDUtils.Fid;; wfProcessInstance.ProcessUid = wfProcess.Fid; wfProcessInstance.BillUid = runner.BillUid; wfProcessInstance.BizName = runner.BillData.BillCode;//易标识 wfProcessInstance.AppEmpUid = runner.UserId; wfProcessInstance.AppEmpName = runner.UserName; wfProcessInstance.StartTime = DateTimeUtils.CurrentDateStr; wfProcessInstance.ProcessState = WfProcessInstanceState.Running; wfProcessInstance.ProcessName = wfProcess.ProcessName; wfProcessInstance.ProcessDesc = wfProcess.Description; wfProcessInstance.IsHasForm = 1; wfProcessInstance.BusinessUid = runner.BusinessUid; wfProcessInstance.IsHandling = 0; //未处理状态 wfProcessInstance.MessageSetting = wfProcess.MessageSetting; wfProcessInstance.FormTemplateUid = wfProcess.FormTemplateUid; wfProcessInstance.FormType = wfProcess.FormType; wfProcessInstance.BillTable = wfProcess.BillTable; if (parentProcessInstance != null) { //流程的Parent信息 wfProcessInstance.ParentProcessInsUid = parentProcessInstance.Fid; wfProcessInstance.ParentProcessUid = parentProcessInstance.ProcessUid; wfProcessInstance.InvokeActivityInsUid = subProcessNode.Fid; wfProcessInstance.InvokeActivityUid = subProcessNode.NodeId.ToInt(); } if (func != null) { func(runner, wfProcessInstance, wfProcess); } return(wfProcessInstance); }
/// <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="runner">执行者</param> /// <param name="result">结果对象</param> /// <returns>运行时实例对象</returns> public static WfRuntimeManager CreateRuntimeInstanceAppRunning( WfAppRunner runner, IServiceProvider serviceProvider, ref WfExecutedResult result) { //检查传人参数是否有效 var rmins = new WfRuntimeManagerAppRunning(serviceProvider); rmins.WfExecutedResult = result = new WfExecutedResult(); if (string.IsNullOrEmpty(runner.BillUid) || runner.ProcessUid == null || runner.CurrActivityInsUid == null || runner.CurrProcessInsUid == null || runner.CurrWfTaskUid == null || runner.CurrNodeId == null) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.RunApp_ErrorArguments; result.Message = "方法参数错误,无法运行流程!"; return(rmins); } //传递runner变量 rmins.AppRunner = runner; var aim = new ActivityInstanceManager(serviceProvider); WfActivityInstance wfActivityInstance = aim.GetByFid(runner.CurrActivityInsUid); if (wfActivityInstance.ActivityState == WfActivityInstanceState.Completed) { result.Status = WfExecutedStatus.Exception; result.Message = "任务已经完成,不需要再审批。"; return(rmins); } rmins.RunningActivityInstance = wfActivityInstance; rmins.ProcessModel = new ProcessModel(serviceProvider, runner.ProcessUid, runner.BillUid); var tm = new TaskManager(serviceProvider); rmins.TaskView = tm.GetTask(runner.CurrWfTaskUid); return(rmins); }