Esempio n. 1
0
        /// <summary>
        ///     获取当前会员等级是否满足条件
        /// </summary>
        /// <param name="gradeInfo"></param>
        /// <param name="user"></param>
        /// <returns></returns>
        public Tuple <bool, Guid> GetKpiResult(GradeInfo gradeInfo, User user)
        {
            var autoUpgradeConfigs    = Resolve <IAutoConfigService>().GetList <AutoUpgradeConfig>();
            var userAutoUpgradeConfig = autoUpgradeConfigs.FirstOrDefault(r => r.GradeId == user.GradeId);

            // 判断升级Id高于当前Id

            if (userAutoUpgradeConfig != null)
            {
                var grades      = Resolve <IGradeService>().GetUserGradeList();
                var grade       = grades.FirstOrDefault(r => r.Id == userAutoUpgradeConfig.GradeId);
                var changeGrade = grades.FirstOrDefault(r => r.Id == userAutoUpgradeConfig.ChangeGradeId);
                if (changeGrade?.Contribute <= grade?.Contribute || grade == null || changeGrade == null) // 配置出错
                {
                    return(Tuple.Create(false, Guid.Empty));
                }

                var logicalOperator = userAutoUpgradeConfig.LogicalOperator;
                foreach (var upgradeItem in userAutoUpgradeConfig.UpgradeItems)
                {
                    var result = GetKpiItemResult(gradeInfo, upgradeItem);
                    // 将唯一标识,用条件结果替换
                    logicalOperator = logicalOperator.Replace(upgradeItem.Key, result.ToString().ToLower());
                }

                var kpiResult = LogicExpression.Operate(logicalOperator);
                if (kpiResult) // 考核通过
                {
                    return(Tuple.Create(true, userAutoUpgradeConfig.ChangeGradeId));
                }
            }

            return(Tuple.Create(false, Guid.Empty));
        }
Esempio n. 2
0
        public Tuple <bool, List <GradeKpiItem> > KpiItemOperator(User user, IList <KpiItem> kpiItems,
                                                                  string logicalOperator, TimeType timeType)
        {
            // 条件结果

            var oldOperator      = logicalOperator;
            var kpiItemResult    = false;
            var gradeKpiItemList = new List <GradeKpiItem>();

            foreach (var kpiItem in kpiItems)
            {
                var kpi = new Kpi
                {
                    ModuleId = kpiItem.KpiConfigId,
                    UserId   = user.Id,
                    Type     = timeType
                };
                // 最后一条Kpi考核记录
                var lastKpi = Resolve <IKpiService>().GetLastSingle(kpi);
                if (lastKpi != null)
                {
                    kpiItemResult =
                        LinqHelper.CompareByOperator(kpiItem.OperatorCompare, kpiItem.Amount, lastKpi.TotalValue);

                    // 记录记录
                    var kpiConfig = Resolve <IAutoConfigService>().GetList <KpiAutoConfig>().ToList()
                                    .FirstOrDefault(r => r.Id == kpiItem.KpiConfigId);
                    var gradeKpiItem = new GradeKpiItem
                    {
                        Amount      = lastKpi.TotalValue,
                        KpiId       = kpi.Id,
                        KpiName     = kpiConfig?.Name,
                        KpiConfigId = kpiConfig?.Id
                    };
                    gradeKpiItemList.Add(gradeKpiItem);
                }
                else
                {
                    kpiItemResult = false;
                }

                // 将唯一标识,用条件结果替换
                logicalOperator = logicalOperator.Replace(kpiItem.Key, kpiItemResult.ToString().ToLower());
            }

            // 根据逻辑计算结算结果
            try
            {
                kpiItemResult = LogicExpression.Operate(logicalOperator);
            }
            catch
            {
                throw new ValidException("计算报错,请确认逻辑运算符格式是否正确,逻辑预算符:" + oldOperator);
            }

            return(Tuple.Create(kpiItemResult, gradeKpiItemList));
        }
Esempio n. 3
0
        public void OperateTest_2()
        {
            var arrLogicValue = new bool[6] {
                true, false, false, true, false, true
            };


            //假设所有bool值都用一个字母表示,也可以使用多个字母,但是需要统一字母的数量
            var logicExpression = " ((AA && !BB)|| CC) && DD ||(EE && FF)";
            var logicResult     = LogicExpression.Operate(logicExpression, arrLogicValue.ToList());

            Assert.Equal(logicResult, true);
        }
Esempio n. 4
0
        public void OperateTest(string logicExpression, bool result)
        {
            var logicResult = LogicExpression.Operate(logicExpression);

            Assert.Equal(logicResult, result);
        }