public async Task <object> Execute(RealWorkfolwActivityParameter parameter, RealWorkfolwContext context)
        {
            if (!_parameterHandleFactories.TryGetValue(parameter.ExpressionType, out IFactory <IRealWorkfolwActivityParameterHandle> handleFactory))
            {
                var fragment = new TextFragment()
                {
                    Code = TextCodes.NotFoundRealWorkfolwActivityParameterHandleByType,
                    DefaultFormatting = "找不到表达式类型为{0}的工作流活动参数处理",
                    ReplaceParameters = new List <object>()
                    {
                        parameter.ExpressionType
                    }
                };

                throw new UtilityException((int)Errors.NotFoundRealWorkfolwActivityParameterHandleByType, fragment);
            }
            var value = await handleFactory.Create().Execute(parameter, context);

            var dataHandle = _realWorkfolwActivityParameterDataHandleSelector.Choose(parameter.DataType);
            var result     = await dataHandle.Convert(value);

            if (!await dataHandle.ValidateType(result))
            {
                string strResult;
                if (result == null)
                {
                    strResult = "null";
                }
                else
                {
                    strResult = result.GetType().FullName;
                }

                var fragment = new TextFragment()
                {
                    Code = TextCodes.RealWorkfolwActivityParameterDataHandleValidateError,
                    DefaultFormatting = "工作流活动参数数据处理验证失败,验证器数据类型为{0},要验证的实际数据类型为{1},参数名称为{2}",
                    ReplaceParameters = new List <object>()
                    {
                        parameter.DataType, strResult, parameter.Name
                    }
                };

                var exception = new UtilityException((int)Errors.RealWorkfolwActivityParameterDataHandleValidateError, fragment);
                exception.Data[UtilityExceptionDataKeys.Catch] = true;
                throw exception;
            }
            return(result);
        }
Esempio n. 2
0
        public async Task <Dictionary <string, object> > Execute(RealWorkfolw workflow, RealWorkfolwContext context)
        {
            List <RealWorkfolwActivity> activities;

            if (!workflow.Extensions.TryGetValue("activities", out object objActivities))
            {
                activities = await _activityConfigurationService.SeparateActivities(workflow.Configuration);

                objActivities = activities;
                lock (workflow)
                {
                    workflow.Extensions["activities"] = objActivities;
                }
            }
            activities = (List <RealWorkfolwActivity>)objActivities;


            int index = 0, count = activities.Count;

            for (index = 0; index <= count - 1; index++)
            {
                var activityResult  = await activities[index].Calculate(context);
                var activityOutputs = await activities[index].GetOutputParameters();
                foreach (var activityResultItem in activityResult)
                {
                    if (!activityOutputs.TryGetValue(activityResultItem.Key, out RealWorkfolwActivityParameter outputParameter))
                    {
                        var fragment = new TextFragment()
                        {
                            Code = TextCodes.NotFoundRealWorkfolwActivityOutputParameterByActivityResult,
                            DefaultFormatting = "工作流活动{0}的结果中的输出参数名称{1}在工作流活动的输出参数中未定义,工作流id为{2}",
                            ReplaceParameters = new List <object>()
                            {
                                activities[index].ID.ToString(), activityResultItem.Key, workflow.ID.ToString()
                            }
                        };

                        throw new UtilityException((int)Errors.NotFoundRealWorkfolwActivityOutputParameterByActivityResult, fragment);
                    }

                    var outputDataHandle         = _realWorkfolwActivityParameterDataHandleSelector.Choose(outputParameter.DataType);
                    var outputDataValidateResult = await outputDataHandle.ValidateType(activityResultItem.Value);

                    if (!outputDataValidateResult)
                    {
                        string strResult;
                        if (activityResultItem.Value == null)
                        {
                            strResult = "null";
                        }
                        else
                        {
                            strResult = activityResultItem.Value.GetType().FullName;
                        }

                        var fragment = new TextFragment()
                        {
                            Code = TextCodes.RealWorkfolwActivityOutputParameterDataHandleValidateError,
                            DefaultFormatting = "工作流活动参数数据处理验证失败,验证器数据类型为{0},要验证的实际数据类型为{1},参数名称为{2},工作流活动Id为{3},工作流Id为{4}",
                            ReplaceParameters = new List <object>()
                            {
                                outputParameter.DataType, strResult, outputParameter.Name, activities[index].ID.ToString(), workflow.ID.ToString()
                            }
                        };

                        throw new UtilityException((int)Errors.RealWorkfolwActivityOutputParameterDataHandleValidateError, fragment);
                    }
                }
                context.ActivityOutputParameters[activities[index].ID.ToString()] = activityResult;
            }

            Dictionary <string, object> result = new Dictionary <string, object>();

            foreach (var resultItem in context.Result)
            {
                result.Add(resultItem.Key, resultItem.Value);
            }

            return(result);
        }