Grade Level

master
tongg 5 days ago
parent eb3a2049a8
commit 0a41926630
  1. 6
      App.config
  2. 11
      BrilliantSight.csproj
  3. BIN
      BrilliantSightED.db
  4. 2
      Model/Entity/ApiEntity/StatusCodes.cs
  5. 1
      Model/Entity/JsonEntity.cs
  6. 6
      Model/GradeLevel/Entity/DatabaseEntity/BaseEntity.cs
  7. 16
      Model/GradeLevel/Entity/DatabaseEntity/GradeLevelDataSet.cs
  8. 13
      Model/GradeLevel/Entity/DatabaseEntity/GradeLevelMst.cs
  9. 15
      Model/GradeLevel/Entity/DatabaseEntity/GradeLevelSet.cs
  10. 14
      Model/GradeLevel/Entity/DatabaseEntity/GradeLevelSetDtl.cs
  11. 14
      Model/GradeLevel/Entity/DatabaseEntity/GradeLevelTotalSet.cs
  12. 29
      Model/GradeLevel/Entity/DatabaseEntity/GradeLevelTreeSet.cs
  13. 7
      Model/GradeLevel/Entity/Enum/GradeType.cs
  14. 35
      Model/GradeLevel/GradeLevelCalculator.cs
  15. 108
      Model/GradeLevel/Helper/EntityHelper.cs
  16. 248
      Model/GradeLevel/Helper/LevelConfigImportHelper.cs
  17. 9
      Model/GradeResult/Entity/CalGradeInfo.cs
  18. 56
      Model/GradeResult/Entity/DataInfo.cs
  19. 19
      Model/GradeResult/Entity/Enums/Accuracy.cs
  20. 13
      Model/GradeResult/Entity/Enums/DiamondShape.cs
  21. 8
      Model/GradeResult/Entity/Enums/SaveStatus.cs
  22. 27
      Model/GradeResult/Entity/Name.cs
  23. 22
      Model/GradeResult/Entity/RowDetail.cs
  24. 24
      Model/GradeResult/Entity/ViewData.cs
  25. 137
      Model/GradeResult/Helper/DoubleDataFormatHelper.cs
  26. 34
      Model/GradeResult/Helper/ViewDataInfoHelper.cs
  27. 66
      Model/Helper/AESHelper.cs
  28. 11
      Model/Helper/Common.cs
  29. 2
      Model/Helper/DataBaseHelper.cs
  30. 27
      Model/Services/SOCClientService.cs
  31. BIN
      Resource/Images/UIResource/Diamond/oval_p8-p8.png
  32. BIN
      SparkDB.db
  33. 243
      ViewModel/Configuration/LevelConfigVM.cs
  34. 4
      ViewModel/Grading/DiamondSelectVM.cs
  35. 47
      ViewModel/Grading/GradingLoadingVM.cs
  36. 814
      ViewModel/Grading/GradingResultVM.cs
  37. 2
      Views/Grading/GradingResult.xaml.cs
  38. 5
      Views/UserControl/Viewport3D.xaml.cs
  39. 2
      Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs
  40. 6
      Views/UserControl/ViewportData/Helper/ViewportManager.cs
  41. 6
      Views/UserControl/ViewportData/ViewportData.cs
  42. BIN
      ffmpeg.exe

@ -2,8 +2,8 @@
<configuration>
<appSettings>
<!-- 切工仪URL -->
<add key="BaseUrl" value="http://192.168.10.111:5000/api/SoC"/>
<!-- <add key="BaseUrl" value="http://192.168.3.100:8080"/> -->
<!-- <add key="BaseUrl" value="http://192.168.10.111:5000/api/SoC"/> -->
<add key="BaseUrl" value="http://192.168.3.100:8080"/>
<!-- SOC下载图片目录 -->
<add key="ImageFileBasePath" value="D:\diamond_images"/>
<!-- 算法失败时,历史图片保存文件夹路径 -->
@ -21,7 +21,7 @@
<!--网络质量检测阈值 Mbps-->
<add key="InternetCheckMbps" value="866" />
<!--检测模式 0:json 1:Image Ohter:algorithm -->
<add key="RunModel" value="0" />
<add key="RunModel" value="10" />
<!-- 客户端版本 -->
<!-- <add key="AppVersion" value="Nlsqq/kAPIXFHKk9dFcfqw==" /> -->
</appSettings>

@ -12,12 +12,14 @@
<Description>晶瞳钻石检测工具</Description>
<Copyright>Copyright ©2025 北京跃洋新视科技有限公司</Copyright>
<Company>北京跃洋新视科技有限公司</Company>
<AssemblyVersion>1.1.2521</AssemblyVersion>
<FileVersion>1.1.2521</FileVersion>
<AssemblyVersion>1.1.2522</AssemblyVersion>
<FileVersion>1.1.2522</FileVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<AssemblyName>BrilliantSightClient</AssemblyName>
<RootNamespace>BrilliantSightClient</RootNamespace>
<PackageId>BrilliantSightClient</PackageId>
</PropertyGroup>
<ItemGroup>
@ -79,9 +81,6 @@
<None Remove="Resource\Images\UIResource\round_P8-P8.png" />
<None Remove="Resource\Images\UIResource\round_select.png" />
<None Remove="Resource\Images\ze-add-o 1%403x.png" />
<Content Include="ffmpeg.exe">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<None Remove="Resource\Images\homebg.png" />
<Resource Include="Resource\Images\UIResource\Cushion.png" />
<Resource Include="Resource\Images\UIResource\Cushion_select.png" />
@ -111,7 +110,7 @@
<None Update="log4net.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="SparkDB.db">
<None Update="BrilliantSightED.db">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Remove="Resource\Images\config_3x.png" />

Binary file not shown.

@ -1,6 +1,6 @@
using System.Reflection;
namespace BrilliantSightClient.Model.Common
namespace BrilliantSightClient.Model.Entity.ApiEntity
{
/// <summary>
/// 存储状态码及其描述信息的常量类。

@ -8,6 +8,7 @@ using System.Text;
using System.Threading.Tasks;
using System.Windows.Documents;
using System.Windows.Shapes;
using BrilliantSightClient.Model.GradeResult.Entity;
namespace BrilliantSightClient.Model.Entity
{

@ -0,0 +1,6 @@
namespace BrilliantSightClient.Model.GradeLevel.Entity.DatabaseEntity;
public class BaseEntity
{
public string Sign { get; set; } = string.Empty;
}

@ -0,0 +1,16 @@
namespace BrilliantSightClient.Model.GradeLevel.Entity.DatabaseEntity;
/// <summary>
/// 定级数据设定
/// </summary>
public class GradeLevelDataSet: BaseEntity
{
public string Mst_Sign { get; set; } = string.Empty;
public string Mst_Name { get; set; } = string.Empty;
public string Name { get; set; } = string.Empty;
public string EName { get; set; } = string.Empty;
public string KName { get; set; } = string.Empty;
public string Unit {set; get;} = string.Empty;
public int HasCut { get; set; } = 0;
public int HasSym { get; set; } = 0;
}

@ -0,0 +1,13 @@
namespace BrilliantSightClient.Model.GradeLevel.Entity.DatabaseEntity;
/// <summary>
/// 定级设定主表
/// </summary>
public class GradeLevelMst : BaseEntity
{
public string Name { get; set; } = string.Empty;
public string EName { get; set; } = string.Empty;
public int RunMode { get; set; } = -1;
public int Shape { get; set; } = 0;
public int Crown { get; set; } = 8;
public int Pavilion { get; set; } = 8;
}

@ -0,0 +1,15 @@
namespace BrilliantSightClient.Model.GradeLevel.Entity.DatabaseEntity;
/// <summary>
/// 级别设定表
/// </summary>
public class GradeLevelSet : BaseEntity
{
public string Mst_Sign { get; set; } = string.Empty;
public string Mst_Name { get; set; } = string.Empty;
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;
}

@ -0,0 +1,14 @@
namespace BrilliantSightClient.Model.GradeLevel.Entity.DatabaseEntity;
/// <summary>
/// 评级设定明细
/// </summary>
public class GradeLevelSetDtl: BaseEntity
{
public string Mst_Sign { get; set; } = string.Empty;
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; }
}

@ -0,0 +1,14 @@
namespace BrilliantSightClient.Model.GradeLevel.Entity.DatabaseEntity;
/// <summary>
/// 综合评级设定表
/// </summary>
public class GradeLevelTotalSet: BaseEntity
{
public string Mst_Sign { get; set; } = string.Empty;
public string Mst_Name { get; set; } = string.Empty;
public int Set_Type { get; set; } = 0;
public int Statistics { get; set; } = 0;
public string DataNames { get; set; } = string.Empty;
public string DataSigns { get; set; } = string.Empty;
}

@ -0,0 +1,29 @@
namespace BrilliantSightClient.Model.GradeLevel.Entity.DatabaseEntity;
/// <summary>
/// 评级设定树
/// </summary>
public class GradeLevelTreeSet: BaseEntity
{
public string Mst_Sign { get; set; } = string.Empty;
public string Mst_Name { get; set; } = string.Empty;
public string Header { get; set; } = string.Empty;
public int NodeType { get; set; } = 0;
public int HasData { get; set; } = 0;
public int IsTop { get; set; } = 0;
public string DimensionValue { get; set; } = string.Empty;
public string DimensionSign { get; set; } = string.Empty;
public string ParentSign { get; set; } = string.Empty;
private List<GradeLevelSetDtl> _setDtls = new List<GradeLevelSetDtl>();
public List<GradeLevelSetDtl> GetLevelSetDtls()
{
return _setDtls;
}
public void AddSetDtl(GradeLevelSetDtl setDtl)
{
_setDtls.Add(setDtl);
}
}

@ -0,0 +1,7 @@
namespace BrilliantSightClient.Model.GradeLevel.Entity.Enum;
public enum GradeType
{
Cut = 0,
Sym = 1,
}

@ -0,0 +1,35 @@
using BrilliantSightClient.Model.Entity.ApiEntity;
using BrilliantSightClient.Model.GradeLevel.Entity.DatabaseEntity;
using BrilliantSightClient.Model.GradeResult.Entity;
namespace BrilliantSightClient.Model.GradeLevel;
public class GradeLevelCalculator
{
public GradeLevelCalculator(AlgorithmResultEntity entity)
{
}
public GradeLevelSet GetCutGradeLevelSet(double maxVal, double minVal)
{
return null;
}
public GradeLevelSet GetCutTotalGradeLevelSet(List<DataInfo> dataInfos)
{
return null;
}
public GradeLevelSet GetSymGradeLevelSet(double devVal)
{
return null;
}
public GradeLevelSet GetSymTotalGradeLevelSet(List<DataInfo> dataInfos)
{
return null;
}
}

@ -0,0 +1,108 @@
using System.Reflection;
using System.Text;
using BrilliantSightClient.Model.GradeLevel.Entity.DatabaseEntity;
using BrilliantSightClient.Model.Helper;
namespace BrilliantSightClient.Model.GradeLevel.Helper;
public static class EntityHelper
{
public static void GenerateSign(this BaseEntity entity)
{
Type type = entity.GetType();
PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.Name != nameof(BaseEntity.Sign) && p.CanRead)
.ToArray();
Array.Sort(properties, (p1, p2) => string.Compare(p1.Name, p2.Name, StringComparison.Ordinal));
StringBuilder sourceBuilder = new StringBuilder();
foreach (PropertyInfo property in properties)
{
object value = property.GetValue(entity);
string valueString = value?.ToString() ?? string.Empty;
sourceBuilder.Append($"{property.Name}={valueString}&");
}
if (sourceBuilder.Length > 0)
{
sourceBuilder.Length--;
}
string sign = Common.GenerateMd5Hash(sourceBuilder.ToString());
entity.Sign = sign;
}
public static string GenerateInsertSql(this BaseEntity entity)
{
Type type = entity.GetType();
string tableName = ConvertToUpperSnakeCase(type.Name);
PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.CanRead && p.GetValue(entity) != null)
.ToArray();
StringBuilder columnsBuilder = new StringBuilder();
StringBuilder valuesBuilder = new StringBuilder();
foreach (PropertyInfo property in properties)
{
string columnName = ConvertToUpperCase(property.Name);
object value = property.GetValue(entity);
string valueString = ProcessValue(value);
columnsBuilder.Append($"{columnName},");
valuesBuilder.Append($"{valueString},");
}
if (columnsBuilder.Length > 0)
{
columnsBuilder.Length--;
valuesBuilder.Length--;
}
string insertSql = $"INSERT INTO {tableName} ({columnsBuilder}) VALUES ({valuesBuilder});";
return insertSql;
}
// 辅助方法:大驼峰转大写下划线
private static string ConvertToUpperSnakeCase(string input)
{
return string.Concat(input.Select((c, i) =>
i > 0 && char.IsUpper(c)
? "_" + c
: c.ToString())).ToUpper();
}
// 辅助方法:大驼峰+下划线转纯大写
private static string ConvertToUpperCase(string input)
{
return input.ToUpper();
}
// 辅助方法:处理不同类型的值
private static string ProcessValue(object value)
{
if (value == null)
return "NULL";
if (value is string str)
return $"'{str.Replace("'", "''")}'";
if (value is DateTime dateTime)
return $"'{dateTime:yyyy-MM-dd HH:mm:ss}'";
if (value is bool boolean)
return boolean ? "1" : "0";
return value.ToString();
}
public static int GetValue<TEnum>(this TEnum enumValue)
where TEnum : Enum
{
return Convert.ToInt32(enumValue);
}
public static int? GetValueFromName<TEnum>(string name, bool ignoreCase = true)
where TEnum : struct, Enum
{
if (Enum.TryParse<TEnum>(name, ignoreCase, out var result))
{
return Convert.ToInt32(result);
}
return null; // 转换失败返回 null
}
}

