///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// public MainForm() { InitializeComponent(); #region UI define GenerateButtons(); GenerateAcctions(); #endregion #region Bankomats Init currentAccountCulture = CultureInfo.CurrentCulture; #endregion #region IniT Workflow workflowRuntime = new WorkflowRuntime(); ExternalDataExchangeService des = new ExternalDataExchangeService(); workflowRuntime.AddService(des); des.AddService(this); workflowRuntime.StartRuntime(); workflowRuntime.WorkflowCompleted += OnWorkflowCompleted; workflowRuntime.WorkflowTerminated += new EventHandler<WorkflowTerminatedEventArgs>(workflowRuntime_WorkflowTerminated); Type type = typeof(BankomatWorkflowLibrary.BankomatsWorkflow); workflowInstance = workflowRuntime.CreateWorkflow(type); workflowInstance.Start(); #endregion }
internal WorkflowCompletedEventArgs(WorkflowInstance instance, Activity workflowDefinition) : base(instance) { this._outputParameters = new Dictionary<String, Object>(); this._originalWorkflowDefinition = workflowDefinition; this._workflowDefinition = null; }
public void WorkflowResume(Mercury.Server.Application application, Int64 forWorkflowId, String assemblyUrl, String workflowClassName, Guid workflowInstanceId) { workflowId = forWorkflowId; assemblyReferencePath = assemblyUrl.Substring(0, assemblyUrl.LastIndexOf('\\') + 1); assemblyReferenceName = assemblyUrl.Replace(assemblyReferencePath, ""); AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); if (!workflowRuntime.IsStarted) { workflowRuntime.StartRuntime(); } workflowInstance = workflowRuntime.GetWorkflow(workflowInstanceId); workflowResponse.WorkflowInstanceId = workflowInstance.InstanceId; workflowInstance.Resume(); return; }
public PressGui() { InitializeComponent(); _workflowRuntime = new WorkflowRuntime(); _instance = _workflowRuntime.CreateWorkflow(typeof(PressFlow)); _flow = _instance.GetWorkflowDefinition() as PressFlow; InitFlow(); InitUI(); RunUI(); }
public WorkflowInstance GetWorkflowInstance(bool canCreateInstance) { if (this.workflowInstance == null) { lock (thisLock) { if (shouldCreateNew) { if (canCreateInstance) { this.workflowInstance = this.workflowDefinition.CreateWorkflow(this.InstanceId); shouldCreateNew = false; if (DiagnosticUtility.ShouldTraceInformation) { string traceText = SR.GetString(SR.TraceCodeWorkflowDurableInstanceActivated, InstanceId); TraceUtility.TraceEvent(TraceEventType.Information, TraceCode.WorkflowDurableInstanceActivated, traceText, new StringTraceRecord("DurableInstanceDetail", traceText), this, null); } using (new WorkflowDispatchContext(true, true)) { this.workflowInstance.Start(); } } else { //Make sure we clean up this InstanceContext; DurableErrorHandler.CleanUpInstanceContextAtOperationCompletion(); //Inform InstanceLifeTimeManager to clean up record for InstanceId; if (this.instanceContextProvider.InstanceLifeTimeManager != null) { this.instanceContextProvider.InstanceLifeTimeManager.CleanUp(this.InstanceId); } throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new FaultException(new DurableDispatcherAddressingFault())); } } else { this.workflowInstance = this.workflowDefinition.WorkflowRuntime.GetWorkflow(InstanceId); if (DiagnosticUtility.ShouldTraceInformation) { string traceText = SR.GetString(SR.TraceCodeWorkflowDurableInstanceLoaded, InstanceId); TraceUtility.TraceEvent(TraceEventType.Information, TraceCode.WorkflowDurableInstanceLoaded, traceText, new StringTraceRecord("DurableInstanceDetail", traceText), this, null); } } } } return workflowInstance; }
private void submitButton_Click(object sender, EventArgs e) { // Start the workflow. Dictionary<string, object> properties = new Dictionary<string, object>(); properties.Add("ReportAmount", Int32.Parse(this.amount.Text)); this.workflowInstance = workflowRuntime.CreateWorkflow(typeof(Fwk.SequentialWorkflow.ExpenseReportWorkflow), properties); this.workflowInstance.Start(); }
public static void HandlePublishUnpublishWorkflows(IData selectedData, string cultureName, DateTime? publishDate, DateTime? unpublishDate, ref WorkflowInstance publishWorkflowInstance, ref WorkflowInstance unpublishWorkflowInstance) { var key = selectedData.GetUniqueKey().ToString(); var existingPublishSchedule = PublishScheduleHelper.GetPublishSchedule(selectedData.DataSourceId.InterfaceType, key, cultureName); if (existingPublishSchedule != null) { WorkflowFacade.AbortWorkflow(existingPublishSchedule.WorkflowInstanceId); DataFacade.Delete(existingPublishSchedule); } if (publishDate != null) { publishWorkflowInstance = WorkflowFacade.CreateNewWorkflow( typeof(DataPublishSchedulerWorkflow), new Dictionary<string, object> { { "Date", publishDate }, { "DataType", selectedData.DataSourceId.InterfaceType.FullName }, { "DataId", selectedData.GetUniqueKey().ToString() }, { "LocaleName", cultureName } } ); PublishScheduleHelper.CreatePublishSchedule(selectedData.DataSourceId.InterfaceType, selectedData.GetUniqueKey().ToString(), cultureName, publishDate.Value, publishWorkflowInstance); } var existingUnpublishSchedule = PublishScheduleHelper.GetUnpublishSchedule(selectedData.DataSourceId.InterfaceType, key, cultureName); if (existingUnpublishSchedule != null) { WorkflowFacade.AbortWorkflow(existingUnpublishSchedule.WorkflowInstanceId); DataFacade.Delete(existingUnpublishSchedule); } if (unpublishDate != null) { unpublishWorkflowInstance = WorkflowFacade.CreateNewWorkflow( typeof(DataUnpublishSchedulerWorkflow), new Dictionary<string, object> { { "Date", unpublishDate }, { "DataType", selectedData.DataSourceId.InterfaceType.FullName }, { "DataId", key }, { "LocaleName", cultureName } } ); PublishScheduleHelper.CreateUnpublishSchedule(selectedData.DataSourceId.InterfaceType, key, cultureName, unpublishDate.Value, unpublishWorkflowInstance); } }
/// <exclude /> public static void CreateUnpublishSchedule(Type dataType, string id, string cultureName, DateTime date, WorkflowInstance workflow) { var unpublishSchedule = DataFacade.BuildNew<IUnpublishSchedule>(); unpublishSchedule.Id = Guid.NewGuid(); unpublishSchedule.DataTypeId = dataType.GetImmutableTypeId(); unpublishSchedule.DataId = id; unpublishSchedule.UnpublishDate = date; unpublishSchedule.WorkflowInstanceId = workflow.InstanceId; unpublishSchedule.LocaleCultureName = DataLocalizationFacade.IsLocalized(dataType) ? cultureName : ""; DataFacade.AddNew(unpublishSchedule); }
public StateMachineWorkflowInstance(WorkflowRuntime runtime, Guid instanceId) { if (runtime == null) throw new ArgumentNullException("runtime"); if (instanceId == Guid.Empty) throw new ArgumentNullException("instanceId"); _runtime = runtime; _instanceId = instanceId; _workflowInstance = runtime.GetWorkflow(instanceId); _stateMachineWorkflow = _workflowInstance.GetWorkflowDefinition() as StateMachineWorkflowActivity; if (_stateMachineWorkflow == null) throw new ArgumentException(SR.GetStateMachineWorkflowRequired(), "instanceId"); }
private void btnSave_Click(object sender, EventArgs e) { //Creamos una instancia del workflow Type type = typeof(IntegrationSample.wfIntegrationAndRouting); workflowInstance = workflowRuntime.CreateWorkflow(type); workflowInstance.Start(); //Creamos un objeto para pasar los parametros necesarios en la //llamada al evento WorkflowInitEventArgs eventArgs = new WorkflowInitEventArgs(workflowInstance.InstanceId, txtUser.Text, txtTE.Text, cmbType.Text, txtObs.Text); //Llamada al evento que comunica la aplicacion con el workflow if(WorkflowInitialization != null) WorkflowInitialization(null, eventArgs); }
public static void HandlePublishUnpublishWorkflows(IPage selectedPage, string cultureName, DateTime? publishDate, DateTime? unpublishDate, ref WorkflowInstance publishWorkflowInstance, ref WorkflowInstance unpublishWorkflowInstance) { var existingPublishSchedule = PublishScheduleHelper.GetPublishSchedule(typeof(IPage), selectedPage.Id.ToString(), cultureName); if (existingPublishSchedule != null) { WorkflowFacade.AbortWorkflow(existingPublishSchedule.WorkflowInstanceId); DataFacade.Delete(existingPublishSchedule); } if (publishDate != null) { publishWorkflowInstance = WorkflowFacade.CreateNewWorkflow( typeof(PagePublishSchedulerWorkflow), new Dictionary<string, object> { { "Date", publishDate }, { "PageId", selectedPage.Id }, { "LocaleName", cultureName } }); PublishScheduleHelper.CreatePublishSchedule(typeof(IPage), selectedPage.Id.ToString(), cultureName, publishDate.Value, publishWorkflowInstance); } var existingUnpublishSchedule = PublishScheduleHelper.GetUnpublishSchedule(typeof(IPage), selectedPage.Id.ToString(), cultureName); if (existingUnpublishSchedule != null) { WorkflowFacade.AbortWorkflow(existingUnpublishSchedule.WorkflowInstanceId); DataFacade.Delete(existingUnpublishSchedule); } if (unpublishDate != null) { unpublishWorkflowInstance = WorkflowFacade.CreateNewWorkflow( typeof(PageUnpublishSchedulerWorkflow), new Dictionary<string, object> { { "Date", unpublishDate }, { "PageId", selectedPage.Id }, { "LocaleName", cultureName } }); PublishScheduleHelper.CreateUnpublishSchedule(typeof(IPage), selectedPage.Id.ToString(), cultureName, unpublishDate.Value, unpublishWorkflowInstance); } }
public StateMachineWorkflowInstance(WorkflowRuntime runtime, Guid instanceId) { if (runtime == null) { throw new ArgumentNullException("runtime"); } if (instanceId == Guid.Empty) { throw new ArgumentNullException("instanceId"); } this._runtime = runtime; this._instanceId = instanceId; this._workflowInstance = runtime.GetWorkflow(instanceId); this._stateMachineWorkflow = this._workflowInstance.GetWorkflowDefinition() as StateMachineWorkflowActivity; if (this._stateMachineWorkflow == null) { throw new ArgumentException(SR.GetStateMachineWorkflowRequired(), "instanceId"); } }
static void Main() { using (WorkflowRuntime workflowRuntime = new WorkflowRuntime()) { ExternalDataExchangeService dataExchangeService = new ExternalDataExchangeService(); workflowRuntime.AddService(dataExchangeService); dataExchangeService.AddService(taskService); workflowRuntime.StartRuntime(); workflowRuntime.WorkflowCompleted += OnWorkflowCompleted; workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e) { Console.WriteLine(e.Exception.Message); waitHandle.Set(); }; instance = workflowRuntime.CreateWorkflow(typeof(CorrelatedLocalServiceWorkflow)); instance.Start(); waitHandle.WaitOne(); workflowRuntime.StopRuntime(); } }
internal WorkflowTerminatedEventArgs(WorkflowInstance instance, String error) : base(instance) { this.exception = new WorkflowTerminatedException(error); }
//Back - off logic for conflicting workflow load across workflow runtime boundaries. static void SafeEnqueueItem(WorkflowInstance instance, EventQueueName key, MethodMessage message) { while (true) //When Execution times out ASP.NET going to forcefully plung this request. { try { instance.EnqueueItem(key, message, null, null); return; } catch (WorkflowOwnershipException) { WorkflowActivityTrace.Activity.TraceEvent(TraceEventType.Warning, 0, String.Format(System.Globalization.CultureInfo.InvariantCulture, "Workflow Web Host Encountered Workflow Instance Ownership conflict for instanceid {0}.", instance.InstanceId)); //Back-off for 1/2 sec. Should we make this configurable? System.Threading.Thread.Sleep(500); continue; } } }
internal WorkflowEventArgs (WorkflowInstance workflow_instance) { this.workflow_instance = workflow_instance; }
internal WorkflowTerminatedEventArgs (WorkflowInstance workflow_instance, Exception exception) : base (workflow_instance) { this.exception = exception; }
internal WorkflowSuspendedEventArgs(WorkflowInstance instance, String error) : base(instance) { this._error = error; }
internal WorkflowTerminatedEventArgs(WorkflowInstance instance, string error) : base(instance) { this.exception = new WorkflowTerminatedException(error); }
internal WorkflowCompletedEventArgs(WorkflowInstance instance, Activity workflowDefinition) : base(instance) { this._outputParameters = new Dictionary <string, object>(); this._originalWorkflowDefinition = workflowDefinition; this._workflowDefinition = null; }
/// <summary> /// 激发事件到一下状态,并获取状态代码 /// </summary> /// <param name="WfRuntime"></param> /// <param name="instance"></param> /// <param name="CurrentStateName"></param> /// <param name="xml"></param> /// <returns></returns> public static string GetNextStateByEvent(WorkflowRuntime WfRuntime, WorkflowInstance instance, string CurrentStateName, string xml) { try { if (!WfRuntime.IsStarted) { WfRuntime.StartRuntime(); } WfRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) { instance = null; }; StateMachineWorkflowInstance workflowinstance = new StateMachineWorkflowInstance(WfRuntime, instance.InstanceId); ManualWorkflowSchedulerService scheduleService = WfRuntime.GetService(typeof(ManualWorkflowSchedulerService)) as ManualWorkflowSchedulerService; scheduleService.RunWorkflow(workflowinstance.InstanceId); workflowinstance.SetState(CurrentStateName); FlowDataType.FlowData FlowData = new FlowDataType.FlowData(); FlowData.xml = xml; scheduleService.RunWorkflow(instance.InstanceId); WfRuntime.GetService<FlowEvent>().OnDoFlow(instance.InstanceId, FlowData);//激发流程引擎流转到下一状态 scheduleService.RunWorkflow(instance.InstanceId); //while (true) //{ // string stateName = workflowinstance.CurrentStateName; // if (stateName != null && stateName.ToUpper().IndexOf("START") == -1) // { // break; // } //} //System.Threading.Thread.Sleep(1000); if (instance == null) { return "EndFlow"; } StateMachineWorkflowInstance workflowinstance1 = new StateMachineWorkflowInstance(WfRuntime, instance.InstanceId); return workflowinstance1.CurrentStateName; //return GetNextState(WfRuntime, instance, CurrentStateName); } catch (Exception ex) { LogHelper.WriteLog("GetNextStateByEvent异常信息 :" + ex.ToString()); throw new Exception(ex.Message); } }
/// <summary> /// 克隆一个实例 /// </summary> /// <param name="WfRuntimeClone"></param> /// <param name="instanceClone"></param> /// <param name="WfRuntime"></param> /// <returns></returns> public static WorkflowInstance CloneWorkflowInstance(WorkflowRuntime WfRuntimeClone, WorkflowInstance instanceClone, WorkflowRuntime WfRuntime) { try { if (!WfRuntimeClone.IsStarted) { WfRuntimeClone.StartRuntime(); } StateMachineWorkflowInstance workflowinstance = new StateMachineWorkflowInstance(WfRuntimeClone, instanceClone.InstanceId); System.Workflow.Activities.StateMachineWorkflowActivity smworkflow = new StateMachineWorkflowActivity(); smworkflow = workflowinstance.StateMachineWorkflow; RuleDefinitions ruleDefinitions = smworkflow.GetValue(RuleDefinitions.RuleDefinitionsProperty) as RuleDefinitions; WorkflowMarkupSerializer markupSerializer = new WorkflowMarkupSerializer(); StringBuilder xoml = new StringBuilder(); StringBuilder rule = new StringBuilder(); XmlWriter xmlWriter = XmlWriter.Create(xoml); XmlWriter ruleWriter = XmlWriter.Create(rule); markupSerializer.Serialize(xmlWriter, smworkflow); if (ruleDefinitions != null) markupSerializer.Serialize(ruleWriter, ruleDefinitions); xmlWriter.Close(); ruleWriter.Close(); StringReader readxoml = new StringReader(xoml.ToString()); XmlReader readerxoml = XmlReader.Create(readxoml); WorkflowInstance instance; if (ruleDefinitions == null) instance = WfRuntime.CreateWorkflow(readerxoml); else { StringReader readrule = new StringReader(rule.ToString()); XmlReader readerrule = XmlReader.Create(readrule); instance = WfRuntime.CreateWorkflow(readerxoml, readerrule, null); } instance.Start(); return instance; } catch (Exception ex) { LogHelper.WriteLog("CloneWorkflowInstance异常信息 :" + ex.ToString()); throw new Exception(ex.Message); } }
/// <summary> /// 通过持久化服务查询下一处理人 /// </summary> /// <param name="WfRuntimeClone">持久化运行时</param> /// <param name="instanceClone">持久化实例</param> /// <param name="xml">条件XML</param> /// <param name="CurrentStateName">当前状态代码</param> /// <param name="DataResult">操作结果</param> public void GetUserByInstance(WorkflowRuntime WfRuntimeClone, WorkflowInstance instanceClone, string xml, string CurrentStateName, string UserID, string PostID, ref DataResult DataResult) { if (!WfRuntimeClone.IsStarted) { WfRuntimeClone.StartRuntime(); } WorkflowRuntime WfRuntime = null; WorkflowInstance Instance = null; try { WfRuntime = SMTWorkFlowManage.CreateWorkFlowRuntime(false); Instance = SMTWorkFlowManage.CloneWorkflowInstance(WfRuntimeClone, instanceClone, WfRuntime); string strNextState = SMTWorkFlowManage.GetNextStateByEvent(WfRuntime, Instance, CurrentStateName, xml); bool isHigher = false; List<UserInfo> AppUserInfo = GetUserByStateCode(strNextState, UserID, PostID, ref isHigher); #region 打印审核人 string names = "=======打印审核人D(strNextState" + strNextState + ";UserID=" + UserID + ";PostID=" + PostID + ";isHigher=" + isHigher.ToString() + ")=======\r\n"; foreach (var user in AppUserInfo) { names += "CompanyID:" + user.CompanyID + "\r\n"; names += "DepartmentID:" + user.DepartmentID + "\r\n"; names += "PostID:" + user.PostID + "\r\n"; names += "UserID:" + user.UserID + "\r\n"; names += "UserName:"******"\r\n"; } #endregion if (AppUserInfo == null || AppUserInfo.Count == 0) { DataResult.Err = "没有找到审核人"; DataResult.FlowResult = FlowResult.FAIL; } else if (AppUserInfo.Count > 1) //处理角色对应多个用户,返回用户集给提交人,选择一个处理人 { DataResult.FlowResult = FlowResult.MULTIUSER; } DataResult.UserInfo = AppUserInfo; } catch (Exception ex) { LogHelper.WriteLog("GetUserByInstance异常信息 :" + ex.ToString()); throw new Exception(ex.Message); } finally { Instance = null; SMTWorkFlowManage.ColseWorkFlowRuntime(WfRuntime); } }
/// <summary> /// 获取工作流状态 /// </summary> /// <param name="workflowRuntime">工作流运行时</param> /// <param name="instance">工作流实例</param> /// <returns></returns> public static string GetState(WorkflowRuntime workflowRuntime, WorkflowInstance instance, string CurrentStateName) { string StateName = CurrentStateName; while (StateName == CurrentStateName) { StateMachineWorkflowInstance workflowinstance = new StateMachineWorkflowInstance(workflowRuntime, instance.InstanceId); StateName = workflowinstance.CurrentStateName; StateName = StateName == null ? "EndFlow" : StateName; } //System.Threading.Thread.Sleep(1 * 1000); //ReadOnlyCollection<WorkflowQueueInfo> queueInfoData = instance.GetWorkflowQueueData(); //if (queueInfoData.Count != 0) //{ // foreach (WorkflowQueueInfo info in queueInfoData) // { // if (info.QueueName.Equals("SetStateQueue")) // { // StateName = info.SubscribedActivityNames[0]; // } // } //} return StateName; }
internal WorkflowCompletedEventArgs (WorkflowInstance workflow_instance, Activity activity) : base (workflow_instance) { this.activity = activity; }
internal WorkflowEventArgs(WorkflowInstance instance) { _instance = instance; }
/// <summary> /// 获取当前实例的状态代码 /// </summary> /// <param name="WfRuntime"></param> /// <param name="instance"></param> /// <param name="CurrentStateName"></param> /// <returns></returns> public static string GetNextState(WorkflowRuntime WfRuntime, WorkflowInstance instance, string CurrentStateName) { try { string StateName = CurrentStateName; LogHelper.WriteLog("循环获取当前实例的状态代码 (开始)instance=" + (instance != null ? instance.InstanceId.ToString() : "null") + " StateName=" + StateName); while (StateName == CurrentStateName) { if (instance == null) { StateName = "EndFlow"; return StateName; } StateMachineWorkflowInstance workflowinstance = new StateMachineWorkflowInstance(WfRuntime, instance.InstanceId); StateName = workflowinstance.CurrentStateName; } LogHelper.WriteLog("循环获取当前实例的状态代码 (结束)instance=" + (instance != null ? instance.InstanceId.ToString() : "null") + " StateName=" + StateName); return StateName; } catch (Exception ex) { LogHelper.WriteLog("GetNextState异常信息 :" + ex.ToString()); throw new Exception(ex.Message); } }
private void UnloadExistingInstance(WorkflowInstance instance) { // Fire DE event before removing from the InstanceTable! this.controllerConduit.InstanceCompleted(this.programId, instance.InstanceId); this.instanceTable.RemoveInstance(instance.InstanceId); }
public void WorkflowStart(String assemblyUrl, String workflowClassName, WorkflowStartRequest startRequest) { workflowId = startRequest.WorkflowId; assemblyReferencePath = assemblyUrl.Substring(0, assemblyUrl.LastIndexOf('\\') + 1); assemblyReferenceName = assemblyUrl.Replace(assemblyReferencePath, ""); AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); System.Reflection.Assembly workflowAssembly = System.Reflection.Assembly.LoadFrom(assemblyUrl); Type workflowClass = workflowAssembly.GetType(workflowClassName); if (workflowClass == null) { throw new ApplicationException("Unable to find Class [" + workflowClassName + "] in referenced Assembly [" + assemblyUrl + "]."); } Dictionary <String, Object> workflowArguments = new Dictionary <String, Object> (); foreach (System.Reflection.PropertyInfo currentProperty in workflowClass.GetProperties()) { String propertyName = currentProperty.Name; Type propertyType = currentProperty.PropertyType; // System.Diagnostics.Trace.WriteLineIf (application.TraceSwitchWorkflow.TraceVerbose, "Property [" + propertyName + "]: " + propertyType.Name); if (startRequest.Arguments.Keys.Contains(propertyName)) { try { switch (propertyType.Name) { case "Int16": workflowArguments.Add(propertyName, Convert.ToInt16(startRequest.Arguments[propertyName])); break; case "Int32": workflowArguments.Add(propertyName, Convert.ToInt32(startRequest.Arguments[propertyName])); break; case "Int64": workflowArguments.Add(propertyName, Convert.ToInt64(startRequest.Arguments[propertyName])); break; case "DateTime": workflowArguments.Add(propertyName, Convert.ToDateTime(startRequest.Arguments[propertyName])); break; case "Decimal": workflowArguments.Add(propertyName, Convert.ToDecimal(startRequest.Arguments[propertyName])); break; case "Single": workflowArguments.Add(propertyName, Convert.ToSingle(startRequest.Arguments[propertyName])); break; case "Double": workflowArguments.Add(propertyName, Convert.ToDouble(startRequest.Arguments[propertyName])); break; case "Boolean": workflowArguments.Add(propertyName, Convert.ToBoolean(startRequest.Arguments[propertyName])); break; case "String": workflowArguments.Add(propertyName, Convert.ToString(startRequest.Arguments[propertyName])); break; default: workflowArguments.Add(propertyName, startRequest.Arguments[propertyName]); break; } } catch (Exception conversionException) { System.Diagnostics.Trace.WriteLineIf(application.TraceSwitchWorkflow.TraceError, conversionException.Message); } } else { //System.Diagnostics.Trace.WriteLineIf (application.TraceSwitchWorkflow.TraceVerbose, "Ignored Property [" + propertyName + "]: " + propertyType.Name); //System.Diagnostics.Trace.WriteLine ("Ignored Property [" + propertyName + "]: " + propertyType.Name); } } workflowInstance = workflowRuntime.CreateWorkflow(workflowAssembly.GetType(workflowClassName), workflowArguments); workflowResponse.WorkQueueItemId = startRequest.WorkQueueItemId; workflowResponse.WorkflowInstanceId = workflowInstance.InstanceId; workflowInstance.Start(); return; }
internal WorkflowTerminatedEventArgs(WorkflowInstance instance, Exception e) : base(instance) { this.exception = e; }
internal WorkflowTerminatedEventArgs(WorkflowInstance instance, System.Exception e) : base(instance) { this.exception = e; }
public DataResult DoFlowRecord_Approval(OracleConnection con, WorkflowRuntime workflowRuntime, WorkflowInstance instance, FLOW_FLOWRECORDDETAIL_T entity, string NextStateCode, Dictionary<Role_UserType, List<UserInfo>> dictUserInfo, Dictionary<UserInfo, UserInfo> dictAgentUserInfo, SubmitFlag SubmitFlag, FlowType FlowType) { DataResult tmpDataResult = new DataResult(); tmpDataResult.DictCounterUser = dictUserInfo; try { #region 更新流程 //如果NextStateCode为空则自动获取模型中的下一状态,如果不为空则使用传入状态代码,并使用传入下一任务人ID //更新本流程 entity = UpdateFlowRecord2(con, entity); string stateCode = ""; if (NextStateCode.ToUpper() == "ENDFLOW") { stateCode = NextStateCode; } else { stateCode = string.IsNullOrEmpty(NextStateCode) ? SMTWorkFlowManage.GetNextState(workflowRuntime, instance, entity.STATECODE) : NextStateCode; } //string stateCode = NextStateCode == "" ? SMTWorkFlowManage.GetNextState(workflowRuntime, instance, entity.STATECODE) : NextStateCode; tmpDataResult.AppState = stateCode; if (stateCode == "EndFlow") { entity.FLOW_FLOWRECORDMASTER_T.CHECKSTATE = "2"; //设为终审通过 if (entity.EDITDATE == entity.AGENTEDITDATE) //代理审核时 { entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = entity.AGENTUSERID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = entity.AGENTERNAME; } else //正常审核时 { entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = entity.EDITUSERID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = entity.EDITUSERNAME; } entity.FLOW_FLOWRECORDMASTER_T.EDITDATE = DateTime.Now; UpdateFlowRecord2(con, entity); FLOW_FLOWRECORDMASTER_TDAL.Update(entity.FLOW_FLOWRECORDMASTER_T); tmpDataResult.FlowResult = FlowResult.END; //如果没有下一处理节点,则返回END tmpDataResult.CheckState = "2"; } else { dictUserInfo.Values.ToList().ForEach(users => { users.ForEach(user => { #region //添加下一状态 //FLOW_FLOWRECORDDETAIL_T entity2 = new FLOW_FLOWRECORDDETAIL_T(); ////添加下一状态 //entity2.FLOWRECORDDETAILID = Guid.NewGuid().ToString(); //entity2.FLOW_FLOWRECORDMASTER_T = entity.FLOW_FLOWRECORDMASTER_T; //entity2.PARENTSTATEID = entity.FLOWRECORDDETAILID;// entity.StateCode; ////entity2.Content = ""; //entity2.STATECODE = stateCode; //entity2.FLAG = "0"; //entity2.CHECKSTATE = "2"; //entity2.CREATEPOSTID = entity.CREATEPOSTID; //entity2.CREATECOMPANYID = entity.CREATECOMPANYID; //entity2.CREATEDEPARTMENTID = entity.CREATEDEPARTMENTID; ////if (entity.EDITDATE == entity.AGENTEDITDATE) //代理审核时 ////{ //// entity2.CREATEUSERID = entity.AGENTUSERID; //// entity2.CREATEUSERNAME = entity.AGENTERNAME; ////} ////else //正常审核时 ////{ //entity2.CREATEUSERID = entity.EDITUSERID; //entity2.CREATEUSERNAME = entity.EDITUSERNAME; ////} //entity2.EDITUSERID = user.UserID; //entity2.EDITUSERNAME = user.UserName; //entity2.EDITCOMPANYID = user.CompanyID; //entity2.EDITDEPARTMENTID = user.DepartmentID; //entity2.EDITPOSTID = user.PostID; //entity2.CREATEDATE = DateTime.Now; //entity2.EDITDATE = DateTime.Now; //if (dictAgentUserInfo.ContainsKey(user)) //{ // entity2.AGENTUSERID = dictAgentUserInfo[user].UserID; // entity2.AGENTERNAME = dictAgentUserInfo[user].UserName; // entity2.AGENTEDITDATE = DateTime.Now; //} //AddFlowRecord2(entity2); #endregion #region FLOW_FLOWRECORDDETAIL_T entity2 = new FLOW_FLOWRECORDDETAIL_T(); entity2.FLOWRECORDDETAILID = Guid.NewGuid().ToString(); entity2.FLOW_FLOWRECORDMASTER_T = entity.FLOW_FLOWRECORDMASTER_T; entity2.STATECODE = stateCode; entity2.PARENTSTATEID = entity.FLOWRECORDDETAILID;//entity.StateCode; entity2.FLAG = "0"; entity2.CHECKSTATE = "2"; entity2.CREATEPOSTID = entity.CREATEPOSTID; entity2.CREATECOMPANYID = entity.CREATECOMPANYID; entity2.CREATEDEPARTMENTID = entity.CREATEDEPARTMENTID; entity2.CREATEUSERID = entity.EDITUSERID; entity2.CREATEUSERNAME = entity.EDITUSERNAME; entity2.CREATEDATE = DateTime.Now; entity2.EDITUSERID = user.UserID; entity2.EDITUSERNAME = user.UserName; entity2.EDITCOMPANYID = user.CompanyID; entity2.EDITDEPARTMENTID = user.DepartmentID; entity2.EDITPOSTID = user.PostID; entity2.EDITDATE = DateTime.Now; if (dictAgentUserInfo.ContainsKey(user)) { entity2.AGENTUSERID = dictAgentUserInfo[user].UserID; entity2.AGENTERNAME = dictAgentUserInfo[user].UserName; entity2.AGENTEDITDATE = DateTime.Now; } AddFlowRecord2(con, entity2); #endregion }); }); tmpDataResult.AppState = stateCode; tmpDataResult.FlowResult = FlowResult.SUCCESS; tmpDataResult.CheckState = "1"; } tmpDataResult.IsCountersignComplete = true; return tmpDataResult; #endregion } catch (Exception ex) { LogHelper.WriteLog("DoFlowRecord_Approval异常信息 :" + ex.ToString()); throw new Exception("DoFlowRecord_Approval:" + ex.InnerException + ex.Message); //tmpDataResult.FlowResult = FlowResult.FAIL; //tmpDataResult.Err = ex.Message; //return tmpDataResult; } }
/// <summary> /// 通过持久化服务查询下一处理人(对应SubmitFlow) /// </summary> /// <param name="WfRuntimeClone">持久化运行时</param> /// <param name="instanceClone">持久化实例</param> /// <param name="xml">条件XML</param> /// <param name="CurrentStateName">当前状态代码</param> /// <param name="DataResult">操作结果</param> public void GetUserByInstance(string companyID, WorkflowRuntime WfRuntimeClone, WorkflowInstance instanceClone, string Layout, string xml, string CurrentStateName, List<string> UserID, List<string> PostID, FlowType FlowType, ref DataResult DataResult) { WorkflowRuntime WfRuntime = null; WorkflowInstance Instance = null; List<UserInfo> AppUserInfo = null; string strNextState = CurrentStateName; Role_UserType RuleName; try { if (!WfRuntimeClone.IsStarted) { WfRuntimeClone.StartRuntime(); } WfRuntime = SMTWorkFlowManage.CreateWorkFlowRuntime(false); Instance = SMTWorkFlowManage.CloneWorkflowInstance(WfRuntimeClone, instanceClone, WfRuntime); bool iscurruser = true; while (iscurruser) { // CurrentStateName = strNextState; strNextState = SMTWorkFlowManage.GetNextStateByEvent(WfRuntime, Instance, strNextState, xml); //if (FlowType == FlowType.Task && strNextState != "EndFlow") //{ // XmlReader XmlReader; // StringReader tmpLayout = new StringReader(Layout); // XmlReader = XmlReader.Create(tmpLayout); // XElement XElementS = XElement.Load(XmlReader); // var a = from c in XElementS.Descendants("Activity") // where c.Attribute("Name").Value == strNextState // select c.Attribute("RoleName").Value; // if (a.Count() > 0) // { // strNextState = a.First().ToString(); // } // else // { // DataResult.Err = "没有找到对应角色"; // DataResult.FlowResult = FlowResult.FAIL; // return; // } // tmpLayout = null; // XmlReader = null; // XElementS = null; // a = null; //} RuleName = Utility.GetRlueName(Layout, strNextState); if (RuleName == null) { DataResult.Err = "没有找到对应角色"; DataResult.FlowResult = FlowResult.FAIL; return; } string tmpPostID = RuleName.UserType == "CREATEUSER" ? PostID[0] : PostID[1]; bool isHigher = false; AppUserInfo = GetUserByStateCode(RuleName.RoleName, null, tmpPostID, ref isHigher); #region 打印审核人 string names = "=======打印审核人E(RuleName.RoleName=" + RuleName.RoleName + ";UserID=" + UserID + ";PostID=" + PostID + ";isHigher=" + isHigher.ToString() + ")=======\r\n"; foreach (var user in AppUserInfo) { names += "CompanyID:" + user.CompanyID + "\r\n"; names += "DepartmentID:" + user.DepartmentID + "\r\n"; names += "PostID:" + user.PostID + "\r\n"; names += "UserID:" + user.UserID + "\r\n"; names += "UserName:"******"\r\n"; } if (!isHigher && RuleName.IsOtherCompany != null) { if (RuleName.IsOtherCompany.Value == true) { names += "是否指定公司:" + RuleName.IsOtherCompany.Value.ToString() + "\r\n"; names += "公司的ID:" + RuleName.OtherCompanyID + "\r\n"; } else if (RuleName.IsOtherCompany.Value == false) { names += "实际要查找公司的ID:" + companyID + "\r\n"; } } LogHelper.WriteLog(names); #endregion #region beyond if (!isHigher && RuleName.IsOtherCompany != null) { if (RuleName.IsOtherCompany.Value == true) { AppUserInfo = AppUserInfo.Where(user => user.CompanyID == RuleName.OtherCompanyID).ToList(); } else if (RuleName.IsOtherCompany.Value == false) { AppUserInfo = AppUserInfo.Where(user => user.CompanyID == companyID).ToList(); } } #endregion if (AppUserInfo == null || AppUserInfo.Count == 0) { DataResult.Err = "没有找到审核人"; DataResult.FlowResult = FlowResult.FAIL; return; } if (AppUserInfo.Where(c => c.UserID == UserID[1]).Count() == 0) iscurruser = false; } if (AppUserInfo.Count > 1) //处理角色对应多个用户,返回用户集给提交人,选择一个处理人 { DataResult.FlowResult = FlowResult.MULTIUSER; } DataResult.AppState = strNextState; DataResult.UserInfo = AppUserInfo; } catch (Exception ex) { LogHelper.WriteLog("GetUserByInstance异常信息 :" + ex.ToString()); throw new Exception("GetUserByInstance:" + ex.Message); } finally { strNextState = null; AppUserInfo = null; RuleName = null; Instance = null; SMTWorkFlowManage.ColseWorkFlowRuntime(WfRuntime); } }
/// <summary> /// 流程数据处理(对应SubmitFlow)对数据库操作 /// </summary> /// <param name="workflowRuntime"></param> /// <param name="instance"></param> /// <param name="entity"></param> /// <param name="NextStateCode"></param> /// <param name="EditUserId"></param> /// <param name="EditUserName"></param> /// <param name="SubmitFlag"></param> /// <param name="FlowType"></param> /// <returns></returns> public DataResult DoFlowRecord(OracleConnection con, WorkflowRuntime workflowRuntime, WorkflowInstance instance, FLOW_FLOWRECORDDETAIL_T entity, string NextStateCode, UserInfo AppUser, UserInfo AgentUser, SubmitFlag SubmitFlag, FlowType FlowType) { DataResult tmpDataResult = new DataResult(); UserInfo tmpUserInfo = AppUser; //tmpUserInfo.UserID = EditUserId; //tmpUserInfo.UserName = EditUserName; tmpDataResult.UserInfo.Add(tmpUserInfo); try { if (SubmitFlag == SubmitFlag.New) { #region 新增流程 //添加启动状态 entity.FLOW_FLOWRECORDMASTER_T.FLOWRECORDMASTERID = Guid.NewGuid().ToString(); entity.FLOW_FLOWRECORDMASTER_T.CHECKSTATE = "1"; entity.FLOW_FLOWRECORDMASTER_T.CREATECOMPANYID = entity.CREATECOMPANYID; entity.FLOW_FLOWRECORDMASTER_T.CREATEDEPARTMENTID = entity.CREATEDEPARTMENTID; entity.FLOW_FLOWRECORDMASTER_T.CREATEPOSTID = entity.CREATEPOSTID; entity.FLOW_FLOWRECORDMASTER_T.CREATEUSERID = entity.CREATEUSERID; entity.FLOW_FLOWRECORDMASTER_T.CREATEUSERNAME = entity.CREATEUSERNAME; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = entity.CREATEUSERID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = entity.CREATEUSERNAME; entity.FLOW_FLOWRECORDMASTER_T.CREATEDATE = DateTime.Now; entity.FLOWRECORDDETAILID = Guid.NewGuid().ToString(); // entity.FLOW_FLOWRECORDMASTER_T .INSTANCEID = instance.InstanceId.ToString(); entity.FLAG = "1"; entity.CHECKSTATE = "1"; //entity.FlowCode = "TestFlow"; //正式使用时关屏蔽 entity.STATECODE = "StartFlow"; entity.PARENTSTATEID = entity.FLOWRECORDDETAILID; entity.CREATEDATE = DateTime.Now; entity.EDITDATE = DateTime.Now; entity.EDITUSERID = entity.CREATEUSERID; entity.EDITUSERNAME = entity.CREATEUSERNAME; entity.EDITCOMPANYID = entity.CREATECOMPANYID; entity.EDITDEPARTMENTID = entity.CREATEDEPARTMENTID; entity.EDITPOSTID = entity.CREATEPOSTID; #region 引擎自动提交时停留在提交人处 if (FlowType == FlowType.Pending) { entity.FLAG = "0"; entity.EDITUSERID = AppUser.UserID; entity.EDITUSERNAME = AppUser.UserName; entity.EDITCOMPANYID = AppUser.CompanyID; entity.EDITDEPARTMENTID = AppUser.DepartmentID; entity.EDITPOSTID = AppUser.PostID; FLOW_FLOWRECORDMASTER_TDAL.Add(con, entity.FLOW_FLOWRECORDMASTER_T);//对数据库操作 AddFlowRecord(con, entity, NextStateCode, AppUser.UserID); tmpDataResult.FlowResult = FlowResult.SUCCESS; tmpDataResult.CheckState = "1"; return tmpDataResult; } #endregion FLOW_FLOWRECORDMASTER_TDAL.Add(con, entity.FLOW_FLOWRECORDMASTER_T);//对数据库操作 AddFlowRecord(con, entity, NextStateCode, AppUser.UserID); FLOW_FLOWRECORDDETAIL_T entity2 = new FLOW_FLOWRECORDDETAIL_T(); //添加下一状态 entity2.FLOWRECORDDETAILID = Guid.NewGuid().ToString(); entity2.FLOW_FLOWRECORDMASTER_T = entity.FLOW_FLOWRECORDMASTER_T; entity2.STATECODE = NextStateCode == "" ? SMTWorkFlowManage.GetNextState(workflowRuntime, instance, entity.STATECODE) : NextStateCode; entity2.PARENTSTATEID = entity.FLOWRECORDDETAILID;//entity.StateCode; //entity2.Content = "."; entity2.FLAG = "0"; entity2.CHECKSTATE = "2"; entity2.CREATEPOSTID = entity.CREATEPOSTID; entity2.CREATECOMPANYID = entity.CREATECOMPANYID; entity2.CREATEDEPARTMENTID = entity.CREATEDEPARTMENTID; entity2.CREATEUSERID = entity.EDITUSERID; entity2.CREATEUSERNAME = entity.EDITUSERNAME; entity2.CREATEDATE = DateTime.Now; entity2.EDITUSERID = AppUser.UserID; entity2.EDITUSERNAME = AppUser.UserName; entity2.EDITCOMPANYID = AppUser.CompanyID; entity2.EDITDEPARTMENTID = AppUser.DepartmentID; entity2.EDITPOSTID = AppUser.PostID; entity2.EDITDATE = DateTime.Now; if (AgentUser != null) //如果启用了代理,把代理人信息写入 { entity2.AGENTUSERID = AgentUser.UserID; entity2.AGENTERNAME = AgentUser.UserName; entity2.AGENTEDITDATE = DateTime.Now; } tmpDataResult.AppState = entity2.STATECODE; if (entity2.STATECODE != "EndFlow") { AddFlowRecord(con, entity2, NextStateCode, AppUser.UserID);//对数据库操作 tmpDataResult.FlowResult = FlowResult.SUCCESS; tmpDataResult.CheckState = "1"; } else { tmpDataResult.CheckState = "2"; tmpDataResult.FlowResult = FlowResult.END; //如果没有下一处理节点,则返回END } return tmpDataResult; #endregion } else { #region 更新流程 //如果NextStateCode为空则自动获取模型中的下一状态,如果不为空则使用传入状态代码,并使用传入下一任务人ID //更新本流程 entity = UpdateFlowRecord(con, entity, NextStateCode, AppUser.UserID);//对数据库操作 //添加下一状态 FLOW_FLOWRECORDDETAIL_T entity2 = new FLOW_FLOWRECORDDETAIL_T(); //添加下一状态 entity2.FLOWRECORDDETAILID = Guid.NewGuid().ToString(); if (NextStateCode != "") { entity2.STATECODE = NextStateCode; //entity2.EditUserID = EditUserId; //entity2.EditUserName = EditUserName; } else { entity2.STATECODE = SMTWorkFlowManage.GetNextState(workflowRuntime, instance, entity.STATECODE); // entity2.EditUserID = entity2.StateCode=="EndFlow" ? "" : "EditUserId"; //根据状态查询权限表中用户ID } if (entity2.STATECODE == "EndFlow") { entity.FLOW_FLOWRECORDMASTER_T.CHECKSTATE = "2"; //设为终审通过 if (entity.EDITDATE == entity.AGENTEDITDATE) //代理审核时 { entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = entity.AGENTUSERID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = entity.AGENTERNAME; } else //正常审核时 { entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = entity.EDITUSERID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = entity.EDITUSERNAME; } entity.FLOW_FLOWRECORDMASTER_T.EDITDATE = DateTime.Now; UpdateFlowRecord(con, entity, NextStateCode, AppUser.UserID);//对数据库操作 FLOW_FLOWRECORDMASTER_TDAL.Update(entity.FLOW_FLOWRECORDMASTER_T);//对数据库操作 } entity2.PARENTSTATEID = entity.FLOWRECORDDETAILID;// entity.StateCode; //entity2.Content = ""; entity2.FLAG = "0"; entity2.CHECKSTATE = "2"; entity2.CREATEPOSTID = entity.CREATEPOSTID; entity2.CREATECOMPANYID = entity.CREATECOMPANYID; entity2.CREATEDEPARTMENTID = entity.CREATEDEPARTMENTID; //if (entity.EDITDATE == entity.AGENTEDITDATE) //代理审核时 //{ // entity2.CREATEUSERID = entity.AGENTUSERID; // entity2.CREATEUSERNAME = entity.AGENTERNAME; //} //else //正常审核时 //{ entity2.CREATEUSERID = entity.EDITUSERID; entity2.CREATEUSERNAME = entity.EDITUSERNAME; //} entity2.EDITUSERID = AppUser.UserID; entity2.EDITUSERNAME = AppUser.UserName; entity2.EDITCOMPANYID = AppUser.CompanyID; entity2.EDITDEPARTMENTID = AppUser.DepartmentID; entity2.EDITPOSTID = AppUser.PostID; entity2.CREATEDATE = DateTime.Now; entity2.EDITDATE = DateTime.Now; if (AgentUser != null) //如果启用了代理,把代理人信息写入 { entity2.AGENTUSERID = AgentUser.UserID; entity2.AGENTERNAME = AgentUser.UserName; entity2.AGENTEDITDATE = DateTime.Now; } tmpDataResult.AppState = entity2.STATECODE; if (entity2.STATECODE != "EndFlow") { entity2.FLOW_FLOWRECORDMASTER_T = entity.FLOW_FLOWRECORDMASTER_T; AddFlowRecord(con, entity2, NextStateCode, AppUser.UserID);//对数据库操作 tmpDataResult.FlowResult = FlowResult.SUCCESS; tmpDataResult.CheckState = "1"; } else { tmpDataResult.FlowResult = FlowResult.END; //如果没有下一处理节点,则返回END tmpDataResult.CheckState = "2"; } return tmpDataResult; //如有下一节点,返回SUCCESS #endregion } } catch (Exception ex) { LogHelper.WriteLog("DoFlowRecord异常信息 :" + ex.ToString()); throw new Exception("DoFlowRecord:" + ex.InnerException + ex.Message); //tmpDataResult.FlowResult = FlowResult.FAIL; //tmpDataResult.Err = ex.Message; //return tmpDataResult; } }
// Callers of this method should acquire the executor lock only if they // are not being called in the runtime thread.( private void LoadExistingInstance(WorkflowInstance instance, bool attaching) { WorkflowExecutor executor = instance.GetWorkflowResourceUNSAFE(); if (!executor.IsInstanceValid) return; IWorkflowCoreRuntime runtimeService = (IWorkflowCoreRuntime)executor; Activity rootActivity = runtimeService.RootActivity; Guid scheduleTypeId = GetScheduleTypeId(runtimeService); // If we are just attaching, need to LoadExistingScheduleType with the dynamic definition and type // since the OnDynamicUpdateEvent has never been executed. if (attaching && runtimeService.IsDynamicallyUpdated) LoadExistingScheduleType(scheduleTypeId, rootActivity.GetType(), true, rootActivity); // Add to the InstanceTable before firing the DE event ! this.instanceTable.AddInstance(instance.InstanceId, rootActivity); this.controllerConduit.InstanceCreated(this.programId, instance.InstanceId, scheduleTypeId); // Take a lock so that SetInitialActivityStatus is always called before next status events. lock (this.eventLock) { executor.WorkflowExecutionEvent += OnInstanceEvent; foreach (Activity activity in DebugController.WalkActivityTree(rootActivity)) { #if false // ReplicatorActivity replicator = activity as ReplicatorActivity; if (replicator != null) { foreach (Activity queuedChildActivity in replicator.DynamicActivities) activityQueue.Enqueue(queuedChildActivity); } else #endif UpdateActivityStatus(scheduleTypeId, instance.InstanceId, activity); } ActivityExecutionContext rootExecutionContext = new ActivityExecutionContext(rootActivity); foreach (ActivityExecutionContext executionContext in DebugController.WalkExecutionContextTree(rootExecutionContext)) { Activity instanceActivity = executionContext.Activity; foreach (Activity childInstance in DebugController.WalkActivityTree(instanceActivity)) { UpdateActivityStatus(scheduleTypeId, instance.InstanceId, childInstance); } } } }
/// <summary> /// /// </summary> /// <param name="companyID"></param> /// <param name="WfRuntimeClone"></param> /// <param name="instanceClone"></param> /// <param name="Layout"></param> /// <param name="xml"></param> /// <param name="CurrentStateName"></param> /// <param name="UserID"></param> /// <param name="PostID"></param> /// <param name="FlowType"></param> /// <param name="DataResult"></param> public void GetUserByInstance2(string companyID, WorkflowRuntime WfRuntimeClone, WorkflowInstance instanceClone, string Layout, string xml, string CurrentStateName, List<string> UserID, List<string> PostID, FlowType FlowType, ref DataResult DataResult) { WorkflowRuntime WfRuntime = null; WorkflowInstance Instance = null; List<UserInfo> AppUserInfo = null; string strNextState = CurrentStateName; bool IsCountersign = false; string CountersignType = "0"; //Role_UserType RuleName; //List<UserInfo> AppUserInfo = null; Dictionary<Role_UserType, List<UserInfo>> DictCounterUser = null; try { if (!WfRuntimeClone.IsStarted) { WfRuntimeClone.StartRuntime(); } WfRuntime = SMTWorkFlowManage.CreateWorkFlowRuntime(false); Instance = SMTWorkFlowManage.CloneWorkflowInstance(WfRuntimeClone, instanceClone, WfRuntime); bool iscurruser = true; int testflag = 0; while (iscurruser) { testflag++; if (testflag > 10) { throw new Exception("循环处理流程超过10次,请联系系统管理员"); } #region strNextState = SMTWorkFlowManage.GetNextStateByEvent(WfRuntime, Instance, strNextState, xml); List<Role_UserType> listRole = Utility.GetRlueName2(Layout, strNextState, ref IsCountersign, ref CountersignType); if (listRole.Count == 0) { DataResult.Err = "没有找到对应角色"; DataResult.FlowResult = FlowResult.FAIL; return; } if (!IsCountersign) { #region string tmpPostID = listRole[0].UserType == "CREATEUSER" ? PostID[0] : PostID[1]; bool isHigher = false; AppUserInfo = GetUserByStateCode(listRole[0].RoleName, null, tmpPostID, ref isHigher); #region 打印审核人 string names = "=======打印审核人F(listRole[0].RoleName=" + listRole[0].RoleName + ";UserID=" + UserID + ";PostID=" + PostID + ";isHigher=" + isHigher.ToString() + ")=======\r\n"; foreach (var user in AppUserInfo) { names += "CompanyID:" + user.CompanyID + "\r\n"; names += "DepartmentID:" + user.DepartmentID + "\r\n"; names += "PostID:" + user.PostID + "\r\n"; names += "UserID:" + user.UserID + "\r\n"; names += "UserName:"******"\r\n"; } if (!isHigher && listRole[0].IsOtherCompany != null) { if (listRole[0].IsOtherCompany.Value == true) { names += "是否指定公司:" + listRole[0].IsOtherCompany.Value.ToString() + "\r\n"; names += "公司的ID:" + listRole[0].OtherCompanyID + "\r\n"; } else if (listRole[0].IsOtherCompany.Value == false) { names += "实际要查找公司的ID:" + companyID + "\r\n"; } } LogHelper.WriteLog(names); #endregion #region beyond if (!isHigher && strNextState.ToUpper() != "ENDFLOW") { if (listRole[0].IsOtherCompany != null && listRole[0].IsOtherCompany.Value == true) { AppUserInfo = AppUserInfo.Where(user => user.CompanyID == listRole[0].OtherCompanyID).ToList(); } else { AppUserInfo = AppUserInfo.Where(user => user.CompanyID == companyID).ToList(); } } #endregion if (AppUserInfo == null || AppUserInfo.Count == 0) { DataResult.Err = "没有找到审核人"; DataResult.FlowResult = FlowResult.FAIL; return; } if (AppUserInfo.Where(c => c.UserID == UserID[1]).Count() == 0) iscurruser = false; #endregion } else { #region DictCounterUser = new Dictionary<Role_UserType, List<UserInfo>>(); if (CountersignType == "0") { #region for (int i = 0; i < listRole.Count; i++) { string tmpPostID = listRole[i].UserType == "CREATEUSER" ? PostID[0] : PostID[1]; bool isHigher = false; var listuserinfo = GetUserByStateCode(listRole[i].RoleName, null, tmpPostID, ref isHigher); #region 打印审核人 string names = "=======打印审核人G(listRole[i].RoleName=" + listRole[0].RoleName + ";UserID=" + UserID + ";PostID=" + PostID + ";isHigher=" + isHigher.ToString() + ")=======\r\n"; foreach (var user in AppUserInfo) { names += "CompanyID:" + user.CompanyID + "\r\n"; names += "DepartmentID:" + user.DepartmentID + "\r\n"; names += "PostID:" + user.PostID + "\r\n"; names += "UserID:" + user.UserID + "\r\n"; names += "UserName:"******"\r\n"; } if (!isHigher && listRole[0].IsOtherCompany != null) { if (listRole[0].IsOtherCompany.Value == true) { names += "是否指定公司:" + listRole[0].IsOtherCompany.Value.ToString() + "\r\n"; names += "公司的ID:" + listRole[0].OtherCompanyID + "\r\n"; } else if (listRole[0].IsOtherCompany.Value == false) { names += "实际要查找公司的ID:" + companyID + "\r\n"; } } LogHelper.WriteLog(names); #endregion if (!isHigher) { if (listRole[i].IsOtherCompany != null && listRole[i].IsOtherCompany.Value == true) { listuserinfo = listuserinfo.Where(user => user.CompanyID == listRole[i].OtherCompanyID).ToList(); } else { listuserinfo = listuserinfo.Where(user => user.CompanyID == companyID).ToList(); } } if (listuserinfo == null || listuserinfo.Count == 0) { DataResult.Err = "没有找到审核人"; DataResult.FlowResult = FlowResult.FAIL; return; } DictCounterUser.Add(listRole[i], listuserinfo); } iscurruser = false; #endregion } else { #region iscurruser = false; bool bFlag = false; for (int i = 0; i < listRole.Count; i++) { string tmpPostID = listRole[i].UserType == "CREATEUSER" ? PostID[0] : PostID[1]; bool isHigher = false; var listuserinfo = GetUserByStateCode(listRole[i].RoleName, null, tmpPostID, ref isHigher); #region 打印审核人 string names = "=======打印审核人H(listRole[0].RoleName=" + listRole[i].RoleName + ";UserID=" + UserID + ";PostID=" + PostID + ";isHigher=" + isHigher.ToString() + ")=======\r\n"; foreach (var user in AppUserInfo) { names += "CompanyID:" + user.CompanyID + "\r\n"; names += "DepartmentID:" + user.DepartmentID + "\r\n"; names += "PostID:" + user.PostID + "\r\n"; names += "UserID:" + user.UserID + "\r\n"; names += "UserName:"******"\r\n"; } if (!isHigher && listRole[0].IsOtherCompany != null) { if (listRole[0].IsOtherCompany.Value == true) { names += "是否指定公司:" + listRole[0].IsOtherCompany.Value.ToString() + "\r\n"; names += "公司的ID:" + listRole[0].OtherCompanyID + "\r\n"; } else if (listRole[0].IsOtherCompany.Value == false) { names += "实际要查找公司的ID:" + companyID + "\r\n"; } } LogHelper.WriteLog(names); #endregion if (!isHigher) { if (listRole[i].IsOtherCompany != null && listRole[i].IsOtherCompany.Value == true) { listuserinfo = listuserinfo.Where(user => user.CompanyID == listRole[i].OtherCompanyID).ToList(); } else { listuserinfo = listuserinfo.Where(user => user.CompanyID == companyID).ToList(); } } if (listuserinfo != null && listuserinfo.Count > 0) { bFlag = true; if (listuserinfo.FirstOrDefault(u => u.UserID == UserID[1]) != null) { iscurruser = true; break; } //DataResult.Err = "没有找到审核人"; //DataResult.FlowResult = FlowResult.FAIL; //return; } DictCounterUser.Add(listRole[i], listuserinfo); } if (!bFlag) { DataResult.Err = "没有找到审核人"; DataResult.FlowResult = FlowResult.FAIL; return; } #endregion } #endregion } #endregion } DataResult.IsCountersign = IsCountersign; DataResult.AppState = strNextState; DataResult.CountersignType = CountersignType; if (!IsCountersign) { #region if (AppUserInfo != null && AppUserInfo.Count > 1) //处理角色对应多个用户,返回用户集给提交人,选择一个处理人 { DataResult.FlowResult = FlowResult.MULTIUSER; } DataResult.UserInfo = AppUserInfo; #endregion } else { #region DataResult.DictCounterUser = DictCounterUser; List<Role_UserType> listkeys = DictCounterUser.Keys.ToList(); for (int i = 0; i < listkeys.Count; i++) { Role_UserType key = listkeys[i]; if (DictCounterUser[key].Count > 1) { DataResult.FlowResult = FlowResult.Countersign; break; } } #endregion } } catch (Exception ex) { //throw new Exception("GetUserByInstance2:" + ex.Message);//旧的 LogHelper.WriteLog(this, "GetUserByInstance2(string companyID,WorkflowRuntime WfRuntimeClone, WorkflowInstance instanceClone, string Layout, string xml, string CurrentStateName, List<string> UserID, List<string> PostID, FlowType FlowType, ref DataResult DataResult):", "", ex); throw new Exception(ex.Message); } finally { strNextState = null; AppUserInfo = null; //RuleName = null; Instance = null; SMTWorkFlowManage.ColseWorkFlowRuntime(WfRuntime); } }
private void UpdateListItem(WorkflowInstance workflowInstance, string workflowState, string workflowStatus) { if (this.listViewOrders.InvokeRequired) { // This code is executing on a different thread than the one that // ...created the ListView, so we need to use the Invoke method. // Create an instance of the delegate for invoking this method UpdateListItemDelegate updateListViewItem = new UpdateListItemDelegate(this.UpdateListItem); // Create the array of parameters for this method object[] args = new object[3] { workflowInstance, workflowState, workflowStatus }; // Invoke this method on the UI thread this.listViewOrders.Invoke(updateListViewItem, args); } else { // Get the ListViewItem for the specified WorkflowInstance string instanceId = workflowInstance.InstanceId.ToString(); ListViewItem itemOrder = listViewOrders.Items[instanceId]; if (itemOrder == null) { return; } // Update the Workflow State & Status column values itemOrder.SubItems[OrderStateColumnIndex].Text = workflowState; itemOrder.SubItems[WorkflowStatusColumnIndex].Text = workflowStatus; } }
/// <summary> /// 会签 /// </summary> /// <param name="workflowRuntime"></param> /// <param name="instance"></param> /// <param name="entity"></param> /// <param name="NextStateCode"></param> /// <param name="dictUserInfo"></param> /// <param name="dictAgentUserInfo"></param> /// <param name="SubmitFlag"></param> /// <param name="FlowType"></param> /// <returns></returns> public DataResult DoFlowRecord_Add(OracleConnection con, WorkflowRuntime workflowRuntime, WorkflowInstance instance, FLOW_FLOWRECORDDETAIL_T entity, string NextStateCode, Dictionary<Role_UserType, List<UserInfo>> dictUserInfo, Dictionary<UserInfo, UserInfo> dictAgentUserInfo, SubmitFlag SubmitFlag, FlowType FlowType) { DataResult tmpDataResult = new DataResult(); tmpDataResult.DictCounterUser = dictUserInfo; try { if (SubmitFlag == SubmitFlag.New) { #region 添加启动状态 entity.FLOW_FLOWRECORDMASTER_T.FLOWRECORDMASTERID = Guid.NewGuid().ToString(); entity.FLOW_FLOWRECORDMASTER_T.CHECKSTATE = "1"; entity.FLOW_FLOWRECORDMASTER_T.CREATECOMPANYID = entity.CREATECOMPANYID; entity.FLOW_FLOWRECORDMASTER_T.CREATEDEPARTMENTID = entity.CREATEDEPARTMENTID; entity.FLOW_FLOWRECORDMASTER_T.CREATEPOSTID = entity.CREATEPOSTID; entity.FLOW_FLOWRECORDMASTER_T.CREATEUSERID = entity.CREATEUSERID; entity.FLOW_FLOWRECORDMASTER_T.CREATEUSERNAME = entity.CREATEUSERNAME; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = entity.CREATEUSERID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = entity.CREATEUSERNAME; entity.FLOW_FLOWRECORDMASTER_T.CREATEDATE = DateTime.Now; entity.FLOWRECORDDETAILID = Guid.NewGuid().ToString(); // entity.FLOW_FLOWRECORDMASTER_T .INSTANCEID = instance.InstanceId.ToString(); entity.FLAG = "1"; entity.CHECKSTATE = "1"; //entity.FlowCode = "TestFlow"; //正式使用时关屏蔽 entity.STATECODE = "StartFlow"; entity.PARENTSTATEID = entity.FLOWRECORDDETAILID; entity.CREATEDATE = DateTime.Now; entity.EDITDATE = DateTime.Now; entity.EDITUSERID = entity.CREATEUSERID; entity.EDITUSERNAME = entity.CREATEUSERNAME; entity.EDITCOMPANYID = entity.CREATECOMPANYID; entity.EDITDEPARTMENTID = entity.CREATEDEPARTMENTID; entity.EDITPOSTID = entity.CREATEPOSTID; FLOW_FLOWRECORDMASTER_TDAL.Add(con, entity.FLOW_FLOWRECORDMASTER_T); AddFlowRecord2(con, entity); #endregion } else { #region //entity.FLOW_FLOWRECORDMASTER_T.FLOWRECORDMASTERID = Guid.NewGuid().ToString(); entity.FLOW_FLOWRECORDMASTER_T.CHECKSTATE = "1"; entity.FLOW_FLOWRECORDMASTER_T.CREATECOMPANYID = entity.CREATECOMPANYID; entity.FLOW_FLOWRECORDMASTER_T.CREATEDEPARTMENTID = entity.CREATEDEPARTMENTID; entity.FLOW_FLOWRECORDMASTER_T.CREATEPOSTID = entity.CREATEPOSTID; entity.FLOW_FLOWRECORDMASTER_T.CREATEUSERID = entity.CREATEUSERID; entity.FLOW_FLOWRECORDMASTER_T.CREATEUSERNAME = entity.CREATEUSERNAME; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = entity.CREATEUSERID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = entity.CREATEUSERNAME; entity.FLOW_FLOWRECORDMASTER_T.CREATEDATE = DateTime.Now; entity.FLOWRECORDDETAILID = Guid.NewGuid().ToString(); // entity.FLOW_FLOWRECORDMASTER_T .INSTANCEID = instance.InstanceId.ToString(); entity.FLAG = "1"; entity.CHECKSTATE = "1"; //entity.FlowCode = "TestFlow"; //正式使用时关屏蔽 entity.STATECODE = "StartFlow"; entity.PARENTSTATEID = entity.FLOWRECORDDETAILID; entity.CREATEDATE = DateTime.Now; entity.EDITDATE = DateTime.Now; entity.EDITUSERID = entity.CREATEUSERID; entity.EDITUSERNAME = entity.CREATEUSERNAME; entity.EDITCOMPANYID = entity.CREATECOMPANYID; entity.EDITDEPARTMENTID = entity.CREATEDEPARTMENTID; entity.EDITPOSTID = entity.CREATEPOSTID; entity.CHECKSTATE = "6"; entity.STATECODE = "ReSubmit"; entity.FLAG = "1"; AddFlowRecord2(con, entity); FLOW_FLOWRECORDMASTER_TDAL.Update(entity.FLOW_FLOWRECORDMASTER_T); #endregion } //System.Threading.Thread.Sleep(1000); string stateCode = NextStateCode == "" ? SMTWorkFlowManage.GetNextState(workflowRuntime, instance, entity.STATECODE) : NextStateCode; tmpDataResult.AppState = stateCode; if (stateCode != "EndFlow") { #region dictUserInfo.Values.ToList().ForEach(users => { users.ForEach(user => { #region FLOW_FLOWRECORDDETAIL_T entity2 = new FLOW_FLOWRECORDDETAIL_T(); entity2.FLOWRECORDDETAILID = Guid.NewGuid().ToString(); entity2.FLOW_FLOWRECORDMASTER_T = entity.FLOW_FLOWRECORDMASTER_T; entity2.STATECODE = stateCode; entity2.PARENTSTATEID = entity.FLOWRECORDDETAILID;//entity.StateCode; entity2.FLAG = "0"; entity2.CHECKSTATE = "2"; entity2.CREATEPOSTID = entity.CREATEPOSTID; entity2.CREATECOMPANYID = entity.CREATECOMPANYID; entity2.CREATEDEPARTMENTID = entity.CREATEDEPARTMENTID; entity2.CREATEUSERID = entity.EDITUSERID; entity2.CREATEUSERNAME = entity.EDITUSERNAME; entity2.CREATEDATE = DateTime.Now; entity2.EDITUSERID = user.UserID; entity2.EDITUSERNAME = user.UserName; entity2.EDITCOMPANYID = user.CompanyID; entity2.EDITDEPARTMENTID = user.DepartmentID; entity2.EDITPOSTID = user.PostID; entity2.EDITDATE = DateTime.Now; if (dictAgentUserInfo.ContainsKey(user)) { entity2.AGENTUSERID = dictAgentUserInfo[user].UserID; entity2.AGENTERNAME = dictAgentUserInfo[user].UserName; entity2.AGENTEDITDATE = DateTime.Now; } AddFlowRecord2(con, entity2); #endregion }); }); #endregion tmpDataResult.AppState = stateCode; tmpDataResult.FlowResult = FlowResult.SUCCESS; tmpDataResult.CheckState = "1"; } else { tmpDataResult.CheckState = "2"; tmpDataResult.FlowResult = FlowResult.END; //如果没有下一处理节点,则返回END } tmpDataResult.IsCountersignComplete = true; return tmpDataResult; } catch (Exception ex) { LogHelper.WriteLog("DoFlowRecord_Add异常信息 :" + ex.ToString()); throw new Exception("DoFlowRecord_Add:" + ex.InnerException + ex.Message); //tmpDataResult.FlowResult = FlowResult.FAIL; //tmpDataResult.Err = ex.Message; //return tmpDataResult; } }