using System.Collections.Generic; using System.Data; using System.IO; using System.Reflection; using System.Windows.Input; using System.Windows.Shapes; using HandyControl.Controls; using log4net.Appender; using Newtonsoft.Json; using SparkClient.Model.Entity.ApiEntity; using SparkClient.Model.Helper; using SparkClient.Views.UserControl.ViewportData; using static System.Windows.Forms.VisualStyles.VisualStyleElement.ToolTip; namespace SparkClient.ViewModel.Grading; public class GradingResultVM : BaseViewModel { private string DiamondCode { get; set; } private List _dtResults; // ViewportData private DataTable _dsList; private DataTable _gradeList; private ViewportData _viewportData; private string _standard; private string _shape; private string _crownType; private string _pavType; private string _wight; private string _cutLevelTotal; private string _symLevelTotal; public ICommand ChangeSymCommand { get; } public List DtResults { get { return _dtResults; } set { _dtResults = value; OnPropertyChanged(nameof(DtResults)); } } public ViewportData ViewportData { get { return _viewportData; } set { _viewportData = value; OnPropertyChanged(nameof(ViewportData)); } } public string Standard { get { return _standard; } set { _standard = value; OnPropertyChanged(nameof(Standard)); } } public string Shape { get { return _shape; } set { _shape = value; OnPropertyChanged(nameof(Shape)); } } public string CrownType { get { return _crownType; } set { _crownType = value; OnPropertyChanged(nameof(CrownType)); } } public string PavType { get { return _pavType; } set { _pavType = value; OnPropertyChanged(nameof(PavType)); } } public string Wight { get { return _wight; } set { _wight = value; OnPropertyChanged(nameof(Wight)); } } public string CutLevelTotal { get { return _cutLevelTotal; } set { _cutLevelTotal = value; OnPropertyChanged(nameof(CutLevelTotal)); } } public string SymLevelTotal { get { return _symLevelTotal; } set { _symLevelTotal = value; OnPropertyChanged(nameof(SymLevelTotal)); } } public DataTable DSList { get { return _dsList; } set { _dsList = value; OnPropertyChanged(nameof(DSList)); } } public DataTable GradeList { get { return _gradeList; } set { _gradeList = value; OnPropertyChanged(nameof(GradeList)); } } private readonly static string digitsFormat = "f1"; private int totalCutGrade = 0; private int totalSymGrade = 0; /// /// 构造 /// /// 检测结果 public GradingResultVM(object result) { ChangeSymCommand = new RelayCommand(ChangeSym); if (result != null) { InitView(result as AlgorithmResultEntity); } InitCombobox(); } private void InitView(AlgorithmResultEntity result) { string data = JsonConvert.SerializeObject(result); ViewportData = new ViewportData(result.DiamondCode, data); ViewportData.LoadData(); totalCutGrade = 0; totalSymGrade = 0; Standard = result.Standard; Shape = result.Shape; CrownType = result.CrownType; PavType = result.PavType; DiamondCode = result.DiamondCode; CalWight(result); DtResults = new List(); var testItemList = GetTestItemList(); Type type = this.GetType(); foreach (var testItem in testItemList) { string methodName = "get" + testItem; MethodInfo? methodInfo = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic); if (methodInfo != null) { object[] parameters = new object[] { result }; DataInfo? dataInfo = methodInfo.Invoke(this, parameters) as DataInfo; if (dataInfo != null) { DtResults.Add(dataInfo); } } } CutLevelTotal = GetGradeName(totalCutGrade); } /// /// 参数列表测试内容获取 /// /// private List GetTestItemList() { // DB 没关联 List list = new List(); list.Add("DIAMETER"); list.Add("TOTAL_DEPTH"); list.Add("TABLE"); list.Add("CROWN_ANGLE"); list.Add("CROWN_HEIGHT"); list.Add("GIRDLE_BEZEL"); list.Add("GIRDLE_BONE"); list.Add("GIRDLE"); list.Add("PAV_ANGLE"); list.Add("PAV_DEPTH"); list.Add("STAR"); list.Add("LOWER_HALVES_RATIO"); list.Add("CULET"); list.Add("TOC"); list.Add("COC"); list.Add("TWIST"); list.Add("CULET_TO_TABLE"); return list; } #region 定级计算 private List GetCalGradeInfos(string item) { // TODO DB要改 string sql = $"Select GRADE_ID as gradeOrder,STANDARD_MIN Min, STANDARD_MAX Max,IS_MAX_EXIST as isMaxExist,IS_MIN_EXIST as isMinExist from STANDARD where STANDARD_ID = '{item}'"; List calGrades = DataBaseHelper.ExecuteQuery(sql); return calGrades; } private int calGrade(string item ,double value) { int order = 1; decimal cValue = Convert.ToDecimal(value); List calGrades = GetCalGradeInfos(item); foreach (CalGradeInfo gradeInfo in calGrades) { bool isThisGrade = true; if (gradeInfo.Max!= null) { if ( gradeInfo.isMaxExist == 1 && cValue.CompareTo(gradeInfo.Max)<=0) { }else if(gradeInfo.isMaxExist == 0 && cValue.CompareTo(gradeInfo.Max) < 0) { } else { isThisGrade = false; } } if (gradeInfo.Min != null) { if (gradeInfo.isMinExist == 1 && cValue.CompareTo(gradeInfo.Min) >= 0) { } else if (gradeInfo.isMinExist == 0 && cValue.CompareTo(gradeInfo.Min) > 0) { } else { isThisGrade = false; } } if (isThisGrade) { break; } else { order++; } } totalCutGrade = Math.Max(order, totalCutGrade); return order; } private string calGrade_TOTAL_DEPTH(double avg) { string result = ""; int order = calGrade("TOTAL_DEPTH", avg); result = GetGradeName(order); return result; } private string calGrade_TABLE(double min,double max) { string result = ""; int order1 = calGrade("TABLE", min); int order2 = calGrade("TABLE", max); int order = Math.Max(order1, order2); result = GetGradeName(order); return result; } private string calGrade_CROWN_ANGLE(double min, double max) { string result = ""; int order1 = calGrade("CROWN_ANGLE", min); int order2 = calGrade("CROWN_ANGLE", max); int order = Math.Max(order1, order2); result = GetGradeName(order); return result; } private string calGrade_CROWN_HEIGHT(double min, double max) { string result = ""; int order1 = calGrade("CROWN_HEIGHT", min); int order2 = calGrade("CROWN_HEIGHT", max); int order = Math.Max(order1, order2); result = GetGradeName(order); return result; } private string calGrade_GIRDLE(double min, double max) { string result = ""; int order1 = calGrade("GIRDLE", min); int order2 = calGrade("GIRDLE", max); int order = Math.Max(order1, order2); result = GetGradeName(order); return result; } private string calGrade_PAV_ANGLE(double min, double max) { string result = ""; int order1 = calGrade("PAV_ANGLE", min); int order2 = calGrade("PAV_ANGLE", max); int order = Math.Max(order1, order2); result = GetGradeName(order); return result; } private string calGrade_PAV_DEPTH(double min, double max) { string result = ""; int order1 = calGrade("PAV_DEPTH", min); int order2 = calGrade("PAV_DEPTH", max); int order = Math.Max(order1, order2); result = GetGradeName(order); return result; } #endregion #region 参数列表行编辑 private DataInfo getDIAMETER(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "DIAMETER"; info.TestItemName = GetName("DIAMETER"); info.Avg = result.measurements.DIAMETER.ToString(digitsFormat); info.Dev = result.measurements.DIAMETER_DEV.ToString(digitsFormat); info.Min = result.measurements.M1.ToString(digitsFormat); info.Max = result.measurements.M2.ToString(digitsFormat); return info; } private DataInfo getTOTAL_DEPTH(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "TOTAL_DEPTH"; info.TestItemName = GetName("TOTAL_DEPTH"); info.Avg = Math.Floor(result.measurements.TOTAL_DEPTH*100).ToString(digitsFormat); info.CutLevel = calGrade_TOTAL_DEPTH(result.measurements.TOTAL_DEPTH * 100); return info; } private DataInfo getTABLE(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "TABLE"; info.TestItemName = GetName("TABLE"); info.Avg = Math.Floor(result.measurements.TABLE * 100).ToString(digitsFormat); info.Min = Math.Floor(result.measurements.TABLE_MIN * 100).ToString(digitsFormat); info.Max = Math.Floor(result.measurements.TABLE_MAX * 100).ToString(digitsFormat); info.CutLevel = calGrade_TABLE(result.measurements.TABLE_MIN, result.measurements.TABLE_MAX); return info; } private DataInfo getCROWN_ANGLE(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "CROWN_ANGLE"; info.TestItemName = GetName("CROWN_ANGLE"); info.Avg = result.measurements.CROWN_ANGLE.ToString(digitsFormat); info.Dev = result.measurements.CROWN_ANGLE_DEV.ToString(digitsFormat); info.Min = result.measurements.CROWN_ANGLE_MIN.ToString(digitsFormat); info.Max = result.measurements.CROWN_ANGLE_MAX.ToString(digitsFormat); info.CutLevel = calGrade_CROWN_ANGLE(result.measurements.CROWN_ANGLE_MIN, result.measurements.CROWN_ANGLE_MAX); return info; } private DataInfo getCROWN_HEIGHT(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "CROWN_HEIGHT"; info.TestItemName = GetName("CROWN_HEIGHT"); info.Avg = Math.Floor(result.measurements.CROWN_HEIGHT * 100).ToString(digitsFormat); info.Dev = Math.Floor(result.measurements.CROWN_H_DEV * 100).ToString(digitsFormat); info.Min = Math.Floor(result.measurements.CROWN_H_MIN * 100).ToString(digitsFormat); info.Max = Math.Floor(result.measurements.CROWN_H_MAX * 100).ToString(digitsFormat); info.CutLevel = calGrade_CROWN_HEIGHT(result.measurements.CROWN_H_MIN, result.measurements.CROWN_H_MAX); return info; } private DataInfo getGIRDLE_BEZEL(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "GIRDLE_BEZEL"; info.TestItemName = GetName("GIRDLE_BEZEL"); info.Avg = Math.Floor(result.measurements.GIRDLE_BEZEL * 100).ToString(digitsFormat); info.Dev = Math.Floor(result.measurements.GIRDLE_BEZEL_DEV * 100).ToString(digitsFormat); info.Min = Math.Floor(result.measurements.GIRDLE_BEZEL_MIN * 100).ToString(digitsFormat); info.Max = Math.Floor(result.measurements.GIRDLE_BEZEL_MAX * 100).ToString(digitsFormat); return info; } private DataInfo getGIRDLE_BONE(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "GIRDLE_BONE"; info.TestItemName = GetName("GIRDLE_BONE"); info.Avg = Math.Floor(result.measurements.GIRDLE_BONE * 100).ToString(digitsFormat); info.Min = Math.Floor(result.measurements.GIRDLE_BONE_MIN * 100).ToString(digitsFormat); info.Max = Math.Floor(result.measurements.GIRDLE_BONE_MAX * 100).ToString(digitsFormat); return info; } private DataInfo getGIRDLE(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "GIRDLE"; info.TestItemName = GetName("GIRDLE"); info.Avg = Math.Floor(result.measurements.GIRDLE * 100).ToString(digitsFormat); info.Dev = Math.Floor(result.measurements.GIRDLE_DEV * 100).ToString(digitsFormat); info.Min = Math.Floor(result.measurements.GIRDLE_MIN * 100).ToString(digitsFormat); info.Max = Math.Floor(result.measurements.GIRDLE_MAX * 100).ToString(digitsFormat); info.CutLevel = calGrade_GIRDLE(result.measurements.GIRDLE_MIN, result.measurements.GIRDLE_MAX); return info; } private DataInfo getPAV_ANGLE(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "PAV_ANGLE"; info.TestItemName = GetName("PAV_ANGLE"); info.Avg = result.measurements.PAV_ANGLE.ToString(digitsFormat); info.Dev = result.measurements.PAV_ANGLE_DEV.ToString(digitsFormat); info.Min = result.measurements.PAV_ANGLE_MIN.ToString(digitsFormat); info.Max = result.measurements.PAV_ANGLE_MAX.ToString(digitsFormat); info.CutLevel = calGrade_PAV_ANGLE(result.measurements.PAV_ANGLE_MIN, result.measurements.PAV_ANGLE_MAX); return info; } private DataInfo getPAV_DEPTH(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "PAV_DEPTH"; info.TestItemName = GetName("PAV_DEPTH"); info.Avg = Math.Floor(result.measurements.PAV_DEPTH * 100).ToString(digitsFormat); info.Dev = Math.Floor(result.measurements.PAV_DEPTH_DEV * 100).ToString(digitsFormat); info.Min = Math.Floor(result.measurements.PAV_DEPTH_MIN * 100).ToString(digitsFormat); info.Max = Math.Floor(result.measurements.PAV_DEPTH_MAX * 100).ToString(digitsFormat); info.CutLevel = calGrade_PAV_DEPTH(result.measurements.PAV_DEPTH_MIN, result.measurements.PAV_DEPTH_MAX); return info; } private DataInfo getSTAR(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "STAR"; info.TestItemName = GetName("STAR"); info.Avg = Math.Floor(result.measurements.STAR * 100).ToString(digitsFormat); info.Min = Math.Floor(result.measurements.STAR_MIN * 100).ToString(digitsFormat); info.Max = Math.Floor(result.measurements.STAR_MAX * 100).ToString(digitsFormat); return info; } private DataInfo getLOWER_HALVES_RATIO(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "LOWER_HALVES_RATIO"; info.TestItemName = GetName("LOWER_HALVES_RATIO"); info.Avg = Math.Floor(result.measurements.LOWER_HALVES_RATIO * 100).ToString(digitsFormat); info.Min = Math.Floor(result.measurements.LOWER_HALVES_RATIO_MIN * 100).ToString(digitsFormat); info.Max = Math.Floor(result.measurements.LOWER_HALVES_RATIO_MAX * 100).ToString(digitsFormat); return info; } private DataInfo getCULET(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "CULET"; info.TestItemName = GetName("CULET"); info.Avg = Math.Floor(result.measurements.CULET * 100).ToString(digitsFormat); return info; } private DataInfo getTOC(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "TOC"; info.TestItemName = GetName("TOC"); info.Avg = Math.Floor(result.measurements.TOC * 100).ToString(digitsFormat); return info; } private DataInfo getCOC(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "COC"; info.TestItemName = GetName("COC"); info.Avg = Math.Floor(result.measurements.COC * 100).ToString(digitsFormat); return info; } private DataInfo getTWIST(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "TWIST"; info.TestItemName = GetName("TWIST"); info.Avg = Math.Floor(result.measurements.TWIST * 100).ToString(digitsFormat); info.Dev = Math.Floor(result.measurements.TWIST_DEV * 100).ToString(digitsFormat); info.Min = Math.Floor(result.measurements.TWIST_MIN * 100).ToString(digitsFormat); info.Max = Math.Floor(result.measurements.TWIST_MAX * 100).ToString(digitsFormat); return info; } private DataInfo getCULET_TO_TABLE(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "CULET_TO_TABLE"; info.TestItemName = GetName("CULET_TO_TABLE"); info.Avg = Math.Floor(result.measurements.CULET_TO_TABLE * 100).ToString(digitsFormat); return info; } #endregion private double CalWight(AlgorithmResultEntity result) { var M1 = result.measurements.M1; var M2 = result.measurements.M2; var M3 = result.measurements.M3; var wight = Square((M1+M2)/2)*M3*0.0061; Wight = wight.ToString("f3"); return wight; } private double Square(double m) { return m*m; } private string GetName(string id) { // TODO DB没关联 Dictionary dictionary = new(); dictionary.Add("DIAMETER", "直径"); dictionary.Add("TOTAL_DEPTH", "全深比"); dictionary.Add("TABLE", "台宽比"); dictionary.Add("CROWN_ANGLE", "冠角"); dictionary.Add("CROWN_HEIGHT", "冠高比"); dictionary.Add("GIRDLE_BEZEL", "波峰(风筝面)"); dictionary.Add("GIRDLE_BONE", "波峰(上腰面)"); dictionary.Add("GIRDLE", "腰厚比"); dictionary.Add("PAV_ANGLE", "亭角"); dictionary.Add("PAV_DEPTH", "亭深比"); dictionary.Add("STAR", "星刻面长度比"); dictionary.Add("LOWER_HALVES_RATIO", "下腰比"); dictionary.Add("CULET", "底尖比"); dictionary.Add("TOC", "台面偏心比"); dictionary.Add("COC", "底尖偏心比"); dictionary.Add("TWIST", "扭曲度"); dictionary.Add("CULET_TO_TABLE", "底尖到台面偏心比"); return dictionary[id]; } private string GetGradeName(int order) { // TODO DB没关联 Dictionary dictionary = new(); dictionary.Add(1,"极好"); dictionary.Add(2, "很好"); dictionary.Add(3, "好"); dictionary.Add(4, "一般"); dictionary.Add(5, "差"); return dictionary[order]; } /// /// 修改对称性等级 /// /// public void ChangeSym(object norm) { int? order = this.DtResults.Select(x => x.SymLevel).Max(); if (order.HasValue) { SymLevelTotal = GetGradeName((int)order.Value); } else { SymLevelTotal = string.Empty; } } private void InitCombobox() { // DS下拉列表初始化 InitDSlist(); // 等级下拉列表初始化 InitGradeList(); } private void InitDSlist() { DSList = new DataTable(); DSList.Columns.Add("Key"); DSList.Columns.Add("Value"); DSList.Rows.Add("pass", "pass"); DSList.Rows.Add("refer", "refer"); } private void InitGradeList() { GradeList = new DataTable(); GradeList.Columns.Add("Key"); GradeList.Columns.Add("Value"); GradeList.Rows.Add("极好", "Exc"); GradeList.Rows.Add("很好", "VG"); GradeList.Rows.Add("好", "G"); GradeList.Rows.Add("一般", "F"); GradeList.Rows.Add("差", "P"); } #region 钻石操作相关 //暂略 //部分代码(直接操作控件)需要在xaml.cs里边写 //涉及到计算部分,这里做一个中转 #endregion } public class CalGradeInfo{ public int gradeOrder { get; set; } public decimal? Min { get; set; } public decimal? Max { get; set; } public int isMaxExist { get; set; } public int isMinExist { get; set; } } public class DataInfo() : BaseViewModel { public string? TestItemId { get; set; } public string? TestItemName { get; set; } public string? Avg { get; set; } public string? Dev { get; set; } public string? Min { get; set; } public string? Max { get; set; } public string? CutLevel { get; set; } private int? _symLevel; public int? SymLevel { get { return _symLevel; } set { _symLevel = value; OnPropertyChanged(nameof(SymLevel)); }} public DataTable GradeList { get { // TODO DB没关联 DataTable GradeList = new DataTable(); GradeList.Columns.Add("Key"); GradeList.Columns.Add("Value"); GradeList.Rows.Add("极好", 1); GradeList.Rows.Add("很好", 2); GradeList.Rows.Add("好", 3); GradeList.Rows.Add("一般", 4); GradeList.Rows.Add("差", 5); return GradeList; } } }