/// <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)); }
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)); }
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); }
public void OperateTest(string logicExpression, bool result) { var logicResult = LogicExpression.Operate(logicExpression); Assert.Equal(logicResult, result); }