@ -0,0 +1,248 @@
using System.Data;
using System.Text;
using BrilliantSightClient.Model.Entity.ApiEntity;
using BrilliantSightClient.Model.Extension;
using BrilliantSightClient.Model.GradeLevel.Entity;
using BrilliantSightClient.Model.GradeLevel.Entity.DatabaseEntity;
using BrilliantSightClient.Model.GradeLevel.Entity.Enum;
using BrilliantSightClient.Model.GradeResult.Entity;
using BrilliantSightClient.Model.Helper;
using BrilliantSightClient.Views.Dialog;
using BaseEntity = BrilliantSightClient.Model.GradeLevel.Entity.BaseEntity;
namespace BrilliantSightClient.Model.GradeLevel.Helper;
/// <summary>
/// 配置文件导入方法
/// </summary>
public class LevelConfigImportHelper
{
public static bool ImportLevelConfig(MasterLevelEntity master, List<UseDataSet> useDatasets, BaseEntity baseTree)
{
//主数据做成
GradeLevelMst mst = new GradeLevelMst()
{
Name = master.Name,
EName = master.EName,
RunMode = master.RunMode.GetValue(),
Shape = master.Shape.GetValue(),
Crown = master.Crown,
Pavilion = master.Pavilion,
};
mst.GenerateSign();
//级别设定
List<GradeLevelSet> gradeLevelSets = new List<GradeLevelSet>();
foreach (var levelSet in master.CutLevelSet)
{
var temp = new GradeLevelSet()
{
Mst_Name = mst.Name,
Mst_Sign = mst.Sign,
Set_Type = GradeType.Cut.GetValue(),
Name = levelSet.Name,
EName = levelSet.EName,
AName = levelSet.AName,
Short = levelSet.Short,
Sign = levelSet.Sign,
};
if (temp.Sign.IsNullOrEmpty())
temp.GenerateSign();
gradeLevelSets.Add(temp);
}
foreach (var levelSet in master.SymLevelSet)
{
var temp = new GradeLevelSet()
{
Mst_Name = mst.Name,
Mst_Sign = mst.Sign,
Set_Type = GradeType.Sym.GetValue(),
Name = levelSet.Name,
EName = levelSet.EName,
AName = levelSet.AName,
Short = levelSet.Short,
Sign = levelSet.Sign,
};
if (temp.Sign.IsNullOrEmpty())
temp.GenerateSign();
gradeLevelSets.Add(temp);
}
//定级数据配置
List<GradeLevelDataSet> dataSets = new List<GradeLevelDataSet>();
List<GradeLevelDataSet> CutDataSets = new List<GradeLevelDataSet>();
List<GradeLevelDataSet> SymDataSets = new List<GradeLevelDataSet>();
foreach (var useData in useDatasets)
{
var temp = new GradeLevelDataSet()
{
Mst_Name = mst.Name,
Mst_Sign = mst.Sign,
Name = useData.Name,
EName = useData.EName,
KName = useData.Key,
Unit = useData.Unit,
HasSym = useData.HasSym ? 1 : 0,
HasCut = useData.HasCut ? 1 : 0,
};
temp.GenerateSign();
if(master.CutTotalRuleSet.UserDataSets.Exists(e => e.Name == temp.Name) && temp.HasCut == 1)
CutDataSets.Add(temp);
if(master.SymTotalRuleSet.UserDataSets.Exists(e => e.Name == temp.Name) && temp.HasSym == 1)
SymDataSets.Add(temp);
dataSets.Add(temp);
}
#region 综合评级设定
List<GradeLevelTotalSet> totalSets = new List<GradeLevelTotalSet>();
if (master.CutTotalRuleSet != null)
{
StringBuilder sbCutDataSigns = new StringBuilder();
StringBuilder sbCutDataNames = new StringBuilder();
CutDataSets.ForEach(e =>
{
sbCutDataSigns.Append(e.Sign + ",");
sbCutDataNames.Append(e.Name + ",");
});
GradeLevelTotalSet cutTotalSet = new GradeLevelTotalSet()
{
Mst_Name = mst.Name,
Mst_Sign = mst.Sign,
Set_Type = GradeType.Cut.GetValue(),
Statistics = master.CutTotalRuleSet.Type.GetValue(),
DataNames = sbCutDataNames.ToString(0, sbCutDataNames.Length-1),
DataSigns = sbCutDataSigns.ToString(0, sbCutDataSigns.Length-1),
};
cutTotalSet.GenerateSign();
totalSets.Add(cutTotalSet);
}
if (master.SymTotalRuleSet != null)
{
StringBuilder sbCutDataSigns = new StringBuilder();
StringBuilder sbCutDataNames = new StringBuilder();
SymDataSets.ForEach(e =>
{
sbCutDataSigns.Append(e.Sign + ",");
sbCutDataNames.Append(e.Name + ",");
});
GradeLevelTotalSet symTotalSet = new GradeLevelTotalSet()
{
Mst_Name = mst.Name,
Mst_Sign = mst.Sign,
Set_Type = GradeType.Sym.GetValue(),
Statistics = master.SymTotalRuleSet.Type.GetValue(),
DataNames = sbCutDataNames.ToString(0, sbCutDataNames.Length-1),
DataSigns = sbCutDataSigns.ToString(0, sbCutDataSigns.Length-1),
};
symTotalSet.GenerateSign();
totalSets.Add(symTotalSet);
}
#endregion
//评级树和评级
List<GradeLevelTreeSet> treeSets = ConvertToTreeList(baseTree, mst, dataSets,gradeLevelSets);
List<GradeLevelSetDtl> dtlSets = new List<GradeLevelSetDtl>();
foreach (var treeSet in treeSets)
{
dtlSets.AddRange(treeSet.GetLevelSetDtls());
}
//数据库登入
//检查是否存在 ->存在删除
string checkSql = $"SELECT SIGN FROM GRADE_LEVEL_MST WHERE NAME = '{mst.Name}' AND RUNMODE = '{mst.RunMode}' AND SHAPE = '{mst.Shape}' AND CROWN = '{mst.Crown}' AND PAVILION = '{mst.Pavilion}'";
DataTable checkResult = DataBaseHelper.ExecuteQuery(checkSql);
if (checkResult.Rows.Count > 0)
{
string Sign = checkResult.Rows[0]["SIGN"].ToString();
string Where = $"WHERE MST_NAME = '{mst.Name}' AND MST_SIGN = '{Sign}'";
List<string> deleteSql = new List<string>();
deleteSql.Add( $"DELETE FROM GRADE_LEVEL_MST WHERE SIGN = '{Sign}'");
deleteSql.Add( $"DELETE FROM GRADE_LEVEL_SET {Where}");
deleteSql.Add( $"DELETE FROM GRADE_LEVEL_DATA_SET {Where}");
deleteSql.Add( $"DELETE FROM GRADE_LEVEL_TOTAL_SET {Where}");
deleteSql.Add( $"DELETE FROM GRADE_LEVEL_TREE_SET {Where}");
deleteSql.Add( $"DELETE FROM GRADE_LEVEL_SET_DTL {Where}");
deleteSql.ForEach(e => DataBaseHelper.ExecuteNonQuery(e));
}
List<string> insertSql = new List<string>();
insertSql.Add(mst.GenerateInsertSql());
gradeLevelSets.ForEach(e => insertSql.Add(e.GenerateInsertSql()));
dataSets.ForEach(e => insertSql.Add(e.GenerateInsertSql()));
totalSets.ForEach(e => insertSql.Add(e.GenerateInsertSql()));
treeSets.ForEach(e => insertSql.Add(e.GenerateInsertSql()));
dtlSets.ForEach(e => insertSql.Add(e.GenerateInsertSql()));
int kakeCount = 0;
foreach (var item in insertSql)
{
kakeCount += DataBaseHelper.ExecuteNonQuery(item);
}
if (kakeCount >= insertSql.Count)
{
new MessageBox().Show("配置已导入");
}
return false;
}
private static List<GradeLevelTreeSet> ConvertToTreeList(BaseEntity root, GradeLevelMst master,
List<GradeLevelDataSet> useDatasets, List<GradeLevelSet> gradeLevelSets)
{
var result = new List<GradeLevelTreeSet>();
void ConvertNode(BaseEntity node, string parentSign)
{
var useData = useDatasets.FirstOrDefault(e => e.KName == node.DimensionKey);
var treeSetNode = new GradeLevelTreeSet
{
Mst_Sign = master.Sign,
Mst_Name = master.Name,
Header = node.Header,
NodeType = node.NodeType,
HasData = node.HasData,
IsTop = node.IsTops ? 1 : 0, // 转换bool为int
DimensionValue = node.DimensionValue,
DimensionSign = useData==null?string.Empty:useData.Sign,
ParentSign = parentSign
};
treeSetNode.GenerateSign();
if (node.GradeSet != null && node.GradeSet.Count > 0)
{
foreach (var gradeSet in node.GradeSet)
{
var nowUseData = useDatasets.FirstOrDefault(e => e.KName == gradeSet.DataSet.Key);
gradeSet.NumSets.ForEach(numSet =>
{
var levelSet = gradeLevelSets.FirstOrDefault(e => e.Set_Type == node.NodeType-1 && e.Name.Equals(numSet.Name));
var temp = new GradeLevelSetDtl()
{
Mst_Sign = master.Sign,
Mst_Name = master.Name,
Tree_Sign = treeSetNode.Sign,
DataSet_Sign = nowUseData.Sign,
Level_Sign = levelSet.Sign,
Max_Value = numSet.MaxValue,
Min_Value = numSet.MinValue,
};
temp.GenerateSign();
treeSetNode.AddSetDtl(temp);
});
}
}
result.Add(treeSetNode); if (node.Children != null && node.Children.Any())
{
foreach (var child in node.Children)
{
ConvertNode(child, treeSetNode.Sign);
}
}
}
ConvertNode(root, string.Empty);
return result;
}
}

