public static ActivityPassType GetPassType(this SysActivityParticipant ap)
 {
     if (!ap.PassType.HasValue)
     {
         ap.PassType = 0;
     }
     else if (ap.PassType == 1)
     {
         if (!ap.MinPassNum.HasValue)
         {
             ap.MinPassNum = 1;
         }
     }
     else
     {
         if (ap.PassType != 2)
         {
             throw new ApplicationException("不正确的PassType");
         }
         if (!ap.MinPassRatio.HasValue)
         {
             ap.MinPassRatio = 100.0;
         }
     }
     return((ActivityPassType)ap.PassType.Value);
 }
        public override IList <IUser> GetUsers(SysProcessParticipant part, SysProcessInstance pi, SysActivityInstance ai)
        {
            List <IUser> source = new List <IUser>();

            using (IEnumerator <SysActivityParticipant> enumerator = ai.Activity.ActivityParticipants.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    Func <SysProcessParticipant, bool> predicate = null;
                    SysActivityParticipant             p         = enumerator.Current;
                    if (predicate == null)
                    {
                        predicate = i => i.ParticipantId == p.ParticipantId;
                    }
                    SysProcessParticipant participant = pi.Process.ProcessParticipants.FirstOrDefault <SysProcessParticipant>(predicate);
                    if (participant != null)
                    {
                        int?         wiOwnerId  = null;
                        List <IUser> collection = ParticipantHelper.GetUsers(base._context, participant, pi, ai, wiOwnerId);
                        source.AddRange(collection);
                    }
                }
            }
            return(source.Distinct <IUser>().ToList <IUser>());
        }
 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);
 }
 private void AssertGroupHasUsers(SysActivityParticipant act_part, SysWorkItemApproveGroup group, List <IUser> targetUsers)
 {
     if (targetUsers.Count <= 0)
     {
         bool?isPassedWithNoParticipants = act_part.Activity.IsPassedWithNoParticipants;
         if (!(isPassedWithNoParticipants.HasValue ? isPassedWithNoParticipants.GetValueOrDefault() : false))
         {
             throw new ApplicationException(string.Format("参与人[{0}]没有匹配的用户", act_part.ProcessParticipant.ParticipantName));
         }
         group.ApproveResult = 1;
         group.ApproveTime   = new DateTime?(DateTime.Now);
         base.PICacheFactory.UpdateWorkItemGroup(group);
     }
 }
        private SysWorkItemApproveGroup CreateWorkItemGroup(SysActivityParticipant ap)
        {
            SysWorkItemApproveGroup group = new SysWorkItemApproveGroup {
                ApproveGroupId        = base.Manager.GetNextIdentity(),
                ProcessInstanceId     = new int?(base.PI.ProcessInstanceId),
                ActivityInstanceId    = new int?(this.AI.ActivityInstanceId),
                ActivityParticipantId = new long?(ap.ActivityParticipantId),
                ParticipantId         = ap.ParticipantId,
                CreateTime            = new DateTime?(DateTime.Now),
                ApproveResult         = null,
                ApproveTime           = null
            };

            base.PICacheFactory.AddWorkItemGroup(group, base.PI, this.AI);
            return(group);
        }
        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);
            }
        }
