private static IWfTransitionDescriptor CreateMainStreamActivities(IWfActivity activityToAppend, IWfActivity startActivity, IWfActivity endActivity, IWfTransitionDescriptor entryTransition, WfControlOperationType operationType) { bool useOriginal = true; IWfTransitionDescriptor resultTransition = null; if (activityToAppend.Process.MainStream != null) { IWfActivityDescriptor startActDesp = startActivity.GetMainStreamActivityDescriptor(); IWfActivityDescriptor endActDesp = endActivity.GetMainStreamActivityDescriptor(); if (startActDesp != null && endActDesp != null) { WfCopyMainStreamContext context = new WfCopyMainStreamContext(startActDesp, endActivity.Descriptor, entryTransition, true); FillCopyContext(context.StartActivityDescriptor, endActDesp, context, operationType); resultTransition = context.StartActivityDescriptor.GenerateCopiedActivitiesDescriptors(activityToAppend.Process, activityToAppend.Descriptor, context, operationType); useOriginal = false; } } if (useOriginal) OriginalCreateMainStreamActivities(activityToAppend, startActivity, endActivity, entryTransition, operationType); return resultTransition; }
protected WfAddAndEditActivityExecutorBase(IWfActivity operatorActivity, IWfActivity targetActivity, WfActivityDescriptorCreateParams createParams, WfControlOperationType operationType) : base(operatorActivity, targetActivity, operationType) { createParams.NullCheck("createParams"); this.CreateParams = createParams; }
private string GetAfterExecutionScript(WfControlOperationType operationType) { string script = "top.$HBRootNS.WfProcessControlBase.close()"; switch (operationType) { case WfControlOperationType.Save: script = string.Format("if (parent) parent.location.replace('{0}');", WfClientContext.Current.ReplaceEntryPathByActivityID()); break; case WfControlOperationType.MoveTo: if (WfClientContext.Current.OriginalActivity.Descriptor.Properties.GetValue("ForceCloseFormAfterMoveTo", false) == false) { UserTaskCollection userTasks = UserTaskAdapter.Instance.GetUserTasks(UserTaskIDType.ActivityID, UserTaskFieldDefine.SendToUserID | UserTaskFieldDefine.Status | UserTaskFieldDefine.Url, WfClientContext.Current.CurrentActivity.ID); UserTask task = userTasks.Find(t => t.SendToUserID == DeluxeIdentity.CurrentUser.ID && t.Status == TaskStatus.Ban); if (task != null) { script = string.Format("if (parent) parent.location.replace('{0}');", task.Url); } } break; } return(script); }
/// <summary> /// 历史实现规则。当流程不存在MainStream属性时,采用从当前流程活动中爬出来 /// </summary> /// <param name="activityToAppend"></param> /// <param name="startActivity"></param> /// <param name="endActivity"></param> /// <param name="operationType"></param> private static void OriginalCreateMainStreamActivities(IWfActivity activityToAppend, IWfActivity startActivity, IWfActivity endActivity, IWfTransitionDescriptor entryTransition, WfControlOperationType operationType) { WfCopyMainStreamContext context = new WfCopyMainStreamContext(startActivity.Descriptor, endActivity.Descriptor, entryTransition, false); FillCopyContext(context.StartActivityDescriptor, endActivity.Descriptor, context, operationType); context.StartActivityDescriptor.GenerateCopiedActivitiesDescriptors(activityToAppend.Process, activityToAppend.Descriptor, context, operationType); }
protected WfActivityRelativeExecutorBase(IWfActivity operatorActivity, IWfActivity targetActivity, WfControlOperationType operationType) : base(operatorActivity, operationType) { targetActivity.NullCheck("targetActivity"); TargetActivity = targetActivity; if (OperatorActivity == null) OperatorActivity = targetActivity; }
/// <summary> /// 在指定的活动点之后,添加从startActivity与endActivity之间复制出来的 /// </summary> /// <param name="activityToAppend">复制的活动需要添加到哪一个活动之后</param> /// <param name="startActivity">需要复制的活动的起始点</param> /// <param name="endActivity">需要复制的活动的终止点</param> /// <param name="entryTransition"></param> /// <param name="operationType">操作类型</param> /// <returns>返回的第一个Clone活动的出线</returns> public IWfTransitionDescriptor CopyMainStreamActivities(IWfActivity activityToAppend, IWfActivity startActivity, IWfActivity endActivity, IWfTransitionDescriptor entryTransition, WfControlOperationType operationType) { activityToAppend.NullCheck("activityToAppend"); //沈峥注释,和WfMoveToExecutor中,是否按退回线进行的判断进行匹配 ExceptionHelper.TrueThrow(startActivity.Status == WfActivityStatus.NotRunning, "退件时所指定活动必须是已执行过的活动"); //沈峥重构后的实现 return CreateMainStreamActivities(activityToAppend, startActivity, endActivity, entryTransition, operationType); }
public WfMoveToSelectedResult(WfControlOperationType opType, WfControlNextStep nextStep) { this._OperationType = opType; IWfProcessDescriptor processDesp = WfClientContext.Current.CurrentActivity.Process.Descriptor; this._TargetActivityDescriptor = processDesp.Activities[nextStep.ActivityDescriptor.Key]; if (nextStep.TransitionDescriptor != null) this._FromTransitionDescriptor = processDesp.FindTransitionByKey(nextStep.TransitionDescriptor.Key); this.Assignees.CopyFrom(nextStep.Candidates); }
public WfMoveToSelectedResult(WfControlOperationType opType, WfControlNextStep nextStep) { this._OperationType = opType; IWfProcessDescriptor processDesp = WfClientContext.Current.CurrentActivity.Process.Descriptor; this._TargetActivityDescriptor = processDesp.Activities[nextStep.ActivityDescriptor.Key]; if (nextStep.TransitionDescriptor != null) { this._FromTransitionDescriptor = processDesp.FindTransitionByKey(nextStep.TransitionDescriptor.Key); } this.Assignees.CopyFrom(nextStep.Candidates); }
/// <summary> /// 执行流转或保存操作。 /// </summary> /// <param name="actionName">操作名称</param> /// <param name="action">实际操作</param> private void ExecuteOperation(string actionName, WfControlOperationType operationType, WfExecutorBase executor) { StringBuilder strScript = new StringBuilder(); ExceptionHelper.FalseThrow(WfClientContext.Current.HasProcessChanged == false && WfClientContext.Current.InMoveToMode, Translator.Translate(Define.DefaultCulture, "当前流程的状态已经改变,不能流转")); try { if (executor != null) { WfClientContext.Current.Execute(executor); } HttpContext.Current.Response.Write(ExtScriptHelper.GetRefreshBridgeScript()); strScript.Append(GetAfterExecutionScript(operationType)); ResponsePostBackPlaceHolder(); } catch (System.Exception ex) { ResponsePostBackPlaceHolder(); System.Exception innerEx = ExceptionHelper.GetRealException(ex); if (innerEx is ApplicationInformationException) { WebUtility.ResponseShowClientMessageScriptBlock(innerEx.Message, innerEx.StackTrace, Translator.Translate(Define.DefaultCulture, "流转")); } else { WebUtility.ResponseShowClientErrorScriptBlock(innerEx.Message, innerEx.StackTrace, Translator.Translate(Define.DefaultCulture, "流转")); } } finally { strScript.Insert(0, "if (parent.document.all('wfOperationNotifier')) parent.document.all('wfOperationNotifier').value = '';"); WebUtility.ResponseTimeoutScriptBlock(strScript.ToString(), ExtScriptHelper.DefaultResponseTimeout); Page.Response.End(); } }
/// <summary> /// /// </summary> /// <param name="operatorActivity">操作人所在的流程活动</param> /// <param name="opType"></param> protected WfExecutorBase(IWfActivity operatorActivity, WfControlOperationType opType) { OperatorActivity = operatorActivity; OperationType = opType; WfExecutorActionCollection actions = this._Actions; actions.Add(new WfExecutorAction("BeforeExecute", new Action<WfExecutorDataContext>(this.OnBeforeExecute))); actions.Add(new WfExecutorAction("ModifyWorkflow", new Action<WfExecutorDataContext>(this.CallModifyWorkflow))); actions.Add(new WfExecutorAction("AfterModifyWorkflow", new Action<WfExecutorDataContext>(this.OnAfterModifyWorkflow))); actions.Add(new WfExecutorAction("PrepareApplicationData", new Action<WfExecutorDataContext>(this.OnPrepareApplicationData))); actions.Add(new WfExecutorAction("PrepareUserTaskTitles", new Action<WfExecutorDataContext>(this.OnPrepareUserTaskTitles))); actions.Add(new WfExecutorAction("PrepareMoveToTasks", new Action<WfExecutorDataContext>(this.OnPrepareMoveToTasks))); actions.Add(new WfExecutorAction("PrepareNotifyTasks", new Action<WfExecutorDataContext>(this.OnPrepareNotifyTasks))); actions.Add(new WfExecutorAction("PrepareUserOperationLog", new Action<WfExecutorDataContext>(this.OnPrepareUserOperationLog))); actions.Add(new WfExecutorAction("SaveApplicationData", new Action<WfExecutorDataContext>(this.OnSaveApplicationData))); actions.Add(new WfExecutorAction("SaveUserOperationLog", new Action<WfExecutorDataContext>(this.OnSaveUserOperationLog))); actions.Add(new WfExecutorAction("PersistWorkflow", new Action<WfExecutorDataContext>(this.OnPersistWorkflow))); }
/// <summary> /// /// </summary> /// <param name="operatorActivity">操作人所在的流程活动</param> /// <param name="opType"></param> protected WfExecutorBase(IWfActivity operatorActivity, WfControlOperationType opType) { OperatorActivity = operatorActivity; OperationType = opType; WfExecutorActionCollection actions = this._Actions; actions.Add(new WfExecutorAction("BeforeExecute", new Action <WfExecutorDataContext>(this.OnBeforeExecute))); actions.Add(new WfExecutorAction("ModifyWorkflow", new Action <WfExecutorDataContext>(this.CallModifyWorkflow))); actions.Add(new WfExecutorAction("AfterModifyWorkflow", new Action <WfExecutorDataContext>(this.OnAfterModifyWorkflow))); actions.Add(new WfExecutorAction("PrepareApplicationData", new Action <WfExecutorDataContext>(this.OnPrepareApplicationData))); actions.Add(new WfExecutorAction("PrepareUserTaskTitles", new Action <WfExecutorDataContext>(this.OnPrepareUserTaskTitles))); actions.Add(new WfExecutorAction("PrepareMoveToTasks", new Action <WfExecutorDataContext>(this.OnPrepareMoveToTasks))); actions.Add(new WfExecutorAction("PrepareNotifyTasks", new Action <WfExecutorDataContext>(this.OnPrepareNotifyTasks))); actions.Add(new WfExecutorAction("PrepareUserOperationLog", new Action <WfExecutorDataContext>(this.OnPrepareUserOperationLog))); actions.Add(new WfExecutorAction("SaveApplicationData", new Action <WfExecutorDataContext>(this.OnSaveApplicationData))); actions.Add(new WfExecutorAction("SaveUserOperationLog", new Action <WfExecutorDataContext>(this.OnSaveUserOperationLog))); actions.Add(new WfExecutorAction("PersistWorkflow", new Action <WfExecutorDataContext>(this.OnPersistWorkflow))); }
public WfEditPropertiesExecutorBase(IWfActivity operatorActivity, IWfProcess process, T descriptor, bool syncMSObject, WfControlOperationType operationType) : base(operatorActivity, operationType) { process.NullCheck("process"); descriptor.NullCheck("descriptor"); this._Process = process; this._Descriptor = descriptor; this._SyncMainStreamObject = syncMSObject; descriptor.SyncPropertiesToFields(); }
/// <summary> /// 构造方法 /// </summary> /// <param name="operatorActivity"></param> /// <param name="targetActivity"></param> /// <param name="operationType"></param> protected WfMoveToExecutorBase(IWfActivity operatorActivity, IWfActivity targetActivity, WfControlOperationType operationType) : base(operatorActivity, targetActivity, operationType) { }
protected WfActivityRelativeExecutorBase(IWfActivity operatorActivity, IWfActivity targetActivity, WfControlOperationType operationType) : base(operatorActivity, operationType) { targetActivity.NullCheck("targetActivity"); TargetActivity = targetActivity; if (OperatorActivity == null) { OperatorActivity = targetActivity; } }
/// <summary> /// 执行流转或保存操作。 /// </summary> /// <param name="actionName">操作名称</param> /// <param name="action">实际操作</param> private void ExecuteOperation(string actionName, WfControlOperationType operationType, WfExecutorBase executor) { StringBuilder strScript = new StringBuilder(); ExceptionHelper.FalseThrow(WfClientContext.Current.HasProcessChanged == false && WfClientContext.Current.InMoveToMode, Translator.Translate(Define.DefaultCulture, "当前流程的状态已经改变,不能流转")); try { if (executor != null) WfClientContext.Current.Execute(executor); HttpContext.Current.Response.Write(ExtScriptHelper.GetRefreshBridgeScript()); strScript.Append(GetAfterExecutionScript(operationType)); ResponsePostBackPlaceHolder(); } catch (System.Exception ex) { ResponsePostBackPlaceHolder(); System.Exception innerEx = ExceptionHelper.GetRealException(ex); if (innerEx is ApplicationInformationException) WebUtility.ResponseShowClientMessageScriptBlock(innerEx.Message, innerEx.StackTrace, Translator.Translate(Define.DefaultCulture, "流转")); else WebUtility.ResponseShowClientErrorScriptBlock(innerEx.Message, innerEx.StackTrace, Translator.Translate(Define.DefaultCulture, "流转")); } finally { strScript.Insert(0, "if (parent.document.all('wfOperationNotifier')) parent.document.all('wfOperationNotifier').value = '';"); WebUtility.ResponseTimeoutScriptBlock(strScript.ToString(), ExtScriptHelper.DefaultResponseTimeout); Page.Response.End(); } }
/// <summary> /// 在指定的活动点之后,添加从startActivity与endActivity之间复制出来的 /// </summary> /// <param name="activityToAppend">复制的活动需要添加到哪一个活动之后</param> /// <param name="startActivity">需要复制的活动的起始点</param> /// <param name="endActivity">需要复制的活动的终止点</param> /// <param name="entryTransition"></param> /// <param name="operationType">操作类型</param> /// <returns>返回的第一个Clone活动的出线</returns> public IWfTransitionDescriptor CopyMainStreamActivities(IWfActivity activityToAppend, IWfActivity startActivity, IWfActivity endActivity, IWfTransitionDescriptor entryTransition, WfControlOperationType operationType) { activityToAppend.NullCheck("activityToAppend"); //沈峥注释,和WfMoveToExecutor中,是否按退回线进行的判断进行匹配 ExceptionHelper.TrueThrow(startActivity.Status == WfActivityStatus.NotRunning, "退件时所指定活动必须是已执行过的活动"); //沈峥重构后的实现 return(CreateMainStreamActivities(activityToAppend, startActivity, endActivity, entryTransition, operationType)); }
private static IWfTransitionDescriptor CreateMainStreamActivities(IWfActivity activityToAppend, IWfActivity startActivity, IWfActivity endActivity, IWfTransitionDescriptor entryTransition, WfControlOperationType operationType) { bool useOriginal = true; IWfTransitionDescriptor resultTransition = null; if (activityToAppend.Process.MainStream != null) { IWfActivityDescriptor startActDesp = startActivity.GetMainStreamActivityDescriptor(); IWfActivityDescriptor endActDesp = endActivity.GetMainStreamActivityDescriptor(); if (startActDesp != null && endActDesp != null) { WfCopyMainStreamContext context = new WfCopyMainStreamContext(startActDesp, endActivity.Descriptor, entryTransition, true); FillCopyContext(context.StartActivityDescriptor, endActDesp, context, operationType); resultTransition = context.StartActivityDescriptor.GenerateCopiedActivitiesDescriptors(activityToAppend.Process, activityToAppend.Descriptor, context, operationType); useOriginal = false; } } if (useOriginal) { OriginalCreateMainStreamActivities(activityToAppend, startActivity, endActivity, entryTransition, operationType); } return(resultTransition); }
protected WfEditTransitionPropertiesExecutor(IWfActivity operatorActivity, IWfProcess process, IWfTransitionDescriptor transitionDesp, bool syncMSObject, WfControlOperationType operationType) : base(operatorActivity, process, transitionDesp, syncMSObject, operationType) { }
private IWfActivityDescriptor CreateClonedActivityDescriptor(IWfProcess processInstance, WfCopyMainStreamContext context, WfControlOperationType operationType) { WfActivityDescriptor result = this.TemplateActivityDescriptor.Clone() as WfActivityDescriptor; result.Key = processInstance.Descriptor.FindNotUsedActivityKey(); //2012/12/03 修改克隆时向开始环节转换时需要设置的属性 if (this.TemplateActivityDescriptor.ActivityType == WfActivityType.InitialActivity && operationType == WfControlOperationType.Return) ResetPropertiesByDefinedName(result, "DefaultReturnToInitialActivityTemplate"); //如果模板活动不是主线活动,则使用该活动的关联Key,否则去实例上查找主线活动对应活动的关联Key。 if (this.TemplateActivityDescriptor.IsMainStreamActivity == false) { result.AssociatedActivityKey = this.TemplateActivityDescriptor.GetAssociatedActivity().Key; result.ClonedKey = this.TemplateActivityDescriptor.Key; } else { IWfActivityDescriptor matchActDesp = FindActivityDescriptorByMainStreamKey(processInstance, this.TemplateActivityDescriptor.Key); if (matchActDesp != null) { result.AssociatedActivityKey = matchActDesp.Key; result.ClonedKey = matchActDesp.Key; } } //如果原来活动上没有配置资源,则使用原来活动实例的指派人作为资源 if (result.Resources.Count == 0) result.Resources.CopyFrom(this.TemplateActivityDescriptor.Instance.Assignees.ToResources()); WfActivityBase newActivity = WfActivityBase.CreateActivityInstance(result, processInstance); if (context.IsMainStream) newActivity.MainStreamActivityKey = this.TemplateActivityDescriptor.Key; //沈峥调整,生成资源 if (result.Resources.Count == 0) { newActivity.Candidates.CopyFrom(this.TemplateActivityDescriptor.Instance.Candidates); if (newActivity.Candidates.Count == 0) { IWfActivityDescriptor matchActDesp = FindActivityDescriptorByMainStreamKey(processInstance, this.TemplateActivityDescriptor.Key); if (matchActDesp != null && OguBase.IsNotNullOrEmpty(matchActDesp.Instance.Operator)) newActivity.Candidates.Add(matchActDesp.Instance.Operator); } newActivity.Assignees.CopyFrom(newActivity.Candidates); } else { if (newActivity.Descriptor.Properties.GetValue("AutoGenerateCadidates", true)) { newActivity.GenerateCandidatesFromResources(); newActivity.Assignees.Clear(); newActivity.Assignees.CopyFrom(newActivity.Candidates); } else { newActivity.Candidates.Clear(); newActivity.Assignees.Clear(); //仅复制能够和直接转换为用户的角色 foreach (IUser user in result.Resources.ToUsers()) { newActivity.Candidates.Add(user); newActivity.Assignees.Add(user); } } } processInstance.Descriptor.Activities.Add(result); return result; }
/// <summary> /// 克隆后续的活动并且连线 /// </summary> /// <param name="endActivity"></param> /// <param name="context"></param> /// <param name="operationType"></param> private void GenerateSubActivitiesDescriptors(IWfProcess processInstance, IWfActivityDescriptor endActivity, IWfActivityDescriptor lastActDesp, WfCopyMainStreamContext context, WfControlOperationType operationType) { foreach (WfCopyMainStreamSubActivityNode subNode in this.ToActivities) { IWfActivityDescriptor targetActDesp = null; if (subNode.ActivityNode.NeedCopy) { if (context.ClonedActivities.TryGetValue(subNode.ActivityNode.TemplateActivityDescriptor.Key, out targetActDesp) == false) { targetActDesp = subNode.ActivityNode.CreateClonedActivityDescriptor(processInstance, context, operationType); context.ClonedActivities.Add(subNode.ActivityNode.TemplateActivityDescriptor.Key, targetActDesp); } } else { targetActDesp = subNode.ActivityNode.OriginalActivityDescriptor; //targetActDesp = subNode.ActivityNode.TemplateActivityDescriptor; } //本身是复制点,则必须复制线 if (this.NeedCopy) { WfTransitionDescriptor clonedTransition = (WfTransitionDescriptor)((WfTransitionDescriptor)subNode.FromTransition).Clone(); //沈峥注释,2015-6-25,FindNotUsedTransitionKey应该从实例流程查找 //if (clonedTransition.Key.IsNullOrEmpty()) // clonedTransition.Key = subNode.ActivityNode.TemplateActivityDescriptor.Process.FindNotUsedTransitionKey(); if (clonedTransition.Key.IsNullOrEmpty()) clonedTransition.Key = endActivity.Process.FindNotUsedTransitionKey(); if (this.IsEndActivity) { string targetAssociatedKey = null; //沈峥调整,2015-1-24,目标点非Clone点且是加签点 if (targetActDesp.ClonedKey.IsNullOrEmpty() && targetActDesp.GetAssociatedActivity() != null) targetAssociatedKey = targetActDesp.GetAssociatedActivity().Key; if (lastActDesp != null && targetAssociatedKey != null && lastActDesp.GetAssociatedActivity().Key == targetAssociatedKey) targetActDesp = lastActDesp; } endActivity.ToTransitions.AddTransition(targetActDesp, clonedTransition); } subNode.ActivityNode.GenerateSubActivitiesDescriptors(processInstance, targetActDesp, lastActDesp, context, operationType); } }
/// <summary> /// 复制所有的后续活动(没有连线) /// </summary> /// <param name="context"></param> /// <param name="operationType"></param> internal void CloneRelativeActivities(IWfProcess processInstance, WfCopyMainStreamContext context, WfControlOperationType operationType) { if (this.NeedCopy) { if (context.ClonedActivities.ContainsKey(this.TemplateActivityDescriptor.Key) == false) { IWfActivityDescriptor clonedActDesp = CreateClonedActivityDescriptor(processInstance, context, operationType); context.ClonedActivities.Add(this.TemplateActivityDescriptor.Key, clonedActDesp); this.ToActivities.ForEach(sub => sub.ActivityNode.CloneRelativeActivities(processInstance, context, operationType)); } } }
/// <summary> /// 将MainStreamContext中的活动,复制到某个活动后 /// </summary> /// <param name="processInstance"></param> /// <param name="activityToAppend"></param> /// <param name="context"></param> /// <param name="operationType"></param> /// <returns>返回的第一个Clone活动的出线</returns> public IWfTransitionDescriptor GenerateCopiedActivitiesDescriptors(IWfProcess processInstance, IWfActivityDescriptor activityToAppend, WfCopyMainStreamContext context, WfControlOperationType operationType) { IWfTransitionDescriptor resultTransition = null; CloneRelativeActivities(activityToAppend.ProcessInstance, context, operationType); IWfActivityDescriptor clonedActDesp = null; if (context.ClonedActivities.TryGetValue(this._TemplateActivityDescriptor.Key, out clonedActDesp)) { //如果本活动是模板生成的动态活动,且退件的目标不是模板,则删除后续的动态活动 if (activityToAppend.GeneratedByTemplate && clonedActDesp.GeneratedByTemplate == false) { IWfTransitionDescriptor templateTransition = activityToAppend.ToTransitions.Find(t => t.GeneratedByTemplate); while (templateTransition != null) { IWfActivityDescriptor actDesp = templateTransition.ToActivity; //如果线的目标活动是动态活动,则删除,否则忽略 if (actDesp.GeneratedByTemplate) actDesp.Instance.Delete(); templateTransition = templateTransition.ToActivity.ToTransitions.Find(t => t.GeneratedByTemplate); } } IWfTransitionDescriptor lastTransition = context.EntryTransition; if (lastTransition == null) lastTransition = activityToAppend.ToTransitions.GetAllCanTransitForwardTransitions().FindDefaultSelectTransition(); IWfActivityDescriptor lastActDesp = null; if (lastTransition != null) lastActDesp = lastTransition.ToActivity; string entryTransitionKey = (lastTransition != null) ? lastTransition.Key : string.Empty; //将第一个克隆的活动与原流程的某一个活动关联。 //保留退回线 IList<IWfTransitionDescriptor> originalBackwardTransitions = activityToAppend.ToTransitions.FindAll(t => t.IsBackward); activityToAppend.ToTransitions.Clear(); foreach (WfTransitionDescriptor t in originalBackwardTransitions) { WfTransitionDescriptor newBackwardTransition = (WfTransitionDescriptor)t.Clone(); newBackwardTransition.Key = activityToAppend.Process.FindNotUsedTransitionKey(); activityToAppend.ToTransitions.AddTransition(t.ToActivity, newBackwardTransition); } //activityToAppend.ToTransitions.CopyFrom(originalBackwardTransitions); IWfTransitionDescriptor newTransition = JoinOriginalActivityToClonedActivity(activityToAppend, clonedActDesp, lastTransition); resultTransition = newTransition; //将自动流转设置为False if (clonedActDesp.Properties.GetValue("AutoMoveTo", false)) clonedActDesp.Properties.TrySetValue("AutoMoveTo", false); GenerateSubActivitiesDescriptors(processInstance, clonedActDesp, lastActDesp, context, operationType); } return resultTransition; }
protected WfEditActivityPropertiesExecutor(IWfActivity operatorActivity, IWfProcess process, IWfActivityDescriptor actDesp, bool syncMSObject, WfControlOperationType operationType) : base(operatorActivity, process, actDesp, syncMSObject, operationType) { }
/// <summary> /// 将MainStreamContext中的活动,复制到某个活动后 /// </summary> /// <param name="processInstance"></param> /// <param name="activityToAppend"></param> /// <param name="context"></param> /// <param name="operationType"></param> /// <returns>返回的第一个Clone活动的出线</returns> public IWfTransitionDescriptor GenerateCopiedActivitiesDescriptors(IWfProcess processInstance, IWfActivityDescriptor activityToAppend, WfCopyMainStreamContext context, WfControlOperationType operationType) { IWfTransitionDescriptor resultTransition = null; CloneRelativeActivities(activityToAppend.ProcessInstance, context, operationType); IWfActivityDescriptor clonedActDesp = null; if (context.ClonedActivities.TryGetValue(this._TemplateActivityDescriptor.Key, out clonedActDesp)) { //如果本活动是模板生成的动态活动,且退件的目标不是模板,则删除后续的动态活动 if (activityToAppend.GeneratedByTemplate && clonedActDesp.GeneratedByTemplate == false) { IWfTransitionDescriptor templateTransition = activityToAppend.ToTransitions.Find(t => t.GeneratedByTemplate); while (templateTransition != null) { IWfActivityDescriptor actDesp = templateTransition.ToActivity; //如果线的目标活动是动态活动,则删除,否则忽略 if (actDesp.GeneratedByTemplate) { actDesp.Instance.Delete(); } templateTransition = templateTransition.ToActivity.ToTransitions.Find(t => t.GeneratedByTemplate); } } IWfTransitionDescriptor lastTransition = context.EntryTransition; if (lastTransition == null) { lastTransition = activityToAppend.ToTransitions.GetAllCanTransitForwardTransitions().FindDefaultSelectTransition(); } IWfActivityDescriptor lastActDesp = null; if (lastTransition != null) { lastActDesp = lastTransition.ToActivity; } string entryTransitionKey = (lastTransition != null) ? lastTransition.Key : string.Empty; //将第一个克隆的活动与原流程的某一个活动关联。 //保留退回线 IList <IWfTransitionDescriptor> originalBackwardTransitions = activityToAppend.ToTransitions.FindAll(t => t.IsBackward); activityToAppend.ToTransitions.Clear(); foreach (WfTransitionDescriptor t in originalBackwardTransitions) { WfTransitionDescriptor newBackwardTransition = (WfTransitionDescriptor)t.Clone(); newBackwardTransition.Key = activityToAppend.Process.FindNotUsedTransitionKey(); activityToAppend.ToTransitions.AddTransition(t.ToActivity, newBackwardTransition); } //activityToAppend.ToTransitions.CopyFrom(originalBackwardTransitions); IWfTransitionDescriptor newTransition = JoinOriginalActivityToClonedActivity(activityToAppend, clonedActDesp, lastTransition); resultTransition = newTransition; //将自动流转设置为False if (clonedActDesp.Properties.GetValue("AutoMoveTo", false)) { clonedActDesp.Properties.TrySetValue("AutoMoveTo", false); } GenerateSubActivitiesDescriptors(processInstance, clonedActDesp, lastActDesp, context, operationType); } return(resultTransition); }
/// <summary> /// 在当前活动实例后,添加一些被克隆的活动。 /// </summary> /// <param name="startActivity">需要复制的活动的起始点</param> /// <param name="entryTransition"></param> /// <param name="operationType"></param> /// <returns>返回的第一个Clone活动的出线</returns> public IWfTransitionDescriptor CopyMainStreamActivities(IWfActivity startActivity, IWfTransitionDescriptor entryTransition, WfControlOperationType operationType) { return(CopyMainStreamActivities(this, startActivity, this, entryTransition, operationType)); }
/// <summary> /// 在当前活动实例后,添加一些被克隆的活动。 /// </summary> /// <param name="startActivity">需要复制的活动的起始点</param> /// <param name="entryTransition"></param> /// <param name="operationType"></param> /// <returns>返回的第一个Clone活动的出线</returns> public IWfTransitionDescriptor CopyMainStreamActivities(IWfActivity startActivity, IWfTransitionDescriptor entryTransition, WfControlOperationType operationType) { return CopyMainStreamActivities(this, startActivity, this, entryTransition, operationType); }
/// <summary> /// 克隆后续的活动并且连线 /// </summary> /// <param name="endActivity"></param> /// <param name="context"></param> /// <param name="operationType"></param> private void GenerateSubActivitiesDescriptors(IWfProcess processInstance, IWfActivityDescriptor endActivity, IWfActivityDescriptor lastActDesp, WfCopyMainStreamContext context, WfControlOperationType operationType) { foreach (WfCopyMainStreamSubActivityNode subNode in this.ToActivities) { IWfActivityDescriptor targetActDesp = null; if (subNode.ActivityNode.NeedCopy) { if (context.ClonedActivities.TryGetValue(subNode.ActivityNode.TemplateActivityDescriptor.Key, out targetActDesp) == false) { targetActDesp = subNode.ActivityNode.CreateClonedActivityDescriptor(processInstance, context, operationType); context.ClonedActivities.Add(subNode.ActivityNode.TemplateActivityDescriptor.Key, targetActDesp); } } else { targetActDesp = subNode.ActivityNode.OriginalActivityDescriptor; //targetActDesp = subNode.ActivityNode.TemplateActivityDescriptor; } //本身是复制点,则必须复制线 if (this.NeedCopy) { WfTransitionDescriptor clonedTransition = (WfTransitionDescriptor)((WfTransitionDescriptor)subNode.FromTransition).Clone(); //沈峥注释,2015-6-25,FindNotUsedTransitionKey应该从实例流程查找 //if (clonedTransition.Key.IsNullOrEmpty()) // clonedTransition.Key = subNode.ActivityNode.TemplateActivityDescriptor.Process.FindNotUsedTransitionKey(); if (clonedTransition.Key.IsNullOrEmpty()) { clonedTransition.Key = endActivity.Process.FindNotUsedTransitionKey(); } if (this.IsEndActivity) { string targetAssociatedKey = null; //沈峥调整,2015-1-24,目标点非Clone点且是加签点 if (targetActDesp.ClonedKey.IsNullOrEmpty() && targetActDesp.GetAssociatedActivity() != null) { targetAssociatedKey = targetActDesp.GetAssociatedActivity().Key; } if (lastActDesp != null && targetAssociatedKey != null && lastActDesp.GetAssociatedActivity().Key == targetAssociatedKey) { targetActDesp = lastActDesp; } } endActivity.ToTransitions.AddTransition(targetActDesp, clonedTransition); } subNode.ActivityNode.GenerateSubActivitiesDescriptors(processInstance, targetActDesp, lastActDesp, context, operationType); } }
private string GetAfterExecutionScript(WfControlOperationType operationType) { string script = "top.$HBRootNS.WfProcessControlBase.close()"; switch (operationType) { case WfControlOperationType.Save: script = string.Format("if (parent) parent.location.replace('{0}');", WfClientContext.Current.ReplaceEntryPathByActivityID() ); break; case WfControlOperationType.MoveTo: if (WfClientContext.Current.OriginalActivity.Descriptor.Properties.GetValue("ForceCloseFormAfterMoveTo", false) == false) { UserTaskCollection userTasks = UserTaskAdapter.Instance.GetUserTasks(UserTaskIDType.ActivityID, UserTaskFieldDefine.SendToUserID | UserTaskFieldDefine.Status | UserTaskFieldDefine.Url, WfClientContext.Current.CurrentActivity.ID); UserTask task = userTasks.Find(t => t.SendToUserID == DeluxeIdentity.CurrentUser.ID && t.Status == TaskStatus.Ban); if (task != null) script = string.Format("if (parent) parent.location.replace('{0}');", task.Url); } break; } return script; }
private IWfActivityDescriptor CreateClonedActivityDescriptor(IWfProcess processInstance, WfCopyMainStreamContext context, WfControlOperationType operationType) { WfActivityDescriptor result = this.TemplateActivityDescriptor.Clone() as WfActivityDescriptor; result.Key = processInstance.Descriptor.FindNotUsedActivityKey(); //2012/12/03 修改克隆时向开始环节转换时需要设置的属性 if (this.TemplateActivityDescriptor.ActivityType == WfActivityType.InitialActivity && operationType == WfControlOperationType.Return) { ResetPropertiesByDefinedName(result, "DefaultReturnToInitialActivityTemplate"); } //如果模板活动不是主线活动,则使用该活动的关联Key,否则去实例上查找主线活动对应活动的关联Key。 if (this.TemplateActivityDescriptor.IsMainStreamActivity == false) { result.AssociatedActivityKey = this.TemplateActivityDescriptor.GetAssociatedActivity().Key; result.ClonedKey = this.TemplateActivityDescriptor.Key; } else { IWfActivityDescriptor matchActDesp = FindActivityDescriptorByMainStreamKey(processInstance, this.TemplateActivityDescriptor.Key); if (matchActDesp != null) { result.AssociatedActivityKey = matchActDesp.Key; result.ClonedKey = matchActDesp.Key; } } //如果原来活动上没有配置资源,则使用原来活动实例的指派人作为资源 if (result.Resources.Count == 0) { result.Resources.CopyFrom(this.TemplateActivityDescriptor.Instance.Assignees.ToResources()); } WfActivityBase newActivity = WfActivityBase.CreateActivityInstance(result, processInstance); if (context.IsMainStream) { newActivity.MainStreamActivityKey = this.TemplateActivityDescriptor.Key; } //沈峥调整,生成资源 if (result.Resources.Count == 0) { newActivity.Candidates.CopyFrom(this.TemplateActivityDescriptor.Instance.Candidates); if (newActivity.Candidates.Count == 0) { IWfActivityDescriptor matchActDesp = FindActivityDescriptorByMainStreamKey(processInstance, this.TemplateActivityDescriptor.Key); if (matchActDesp != null && OguBase.IsNotNullOrEmpty(matchActDesp.Instance.Operator)) { newActivity.Candidates.Add(matchActDesp.Instance.Operator); } } newActivity.Assignees.CopyFrom(newActivity.Candidates); } else { if (newActivity.Descriptor.Properties.GetValue("AutoGenerateCadidates", true)) { newActivity.GenerateCandidatesFromResources(); newActivity.Assignees.Clear(); newActivity.Assignees.CopyFrom(newActivity.Candidates); } else { newActivity.Candidates.Clear(); newActivity.Assignees.Clear(); //仅复制能够和直接转换为用户的角色 foreach (IUser user in result.Resources.ToUsers()) { newActivity.Candidates.Add(user); newActivity.Assignees.Add(user); } } } processInstance.Descriptor.Activities.Add(result); return(result); }
private static void FillCopyContext(WfCopyMainStreamActivityNode currentActivity, IWfActivityDescriptor endActivity, WfCopyMainStreamContext context, WfControlOperationType operationType) { foreach (IWfTransitionDescriptor transition in currentActivity.TemplateActivityDescriptor.ToTransitions.GetNotDynamicActivityTransitions()) { if (context.IsElapsedTransition(transition) == false) { IWfActivityDescriptor nextActivityDesp = transition.ToActivity; if (operationType == WfControlOperationType.Return) nextActivityDesp = FindNotReturnSkippedActivity(transition.ToActivity); bool nextIsEndActivity = nextActivityDesp.Key == endActivity.Key; IWfActivityDescriptor originalActDesp = nextActivityDesp; if (context.IsMainStream) { originalActDesp = context.EndActivityDescriptor.FindSubsequentActivity((t, actDesp) => t.IsBackward == false && actDesp.Instance.MainStreamActivityKey == nextActivityDesp.Key); } WfCopyMainStreamActivityNode toActivity = new WfCopyMainStreamActivityNode( nextActivityDesp, originalActDesp, IsSubsequentActivity(nextActivityDesp, endActivity) == false, nextIsEndActivity); currentActivity.ToActivities.Add(new WfCopyMainStreamSubActivityNode(transition, toActivity)); context.AddElapsedTransition(transition); if (currentActivity.TemplateActivityDescriptor.Key != endActivity.Key) FillCopyContext(toActivity, endActivity, context, operationType); } } }
public WfExecutorDataContext(WfExecutorBase executor, WfControlOperationType opType) { this._Executor = executor; this._OperationType = opType; }
private static void FillCopyContext(WfCopyMainStreamActivityNode currentActivity, IWfActivityDescriptor endActivity, WfCopyMainStreamContext context, WfControlOperationType operationType) { foreach (IWfTransitionDescriptor transition in currentActivity.TemplateActivityDescriptor.ToTransitions.GetNotDynamicActivityTransitions()) { if (context.IsElapsedTransition(transition) == false) { IWfActivityDescriptor nextActivityDesp = transition.ToActivity; if (operationType == WfControlOperationType.Return) { nextActivityDesp = FindNotReturnSkippedActivity(transition.ToActivity); } bool nextIsEndActivity = nextActivityDesp.Key == endActivity.Key; IWfActivityDescriptor originalActDesp = nextActivityDesp; if (context.IsMainStream) { originalActDesp = context.EndActivityDescriptor.FindSubsequentActivity((t, actDesp) => t.IsBackward == false && actDesp.Instance.MainStreamActivityKey == nextActivityDesp.Key); } WfCopyMainStreamActivityNode toActivity = new WfCopyMainStreamActivityNode( nextActivityDesp, originalActDesp, IsSubsequentActivity(nextActivityDesp, endActivity) == false, nextIsEndActivity); currentActivity.ToActivities.Add(new WfCopyMainStreamSubActivityNode(transition, toActivity)); context.AddElapsedTransition(transition); if (currentActivity.TemplateActivityDescriptor.Key != endActivity.Key) { FillCopyContext(toActivity, endActivity, context, operationType); } } } }