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