Exemplo n.º 1
0
 public static void SureMinPassNum(this SysActivity activity)
 {
     if (!activity.MinPassNum.HasValue)
     {
         activity.MinPassNum = 1;
     }
 }
Exemplo n.º 2
0
 public static void SureMinPassRatio(this SysActivity activity)
 {
     if (!activity.MinPassRatio.HasValue)
     {
         activity.MinPassRatio = 100.0;
     }
 }
Exemplo n.º 3
0
 public static void SurePassType(this SysActivity activity)
 {
     if (!activity.PassType.HasValue)
     {
         activity.PassType = 0;
     }
 }
Exemplo n.º 4
0
        public List <SysActivity> GetNextActivityList(string processName)
        {
            List <SysActivity> list2;

            try
            {
                List <SysActivity> list         = new List <SysActivity>();
                SysProcess         processCache = this._processCache.GetProcessCache(processName);
                if (processCache == null)
                {
                    throw new ApplicationException(string.Format("流程名称[{0}]不正确", processName));
                }
                SysActivity activity = processCache.Activities.FirstOrDefault <SysActivity>(p => p.ActivityType == 1);
                if (activity != null)
                {
                    list = (from p in activity.FromTransitions select p.PostActivity).ToList <SysActivity>();
                }
                list2 = list;
            }
            catch (Exception exception)
            {
                AppLogHelper.Error(string.Format("GetNextActivityList,processName=[{0}]失败", processName), exception);
                throw exception;
            }
            return(list2);
        }
        public override void Execute(Queue <WorkflowMessage> queue)
        {
            this.JustCompleteCurrentAI();
            SysActivity activity = this.AI.Activity;
            SysProcess  process  = activity.Process;

            if (activity.ActivityType == 3)
            {
                this.CompleteNormalActivity(queue, process, activity);
            }
            else if (activity.ActivityType == 1)
            {
                this.CompleteStartActivity(queue, process, activity);
            }
            else if (activity.ActivityType == 2)
            {
                this.CompleteDecisionActivity(queue, process, activity);
            }
            else if (activity.ActivityType == 4)
            {
                this.CompleteEndActivity(queue, process, activity);
            }
            else
            {
                if (activity.ActivityType != 6)
                {
                    throw new ApplicationException("未知的活动类型");
                }
                this.CompleteApproveActivity(queue, process, activity);
            }
        }
        public string GetWorkItemCompletePageUrl(SysWorkItem wi, SysProcessInstance pi, SysActivityInstance ai, bool isRelative = true)
        {
            string str3;

            try
            {
                SysActivity activity = ai.Activity;
                if (activity == null)
                {
                    throw new ApplicationException(string.Format("活动实例:{0}找不到对应活动", ai.ActivityInstanceId));
                }
                if (pi.Process.ProcessCategory == 2)
                {
                    return(string.Format("../FormWorkflow/FormInstanceApprove.aspx?id={0}", wi.WorkItemId));
                }
                long?   pageid = activity.PageId;
                SysPage page   = pi.Process.ProcessEntity.Pages.FirstOrDefault <SysPage>(p => p.ControlId == pageid);
                if (page == null)
                {
                    throw new ApplicationException(string.Format("活动:{0}找不到对应页面", activity.ActivityId));
                }
                if (!isRelative)
                {
                    return(string.Format("{0}_{1}/{2}.aspx?id={3}", new object[] { page.OwnerEntity.OwnerModule.EntityCategory.CategoryName, page.OwnerEntity.OwnerModule.ModuleName, page.PageName, wi.WorkItemId }));
                }
                str3 = string.Format("../{0}_{1}/{2}.aspx?id={3}", new object[] { page.OwnerEntity.OwnerModule.EntityCategory.CategoryName, page.OwnerEntity.OwnerModule.ModuleName, page.PageName, wi.WorkItemId });
            }
            catch (Exception exception)
            {
                throw exception;
            }
            return(str3);
        }
 private bool CanCancel()
 {
     if (base.PI.InstanceStatus == 10)
     {
         return(false);
     }
     foreach (SysActivityInstance instance in base.PI.ActivityInstances)
     {
         SysActivity activity = instance.Activity;
         if (activity == null)
         {
             throw new ApplicationException("活动为空");
         }
         if ((activity.ActivityType != 2) && (instance.InstanceStatus == 10))
         {
             if (activity.ExecType == 1)
             {
                 if (!string.IsNullOrEmpty(activity.JScriptText))
                 {
                     return(false);
                 }
             }
             else
             {
                 return(false);
             }
         }
     }
     return(true);
 }
        public string GetWorkItemDisplayText(SysWorkItem wi, SysProcessInstance pi, SysActivityInstance ai)
        {
            string str6;

            try
            {
                SysActivity activity = ai.Activity;
                if (activity == null)
                {
                    throw new ApplicationException(string.Format("活动实例:{0}找不到对应活动", ai.ActivityInstanceId));
                }
                SysProcess process = pi.Process;
                if (process == null)
                {
                    throw new ApplicationException(string.Format("活动:{0}找不到对应流程", activity.ActivityId));
                }
                string activityName = activity.ActivityName;
                string processName  = process.ProcessName;
                if (process.ProcessCategory == 2)
                {
                    return(string.Format("[{0}][{1}]{2}", processName, activityName, pi.FormInstance.FormTitle));
                }
                EntityCache cache             = new EntityCache(this._manager);
                SysEntity   processEntity     = process.ProcessEntity;
                string      objectDisplayName = cache.GetObjectDisplayName(processEntity, wi.RelativeObjectId.Value);
                str6 = string.Format("[{0}][{1}]{2}", processName, activityName, objectDisplayName);
            }
            catch (Exception exception)
            {
                throw exception;
            }
            return(str6);
        }
Exemplo n.º 9
0
        public override void Execute(Queue <WorkflowMessage> queue)
        {
            base.JustCompleteCurrentAI();
            SysActivity         postActivity = base.PI.Process.Activities.FirstOrDefault <SysActivity>(p => p.ActivityId == this._nextActivityId);
            SysActivityInstance ai           = base.CreatePostActivityInstance(base.PI, postActivity);
            WorkflowMessage     item         = base.Engine.NewActivityInstanceCreatedMessage(ai);

            queue.Enqueue(item);
        }
        private void LoadActivityOperation(SysActivityOperation ao, SysActivity a)
        {
            ao.Activity = a;
            string condition = string.Format("OperationId = {0}", ao.OperationId);

            ao.ActivitySteps = this._context.Where <SysActivityStep>(condition, new DbParameter[0]);
            foreach (SysActivityStep step in ao.ActivitySteps)
            {
                step.ActivityOperation = ao;
            }
        }
        private string GetActivityParticipant(SysActivity a)
        {
            var source = from ap in this.DataHelper.Set <SysActivityParticipant>()
                         join pp in this.DataHelper.Set <SysProcessParticipant>()
                         on ap.ParticipantId equals pp.ParticipantId
                         where ap.ActivityId == a.ActivityId
                         select pp.ParticipantName;
            string result = string.Join("、", source.ToList());

            return(result);
        }
        private SysActivityInstance CreatePostAcitivtyInstance(SysProcessInstance pi, SysTransition tran)
        {
            if (!tran.PostActivityId.HasValue)
            {
                throw new ApplicationException("后续活动为空");
            }
            SysActivity         postActivity = pi.Process.Activities.FirstOrDefault <SysActivity>(p => p.ActivityId == tran.PostActivityId.Value);
            SysActivityInstance postAi       = this.CreatePostActivityInstance(pi, postActivity);

            this.CreateTransitionInstance(postAi, tran);
            return(postAi);
        }
 private void LoadActivityParticipant(SysActivityParticipant ap, SysActivity a, SysProcess p)
 {
     ap.Activity             = a;
     ap.ActivityApproveGroup = this._context.FindById <SysActivityApproveGroup>(new object[] { ap.ActivityApproveGroupId });
     if (ap.ActivityApproveGroup != null)
     {
         string condition = string.Format("ActivityApproveGroupId = {0}", ap.ActivityApproveGroup.ActivityApproveGroupId);
         ap.ActivityApproveGroup.Activity             = a;
         ap.ActivityApproveGroup.ActivityParticipants = this._context.Where <SysActivityParticipant>(condition, new DbParameter[0]);
     }
     ap.ProcessParticipant = p.ProcessParticipants.FirstOrDefault <SysProcessParticipant>(i => i.ParticipantId == ap.ParticipantId);
 }
        /// <summary>
        /// 绑定活动列表(只显示审核活动)
        /// </summary>
        private void BindActivityList()
        {
            var source = from a in this.DataHelper.Set <SysActivity>()
                         where a.ProcessId == this.ProcessId &&
                         a.ActivityType == (int)ActivityType.Approve
                         orderby a.DisplayOrder
                         select new
            {
                a.DisplayOrder,
                a.ActivityId,
                a.ActivityName,
                SelectClass = a.ActivityId == this.SelectedActivityId ? "selected" : "unselected",
            };

            this.rActivity.DataSource = source.ToList();
            this.rActivity.DataBind();

            //驳回方式
            this.ccRejectType.DataSource = typeof(FormProcessActivityRejectType);
            this.ccRejectType.DataBind();

            //驳回目标活动(只能选当前活动上面的的审核活动)
            this.ccRejectTargetActivity.DataSource = source.Where(p => p.DisplayOrder < this.SelectedActivity.DisplayOrder).ToList();
            this.ccRejectTargetActivity.DataBind();

            //找到当前活动驳回指向的活动
            this.divRejectTargetActivity.Visible = false;
            SysTransition t = this.DataHelper.Set <SysTransition>()
                              .Where(p => p.PreActivityId == this.SelectedActivityId && p.Direction == (int)FlowStepDirection.False).FirstOrDefault();

            if (t == null)
            {
                this.ccRejectType.SelectedValue = ((int)FormProcessActivityRejectType.SelectActivityWhenRunning).ToString();
            }
            else
            {
                SysActivity target = this.DataHelper.FindById <SysActivity>(t.PostActivityId);
                if (target.ActivityType == (int)ActivityType.End)
                {
                    this.ccRejectType.SelectedValue = ((int)FormProcessActivityRejectType.EndActivity).ToString();
                }
                else
                {
                    this.ccRejectType.SelectedValue           = ((int)FormProcessActivityRejectType.SelectActivity).ToString();
                    this.ccRejectTargetActivity.SelectedValue = target.ActivityId.ToString();
                    this.divRejectTargetActivity.Visible      = true;
                }
            }
        }
        /// <summary>
        /// 选中某个活动
        /// </summary>
        /// <param name="activity"></param>
        private void SelectActivity(SysActivity activity)
        {
            if (activity == null)
            {
                throw new Exception("选择的活动不存在");
            }

            this.SelectedActivity = activity;
            this.hc.Value         = activity.ActivityId.ToString();

            //重新绑定活动列表(更新选中状态)
            BindActivityList();

            //重新绑定表单字段
            BindFormField();
        }
        private SysActivityInstance CreateActivityInstance(SysProcessInstance pi, SysActivity act)
        {
            SysActivityInstance ai = new SysActivityInstance {
                ActivityId            = new long?(act.ActivityId),
                ActivityInstanceId    = base.Manager.GetNextIdentity(),
                EndTime               = null,
                ExpressionValue       = null,
                InstanceStatus        = 0,
                ProcessInstanceId     = new int?(pi.ProcessInstanceId),
                StartTime             = new DateTime?(DateTime.Now),
                WwfActivityInstanceId = null
            };

            base.PICacheFactory.AddActivityInstance(pi, ai);
            return(ai);
        }
        private void CalDecisionValue()
        {
            SysActivity activity = this.AI.Activity;

            if ((activity.Expressions == null) || (activity.Expressions.Count == 0))
            {
                throw new ApplicationException("活动没有表达式");
            }
            if (!activity.ExpressionId.HasValue)
            {
                throw new ApplicationException("未指定活动的表达式");
            }
            SysExpression expr = activity.Expressions.FirstOrDefault <SysExpression>(e => e.ExpressionId == activity.ExpressionId.Value);

            if (expr == null)
            {
                throw new ApplicationException("指定的表达式不在活动的表达式中");
            }
            Queue <SysExpression> calOrder = ExpressionHelper.GetCalOrder(activity.Expressions.ToList <SysExpression>());

            if (calOrder.Count <SysExpression>(p => (p.ExpressionId == expr.ExpressionId)) <= 0)
            {
                throw new ApplicationException("无法计算表达式的值");
            }
            EntityCache     cache  = new EntityCache(base.Manager);
            ExpressionCache cache2 = new ExpressionCache();

            while (calOrder.Count > 0)
            {
                SysExpression expression = calOrder.Dequeue();
                object        obj2       = ExpressionHelper.GetHelper(expression).GetValue(expression, cache, cache2, base.PI, this.AI);
                if (expression.ExpressionId == expr.ExpressionId)
                {
                    if (obj2 == null)
                    {
                        throw new ApplicationException("决策活动的值返回null");
                    }
                    if (obj2.GetType() != typeof(bool))
                    {
                        throw new ApplicationException("决策活动的值不是布尔类型");
                    }
                    this.AI.ExpressionValue = new int?(Convert.ToInt32(obj2));
                    return;
                }
            }
        }
        /// <summary>
        /// 选中某个活动
        /// </summary>
        /// <param name="activity"></param>
        private void SelectActivity(SysActivity activity)
        {
            if (activity == null)
            {
                throw new Exception("选择的活动不存在");
            }

            this.SelectedActivity = activity;
            this.hc.Value         = activity.ActivityId.ToString();

            this.txtActivityName.Text = activity.ActivityName;

            //绑定活动参与人列表
            BindActivityParticipant();

            //重新绑定活动列表(更新选中状态)
            BindActivityList();
        }
        public SysProcess GetProcessCacheByActivity(long activityId, out SysActivity activity)
        {
            Func <SysActivity, bool> predicate = null;
            SysActivity activity2 = this._context.FindById <SysActivity>(new object[] { activityId });

            if ((activity2 == null) || !activity2.ProcessId.HasValue)
            {
                throw new ApplicationException("活动ID不正确");
            }
            SysProcess processCache = this.GetProcessCache(activity2.ProcessId.Value);

            if (predicate == null)
            {
                predicate = p => p.ActivityId == activityId;
            }
            activity = processCache.Activities.FirstOrDefault <SysActivity>(predicate);
            return(processCache);
        }
 private void ExecuteForAuto(SysActivity activity, SysProcess process)
 {
     foreach (SysActivityOperation operation in
              (from a in activity.ActivityOperations.Where <SysActivityOperation>(delegate(SysActivityOperation p)
     {
         long?activityId = p.ActivityId;
         long num = activity.ActivityId;
         return((activityId.GetValueOrDefault() == num) && activityId.HasValue);
     })
               orderby a.OperationId
               select a).ToList <SysActivityOperation>())
     {
         if (operation.OperationType != 2)
         {
             throw new ApplicationException("目前只支持Python脚本");
         }
         base.Manager.ExecutePython(base.PI, operation.JScriptText);
     }
 }
        public override void Execute(Queue <WorkflowMessage> queue)
        {
            SysActivity activity = this.AI.Activity;
            SysProcess  process  = activity.Process;

            if (((activity.ActivityType == 3) || (activity.ActivityType == 1)) || (activity.ActivityType == 6))
            {
                if (activity.ExecType == 0)
                {
                    new ActivityRemindHandler(base.PICacheFactory, base.PI, this.AI, ActivityRemindUseTimeType.ActivityStart, null, null).Execute();
                    this.ExecuteForManual(activity, process, queue);
                }
                else
                {
                    if (activity.ExecType != 1)
                    {
                        throw new ApplicationException("未知的活动执行类型");
                    }
                    base.Manager.ExecutePython(base.PI, activity.JScriptText);
                    this.ExecuteForAuto(activity, process);
                    WorkflowMessage item = base.Engine.NewCompleteActivityMessage(this.AI);
                    queue.Enqueue(item);
                }
            }
            else if (activity.ActivityType == 2)
            {
                this.CopyActivityInstanceData();
                this.CalDecisionValue();
                WorkflowMessage message2 = base.Engine.NewCompleteActivityMessage(this.AI);
                queue.Enqueue(message2);
            }
            else
            {
                if (activity.ActivityType != 4)
                {
                    throw new ApplicationException("未知活动类型");
                }
                base.Manager.ExecutePython(base.PI, activity.JScriptText);
                this.ExecuteForAuto(activity, process);
                WorkflowMessage message3 = base.Engine.NewCompleteActivityMessage(this.AI);
                queue.Enqueue(message3);
            }
        }
        /// <summary>
        /// 连接两个活动
        /// </summary>
        private void ConnectActivity(BizDataContext db, SysActivity prev, SysActivity post, FlowStepDirection direction)
        {
            SysTransition t = new SysTransition()
            {
                TransitionId   = db.GetNextIdentity(),
                PreActivityId  = prev.ActivityId,
                PostActivityId = post.ActivityId,
                ProcessId      = this.ProcessId,
                Direction      = (int)direction,
            };

            switch (direction)
            {
            case FlowStepDirection.False: t.DisplayText = "驳回"; break;

            case FlowStepDirection.True: t.DisplayText = "通过"; break;

            default: break;
            }
            db.Insert(t);
        }
