From 0a95314fff6f1c6bc7eed40aac8f133e75b832b9 Mon Sep 17 00:00:00 2001 From: sunhonglei Date: Tue, 10 Dec 2024 16:01:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E7=B3=BB=E7=BB=9F=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Model/Entity/AlgorithmConfigEntity.cs | 83 ++++++++ Resource/Images/Setting_Def@3x.png | Bin 0 -> 18148 bytes Resource/Images/Setting_Sel@3x.png | Bin 0 -> 22441 bytes ViewModel/Configuration/SettingsVM.cs | 234 +++++++++++++++++++++++ Views/Configuration/SettingsPage.xaml | 78 ++++++++ Views/Configuration/SettingsPage.xaml.cs | 28 +++ 6 files changed, 423 insertions(+) create mode 100644 Model/Entity/AlgorithmConfigEntity.cs create mode 100644 Resource/Images/Setting_Def@3x.png create mode 100644 Resource/Images/Setting_Sel@3x.png create mode 100644 ViewModel/Configuration/SettingsVM.cs create mode 100644 Views/Configuration/SettingsPage.xaml create mode 100644 Views/Configuration/SettingsPage.xaml.cs diff --git a/Model/Entity/AlgorithmConfigEntity.cs b/Model/Entity/AlgorithmConfigEntity.cs new file mode 100644 index 0000000..1b77cdd --- /dev/null +++ b/Model/Entity/AlgorithmConfigEntity.cs @@ -0,0 +1,83 @@ +using SparkClient.Model.Entity.Base; +using System.Reflection; +using System.Runtime.CompilerServices; + +namespace SparkClient.Model.Entity; + +/// +/// 系统设置实体 +/// + +public class AlgorithmConfigEntity +{ + public static readonly string TableName = "ALGORITHM_CONFIG"; + [DbField("GUID")] + public Guid GUID { get; set; } + /// + /// json内容 + /// + [DbField("JSON")] + public required string Json { get; set; } + /// + /// Json排序 + /// + [DbField("JSON_ORDER")] + public required int JsonOrder { get; set; } + + private static Dictionary GetFieldMappings() + { + var properties = typeof(AlgorithmConfigEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance); + return properties + .Where(p => Attribute.IsDefined(p, typeof(DbFieldAttribute))) + .ToDictionary( + p => p.Name, + p => ((DbFieldAttribute)p.GetCustomAttribute(typeof(DbFieldAttribute))).FieldName + ); + } + + // 生成 Insert 语句 + public string GenerateInsertSQL() + { + var mappings = GetFieldMappings(); + var columns = string.Join(", ", mappings.Values); + var values = string.Join(", ", mappings.Keys.Select(k => $"@{k}")); + return $"INSERT INTO {TableName} ({columns}) VALUES ({values});"; + } + + // 生成 Update 语句 + public string GenerateUpdateSQL(Dictionary fieldsToUpdate = null) + { + if (fieldsToUpdate == null || fieldsToUpdate.Count == 0) + { + // 默认根据 ID 更新所有字段 + var mappings = GetFieldMappings(); + var setClause = string.Join(", ", mappings.Values.Select(f => $"{f} = @{f}")); + return $"UPDATE {TableName} SET {setClause} WHERE GUID = " + GUID.ToString() + ";"; + } + else + { + // 根据传入的字段更新 + var setClause = string.Join(", ", fieldsToUpdate.Keys.Select(f => $"{f} = @{f}")); + return $"UPDATE {TableName} SET {setClause} WHERE GUID = " + GUID.ToString() + ";"; + } + } + + // 生成 Delete 语句 + public string GenerateDeleteSQL(Dictionary conditions = null) + { + if (conditions == null || conditions.Count == 0) + { + // 默认根据 ID 删除 + return $"DELETE FROM {TableName} WHERE GUID =" + GUID.ToString() + ";"; + } + else + { + // 根据传入条件删除 + var whereClause = string.Join(" AND ", conditions.Keys.Select(f => $"{f} = @{f}")); + return $"DELETE FROM {TableName} WHERE {whereClause};"; + } + } + +} + + diff --git a/Resource/Images/Setting_Def@3x.png b/Resource/Images/Setting_Def@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1b2550edf29316f9910197f1e1b4f3c81121d0e1 GIT binary patch literal 18148 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 IIVCg!071QxAOHXW literal 0 HcmV?d00001 diff --git a/Resource/Images/Setting_Sel@3x.png b/Resource/Images/Setting_Sel@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..67e98cb6bbcce4c2526ed5945d1b1b76c16214bc GIT binary patch literal 22441 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 DHnCn& literal 0 HcmV?d00001 diff --git a/ViewModel/Configuration/SettingsVM.cs b/ViewModel/Configuration/SettingsVM.cs new file mode 100644 index 0000000..de8e69a --- /dev/null +++ b/ViewModel/Configuration/SettingsVM.cs @@ -0,0 +1,234 @@ +using HandyControl.Controls; +using Newtonsoft.Json.Linq; +using SparkClient.Model.Entity.Base; +using SparkClient.Model.Helper; +using SparkClient.ViewModel.BaseWindow; +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Windows.Input; + +namespace SparkClient.ViewModel.Configuration +{ + class SettingsVM : BaseViewModel + { + public ICommand SaveUpdateCommand { get; } + public ICommand SelectFileCommand { get; } + + public string _languageId; + public string LanguageId { get { return _languageId; } set { _languageId = value; OnPropertyChanged(nameof(LanguageId)); } } + + public bool _txtFileChecked; + public bool TxtFileChecked { get { return _txtFileChecked; } set { _txtFileChecked = value; OnPropertyChanged(nameof(TxtFileChecked)); } } + + public bool _stlFileChecked; + public bool StlFileChecked { get { return _stlFileChecked; } set { _stlFileChecked = value; OnPropertyChanged(nameof(StlFileChecked)); } } + + public bool _excelFileChecked; + public bool ExcelFileChecked { get { return _excelFileChecked; } set { _excelFileChecked = value; OnPropertyChanged(nameof(ExcelFileChecked)); } } + + public bool _datFileChecked; + public bool DatFileChecked { get { return _datFileChecked; } set { _datFileChecked = value; OnPropertyChanged(nameof(DatFileChecked)); } } + + public string _filePath; + public string FilePath { get { return _filePath; } set { _filePath = value; OnPropertyChanged(nameof(FilePath)); } } + + public string _ruleId; + public string RuleId { get { return _ruleId; } set { _ruleId = value; OnPropertyChanged(nameof(RuleId)); } } + + public DataTable _languages; + public DataTable Languages { get { return _languages; } set { _languages = value; OnPropertyChanged(nameof(Languages)); } } + + public DataTable _rules; + public DataTable Rules { get { return _rules; } set { _rules = value; OnPropertyChanged(nameof(Rules)); } } + public SettingsVM() + { + SaveUpdateCommand = new RelayCommand(SaveUpdate); + SelectFileCommand = new RelayCommand(SelectFile); + InitSetting(); + } + + private void InitSetting() + { + Languages = new DataTable(); + Languages.Columns.Add("Key"); + Languages.Columns.Add("Value"); + Languages.Rows.Add("中文", "zh-cn"); + Languages.Rows.Add("English", "en"); + LanguageId = Settings.SelectValueByName("LanguageId"); + bool.TryParse( Settings.SelectValueByName("TxtFileChecked"), out bool TxtFileChecked); + this.TxtFileChecked = TxtFileChecked; + bool.TryParse(Settings.SelectValueByName("StlFileChecked"), out bool StlFileChecked); + this.StlFileChecked = StlFileChecked; + bool.TryParse(Settings.SelectValueByName("ExcelFileChecked"), out bool ExcelFileChecked); + this.ExcelFileChecked = ExcelFileChecked; + bool.TryParse(Settings.SelectValueByName("DatFileChecked"), out bool DatFileChecked); + this.DatFileChecked = DatFileChecked; + FilePath = Settings.SelectValueByName("FilePath"); + RuleId = Settings.SelectValueByName("RuleId"); + selectRules(); + } + + private void selectRules() + { + Rules = new DataTable(); + Rules.Columns.Add("Key"); + Rules.Columns.Add("Value"); + //string sql = $"SELECT * FROM RULE;"; + //DataTable db = DataBaseHelper.ExecuteQuery(sql); + //foreach (DataRow row in db.Rows) + //{ + // Rules.Rows.Add(row[MultilingualHelper.getString("RULE_NAME")].ToString(), row["RULE_ID"].ToString()); + //} + Rules.Rows.Add("IGI 2023", "IGI2023"); + } + public void SaveUpdate(object param) + { + if (!Directory.Exists(FilePath)) + { + Growl.Error(MultilingualHelper.getString("SavePathIsnotExists")); + return; + } + MultilingualHelper.setLanguage(_languageId); + + updateDataBase(); + + WindowManager.mainViewModel.Content = WindowManager.PreviousVM(); + } + private void updateDataBase() + { + // 语言设置登录 + Settings LanguageData = new Settings() + { + Key = "LanguageId", + ItemName = "语言设置", + Value = LanguageId, + }; + LanguageData.insert(); + // 上传文件登录 + Settings TxtFileCheckedData = new Settings() + { + Key = "TxtFileChecked", + ItemName = "上传文件 TXT文件", + Value = TxtFileChecked.ToString(), + }; + TxtFileCheckedData.insert(); + + Settings StlFileCheckedData = new Settings() + { + Key = "StlFileChecked", + ItemName = "上传文件 STL文件", + Value = StlFileChecked.ToString(), + }; + StlFileCheckedData.insert(); + + Settings ExcelFileCheckedData = new Settings() + { + Key = "ExcelFileChecked", + ItemName = "上传文件 Excel文件", + Value = ExcelFileChecked.ToString(), + }; + ExcelFileCheckedData.insert(); + + Settings DatFileCheckedData = new Settings() + { + Key = "DatFileChecked", + ItemName = "上传文件 Dat文件", + Value = DatFileChecked.ToString(), + }; + DatFileCheckedData.insert(); + // 保存路径登录 + Settings FilePathData = new Settings() + { + Key = "FilePath", + ItemName = "保存路径", + Value = FilePath, + }; + FilePathData.insert(); + // 定级标准登录 + Settings RuleData = new Settings() + { + Key = "RuleId", + ItemName = "定级标准", + Value = RuleId, + }; + RuleData.insert(); + } + public void SelectFile(object param) + { + using (var folderBrowserDlg = new FolderBrowserDialog()) + { + if (string.IsNullOrEmpty(FilePath)) + { + folderBrowserDlg.SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer); + } + else + { + folderBrowserDlg.SelectedPath = FilePath; + } + DialogResult result = folderBrowserDlg.ShowDialog(); + + if (result == DialogResult.OK) + { + FilePath = folderBrowserDlg.SelectedPath; + } + } + } + } + class Settings + { + private static string TABLE_NAME = "SETTING"; + + [DbField("GUID")] + public Guid GUID { get; set; } + /// + /// 项目名称 + /// + [DbField("SETTING_ID")] + public required string Key { get; set; } + /// + /// key + /// + [DbField("SETTING_NAME")] + public required string ItemName{ get; set; } + /// + /// value + /// + [DbField("SETTING_P")] + public required string Value { get; set; } + + public int insert() + { + string sql = $"SELECT * FROM {TABLE_NAME} WHERE SETTING_ID = '{Key}';"; + DataTable db = DataBaseHelper.ExecuteQuery(sql); + if (db.Rows.Count > 0) + { + string updateSql = $"UPDATE {TABLE_NAME} SET SETTING_P = '{this.Value}' WHERE SETTING_ID = '{Key}';"; + return DataBaseHelper.ExecuteNonQuery(updateSql); + } + else + { + string insertSql = $"INSERT INTO {TABLE_NAME} ('GUID','SETTING_ID','SETTING_NAME','SETTING_P') VALUES('{Guid.NewGuid().ToString()}','{Key}','{ItemName}','{Value}');"; + return DataBaseHelper.ExecuteNonQuery(insertSql); + } + } + + public static string SelectValueByName(string Id) + { + string sql = $"SELECT * FROM {TABLE_NAME} WHERE SETTING_ID = '{Id}';"; + DataTable db = DataBaseHelper.ExecuteQuery(sql); + if (db!=null && db.Rows.Count > 0) { + return db.Rows[0]["SETTING_P"].ToString()??""; + } + else + { + return ""; + } + } + } +} diff --git a/Views/Configuration/SettingsPage.xaml b/Views/Configuration/SettingsPage.xaml new file mode 100644 index 0000000..17e31ca --- /dev/null +++ b/Views/Configuration/SettingsPage.xaml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + +