using HandyControl.Controls; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using SharpDX; using SparkClient.Model.Helper; using System; using System.Data; using System.Drawing; using System.IO; using System.Linq.Expressions; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Data; using System.Windows.Input; namespace SparkClient.ViewModel.Configuration; public class LevelConfigVM : BaseViewModel { 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 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"); } } Info info = new Info(); private string Save_successful_message = MultilingualHelper.getString("Save_successful_message"); private string save_fail_message = MultilingualHelper.getString("save_fail_message"); private string no_data_message = MultilingualHelper.getString("no_data_message"); private string grade_config_left_top = MultilingualHelper.getString("grade_config_left_top"); private string GRADE_NAME = MultilingualHelper.getString("GRADE_NAME"); private string STANDARD_NAME = MultilingualHelper.getString("STANDARD_NAME"); public LevelConfigVM(DataGrid dataGrid) { if (dataGrid == null) return; this.dataGrid = dataGrid; ChangeShapeModelCommand = new RelayCommand(ChangeShapeModel); ChangeInstituteModelCommand = new RelayCommand(ChangeInstituteModel); LoadLevelConfigCommand = new RelayCommand(LoadLevelConfig); DelLevelConfigCommand = new RelayCommand(DelLevelConfig); SaveLevelConfigCommand = new RelayCommand(SaveLevelConfig); InitLevelConfig(null); InitData(); } /// /// 加载顶级配置的数据 /// /// public void InitLevelConfig(object param) { Save_successful_message = MultilingualHelper.getString("Save_successful_message"); save_fail_message = MultilingualHelper.getString("save_fail_message"); no_data_message = MultilingualHelper.getString("no_data_message"); grade_config_left_top = MultilingualHelper.getString("grade_config_left_top"); GRADE_NAME = MultilingualHelper.getString("GRADE_NAME"); STANDARD_NAME = MultilingualHelper.getString("STANDARD_NAME"); } private void InitData() { dataGrid.Columns.Clear(); string shapeSql = @"SELECT * FROM SHAPE WHERE PARENT_ID IS NULL OR TRIM(PARENT_ID) = '' ;"; Shapes = DataBaseHelper.ExecuteQuery(shapeSql); if (Shapes != null) { ShapeId = Shapes.AsEnumerable().FirstOrDefault()["SHAPE_ID"].ToString(); } } private string setInstitutes(string id) { string insituteSql = @"SELECT * FROM RULE;"; Institutes = DataBaseHelper.ExecuteQuery(insituteSql); return Institutes.AsEnumerable().FirstOrDefault()["RULE_ID"].ToString(); } private void setDataGrid(string shapeId, string instituteId) { string gradeSql = $"SELECT * FROM GRADE WHERE SHAPE_ID = '{shapeId}' AND RULE_ID = '{instituteId}' ORDER BY GRADE_ORDER;"; DataTable columnInfos = DataBaseHelper.ExecuteQuery(gradeSql); string standardSql = $"SELECT * FROM STANDARD WHERE SHAPE_ID = '{shapeId}' AND RULE_ID = '{instituteId}' ORDER BY SUBSTR(0 || SORT, - 2), GRADE_ORDER;"; DataTable rowInfos = DataBaseHelper.ExecuteQuery(standardSql); setStandardList(columnInfos, rowInfos); } private void setStandardList(DataTable gradeList, DataTable standardList) { Style cellStyle = new Style(typeof(TextBlock)); Setter setSellStyle = new Setter(TextBlock.HorizontalAlignmentProperty, HorizontalAlignment.Center); cellStyle.Setters.Add(setSellStyle); Setter setSellStyle1 = new Setter(TextBlock.VerticalAlignmentProperty, VerticalAlignment.Center); cellStyle.Setters.Add(setSellStyle1); 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())); columns.Add(new DataColumn(columnInfo["GRADE_EN_NAME"].ToString()+"_"+1)); //this.dataGrid.Columns.Add(new DataGridTextColumn() { Header = columnInfo[GRADE_NAME].ToString(), Binding = new Binding(columnInfo["GRADE_EN_NAME"].ToString()),ElementStyle = cellStyle }); this.dataGrid.Columns.Add(GetDataGridColumn(columnInfo[GRADE_NAME].ToString()??"", columnInfo["GRADE_EN_NAME"].ToString() ?? "")); } else { //this.dataGrid.Columns.Insert(0, new DataGridTextColumn() { Header = columnInfo[GRADE_NAME].ToString(), Binding = new Binding(columnInfo["GRADE_EN_NAME"].ToString() + "_MIN"), ElementStyle = cellStyle }); //this.dataGrid.Columns.Add(new DataGridTextColumn() { Header = columnInfo[GRADE_NAME].ToString(), Binding = new Binding(columnInfo["GRADE_EN_NAME"].ToString() + "_MAX"), ElementStyle = cellStyle }); this.dataGrid.Columns.Insert(0, GetDataGridColumn(columnInfo[GRADE_NAME].ToString() ?? "", (columnInfo["GRADE_EN_NAME"].ToString() ?? "") + "_MIN")); this.dataGrid.Columns.Add(GetDataGridColumn(columnInfo[GRADE_NAME].ToString() ?? "", (columnInfo["GRADE_EN_NAME"].ToString() ?? "") + "_MAX")); columns.Insert(0, new DataColumn(columnInfo["GRADE_EN_NAME"].ToString() + "_MIN")); columns.Insert(0, new DataColumn(columnInfo["GRADE_EN_NAME"].ToString() + "_MIN" + "_" + 1)); columns.Add(new DataColumn(columnInfo["GRADE_EN_NAME"].ToString() + "_MAX")); columns.Add(new DataColumn(columnInfo["GRADE_EN_NAME"].ToString() + "_MAX" + "_" + 1)); } } columns.Insert(0, new DataColumn("title")); this.dataGrid.Columns.Insert(0, new DataGridTextColumn() { Header = grade_config_left_top, Binding = new Binding("title"), ElementStyle = cellStyle }); 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) { // 每一行单元格内数据 var row = standard.Where(s => s["GRADE_ORDER"].ToString() == columnInfo["GRADE_ORDER"].ToString()).FirstOrDefault(); string value = ""; if (rowInfo.Count == 0) { value = getFix(row, "MIN_PREFIX") + row["STANDARD_MIN"].ToString() + row["UNIT"].ToString() + "-" + row["STANDARD_MAX"].ToString() + row["UNIT"].ToString() + getFix(row, "MIN_SUFFIX") ; var arr = value.Split("\r\n",2); rowInfo.Add(arr[0]); if (arr.Length > 1) { rowInfo.Add(arr[1]); } else { rowInfo.Add(""); } } else { // 每一行单元格内数据 if (row["STANDARD_MIN"] == null || row["STANDARD_MIN"].ToString() == "") { value = getFix(row, "MIN_PREFIX") + row["MIN_NULL_REPALCE"].ToString() + getFix(row, "MIN_SUFFIX"); var arr = value.Split("\r\n", 2); rowInfo.Insert(0, arr[0]); if (arr.Length > 1) { rowInfo.Insert(0, arr[1]); } else { rowInfo.Insert(0, ""); } } else { value = getFix(row, "MIN_PREFIX") + row["STANDARD_MIN"].ToString() + row["UNIT"].ToString() + getFix(row, "MIN_SUFFIX"); var arr = value.Split("\r\n", 2); rowInfo.Insert(0, arr[0]); if (arr.Length > 1) { rowInfo.Insert(0, arr[1]); } else { rowInfo.Insert(0, ""); } } if (row["STANDARD_MAX"] == null || row["STANDARD_MAX"].ToString() == "") { value = getFix(row, "MAX_PREFIX") + row["MAX_NULL_REPALCE"].ToString() + getFix(row, "MAX_SUFFIX"); var arr = value.Split("\r\n", 2); rowInfo.Add(arr[0]); if (arr.Length > 1) { rowInfo.Add(arr[1]); } else { rowInfo.Add(""); } } else { value = getFix(row, "MAX_PREFIX") + row["STANDARD_MAX"].ToString() + row["UNIT"].ToString() + getFix(row, "MAX_SUFFIX"); var arr = value.Split("\r\n", 2); rowInfo.Add(arr[0]); if (arr.Length > 1) { rowInfo.Add(arr[1]); } else { rowInfo.Add(""); } } } } rowInfo.Insert(0, standard.Key); var showRow = StandardList.NewRow(); showRow.ItemArray = rowInfo.ToArray(); StandardList.Rows.Add(showRow); } } } } private DataGridColumn GetDataGridColumn(string Header,string Binding,int lineCount = 2) { //Style cellStyle = new Style(typeof(TextBlock)); //Setter setSellStyle = new Setter(TextBlock.HorizontalAlignmentProperty, HorizontalAlignment.Center); //cellStyle.Setters.Add(setSellStyle); //Setter setSellStyle1 = new Setter(TextBlock.VerticalAlignmentProperty, VerticalAlignment.Center); //cellStyle.Setters.Add(setSellStyle1); DataGridTemplateColumn column = new DataGridTemplateColumn() { Header = Header}; //column.CellTemplate FrameworkElementFactory stackPanelFactory = new FrameworkElementFactory(typeof(StackPanel)); stackPanelFactory.SetValue(StackPanel.OrientationProperty, Orientation.Vertical); stackPanelFactory.SetValue(StackPanel.VerticalAlignmentProperty, VerticalAlignment.Center); for (int i = 0; i < lineCount; i++) { FrameworkElementFactory TextBlockFactory = new FrameworkElementFactory(typeof(TextBlock)); if (i == 0) { TextBlockFactory.SetBinding(TextBlock.TextProperty, new Binding(Binding)); //TextBlockFactory.SetValue(TextBlock.TextProperty, "123456"); } else { TextBlockFactory.SetBinding(TextBlock.TextProperty, new Binding(Binding + "_" + i)); //TextBlockFactory.SetValue(TextBlock.TextProperty, "1"); TextBlockFactory.SetValue(TextBlock.VisibilityProperty, Visibility.Visible); } TextBlockFactory.SetValue(TextBlock.HorizontalAlignmentProperty, HorizontalAlignment.Center); TextBlockFactory.SetValue(TextBlock.VerticalAlignmentProperty, VerticalAlignment.Center); stackPanelFactory.AppendChild(TextBlockFactory); } var template = new DataTemplate(typeof(DataRow)); template.VisualTree = stackPanelFactory; column.CellTemplate = template; return column; } private string getFix(DataRow row,string fix){ string result = ""; result = row[fix].ToString().Replace("\\n","\r\n"); return result; } /// /// 更新保存响应 /// /// public void SaveLevelConfig(object param) { try { string shapeId = ""; string instituteId = ""; if (info != null) { // 按照形状名查询形状数据,判断是否有该数据 string shapeSql = $"SELECT * FROM SHAPE WHERE SHAPE_NAME = '{info.SHAPE_NAME}';"; DataTable shapes = DataBaseHelper.ExecuteQuery(shapeSql); // 现存db最大形状id取得 string shapeAllSql = $"SELECT * FROM SHAPE;"; DataTable shapeAllInfo = DataBaseHelper.ExecuteQuery(shapeAllSql); DataBaseHelper.BeginTransaction(); // 形状表判断是否有数据 if (shapes == null || shapes.Rows.Count == 0) { var id = shapeAllInfo.AsEnumerable().Max(r => r["SHAPE_ID"]); string maxShapeId = "0"; // 数据登录 if (id != null) { maxShapeId = id.ToString(); } // 数据登录 int.TryParse(maxShapeId, out int result); shapeId = string.Concat(result + 1); string shapeInsertSql = $"INSERT INTO SHAPE (SHAPE_ID,SHAPE_NAME,SHAPE_EN_NAME,GUID)VALUES('{shapeId}','{info.SHAPE_NAME}','{info.SHAPE_EN_NAME}','{Guid.NewGuid().ToString()}');"; DataBaseHelper.ExecuteNonQuery(shapeInsertSql); } else { // 形状id取得 shapeId = shapes.Rows[0]["SHAPE_ID"].ToString(); } // 按照机构名名查询机构数据,判断是否有该数据 string instituteSql = $"SELECT * FROM INSTITUTE WHERE INSTITUTE_NAME = '{info.INSTITUTE_NAME}' AND SHAPE_ID = '{shapeId}';"; DataTable institute = DataBaseHelper.ExecuteQuery(instituteSql); // 现存db最大机构ID取得 string instituteAllSql = $"SELECT * FROM INSTITUTE WHERE SHAPE_ID = '{shapeId}';"; DataTable instituteAllInfo = DataBaseHelper.ExecuteQuery(instituteAllSql); // 机构表判断是否有数据 if (institute == null || institute.Rows.Count == 0) { var id = instituteAllInfo.AsEnumerable().Max(r => r["INSTITUTE_ID"]); string maxInstituteId = "0"; // 数据登录 if (id != null) { maxInstituteId = id.ToString(); } int.TryParse(maxInstituteId, out int result); instituteId = string.Concat(result + 1); string shapeInsertSql = $"INSERT INTO INSTITUTE (INSTITUTE_ID,SHAPE_ID,INSTITUTE_NAME,INSTITUTE_EN_NAME,GUID)VALUES('{instituteId}','{shapeId}','{info.INSTITUTE_NAME}','{info.INSTITUTE_EN_NAME}','{Guid.NewGuid().ToString()}');"; DataBaseHelper.ExecuteNonQuery(shapeInsertSql); } else { // 机构ID取得 instituteId = _instituteId; } // 定级数据登录 string gradeInsSql = ""; foreach (var gradeInfo in info.gradeInfos) { if (gradeInsSql.Length == 0) { gradeInsSql += gradeInfo.getDeleteSql(shapeId, instituteId); } gradeInsSql += gradeInfo.getInsertSql(shapeId, instituteId); } int count = DataBaseHelper.ExecuteNonQuery(gradeInsSql); if (count<0) { DataBaseHelper.rollback(); Growl.Error(save_fail_message); } // 标准数据登录 string standardSql = ""; foreach (var standardInfo in info.standardInfos) { if (standardSql.Length == 0) { standardSql += standardInfo.getDeleteSql(shapeId, instituteId); } standardSql += standardInfo.getInsertSql(shapeId, instituteId); } count = DataBaseHelper.ExecuteNonQuery(standardSql); if (count < 0) { DataBaseHelper.rollback(); Growl.Error(save_fail_message); } DataBaseHelper.commit(); Growl.Info(Save_successful_message); } else { Growl.Info(no_data_message); } } catch (Exception ex) { DataBaseHelper.rollback(); Console.WriteLine(ex.Message); Growl.Error(save_fail_message); } } /// /// 删除配置响应 /// /// public void DelLevelConfig(object param) { } /// /// 导入配置响应 /// /// public void LoadLevelConfig(object param) { InstitutesEnabled = false; ShapesEnabled = false; 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 ChangeInstituteModel(object param) { if (InstituteId != null && InstituteId != string.Empty) { dataGrid.Columns.Clear(); setDataGrid(ShapeId, InstituteId); } } /// /// 切换形状响应 /// /// public void ChangeShapeModel(object param) { if (ShapeId!= null && ShapeId != string.Empty) { 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; } public string getInsertSql(string shapeId,string instituteId) { string insertSql = "INSERT INTO GRADE("; insertSql = insertSql + "SHAPE_ID" + ",INSTITUTE_ID" + ",GRADE_ID" + ",GRADE_NAME" + ",GRADE_EN_NAME" + ",GRADE_EN_S_NAME" + ",GRADE_ORDER" + ",GUID"; insertSql = insertSql + ")VALUES("; insertSql = insertSql + $"'{shapeId}'" + $",'{instituteId}'" + $",'{GRADE_ID}'" + $",'{GRADE_NAME}'" + $",'{GRADE_EN_NAME}'" + $",'{GRADE_EN_S_NAME}'" + $",'{GRADE_ORDER}'" + $",'{Guid.NewGuid().ToString()}'"; insertSql = insertSql + ");"; return insertSql; } public string getDeleteSql(string shapeId, string instituteId) { string deleteSql = $"DELETE FROM GRADE WHERE SHAPE_ID='{shapeId}' AND INSTITUTE_ID='{instituteId}';"; return deleteSql; } } 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 decimal? STANDARD_MIN { get; set; } public decimal? 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; } public string getInsertSql(string shapeId, string instituteId) { string insertSql = "INSERT INTO STANDARD("; insertSql = insertSql + "STANDARD_ID " + ",SHAPE_ID " + ",GRADE_ID " + ",INSTITUTE_ID " + ",STANDARD_NAME " + ",STANDARD_EN_NAME " + ",STANDARD_MIN " + ",STANDARD_MAX " + ",IS_MIN_EXIST " + ",IS_MAX_EXIST " + ",SORT " + ",UNIT " + ",MAX_NULL_REPALCE " + ",MIN_PREFIX " + ",MIN_SUFFIX " + ",MAX_PREFIX " + ",MAX_SUFFIX " + ",MIN_NULL_REPALCE " + ",GUID " ; insertSql = insertSql + ")VALUES("; insertSql = insertSql + $"'{STANDARD_ID}'" + $",'{shapeId}'" + $",'{GRADE_ID}'" + $",'{instituteId}'" + $",'{STANDARD_NAME}'" + $",'{STANDARD_EN_NAME}'" + $",{(STANDARD_MIN != null ? STANDARD_MIN.ToString() : "null")}" + $",{(STANDARD_MAX != null ? STANDARD_MAX.ToString() : "null")}" + $",'{IS_MIN_EXIST}'" + $",'{IS_MAX_EXIST}'" + $",'{SORT}'" + $",'{UNIT}'" + $",'{MAX_NULL_REPALCE}'" + $",'{MIN_PREFIX}'" + $",'{MIN_SUFFIX}'" + $",'{MAX_PREFIX}'" + $",'{MAX_SUFFIX}'" + $",'{MIN_NULL_REPALCE}'" + $",'{Guid.NewGuid().ToString()}'"; insertSql = insertSql + ");"; return insertSql; } public string getDeleteSql(string shapeId, string instituteId) { string deleteSql = $"DELETE FROM STANDARD WHERE SHAPE_ID='{shapeId}' AND INSTITUTE_ID='{instituteId}';"; return deleteSql; } } }