private void LoadActivityInstance(SysActivityInstance ai, SysProcessInstance pi, SysProcess p)
        {
            ai.ProcessInstance = pi;
            ai.Activity        = p.Activities.FirstOrDefault <SysActivity>(i => i.ActivityId == ai.ActivityId);
            string condition = string.Format("ActivityInstanceId = {0}", ai.ActivityInstanceId);

            ai.WorkItems               = this._context.Where <SysWorkItem>(condition, new DbParameter[0]);
            ai.ApproveGroups           = this._context.Where <SysWorkItemApproveGroup>(condition, new DbParameter[0]);
            ai.FromTransitionInstances = this._context.Where <SysTransitionInstance>(string.Format("PreActivityInstanceId = {0}", ai.ActivityInstanceId), new DbParameter[0]);
            ai.ToTransitionInstances   = this._context.Where <SysTransitionInstance>(string.Format("PostActivityInstanceId = {0}", ai.ActivityInstanceId), new DbParameter[0]);
            ai.UserDefinedApproveUsers = this._context.Where <SysActivityInstanceApproveUsers>(string.Format("CurrentActivityInstanceId = {0}", ai.ActivityInstanceId), new DbParameter[0]);
            using (IEnumerator <SysWorkItem> enumerator = ai.WorkItems.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    Func <SysActivityParticipant, bool>  predicate = null;
                    Func <SysWorkItemApproveGroup, bool> func2     = null;
                    SysWorkItem wi = enumerator.Current;
                    wi.ActivityInstance = ai;
                    if (predicate == null)
                    {
                        predicate = i => i.ActivityParticipantId == wi.ActivityParticipantId;
                    }
                    wi.ActivityParticipant = ai.Activity.ActivityParticipants.FirstOrDefault <SysActivityParticipant>(predicate);
                    if (func2 == null)
                    {
                        func2 = i => i.ApproveGroupId == wi.ApproveGroupId;
                    }
                    wi.ApproveGroup = ai.ApproveGroups.FirstOrDefault <SysWorkItemApproveGroup>(func2);
                }
            }
            using (IEnumerator <SysWorkItemApproveGroup> enumerator2 = ai.ApproveGroups.GetEnumerator())
            {
                while (enumerator2.MoveNext())
                {
                    Func <SysWorkItem, bool> func3 = null;
                    SysWorkItemApproveGroup  ag    = enumerator2.Current;
                    ag.ActivityInstance = ai;
                    if (func3 == null)
                    {
                        func3 = delegate(SysWorkItem i) {
                            int?approveGroupId = i.ApproveGroupId;
                            int num            = ag.ApproveGroupId;
                            return((approveGroupId.GetValueOrDefault() == num) && approveGroupId.HasValue);
                        };
                    }
                    ag.WorkItems = ai.WorkItems.Where <SysWorkItem>(func3).ToList <SysWorkItem>();
                }
            }
            using (IEnumerator <SysTransitionInstance> enumerator3 = ai.FromTransitionInstances.GetEnumerator())
            {
                while (enumerator3.MoveNext())
                {
                    Func <SysActivityInstance, bool> func4 = null;
                    SysTransitionInstance            fti   = enumerator3.Current;
                    if (func4 == null)
                    {
                        func4 = x => x.ActivityInstanceId == fti.PostActivityInstanceId;
                    }
                    fti.PostActivityInstance = pi.ActivityInstances.FirstOrDefault <SysActivityInstance>(func4);
                    fti.PreActivityInstance  = ai;
                }
            }
            using (IEnumerator <SysTransitionInstance> enumerator4 = ai.ToTransitionInstances.GetEnumerator())
            {
                while (enumerator4.MoveNext())
                {
                    Func <SysActivityInstance, bool> func5 = null;
                    SysTransitionInstance            tti   = enumerator4.Current;
                    tti.PostActivityInstance = ai;
                    if (func5 == null)
                    {
                        func5 = x => x.ActivityInstanceId == tti.PreActivityInstanceId;
                    }
                    tti.PreActivityInstance = pi.ActivityInstances.FirstOrDefault <SysActivityInstance>(func5);
                }
            }
        }
