feat:算法配置 切工仪配置

master
sunhonglei 8 months ago
parent 822c256035
commit c74a65372b
  1. 2
      MainWindow.xaml.cs
  2. 87
      Model/Entity/CutterConfigEntity.cs
  3. 83
      Model/Entity/MethodConfigEntity.cs
  4. 106
      Model/Helper/DataBaseHelper.cs
  5. BIN
      Resource/Images/ze-add-o 1@3x.png
  6. 73
      ViewModel/Configuration/AlgorithmConfigVM.cs
  7. 2
      ViewModel/Configuration/ConfigMenuPageVM.cs
  8. 114
      ViewModel/Configuration/CutConfigVM.cs
  9. 89
      Views/Configuration/CutConfigPage.xaml
  10. 4
      Views/Configuration/CutConfigPage.xaml.cs

@ -41,6 +41,7 @@ public partial class MainWindow
{
//初始化
// ConfigHelper.Instance.SetLang("en");
DataBaseHelper.CreateConnection();
}
#region 重写窗体操作按钮
@ -83,6 +84,7 @@ public partial class MainWindow
if (result == MessageBoxResult.Yes)
{
DataBaseHelper.CloseConnection();
this.Close();
}
}

@ -0,0 +1,87 @@
using SparkClient.Model.Entity.Base;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace SparkClient.Model.Entity;
/// <summary>
/// 系统设置实体
/// </summary>
public class CutterConfigEntity : BaseEntity
{
public static readonly new string TableName = "CUTTER_CONFIG";
[DbField("GUID")]
public Guid GUID { get; set; }
/// <summary>
/// 项目名称
/// </summary>
[DbField("ITEM_NAME")]
public string ItemName { get; set; }
/// <summary>
/// key
/// </summary>
[DbField("KEY")]
public string Key { get; set; }
/// <summary>
/// value
/// </summary>
[DbField("VALUE")]
public string Value { get; set; }
private static Dictionary<string, string> GetFieldMappings()
{
var properties = typeof(CutterConfigEntity).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<string, object> 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;";
}
else
{
// 根据传入的字段更新
var setClause = string.Join(", ", fieldsToUpdate.Keys.Select(f => $"{f} = @{f}"));
return $"UPDATE {TableName} SET {setClause} WHERE GUID = @GUID;";
}
}
// 生成 Delete 语句
public string GenerateDeleteSQL(Dictionary<string, object> 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};";
}
}
}

@ -0,0 +1,83 @@
using SparkClient.Model.Entity.Base;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace SparkClient.Model.Entity;
/// <summary>
/// 系统设置实体
/// </summary>
public class MethodConfigEntity : BaseEntity
{
public static readonly new string TableName = "METHOD_CONFIG";
[DbField("GUID")]
public Guid GUID { get; set; }
/// <summary>
/// json内容
/// </summary>
[DbField("JSON")]
public string Json { get; set; }
/// <summary>
/// Json排序
/// </summary>
[DbField("JSON_ORDER")]
public int JsonOrder { get; set; }
private static Dictionary<string, string> GetFieldMappings()
{
var properties = typeof(MethodConfigEntity).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<string, object> 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<string, object> 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};";
}
}
}

