using System.Data; using System.IO; using System.Reflection; using System.Windows.Input; using System.Windows.Shapes; using HandyControl.Controls; using log4net.Appender; using SparkClient.Model.Entity.ApiEntity; using SparkClient.Model.Helper; using static System.Windows.Forms.VisualStyles.VisualStyleElement.ToolTip; namespace SparkClient.ViewModel.Grading; public class GradingResultVM : BaseViewModel { private string DiamondCode { get; set; } private List _dtResults; private DataTable _dsList; private DataTable _gradeList; private string _standard; private string _shape; private string _crownType; private string _pavType; private string _wight; private string _cutLevelTotal; private string _symLevelTotal; public ICommand ChangeNormCommand { get; } public List DtResults { get { return _dtResults; } set { _dtResults = value; OnPropertyChanged(nameof(DtResults)); } } 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) { ChangeNormCommand = new RelayCommand(ChangeNorm); if (result != null) { InitView(result as AlgorithmResultEntity); } InitCombobox(); } private void InitView(AlgorithmResultEntity result) { 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 = result.measurements.TOTAL_DEPTH.ToString(digitsFormat); info.CutLevel = calGrade_TOTAL_DEPTH(result.measurements.TOTAL_DEPTH); return info; } private DataInfo getTABLE(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "TABLE"; info.TestItemName = GetName("TABLE"); info.Avg = result.measurements.TABLE.ToString(digitsFormat); info.Min = result.measurements.TABLE_MIN.ToString(digitsFormat); info.Max = result.measurements.TABLE_MAX.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 = result.measurements.CROWN_HEIGHT.ToString(digitsFormat); info.Dev = result.measurements.CROWN_H_DEV.ToString(digitsFormat); info.Min = result.measurements.CROWN_H_MIN.ToString(digitsFormat); info.Max = result.measurements.CROWN_H_MAX.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 = result.measurements.GIRDLE_BEZEL.ToString(digitsFormat); info.Dev = result.measurements.GIRDLE_BEZEL_DEV.ToString(digitsFormat); info.Min = result.measurements.GIRDLE_BEZEL_MIN.ToString(digitsFormat); info.Max = result.measurements.GIRDLE_BEZEL_MAX.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 = result.measurements.GIRDLE_BONE.ToString(digitsFormat); info.Min = result.measurements.GIRDLE_BONE_MIN.ToString(digitsFormat); info.Max = result.measurements.GIRDLE_BONE_MAX.ToString(digitsFormat); return info; } private DataInfo getGIRDLE(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "GIRDLE"; info.TestItemName = GetName("GIRDLE"); info.Avg = result.measurements.GIRDLE.ToString(digitsFormat); info.Dev = result.measurements.GIRDLE_DEV.ToString(digitsFormat); info.Min = result.measurements.GIRDLE_MIN.ToString(digitsFormat); info.Max = result.measurements.GIRDLE_MAX.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 = result.measurements.PAV_DEPTH.ToString(digitsFormat); info.Dev = result.measurements.PAV_DEPTH_DEV.ToString(digitsFormat); info.Min = result.measurements.PAV_DEPTH_MIN.ToString(digitsFormat); info.Max = result.measurements.PAV_DEPTH_MAX.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 = result.measurements.STAR.ToString(digitsFormat); info.Min = result.measurements.STAR_MIN.ToString(digitsFormat); info.Max = result.measurements.STAR_MAX.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 = result.measurements.LOWER_HALVES_RATIO.ToString(digitsFormat); info.Min = result.measurements.LOWER_HALVES_RATIO_MIN.ToString(digitsFormat); info.Max = result.measurements.LOWER_HALVES_RATIO_MAX.ToString(digitsFormat); return info; } private DataInfo getCULET(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "CULET"; info.TestItemName = GetName("CULET"); info.Avg = result.measurements.CULET.ToString(digitsFormat); return info; } private DataInfo getTOC(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "TOC"; info.TestItemName = GetName("TOC"); info.Avg = result.measurements.TOC.ToString(digitsFormat); return info; } private DataInfo getCOC(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "COC"; info.TestItemName = GetName("COC"); info.Avg = result.measurements.COC.ToString(digitsFormat); return info; } private DataInfo getTWIST(AlgorithmResultEntity result) { DataInfo info = new DataInfo(); info.TestItemId = "TWIST"; info.TestItemName = GetName("TWIST"); info.Avg = result.measurements.TWIST.ToString(digitsFormat); info.Dev = result.measurements.TWIST_DEV.ToString(digitsFormat); info.Min = result.measurements.TWIST_MIN.ToString(digitsFormat); info.Max = result.measurements.TWIST_MAX.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 = result.measurements.CULET_TO_TABLE.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没关联 return 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 ChangeNorm(object norm) { } 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() { 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; } public string? SymLevel { get; set; } 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; } } }