示例#1
0
文件: Engine.cs 项目: bertyang/Mobile
        /// <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();
            }
        }
示例#2
0
文件: Engine.cs 项目: bertyang/Mobile
        /// <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);
                }
            }
        }