示例#1
0
        public bool CheckExpressionItemValid()
        {
            //格式化大小写敏感
            FormatAccordingtoIsDiffUpperOrLower();
            //获取字符串的对象信息
            _ExpressionItem            = Utility.GetExpressionItemByParameter(_ExpressionItemList, _Parameter);
            _ExpressionItem.Expression = Utility.FormatExpressionBase(_ExpressionItem.Expression);
            //验证字符串中是否有敏感语法标识符
            CheckExpressionStringFieldValid();
            //分离字符串
            string[] fields = _ExpressionItem.Expression.Split(Utility.CalculateSymbols, StringSplitOptions.None);
            //验证表达式中的字段是否有效
            CheckExpressionFieldValid(fields);
            //格式化字符串
            string formattedExpression = FormatExpression(fields);
            //带入进行测试运算
            Expression exEvaluate = new Expression(formattedExpression);

            exEvaluate.TaxFunction                       += TaxFunction;
            exEvaluate.TaxWithPointFunction              += TaxWithPointFunction;
            exEvaluate.AnnualBonusTaxFunction            += AnnualBonusTaxFunction;
            exEvaluate.ForeignTaxFunction                += ForeignTaxFunction;
            exEvaluate.AnnualBonusForeignTaxFunction     += AnnualBonusForeignTaxFunction;
            exEvaluate.IsSalaryEndDateMonthEquelFunction += IsSalaryEndDateMonthEquelFunction;
            exEvaluate.DoubleSalaryFunction              += DoubleSalaryFunction;
            object evaluateResult = exEvaluate.Evaluate();

            //验证参数的返回类型是否正确
            CheckResultDataType(evaluateResult);
            return(true);
        }
示例#2
0
        /// <summary>
        /// 将parameter中所用到的A1,A2,...An的值,递归替换成可计算的表达式
        /// 假设已知公式A3=A2+A1*50,A2=A1+3,A1=100,通过递归后A3=(100)+3+(100)*50
        /// 算法示例如下
        /// 传入参数parameter=A3
        /// GetItemByParameter根据parameter或取ExpressionItem对象,ExpressionItem.Parameter为A3,ExpressionItem.Expression为A2+A1*50
        /// GetParameterFromExpression将A2+A1*50中提取出相关参数A1和A2
        /// 先递归遍历A1,获取A1的表达式=100,替换A3公式中A1的部分,变为表达式A2+(100)*50
        /// 再递归A2,或取A2的表达式=A1+3,根据GetParameterFromExpression发现A2中有相关参数A1,则再次遍历A1,替换A2公式中A1的部分,A2变为表达式(100)+3
        /// A2递归结束后,替换A3公式中A2的部分,变为表达式(100)+3+(100)*50
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        private object ChangeParameterForCalculator(string parameter)
        {
            ExpressionItem expressionItem = Utility.GetExpressionItemByParameter(_ExpressionItemList, parameter);

            if (expressionItem == null)
            {
                throw new Exception(parameter + "没有定义,系统无法解释");
            }
            if (expressionItem.ExpressionForCalculator != null)
            {
                return(expressionItem.ExpressionForCalculator);//已经递归,可直接返回结果
            }
            //如果存在"<NULL>"说明条件值不够,不做计算,直接返回null
            if (expressionItem.Expression.Contains(Utility.NULLString))
            {
                expressionItem.Expression = Utility.NULLString;
            }
            expressionItem.ExpressionForCalculator = expressionItem.Expression;
            //替换%为*0.01
            expressionItem.ExpressionForCalculator = expressionItem.ExpressionForCalculator.Replace("%", "*0.01");

            ArrayList paras = Utility.GetParameterFromExpression(expressionItem.Expression, _ParameterName); //获得相关参数,无重复

            for (int i = 0; i < paras.Count; i++)
            {
                expressionItem.ExpressionForCalculator =
                    expressionItem.ExpressionForCalculator.Replace(paras[i].ToString(),
                                                                   "(" + ChangeParameterForCalculator(paras[i].ToString()) + ")");
            }
            return(expressionItem.ExpressionForCalculator);
        }
示例#3
0
        /// <summary>
        /// 根据参数名称,返回该参数的数据类型
        /// </summary>
        /// <param name="parameter"></param>
        /// <param name="expressionItemList"></param>
        /// <returns></returns>
        public static EnumDataType GetDataTypeByParameter(List <ExpressionItem> expressionItemList, string parameter)
        {
            ExpressionItem item = GetExpressionItemByParameter(expressionItemList, parameter);

            if (item == null)
            {
                throw new Exception(parameter + "没有定义,系统无法解释");
            }
            if (item.EnumDataType == EnumDataType.Other)
            {
                throw new Exception(parameter + "参数的数据类型不明,无法计算");
            }
            return(item.EnumDataType);
        }
        /// <summary>
        /// 检测parameter中所用到的A1,A2,...An的值,递归为dependenceMatrix赋值
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        private void FillDependenceMatrixByParameter(string parameter)
        {
            ExpressionItem expressionItem = Utility.GetExpressionItemByParameter(_ExpressionItemList, parameter);

            if (expressionItem == null)
            {
                throw new Exception(parameter + "没有定义,系统无法解释");
            }
            //获得当前parameter在_ExpressionItemList的Index
            int       parameterIndex = _ExpressionItemList.IndexOf(expressionItem);
            ArrayList paras          = Utility.GetParameterFromExpression(expressionItem.Expression, _ParameterName); //获得相关参数,无重复

            for (int i = 0; i < paras.Count; i++)
            {
                ExpressionItem factorExpressionItem =
                    Utility.GetExpressionItemByParameter(_ExpressionItemList, paras[i].ToString());
                if (factorExpressionItem == null)
                {
                    throw new Exception(paras[i] + "没有定义,系统无法解释");
                }
                //获得相关参数paras[i]在_ExpressionItemList的Index
                int factorIndex = _ExpressionItemList.IndexOf(factorExpressionItem);
                SetDependenceMatrixByParameterAndFactor(parameterIndex, factorIndex);
                //将factorIndex依赖的所有参数找出来,给parameterIndex和j确立依赖关系,即factorIndex得依赖项也是parameterIndex依赖项
                for (int j = 0; j < _ExpressionItemList.Count; j++)
                {
                    if (dependenceMatrix[factorIndex, j] == 1)
                    {
                        SetDependenceMatrixByParameterAndFactor(parameterIndex, j);
                    }
                }
                FillDependenceMatrixByParameter(paras[i].ToString());
            }
            //第parameterIndex个参数已经找过了所有要依赖的参数
            isFillDependenceMatrix[parameterIndex] = true;
        }