Exemplo n.º 23
0
        public override void Execute(Queue <WorkflowMessage> queue)
        {
            SysProcess process = base.PI.Process;

            if ((process.Activities == null) || (process.Activities.Count == 0))
            {
                throw new ApplicationException("没有任何活动");
            }
            SysActivity act = process.Activities.FirstOrDefault <SysActivity>(a => a.ActivityType == 1);

            if (act == null)
            {
                throw new ApplicationException("没有开始活动");
            }
            SysActivityInstance ai = this.CreateActivityInstance(base.PI, act);

            new ProcessRemindHandler(base.PICacheFactory, base.PI, ai, ProcessRemindUseTimeType.ProcessStart).Execute();
            WorkflowMessage item = base.Engine.NewActivityInstanceCreatedMessage(ai);

            queue.Enqueue(item);
        }
        private void LoadActivityRemind(SysActivityRemind ar, SysActivity a, SysProcess p)
        {
            ar.Activity = a;
            string condition = string.Format("RemindId = {0}", ar.RemindId);

            ar.RemindParticipants = this._context.Where <SysActivityRemindParticipant>(condition, new DbParameter[0]);
            using (IEnumerator <SysActivityRemindParticipant> enumerator = ar.RemindParticipants.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    Func <SysProcessParticipant, bool> predicate = null;
                    SysActivityRemindParticipant       arp       = enumerator.Current;
                    arp.Remind = ar;
                    if (predicate == null)
                    {
                        predicate = i => i.ParticipantId == arp.ParticipantId;
                    }
                    arp.Participant    = p.ProcessParticipants.FirstOrDefault <SysProcessParticipant>(predicate);
                    arp.RemindTemplate = this._context.FindById <SysProcessRemindTemplate>(new object[] { arp.TemplateId });
                }
            }
        }
