Esempio n. 1
0
        public static Expression <Func <TScene, decimal> > GetIntegralExpression <TScene>(this Pharos.Logic.Entity.ReturnRules entity, Func <int, Expression, MemberExpression> memberExpression)//注:此处Pharos.Logic.Entity.ReturnRules引用在下次底层数据访问重构时候,新建Dao进行解耦
            where TScene : IScene, new()
        {
            var p = Expression.Parameter(typeof(TScene), "p");
            MemberExpression propertyName = memberExpression(entity.Mode, p);
            Expression       body         = null;

            switch (entity.OperationType) //返赠运算方式(0:按固定值;1:按固定比例;2:动态配置)
            {
            case 235:
                body = Expression.Constant(Convert.ToDecimal(entity.Expression));
                break;

            case 236:
                var rateConstant = Expression.Constant(Convert.ToDecimal(entity.Expression));
                body = Expression.Multiply(rateConstant, propertyName);
                break;

            case 237:    //TODO Call Dynamic Expression
                break;
            }
            return(Expression.Lambda <Func <TScene, decimal> >(body, p));
        }
Esempio n. 2
0
        public static Expression <Func <TScene, bool> > GetVerifyExpression <TScene>(this Pharos.Logic.Entity.ReturnRules entity, int providerId, Func <int, Expression, MemberExpression> memberExpression)
            where TScene : IScene, new()
        //注:此处Pharos.Logic.Entity.ReturnRules引用在下次底层数据访问重构时候,新建Dao进行解耦
        {
            var datetimeNow = DateTime.Now;

            switch (entity.AgingType)//时效匹配
            {
            case 1:
                var dayOfWeeks = new int[] {
                    !string.IsNullOrEmpty(entity.StartTime1)? Convert.ToInt32(entity.StartTime1):-1,
                    !string.IsNullOrEmpty(entity.StartTime2)? Convert.ToInt32(entity.StartTime2):-1,
                    !string.IsNullOrEmpty(entity.StartTime3)? Convert.ToInt32(entity.StartTime3):-1,
                    !string.IsNullOrEmpty(entity.EndTime1)? Convert.ToInt32(entity.EndTime1):-1,
                    !string.IsNullOrEmpty(entity.EndTime2)? Convert.ToInt32(entity.EndTime2):-1,
                    !string.IsNullOrEmpty(entity.EndTime3)? Convert.ToInt32(entity.EndTime3):-1,
                };
                if (!dayOfWeeks.Where(o => o != -1).Contains((int)datetimeNow.DayOfWeek))
                {
                    return(null);
                }
                break;

            case 2:

                var dayRanges = new KeyValuePair <DateTime, DateTime>[] {
                    string.IsNullOrEmpty(entity.StartTime1) || string.IsNullOrEmpty(entity.EndTime1)?
                    default(KeyValuePair <DateTime, DateTime>):
                    new KeyValuePair <DateTime, DateTime>(
                        Convert.ToDateTime(datetimeNow.ToString("yyyy-MM-dd") + " " + entity.StartTime1),
                        Convert.ToDateTime(datetimeNow.ToString("yyyy-MM-dd") + " " + entity.EndTime1)
                        ),
                    string.IsNullOrEmpty(entity.StartTime2) || string.IsNullOrEmpty(entity.EndTime2)?
                    default(KeyValuePair <DateTime, DateTime>):
                    new KeyValuePair <DateTime, DateTime>(
                        Convert.ToDateTime(datetimeNow.ToString("yyyy-MM-dd") + " " + entity.StartTime2),
                        Convert.ToDateTime(datetimeNow.ToString("yyyy-MM-dd") + " " + entity.EndTime2)
                        ),
                    string.IsNullOrEmpty(entity.StartTime3) || string.IsNullOrEmpty(entity.EndTime3)?
                    default(KeyValuePair <DateTime, DateTime>):
                    new KeyValuePair <DateTime, DateTime>(
                        Convert.ToDateTime(datetimeNow.ToString("yyyy-MM-dd") + " " + entity.StartTime3),
                        Convert.ToDateTime(datetimeNow.ToString("yyyy-MM-dd") + " " + entity.EndTime3)
                        ),
                };

                if (!dayRanges.Any(o => o.Key <= datetimeNow && o.Value >= datetimeNow))
                {
                    return(null);
                }
                break;
            }
            var p = Expression.Parameter(typeof(TScene), "p");
            MemberExpression propertyName = memberExpression(entity.Mode, p);
            Expression       body         = null;

            //计量范围
            Expression expression1 = GetLogicalOperationExpression(entity.LeftSign, entity.Number1, propertyName);

            if (entity.RightSign.HasValue && entity.Number2.HasValue)
            {
                var expression2 = GetLogicalOperationExpression(entity.RightSign.Value, entity.Number2.Value, propertyName);
                body = Expression.AndAlso(expression1, expression2);
            }
            else
            {
                body = expression1;
            }

            //限制规则提供程序
            var limitProvider   = Expression.Constant(entity.Adapters);
            var currentProvider = Expression.Constant(providerId);
            var ifEqualProvider = Expression.Equal(limitProvider, currentProvider);

            body = Expression.AndAlso(ifEqualProvider, body);
            //会员限定
            if (!string.IsNullOrEmpty(entity.MemberLevelId) && entity.MemberLevelId != "-1")
            {
                var level = Expression.Property(Expression.Property(p, "Member"), "MemberLevelId");
                body = Expression.AndAlso(body, Expression.Equal(Expression.Constant(entity.MemberLevelId), level));
            }
            return(Expression.Lambda <Func <TScene, bool> >(body, p));
        }