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); } } }
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); }