diff --git a/Model/GradeLevel/Entity/DatabaseEntity/BaseEntity.cs b/Model/GradeLevel/Entity/DatabaseEntity/BaseEntity.cs
index f3584fa..6de5e72 100644
--- a/Model/GradeLevel/Entity/DatabaseEntity/BaseEntity.cs
+++ b/Model/GradeLevel/Entity/DatabaseEntity/BaseEntity.cs
@@ -2,5 +2,8 @@
public class BaseEntity
{
+ ///
+ /// 唯一签名
+ ///
public string Sign { get; set; } = string.Empty;
}
\ No newline at end of file
diff --git a/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelDataSet.cs b/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelDataSet.cs
index 9876111..3678389 100644
--- a/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelDataSet.cs
+++ b/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelDataSet.cs
@@ -5,12 +5,36 @@
///
public class GradeLevelDataSet: BaseEntity
{
+ ///
+ /// 所属Mst的签名
+ ///
public string Mst_Sign { get; set; } = string.Empty;
+ ///
+ /// 所属Mst名称
+ ///
public string Mst_Name { get; set; } = string.Empty;
+ ///
+ /// 数据名
+ ///
public string Name { get; set; } = string.Empty;
+ ///
+ /// 数据英文名
+ ///
public string EName { get; set; } = string.Empty;
+ ///
+ /// 数据在Json中的Key
+ ///
public string KName { get; set; } = string.Empty;
+ ///
+ /// 数据单位
+ ///
public string Unit {set; get;} = string.Empty;
+ ///
+ /// 是否用于切工等级评定 0否1是
+ ///
public int HasCut { get; set; } = 0;
+ ///
+ /// 是否用于对称等级评定 0否1是
+ ///
public int HasSym { get; set; } = 0;
}
\ No newline at end of file
diff --git a/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelMst.cs b/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelMst.cs
index f4b1be2..25f5a47 100644
--- a/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelMst.cs
+++ b/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelMst.cs
@@ -4,10 +4,28 @@
///
public class GradeLevelMst : BaseEntity
{
+ ///
+ /// 定级标准名称
+ ///
public string Name { get; set; } = string.Empty;
+ ///
+ /// 定级标准名称 英文
+ ///
public string EName { get; set; } = string.Empty;
+ ///
+ /// 运行模式 -1通用 0实验室 1工厂
+ ///
public int RunMode { get; set; } = -1;
+ ///
+ /// 形状 0圆形 1椭圆 2梨形
+ ///
public int Shape { get; set; } = 0;
+ ///
+ /// 冠数量
+ ///
public int Crown { get; set; } = 8;
+ ///
+ /// 亭数量
+ ///
public int Pavilion { get; set; } = 8;
}
\ No newline at end of file
diff --git a/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelSet.cs b/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelSet.cs
index c86f487..04cd23d 100644
--- a/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelSet.cs
+++ b/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelSet.cs
@@ -5,11 +5,32 @@
///
public class GradeLevelSet : BaseEntity
{
+ ///
+ /// 所属Mst的签名
+ ///
public string Mst_Sign { get; set; } = string.Empty;
+ ///
+ /// 所属Mst的名称
+ ///
public string Mst_Name { get; set; } = string.Empty;
+ ///
+ /// 设定类型 0切工等级 1对称等级
+ ///
public int Set_Type { get; set; } = 0;
+ ///
+ /// 级别名称
+ ///
public string Name { get; set; } = string.Empty;
+ ///
+ /// 级别名称英文
+ ///
public string EName { get; set; } = string.Empty;
+ ///
+ /// 级别名称简称
+ ///
public string AName { get; set; } = string.Empty;
+ ///
+ /// 级别顺序:由小到大代表由差到好,数值越大越好
+ ///
public int Short { get; set; } = 0;
}
\ No newline at end of file
diff --git a/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelSetDtl.cs b/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelSetDtl.cs
index e67195b..0a4e10b 100644
--- a/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelSetDtl.cs
+++ b/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelSetDtl.cs
@@ -4,11 +4,32 @@
///
public class GradeLevelSetDtl: BaseEntity
{
+ ///
+ /// 所属Mst的签名
+ ///
public string Mst_Sign { get; set; } = string.Empty;
+ ///
+ /// 所属Mst的签名
+ ///
public string Mst_Name { get; set; } = string.Empty;
+ ///
+ /// 所属树签名
+ ///
public string Tree_Sign { get; set; } = string.Empty;
+ ///
+ /// 所属数据签名
+ ///
public string DataSet_Sign { get; set; } = string.Empty;
+ ///
+ /// 适用等级签名
+ ///
public string Level_Sign { get; set; } = string.Empty;
+ ///
+ /// 此等级最大值
+ ///
public double Max_Value { get; set; }
+ ///
+ /// 此等级最小值
+ ///
public double Min_Value { get; set; }
}
\ No newline at end of file
diff --git a/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelTotalSet.cs b/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelTotalSet.cs
index f242356..e57e99d 100644
--- a/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelTotalSet.cs
+++ b/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelTotalSet.cs
@@ -5,10 +5,28 @@
///
public class GradeLevelTotalSet: BaseEntity
{
+ ///
+ /// 所属Mst的签名
+ ///
public string Mst_Sign { get; set; } = string.Empty;
+ ///
+ /// 所属Mst的名称
+ ///
public string Mst_Name { get; set; } = string.Empty;
+ ///
+ /// 设定类型 0切工等级 1对称等级
+ ///
public int Set_Type { get; set; } = 0;
+ ///
+ /// 统计方式:0最大值 1最小值 2平均值
+ ///
public int Statistics { get; set; } = 0;
+ ///
+ /// 参与评级的数据名 ,分割 关联GradeLevelDataSet.Name
+ ///
public string DataNames { get; set; } = string.Empty;
+ ///
+ /// 参与评级的数据签名 ,分割 关联GradeLevelDataSet.Sign
+ ///
public string DataSigns { get; set; } = string.Empty;
}
\ No newline at end of file
diff --git a/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelTreeSet.cs b/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelTreeSet.cs
index 3f7ac2f..a93948a 100644
--- a/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelTreeSet.cs
+++ b/Model/GradeLevel/Entity/DatabaseEntity/GradeLevelTreeSet.cs
@@ -4,16 +4,45 @@
///
public class GradeLevelTreeSet: BaseEntity
{
+ ///
+ /// 所属Mst的签名
+ ///
public string Mst_Sign { get; set; } = string.Empty;
+ ///
+ /// 所属Mst的名称
+ ///
public string Mst_Name { get; set; } = string.Empty;
+ ///
+ /// 节点名
+ ///
public string Header { get; set; } = string.Empty;
+ ///
+ /// 节点类型:0顶级 1切工节点 2对称节点
+ ///
public int NodeType { get; set; } = 0;
+ ///
+ /// 是否含有数据 0否1是
+ ///
public int HasData { get; set; } = 0;
+ ///
+ /// 是否为顶级节点,只有Root、父级为Root的切工节点、父级为root的对称节点为1
+ ///
public int IsTop { get; set; } = 0;
+ ///
+ /// 维度值
+ ///
public string DimensionValue { get; set; } = string.Empty;
+ ///
+ /// 维度数据签名 关联GradeLevelDataSet.Sign
+ ///
public string DimensionSign { get; set; } = string.Empty;
+ ///
+ /// 父级节点签名
+ ///
public string ParentSign { get; set; } = string.Empty;
-
+///
+/// 节点下评级设定明细
+///
private List _setDtls = new List();
public List GetLevelSetDtls()
diff --git a/Model/GradeLevel/Exceptions/NotGradeSetException.cs b/Model/GradeLevel/Exceptions/NotGradeSetException.cs
index 746ef13..70400a9 100644
--- a/Model/GradeLevel/Exceptions/NotGradeSetException.cs
+++ b/Model/GradeLevel/Exceptions/NotGradeSetException.cs
@@ -7,4 +7,10 @@ public class NotGradeSetException : Exception
{
}
+
+ public NotGradeSetException(string message)
+ :base(message)
+ {
+
+ }
}
\ No newline at end of file
diff --git a/Model/GradeLevel/GradeLevelCalculator.cs b/Model/GradeLevel/GradeLevelCalculator.cs
index a375542..06ba3e6 100644
--- a/Model/GradeLevel/GradeLevelCalculator.cs
+++ b/Model/GradeLevel/GradeLevelCalculator.cs
@@ -7,57 +7,380 @@ using BrilliantSightClient.Model.GradeLevel.Helper;
using BrilliantSightClient.Model.GradeResult.Entity;
using BrilliantSightClient.Model.GradeResult.Entity.Enums;
using BrilliantSightClient.Model.Helper;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
namespace BrilliantSightClient.Model.GradeLevel;
public class GradeLevelCalculator
{
AlgorithmResultEntity _diamondResult;
-
+ private JToken _diamondData;
GradeLevelMst _masterLevel;
private List _gradeLevelCutSets;
private List _gradeLevelSymSets;
+ private List _gradeLevelDataSets;
+
+ private List _gradeLevelCutTreeSets;
+ private List _gradeLevelSymTreeSets;
+
+ private List _gradeLevelSetDtls;
+
+ private GradeLevelTotalSet _gradeLevelCutTotalSet;
+ private GradeLevelTotalSet _gradeLevelSymTotalSet;
+
public GradeLevelCalculator(AlgorithmResultEntity entity)
{
_diamondResult = entity;
-
- var masterSql = $"select * from GRADE_LEVEL_MST where NAME = '{entity.Standard}' and RUNMODE = {Common.RunMode} or RUNMODE = -1 " +
- $" and SHAPE = {EntityHelper.GetValueFromName(entity.Shape)} and CROWN = {entity.CrownType} and PAVILION = {entity.PavType}" ;
+ _diamondData = JToken.Parse(JsonConvert.SerializeObject(entity.Measurements));
+ var masterSql = $"select * from GRADE_LEVEL_MST where NAME = '{entity.Standard}' and RUNMODE = {Common.RunMode} or RUNMODE = -1 and SHAPE = {EntityHelper.GetValueFromName(entity.Shape)} and CROWN = '{entity.CrownType.Replace("P","")}' and PAVILION = '{entity.PavType.Replace("P","")}'" ;
var masterLevel = DataBaseHelper.ExecuteQuery(masterSql);
- if (masterLevel.Count == 0)
+ if (masterLevel.Count == 0)
throw new NotGradeSetException();
_masterLevel = masterLevel.First();
var setsSql = $"select * from GRADE_LEVEL_SET where MST_SIGN = '{_masterLevel.Sign}'";
var levelSets = DataBaseHelper.ExecuteQuery(setsSql);
- if (masterLevel.Count == 0)
+ if (levelSets.Count == 0)
throw new NotGradeSetException();
_gradeLevelCutSets = levelSets.FindAll(x => x.Set_Type == GradeType.Cut.GetValue());
_gradeLevelSymSets = levelSets.FindAll(x => x.Set_Type == GradeType.Sym.GetValue());
+
+ var dataSetSql = $"select * from GRADE_LEVEL_DATA_SET where MST_SIGN = '{_masterLevel.Sign}'";
+ _gradeLevelDataSets = DataBaseHelper.ExecuteQuery(dataSetSql);
+
+ var treeSetSql = $"select * from GRADE_LEVEL_TREE_SET where MST_SIGN = '{_masterLevel.Sign}'";
+ var treeSets = DataBaseHelper.ExecuteQuery(treeSetSql);
+ _gradeLevelCutTreeSets = treeSets.FindAll(x => x.NodeType - 1 == GradeType.Cut.GetValue());
+ _gradeLevelSymTreeSets = treeSets.FindAll(x => x.NodeType - 1 == GradeType.Sym.GetValue());
+
+ var setDtlSql = $"select * from GRADE_LEVEL_SET_DTL where MST_SIGN = '{_masterLevel.Sign}'";
+ _gradeLevelSetDtls = DataBaseHelper.ExecuteQuery(setDtlSql);
+
+ var totalSetSql = $"select * from GRADE_LEVEL_TOTAL_SET where MST_SIGN = '{_masterLevel.Sign}'";
+ var totalSets = DataBaseHelper.ExecuteQuery(totalSetSql);
+ _gradeLevelCutTotalSet = totalSets.FindAll(x => x.Set_Type == GradeType.Cut.GetValue()).First();
+ _gradeLevelSymTotalSet = totalSets.FindAll(x => x.Set_Type == GradeType.Sym.GetValue()).First();
+
}
- public GradeLevelSet GetCutGradeLevelSet(string key, double maxVal, double minVal)
+ public GradeLevelSet? GetCutGradeLevelSet(string key, double maxVal, double minVal)
{
- return null;
+ GradeLevelDataSet? dataSet = _gradeLevelDataSets.FirstOrDefault(x => x.KName.Equals(key));
+ if (dataSet == null) return null;
+ //检查是否多维度
+ if (_gradeLevelCutTreeSets.Count > 1)
+ {
+ //多维度
+ List cutTree = _gradeLevelCutTreeSets.FindAll(x => x.IsTop == 0);
+ if(cutTree.Count <= 0) return null;
+ GradeLevelDataSet? dimensionKey = _gradeLevelDataSets.FirstOrDefault(x => cutTree.First().DimensionSign == x.Sign);
+ if (dimensionKey == null) return null;
+ string dimensionTreeSign = DimensionTreeSign(dimensionKey, cutTree);
+ if ("1".Equals(dimensionTreeSign) || "-1".Equals(dimensionTreeSign))
+ {
+ return _gradeLevelCutSets.OrderBy(set => set.Short).FirstOrDefault();
+ }
+
+ return GetFinalCutGrade(dimensionTreeSign, key, maxVal, minVal);
+ }
+ else
+ {
+ //单维度
+ return GetFinalCutGrade(_gradeLevelCutTreeSets.First().Sign, key, maxVal, minVal);
+ }
+
}
public GradeLevelSet GetCutTotalGradeLevelSet(List dataInfos)
{
- return null;
+ return CalculateTotalGrade(dataInfos, _gradeLevelCutTotalSet, _gradeLevelCutSets);
}
- public GradeLevelSet GetSymGradeLevelSet(string key, double devVal)
+ public GradeLevelSet? GetSymGradeLevelSet(string key, double devVal)
{
- return null;
+ GradeLevelDataSet? dataSet = _gradeLevelDataSets.FirstOrDefault(x => x.KName.Equals(key));
+ if (dataSet == null) return null;
+
+ // 检查是否多维度
+ if (_gradeLevelSymTreeSets.Count > 1)
+ {
+ // 多维度
+ List symTree = _gradeLevelSymTreeSets.FindAll(x => x.IsTop == 0);
+ if (symTree.Count <= 0) return null;
+
+ GradeLevelDataSet? dimensionKey = _gradeLevelDataSets.FirstOrDefault(x => symTree.First().DimensionSign == x.Sign);
+ if (dimensionKey == null) return null;
+
+ string dimensionTreeSign = DimensionTreeSign(dimensionKey, symTree);
+ if ("1".Equals(dimensionTreeSign) || "-1".Equals(dimensionTreeSign))
+ {
+ return _gradeLevelSymSets.OrderBy(set => set.Short).FirstOrDefault();
+ }
+
+ return GetFinalSymGrade(dimensionTreeSign, key, devVal);
+ }
+ else
+ {
+ // 单维度
+ return GetFinalSymGrade(_gradeLevelSymTreeSets.First().Sign, key, devVal);
+ }
+
}
public GradeLevelSet GetSymTotalGradeLevelSet(List dataInfos)
{
- return null;
+ return CalculateTotalGrade(dataInfos, _gradeLevelSymTotalSet, _gradeLevelSymSets);
}
+ private string DimensionTreeSign( GradeLevelDataSet dimensionKey,List cutTree)
+ {
+ string dimensionTreeSign = string.Empty;
+ try
+ {
+ // 从JToken中获取对应路径的值
+ JToken? dimensionValueToken = _diamondData.SelectToken(dimensionKey.KName);
+ if (dimensionValueToken == null || !dimensionValueToken.HasValues)
+ return string.Empty;
+ // 转换为double并进行计算
+ if (double.TryParse(dimensionValueToken.ToString(), out double dimensionValue))
+ {
+ // 乘以100并四舍五入取整
+ int roundedValue = (int)Math.Round(dimensionValue * 100, MidpointRounding.AwayFromZero);
+
+ // 获取所有维度值并排序
+ var dimensionValues = cutTree
+ .Where(x => !string.IsNullOrEmpty(x.DimensionValue))
+ .Select(x =>
+ {
+ if (int.TryParse(x.DimensionValue, out int value))
+ return new { Value = value, Sign = x.Sign };
+ return null;
+ })
+ .Where(x => x != null)
+ .OrderBy(x => x.Value)
+ .ToList();
+
+ if (dimensionValues.Any())
+ {
+ // 判断属于哪个区间
+ var matchedDimension = dimensionValues.FirstOrDefault(x => x.Value == roundedValue);
+ if (matchedDimension != null)
+ {
+ dimensionTreeSign = matchedDimension.Sign;
+ }
+ else if (roundedValue > dimensionValues.Max(x => x.Value))
+ {
+ dimensionTreeSign = "1"; // 大于所有维度值
+ }
+ else if (roundedValue < dimensionValues.Min(x => x.Value))
+ {
+ dimensionTreeSign = "-1"; // 小于所有维度值
+ }
+ }
+ }
+ }
+ catch
+ {
+ // 处理异常,返回空白
+ dimensionTreeSign = string.Empty;
+ }
+
+ return dimensionTreeSign;
+ }
+
+ public GradeLevelSet? GetFinalCutGrade(string treeSign, string key, double maxVal, double minVal)
+ {
+ // 通过TreeSign和Key关联获取子集
+ var dataSet = _gradeLevelDataSets.FirstOrDefault(ds => ds.KName == key);
+ if (dataSet == null) return null;
+
+ var filteredDtls = _gradeLevelSetDtls
+ .Where(dtl => dtl.Tree_Sign == treeSign && dtl.DataSet_Sign == dataSet.Sign)
+ .ToList();
+
+ if (!filteredDtls.Any()) return null;
+
+ // 查找最大值和最小值对应的区间
+ var maxValDtls = filteredDtls
+ .Where(dtl => maxVal >= dtl.Min_Value && maxVal <= dtl.Max_Value)
+ .ToList();
+
+ var minValDtls = filteredDtls
+ .Where(dtl => minVal >= dtl.Min_Value && minVal <= dtl.Max_Value)
+ .ToList();
+
+ // 获取对应的GradeLevelSet集合
+ var associatedLevelSets = _gradeLevelCutSets
+ .Where(ls => filteredDtls.Any(dtl => dtl.Level_Sign == ls.Sign))
+ .ToList();
+
+ // 处理最大值的情况
+ GradeLevelSet? maxLevel = null;
+ if (maxValDtls.Any())
+ {
+ // 若有多个区间,取最差的(Short值最大)
+ if (maxValDtls.Count > 1)
+ {
+ maxLevel = associatedLevelSets
+ .Where(ls => maxValDtls.Any(dtl => dtl.Level_Sign == ls.Sign))
+ .OrderBy(ls => ls.Short)
+ .FirstOrDefault();
+ }
+ else
+ {
+ maxLevel = associatedLevelSets
+ .FirstOrDefault(ls => ls.Sign == maxValDtls.First().Level_Sign);
+ }
+ }
+
+ // 处理最小值的情况
+ GradeLevelSet? minLevel = null;
+ if (minValDtls.Any())
+ {
+ // 若有多个区间,取最差的(Short值最大)
+ if (minValDtls.Count > 1)
+ {
+ minLevel = associatedLevelSets
+ .Where(ls => minValDtls.Any(dtl => dtl.Level_Sign == ls.Sign))
+ .OrderBy(ls => ls.Short)
+ .FirstOrDefault();
+ }
+ else
+ {
+ minLevel = associatedLevelSets
+ .FirstOrDefault(ls => ls.Sign == minValDtls.First().Level_Sign);
+ }
+ }
+
+ // 若最大值和最小值都找到对应的区间,返回较差的一个
+ if (maxLevel != null && minLevel != null)
+ {
+ return maxLevel.Short > minLevel.Short ? minLevel : maxLevel;
+ }
+
+ // 若只有一个找到区间,返回该区间对应的级别
+ if (maxLevel != null) return maxLevel;
+ if (minLevel != null) return minLevel;
+
+ // 若都没找到,返回子集中最差的级别
+ return associatedLevelSets.OrderBy(ls => ls.Short).FirstOrDefault();
+ }
+ private GradeLevelSet? GetFinalSymGrade(string treeSign, string key, double devVal)
+ {
+ // 通过TreeSign和Key关联获取子集
+ var dataSet = _gradeLevelDataSets.FirstOrDefault(ds => ds.KName == key);
+ if (dataSet == null) return null;
+
+ var filteredDtls = _gradeLevelSetDtls
+ .Where(dtl => dtl.Tree_Sign == treeSign && dtl.DataSet_Sign == dataSet.Sign)
+ .ToList();
+
+ if (!filteredDtls.Any()) return null;
+
+ // 查找偏差值对应的区间
+ var devValDtls = filteredDtls
+ .Where(dtl => devVal >= dtl.Min_Value && devVal <= dtl.Max_Value)
+ .ToList();
+
+ // 获取对应的GradeLevelSet集合
+ var associatedLevelSets = _gradeLevelSymSets
+ .Where(ls => filteredDtls.Any(dtl => dtl.Level_Sign == ls.Sign))
+ .ToList();
+
+ // 处理偏差值的情况
+ GradeLevelSet? devLevel = null;
+ if (devValDtls.Any())
+ {
+ // 若有多个区间,取最差的(Short值最大)
+ if (devValDtls.Count > 1)
+ {
+ devLevel = associatedLevelSets
+ .Where(ls => devValDtls.Any(dtl => dtl.Level_Sign == ls.Sign))
+ .OrderBy(ls => ls.Short)
+ .FirstOrDefault();
+ }
+ else
+ {
+ devLevel = associatedLevelSets
+ .FirstOrDefault(ls => ls.Sign == devValDtls.First().Level_Sign);
+ }
+ }
+
+ // 若找到对应的区间,返回该区间对应的级别
+ if (devLevel != null) return devLevel;
+
+ // 若没找到,返回子集中最差的级别
+ return associatedLevelSets.OrderBy(ls => ls.Short).FirstOrDefault();
+ }
+
+ private GradeLevelSet CalculateTotalGrade(List dataInfos, GradeLevelTotalSet totalSet, List levelSets)
+ {
+ // 解析参与评级的数据签名
+ var dataSigns = totalSet.DataSigns.Split(',', StringSplitOptions.RemoveEmptyEntries);
+
+ // 找出所有参与评级的项目对应的评级
+ var gradeLevels = new List();
+
+ foreach (var dataSign in dataSigns)
+ {
+ var dataSet = _gradeLevelDataSets.FirstOrDefault(ds => ds.Sign == dataSign);
+ if (dataSet == null) continue;
+
+ var dataInfo = dataInfos.FirstOrDefault(di => di.TestItemId == dataSet.KName);
+ if (dataInfo == null) continue;
+
+ GradeLevelSet? gradeLevel = null;
+
+ if (totalSet.Set_Type == GradeType.Cut.GetValue())
+ {
+ // 切工评级
+ gradeLevel = GetCutGradeLevelSet(dataSet.KName, double.Parse(dataInfo.Max), double.Parse(dataInfo.Min));
+ }
+ else if (totalSet.Set_Type == GradeType.Sym.GetValue())
+ {
+ // 对称评级
+ gradeLevel = GetSymGradeLevelSet(dataSet.KName, double.Parse(dataInfo.Dev));
+ }
+
+ if (gradeLevel != null)
+ {
+ gradeLevels.Add(gradeLevel);
+ }
+ }
+
+ // 若没有找到任何评级,返回默认最差评级
+ if (!gradeLevels.Any())
+ {
+ return levelSets.OrderByDescending(ls => ls.Short).FirstOrDefault()
+ ?? throw new NotGradeSetException("无法计算总评级,没有找到有效的评级数据");
+ }
+
+ // 根据统计方式聚合评级
+ switch (totalSet.Statistics)
+ {
+ case 0: // 最大值(最差)
+ return gradeLevels.OrderByDescending(ls => ls.Short).First();
+
+ case 1: // 最小值(最好)
+ return gradeLevels.OrderBy(ls => ls.Short).First();
+
+ case 2: // 平均值
+ // 计算平均Short值
+ double averageShort = gradeLevels.Average(ls => ls.Short);
+
+ // 找到最接近平均值的等级
+ return levelSets
+ .OrderBy(ls => Math.Abs(ls.Short - averageShort))
+ .FirstOrDefault()
+ ?? throw new NotGradeSetException("无法计算平均评级,没有找到匹配的等级");
+
+ default:
+ throw new NotSupportedException($"不支持的统计方式: {totalSet.Statistics}");
+ }
+ }
}
\ No newline at end of file
diff --git a/Model/GradeResult/Helper/ViewDataInfoHelper.cs b/Model/GradeResult/Helper/ViewDataInfoHelper.cs
index 6b5ca9a..a1117cf 100644
--- a/Model/GradeResult/Helper/ViewDataInfoHelper.cs
+++ b/Model/GradeResult/Helper/ViewDataInfoHelper.cs
@@ -1,6 +1,7 @@
using BrilliantSightClient.Model.Entity.ApiEntity;
using BrilliantSightClient.Model.Extension;
using BrilliantSightClient.Model.GradeLevel;
+using BrilliantSightClient.Model.GradeLevel.Entity.DatabaseEntity;
using BrilliantSightClient.Model.GradeLevel.Helper;
using BrilliantSightClient.Model.GradeResult.Entity;
using BrilliantSightClient.Model.GradeResult.Entity.Enums;
@@ -23,19 +24,33 @@ public class ViewDataInfoHelper
if(shape == -1) throw new Exception("Unsupported shapes");
string viewDataSql = $"SELECT * FROM ViewData WHERE Shape = {shape} AND Specifications = '{result.PavType}-{result.CrownType}' AND RunMode = {Common.RunMode}";
List showViewData = DataBaseHelper.ExecuteQuery(viewDataSql);
+
+ GradeLevelCalculator levelCalculator = new GradeLevelCalculator(result);
foreach (var viewData in showViewData)
{
DataInfo dataInfo = new DataInfo();
dataInfo.TestItemId = viewData.InfoPath;
dataInfo.TestItemName = "Name".Equals(MultilingualHelper.getString("ColumnNameBase"))? viewData.Name : viewData.EName;
+ double dev =0 , max=0, min = 0;
if(!viewData.AvgKey.IsNullOrEmpty())
dataInfo.Avg = DoubleDataFormatHelper.FormatDouble(jData[viewData.AvgKey], viewData.AvgType.ToAccuracy());
- if(!viewData.DevKey.IsNullOrEmpty())
+ if (!viewData.DevKey.IsNullOrEmpty())
+ {
dataInfo.Dev = DoubleDataFormatHelper.FormatDouble(jData[viewData.DevKey], viewData.DevType.ToAccuracy());
- if(!viewData.MaxKey.IsNullOrEmpty())
+ dev = double.Parse(dataInfo.Dev);
+ }
+ if (!viewData.MaxKey.IsNullOrEmpty())
+ {
dataInfo.Max = DoubleDataFormatHelper.FormatDouble(jData[viewData.MaxKey], viewData.MaxType.ToAccuracy());
- if(!viewData.MinKey.IsNullOrEmpty())
+ max = double.Parse(dataInfo.Max);
+ }
+
+ if (!viewData.MinKey.IsNullOrEmpty())
+ {
dataInfo.Min = DoubleDataFormatHelper.FormatDouble(jData[viewData.MinKey], viewData.MinType.ToAccuracy());
+ min = double.Parse(dataInfo.Min);
+ }
+
if (!viewData.DtlKey.IsNullOrEmpty())
{
List dtlDoubles = GenerateDtlDoubles(jData, viewData);
@@ -47,9 +62,13 @@ public class ViewDataInfoHelper
dataInfo.Dtl6 = dtlDoubles[5];
dataInfo.Dtl7 = dtlDoubles[6];
dataInfo.Dtl8 = dtlDoubles[7];
+
+
}
-
- GradeLevelCalculator levelCalculator = new GradeLevelCalculator(result);
+ GradeLevelSet? cutLevel = levelCalculator.GetCutGradeLevelSet(dataInfo.TestItemId, max, min);
+ dataInfo.CutLevel = cutLevel==null?string.Empty:cutLevel.Name;
+ GradeLevelSet? symLevel =levelCalculator.GetSymGradeLevelSet(dataInfo.TestItemId, dev);
+ dataInfo.SymLevel = symLevel==null?-1:symLevel.Short;
dataInfos.Add(dataInfo);
}