Exemplo n.º 25
0
        /// <summary>
        /// 初始化
        /// </summary>
        private void Initialize()
        {
            int?        id = QueryString <int?>("id");
            SysWorkItem wi = this.DataHelper.FindById <SysWorkItem>(id);

            if (wi == null)
            {
                throw new Exception("工作项不存在");
            }
            SysActivityInstance ai = this.DataHelper.FindById <SysActivityInstance>(wi.ActivityInstanceId);

            if (ai == null)
            {
                throw new Exception("活动实例不存在");
            }
            SysActivity activity = this.DataHelper.FindById <SysActivity>(ai.ActivityId);

            if (activity == null)
            {
                throw new Exception("活动不存在");
            }
            SysProcessInstance pi = this.DataHelper.FindById <SysProcessInstance>(ai.ProcessInstanceId);

            if (pi == null)
            {
                throw new Exception("流程实例不存在");
            }

            this.WorkItemId = id.Value;

            this.ProcessInstanceId    = pi.ProcessInstanceId;
            this.ActivityId           = activity.ActivityId;
            this.ActivityDispalyOrder = activity.DisplayOrder ?? 0;
            this.FormInstanceId       = pi.FormInstanceId ?? 0;
            this.ProcessId            = pi.ProcessId.Value;

            CheckRejectButton();
        }