@ -1,4 +1,5 @@
using System.IO;
using System.Data;
using System.IO;
using Microsoft.Data.Sqlite;
namespace SparkClient.Model.Helper;
@ -32,4 +33,107 @@ public class DataBaseHelper
connection.Close();
}
static readonly string password = Common.DatabasePwd;
static readonly string dbPath = Common.DataBaseFileName;
static SqliteConnection connection;
static SqliteTransaction sqliteTransaction;
public static void CreateConnection()
{
connection = new SqliteConnection(new SqliteConnectionStringBuilder("data source=" + DataBaseHelper.dbPath)
{
Mode = SqliteOpenMode.ReadWriteCreate,
Password = password
}.ToString());
if (connection.State != ConnectionState.Open) {
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = "PRAGMA key = '" + password + "';";
command.CommandText += "PRAGMA case_sensitive_like = 1;";
command.ExecuteNonQuery();
}
}
}
public static void CloseConnection()
{
connection.Close();
}
public static void BeginTransaction()
{
if (connection != null)
{
sqliteTransaction = connection.BeginTransaction();
}
}
public static void commit()
{
if (sqliteTransaction != null)
{
sqliteTransaction.Commit();
sqliteTransaction.Dispose();
sqliteTransaction = null;
}
}
public static void rollback()
{
if (sqliteTransaction != null)
{
sqliteTransaction.Rollback();
sqliteTransaction.Dispose();
sqliteTransaction = null;
}
}
public static int ExecuteNonQuery(string sql, SqliteParameter[] sqlParameters = null)
{
int resultCount = -1;
try
{
SqliteCommand cmd = new SqliteCommand();
cmd.Connection = connection;
cmd.CommandText = sql;
cmd.Transaction = sqliteTransaction;
if (sqlParameters != null)
{
cmd.Parameters.AddRange(sqlParameters);
}
resultCount = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return resultCount;
}
//查询全部
public static DataTable ExecuteQuery(String sql, SqliteParameter[] sqlParameters = null)
{
DataTable table = new DataTable();
try
{
SqliteCommand cmd = new SqliteCommand();
cmd.Connection = connection;
cmd.CommandText = sql;
if (sqlParameters != null)
{
cmd.Parameters.AddRange(sqlParameters);
}
SqliteDataReader reader = cmd.ExecuteReader();
cmd.Parameters.Clear();
table.Load(reader);
return table;
}
catch (Exception ex)
{
System.Windows.MessageBox.Show("检索失败");
Console.WriteLine(ex.ToString());
}
return null;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

@ -1,7 +1,12 @@
using System.Windows.Input;
using System.Data;
using System.Text;
using System.Windows.Input;
using HandyControl.Controls;
using Microsoft.Data.Sqlite;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SparkClient.Model.Entity;
using SparkClient.Model.Helper;
namespace SparkClient.ViewModel.Configuration;
@ -28,8 +33,22 @@ public class AlgorithmConfigVM : BaseViewModel
/// <param name="param"></param>
public void InitAlgorithmData(object param)
{
AlgorithmConfigJson = "{}";
}
AlgorithmConfigJson = "{}";
string sql = @"SELECT JSON as json FROM METHOD_CONFIG ORDER BY JSON_ORDER";
DataTable dataTable = DataBaseHelper.ExecuteQuery(sql);
StringBuilder sb = new StringBuilder();
if (dataTable != null)
{
foreach (DataRow row in dataTable.Rows)
{
sb.Append(row["json"].ToString());
}
}
if(sb.Length>0)
{
AlgorithmConfigJson = JToken.Parse(sb.ToString()).ToString();
}
}
/// <summary>
@ -38,11 +57,55 @@ public class AlgorithmConfigVM : BaseViewModel
/// <param name="param"></param>
public void SaveAlgorithmData(object param)
{
Growl.Info("Saving Algorithm Data");
DataBaseHelper.BeginTransaction();
string temp = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(AlgorithmConfigJson));
string deleteSql = @"DELETE FROM METHOD_CONFIG";
DataBaseHelper.ExecuteNonQuery(deleteSql);
int order = 0;
int insertCount = 0;
while (temp.Length>2000)
{
MethodConfigEntity entity = new MethodConfigEntity();
entity.GUID = Guid.NewGuid();
entity.JsonOrder = order++;
entity.Json = temp.Substring(0,2000);
temp = temp.Substring(2000);
string sql = entity.GenerateInsertSQL();
SqliteParameter[] sqliteParameters = {
new SqliteParameter("@Json", entity.Json),
new SqliteParameter("@JsonOrder", entity.JsonOrder),
new SqliteParameter("@GUID", entity.GUID),
};
insertCount += DataBaseHelper.ExecuteNonQuery(sql, sqliteParameters);
}
if (temp.Length>0)
{
MethodConfigEntity entity = new MethodConfigEntity();
entity.GUID = Guid.NewGuid();
entity.JsonOrder = order++;
entity.Json = temp;
string sql = entity.GenerateInsertSQL();
SqliteParameter[] sqliteParameters = {
new SqliteParameter("@Json", entity.Json),
new SqliteParameter("@JsonOrder", entity.JsonOrder),
new SqliteParameter("@GUID", entity.GUID.ToString()),
};
insertCount += DataBaseHelper.ExecuteNonQuery(sql, sqliteParameters);
}
if (insertCount >= 0)
{
Growl.Info("保存成功");
DataBaseHelper.commit();
}
else
{
Growl.Error("保存失败");
DataBaseHelper.rollback();
}
}
/// <summary>
/// 梅花JSON
/// 美化JSON
/// </summary>
/// <param name="param"></param>
public void BeautifyJson(object param)

