/// <summary> /// 计算评分 /// </summary> /// <param name="checkTypeKind">检查类型性质</param> /// <returns>经销商列表</returns> public List <Dealer> GetGrade(bool checkTypeKind = false) { DataTable calc = new DataTable(); GetGradeLog = ""; foreach (Dealer dealer in Dealers) { if (ReCordLog) { GetGradeLog += string.Format(@"经销商信息:{0},{1},{2},{3}", dealer.DealerId, dealer.DealerName, dealer.DealerKind, dealer.DealerType); } foreach (ScoreGroup group in Scores) { if (ReCordLog) { GetGradeLog += string.Format(@"评分组信息:{0},{1}", group.DealerIntranet, group.DealerType); } double totalScore = 0; foreach (Score score in group.ScoreList) { if (ReCordLog) { GetGradeLog += string.Format(@"评分信息:{0},{1}", score.ScoreName, score.Expression); } score.RealScore = 0; string tmpExpression = score.Expression; foreach (Detail detail in score.DetailList) { detail.dataValue = 0; } foreach (Detail detail in score.DetailList) { if (ReCordLog) { GetGradeLog += string.Format(@"详细信息:{0}", detail.Rate); } foreach (Option option in detail.Options) { DealerData dealerData = dealer.DataList.FirstOrDefault(x => x.Variable == option.MatchingVariable); switch (option.MatchingType) { case MatchingType.Range: { if (dealerData == null || dealerData.Values == null) { continue; } double dataValue; if (double.TryParse(dealerData.Values.ToString(), out dataValue) == false) { continue; } if (option.RangeFrom <= dataValue && option.RangeTo > dataValue) { if (ReCordLog) { GetGradeLog += string.Format(@"匹配得分:{0},{1},{2},{3},{4},{5}", option.MatchingVariable, Enum.GetName(typeof(MatchingType), option.MatchingType), option.RangeFrom, option.RangeTo, option.Value, dealerData == null ? "null" : dealerData.Values); } detail.dataValue += option.Value; } } break; case MatchingType.Exists: { if (dealerData == null || dealerData.Values == null) { continue; } if (!string.IsNullOrWhiteSpace(dealerData.Values.ToString())) { if (ReCordLog) { GetGradeLog += string.Format(@"匹配得分:{0},{1},{2},{3}", option.MatchingVariable, Enum.GetName(typeof(MatchingType), option.MatchingType), option.Value, dealerData == null ? "null" : dealerData.Values); } detail.dataValue += option.Value; } } break; case MatchingType.NotExists: { if (dealerData == null || dealerData.Values == null || string.IsNullOrWhiteSpace(dealerData.Values.ToString())) { if (ReCordLog) { GetGradeLog += string.Format(@"匹配得分:{0},{1},{2}", option.MatchingVariable, Enum.GetName(typeof(MatchingType), option.MatchingType), option.Value); } detail.dataValue += option.Value; } } break; case MatchingType.Equal: { if (dealerData == null || dealerData.Values == null) { continue; } switch (dealerData.DealerDataType) { case DealerDataType.Single: { if (option.EqualText.ToLower() == dealerData.Values.ToString().ToLower()) { if (ReCordLog) { GetGradeLog += string.Format(@"匹配得分:{0},{1},{2},{3},{4}", option.MatchingVariable, Enum.GetName(typeof(MatchingType), option.MatchingType), option.EqualText, option.Value, dealerData == null ? "null" : dealerData.Values); } detail.dataValue += option.Value; } } break; case DealerDataType.Array: { List <string> values = dealerData.Values as List <string>; if (values != null && values.FirstOrDefault(x => x.ToLower() == option.EqualText.ToLower()) != null) { string vvvv = ""; foreach (var item in values) { vvvv += item + ","; } if (ReCordLog) { GetGradeLog += string.Format(@"匹配得分:{0},{1},{2},{3},{4}", option.MatchingVariable, Enum.GetName(typeof(MatchingType), option.MatchingType), option.EqualText, option.Value, vvvv); } detail.dataValue += option.Value; } } break; } } break; } } if (ReCordLog) { GetGradeLog += string.Format(@"单项得分:{0}", detail.dataValue); } } double tmpScore; try { int startIndex = tmpExpression.IndexOf('{'); while (startIndex >= 0) { int endIndex = tmpExpression.IndexOf('}', startIndex); string varExp = tmpExpression.Substring(startIndex + 1, endIndex - startIndex - 1); Detail detail = score.DetailList.FirstOrDefault(x => x.ObjectId == varExp); tmpExpression = tmpExpression.Replace("{" + varExp + "}", detail == null ? "0" : (detail.dataValue * detail.Rate).ToString()); startIndex = tmpExpression.IndexOf('{', startIndex + 1); } tmpExpression = DivisionZero(tmpExpression, score.DetailList); object transcation = calc.Compute(tmpExpression, ""); tmpScore = double.Parse(transcation.ToString()); } catch { tmpScore = 0; } if (ReCordLog) { GetGradeLog += string.Format(@"单组未加权得分:{0},{1}", score.ScoreName, tmpScore); } score.RealScore = tmpScore; totalScore += score.Weight * tmpScore / 100; if (ReCordLog) { GetGradeLog += string.Format(@"单组得加权分:{0},{1},{2}", score.ScoreName, score.Weight, score.Weight * tmpScore / 100); } } if (ReCordLog) { GetGradeLog += string.Format(@"总体得分:{0}", totalScore); } Grade grade = group.GradeList.FirstOrDefault(x => x.ScoreFrom <= totalScore && totalScore <= x.ScoreTo); if (ReCordLog) { GetGradeLog += string.Format(@"匹配等级:{0}", grade == null ? "未匹配" : grade.Name + "," + grade.ScoreFrom + "," + grade.ScoreTo); } List <Score> ss = new List <Score>(); foreach (Score item in group.ScoreList) { ss.Add(new Score() { Expression = item.Expression, ObjectId = item.ObjectId, RealScore = item.RealScore, ScoreName = item.ScoreName, Weight = item.Weight }); } DealerResult dealerResult = new DealerResult() { DealerIntranet = group.DealerIntranet, DealerType = group.DealerType, ResultGrade = (grade ?? new Grade() { Name = "" }).Name, TotalScore = totalScore, Scores = ss }; dealer.ResultList.Add(dealerResult); } dealer.DataList = new List <DealerData>(); if (checkTypeKind) { for (int i = dealer.ResultList.Count - 1; i >= 0; i--) { if (dealer.DealerKind != null && dealer.DealerType != null && dealer.ResultList[i].DealerIntranet.ToLower() == dealer.DealerKind.ToLower() && dealer.ResultList[i].DealerType.ToLower() == dealer.DealerType.ToLower()) { continue; } else { dealer.ResultList.RemoveAt(i); } } while (dealer.ResultList.Count > 1) { dealer.ResultList.RemoveAt(dealer.ResultList.Count - 1); } } string scoreLog = ""; foreach (var res in dealer.ResultList) { scoreLog += " " + res.DealerIntranet + "|" + res.DealerType + "[" + res.TotalScore + "|" + res.ResultGrade + "]{"; foreach (var score in res.Scores) { scoreLog += "(" + score.ScoreName + "|" + score.RealScore + ")"; } scoreLog += @" "; } if (ReCordLog) { GetGradeLog += string.Format(@"经销商最终得分:{0},{1}{2}", dealer.DealerName, dealer.DealerId, scoreLog); } } return(Dealers); }
/// <summary> /// 读取评分结构 /// </summary> /// <param name="row">行数据</param> /// <param name="structNames">字段结构</param> public void PushScoreIntoGroup(DataRow row, StructNames structNames) { try { ScoreGroup group = Scores.FirstOrDefault(x => x.ObjectId == row[structNames.GroupNames.ObjectId].ToString()); if (group == null) { group = new ScoreGroup() { ObjectId = row[structNames.GroupNames.ObjectId].ToString(), DealerIntranet = row[structNames.GroupNames.DealerIntranet].ToString(), DealerType = row[structNames.GroupNames.DealerType].ToString() }; Scores.Add(group); } Score score = group.ScoreList.FirstOrDefault(x => x.ObjectId == row[structNames.ScoreNames.ObjectId].ToString()); if (score == null) { float weight; if (!float.TryParse(row[structNames.ScoreNames.Weight].ToString(), out weight)) { weight = 0; } score = new Score() { ObjectId = row[structNames.ScoreNames.ObjectId].ToString(), Expression = row[structNames.ScoreNames.Expression].ToString(), ScoreName = row[structNames.ScoreNames.ScoreName].ToString(), Weight = weight }; group.ScoreList.Add(score); } Detail detail = score.DetailList.FirstOrDefault(x => x.ObjectId == row[structNames.DetailNames.ObjectId].ToString()); if (detail == null) { float rate; if (!float.TryParse(row[structNames.DetailNames.Rate].ToString(), out rate)) { rate = 0; } detail = new Detail() { ObjectId = row[structNames.DetailNames.ObjectId].ToString(), Rate = rate }; score.DetailList.Add(detail); } Option option = detail.Options.FirstOrDefault(x => x.ObjectId == row[structNames.OptionNames.ObjectId].ToString()); if (option == null) { double value; if (!double.TryParse(row[structNames.OptionNames.Value].ToString(), out value)) { value = 0; } option = new Option() { ObjectId = row[structNames.OptionNames.ObjectId].ToString(), Memo = row[structNames.OptionNames.Memo].ToString(), Value = value }; detail.Options.Add(option); } } catch (Exception ex) { Scores = new List <ScoreGroup>(); } }