Exemplo n.º 26
0
        public List <SysActivity> GetNextActivityList(int workItemId)
        {
            List <SysActivity> list2;

            try
            {
                SysWorkItem        item;
                List <SysActivity> list = new List <SysActivity>();
                new ProcessInstanceCacheFactory(this._context).GetProcessInstanceCacheByWorkItem(workItemId, out item);
                SysActivity activity = item.ActivityInstance.Activity;
                if (activity != null)
                {
                    list = (from p in activity.FromTransitions select p.PostActivity).ToList <SysActivity>();
                }
                list2 = list;
            }
            catch (Exception exception)
            {
                AppLogHelper.Error(string.Format("GetNextActivityList,workItemId=[{0}]失败", workItemId), exception);
                throw exception;
            }
            return(list2);
        }
        private void LoadActivity(SysActivity a, SysProcess p)
        {
            string condition = string.Format("activityId = {0}", a.ActivityId);

            a.Process              = p;
            a.Expression           = p.Expressions.FirstOrDefault <SysExpression>(i => i.ExpressionId == a.ExpressionId);
            a.ActivityParticipants = this._context.Where <SysActivityParticipant>(condition, new DbParameter[0]);
            a.ActivityReminds      = this._context.Where <SysActivityRemind>(condition, new DbParameter[0]);
            a.ActivityOperations   = this._context.Where <SysActivityOperation>(condition, new DbParameter[0]);
            a.Expressions          = p.Expressions.Where <SysExpression>(delegate(SysExpression i) {
                long?activityId = i.ActivityId;
                long num        = a.ActivityId;
                return((activityId.GetValueOrDefault() == num) && activityId.HasValue);
            }).ToList <SysExpression>();
            a.FromTransitions = p.Transitions.Where <SysTransition>(delegate(SysTransition i) {
                long?preActivityId = i.PreActivityId;
                long activityId    = a.ActivityId;
                return((preActivityId.GetValueOrDefault() == activityId) && preActivityId.HasValue);
            }).ToList <SysTransition>();
            a.ToTransitions = p.Transitions.Where <SysTransition>(delegate(SysTransition i) {
                long?postActivityId = i.PostActivityId;
                long activityId     = a.ActivityId;
                return((postActivityId.GetValueOrDefault() == activityId) && postActivityId.HasValue);
            }).ToList <SysTransition>();
            foreach (SysActivityParticipant participant in a.ActivityParticipants)
            {
                this.LoadActivityParticipant(participant, a, p);
            }
            foreach (SysActivityRemind remind in a.ActivityReminds)
            {
                this.LoadActivityRemind(remind, a, p);
            }
            foreach (SysActivityOperation operation in a.ActivityOperations)
            {
                this.LoadActivityOperation(operation, a);
            }
        }
        /// <summary>
        /// 验证流程的完整性,绑定流程详情和验证错误信息
        /// </summary>
        private void BindAndValidateData(SysProcess process)
        {
            this.lblProcessName.Text    = process.ProcessName;
            this.lblProcessVersion.Text = process.ProcessVersion;

            //表单相关
            SysForm form = this.DataHelper.FindById <SysForm>(process.FormId);

            if (form != null)
            {
                this.lblFormName.Text = form.FormName;

                SysEntity entity = GetEntity(form.EntityId);
                if (entity != null)
                {
                    this.lblProcessEntity.Text = entity.DisplayText;
                }
                else
                {
                    AddError(new Exception("流程实体为空,请至表单配置页面设置"));
                }
            }
            else
            {
                AddError(new Exception("流程关联表单为空,请返回至第一步配置"));
            }

            //流程参与人
            var ppCount = this.DataHelper.Set <SysProcessParticipant>()
                          .Where(p => p.ProcessId == this.ProcessId).Count();

            if (ppCount == 0)
            {
                AddError(new Exception("流程参与人未配置,请返回至第一步配置"));
            }

            //活动相关
            var activityList = this.DataHelper.Set <SysActivity>()
                               .Where(p => p.ProcessId == this.ProcessId).OrderBy(p => p.DisplayOrder ?? 0).ToList();

            this.gcActivity.DataSource = activityList.Select(p => new
            {
                p.ActivityName,
                ActivityType        = EnumHelper.GetDescription((ActivityType)p.ActivityType),
                ExecuteType         = EnumHelper.GetDescription((ActivityExecType)p.ExecType),
                ActivityParticipant = GetActivityParticipant(p),
            }).ToList();
            this.gcActivity.DataBind();

            if (activityList.Count(p => p.ActivityType == (int)ActivityType.Start) != 1)
            {
                AddError(new Exception("流程开始活动内部错误,请重建流程"));
                return;
            }
            if (activityList.Count(p => p.ActivityType == (int)ActivityType.End) != 2)
            {
                AddError(new Exception("流程结束活动内部错误,请重建流程"));
                return;
            }
            if (activityList.Count(p => p.ActivityType == (int)ActivityType.Approve) == 0)
            {
                AddError(new Exception("流程审核活动内部错误,请重建流程"));
                return;
            }

            foreach (var a in activityList)
            {
                if (string.IsNullOrEmpty(a.ActivityName))
                {
                    AddError(new Exception("活动名称为空,请返回至第二步配置"));
                }
                if (a.ActivityType == (int)ActivityType.Approve)
                {
                    var apCount = this.DataHelper.Set <SysActivityParticipant>()
                                  .Where(p => p.ActivityId == a.ActivityId).Count();
                    if (apCount == 0)
                    {
                        AddError(new Exception(string.Format("活动【{0}】参与人未配置,请返回至第二步配置", a.ActivityName)));
                    }
                }
            }

            //连接线完整性验证
            List <SysTransition> tList = this.DataHelper.Set <SysTransition>()
                                         .Where(p => p.ProcessId == this.ProcessId).ToList();
            Queue <SysActivity> queue = new Queue <SysActivity>();
            SysActivity         start = activityList.FirstOrDefault(p => p.ActivityType == (int)ActivityType.Start);
            SysActivity         temp  = start;

            queue.Enqueue(start);
            while (queue.Count > 0)
            {
                temp = queue.Dequeue();
                SysTransition t = tList.FirstOrDefault(p => p.PreActivityId == temp.ActivityId &&
                                                       p.Direction == (int)FlowStepDirection.True);
                if (t != null)
                {
                    temp = activityList.FirstOrDefault(p => p.ActivityId == t.PostActivityId);
                    queue.Enqueue(temp);
                }
                else
                {
                    break;
                }
            }
            if (!(temp.ActivityType == (int)ActivityType.End && temp.ActivityName == "通过"))
            {
                AddError(new Exception(string.Format("流程在活动【{0}】处断开,内部错误,请重建流程", temp.ActivityName)));
            }
        }
        /// <summary>
        /// 复制流程,从“已启用”或“已升级”的流程进入设计,需要先复制一份流程供设计
        /// 状态为“新增”,版本为当前最高版本 + 1
        /// </summary>
        public SysProcess CopyProcess()
        {
            SysProcess result;

            using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())
            {
                using (BizDataContext db = new BizDataContext())
                {
                    //新流程
                    SysProcess newP = _process.ConvertTo <SysProcess>();
                    newP.ProcessId = db.GetNextIdentity();

                    //版本处理
                    newP.ProcessStatus = (int)ProcessState.Created;
                    string maxVersion = db.Set <SysProcess>().Where(p => p.ProcessType == _process.ProcessType).OrderByDescending(p => p.ProcessVersion).First().ProcessVersion;
                    newP.ProcessVersion = (maxVersion.ToInt() + 1).ToString();

                    result = newP;
                    db.Insert(newP);

                    //新流程参与人
                    var ppList = db.Set <SysProcessParticipant>().Where(p => p.ProcessId == _process.ProcessId).ToList();
                    Dictionary <long?, SysProcessParticipant> tempPpDict = new Dictionary <long?, SysProcessParticipant>();
                    foreach (var pp in ppList)
                    {
                        SysProcessParticipant newPp = pp.ConvertTo <SysProcessParticipant>();
                        newPp.ParticipantId = db.GetNextIdentity();
                        newPp.ProcessId     = newP.ProcessId;

                        tempPpDict[pp.ParticipantId] = newPp; //记录原始ID和新对象的关系
                    }
                    foreach (var newPp in tempPpDict.Values)
                    {
                        if (newPp.Param_ParticipantId != null) //通过刚才记录的关系找到实际的值
                        {
                            newPp.Param_ParticipantId = tempPpDict[newPp.Param_ParticipantId].ParticipantId;
                        }
                        db.Insert(newPp);
                    }

                    //新活动
                    var aList = db.Set <SysActivity>().Where(p => p.ProcessId == _process.ProcessId).ToList();
                    Dictionary <long?, SysActivity> tempADict = new Dictionary <long?, SysActivity>();
                    foreach (var a in aList)
                    {
                        SysActivity newA = a.ConvertTo <SysActivity>();
                        newA.ActivityId = db.GetNextIdentity();
                        newA.ProcessId  = newP.ProcessId;

                        tempADict[a.ActivityId] = newA;//记录原始ID和新对象的关系
                        db.Insert(newA);

                        //新活动参与人
                        var apList = db.Set <SysActivityParticipant>().Where(p => p.ActivityId == a.ActivityId).ToList();
                        foreach (var ap in apList)
                        {
                            SysActivityParticipant newAp = ap.ConvertTo <SysActivityParticipant>();
                            newAp.ActivityParticipantId = db.GetNextIdentity();
                            newAp.ActivityId            = newA.ActivityId;
                            newAp.ParticipantId         = tempPpDict[newAp.ParticipantId].ParticipantId; //通过刚才记录的关系找到实际的值
                            db.Insert(newAp);
                        }
                    }

                    //连接线
                    var tList = db.Set <SysTransition>().Where(p => p.ProcessId == _process.ProcessId).ToList();
                    foreach (var t in tList)
                    {
                        SysTransition newT = t.ConvertTo <SysTransition>();
                        newT.TransitionId = db.GetNextIdentity();
                        newT.ProcessId    = newP.ProcessId;

                        //通过刚才记录的关系找到实际的值
                        newT.PreActivityId  = tempADict[newT.PreActivityId].ActivityId;
                        newT.PostActivityId = tempADict[newT.PostActivityId].ActivityId;

                        db.Insert(newT);
                    }

                    //表单活动权限
                    var fpList = db.Set <SysFormPrivilege>().Where(p => p.ProcessId == _process.ProcessId).ToList();
                    foreach (var fp in fpList)
                    {
                        SysFormPrivilege newFp = fp.ConvertTo <SysFormPrivilege>();
                        newFp.PrivilegeId = db.GetNextIdentity();
                        newFp.ProcessId   = newP.ProcessId;
                        newFp.ActivityId  = tempADict[newFp.ActivityId].ActivityId;//通过刚才记录的关系找到实际的值

                        db.Insert(newFp);
                    }
                }
                ts.Complete();
            }
            return(result);
        }
        private void ExecuteForManual(SysActivity activity, SysProcess process, Queue <WorkflowMessage> queue)
        {
            if ((activity.ActivityParticipants == null) || (activity.ActivityParticipants.Count == 0))
            {
                throw new ApplicationException("未指定参与人");
            }
            Dictionary <SysWorkItemApproveGroup, List <IUser> > dictionary = new Dictionary <SysWorkItemApproveGroup, List <IUser> >(20);
            List <IUser> list = new List <IUser>();

            if (this.AI.UserDefinedApproveUsers.Count > 0)
            {
                SysWorkItemApproveGroup key = this.CreateWorkItemGroup();
                IOrgProxy    orgProxy       = OrgProxyFactory.GetProxy(base.Context);
                List <IUser> users          = (from p in this.AI.UserDefinedApproveUsers select orgProxy.GetUserById(p.UserId.Value)).ToList <IUser>();
                this.RemoveRepeatedUsers(users);
                list.AddRange(users);
                dictionary.Add(key, users);
            }
            else
            {
                using (IEnumerator <SysActivityParticipant> enumerator = activity.ActivityParticipants.GetEnumerator())
                {
                    while (enumerator.MoveNext())
                    {
                        Func <SysProcessParticipant, bool> predicate     = null;
                        SysActivityParticipant             activity_part = enumerator.Current;
                        SysWorkItemApproveGroup            group         = this.CreateWorkItemGroup(activity_part);
                        if (predicate == null)
                        {
                            predicate = p => p.ParticipantId == activity_part.ParticipantId.Value;
                        }
                        SysProcessParticipant part = process.ProcessParticipants.FirstOrDefault <SysProcessParticipant>(predicate);
                        if (part == null)
                        {
                            throw new ApplicationException("参与人为空");
                        }
                        int?         wiOwnerId   = null;
                        var          users       = ParticipantHelper.GetUsers(base.Context, part, base.PI, this.AI, wiOwnerId);
                        List <IUser> targetUsers = users;
                        this.AssertGroupHasUsers(activity_part, group, targetUsers);
                        this.RemoveRepeatedUsers(targetUsers);
                        list.AddRange(targetUsers);
                        dictionary.Add(group, targetUsers);
                    }
                }
            }
            if (list.Count == 0)
            {
                bool?isPassedWithNoParticipants = this.AI.Activity.IsPassedWithNoParticipants;
                if (!(isPassedWithNoParticipants.HasValue ? isPassedWithNoParticipants.GetValueOrDefault() : false))
                {
                    throw new ApplicationException("未计算出任何参与人");
                }
                SysActivityInstance aI = this.AI;
                aI.InstanceStatus  = 10;
                aI.EndTime         = new DateTime?(DateTime.Now);
                aI.ApproveResult   = 1;
                aI.ExpressionValue = 1;
                aI.Remark          = "无人审核,自动通过";
                base.PICacheFactory.UpdateActiviyInstance(this.AI);
                WorkflowMessage item = base.Engine.NewCompleteActivityMessage(this.AI);
                queue.Enqueue(item);
            }
            else
            {
                SysActivity activity3 = this.AI.Activity;
                if (!activity3.PassType.HasValue)
                {
                    activity3.PassType = 1;
                    if (!activity3.MinPassNum.HasValue)
                    {
                        activity3.MinPassNum = 1;
                    }
                }
                foreach (KeyValuePair <SysWorkItemApproveGroup, List <IUser> > pair in dictionary)
                {
                    SysWorkItemApproveGroup group3 = pair.Key;
                    foreach (IUser user in pair.Value)
                    {
                        this.CreateWorkItem(user, group3);
                    }
                }
            }
            if (this.AI.UserDefinedApproveUsers.Count > 0)
            {
                base.PICacheFactory.ClearApproveUsers(this.AI);
            }
        }