/// <summary> /// 并行分支中最后一个分支做完后的处理 /// </summary> /// <param name="flowData"></param> void ReduceParallelNum(FlowData flowData) { try { var sql = string.Format(" select CurrentParallelCount from WF_Instance with (nolock) where InstanceID='{0}' ", flowData.WFInstance.ParentInstanceId); var num = DataHelper.ExecuteScalar(sql) == null ? 0 : Convert.ToInt32(DataHelper.ExecuteScalar(sql)); if (num == 1) //最后一个子流程分支,做完后驱动主流程 { var dealPersonInfo = new List<DealPersonInfo>(); //返回给主流程的处理人 sql = string.Format( " select top 1 TransactUserID , TransactUserName , TransactDepartmentID , TransactDepartmentName from WF_InstanceStates with (nolock) where InstanceID ='{0}' order by CompleteTime desc ", flowData.WFInstance.ParentInstanceId); var dt = DataHelper.ExecuteQuery(sql); if (dt != null && dt.Rows.Count > 0) { var dealpersonId = Guid.Parse(dt.Rows[0]["TransactUserID"].ToString()); var dealpersonName = dt.Rows[0]["TransactUserName"].ToString(); var dealdeptId = Guid.Parse(dt.Rows[0]["TransactDepartmentID"].ToString()); var dealdeptName = dt.Rows[0]["TransactDepartmentName"].ToString(); dealPersonInfo.Add(new DealPersonInfo(dealpersonId, dealpersonName, dealdeptId, dealdeptName)); //修改 Common.WriteAcletc(flowData.WFInstance.FormID, dealPersonInfo, Guid.Empty, flowData.WFInstance.ParentInstanceId, flowData.WFInstance.BusinessType, Guid.Empty); } sql = string.Format( " update WF_Instance set CurrentParallelCount=CurrentParallelCount-1 where InstanceID='{0}' ", flowData.WFInstance.ParentInstanceId); DataHelper.ExecuteNoneQuery(sql); Interfaces.DriveWorkFlowNew(flowData.WFInstance.FormID, dealPersonInfo[0].PersonId, dealPersonInfo[0].PersonName, dealPersonInfo[0].DeptId, dealPersonInfo[0].DeptName, Guid.Empty, string.Empty, dealPersonInfo); } else if (num > 1) { sql = string.Format( " update WF_Instance set CurrentParallelCount=CurrentParallelCount-1 where InstanceID='{0}' ", flowData.WFInstance.ParentInstanceId); DataHelper.ExecuteNoneQuery(sql); } } catch (Exception ex) { LogWritter.WriteSystemExceptionLog(ex); } }
/// <summary> /// 驱动并发的子流程 /// </summary> private static bool ParalleStateDealNew(WfInstanceEntity wfInstanceEntity, WfInstanceStatesEntity wfInstanceStatesEntity, List<DealPersonInfo> dealPersonInfo) { try { var sql = string.Format( " select WfInstanceId from WF_Messages with (nolock) where FormID='{0}' and ReceiveDeptId='{1}' and ReceiveUserId='{2}' and MessageType={3} ", wfInstanceEntity.FormID, wfInstanceStatesEntity.TransactDepartmentID, wfInstanceStatesEntity.TransactUserID, (int)EnumWfMessageType.WaitForDo); var instanceId = DataHelper.ExecuteScalar(sql) == null ? Guid.Empty : new Guid(DataHelper.ExecuteScalar(sql).ToString()); var sb = new StringBuilder(); if (dealPersonInfo != null && dealPersonInfo.Count > 0) { foreach (var personInfo in dealPersonInfo) { sb.Append(personInfo.PersonId + "," + personInfo.PersonName + "," + personInfo.DeptId + "," + personInfo.DeptName); sb.Append("$"); } } wfInstanceEntity.InstanceID = instanceId; wfInstanceStatesEntity.InstanceID = instanceId; var flowData = new FlowData { WFInstance = wfInstanceEntity, WfInstanceStates = wfInstanceStatesEntity, ParallelBranchesCount = 0, DealPersonInfo = sb.ToString() }; var inputParameter = new Dictionary<string, object> { {"FlowDataParm", flowData}, {"NextDeptType", ""}, { "DealWay", wfInstanceStatesEntity.WfDealWayId.ToString().ToUpper() } }; var cswfTemplateEntity = WfTemplateDataBusiness.GetWfTemplateDataByTemplateID(wfInstanceEntity.TemplateID); var activity = GetActivity(cswfTemplateEntity.TemplateData); var instance = new WorkflowApplication(activity); var instanceStore = new SqlWorkflowInstanceStore(DataHelper.CONNECTION_STRING); instanceStore.InstanceLockedExceptionAction = InstanceLockedExceptionAction.AggressiveRetry; instanceStore.HostLockRenewalPeriod = TimeSpan.FromSeconds(30); //解决再次load时lock的问题 instance.InstanceStore = instanceStore; instance.PersistableIdle = (waiea) => PersistableIdleAction.Unload; instance.Load(wfInstanceEntity.InstanceID); instance.ResumeBookmark("GetFlowData", inputParameter); return false; } catch (Exception ex) { LogWritter.WriteSystemExceptionLog(ex); throw ex; } }
private static void DriveWorkFlowNew(WfInstanceEntity wfInstanceEntity, WfInstanceStatesEntity wfInstanceStatesEntity, List<DealPersonInfo> dealPersonInfo, List<Guid> parallelDeptGuid) { try { var sb = new StringBuilder(); if (dealPersonInfo != null && dealPersonInfo.Count > 0) { foreach (var personInfo in dealPersonInfo) { sb.Append(personInfo.PersonId + "," + personInfo.PersonName + "," + personInfo.DeptId + "," + personInfo.DeptName); sb.Append("$"); } } var parallelBranchesCount = 0; if (wfInstanceEntity.CurrentStateType == (int)EnumWfStateType.Parllel) //并行状态处理 { if (dealPersonInfo != null && dealPersonInfo.Count > 0) { parallelBranchesCount = dealPersonInfo.Count; } } //var isContinueWf = true; //if (wfInstanceEntity.CurrentStateType == (int) EnumWfStateType.Parllel) //并行状态处理 //{ // isContinueWf = ParalleStateDealNew(wfInstanceEntity, wfInstanceStatesEntity, dealPersonInfo); //} //if (isContinueWf) //{ var flowData = new FlowData { WFInstance = wfInstanceEntity, WfInstanceStates = wfInstanceStatesEntity, ParallelBranchesCount = parallelBranchesCount, DealPersonInfo = sb.ToString() }; var inputParameter = new Dictionary<string, object> { {"FlowDataParm", flowData}, {"NextDeptType", ""}, { "DealWay", wfInstanceStatesEntity.WfDealWayId.ToString().ToUpper() } }; var cswfTemplateEntity = WfTemplateDataBusiness.GetWfTemplateDataByTemplateID(wfInstanceEntity.TemplateID); var activity = GetActivity(cswfTemplateEntity.TemplateData); var instance = new WorkflowApplication(activity); var instanceStore = new SqlWorkflowInstanceStore(Common.GetConnectString()); instanceStore.InstanceLockedExceptionAction = InstanceLockedExceptionAction.AggressiveRetry; instanceStore.HostLockRenewalPeriod = TimeSpan.FromSeconds(30); //解决再次load时lock的问题 instance.InstanceStore = instanceStore; instance.PersistableIdle = (waiea) => PersistableIdleAction.Unload; instance.Load(wfInstanceEntity.InstanceID); instance.ResumeBookmark("GetFlowData", inputParameter); // } } catch (InstanceLockedException lockedException) { LogWritter.WriteSystemExceptionLog(lockedException); } catch (Exception ex) { LogWritter.WriteSystemExceptionLog(ex); throw ex; } }
/// <summary> /// 根据指定模板启动工作流 /// </summary> private static void StartWorkFlow(Guid wfTemplateId, WfInstanceEntity wfInstance, WfInstanceStatesEntity wfInstanceStatesEntity, Guid parentWfInstaceId, string dealPersons) { try { var connectionString = DataHelper.CONNECTION_STRING; WorkflowApplication instance; var dealPersonInfo = dealPersons; var flowData = new FlowData() { WFInstance = wfInstance, WfInstanceStates = wfInstanceStatesEntity, DealPersonInfo = dealPersonInfo, ParallelBranchesCount = 0 }; var inputParameter = new Dictionary<string, object> { {"FlowDataParm", flowData}, {"NextDeptType", ""}, {"DealWay", wfInstanceStatesEntity.WfDealWayId.ToString().ToUpper()} }; instance = GetStartWorkflowApplicationInstanceByTemplateId(wfTemplateId, inputParameter); if (instance != null) { ((FlowData)inputParameter["FlowDataParm"]).WFInstance.InstanceID = instance.Id; ((FlowData)inputParameter["FlowDataParm"]).WfInstanceStates.InstanceID = instance.Id; ((FlowData)inputParameter["FlowDataParm"]).WFInstance.TemplateID = wfTemplateId; var instanceStore = new SqlWorkflowInstanceStore(connectionString); InstanceView view = instanceStore.Execute(instanceStore.CreateInstanceHandle(), new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30)); instanceStore.DefaultInstanceOwner = view.InstanceOwner; instance.InstanceStore = instanceStore; instance.PersistableIdle = (waiea) => PersistableIdleAction.Unload; // instance.Aborted += InstanceAborted; if (parentWfInstaceId != Guid.Empty) //写流程实例关系表 { //WriteWfInstanceRelation(parentWfInstaceId,instance.Id,wfInstance.FormID); ((FlowData)inputParameter["FlowDataParm"]).WFInstance.ParentInstanceId = parentWfInstaceId; } instance.Run(); } else { throw new Exception("未找到对应的流程模板!请与系统管理员联系。"); } } catch (Exception ex) { LogWritter.WriteSystemExceptionLog(ex); throw new Exception("生成流程异常:" + ex.Message, ex.InnerException); } }
/// <summary> /// 根据指定模板启动工作流 /// </summary> private static void StartWorkFlow(Guid wfTemplateId, WfInstanceEntity wfInstance, WfInstanceStatesEntity wfInstanceStatesEntity) { try { var connectionString = Common.GetConnectString(); WorkflowApplication instance; var flowData = new FlowData() { WFInstance = wfInstance, WfInstanceStates = wfInstanceStatesEntity }; var inputParameter = new Dictionary<string, object> { {"FlowDataParm", flowData}, {"NextDeptType", ""}, {"DealWay", wfInstanceStatesEntity.WfDealWayId.ToString().ToUpper()} }; instance = GetStartWorkflowApplicationInstanceByTemplateId(wfTemplateId, inputParameter); if (instance != null) { ((FlowData)inputParameter["FlowDataParm"]).WFInstance.InstanceID = instance.Id; ((FlowData)inputParameter["FlowDataParm"]).WfInstanceStates.InstanceID = instance.Id; ((FlowData)inputParameter["FlowDataParm"]).WFInstance.TemplateID = wfTemplateId; var instanceStore = new SqlWorkflowInstanceStore(connectionString); InstanceView view = instanceStore.Execute(instanceStore.CreateInstanceHandle(), new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30)); instanceStore.DefaultInstanceOwner = view.InstanceOwner; instance.InstanceStore = instanceStore; instance.PersistableIdle = (waiea) => PersistableIdleAction.Unload; // instance.Aborted += InstanceAborted; instance.Run(); } else { throw new Exception("未找到对应的流程模板!请与系统管理员联系。"); } } catch (Exception ex) { LogWritter.WriteSystemExceptionLog(ex); throw new Exception("生成流程异常:" + ex.Message, ex.InnerException); } }
/// <summary> /// /// </summary> private static void DriveWorkFlowofChange(WfInstanceEntity wfInstanceEntity, WfInstanceStatesEntity wfInstanceStatesEntity) { var sql = string.Format(" select count(FormId) from WF_ModifyStatesInstance where FormId='{0}' and ExcuteState<>{1} ", wfInstanceEntity.FormID, (int)ExcuteState.Excuted); if (Convert.ToInt32(DataHelper.ExecuteScalar(sql)) > 0) { //var stateId = GetCurrentState(wfInstanceEntity.FormID); var res = WfModifyStatesInstanceBusiness.Deal(wfInstanceEntity.FormID.ToString(), wfInstanceStatesEntity.WfDealWayId.ToString(), wfInstanceStatesEntity.TransactUserID.ToString(), wfInstanceStatesEntity.StateDescription); var result = DataHelper.ExecuteScalar(sql); //所有状态都执行完了,继续主工作流程 if (res == 0 || Convert.ToInt32(result) == 0) { var flowData = new FlowData { WFInstance = wfInstanceEntity, WfInstanceStates = wfInstanceStatesEntity }; var inputParameter = new Dictionary<string, object> { {"FlowDataParm", flowData}, {"NextDeptType", ""}, {"DealWay", wfInstanceStatesEntity.WfDealWayId.ToString().ToUpper()} }; var cswfTemplateEntity = WfTemplateDataBusiness.GetWfTemplateDataByTemplateID(wfInstanceEntity.TemplateID); var activity = GetActivity(cswfTemplateEntity.TemplateData); var instance = new WorkflowApplication(activity); var instanceStore = new SqlWorkflowInstanceStore(Common.GetConnectString()); instanceStore.InstanceLockedExceptionAction = InstanceLockedExceptionAction.AggressiveRetry; instanceStore.HostLockRenewalPeriod = TimeSpan.FromSeconds(30); //解决再次load时lock的问题 instance.InstanceStore = instanceStore; instance.PersistableIdle = (waiea) => PersistableIdleAction.Unload; instance.Load(wfInstanceEntity.InstanceID); instance.ResumeBookmark("GetFlowData", inputParameter); } } else //按照原来的处理方式处理 { var flowData = new FlowData { WFInstance = wfInstanceEntity, WfInstanceStates = wfInstanceStatesEntity }; var inputParameter = new Dictionary<string, object> { {"FlowDataParm", flowData}, {"NextDeptType", ""}, {"DealWay", wfInstanceStatesEntity.WfDealWayId.ToString().ToUpper()} }; var cswfTemplateEntity = WfTemplateDataBusiness.GetWfTemplateDataByTemplateID(wfInstanceEntity.TemplateID); var activity = GetActivity(cswfTemplateEntity.TemplateData); var instance = new WorkflowApplication(activity); var instanceStore = new SqlWorkflowInstanceStore(Common.GetConnectString()); instanceStore.InstanceLockedExceptionAction = InstanceLockedExceptionAction.AggressiveRetry; instanceStore.HostLockRenewalPeriod = TimeSpan.FromSeconds(30); //解决再次load时lock的问题 instance.InstanceStore = instanceStore; instance.PersistableIdle = (waiea) => PersistableIdleAction.Unload; instance.Load(wfInstanceEntity.InstanceID); instance.ResumeBookmark("GetFlowData", inputParameter); } }