@ -43,6 +43,7 @@ public class ConfigMenuPageVM : BaseViewModel
public void AlgorithmConfig(object parameter)
{
BaseControlVM vm = new BaseControlVM(new AlgorithmConfigVM(), MultilingualHelper.getString("AlgorithmConfig"));
vm.ShowFunctionButton = System.Windows.Visibility.Hidden;
WindowManager.mainViewModel.Content = vm;
WindowManager.openContent.Add(vm);
}
@ -53,6 +54,7 @@ public class ConfigMenuPageVM : BaseViewModel
public void CutConfig(object parameter)
{
BaseControlVM vm = new BaseControlVM(new CutConfigVM(), MultilingualHelper.getString("CutConfig"));
vm.ShowFunctionButton = System.Windows.Visibility.Hidden;
WindowManager.mainViewModel.Content = vm;
WindowManager.openContent.Add(vm);
}

@ -1,14 +1,37 @@
namespace SparkClient.ViewModel.Configuration;
using HandyControl.Controls;
using System.Data;
using System.Windows.Controls;
using System.Windows.Input;
using SparkClient.Model.Entity;
using SparkClient.Model.Helper;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ToolTip;
using System.Text.RegularExpressions;
using Microsoft.Data.Sqlite;
namespace SparkClient.ViewModel.Configuration;
public class CutConfigVM: BaseViewModel
{
public ICommand AddRowsCommand { get; }
public ICommand SaveCutConfigDataCommand { get; }
public ICommand DelCutRowCommand { get; }
public DataTable _cutterInfos;
public DataTable CutterInfos { get { return _cutterInfos; } set { _cutterInfos = value; OnPropertyChanged("CutterInfos"); } }
private int RowNo = 0;
public CutConfigVM()
{
AddRowsCommand = new RelayCommand(AddRows);
SaveCutConfigDataCommand = new RelayCommand(SaveCutConfigData);
DelCutRowCommand = new RelayCommand(DelCutRow);
// 初始化VIEW层参数
// 初始化VIEW层Command
this.InitCutConfigData(null);
}
/// <summary>
/// 初始化切工仪数据
@ -16,6 +39,16 @@ public class CutConfigVM: BaseViewModel
/// <param name="param"></param>
public void InitCutConfigData(object param)
{
string sql = @"SELECT ITEM_NAME as ItemName , KEY AS Key, VALUE AS Value, GUID FROM CUTTER_CONFIG";
DataTable dataTable = DataBaseHelper.ExecuteQuery(sql);
if (dataTable!=null) {
dataTable.Columns.Add(new DataColumn("RowNo", typeof(int)));
foreach (DataRow row in dataTable.Rows)
{
row["RowNo"] = RowNo++;
}
CutterInfos = dataTable;
}
}
/// <summary>
@ -24,7 +57,10 @@ public class CutConfigVM: BaseViewModel
/// <param name="row">行数</param>
public void AddRows(object row)
{
for (int i = 0;i<5;i++)
{
CutterInfos.Rows.Add("", "", "",Guid.NewGuid(), RowNo++);
}
}
/// <summary>
@ -33,7 +69,74 @@ public class CutConfigVM: BaseViewModel
/// <param name="param"></param>
public void SaveCutConfigData(object param)
{
int count = CutterInfos.AsEnumerable().Where(r => r["Key"].ToString() != "").GroupBy(r => new { key = r.Field<string>("Key") }).Count();
if (count < CutterInfos.AsEnumerable().Where(r => r["Key"].ToString() != "").Count())
{
Growl.Error("Key有重复数据");
return;
}
string sql = @"SELECT ITEM_NAME as ItemName , KEY AS Key, VALUE AS Value, GUID FROM CUTTER_CONFIG";
DataTable dataTable = DataBaseHelper.ExecuteQuery(sql);
int insertCount = 0;
foreach (DataRow row in CutterInfos.Rows)
{
if (row["Key"] == "")
{
continue;
}
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());
sql = entity.GenerateUpdateSQL();
SqliteParameter[] sqliteParameters = {
new SqliteParameter("@ITEM_NAME", row["ItemName"].ToString()),
new SqliteParameter("@KEY", row["Key"].ToString()),
new SqliteParameter("@VALUE", row["Value"].ToString()),
new SqliteParameter("@GUID", row["GUID"].ToString()),
};
insertCount += DataBaseHelper.ExecuteNonQuery(sql, sqliteParameters);
dataTable.Rows.Remove(removerow);
}
else
{
CutterConfigEntity entity = new CutterConfigEntity();
entity.ItemName = row["ItemName"].ToString();
entity.Key = row["Key"].ToString();
entity.Value = row["Value"].ToString();
sql = entity.GenerateInsertSQL();
SqliteParameter[] sqliteParameters = {
new SqliteParameter("@ItemName", row["ItemName"].ToString()),
new SqliteParameter("@Key", row["Key"].ToString()),
new SqliteParameter("@Value", row["Value"].ToString()),
new SqliteParameter("@GUID", row["GUID"].ToString()),
};
insertCount += DataBaseHelper.ExecuteNonQuery(sql, sqliteParameters);
}
}
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;
sql = entity.GenerateDeleteSQL();
insertCount += DataBaseHelper.ExecuteNonQuery(sql);
}
if (insertCount>=0)
{
Growl.Info("保存成功");
}
else
{
Growl.Error("保存失败");
}
}
/// <summary>
@ -42,6 +145,7 @@ public class CutConfigVM: BaseViewModel
/// <param name="row">行</param>
public void DelCutRow(object row)
{
DataRowView a = row as DataRowView;
CutterInfos.Rows.Remove(a.Row);
}
}