@ -0,0 +1,9 @@
namespace BrilliantSightClient.Model.GradeResult.Entity;
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; }
}

@ -0,0 +1,56 @@
using System.ComponentModel;
using System.Data;
namespace BrilliantSightClient.Model.GradeResult.Entity;
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 Dtl1 { get; set; } = string.Empty;
public string Dtl2 { get; set; } = string.Empty;
public string Dtl3 { get; set; } = string.Empty;
public string Dtl4 { get; set; } = string.Empty;
public string Dtl5 { get; set; } = string.Empty;
public string Dtl6 { get; set; } = string.Empty;
public string Dtl7 { get; set; } = string.Empty;
public string Dtl8 { get; set; } = string.Empty;
public string? CutLevel { get; set; }
private Int64? _symLevel;
//public int? SymLevel { get; set; }
public Int64? SymLevel
{
get { return _symLevel; }
set
{
if (_symLevel != value)
{
_symLevel = value;
OnPropertyChanged(nameof(SymLevel));
}
}
}
public bool isEnabled { get; set; } = true;
private DataTable? _gradeList;
public DataTable GradeList {
get
{
return _gradeList;
}
set
{
_gradeList = value;
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}

@ -0,0 +1,19 @@
using System.ComponentModel;
namespace BrilliantSightClient.Model.GradeResult.Entity.Enums;
public enum Accuracy
{
[Description("强制保留两位小数,向下取整(ZDZ1)")]
ForceTwoDecimals,
[Description("强制保留一位小数,向下取整(ZD1)")]
ForceOneDecimal,
[Description("将数值舍入到最近的 0.5 倍数(ZD5)")]
HalfStepRounding,
[Description("将数值舍入到最近的 5 的整数倍(Z5)")]
MultipleOfFive,
[Description("将数值舍入到最近的0.2倍数(ZD2)")]
DecimalTwoStepRounding,
[Description("强制向下取整为整数(Floor)")]
IntegerFloor
}

@ -0,0 +1,13 @@
using System.ComponentModel;
namespace BrilliantSightClient.Model.GradeResult.Entity.Enums;
public enum DiamondShape
{
[Description("强制保留两位小数,向下取整(ZDZ1)")]
Round = 0,
[Description("强制保留一位小数,向下取整(ZD1)")]
Oval = 1,
[Description("将数值舍入到最近的 0.5 倍数(ZD5)")]
Pear = 2,
}

@ -0,0 +1,8 @@
namespace BrilliantSightClient.Model.GradeResult.Entity.Enums;
public enum SaveStatus
{
AutoSave = 0,
Save=1,
SaveAs=2
}

@ -0,0 +1,27 @@
using System.Data;
using BrilliantSightClient.Model.Attributes;
using BrilliantSightClient.Model.Helper;
namespace BrilliantSightClient.Model.GradeResult.Entity;
public class Name
{
public string Id { get; set; }
public string name { get; set; }
[Log]
public static string getNameById(string id)
{
string sql = $"SELECT NAME, EN_NAME FROM NAME WHERE ID = '{id}'";
DataTable data = DataBaseHelper.ExecuteQuery(sql);
string nameType = "zn-ch".Equals(MultilingualHelper.getLangType())?"NAME":MultilingualHelper.getString("NameType");
if (data.Rows.Count>0)
{
return data.Rows[0][nameType].ToString();
}
else
{
return "";
}
}
}

@ -0,0 +1,22 @@
namespace BrilliantSightClient.Model.GradeResult.Entity;
public class RowDetail
{
public string? itemName { get; set; }
public string? Avg { get; set; }
public string? Dev { get; set; }
public string? Min { get; set; }
public string? Max { get; set; }
public string? item1 { get; set; }
public string? item2 { get; set; }
public string? item3 { get; set; }
public string? item4 { get; set; }
public string? item5 { get; set; }
public string? item6 { get; set; }
public string? item7 { get; set; }
public string? item8 { get; set; }
public string? CutLevel { get; set; }
public string? SymLevel { get; set; }
public int? MaxIndex { get; set; }
public int? MinIndex { get; set; }
}

@ -0,0 +1,24 @@
namespace BrilliantSightClient.Model.GradeResult.Entity;
public class ViewData
{
public string InfoPath { get; set; } = string.Empty;
public string Name { get; set; } = string.Empty;
public string EName { get; set; } = string.Empty;
public string DevKey { get; set; } = string.Empty;
public string DevType { get; set; } = string.Empty;
public string AvgKey { get; set; } = string.Empty;
public string AvgType { get; set; } = string.Empty;
public string MaxKey { get; set; } = string.Empty;
public string MaxType { get; set; } = string.Empty;
public string MinKey { get; set; } = string.Empty;
public string MinType { get; set; } = string.Empty;
public string DtlKey { get; set; } = string.Empty;
public string DtlAttr { get; set; } = string.Empty;
public string DtlCt { get; set; } = string.Empty;
public string DtlType { get; set; } = string.Empty;
public int Shape { get; set; } = 0; // 按枚举或字典为准
public string Specifications { get; set; } = string.Empty; // 规格(P8-P8、P8-P8-S1)
public int RunMode { get; set; } = -1; // 0实验室、1工厂、-1通用
}

@ -0,0 +1,137 @@
using BrilliantSightClient.Model.Attributes;
using BrilliantSightClient.Model.GradeResult.Entity.Enums;
namespace BrilliantSightClient.Model.GradeResult.Helper;
/// <summary>
/// 数据格式化工具类
/// </summary>
public static class DoubleDataFormatHelper
{
/// <summary>
/// 格式为小数点后一位
/// </summary>
public const string DigitsFormat = "f1";
/// <summary>
/// 直径的小数格式化
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
[Log]
public static string FormatDouble_D(double value)
{
// 2025/03/28 维护阶段发现直径切舍为四舍五入,现在改成直接切割
//return value.ToString("f2");
return (Math.Floor(value*100)/100).ToString("f2");
}
/// <summary>
/// 百分比用的小数格式化
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
[Log]
public static string FormatDouble_P(double value)
{
return (Math.Floor(value*1000)/10).ToString(DigitsFormat);
}
[Log]
public static string FormatDouble_P2(double value)
{
return (Math.Floor(value * 10000) / 100).ToString("f2");
}
/// <summary>
/// 百分比用的小数格式化
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
[Log]
public static string FormatDouble_Avg(double value, Accuracy accuracy)
{
string result = "";
if (Model.Helper.Common.RunMode == 0)
{
switch (accuracy)
{
case Accuracy.ForceTwoDecimals:
result = (Math.Floor(value * 100) / 100).ToString("f2");
break;
case Accuracy.ForceOneDecimal:
result = (Math.Floor(value * 10) / 10).ToString("f1");
break;
case Accuracy.HalfStepRounding:
result = (RoundFiveDownSixUp(value * 2) / 2).ToString("f1");
break;
case Accuracy.MultipleOfFive:
result = (RoundFiveDownSixUp(value / 5) * 5).ToString();
break;
case Accuracy.DecimalTwoStepRounding:
result = RoundToPointTwo(value).ToString("f1"); // 保留1位小数
break;
case Accuracy.IntegerFloor:
result = Math.Floor(value).ToString("F1"); // 直接取整
break;
}
}
else
{
//工厂模式不量化
switch (accuracy)
{
case Accuracy.ForceTwoDecimals:
result = (Math.Floor(value * 100) / 100).ToString("f2");
break;
case Accuracy.HalfStepRounding:
case Accuracy.ForceOneDecimal:
case Accuracy.DecimalTwoStepRounding:
case Accuracy.IntegerFloor:
case Accuracy.MultipleOfFive:
result = (Math.Floor(value * 10) / 10).ToString("f1");
break;
}
}
return result;
}
[Log]
public static double RoundFiveDownSixUp(double value)
{
// 提取整数部分
double integerPart = Math.Truncate(value);
// 提取小数部分
double fractionalPart = value - integerPart;
// 判断小数部分是否大于 0.5
return fractionalPart > 0.5 ? integerPart + 1 : integerPart;
}
public static double RoundToPointTwo(double value)
{
// 转换到10倍精度空间处理
double scaled = value * 10;
double remainder = scaled % 2; // 求模得到余数
// 核心舍入规则:余数>=1.5时进位
return remainder >= 1.5 ? (scaled - remainder + 2) / 10 : (scaled - remainder) / 10;
}
/// <summary>
/// 直接值(角度,直径)用的小数格式化
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
[Log]
public static string FormatDouble_A(double value)
{
return (Math.Floor(value * 10) / 10).ToString(DigitsFormat);
}
[Log]
public static string FormatDouble_A2(double value)
{
return (Math.Floor(value * 100) / 100).ToString("f2");
}
}

@ -0,0 +1,34 @@
using BrilliantSightClient.Model.Entity.ApiEntity;
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.GradeResult.Helper;
/// <summary>
/// 视图 DataInfo工具类
/// </summary>
public class ViewDataInfoHelper
{
public static List<DataInfo> GenerateDataInfos(AlgorithmResultEntity result)
{
JToken measurements = JToken.Parse(JsonConvert.SerializeObject(result.Measurements));
List<DataInfo> dataInfos = new List<DataInfo>();
int shape = EntityHelper.GetValueFromName<DiamondShape>(result.Shape)??-1;
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<ViewData> showViewData = DataBaseHelper.ExecuteQuery<ViewData>(viewDataSql);
foreach (var viewData in showViewData)
{
DataInfo dataInfo = new DataInfo();
}
return dataInfos;
}
}

@ -113,24 +113,54 @@ public class AESHelper
}
}
}
public static string DecryptFile(string inputFile, string password)
{
var aes = Aes.Create();
var pdb = new Rfc2898DeriveBytes(password, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
aes.Key = pdb.GetBytes(32);
aes.IV = pdb.GetBytes(16);
StringBuilder sb = new StringBuilder();
using (var fs = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
{
using (var cs = new CryptoStream(fs, aes.CreateDecryptor(), CryptoStreamMode.Read))
{
StreamReader sr = new StreamReader(cs);
while (!sr.EndOfStream)
{
sb.Append(sr.ReadLine());
}
}
/// <summary>
/// 加密字符串并返回二进制数组(指定密钥和IV)
/// </summary>
/// <param name="plainText">明文字符串</param>
/// <param name="key">密钥</param>
/// <param name="iv">初始化向量</param>
/// <returns>加密后的二进制数组</returns>
public static byte[] EncryptToBinary(string plainText, string key = Common.AesKey, string iv = Common.AesIV) {
using (var aes = CreateAes(key, iv)) {
var encryptor = aes.CreateEncryptor();
var plainBytes = Encoding.UTF8.GetBytes(plainText); // 复用现有编码处理
return PerformCryptography(plainBytes, encryptor);
}
}
/// <summary>
/// 解密二进制数组并返回字符串(指定密钥和IV)
/// </summary>
/// <param name="cipherBytes">加密的二进制数组</param>
/// <param name="key">密钥</param>
/// <param name="iv">初始化向量</param>
/// <returns>解密后的明文字符串</returns>
public static string DecryptFromBinary(byte[] cipherBytes, string key = Common.AesKey, string iv = Common.AesIV) {
using (var aes = CreateAes(key, iv)) {
var decryptor = aes.CreateDecryptor();
var plainBytes = PerformCryptography(cipherBytes, decryptor);
return Encoding.UTF8.GetString(plainBytes); // 复用现有编码处理
}
return sb.ToString();
}
// public static string DecryptFile(string inputFile, string password)
// {
// var aes = Aes.Create();
// var pdb = new Rfc2898DeriveBytes(password, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
// aes.Key = pdb.GetBytes(32);
// aes.IV = pdb.GetBytes(16);
// StringBuilder sb = new StringBuilder();
// using (var fs = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
// {
// using (var cs = new CryptoStream(fs, aes.CreateDecryptor(), CryptoStreamMode.Read))
// {
// StreamReader sr = new StreamReader(cs);
// while (!sr.EndOfStream)
// {
// sb.Append(sr.ReadLine());
// }
// }
// }
// return sb.ToString();
// }
}

@ -8,20 +8,17 @@ namespace BrilliantSightClient.Model.Helper;
public class Common
{
public const string DatabasePwd = "DyumL4FvF6wVHWw";
public const string AesKey = "2AB6AA27B1302AEB747E952D5C5C73B9";
public const string AesIV = "B1302AEB747E952D";
public static readonly string BasePath = AppDomain.CurrentDomain.BaseDirectory;
public const string DataBaseFileName = "SparkDB.db";
public const string DataBaseTempFileName = "SparkDBtemp.db";
public const string DataBaseFileName = "BrilliantSightED.db";
public const string DataBaseTempFileName = "temp.db";
public const string DataBaseName = "BrilliantSightED";
public const string DatabasePwd = "DyumL4FvF6wVHWw";
public const string DataBaseName = "SparkDB";
public static int RunMode { get; set; } = 0;
public static object LastParam = "ROUND P8 P8";

@ -148,7 +148,7 @@ public class DataBaseHelper
Logger.Error($"全局异常捕获:{ex.Message}", ex);
System.Windows.MessageBox.Show($"{MultilingualHelper.getString("ApplicationError")}{ex.Message}");
}
return null;
return new DataTable();
}
public static List<T> ExecuteQuery<T>(String sql, SqliteParameter[] sqlParameters = null) where T : new()

@ -6,7 +6,7 @@ using System.IO;
using System.Net.Http;
using System.Text;
using log4net;
using BrilliantSightClient.Model.Common;
using BrilliantSightClient.Model;
using BrilliantSightClient.Model.Entity.ApiEntity;
using BrilliantSightClient.Model.Extension;
using BrilliantSightClient.Model.Helper;
@ -469,6 +469,12 @@ namespace BrilliantSightClient.Model.Services
public async Task<string> OpenPump(bool isOpen)
{
string runModel = ConfigurationHelper.ReadConfigValue("RunModel") ?? "10";
if ("1" == runModel || "0" == runModel)
{
return StatusCodes.Success;
}
// if(GenImage) return StatusCodes.DeviceNotFound;
Logger.Info($"气泵开关请求发起{isOpen}");
int param = isOpen ? 1 : 0 ;
@ -480,6 +486,10 @@ namespace BrilliantSightClient.Model.Services
if (response.StatusCode == 200)
{
if (response.Content.Status != StatusCodes.Success)
{
return await OpenPump(isOpen);
}
var result = response.Content;
Logger.Debug($"Set Pump : {result.ToSafeAbundantString()} ");
return result.Status;
@ -497,7 +507,11 @@ namespace BrilliantSightClient.Model.Services
public async Task<GpioStatus> GetGpioStatus()
{
// GpioStatus
string runModel = ConfigurationHelper.ReadConfigValue("RunModel") ?? "10";
if ("1" == runModel || "0" == runModel)
{
return GpioStatus.IsClose();
}
string url = $"{_baseUrl}/gpio_check";
Logger.Info($"舱门状态检查开始:{url}");
try
@ -577,5 +591,14 @@ namespace BrilliantSightClient.Model.Services
Value2 = 48
};
}
public static GpioStatus IsClose()
{
return new GpioStatus
{
Status = "S000",
Value1 = 49,
Value2 = 49
};
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

@ -8,10 +8,18 @@ using System.Data;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Media.Media3D;
using MessageBox = BrilliantSightClient.Views.Dialog.MessageBox;
using BrilliantSightClient.Model.Attributes;
using BrilliantSightClient.Model.GradeLevel.Entity;
using BrilliantSightClient.Model.GradeLevel.Entity.DatabaseEntity;
using BrilliantSightClient.Model.GradeLevel.Helper;
using BrilliantSightClient.Model.GradeResult.Entity;
using Microsoft.Win32;
using Binding = System.Windows.Data.Binding;
using HorizontalAlignment = System.Windows.HorizontalAlignment;
using Orientation = System.Windows.Controls.Orientation;
namespace BrilliantSightClient.ViewModel.Configuration;
@ -593,115 +601,156 @@ public class LevelConfigVM : BaseViewModel
{
try
{
Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog();
openFileDialog.Filter = "Text files (*.enc)|*.enc|All files (*.*)|*.*";
jsonEntity = null;
jsonEntity_SYM = null;
if (openFileDialog.ShowDialog() == true)
OpenFileDialog openFileDialog = new OpenFileDialog
{
string filename = openFileDialog.FileName;
string content = "";
if (File.Exists(filename))
{
try
{
content = AESHelper.DecryptFile(filename, "000000");
if (filename.EndsWith("_SYM.enc"))
{
jsonEntity_SYM = JsonConvert.DeserializeObject<JsonEntity_SYM>(content);
}
else
{
jsonEntity = JsonConvert.DeserializeObject<JsonEntity>(content);
}
}
catch (Exception ex)
{
new MessageBox().Show($"{MultilingualHelper.getString("LevelConfigFormatError")}");
Logger.Error($"全局异常捕获:{ex.Message}", ex);
return;
}
}
}
else
{
//InstitutesEnabled = true;
//ShapesEnabled = true;
//IsUpdateButtonEnabled = false;
//InitData();
//ChangeShapeModel("");
return;
}
var initJsonEntity = new JsonEntity();
if (jsonEntity != null) {
initJsonEntity = jsonEntity;
}
else
{
initJsonEntity = jsonEntity_SYM;
}
if (initJsonEntity != null)
Title = "选择晶瞳标准配置文件",
Filter = "晶瞳标准配置文件 (*.bstand)|*.bstand",
AddExtension = true,
CheckFileExists = true,
CheckPathExists = true,
InitialDirectory = Environment.CurrentDirectory
};
bool? result = openFileDialog.ShowDialog();
if (result == true && !string.IsNullOrEmpty(openFileDialog.FileName))
{
// 形状列表重新生成
string shapeSql = $"SELECT * FROM SHAPE WHERE SHAPE_ID = '{initJsonEntity.SHAPE_ID}';";
DataTable shapes = DataBaseHelper.ExecuteQuery(shapeSql);
if (shapes == null || shapes.Rows.Count == 0)
byte[] resultBytes = File.ReadAllBytes(openFileDialog.FileName);
string finalData = AESHelper.DecryptFromBinary(resultBytes);
string[] temp = finalData.Split("|^_^|");
if (temp.Length < 3)
{
var row = Shapes.NewRow();
row["SHAPE_ID"] = initJsonEntity.SHAPE_ID;
row["SHAPE_NAME"] = initJsonEntity.SHAPE_NAME;
row["SHAPE_EN_NAME"] = initJsonEntity.SHAPE_EN_NAME;
Shapes.Rows.Add(row);
ShapeId = initJsonEntity.SHAPE_ID;
}
else
{
ShapeId = shapes.Rows[0]["SHAPE_ID"].ToString() ?? "";
throw new Exception("Insufficient or missing configuration information");
}
// 机构列表重新生成
string instituteSql = $"SELECT * FROM RULE WHERE RULE_ID = '{initJsonEntity.RULE_ID}';";
DataTable institute = DataBaseHelper.ExecuteQuery(instituteSql);
if (institute == null || institute.Rows.Count == 0)
{
var row = Institutes.NewRow();
row["RULE_ID"] = initJsonEntity.RULE_ID;
row["RULE_NAME"] = initJsonEntity.RULE_NAME;
row["RULE_EN_NAME"] = initJsonEntity.RULE_EN_NAME;
Institutes.Rows.Add(row);
InstituteId = initJsonEntity.RULE_ID;
}
else
MasterLevelEntity? master = JsonConvert.DeserializeObject<MasterLevelEntity>(temp[0]);
List<UseDataSet>? useDatasets = JsonConvert.DeserializeObject<List<UseDataSet>>(temp[1]);
Model.GradeLevel.Entity.BaseEntity? baseTree = JsonConvert.DeserializeObject<Model.GradeLevel.Entity.BaseEntity>(temp[2]);
if (master == null || useDatasets == null || useDatasets.Count == 0 || baseTree == null)
{
InstituteId = institute.Rows[0]["RULE_ID"].ToString() ?? "";
throw new Exception("The configuration information is incomplete.");
}
// 表格内容重新生成
string gradeInfosJson = JsonConvert.SerializeObject(initJsonEntity.gradeInfos);
DataTable gradeInfos = Common.JsonToDataTable(gradeInfosJson);
string standardInfosJson = JsonConvert.SerializeObject(initJsonEntity.standardInfos);
DataTable standardInfos = Common.JsonToDataTable(standardInfosJson);
setStandardList(gradeInfos, standardInfos);
InstitutesEnabled = false;
ShapesEnabled = false;
IsUpdateButtonEnabled = true;
}
else
{
new MessageBox().Show($"{MultilingualHelper.getString("LevelConfigFormatError")}");
InstitutesEnabled = true;
ShapesEnabled = true;
IsUpdateButtonEnabled = false;
return;
LevelConfigImportHelper.ImportLevelConfig(master, useDatasets, baseTree);
}
}
catch (Exception ex)
{
new MessageBox().Show($"{MultilingualHelper.getString("ApplicationError")}{ex.Message}");
Logger.Error($"全局异常捕获:{ex.Message}", ex);
Logger.Error($"文件导入&解析异常:{ex.Message}", ex);
}
// try
// {
//
// Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog();
// openFileDialog.Filter = "Text files (*.bstand)|*.bstand|All files (*.*)|*.*";
// jsonEntity = null;
// jsonEntity_SYM = null;
// if (openFileDialog.ShowDialog() == true)
// {
// string filename = openFileDialog.FileName;
// string content = "";
// if (File.Exists(filename))
// {
// try
// {
// content = AESHelper.DecryptFile(filename, "000000");
// if (filename.EndsWith("_SYM.enc"))
// {
// jsonEntity_SYM = JsonConvert.DeserializeObject<JsonEntity_SYM>(content);
// }
// else
// {
// jsonEntity = JsonConvert.DeserializeObject<JsonEntity>(content);
// }
//
// }
// catch (Exception ex)
// {
// new MessageBox().Show($"{MultilingualHelper.getString("LevelConfigFormatError")}");
// Logger.Error($"全局异常捕获:{ex.Message}", ex);
// return;
// }
// }
// }
// else
// {
// //InstitutesEnabled = true;
// //ShapesEnabled = true;
// //IsUpdateButtonEnabled = false;
// //InitData();
// //ChangeShapeModel("");
// return;
// }
// var initJsonEntity = new JsonEntity();
//
// if (jsonEntity != null) {
// initJsonEntity = jsonEntity;
// }
// else
// {
// initJsonEntity = jsonEntity_SYM;
// }
// if (initJsonEntity != null)
// {
// // 形状列表重新生成
// string shapeSql = $"SELECT * FROM SHAPE WHERE SHAPE_ID = '{initJsonEntity.SHAPE_ID}';";
// DataTable shapes = DataBaseHelper.ExecuteQuery(shapeSql);
// if (shapes == null || shapes.Rows.Count == 0)
// {
// var row = Shapes.NewRow();
// row["SHAPE_ID"] = initJsonEntity.SHAPE_ID;
// row["SHAPE_NAME"] = initJsonEntity.SHAPE_NAME;
// row["SHAPE_EN_NAME"] = initJsonEntity.SHAPE_EN_NAME;
// Shapes.Rows.Add(row);
// ShapeId = initJsonEntity.SHAPE_ID;
// }
// else
// {
// ShapeId = shapes.Rows[0]["SHAPE_ID"].ToString() ?? "";
// }
//
// // 机构列表重新生成
// string instituteSql = $"SELECT * FROM RULE WHERE RULE_ID = '{initJsonEntity.RULE_ID}';";
// DataTable institute = DataBaseHelper.ExecuteQuery(instituteSql);
// if (institute == null || institute.Rows.Count == 0)
// {
// var row = Institutes.NewRow();
// row["RULE_ID"] = initJsonEntity.RULE_ID;
// row["RULE_NAME"] = initJsonEntity.RULE_NAME;
// row["RULE_EN_NAME"] = initJsonEntity.RULE_EN_NAME;
// Institutes.Rows.Add(row);
// InstituteId = initJsonEntity.RULE_ID;
// }
// else
// {
// InstituteId = institute.Rows[0]["RULE_ID"].ToString() ?? "";
// }
// // 表格内容重新生成
// string gradeInfosJson = JsonConvert.SerializeObject(initJsonEntity.gradeInfos);
// DataTable gradeInfos = Common.JsonToDataTable(gradeInfosJson);
// string standardInfosJson = JsonConvert.SerializeObject(initJsonEntity.standardInfos);
// DataTable standardInfos = Common.JsonToDataTable(standardInfosJson);
// setStandardList(gradeInfos, standardInfos);
// InstitutesEnabled = false;
// ShapesEnabled = false;
// IsUpdateButtonEnabled = true;
// }
// else
// {
// new MessageBox().Show($"{MultilingualHelper.getString("LevelConfigFormatError")}");
// InstitutesEnabled = true;
// ShapesEnabled = true;
// IsUpdateButtonEnabled = false;
// return;
// }
// }
// catch (Exception ex)
// {
// new MessageBox().Show($"{MultilingualHelper.getString("ApplicationError")}{ex.Message}");
// Logger.Error($"全局异常捕获:{ex.Message}", ex);
// }
}
/// <summary>

@ -229,7 +229,7 @@ public class DiamondSelectVM : BaseViewModel
{
// TODO 待二级图片作成后替换,以及后续检测处理追加
var bitmap_p8p8 = getBitmap("oval_P8-P8.png");
buttons.Add(new ButtonViewModel { Text = "Oval Stage 1", ImageSource = bitmap_p8p8, Type = "OVAL S1", Command = StartGradingCommand, IsFocused = true });
buttons.Add(new ButtonViewModel { Text = "Oval P8-P8", ImageSource = bitmap_p8p8, Type = "OVAL P8 P8", Command = StartGradingCommand, IsFocused = true });
}
// 运行模式为工厂模式
else if (Common.RunMode == 1)
@ -281,7 +281,7 @@ public class DiamondSelectVM : BaseViewModel
DiamondCode = "";
}
string runModel = ConfigurationHelper.ReadConfigValue("RunModel") ?? "1";
string runModel = ConfigurationHelper.ReadConfigValue("RunModel") ?? "10";
if ("0".Equals(runModel))
//json模式

@ -11,7 +11,7 @@ using System.Windows.Threading;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using BrilliantSightClient.Model.Attributes;
using BrilliantSightClient.Model.Common;
using BrilliantSightClient.Model;
using BrilliantSightClient.Model.Entity.ApiEntity;
using BrilliantSightClient.Model.Extension;
using BrilliantSightClient.Model.Helper;
@ -553,29 +553,36 @@ public class GradingLoadingVM : BaseViewModel,IDisposable
private async Task RunProgressAsync(CancellationToken token)
{
// var configValue = ConfigurationHelper.ReadConfigValue("ProgressTime");
int totalDuration = 50000;
int stepTime = totalDuration / 97;
// 使用 IProgress 实现线程安全的进度报告
var progress = new Progress<double>(value =>
try
{
if (!token.IsCancellationRequested)
Progress = value;
});
int totalDuration = 50000;
int stepTime = totalDuration / 97;
await Task.Run(async () =>
{
for (int i = 0; i <= 97; i++)
// 使用 IProgress 实现线程安全的进度报告
var progress = new Progress<double>(value =>
{
token.ThrowIfCancellationRequested();
// 报告进度
((IProgress<double>)progress).Report(i);
if (!token.IsCancellationRequested)
Progress = value;
});
await Task.Run(async () =>
{
for (int i = 0; i <= 97; i++)
{
token.ThrowIfCancellationRequested();
// 报告进度
((IProgress<double>)progress).Report(i);
// 使用可取消的延迟
await Task.Delay(stepTime, token);
}
}, token);
}
catch (Exception e)
{
// 使用可取消的延迟
await Task.Delay(stepTime, token);
}
}, token);
}
}
[Log]

