@ -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 _d iamondResult ;
private JToken _d iamondData ;
GradeLevelMst _ masterLevel ;
private List < GradeLevelSet > _ gradeLevelCutSets ;
private List < GradeLevelSet > _ gradeLevelSymSets ;
private List < GradeLevelDataSet > _ gradeLevelDataSets ;
private List < GradeLevelTreeSet > _ gradeLevelCutTreeSets ;
private List < GradeLevelTreeSet > _ gradeLevelSymTreeSets ;
private List < GradeLevelSetDtl > _ gradeLevelSetDtls ;
private GradeLevelTotalSet _ gradeLevelCutTotalSet ;
private GradeLevelTotalSet _ gradeLevelSymTotalSet ;
public GradeLevelCalculator ( AlgorithmResultEntity entity )
{
_d iamondResult = entity ;
var masterSql = $"select * from GRADE_LEVEL_MST where NAME = '{entity.Standard}' and RUNMODE = {Common.RunMode} or RUNMODE = -1 " +
$" and SHAPE = {EntityHelper.GetValueFromName<DiamondShape>(entity.Shape)} and CROWN = {entity.CrownType} and PAVILION = {entity.PavType}" ;
_d iamondData = 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<DiamondShape>(entity.Shape)} and CROWN = '{entity.CrownType.Replace(" P "," ")}' and PAVILION = '{entity.PavType.Replace(" P "," ")}'" ;
var masterLevel = DataBaseHelper . ExecuteQuery < GradeLevelMst > ( 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 < GradeLevelSet > ( 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 < GradeLevelDataSet > ( dataSetSql ) ;
var treeSetSql = $"select * from GRADE_LEVEL_TREE_SET where MST_SIGN = '{_masterLevel.Sign}'" ;
var treeSets = DataBaseHelper . ExecuteQuery < GradeLevelTreeSet > ( 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 < GradeLevelSetDtl > ( setDtlSql ) ;
var totalSetSql = $"select * from GRADE_LEVEL_TOTAL_SET where MST_SIGN = '{_masterLevel.Sign}'" ;
var totalSets = DataBaseHelper . ExecuteQuery < GradeLevelTotalSet > ( 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 < GradeLevelTreeSet > 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 < DataInfo > 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 < GradeLevelTreeSet > 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 < DataInfo > dataInfos )
{
return null ;
return CalculateTotalGrade ( dataInfos , _ gradeLevelSymTotalSet , _ gradeLevelSymSets ) ;
}
private string DimensionTreeSign ( GradeLevelDataSet dimensionKey , List < GradeLevelTreeSet > cutTree )
{
string dimensionTreeSign = string . Empty ;
try
{
// 从JToken中获取对应路径的值
JToken ? dimensionValueToken = _d iamondData . 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 * 1 0 0 , 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 < DataInfo > dataInfos , GradeLevelTotalSet totalSet , List < GradeLevelSet > levelSets )
{
// 解析参与评级的数据签名
var dataSigns = totalSet . DataSigns . Split ( ',' , StringSplitOptions . RemoveEmptyEntries ) ;
// 找出所有参与评级的项目对应的评级
var gradeLevels = new List < GradeLevelSet > ( ) ;
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}" ) ;
}
}
}