@ -1,12 +1,81 @@
<Border x:Class="SparkClient.Views.Configuration.CutConfigPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:SparkClient.Views"
mc:Ignorable="d"
>
<Grid Background="Blue">
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="80">切工仪配置</TextBlock>
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:SparkClient.Views"
mc:Ignorable="d">
<Grid Background="#BBBBBB">
<Grid.RowDefinitions>
<!-- 第一排 -->
<RowDefinition Height="51" />
<!-- 第二排 -->
<RowDefinition Height="5*" />
<RowDefinition Height="50" />
</Grid.RowDefinitions>
<Button Grid.Row="0" Height="40" HorizontalAlignment="Right" Background="Transparent" BorderBrush="Transparent"
Command="{Binding AddRowsCommand}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="添加 5 行" FontSize="14" FontFamily="PingFangSC-regular" TextAlignment="Left"
VerticalAlignment="Center" Width="70" />
<Image Grid.Column="1" Source="pack://application:,,,/Resource/Images/ze-add-o 1@3x.png" Width="24" Height="24"/>
</Grid>
</Button>
<DataGrid Grid.Row="1" ItemsSource="{Binding CutterInfos}" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Background" Value="#efefefef" />
<Setter Property="FontSize" Value="14px" />
<Setter Property="Height" Value="39" />
<Setter Property="HorizontalAlignment" Value="Center" />
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Style>
<Style TargetType="DataGrid">
<Setter Property="HorizontalGridLinesBrush">
<Setter.Value>
<SolidColorBrush Color="#03ffea"/>
</Setter.Value>
</Setter>
<Setter Property="VerticalGridLinesBrush">
<Setter.Value>
<SolidColorBrush Color="#03ffea"/>
</Setter.Value>
</Setter>
</Style>
</DataGrid.Style>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Height" Value="39" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="FontSize" Value="14px" />
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="项目名称" Width="355"
Binding="{Binding ItemName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
/>
<DataGridTextColumn Header="Key" Width="355"
Binding="{Binding Key, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<DataGridTextColumn Header="Value" Width="355"
Binding="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<DataGridTemplateColumn Header="操作" Width="136">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="删除" Command="{Binding DataContext.DelCutRowCommand,RelativeSource={RelativeSource AncestorType=DataGrid}}" CommandParameter="{Binding}"></Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="RowNo" Width="0" Visibility="Hidden"
Binding="{Binding RowNo}" />
<DataGridTextColumn Header="RowNo" Width="0" Visibility="Hidden"
Binding="{Binding GUID}" />
</DataGrid.Columns>
</DataGrid>
<Button Grid.Row="2" Content="保存更新" Command="{Binding SaveCutConfigDataCommand}"/>
</Grid>
</Border>
</Border>

@ -1,4 +1,5 @@
using System.Windows.Controls;
using SparkClient.ViewModel.Configuration;
using System.Windows.Controls;
namespace SparkClient.Views.Configuration;
@ -7,5 +8,6 @@ public partial class CutConfigPage
public CutConfigPage()
{
InitializeComponent();
DataContext = new CutConfigVM();
}
}
Loading…
Cancel
Save