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);
        }
Beispiel #2
0
        public async Task <object> Execute(RealWorkfolwActivityParameter parameter, RealWorkfolwContext context)
        {
            RealWorkfolwActivityParameterExpressionDescription parameterDescription = null;

            if (!parameter.Extensions.TryGetValue("description", out object objDescription))
            {
                parameterDescription = await Resolve(parameter, parameter.Configuration);

                parameter.Extensions["description"] = parameterDescription;
            }
            else
            {
                parameterDescription = (RealWorkfolwActivityParameterExpressionDescription)objDescription;
            }
            return(await Calculate(parameterDescription, context));
        }
Beispiel #3
0
        private async Task <RealWorkfolwActivityParameterExpressionDescription> Resolve(RealWorkfolwActivityParameter parameter, string expression)
        {
            RealWorkfolwActivityParameterExpressionDescription result = new RealWorkfolwActivityParameterExpressionDescription();

            result.Expression = expression;

            var rootMatch = _regRoot.Match(expression);

            if (rootMatch.Success == false)
            {
                var fragment = new TextFragment()
                {
                    Code = TextCodes.RealWorkfolwActivityParameterHandleExecuteError,
                    DefaultFormatting = "工作流活动参数处理出错,错误原因:{0},参数名称:{1},参数数据类型:{2},参数表达式类型:{3},参数配置:{4},发生位置:{5}",
                    ReplaceParameters = new List <object>()
                    {
                        parameter.Name, parameter.DataType, parameter.ExpressionType, parameter.Configuration, $"{this.GetType().FullName}.Execute"
                    }
                };

                throw new UtilityException((int)Errors.RealWorkfolwActivityParameterHandleExecuteError, fragment);
            }
            string rootName;
            string strRootName      = rootMatch.Groups[1].Value;
            var    arrayStrRootName = strRootName.Split('_');

            rootName    = arrayStrRootName[0];
            result.Name = rootName;
            var expressions = _regExpression.Matches(rootMatch.Groups[2].Value);



            Dictionary <int, RealWorkfolwActivityParameterExpressionDescription> expressionParameters = new Dictionary <int, RealWorkfolwActivityParameterExpressionDescription>();

            int parIndex = 0;

            for (var index = 0; index <= expressions.Count - 1; index++)
            {
                expressionParameters[parIndex] = await Resolve(parameter, expressions[index].Value);

                parIndex++;
            }

            var newStrPars = _regExpression.Replace(rootMatch.Groups[2].Value, @"\n");

            var arrayParas = _regParSep.Split(newStrPars);

            parIndex = 0;
            List <object> inputs = new List <object>();

            foreach (var itemPara in arrayParas)
            {
                if (itemPara == @"\n")
                {
                    inputs.Add(expressionParameters[parIndex]);
                }
                else
                {
                    inputs.Add(itemPara.Replace(@"\,", @",").Replace(@"\)", @")").Replace(@"\(", @"(").Replace(@"\\", @"\"));
                }
            }

            result.Parameters = inputs;

            return(result);
        }