File diff suppressed because it is too large Load Diff

@ -1,10 +1,10 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Forms.VisualStyles;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using BrilliantSightClient.Model.GradeResult.Entity;
using GlobalHotKey;
using log4net;
using BrilliantSightClient.Model.Helper;

@ -91,6 +91,11 @@ public partial class Viewport3D
ContextMenu.Items.Remove(ViewportCutXuanZSeparator);
}
if (!ViewportManager.DiamondType.Split(" ").First().Equals("ROUND"))
{
ViewportManager.DoubleClickSelect = false;
}
//工厂模式屏蔽一些东西
string step = ViewportManager.DiamondType.Split(" ").Last();
if (Common.RunMode == 1 && step.StartsWith("S"))

@ -1793,7 +1793,7 @@ public class ViewportHelperPro
var center = ViewportManager.CenterVector;
center.Y = Y;
double radius = 5;
if (double.TryParse(ViewportManager.DiamondData["M2"].ToString(), out var v))
if (double.TryParse(ViewportManager.DiamondData["M2"].ToSafeString(), out var v))
{
radius = (v * 0.5);
}

@ -10,6 +10,7 @@ using BrilliantSightClient.Model.Attributes;
using BrilliantSightClient.Views.Dialog;
using BrilliantSightClient.Views.UserControl.ViewportData.Entity;
using BrilliantSightClient.Views.UserControl.ViewportData.Enum;
using Newtonsoft.Json.Linq;
using GeometryModel3D = HelixToolkit.Wpf.SharpDX.GeometryModel3D;
namespace BrilliantSightClient.Views.UserControl.ViewportData.Helper;
@ -23,11 +24,12 @@ public class ViewportManager
/// </summary>
public static List<Viewport3DTriangleEntity> ViewportTriangle = new List<Viewport3DTriangleEntity>();
public static JsonObject DiamondData = new JsonObject();
public static JObject DiamondData { get; set; } = new JObject();
public static string DiamondCode = string.Empty;
//钻石类型
public static string DiamondType = string.Empty;
public static string DiamondType { get; set; } = string.Empty;
/// <summary>
/// 模型正方向(从模型中心出发的方向)
/// </summary>