Ejemplo n.º 7
0
        public List <IUser> GetParticipantUsers(long activityId, int?processInstanceId = new int?(), int?activityInstanctId = new int?())
        {
            Func <SysActivityInstance, bool> predicate = null;
            Func <SysActivityInstance, bool> func3     = null;
            List <IUser> list3;

            try
            {
                SysActivity activity;
                int?        nullable = processInstanceId;
                if ((nullable.HasValue ? nullable.GetValueOrDefault() : -1) <= 0)
                {
                    processInstanceId = null;
                }
                int?nullable2 = activityInstanctId;
                if ((nullable2.HasValue ? nullable2.GetValueOrDefault() : -1) <= 0)
                {
                    activityInstanctId = null;
                }
                List <IUser>        users = new List <IUser>();
                SysProcess          processCacheByActivity = this._processCache.GetProcessCacheByActivity(activityId, out activity);
                SysProcessInstance  pi = null;
                SysActivityInstance ai = null;
                if (processInstanceId.HasValue)
                {
                    pi = new ProcessInstanceCacheFactory(this._context).GetProcessInstanceCache(processInstanceId.Value);
                    if (pi == null)
                    {
                        throw new ApplicationException(string.Format("流程实例ID:{0}不正确", processInstanceId));
                    }
                    if (activityInstanctId.HasValue)
                    {
                        if (predicate == null)
                        {
                            predicate = p => p.ActivityInstanceId == activityInstanctId.Value;
                        }
                        ai = pi.ActivityInstances.FirstOrDefault <SysActivityInstance>(predicate);
                        if (ai == null)
                        {
                            throw new ApplicationException(string.Format("活动实例ID:{0}不正确", activityInstanctId));
                        }
                    }
                    else
                    {
                        if (func3 == null)
                        {
                            func3 = delegate(SysActivityInstance p) {
                                long?nullable1 = p.ActivityId;
                                long num       = activityId;
                                return((nullable1.GetValueOrDefault() == num) && nullable1.HasValue);
                            };
                        }
                        ai = pi.ActivityInstances.FirstOrDefault <SysActivityInstance>(func3);
                    }
                }
                using (IEnumerator <SysActivityParticipant> enumerator = activity.ActivityParticipants.GetEnumerator())
                {
                    while (enumerator.MoveNext())
                    {
                        Func <SysProcessParticipant, bool> func          = null;
                        SysActivityParticipant             activity_part = enumerator.Current;
                        if (func == null)
                        {
                            func = p => p.ParticipantId == activity_part.ParticipantId.Value;
                        }
                        SysProcessParticipant part = processCacheByActivity.ProcessParticipants.FirstOrDefault <SysProcessParticipant>(func);
                        if (part == null)
                        {
                            throw new ApplicationException("参与人为空");
                        }
                        int?         wiOwnerId  = null;
                        List <IUser> collection = ParticipantHelper.GetUsers(this._context, part, pi, ai, wiOwnerId);
                        users.AddRange(collection);
                    }
                }
                RemoveRepeatedUsers(users);
                list3 = users;
            }
            catch (Exception exception)
            {
                AppLogHelper.Error(string.Format("GetParticipantUsers,activityId=[{0}]失败", activityId), exception);
                throw exception;
            }
            return(list3);
        }
        /// <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);
        }
