/// <summary> /// 完成条件判断,根据signalData传递的数据加上历史数据判断当半数人员同意就流程就结束,同时记录该流程的终值,半数通过记true否则false. /// </summary> /// <param name="parent">当前任务节点的运行实例</param> /// <param name="multiInstanceActivity">多任务活动行为</param> /// <param name="signalData">提交的变量数据</param> /// <returns></returns> public override bool CompletionConditionSatisfied(IExecutionEntity parent, MultiInstanceActivityBehavior multiInstanceActivity, object signalData) { bool pass = base.CompletionConditionSatisfied(parent, multiInstanceActivity, signalData); if (pass) { parent.SetVariable(CompleteConditionVarName, true); return(true); } var config = Context.CommandContext.ProcessEngineConfiguration; object passed = parent.GetVariable(CompleteConditionVarName, true); if (passed is null || (bool.TryParse(passed.ToString(), out var p) && p)) { return(true); } var tf = (signalData as IDictionary <string, object>)[CompleteConditionVarName]; bool.TryParse(tf?.ToString(), out bool approvaled); int nrOfInstances = multiInstanceActivity.GetLoopVariable(parent, MultiInstanceActivityBehavior.NUMBER_OF_INSTANCES).GetValueOrDefault(0); int nrOfActiveInstances = multiInstanceActivity.GetLoopVariable(parent, MultiInstanceActivityBehavior.NUMBER_OF_ACTIVE_INSTANCES).GetValueOrDefault(0); int nrOfCompletedInstances = multiInstanceActivity.GetLoopVariable(parent, MultiInstanceActivityBehavior.NUMBER_OF_COMPLETED_INSTANCES).GetValueOrDefault(0); var assigneeType = (LeaveExection.CurrentFlowElement as UserTask).AssigneeType; bool halfPassed = AssigneeType.HALF_PASSED.Equals(assigneeType?.Value, StringComparison.OrdinalIgnoreCase); int votes = config.HistoryService.CreateHistoricVariableInstanceQuery() .SetProcessInstanceId(LeaveExection.ProcessInstanceId) .VariableValueEquals(CompleteConditionVarName, halfPassed) .List() .Where(x => string.IsNullOrWhiteSpace(x.TaskId) == false) .Count(); if ((votes + (approvaled & halfPassed ? 1 : !approvaled ? 1 : 0)) >= Math.Ceiling(nrOfInstances / 2M)) { parent.SetVariable(CompleteConditionVarName, true); return(true); } else if (votes + nrOfActiveInstances < Math.Ceiling(nrOfInstances / 2M)) { parent.SetVariable(CompleteConditionVarName, false); return(true); } else if (nrOfActiveInstances == 0) { parent.SetVariable(CompleteConditionVarName, false); return(true); } return(false); }
/// <summary> /// 完成条件判断,根据signalData传递的数据判断当前提交人是否同意,如果有一个提交人不同意,该任务就结束. /// </summary> /// <param name="parent">当前任务节点的运行实例</param> /// <param name="multiInstanceActivity">多任务活动行为</param> /// <param name="signalData">提交的变量数据</param> /// <returns></returns> public override bool CompletionConditionSatisfied(IExecutionEntity parent, MultiInstanceActivityBehavior multiInstanceActivity, object signalData) { int nrOfActiveInstances = multiInstanceActivity.GetLoopVariable(parent, MultiInstanceActivityBehavior.NUMBER_OF_ACTIVE_INSTANCES).GetValueOrDefault(0); bool pass = base.CompletionConditionSatisfied(parent, multiInstanceActivity, signalData); if (pass) { parent.SetVariable(CompleteConditionVarName, true); return(true); } var tf = (signalData as IDictionary <string, object>)[CompleteConditionVarName]; if (bool.TryParse(tf?.ToString(), out bool approvaled)) { if (!approvaled) { parent.SetVariable(CompleteConditionVarName, false); return(true); } parent.SetVariable(CompleteConditionVarName, true); } return(nrOfActiveInstances == 0); }