@ -8,6 +8,7 @@ using BrilliantSightClient.Model.Helper;
using BrilliantSightClient.Views.UserControl.ViewportData.Entity;
using BrilliantSightClient.Views.UserControl.ViewportData.Enum;
using BrilliantSightClient.Views.UserControl.ViewportData.Helper;
using Newtonsoft.Json.Linq;
using SparkDotNetCore.DiamondScanner.Entity;
namespace BrilliantSightClient.Views.UserControl.ViewportData;
@ -109,7 +110,8 @@ public class ViewportData
ViewportManager.DiamondCode = DiamondCode;
ViewportManager.DiamondType = diamondData.ErrorMsg.ToSafeString();
ViewportManager.DiamondData = JsonObject.Parse(JsonConvert.SerializeObject(diamondData.Measurements)).AsObject();
if(diamondData.Measurements != null)
ViewportManager.DiamondData = JObject.Parse(JsonConvert.SerializeObject(diamondData.Measurements));
var midZ = facets.SelectMany(e => new[] { e.Point1.X, e.Point2.X, e.Point3.X }).OrderBy(z => Math.Abs(z))
.First();
List<Viewport3DTriangleEntity> facetsFinal = new List<Viewport3DTriangleEntity>();
@ -160,7 +162,7 @@ public class ViewportData
facetsFinal.Add(item);
}
if (diamondData.Status.Equals("P021"))
if (diamondData.Status != null && diamondData.Status.Equals("P021"))
{
ViewportManager.isUglyDiamond = true;
}

Binary file not shown.
Loading…
Cancel
Save