You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

558 lines
21 KiB

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<DataInfo> _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<DataInfo> 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;
/// <summary>
/// 构造
/// </summary>
/// <param name="result">检测结果</param>
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<DataInfo>();
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);
}
/// <summary>
/// 参数列表测试内容获取
/// </summary>
/// <returns></returns>
private List<string> GetTestItemList()
{
// DB 没关联
List<string> list = new List<string>();
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<CalGradeInfo> 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<CalGradeInfo> calGrades = DataBaseHelper.ExecuteQuery<CalGradeInfo>(sql);
return calGrades;
}
private int calGrade(string item ,double value)
{
int order = 1;
decimal cValue = Convert.ToDecimal(value);
List<CalGradeInfo> 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<string, string> 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<int, string> dictionary = new();
dictionary.Add(1,"极好");
dictionary.Add(2, "很好");
dictionary.Add(3, "好");
dictionary.Add(4, "一般");
dictionary.Add(5, "差");
return dictionary[order];
}
/// <summary>
/// 修改对称性等级
/// </summary>
/// <param name="norm"></param>
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;
}
}
}