示例#2
0
        internal SysProcessInstance LoadProcessInstance(long processInstanceId)
        {
            SysProcessInstance instance = this._context.FindById <SysProcessInstance>(new object[] { processInstanceId });

            if (instance == null)
            {
                throw new ApplicationException("流程实例ID不正确");
            }
            if (instance.FormInstanceId.HasValue)
            {
                instance.FormInstance = this._context.FindById <SysFormInstance>(new object[] { instance.FormInstanceId });
                if (instance.FormInstance == null)
                {
                    throw new ApplicationException("流程实例关联表单实例不存在");
                }
            }
            string condition = string.Format("ProcessInstanceId = {0}", instance.ProcessInstanceId);
            List <SysActivityInstance>             list   = this._context.Where <SysActivityInstance>(condition, new DbParameter[0]);
            List <SysWorkItem>                     source = this._context.Where <SysWorkItem>(condition, new DbParameter[0]);
            List <SysWorkItemApproveGroup>         list3  = this._context.Where <SysWorkItemApproveGroup>(condition, new DbParameter[0]);
            List <SysTransitionInstance>           list4  = this._context.Where <SysTransitionInstance>(condition, new DbParameter[0]);
            List <SysActivityInstanceApproveUsers> list5  = this._context.Where <SysActivityInstanceApproveUsers>(condition, new DbParameter[0]);

            instance.ActivityInstances = list;
            SysProcess processCache = this._cacheFactory.GetProcessCache(instance.ProcessId.Value);

            instance.Process = processCache;
            using (IEnumerator <SysActivityInstance> enumerator = instance.ActivityInstances.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    Func <SysActivity, bool>                     predicate = null;
                    Func <SysWorkItem, bool>                     func7     = null;
                    Func <SysWorkItemApproveGroup, bool>         func8     = null;
                    Func <SysTransitionInstance, bool>           func9     = null;
                    Func <SysTransitionInstance, bool>           func10    = null;
                    Func <SysActivityInstanceApproveUsers, bool> func11    = null;
                    SysActivityInstance ai = enumerator.Current;
                    ai.ProcessInstance = instance;
                    if (predicate == null)
                    {
                        predicate = i => i.ActivityId == ai.ActivityId;
                    }
                    ai.Activity = processCache.Activities.FirstOrDefault <SysActivity>(predicate);
                    if (func7 == null)
                    {
                        func7 = delegate(SysWorkItem i) {
                            int?activityInstanceId = i.ActivityInstanceId;
                            int num = ai.ActivityInstanceId;
                            return((activityInstanceId.GetValueOrDefault() == num) && activityInstanceId.HasValue);
                        };
                    }
                    ai.WorkItems = source.Where <SysWorkItem>(func7).ToList <SysWorkItem>();
                    if (func8 == null)
                    {
                        func8 = delegate(SysWorkItemApproveGroup i) {
                            int?activityInstanceId = i.ActivityInstanceId;
                            int num = ai.ActivityInstanceId;
                            return((activityInstanceId.GetValueOrDefault() == num) && activityInstanceId.HasValue);
                        };
                    }
                    ai.ApproveGroups = list3.Where <SysWorkItemApproveGroup>(func8).ToList <SysWorkItemApproveGroup>();
                    if (func9 == null)
                    {
                        func9 = delegate(SysTransitionInstance i) {
                            int?preActivityInstanceId = i.PreActivityInstanceId;
                            int activityInstanceId    = ai.ActivityInstanceId;
                            return((preActivityInstanceId.GetValueOrDefault() == activityInstanceId) && preActivityInstanceId.HasValue);
                        };
                    }
                    ai.FromTransitionInstances = list4.Where <SysTransitionInstance>(func9).ToList <SysTransitionInstance>();
                    if (func10 == null)
                    {
                        func10 = delegate(SysTransitionInstance i) {
                            int?postActivityInstanceId = i.PostActivityInstanceId;
                            int activityInstanceId     = ai.ActivityInstanceId;
                            return((postActivityInstanceId.GetValueOrDefault() == activityInstanceId) && postActivityInstanceId.HasValue);
                        };
                    }
                    ai.ToTransitionInstances = list4.Where <SysTransitionInstance>(func10).ToList <SysTransitionInstance>();
                    if (func11 == null)
                    {
                        func11 = delegate(SysActivityInstanceApproveUsers i) {
                            int?currentActivityInstanceId = i.CurrentActivityInstanceId;
                            int activityInstanceId        = ai.ActivityInstanceId;
                            return((currentActivityInstanceId.GetValueOrDefault() == activityInstanceId) && currentActivityInstanceId.HasValue);
                        };
                    }
                    ai.UserDefinedApproveUsers = list5.Where <SysActivityInstanceApproveUsers>(func11).ToList <SysActivityInstanceApproveUsers>();
                    using (IEnumerator <SysWorkItem> enumerator2 = ai.WorkItems.GetEnumerator())
                    {
                        while (enumerator2.MoveNext())
                        {
                            Func <SysActivityParticipant, bool>  func  = null;
                            Func <SysWorkItemApproveGroup, bool> func2 = null;
                            SysWorkItem wi = enumerator2.Current;
                            wi.ProcessInstance  = instance;
                            wi.ActivityInstance = ai;
                            if (func == null)
                            {
                                func = i => i.ActivityParticipantId == wi.ActivityParticipantId;
                            }
                            wi.ActivityParticipant = ai.Activity.ActivityParticipants.FirstOrDefault <SysActivityParticipant>(func);
                            if (func2 == null)
                            {
                                func2 = i => i.ApproveGroupId == wi.ApproveGroupId;
                            }
                            wi.ApproveGroup = ai.ApproveGroups.FirstOrDefault <SysWorkItemApproveGroup>(func2);
                        }
                    }
                    using (IEnumerator <SysWorkItemApproveGroup> enumerator3 = ai.ApproveGroups.GetEnumerator())
                    {
                        while (enumerator3.MoveNext())
                        {
                            Func <SysWorkItem, bool> func3 = null;
                            SysWorkItemApproveGroup  ag    = enumerator3.Current;
                            ag.ActivityInstance = ai;
                            if (func3 == null)
                            {
                                func3 = delegate(SysWorkItem i) {
                                    int?approveGroupId = i.ApproveGroupId;
                                    int num            = ag.ApproveGroupId;
                                    return((approveGroupId.GetValueOrDefault() == num) && approveGroupId.HasValue);
                                };
                            }
                            ag.WorkItems = ai.WorkItems.Where <SysWorkItem>(func3).ToList <SysWorkItem>();
                        }
                    }
                    using (IEnumerator <SysTransitionInstance> enumerator4 = ai.FromTransitionInstances.GetEnumerator())
                    {
                        while (enumerator4.MoveNext())
                        {
                            Func <SysActivityInstance, bool> func4 = null;
                            SysTransitionInstance            fti   = enumerator4.Current;
                            if (func4 == null)
                            {
                                func4 = x => x.ActivityInstanceId == fti.PostActivityInstanceId;
                            }
                            fti.PostActivityInstance = instance.ActivityInstances.FirstOrDefault <SysActivityInstance>(func4);
                            fti.PreActivityInstance  = ai;
                        }
                    }
                    using (IEnumerator <SysTransitionInstance> enumerator5 = ai.ToTransitionInstances.GetEnumerator())
                    {
                        while (enumerator5.MoveNext())
                        {
                            Func <SysActivityInstance, bool> func5 = null;
                            SysTransitionInstance            tti   = enumerator5.Current;
                            tti.PostActivityInstance = ai;
                            if (func5 == null)
                            {
                                func5 = x => x.ActivityInstanceId == tti.PreActivityInstanceId;
                            }
                            tti.PreActivityInstance = instance.ActivityInstances.FirstOrDefault <SysActivityInstance>(func5);
                        }
                        continue;
                    }
                }
            }
            return(instance);
        }
        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);
            }
        }
        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);
        }