/// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }