private GetActivityMulitipleInstanceWithState ( int mainActivityInstanceID, int processInstanceID, short activityState, IDbSession session ) : List |
||
mainActivityInstanceID | int | 会签节点 |
processInstanceID | int | 流程实例ID |
activityState | short | |
session | IDbSession | session会话 |
Результат | List |
/// <summary> /// 判断任务是否是当前节点最后一个任务 /// 单一节点:返回True /// 多实例节点:根据实例个数判断 /// </summary> /// <param name="taskID">任务ID</param> /// <returns>是否最后一条任务</returns> public Boolean IsLastTask(int taskID) { var isLast = false; var task = GetTask(taskID); var aim = new ActivityInstanceManager(); var activityInstance = aim.GetById(task.ActivityInstanceID); if (aim.IsMultipleInstanceChildren(activityInstance) == true) { //多实例会签和加签处理 //取出会签主节点实例数据 var mainActivityInstance = aim.GetById(activityInstance.MIHostActivityInstanceID.Value); var complexType = EnumHelper.ParseEnum <ComplexTypeEnum>(mainActivityInstance.ComplexType.Value.ToString()); if (complexType == ComplexTypeEnum.SignTogether) //会签 { var mergeType = EnumHelper.ParseEnum <MergeTypeEnum>(mainActivityInstance.MergeType.Value.ToString()); if (mergeType == MergeTypeEnum.Sequence) //串行会签 { //取出处于多实例挂起的节点列表 var sqList = aim.GetActivityMulitipleInstanceWithState( mainActivityInstance.ID, mainActivityInstance.ProcessInstanceID, (short)ActivityStateEnum.Suspended).ToList <ActivityInstanceEntity>(); short allNum = (short)mainActivityInstance.AssignedToUserIDs.Split(',').Length; short maxOrder = 0; if (sqList != null && sqList.Count > 0) { //取出最大执行节点 maxOrder = (short)sqList.Max <ActivityInstanceEntity>(t => t.CompleteOrder.Value); } else if (mainActivityInstance.CompleteOrder <= allNum) { //最后一个执行节点 maxOrder = (short)mainActivityInstance.CompleteOrder.Value; } else { maxOrder = allNum; } if (mainActivityInstance.CompareType == null || EnumHelper.ParseEnum <CompareTypeEnum>(mainActivityInstance.CompareType.Value.ToString()) == CompareTypeEnum.Count) { //串行会签通过率(按人数判断) if (mainActivityInstance.CompleteOrder != null && mainActivityInstance.CompleteOrder <= maxOrder) { maxOrder = (short)mainActivityInstance.CompleteOrder; } if (activityInstance.CompleteOrder < maxOrder) { isLast = false; } else if (activityInstance.CompleteOrder == maxOrder) { isLast = true; } } else { if (mainActivityInstance.CompleteOrder == null || mainActivityInstance.CompleteOrder > 1)//串行会签未设置通过率的判断 { mainActivityInstance.CompleteOrder = 1; } if ((activityInstance.CompleteOrder * 0.01) / (allNum * 0.01) >= mainActivityInstance.CompleteOrder) { isLast = true; } else { isLast = false; } } } else if (mergeType == MergeTypeEnum.Parallel) //并行会签 { //取出处于多实例节点列表 var sqList = aim.GetActivityMulitipleInstanceWithState( mainActivityInstance.ID, mainActivityInstance.ProcessInstanceID, null).ToList <ActivityInstanceEntity>(); var allCount = sqList.Where(x => x.ActivityState != (short)ActivityStateEnum.Withdrawed).ToList().Count(); var completedCount = sqList.Where <ActivityInstanceEntity>(w => w.ActivityState == (short)ActivityStateEnum.Completed || w.AssignedToUserIDs == task.AssignedToUserID) .ToList <ActivityInstanceEntity>() .Count(); if (mainActivityInstance.CompareType == null || (EnumHelper.ParseEnum <CompareTypeEnum>(mainActivityInstance.CompareType.Value.ToString()) == CompareTypeEnum.Percentage)) { if (mainActivityInstance.CompleteOrder == null || mainActivityInstance.CompleteOrder > 1)//并行会签未设置通过率的判断 { mainActivityInstance.CompleteOrder = 1; } if ((completedCount * 0.01) / (allCount * 0.01) >= mainActivityInstance.CompleteOrder) { isLast = true; } else { isLast = false; } } else { if (mainActivityInstance.CompleteOrder == null || mainActivityInstance.CompleteOrder > allCount) { mainActivityInstance.CompleteOrder = allCount; } if (mainActivityInstance.CompleteOrder > completedCount) { isLast = false; } else if (mainActivityInstance.CompleteOrder == completedCount) { isLast = true; } } } } else if (complexType == ComplexTypeEnum.SignForward) //加签 { //判断加签是否全部完成,如果是,则流转到下一步,否则不能流转 var signforwardType = EnumHelper.ParseEnum <SignForwardTypeEnum>(activityInstance.SignForwardType.Value.ToString()); if (signforwardType == SignForwardTypeEnum.SignForwardBehind || signforwardType == SignForwardTypeEnum.SignForwardBefore) //前加签,后加签 { //取出处于多实例节点列表 var sqList = aim.GetActivityMulitipleInstanceWithState( mainActivityInstance.ID, mainActivityInstance.ProcessInstanceID, (short)ActivityStateEnum.Suspended).ToList <ActivityInstanceEntity>(); short maxOrder = 0; if (sqList != null && sqList.Count > 0) { //取出最大执行节点 maxOrder = (short)sqList.Max <ActivityInstanceEntity>(t => t.CompleteOrder.Value); } else { //最后一个执行节点 maxOrder = (short)activityInstance.CompleteOrder;// (short)mainActivityInstance.CompleteOrder.Value; } if (mainActivityInstance.CompareType == null || EnumHelper.ParseEnum <CompareTypeEnum>(mainActivityInstance.CompareType.Value.ToString()) == CompareTypeEnum.Count) { //加签通过率 if (mainActivityInstance.CompleteOrder != null && mainActivityInstance.CompleteOrder <= maxOrder) { maxOrder = (short)mainActivityInstance.CompleteOrder; } if (activityInstance.CompleteOrder == sqList.Count) { isLast = true; } else if (activityInstance.CompleteOrder < maxOrder) { isLast = false; } else if (activityInstance.CompleteOrder == maxOrder) { //最后一个节点执行完,主节点进入完成状态,整个流程向下执行 isLast = true; } } else { if (mainActivityInstance.CompleteOrder == null || mainActivityInstance.CompleteOrder > 1)//串行加签未设置通过率的判断 { mainActivityInstance.CompleteOrder = 1; } if ((activityInstance.CompleteOrder * 0.01) / (maxOrder * 0.01) >= mainActivityInstance.CompleteOrder) { isLast = true; } else { isLast = false; } } } else if (signforwardType == SignForwardTypeEnum.SignForwardParallel) //并行加签 { //取出处于多实例节点列表 var sqList = aim.GetActivityMulitipleInstanceWithState( mainActivityInstance.ID, mainActivityInstance.ProcessInstanceID, null).ToList <ActivityInstanceEntity>(); //并行加签,按照通过率来决定是否标识当前节点完成 var allCount = sqList.Where(x => x.ActivityState != (short)ActivityStateEnum.Withdrawed).ToList().Count(); var completedCount = sqList.Where <ActivityInstanceEntity>(w => w.ActivityState == (short)ActivityStateEnum.Completed || w.AssignedToUserIDs == task.AssignedToUserID) .ToList <ActivityInstanceEntity>() .Count(); if (mainActivityInstance.CompareType == null || EnumHelper.ParseEnum <CompareTypeEnum>(mainActivityInstance.CompareType.Value.ToString()) == CompareTypeEnum.Percentage) { if (mainActivityInstance.CompleteOrder > 1)//并行加签通过率的判断 { mainActivityInstance.CompleteOrder = 1; } if ((completedCount * 0.01) / (allCount * 0.01) >= mainActivityInstance.CompleteOrder) { isLast = true; } else { isLast = false; } } else { if (mainActivityInstance.CompleteOrder == null || mainActivityInstance.CompleteOrder > allCount) { mainActivityInstance.CompleteOrder = allCount; } if (mainActivityInstance.CompleteOrder > completedCount) { isLast = false; } else if (mainActivityInstance.CompleteOrder == completedCount) { isLast = true; } } } } } else { //单一节点类型 isLast = true; } return(isLast); }