From bf3c38820ea340def6e55a4a986c9c9055437015 Mon Sep 17 00:00:00 2001 From: sunhonglei Date: Tue, 10 Dec 2024 15:58:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=A3=80=E6=B5=8B=E7=94=BB=E9=9D=A2?= =?UTF-8?q?=E6=94=B9=E4=BF=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App.xaml | 3 + Language/en_US.xaml | 2 +- Language/zh_CN.xaml | 28 ++++- Model/Entity/CutterConfigEntity.cs | 14 +-- Model/Helper/DataBaseHelper.cs | 25 +++-- SparkClient.csproj | 5 + SparkDB.db | Bin 221184 -> 237568 bytes ViewModel/BaseWindow/HomeWindowVM.cs | 10 +- ViewModel/Configuration/AlgorithmConfigVM.cs | 28 ++--- ViewModel/Configuration/ConfigMenuPageVM.cs | 8 ++ ViewModel/Configuration/CutConfigVM.cs | 45 ++++---- ViewModel/Grading/DiamondSelectVM.cs | 8 +- ViewModel/Grading/GradingResultVM.cs | 58 ++++++++-- Views/Configuration/ConfigMenuPage.xaml | 18 ++++ Views/Configuration/ConfigMenuPage.xaml.cs | 14 +++ Views/Dialog/StartDialog.xaml | 2 +- Views/Grading/DiamondSelect.xaml | 1 - Views/Grading/GradingResult.xaml | 105 +++++++++++++++++-- Views/Grading/GradingResult.xaml.cs | 10 ++ 19 files changed, 312 insertions(+), 72 deletions(-) diff --git a/App.xaml b/App.xaml index cf3a53b..0fc0efc 100644 --- a/App.xaml +++ b/App.xaml @@ -57,6 +57,9 @@ + + + diff --git a/Language/en_US.xaml b/Language/en_US.xaml index 04e1ddd..d96082a 100644 --- a/Language/en_US.xaml +++ b/Language/en_US.xaml @@ -26,7 +26,7 @@ STANDARD_EN_NAME SHAPE_EN_NAME INSTITUTE_EN_NAME - + RULE_EN_NAME Average diff --git a/Language/zh_CN.xaml b/Language/zh_CN.xaml index 8d54950..ae150a7 100644 --- a/Language/zh_CN.xaml +++ b/Language/zh_CN.xaml @@ -27,13 +27,21 @@ 压缩Json + 标准 + 形状 + 冠部 + 亭部 + 重量(ct) + 切工等级 + 对称等级 平均 圆度 深度 最小值 最大值 SYM等级 - + 导出 + 是否退出程序? 是否退出 @@ -54,6 +62,9 @@ 确定 跳过 没有输入钻石编码 + + 保存成功 + 保存失败 圆形 心形 @@ -73,4 +84,19 @@ 按钮 + + 保存 + 系统配置 + 语言设置 + 上传文件 + TXT文件 + STL文件 + Excel文件 + Dat文件 + 保存路径 + 请输入 + 选择 + 定级标准 + 保存路径不存在 + RULE_NAME \ No newline at end of file diff --git a/Model/Entity/CutterConfigEntity.cs b/Model/Entity/CutterConfigEntity.cs index a8edfb7..c43ddf1 100644 --- a/Model/Entity/CutterConfigEntity.cs +++ b/Model/Entity/CutterConfigEntity.cs @@ -8,26 +8,26 @@ namespace SparkClient.Model.Entity; /// 系统设置实体 /// -public class CutterConfigEntity : BaseEntity +public class CutterConfigEntity { - public static readonly new string TableName = "CUTTER_CONFIG"; + public static readonly string TableName = "CUTTER_CONFIG"; [DbField("GUID")] public Guid GUID { get; set; } /// /// 项目名称 /// [DbField("ITEM_NAME")] - public string ItemName { get; set; } + public required string ItemName { get; set; } /// /// key /// [DbField("KEY")] - public string Key { get; set; } + public required string Key { get; set; } /// /// value /// [DbField("VALUE")] - public string Value { get; set; } + public required string Value { get; set; } private static Dictionary GetFieldMappings() { var properties = typeof(CutterConfigEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance); @@ -49,7 +49,7 @@ public class CutterConfigEntity : BaseEntity } // 生成 Update 语句 - public string GenerateUpdateSQL(Dictionary fieldsToUpdate = null) + public string GenerateUpdateSQL(Dictionary? fieldsToUpdate = null) { if (fieldsToUpdate == null || fieldsToUpdate.Count == 0) { @@ -67,7 +67,7 @@ public class CutterConfigEntity : BaseEntity } // 生成 Delete 语句 - public string GenerateDeleteSQL(Dictionary conditions = null) + public string GenerateDeleteSQL(Dictionary? conditions = null) { if (conditions == null || conditions.Count == 0) { diff --git a/Model/Helper/DataBaseHelper.cs b/Model/Helper/DataBaseHelper.cs index e68c52f..db31753 100644 --- a/Model/Helper/DataBaseHelper.cs +++ b/Model/Helper/DataBaseHelper.cs @@ -1,5 +1,7 @@ using System.Data; using System.IO; +using log4net; +using log4net.Repository.Hierarchy; using Microsoft.Data.Sqlite; namespace SparkClient.Model.Helper; @@ -8,12 +10,13 @@ namespace SparkClient.Model.Helper; /// public class DataBaseHelper { + private static readonly ILog Logger = LogManager.GetLogger(typeof(MainWindow)); //连接、查询、查询、关闭 - + public static void InitDataBase() { string databasePath = Path.Combine(Common.BasePath, Common.DataBaseTempFileName); - + Logger logger; if (File.Exists(databasePath)) return; else @@ -36,8 +39,8 @@ public class DataBaseHelper static readonly string password = Common.DatabasePwd; static readonly string dbPath = Common.DataBaseFileName; - static SqliteConnection connection; - static SqliteTransaction sqliteTransaction; + static SqliteConnection? connection; + static SqliteTransaction? sqliteTransaction; public static void CreateConnection() { @@ -59,7 +62,10 @@ public class DataBaseHelper public static void CloseConnection() { - connection.Close(); + if (connection != null) + { + connection.Close(); + } } public static void BeginTransaction() { @@ -95,7 +101,10 @@ public class DataBaseHelper SqliteCommand cmd = new SqliteCommand(); cmd.Connection = connection; cmd.CommandText = sql; - cmd.Transaction = sqliteTransaction; + if (sqliteTransaction != null) + { + cmd.Transaction = sqliteTransaction; + } if (sqlParameters != null) { cmd.Parameters.AddRange(sqlParameters); @@ -135,8 +144,8 @@ public class DataBaseHelper } catch (Exception ex) { - System.Windows.MessageBox.Show("检索失败"); - Console.WriteLine(ex.ToString()); + Logger.Error($"全局异常捕获:{ex.Message}", ex); + System.Windows.MessageBox.Show($"应用程序出现错误:{ex.Message}"); } return null; } diff --git a/SparkClient.csproj b/SparkClient.csproj index 493fc34..a920f72 100644 --- a/SparkClient.csproj +++ b/SparkClient.csproj @@ -33,6 +33,9 @@ + + + @@ -46,6 +49,8 @@ + + Always diff --git a/SparkDB.db b/SparkDB.db index b04de823c05939441ec3bfd623c800e03d70e767..88e7081acd4e0f470c486d5c5e84042b8028be6c 100644 GIT binary patch delta 28918 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 { - MethodConfigEntity entity = new MethodConfigEntity(); - entity.GUID = Guid.NewGuid(); - entity.JsonOrder = order++; - entity.Json = temp.Substring(0,2000); + AlgorithmConfigEntity entity = new AlgorithmConfigEntity() + { + GUID = Guid.NewGuid(), + JsonOrder = order++, + Json = temp.Substring(0, 2000), + }; temp = temp.Substring(2000); string sql = entity.GenerateInsertSQL(); SqliteParameter[] sqliteParameters = { @@ -80,10 +82,12 @@ public class AlgorithmConfigVM : BaseViewModel } if (temp.Length>0) { - MethodConfigEntity entity = new MethodConfigEntity(); - entity.GUID = Guid.NewGuid(); - entity.JsonOrder = order++; - entity.Json = temp; + AlgorithmConfigEntity entity = new AlgorithmConfigEntity() + { + GUID = Guid.NewGuid(), + JsonOrder = order++, + Json = temp + }; string sql = entity.GenerateInsertSQL(); SqliteParameter[] sqliteParameters = { new SqliteParameter("@Json", entity.Json), @@ -94,12 +98,12 @@ public class AlgorithmConfigVM : BaseViewModel } if (insertCount >= 0) { - Growl.Info("保存成功"); + Growl.Info(MultilingualHelper.getString("SaveSuccess")); DataBaseHelper.commit(); } else { - Growl.Error("保存失败"); + Growl.Error(MultilingualHelper.getString("SaveFail")); DataBaseHelper.rollback(); } } diff --git a/ViewModel/Configuration/ConfigMenuPageVM.cs b/ViewModel/Configuration/ConfigMenuPageVM.cs index bcc0b9f..da6042b 100644 --- a/ViewModel/Configuration/ConfigMenuPageVM.cs +++ b/ViewModel/Configuration/ConfigMenuPageVM.cs @@ -10,12 +10,14 @@ public class ConfigMenuPageVM : BaseViewModel public ICommand LevelConfigCommand { get; } public ICommand AlgorithmConfigCommand { get; } public ICommand CutConfigCommand { get; } + public ICommand SettingConfigCommand { get; } public ConfigMenuPageVM() { CloseCommand = new RelayCommand(CloseVM); LevelConfigCommand = new RelayCommand(LevelConfig); AlgorithmConfigCommand = new RelayCommand(AlgorithmConfig); CutConfigCommand = new RelayCommand(CutConfig); + SettingConfigCommand = new RelayCommand(SettingConfig); } /// @@ -60,4 +62,10 @@ public class ConfigMenuPageVM : BaseViewModel WindowManager.openContent.Add(vm); } + public void SettingConfig(object parameter) + { + BaseControlVM vm = new BaseControlVM(new SettingsVM(), MultilingualHelper.getString("System Settings")); + WindowManager.mainViewModel.Content = vm; + WindowManager.openContent.Add(vm); + } } \ No newline at end of file diff --git a/ViewModel/Configuration/CutConfigVM.cs b/ViewModel/Configuration/CutConfigVM.cs index a1657a2..4f3dd7b 100644 --- a/ViewModel/Configuration/CutConfigVM.cs +++ b/ViewModel/Configuration/CutConfigVM.cs @@ -80,18 +80,20 @@ public class CutConfigVM: BaseViewModel int insertCount = 0; foreach (DataRow row in CutterInfos.Rows) { - if (row["Key"] == "") + if (row["Key"].ToString() == "") { continue; } - DataRow removerow = dataTable.AsEnumerable().Where(r => r["GUID"].ToString() == row["GUID"].ToString()).FirstOrDefault(); + DataRow? removerow = dataTable.AsEnumerable().Where(r => r["GUID"].ToString() == row["GUID"].ToString()).FirstOrDefault(); if (removerow != null) { - CutterConfigEntity entity = new CutterConfigEntity(); - entity.ItemName = row["ItemName"].ToString(); - entity.Key = row["Key"].ToString(); - entity.Value = row["Value"].ToString(); - entity.GUID = Guid.Parse(row["GUID"].ToString()); + CutterConfigEntity entity = new CutterConfigEntity() + { + ItemName = row["ItemName"].ToString() ?? "", + Key = row["Key"].ToString() ?? "", + Value = row["Value"].ToString() ?? "", + GUID = Guid.Parse(row["GUID"].ToString()??"") + }; sql = entity.GenerateUpdateSQL(); SqliteParameter[] sqliteParameters = { new SqliteParameter("@ITEM_NAME", row["ItemName"].ToString()), @@ -104,10 +106,12 @@ public class CutConfigVM: BaseViewModel } else { - CutterConfigEntity entity = new CutterConfigEntity(); - entity.ItemName = row["ItemName"].ToString(); - entity.Key = row["Key"].ToString(); - entity.Value = row["Value"].ToString(); + CutterConfigEntity entity = new CutterConfigEntity() + { + ItemName = row["ItemName"].ToString() ?? "", + Key = row["Key"].ToString() ?? "", + Value = row["Value"].ToString() ?? "" + }; sql = entity.GenerateInsertSQL(); SqliteParameter[] sqliteParameters = { new SqliteParameter("@ItemName", row["ItemName"].ToString()), @@ -120,12 +124,14 @@ public class CutConfigVM: BaseViewModel } foreach (DataRow row in dataTable.Rows) { - CutterConfigEntity entity = new CutterConfigEntity(); - entity.ItemName = row["ItemName"].ToString(); - entity.Key = row["Key"].ToString(); - entity.Value = row["Value"].ToString(); Guid.TryParse(row["GUID"].ToString(), out Guid result); - entity.GUID = result; + CutterConfigEntity entity = new CutterConfigEntity() + { + ItemName = row["ItemName"].ToString() ?? "", + Key = row["Key"].ToString() ?? "", + Value = row["Value"].ToString() ?? "", + GUID = result + }; sql = entity.GenerateDeleteSQL(); insertCount += DataBaseHelper.ExecuteNonQuery(sql); } @@ -145,7 +151,10 @@ public class CutConfigVM: BaseViewModel /// 行 public void DelCutRow(object row) { - DataRowView a = row as DataRowView; - CutterInfos.Rows.Remove(a.Row); + DataRowView? a = row as DataRowView; + if (a != null) + { + CutterInfos.Rows.Remove(a.Row); + } } } \ No newline at end of file diff --git a/ViewModel/Grading/DiamondSelectVM.cs b/ViewModel/Grading/DiamondSelectVM.cs index e7cd23b..83e9c67 100644 --- a/ViewModel/Grading/DiamondSelectVM.cs +++ b/ViewModel/Grading/DiamondSelectVM.cs @@ -109,7 +109,7 @@ public class DiamondSelectVM : BaseViewModel { // 模拟耗时操作 //System.Threading.Thread.Sleep(50); // 休眠50毫秒 - await Task.Delay(1000); + await Task.Delay(5); // 更新进度条的值(需要在UI线程上执行) loading.Dispatcher.Invoke(() => { @@ -117,8 +117,9 @@ public class DiamondSelectVM : BaseViewModel }); } + GradingResult(null); }); - + await Task.Delay(5); loading.Close(); } } @@ -129,7 +130,8 @@ public class DiamondSelectVM : BaseViewModel /// public void GradingResult(object param) { - BaseControlVM vm = new BaseControlVM(new GradingResultVM(null), MultilingualHelper.getString("GradingResult")); + WindowManager.mainViewModel.Content = WindowManager.PreviousVM(); + BaseControlVM vm = new BaseControlVM(new GradingResultVM(null), MultilingualHelper.getString("DetectionResult")); vm.ShowFunctionButton = System.Windows.Visibility.Hidden; WindowManager.mainViewModel.Content = vm; WindowManager.openContent.Add(vm); diff --git a/ViewModel/Grading/GradingResultVM.cs b/ViewModel/Grading/GradingResultVM.cs index 9140d89..7c4e4a0 100644 --- a/ViewModel/Grading/GradingResultVM.cs +++ b/ViewModel/Grading/GradingResultVM.cs @@ -1,6 +1,7 @@ using System.Data; using System.Windows.Input; using HandyControl.Controls; +using static System.Windows.Forms.VisualStyles.VisualStyleElement.ToolTip; namespace SparkClient.ViewModel.Grading; @@ -8,10 +9,29 @@ public class GradingResultVM : BaseViewModel { private DataTable _dtResults; - + + private DataTable _info; + 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 DataTable DtResults{ get { return _dtResults; } set { _dtResults = value; OnPropertyChanged("DtResults"); } } - + public DataTable DtResults{ get { return _dtResults; } set { _dtResults = value; OnPropertyChanged(nameof(DtResults)); } } + public DataTable Info { get { return _info; } set { _info = value; OnPropertyChanged(nameof(Info)); } } + 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)); } } /// /// 构造 /// @@ -20,9 +40,7 @@ public class GradingResultVM : BaseViewModel { ChangeNormCommand = new RelayCommand(ChangeNorm); _dtResults = new DataTable(); - - - + InitCombobox(); } /// @@ -34,9 +52,35 @@ public class GradingResultVM : BaseViewModel } + 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 + #endregion } \ No newline at end of file diff --git a/Views/Configuration/ConfigMenuPage.xaml b/Views/Configuration/ConfigMenuPage.xaml index 1dbce0e..53e6d86 100644 --- a/Views/Configuration/ConfigMenuPage.xaml +++ b/Views/Configuration/ConfigMenuPage.xaml @@ -45,6 +45,7 @@ + @@ -101,6 +102,23 @@ + diff --git a/Views/Configuration/ConfigMenuPage.xaml.cs b/Views/Configuration/ConfigMenuPage.xaml.cs index 9f9f9ab..3fd5e76 100644 --- a/Views/Configuration/ConfigMenuPage.xaml.cs +++ b/Views/Configuration/ConfigMenuPage.xaml.cs @@ -54,4 +54,18 @@ public partial class ConfigMenuPage imgCut.Source = new BitmapImage(new Uri(@"pack://application:,,,/Resource/Images/Cut_Def@3x.png")); tbCut.Foreground = new SolidColorBrush(Colors.Azure); } + + private void SettingButton_OnMouseEnter(object sender, MouseEventArgs e) + { + var brushConverter = new BrushConverter(); + imgSet.Source = new BitmapImage(new Uri(@"pack://application:,,,/Resource/Images/Setting_Sel@3x.png")); + tbSet.Foreground = (Brush)brushConverter.ConvertFromString("#9C7C5E"); ; + } + + private void SettingButton_OnMouseLeave(object sender, MouseEventArgs e) + { + var brushConverter = new BrushConverter(); + imgSet.Source = new BitmapImage(new Uri(@"pack://application:,,,/Resource/Images/Setting_Def@3x.png")); + tbSet.Foreground = new SolidColorBrush(Colors.Azure); + } } \ No newline at end of file diff --git a/Views/Dialog/StartDialog.xaml b/Views/Dialog/StartDialog.xaml index a7ca79a..c5edef6 100644 --- a/Views/Dialog/StartDialog.xaml +++ b/Views/Dialog/StartDialog.xaml @@ -56,7 +56,7 @@ BorderBrush="Transparent" FontSize="16" FontFamily="AlibabaPuHui-regular" /> - +