示例#1
0
        /// <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);
            }
        }
示例#2
0
        /// <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;
            }
        }
示例#3
0
        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;
            }
        }
示例#4
0
        /// <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);
            }
        }
示例#5
0
        /// <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);
            }
        }
示例#6
0
        /// <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);
            }
        }