Ejemplo n.º 9
0
        internal SysProcess LoadProcess(long processId)
        {
            SysProcess process = this._context.FindById <SysProcess>(new object[] { processId });

            if (process == null)
            {
                throw new ApplicationException("流程ID不正确");
            }
            if (process.EntityId.HasValue)
            {
                process.ProcessEntity = this._cacheFactory.GetEntityCache(process.EntityId.Value);
            }
            if (process.ActivityEntityId.HasValue)
            {
                process.ActivityEntity = this._cacheFactory.GetEntityCache(process.ActivityEntityId.Value);
            }
            if (process.FormId.HasValue)
            {
                process.Form = this._context.FindById <SysForm>(new object[] { process.FormId });
            }
            string condition = string.Format("processId = {0}", processId);
            List <SysProcessProxy>             list    = this._context.Where <SysProcessProxy>(condition, new DbParameter[0]);
            List <SysProcessParticipant>       list2   = this._context.Where <SysProcessParticipant>(condition, new DbParameter[0]);
            List <SysExpression>               list3   = this._context.Where <SysExpression>(condition, new DbParameter[0]);
            List <SysTransition>               list4   = this._context.Where <SysTransition>(condition, new DbParameter[0]);
            List <SysProcessRemind>            list5   = this._context.Where <SysProcessRemind>(condition, new DbParameter[0]);
            List <SysProcessRemindParticipant> source  = this._context.Where <SysProcessRemindParticipant>(condition, new DbParameter[0]);
            List <SysActivity>                  list7  = this._context.Where <SysActivity>(condition, new DbParameter[0]);
            List <SysActivityParticipant>       list8  = this._context.Where <SysActivityParticipant>(condition, new DbParameter[0]);
            List <SysActivityOperation>         list9  = this._context.Where <SysActivityOperation>(condition, new DbParameter[0]);
            List <SysActivityStep>              list10 = this._context.Where <SysActivityStep>(condition, new DbParameter[0]);
            List <SysActivityRemind>            list11 = this._context.Where <SysActivityRemind>(condition, new DbParameter[0]);
            List <SysActivityRemindParticipant> list12 = this._context.Where <SysActivityRemindParticipant>(condition, new DbParameter[0]);
            List <SysActivityApproveGroup>      list13 = this._context.Where <SysActivityApproveGroup>(condition, new DbParameter[0]);

            process.Activities          = list7;
            process.ProcessProxies      = list;
            process.ProcessParticipants = list2;
            process.ProcessReminds      = list5;
            process.Expressions         = list3;
            process.Transitions         = list4;
            using (IEnumerator <SysActivity> enumerator = process.Activities.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    Func <SysExpression, bool>          predicate = null;
                    Func <SysActivityParticipant, bool> func8     = null;
                    Func <SysActivityRemind, bool>      func9     = null;
                    Func <SysActivityOperation, bool>   func10    = null;
                    Func <SysExpression, bool>          func11    = null;
                    Func <SysTransition, bool>          func12    = null;
                    Func <SysTransition, bool>          func13    = null;
                    SysActivity a = enumerator.Current;
                    a.Process = process;
                    if (predicate == null)
                    {
                        predicate = i => i.ExpressionId == a.ExpressionId;
                    }
                    a.Expression = process.Expressions.FirstOrDefault <SysExpression>(predicate);
                    if (func8 == null)
                    {
                        func8 = delegate(SysActivityParticipant i) {
                            long?activityId = i.ActivityId;
                            long num        = a.ActivityId;
                            return((activityId.GetValueOrDefault() == num) && activityId.HasValue);
                        };
                    }
                    a.ActivityParticipants = list8.Where <SysActivityParticipant>(func8).ToList <SysActivityParticipant>();
                    if (func9 == null)
                    {
                        func9 = delegate(SysActivityRemind i) {
                            long?activityId = i.ActivityId;
                            long num        = a.ActivityId;
                            return((activityId.GetValueOrDefault() == num) && activityId.HasValue);
                        };
                    }
                    a.ActivityReminds = list11.Where <SysActivityRemind>(func9).ToList <SysActivityRemind>();
                    if (func10 == null)
                    {
                        func10 = delegate(SysActivityOperation i) {
                            long?activityId = i.ActivityId;
                            long num        = a.ActivityId;
                            return((activityId.GetValueOrDefault() == num) && activityId.HasValue);
                        };
                    }
                    a.ActivityOperations = list9.Where <SysActivityOperation>(func10).ToList <SysActivityOperation>();
                    if (func11 == null)
                    {
                        func11 = delegate(SysExpression i) {
                            long?activityId = i.ActivityId;
                            long num        = a.ActivityId;
                            return((activityId.GetValueOrDefault() == num) && activityId.HasValue);
                        };
                    }
                    a.Expressions = process.Expressions.Where <SysExpression>(func11).ToList <SysExpression>();
                    if (func12 == null)
                    {
                        func12 = delegate(SysTransition i) {
                            long?preActivityId = i.PreActivityId;
                            long activityId    = a.ActivityId;
                            return((preActivityId.GetValueOrDefault() == activityId) && preActivityId.HasValue);
                        };
                    }
                    a.FromTransitions = process.Transitions.Where <SysTransition>(func12).ToList <SysTransition>();
                    if (func13 == null)
                    {
                        func13 = delegate(SysTransition i) {
                            long?postActivityId = i.PostActivityId;
                            long activityId     = a.ActivityId;
                            return((postActivityId.GetValueOrDefault() == activityId) && postActivityId.HasValue);
                        };
                    }
                    a.ToTransitions = process.Transitions.Where <SysTransition>(func13).ToList <SysTransition>();
                    using (IEnumerator <SysActivityParticipant> enumerator2 = a.ActivityParticipants.GetEnumerator())
                    {
                        while (enumerator2.MoveNext())
                        {
                            Func <SysActivityApproveGroup, bool> func  = null;
                            Func <SysActivityParticipant, bool>  func2 = null;
                            Func <SysProcessParticipant, bool>   func3 = null;
                            SysActivityParticipant ap = enumerator2.Current;
                            ap.Activity = a;
                            if (func == null)
                            {
                                func = i => i.ActivityApproveGroupId == ap.ActivityApproveGroupId;
                            }
                            ap.ActivityApproveGroup = list13.FirstOrDefault <SysActivityApproveGroup>(func);
                            if (ap.ActivityApproveGroup != null)
                            {
                                ap.ActivityApproveGroup.Activity = a;
                                if (func2 == null)
                                {
                                    func2 = i => i.ActivityApproveGroupId == ap.ActivityApproveGroupId;
                                }
                                ap.ActivityApproveGroup.ActivityParticipants = list8.Where <SysActivityParticipant>(func2).ToList <SysActivityParticipant>();
                            }
                            if (func3 == null)
                            {
                                func3 = i => i.ParticipantId == ap.ParticipantId;
                            }
                            ap.ProcessParticipant = process.ProcessParticipants.FirstOrDefault <SysProcessParticipant>(func3);
                        }
                    }
                    using (IEnumerator <SysActivityRemind> enumerator3 = a.ActivityReminds.GetEnumerator())
                    {
                        while (enumerator3.MoveNext())
                        {
                            Func <SysActivityRemindParticipant, bool> func5 = null;
                            SysActivityRemind ar = enumerator3.Current;
                            ar.Activity = a;
                            if (func5 == null)
                            {
                                func5 = delegate(SysActivityRemindParticipant i) {
                                    long?remindId = i.RemindId;
                                    long num      = ar.RemindId;
                                    return((remindId.GetValueOrDefault() == num) && remindId.HasValue);
                                };
                            }
                            ar.RemindParticipants = list12.Where <SysActivityRemindParticipant>(func5).ToList <SysActivityRemindParticipant>();
                            using (IEnumerator <SysActivityRemindParticipant> enumerator4 = ar.RemindParticipants.GetEnumerator())
                            {
                                while (enumerator4.MoveNext())
                                {
                                    Func <SysProcessParticipant, bool> func4 = null;
                                    SysActivityRemindParticipant       arp   = enumerator4.Current;
                                    arp.Remind = ar;
                                    if (func4 == null)
                                    {
                                        func4 = i => i.ParticipantId == arp.ParticipantId;
                                    }
                                    arp.Participant    = process.ProcessParticipants.FirstOrDefault <SysProcessParticipant>(func4);
                                    arp.RemindTemplate = this._context.FindById <SysProcessRemindTemplate>(new object[] { arp.TemplateId });
                                }
                                continue;
                            }
                        }
                    }
                    using (IEnumerator <SysActivityOperation> enumerator5 = a.ActivityOperations.GetEnumerator())
                    {
                        while (enumerator5.MoveNext())
                        {
                            Func <SysActivityStep, bool> func6 = null;
                            SysActivityOperation         ao    = enumerator5.Current;
                            ao.Activity = a;
                            if (func6 == null)
                            {
                                func6 = delegate(SysActivityStep i) {
                                    long?operationId = i.OperationId;
                                    long num         = ao.OperationId;
                                    return((operationId.GetValueOrDefault() == num) && operationId.HasValue);
                                };
                            }
                            ao.ActivitySteps = list10.Where <SysActivityStep>(func6).ToList <SysActivityStep>();
                            foreach (SysActivityStep step in ao.ActivitySteps)
                            {
                                step.ActivityOperation = ao;
                            }
                        }
                        continue;
                    }
                }
            }
            foreach (SysProcessProxy proxy in process.ProcessProxies)
            {
                proxy.Process = process;
            }
            using (IEnumerator <SysProcessParticipant> enumerator8 = process.ProcessParticipants.GetEnumerator())
            {
                while (enumerator8.MoveNext())
                {
                    Func <SysProcessParticipant, bool>  func14 = null;
                    Func <SysActivityParticipant, bool> func15 = null;
                    SysProcessParticipant pp = enumerator8.Current;
                    pp.Process = process;
                    if (func14 == null)
                    {
                        func14 = i => i.ParticipantId == pp.Param_ParticipantId;
                    }
                    pp.Param_Participant = process.ProcessParticipants.FirstOrDefault <SysProcessParticipant>(func14);
                    if (func15 == null)
                    {
                        func15 = delegate(SysActivityParticipant i) {
                            long?participantId = i.ParticipantId;
                            long num           = pp.ParticipantId;
                            return((participantId.GetValueOrDefault() == num) && participantId.HasValue);
                        };
                    }
                    pp.ActivityParticipants = list8.Where <SysActivityParticipant>(func15).ToList <SysActivityParticipant>();
                }
            }
            using (IEnumerator <SysProcessRemind> enumerator9 = process.ProcessReminds.GetEnumerator())
            {
                while (enumerator9.MoveNext())
                {
                    Func <SysProcessRemindParticipant, bool> func17 = null;
                    SysProcessRemind pr = enumerator9.Current;
                    pr.Process = process;
                    if (func17 == null)
                    {
                        func17 = delegate(SysProcessRemindParticipant i) {
                            long?remindId = i.RemindId;
                            long num      = pr.RemindId;
                            return((remindId.GetValueOrDefault() == num) && remindId.HasValue);
                        };
                    }
                    pr.RemindParticipants = source.Where <SysProcessRemindParticipant>(func17).ToList <SysProcessRemindParticipant>();
                    using (IEnumerator <SysProcessRemindParticipant> enumerator10 = pr.RemindParticipants.GetEnumerator())
                    {
                        while (enumerator10.MoveNext())
                        {
                            Func <SysProcessParticipant, bool> func16 = null;
                            SysProcessRemindParticipant        rp     = enumerator10.Current;
                            rp.Remind = pr;
                            if (func16 == null)
                            {
                                func16 = i => i.ParticipantId == rp.ParticipantId;
                            }
                            rp.Participant    = process.ProcessParticipants.FirstOrDefault <SysProcessParticipant>(func16);
                            rp.RemindTemplate = this._context.FindById <SysProcessRemindTemplate>(new object[] { rp.TemplateId });
                        }
                        continue;
                    }
                }
            }
            using (IEnumerator <SysExpression> enumerator11 = process.Expressions.GetEnumerator())
            {
                while (enumerator11.MoveNext())
                {
                    Func <SysActivity, bool> func18 = null;
                    SysExpression            e      = enumerator11.Current;
                    e.Process = process;
                    if (func18 == null)
                    {
                        func18 = i => i.ActivityId == e.ActivityId;
                    }
                    e.Activity = process.Activities.FirstOrDefault <SysActivity>(func18);
                    if (e.FieldId.HasValue)
                    {
                        e.Field = this._cacheFactory.GetFieldCache(e.FieldId.Value);
                    }
                    if (e.RelationId.HasValue)
                    {
                        e.Relation = this._cacheFactory.GetRelationCache(e.RelationId.Value);
                    }
                }
            }
            using (IEnumerator <SysTransition> enumerator12 = process.Transitions.GetEnumerator())
            {
                while (enumerator12.MoveNext())
                {
                    Func <SysActivity, bool>   func19 = null;
                    Func <SysActivity, bool>   func20 = null;
                    Func <SysExpression, bool> func21 = null;
                    Func <SysExpression, bool> func22 = null;
                    SysTransition t = enumerator12.Current;
                    t.Process = process;
                    if (func19 == null)
                    {
                        func19 = i => i.ActivityId == t.PreActivityId;
                    }
                    t.PreActivity = process.Activities.FirstOrDefault <SysActivity>(func19);
                    if (func20 == null)
                    {
                        func20 = i => i.ActivityId == t.PostActivityId;
                    }
                    t.PostActivity = process.Activities.FirstOrDefault <SysActivity>(func20);
                    if (func21 == null)
                    {
                        func21 = i => i.ExpressionId == t.ExpressionId;
                    }
                    t.Expression = process.Expressions.FirstOrDefault <SysExpression>(func21);
                    if (func22 == null)
                    {
                        func22 = delegate(SysExpression i) {
                            long?transitionId = i.TransitionId;
                            long num          = t.TransitionId;
                            return((transitionId.GetValueOrDefault() == num) && transitionId.HasValue);
                        };
                    }
                    t.Expressions = process.Expressions.Where <SysExpression>(func22).ToList <SysExpression>();
                }
            }
            return(process);
        }
        /// <summary>
        /// 保存活动参与人
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void cbc_CallBack(object sender, CallBackEventArgs e)
        {
            JavaScriptSerializer js = new JavaScriptSerializer();
            string errorMsg         = string.Empty; //错误消息
            bool   isError          = false;

            try
            {
                long?   aid      = e.Context["ActivityId"].ToStringNullable().ToLongNullable();
                long?   pid      = e.Context["ParticipantId"].ToStringNullable().ToLongNullable();
                int?    passType = e.Context["PassType"].ToStringNullable().ToIntNullable();
                int?    minNum   = e.Context["MinPassNum"].ToStringNullable().ToIntNullable();
                decimal?minRatio = e.Context["MinPassRatio"].ToStringNullable().ToDecimalNullable();

                if (aid == null)
                {
                    throw new Exception("当前活动为空");
                }
                if (pid == null)
                {
                    throw new Exception("流程参与人不能为空");
                }
                if (passType == null)
                {
                    throw new Exception("通过方式不能为空");
                }
                if (passType == (int)ActivityPassType.UsingMinNum && minNum == null)
                {
                    throw new Exception("最小通过数不能为空");
                }
                if (passType == (int)ActivityPassType.UsingMinRatio && minRatio == null)
                {
                    throw new Exception("最小通过率不能为空");
                }

                var count = this.DataHelper.Set <SysActivityParticipant>()
                            .Where(p => p.ParticipantId == pid && p.ActivityId == aid).Count();
                if (count > 0)
                {
                    throw new Exception("已存在相同的活动参与人");
                }

                SysActivityParticipant ap = new SysActivityParticipant()
                {
                    ActivityParticipantId = this.DataHelper.GetNextIdentity(),
                    ActivityId            = aid,
                    PassType            = passType,
                    MinPassNum          = minNum,
                    MinPassRatio        = (double?)minRatio,
                    IsMustApprove       = true,
                    SumAfterAllComplete = false,
                    ParticipantId       = pid,
                };
                this.DataHelper.Insert(ap);
            }
            catch (Exception ex)
            {
                isError  = true;
                errorMsg = ex.Message;
            }

            string result = js.Serialize(new
            {
                IsError = isError,
                Error   = errorMsg,
            });

            e.Result = result;
        }
        private bool TryCompleteGroup(SysWorkItemApproveGroup group, out bool approve_result)
        {
            approve_result = false;
            ICollection <SysWorkItem>         workItems  = group.WorkItems;
            Dictionary <int, WorkItemWrapper> dictionary = new Dictionary <int, WorkItemWrapper>(workItems.Count + 10);

            foreach (SysWorkItem item in workItems)
            {
                WorkItemWrapper wrapper = new WorkItemWrapper(base.PICacheFactory, item, base.PI);
                dictionary.Add(item.WorkItemId, wrapper);
            }
            List <WorkItemWrapper> source = new List <WorkItemWrapper>(workItems.Count);

            foreach (KeyValuePair <int, WorkItemWrapper> pair in dictionary)
            {
                WorkItemWrapper wrapper2 = pair.Value;
                bool?           isAdded  = wrapper2.WorkItem.IsAdded;
                if (isAdded.HasValue ? isAdded.GetValueOrDefault() : false)
                {
                    if (!wrapper2.WorkItem.ProxyWorkItemId.HasValue)
                    {
                        throw new ApplicationException("加签未设置代理工作项");
                    }
                    wrapper2.Parent = dictionary[wrapper2.WorkItem.ProxyWorkItemId.Value];
                    wrapper2.Parent.AddItems.Add(wrapper2);
                }
                else
                {
                    bool?isProxy = wrapper2.WorkItem.IsProxy;
                    if (isProxy.HasValue ? isProxy.GetValueOrDefault() : false)
                    {
                        if (!wrapper2.WorkItem.ProxyWorkItemId.HasValue)
                        {
                            throw new ApplicationException("代理未设置代理工作项");
                        }
                        wrapper2.Parent = dictionary[wrapper2.WorkItem.ProxyWorkItemId.Value];
                        wrapper2.Parent.ProxyItems.Add(wrapper2);
                    }
                    else
                    {
                        source.Add(wrapper2);
                    }
                }
            }
            foreach (WorkItemWrapper wrapper3 in source)
            {
                wrapper3.TryCompleteDeeply();
            }
            foreach (WorkItemWrapper wrapper5 in source)
            {
                wrapper5.CalResultDeeply();
            }
            SysActivityParticipant participant = base.AI.Activity.ActivityParticipants.FirstOrDefault <SysActivityParticipant>(p => p.ActivityParticipantId == group.ActivityParticipantId);

            if (participant == null)
            {
                throw new ApplicationException("根据群组实例查找【活动参与人】失败");
            }
            bool flag = false;

            if (participant.PassType == 1)
            {
                if (!participant.MinPassNum.HasValue)
                {
                    participant.MinPassNum = 1;
                }
                if (participant.MinPassNum.Value <= 0)
                {
                    participant.MinPassNum = 1;
                }
                int num  = 0;
                int num2 = 0;
                int num3 = 0;
                foreach (WorkItemWrapper wrapper7 in source)
                {
                    if (wrapper7.IsCompleted)
                    {
                        num3++;
                        bool?approveResult = wrapper7.ApproveResult;
                        if (approveResult.HasValue ? approveResult.GetValueOrDefault() : false)
                        {
                            num++;
                        }
                        if (wrapper7.ApproveResult.HasValue && !wrapper7.ApproveResult.Value)
                        {
                            num2++;
                        }
                    }
                }
                int num4 = participant.MinPassNum.Value;
                if (num3 >= source.Count)
                {
                    flag           = true;
                    approve_result = num >= num4;
                    return(flag);
                }
                bool?sumAfterAllComplete = base.AI.Activity.SumAfterAllComplete;
                if (sumAfterAllComplete.HasValue ? sumAfterAllComplete.GetValueOrDefault() : false)
                {
                    return(false);
                }
                if (num >= num4)
                {
                    flag           = true;
                    approve_result = true;
                    return(flag);
                }
                if (num2 > (source.Count - num4))
                {
                    flag           = true;
                    approve_result = false;
                }
                return(flag);
            }
            if (participant.PassType == 2)
            {
                if (!participant.MinPassRatio.HasValue)
                {
                    throw new ApplicationException("未指定最小通过率");
                }
                if (participant.MinPassRatio <= 0.0)
                {
                    throw new ApplicationException("最小通过率<=0, 它必须介于0-100之间(大于0,小于等于100");
                }
                if (participant.MinPassRatio > 100.0)
                {
                    throw new ApplicationException("最小通过率>100, 它必须介于0-100之间(大于0,小于等于100");
                }
                int num5  = 0;
                int num6  = 0;
                int num7  = 0;
                int count = source.Count;
                foreach (WorkItemWrapper wrapper8 in source)
                {
                    if (wrapper8.IsCompleted)
                    {
                        num7++;
                        bool?nullable17 = wrapper8.ApproveResult;
                        if (nullable17.HasValue ? nullable17.GetValueOrDefault() : false)
                        {
                            num5++;
                        }
                        if (wrapper8.ApproveResult.HasValue && !wrapper8.ApproveResult.Value)
                        {
                            num6++;
                        }
                    }
                }
                double num9 = participant.MinPassRatio.Value;
                if (num7 >= source.Count)
                {
                    flag           = true;
                    approve_result = (num5 * 100.0) >= (count * num9);
                    return(flag);
                }
                bool?nullable19 = base.AI.Activity.SumAfterAllComplete;
                if (nullable19.HasValue ? nullable19.GetValueOrDefault() : false)
                {
                    return(false);
                }
                double num10 = 100.0;
                if ((num5 * num10) >= (count * num9))
                {
                    flag           = true;
                    approve_result = true;
                    return(flag);
                }
                if (((1.0 * num6) / ((double)count)) > ((100.0 - num9) / 100.0))
                {
                    flag           = true;
                    approve_result = true;
                }
                return(flag);
            }
            WorkItemWrapper wrapper9 = source.FirstOrDefault <WorkItemWrapper>(p => p.IsCompleted && p.ApproveResult.HasValue);

            if (wrapper9 != null)
            {
                flag           = true;
                approve_result = wrapper9.ApproveResult.Value;
            }
            return(flag);
        }