Ejemplo n.º 1
0
        /// <summary>
        /// 撤回流程
        /// </summary>
        /// <param name="flowInstId">流程实例Id</param>
        /// <returns></returns>
        public bool RecallFlow(int flowId, int flowNo, string remark)
        {
            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions()
            {
                IsolationLevel = IsolationLevel.ReadCommitted
            }))
            {
                try
                {
                    FlowInstance instFlow = new FlowInstance(flowId, flowNo);

                    if (instFlow.Status != FlowInstanceState.Active)
                    {
                        return(false);
                    }

                    instFlow.Recall(remark);

                    scope.Complete();

                    //HttpContext.Current.Session.Abandon();
                }
                catch (Exception ex)
                {
                    Log4Net.LogError("Workflow_Engine", string.Format("flowId:{0},flowNo:{1},Message:{2}", flowId, flowNo, ex.ToString()));

                    return(false);;
                }

                return(true);
            }
        }
Ejemplo n.º 2
0
        public ActivityInstance(int id)
        {
            m_ActivityInstanceId = id;

            F_INST_ACTIVITY activityInst = DAL.WorkFlow.ActivityInstance.Get(this.ID);

            m_FlowInstance = new FlowInstance(activityInst.FlowInstID);

            m_Activity = new Activity(activityInst.ActivityID);

            m_State = activityInst.State;
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 申请工作流内部表单
        /// </summary>
        /// <param name="flowId">流程id</param>
        /// <param name="applyerId">申请人id</param>
        /// <returns>流程实例id,开始关卡实例id,流程号</returns>
        public void ApplyInnerFlow(int flowId, ref int flowNo, int applyerId, string formDigest, out Dictionary <string, string> param)
        {
            using (TransactionScope scope = new TransactionScope())
            {
                param = new Dictionary <string, string>();

                if (flowNo == 0)
                {
                    flowNo = CreateFlowNo(flowId);
                }

                //创建流程实例
                FlowInstance     flowInst     = new FlowInstance();
                ActivityInstance activityInst = new ActivityInstance();

                if (FlowInstance.Exists(flowId, flowNo))
                {
                    flowInst = new FlowInstance(flowId, flowNo);
                    flowInst.UpdateDigest(formDigest);
                    Activity startActvity = flowInst.FlowDefine.GetStartActivity();
                    activityInst = flowInst.FindActivityInstance(ActivityType.START);

                    WorkItemInstance item = new WorkItemInstance();
                    item.CreateResend(activityInst.ID, flowInst.ApplerID, "");
                }
                else
                {
                    flowInst.Create(flowId, flowNo, applyerId, formDigest);
                    activityInst.Create(flowInst.ID, flowInst.FlowDefine.GetStartActivity().ID);
                    activityInst.Active();
                }

                //返回流程实例id,开始关卡实例id,流程号
                param.Add("FlowInstId", flowInst.ID.ToString());
                param.Add("ActivityInstId", activityInst.ID.ToString());
                param.Add("SplitType", flowInst.FlowDefine.GetStartActivity().SplitType);

                scope.Complete();
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 转交一下步
        /// </summary>
        /// <param name="flowInstId">流程实例id</param>
        /// <param name="listToActivityId">下一步关卡list</param>
        /// <returns>是否成功</returns>
        public bool TransferBack(int activityInstId, List <int> listToActivityId)
        {
            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions()
            {
                IsolationLevel = IsolationLevel.ReadCommitted
            }))
            {
                try
                {
                    //初始化变量
                    ActivityInstance instActivity = new ActivityInstance(activityInstId);

                    FlowInstance instFlow = instActivity.FlowInstance;

                    instActivity.Close();


                    //实例化后面的关卡
                    foreach (int activityId in listToActivityId)
                    {
                        //检查关卡是否被实例化过
                        ActivityInstance instToActivity = instFlow.FindActivityInstance(activityId);

                        if (instToActivity == null || instToActivity.State == ActivityInstanceStatus.Completed)
                        {
                            instToActivity = new ActivityInstance();

                            instToActivity.Create(instFlow.ID, activityId);
                        }

                        //检查前置关卡完成情况
                        if (instToActivity.CheckFrontActivityState())
                        {
                            //如果是结束关卡,关闭关卡实例
                            if (instToActivity.Activity.Type == ActivityType.END)
                            {
                                instFlow.ApprovePass += new FlowInstance.ApproveEventHandler(Mail.SendMail);

                                instFlow.ApprovePass += new FlowInstance.ApproveEventHandler(CallBack.Update);

                                instToActivity.Close();

                                instFlow.Pass();
                            }

                            //如果不是结束关卡,激活关卡并分配工作
                            else
                            {
                                instToActivity.Active();

                                instToActivity.AssignWork();
                            }

                            //关闭与前置关卡平行的关卡
                            List <ActivityInstance> listParallelActivity =
                                instFlow.ActivityInstances.Where(
                                    t => t.State == ActivityInstanceStatus.Active &&
                                    t.Activity.ID != instToActivity.Activity.ID).ToList();

                            foreach (ActivityInstance p in listParallelActivity)
                            {
                                p.Close();
                            }
                        }
                        else
                        {
                            instToActivity.Pending(); //前置关卡未完成,搁置状态
                        }
                    }


                    if (instActivity.Activity.Type == ActivityType.START)
                    {
                        instFlow.Active();

                        //调用表单申请Action
                        FlowAction <IApply> flowAction = new FlowAction <IApply>(instFlow.FlowDefine.IsInner, instFlow.FlowDefine.ID);

                        if (flowAction.action != null)
                        {
                            if (!flowAction.action.ApplyAction(instFlow.FlowDefine.ID, instFlow.FlowNo, instFlow.ApplerID))
                            {
                                throw new Exception(string.Format("ApplyAction失败,flowId:{0},flowNo:{1},ApplerID:{2}", instFlow.FlowDefine.ID, instFlow.FlowNo, instFlow.ApplerID));
                            }
                        }

                        //知会
                        List <F_FLOW_CONFIG> listConfig = DAL.WorkFlow.Flow.GetFlowConfig(instFlow.FlowDefine.ID, "Notice");

                        List <int> listWorkerId = new List <int>();

                        foreach (F_FLOW_CONFIG config in listConfig)
                        {
                            listWorkerId.Add(int.Parse(config.ItemValue));
                        }

                        new Flow().Notify(instFlow.FlowDefine.ID, instFlow.FlowNo, listWorkerId);
                    }

                    scope.Complete();

                    return(true);
                }
                catch (Exception ex)
                {
                    Log4Net.LogError("Workflow_Engine", string.Format("ActivityInstId:{0},Message:{1}", activityInstId, ex.ToString()));

                    return(false);
                }
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 签核
        /// </summary>
        /// <param name="workItemId">任务ID</param>
        /// <param name="approveValue">签核值:Y同意;N:否决</param>
        /// <param name="approveRemark">签核意见</param>
        /// <param name="transferNext">是否判断转到哪个下一关卡</param>
        /// <returns>成功与否</returns>
        public bool Approve(int workItemId, int approverId, string approveValue,
                            string approveRemark, string nextActivityId)
        {
            //防止重复点击
            //if (Convert.ToString(HttpContext.Current.Session[approverId.ToString()]) == string.Format("WorkItemId:{0}", workItemId))
            //{
            //    return false;
            //}
            //else
            //{
            //    HttpContext.Current.Session[approverId.ToString()] = string.Format("WorkItemId:{0}", workItemId);
            //}


            lock (lockObj)
            {
                using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions()
                {
                    IsolationLevel = IsolationLevel.ReadCommitted
                }))
                {
                    try
                    {
                        WorkItemInstance instWorkItem = new WorkItemInstance(workItemId);
                        FlowInstance     instFlow     = instWorkItem.ActivityInstance.FlowInstance;
                        ActivityInstance instActivity = instWorkItem.ActivityInstance;

                        //验证数字摘要
                        if (!instFlow.VerifyDigest())
                        {
                            Log4Net.LogError("Workflow_Engine", string.Format("WorkItemID:{0},Message:表单数据变化,无法签核", workItemId));

                            return(false);
                        }

                        //数字签名
                        if (instActivity.Activity.IsSign.ToUpper() == "Y")
                        {
                            instWorkItem.Sign();
                        }

                        //更新工作实例状态
                        instWorkItem.Actorid   = approverId;
                        instWorkItem.AppValue  = approveValue;
                        instWorkItem.AppRemark = approveRemark;
                        instWorkItem.Approve();

                        //否决关闭所有对象
                        if (approveValue == WorkItemAppValue.Reject)
                        {
                            instFlow.ApproveReject += new FlowInstance.ApproveEventHandler(Mail.SendMail);
                            instFlow.ApproveReject += new FlowInstance.ApproveEventHandler(CallBack.Update);

                            Activity endActivity = instFlow.FlowDefine.Activitys.SingleOrDefault(t => t.Type == "end");

                            if (endActivity != null && endActivity.IsSms.ToUpper() == "Y")
                            {
                                instFlow.ApproveReject += new FlowInstance.ApproveEventHandler(Sms.SendSms);
                            }

                            instActivity.Close();
                            instFlow.Reject();

                            //关闭平行关卡
                            List <ActivityInstance> listParallelActivity =
                                instFlow.ActivityInstances.Where(
                                    t => t.State == ActivityInstanceStatus.Active).ToList();

                            foreach (ActivityInstance p in listParallelActivity)
                            {
                                p.Close();
                            }
                        }
                        else if (approveValue == WorkItemAppValue.Return)
                        {
                            //关闭当间关卡实例
                            instActivity.Close();

                            //创建退回关卡实例
                            ActivityInstance instReturnActivity = new ActivityInstance();

                            instReturnActivity.Create(instFlow.ID, int.Parse(nextActivityId));

                            instReturnActivity.Active();

                            instReturnActivity.AssignWork();
                        }
                        else if (approveValue == WorkItemAppValue.Agree)
                        {
                            if (!string.IsNullOrEmpty(nextActivityId))
                            {
                                string[] arrActivityId = nextActivityId.TrimEnd(',').Split(',');

                                List <int> listActivityId = new List <int>();

                                foreach (string id in arrActivityId)
                                {
                                    listActivityId.Add(int.Parse(id));
                                }

                                if (!TransferBack(instWorkItem.ActivityInstance.ID, listActivityId))
                                {
                                    return(false);
                                }
                            }
                        }
                        else if (approveValue == WorkItemAppValue.Reserve)
                        {
                            WorkItemInstance item = new WorkItemInstance();
                            item.Create(instActivity.ID, approverId);
                        }

                        scope.Complete();

                        return(true);
                    }
                    catch (Exception ex)
                    {
                        Log4Net.LogError("Workflow_Engine", string.Format("WorkItemID:{0},Message:{1}", workItemId, ex.ToString()));

                        return(false);
                    }
                }
            }
        }