diff --git a/Model/Helper/AESHelper.cs b/Model/Helper/AESHelper.cs index a09092e..8b1adc0 100644 --- a/Model/Helper/AESHelper.cs +++ b/Model/Helper/AESHelper.cs @@ -113,4 +113,24 @@ 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()); + } + } + } + return sb.ToString(); + } } \ No newline at end of file diff --git a/SparkDB.db b/SparkDB.db index 6cd0537..b04de82 100644 Binary files a/SparkDB.db and b/SparkDB.db differ diff --git a/ViewModel/Configuration/ConfigMenuPageVM.cs b/ViewModel/Configuration/ConfigMenuPageVM.cs index f0ea75f..bcc0b9f 100644 --- a/ViewModel/Configuration/ConfigMenuPageVM.cs +++ b/ViewModel/Configuration/ConfigMenuPageVM.cs @@ -32,7 +32,8 @@ public class ConfigMenuPageVM : BaseViewModel /// public void LevelConfig(object parameter) { - BaseControlVM vm = new BaseControlVM(new LevelConfigVM(), MultilingualHelper.getString("LevelConfig")); + BaseControlVM vm = new BaseControlVM(new LevelConfigVM(null), MultilingualHelper.getString("LevelConfig")); + vm.ShowFunctionButton = System.Windows.Visibility.Hidden; WindowManager.mainViewModel.Content = vm; WindowManager.openContent.Add(vm); } diff --git a/ViewModel/Configuration/LevelConfigVM.cs b/ViewModel/Configuration/LevelConfigVM.cs index 27a0810..5ec3eb3 100644 --- a/ViewModel/Configuration/LevelConfigVM.cs +++ b/ViewModel/Configuration/LevelConfigVM.cs @@ -1,13 +1,56 @@ -namespace SparkClient.ViewModel.Configuration; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using SparkClient.Model.Helper; +using System.Data; +using System.IO; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Input; -public class LevelConfigVM: BaseViewModel +namespace SparkClient.ViewModel.Configuration; + +public class LevelConfigVM : BaseViewModel { - - public List _levels; - public List Levels { get { return _levels; } set { _levels = value; OnPropertyChanged("Levels"); } } - public LevelConfigVM() + public ICommand ChangeShapeModelCommand { get; } + public ICommand ChangeInstituteModelCommand { get; } + public ICommand LoadLevelConfigCommand { get; } + public ICommand DelLevelConfigCommand { get; } + public ICommand SaveLevelConfigCommand { get; } + + private DataTable _institutes; + public DataTable Institutes { get { return _institutes; } set { _institutes = value; OnPropertyChanged("Institutes"); } } + private DataTable _shapes; + public DataTable Shapes { get { return _shapes; } set { _shapes = value; OnPropertyChanged("Shapes"); } } + + private string _instituteId; + public string InstituteId { get { return _instituteId; } set { _instituteId = value; OnPropertyChanged("InstituteId"); } } + + private string _shapeId; + public string ShapeId { get { return _shapeId; } set { _shapeId = value; OnPropertyChanged("ShapeId"); } } + + private DataTable _standardList; + public DataTable StandardList { get { return _standardList; } set { _standardList = value; OnPropertyChanged("StandardList"); } } + DataGrid dataGrid; + private string GRADE_NAME = string.Empty; + + private string STANDARD_NAME = string.Empty; + + private bool _institutesEnabled = true; + public bool InstitutesEnabled { get { return _institutesEnabled; } set { _institutesEnabled = value; OnPropertyChanged("InstitutesEnabled"); } } + private bool _shapesEnabled = true; + public bool ShapesEnabled { get { return _shapesEnabled; } set { _shapesEnabled = value; OnPropertyChanged("ShapesEnabled"); } } + public LevelConfigVM(DataGrid dataGrid) { - _levels = new List(){"12314", "3455623", "4567894"}; + if (dataGrid == null) return; + this.dataGrid = dataGrid; + GRADE_NAME = "GRADE_NAME"; + STANDARD_NAME = "STANDARD_NAME"; + ChangeShapeModelCommand = new RelayCommand(ChangeShapeModel); + ChangeInstituteModelCommand = new RelayCommand(ChangeInstituteModel); + LoadLevelConfigCommand = new RelayCommand(LoadLevelConfig); + DelLevelConfigCommand = new RelayCommand(DelLevelConfig); + SaveLevelConfigCommand = new RelayCommand(SaveLevelConfig); + InitLevelConfig(null); } /// @@ -16,9 +59,112 @@ public class LevelConfigVM: BaseViewModel /// public void InitLevelConfig(object param) { - + dataGrid.Columns.Clear(); + string shapeSql = @"SELECT * FROM SHAPE;"; + _shapes = DataBaseHelper.ExecuteQuery(shapeSql); + if (_shapes!= null) { + _shapeId = _shapes.AsEnumerable().FirstOrDefault()["SHAPE_ID"].ToString(); + _instituteId = setInstitutes(_shapeId); + setDataGrid(_shapeId, _instituteId); + } + } + private string setInstitutes(string id) + { + string insituteSql = @"SELECT * FROM INSTITUTE WHERE SHAPE_ID = " + id+";"; + _institutes = DataBaseHelper.ExecuteQuery(insituteSql); + return _institutes.AsEnumerable().FirstOrDefault()["INSTITUTE_ID"].ToString(); } + private void setDataGrid(string shapeId, string instituteId) + { + string gradeSql = $"SELECT * FROM GRADE WHERE SHAPE_ID = '{shapeId}' AND INSTITUTE_ID = '{instituteId}' ORDER BY GRADE_ORDER;"; + DataTable columnInfos = DataBaseHelper.ExecuteQuery(gradeSql); + + string standardSql = $"SELECT * FROM STANDARD WHERE SHAPE_ID = '{shapeId}' AND INSTITUTE_ID = '{instituteId}' ORDER BY SORT, GRADE_ID;"; + DataTable rowInfos = DataBaseHelper.ExecuteQuery(standardSql); + setStandardList(columnInfos, rowInfos); + } + + private void setStandardList(DataTable gradeList, DataTable standardList) + { + dataGrid.Columns.Clear(); + if (gradeList != null) + { + StandardList = new DataTable(); + + List columns = new List(); + foreach (DataRow columnInfo in gradeList.Rows) + { + if (columns.Count == 0) + { + columns.Add(new DataColumn(columnInfo["GRADE_EN_NAME"].ToString())); + this.dataGrid.Columns.Add(new DataGridTextColumn() { Header = columnInfo[GRADE_NAME].ToString(), Binding = new Binding(columnInfo["GRADE_EN_NAME"].ToString()) }); + } + else + { + columns.Insert(0, new DataColumn(columnInfo["GRADE_EN_NAME"].ToString() + "_MIN")); + this.dataGrid.Columns.Insert(0, new DataGridTextColumn() { Header = columnInfo[GRADE_NAME].ToString(), Binding = new Binding(columnInfo["GRADE_EN_NAME"].ToString() + "_MIN") }); + columns.Add(new DataColumn(columnInfo["GRADE_EN_NAME"].ToString() + "_MAX")); + this.dataGrid.Columns.Add(new DataGridTextColumn() { Header = columnInfo[GRADE_NAME].ToString(), Binding = new Binding(columnInfo["GRADE_EN_NAME"].ToString() + "_MAX") }); + } + } + columns.Insert(0, new DataColumn("title")); + this.dataGrid.Columns.Insert(0, new DataGridTextColumn() { Header = "参数 \\ 切工等级", Binding = new Binding("title") }); + StandardList.Columns.AddRange(columns.ToArray()); + // 以标准名分组表示每一行 + if (standardList != null) + { + var standards = standardList.AsEnumerable().GroupBy(r => r[STANDARD_NAME].ToString()); + foreach (var standard in standards) + { + List rowInfo = new List(); + foreach (DataRow columnInfo in gradeList.Rows) + { + if (rowInfo.Count == 0) + { + // 每一行单元格内数据 + var row = standard.Where(s => s["GRADE_ID"].ToString() == columnInfo["GRADE_ID"].ToString()).FirstOrDefault(); + rowInfo.Add( + row["MIN_PREFIX"].ToString() + + row["STANDARD_MIN"].ToString() + row["UNIT"].ToString() + "-" + + row["STANDARD_MAX"].ToString() + row["UNIT"].ToString() + + row["MIN_SUFFIX"].ToString() + ); + } + else + { + // 每一行单元格内数据 + var row = standard.Where(s => s["GRADE_ID"].ToString() == columnInfo["GRADE_ID"].ToString()).FirstOrDefault(); + if (row["STANDARD_MIN"] == null || row["STANDARD_MIN"].ToString() == "") + { + rowInfo.Insert(0, row["MIN_PREFIX"].ToString() + row["MIN_NULL_REPALCE"].ToString() + row["MIN_SUFFIX"].ToString()); + } + else + { + rowInfo.Insert(0, row["MIN_PREFIX"].ToString() + row["STANDARD_MIN"].ToString() + row["UNIT"].ToString() + row["MIN_SUFFIX"].ToString()); + } + if (row["STANDARD_MAX"] == null || row["STANDARD_MAX"].ToString() == "") + { + rowInfo.Add(row["MAX_PREFIX"].ToString() + + row["MAX_NULL_REPALCE"].ToString() + + row["MAX_SUFFIX"].ToString()); + } + else + { + rowInfo.Add(row["MAX_PREFIX"].ToString() + + row["STANDARD_MAX"].ToString() + row["UNIT"].ToString() + + row["MAX_SUFFIX"].ToString()); + } + } + } + rowInfo.Insert(0, standard.Key); + var showRow = StandardList.NewRow(); + showRow.ItemArray = rowInfo.ToArray(); + StandardList.Rows.Add(showRow); + } + } + } + } /// /// 更新保存响应 /// @@ -33,6 +179,7 @@ public class LevelConfigVM: BaseViewModel /// public void DelLevelConfig(object param) { + } /// @@ -41,14 +188,130 @@ public class LevelConfigVM: BaseViewModel /// public void LoadLevelConfig(object param) { - + InstitutesEnabled = false; + ShapesEnabled = false; + Info info = null; + Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog(); + openFileDialog.Filter = "Text files (*.enc)|*.enc|All files (*.*)|*.*"; + if (openFileDialog.ShowDialog() == true) + { + string filename = openFileDialog.FileName; + string content = ""; + if (File.Exists(filename)) + { + content = AESHelper.DecryptFile(filename, "000000"); + info = JsonConvert.DeserializeObject(content); + } + + } + if (info != null) + { + // 形状列表重新生成 + string shapeSql = $"SELECT * FROM SHAPE WHERE SHAPE_NAME = '{info.SHAPE_NAME}';"; + DataTable shapes = DataBaseHelper.ExecuteQuery(shapeSql); + if (shapes == null || shapes.Rows.Count == 0) + { + shapes = new DataTable(); + shapes.Columns.Add("SHAPE_NAME"); + shapes.Columns.Add("SHAPE_EN_NAME"); + shapes.Columns.Add("SHAPE_ID"); + shapes.Rows.Add(info.SHAPE_NAME, info.SHAPE_EN_NAME, ""); + Shapes = shapes; + ShapeId = ""; + } + else + { + ShapeId = shapes.AsEnumerable().FirstOrDefault()["SHAPE_ID"].ToString(); + } + + // 机构列表重新生成 + string instituteSql = $"SELECT * FROM INSTITUTE WHERE INSTITUTE_NAME = '{info.INSTITUTE_NAME}';"; + DataTable institute = DataBaseHelper.ExecuteQuery(instituteSql); + if (institute == null || institute.Rows.Count == 0) + { + institute = new DataTable(); + institute.Columns.Add("INSTITUTE_NAME"); + institute.Columns.Add("INSTITUTE_EN_NAME"); + institute.Columns.Add("INSTITUTE_ID"); + institute.Rows.Add(info.INSTITUTE_NAME, info.INSTITUTE_EN_NAME, ""); + Institutes = institute; + InstituteId = ""; + } + else + { + InstituteId = institute.AsEnumerable().FirstOrDefault()["INSTITUTE_ID"].ToString(); + } + // 表格内容重新生成 + string gradeInfosJson = JsonConvert.SerializeObject(info.gradeInfos); + DataTable gradeInfos = Common.JsonToDataTable(gradeInfosJson); + string standardInfosJson = JsonConvert.SerializeObject(info.standardInfos); + DataTable standardInfos = Common.JsonToDataTable(standardInfosJson); + + setStandardList(gradeInfos, standardInfos); + + + } } /// - /// 切换定级响应 + /// 切换规则响应 /// /// - public void ChangeLevelModel(object param) + public void ChangeInstituteModel(object param) + { + dataGrid.Columns.Clear(); + setDataGrid(ShapeId, InstituteId); + } + + /// + /// 切换形状响应 + /// + /// + public void ChangeShapeModel(object param) + { + setInstitutes(ShapeId); + } + + class Info + { + public string SHAPE_NAME { get; set; } + + public string SHAPE_EN_NAME { get; set; } + + public string INSTITUTE_NAME { get; set; } + + public string INSTITUTE_EN_NAME { get; set; } + + public List gradeInfos { get; set; } + + public List standardInfos { get; set; } + } + class GradeInfo + { + public int GRADE_ID { get; set; } + public string GRADE_NAME { get; set; } + public string GRADE_EN_NAME { get; set; } + public string GRADE_EN_S_NAME { get; set; } + public int GRADE_ORDER { get; set; } + } + + class StandardInfo { + public int GRADE_ID { get; set; } + public int STANDARD_ID { get; set; } + public string STANDARD_NAME { get; set; } + public string STANDARD_EN_NAME { get; set; } + public string STANDARD_MIN { get; set; } + public string STANDARD_MAX { get; set; } + public string IS_MIN_EXIST { get; set; } = "0"; + public string IS_MAX_EXIST { get; set; } = "0"; + public string UNIT { get; set; } + public string MIN_PREFIX { get; set; } + public string MIN_SUFFIX { get; set; } + public string MAX_PREFIX { get; set; } + public string MAX_SUFFIX { get; set; } + public string MIN_NULL_REPALCE { get; set; } = "←"; + public string MAX_NULL_REPALCE { get; set; } = "→"; + public int SORT { get; set; } } } \ No newline at end of file diff --git a/Views/Configuration/LevelConfigPage.xaml b/Views/Configuration/LevelConfigPage.xaml index e7b942b..41b6649 100644 --- a/Views/Configuration/LevelConfigPage.xaml +++ b/Views/Configuration/LevelConfigPage.xaml @@ -5,30 +5,41 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:SparkClient.Views" xmlns:hc="https://handyorg.github.io/handycontrol" - mc:Ignorable="d" > + mc:Ignorable="d"> - + - - - - - + + + + + + - -