diff --git a/Seyounth.Hyosung.Data/Entities/VarietyEntity.cs b/Seyounth.Hyosung.Data/Entities/VarietyEntity.cs
index eb09ce4..d968df5 100644
--- a/Seyounth.Hyosung.Data/Entities/VarietyEntity.cs
+++ b/Seyounth.Hyosung.Data/Entities/VarietyEntity.cs
@@ -6,7 +6,7 @@ namespace Seyounth.Hyosung.Data.Entities;
[SugarTable("system_variety", TableDescription = "品种表")]
public class VarietyEntity
{
- [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
+ [SugarColumn(IsPrimaryKey = true, ColumnDescription = "主键")]
public int Id { get; set; }
[SugarColumn(ColumnDescription = "品种代码")]
@@ -51,13 +51,13 @@ public class VarietyEntity
[SugarColumn(ColumnDescription = "托盘ID")]
public int TrayId { get; set; }
- [SugarColumn(ColumnDescription = "垛头尺寸")]
+ [SugarColumn(ColumnDescription = "垛头尺寸", IsNullable = true)]
public string? StackHeadSpec { get; set; }
[SugarColumn(ColumnDescription = "垛头数量")]
public int? StackHeadCount { get; set; }
- [SugarColumn(ColumnDescription = "纸托Id",IsNullable =true)]
+ [SugarColumn(ColumnDescription = "纸托Id", IsNullable = true)]
public int? PaperTrayId { get; set; }
[SugarColumn(ColumnDescription = "是否需要纸箱")]
@@ -84,13 +84,9 @@ public class VarietyEntity
[SugarColumn(ColumnDescription = "副标签数量")]
public int SubLabelCount { get; set; }
- [SugarColumn(IsNullable =true)]
- public int? LastNo { get; set; }
-
- [SugarColumn(IsNullable =true)]
- public double? NetWeight { get; set; }
-
- [SugarColumn(IsNullable =true)]
- public double? GrossWeight { get; set; }
-
+ [SugarColumn(IsNullable = true)] public int? LastNo { get; set; }
+
+ [SugarColumn(IsNullable = true)] public double? NetWeight { get; set; }
+
+ [SugarColumn(IsNullable = true)] public double? GrossWeight { get; set; }
}
\ No newline at end of file
diff --git a/Seyounth.Hyosung.Data/Models/Pallet.cs b/Seyounth.Hyosung.Data/Models/Pallet.cs
index e061fdc..44400c6 100644
--- a/Seyounth.Hyosung.Data/Models/Pallet.cs
+++ b/Seyounth.Hyosung.Data/Models/Pallet.cs
@@ -5,8 +5,24 @@ namespace Seyounth.Hyosung.Data.Models;
public class Pallet : PalletEntity
{
- public string Name =>
- $"{Type.GetDescription()}({Width}*{Height}*{Length})({HoleCount}|{(IsBigHole != null && IsBigHole.Value ? "大" : "小")})";
+ public string Name
+ {
+ get
+ {
+ if (Type == PalletType.Honey)
+ {
+ return
+ $"{Type.GetDescription()}({Width}*{Length}*{Height})({HoleCount}|{(IsBigHole != null && IsBigHole.Value ? "大" : "小")})";
+ }
+ else if (Length != 0)
+ {
+ return $"{Type.GetDescription()}({Width}*{Length}*{Height})";
+ }
+ else return "无";
+ }
+
+ }
+
public static Pallet FromEntity(PalletEntity p)
{
diff --git a/Seyounth.Hyosung.Data/Models/PalletType.cs b/Seyounth.Hyosung.Data/Models/PalletType.cs
index e257c11..b4a4db7 100644
--- a/Seyounth.Hyosung.Data/Models/PalletType.cs
+++ b/Seyounth.Hyosung.Data/Models/PalletType.cs
@@ -12,7 +12,7 @@ public enum PalletType
///
/// 胶合板托盘
///
- [Description("胶合板")] Plywood = 1,
+ [Description("胶托")] Plywood = 1,
///
/// 木板托盘
diff --git a/Seyounth.Hyosung.Data/ServiceExtensions.cs b/Seyounth.Hyosung.Data/ServiceExtensions.cs
index 439ce32..6f10bb9 100644
--- a/Seyounth.Hyosung.Data/ServiceExtensions.cs
+++ b/Seyounth.Hyosung.Data/ServiceExtensions.cs
@@ -18,21 +18,21 @@ public static class ServiceExtensions
{
//#if RELEASE
SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig()
- {
- DbType = DbType.SqlServer,
- ConnectionString = connectionString,
- IsAutoCloseConnection = true,
- }
+ {
+ DbType = DbType.SqlServer,
+ ConnectionString = connectionString,
+ IsAutoCloseConnection = true,
+ }
);
//#elif DEBUG
- //SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig()
- // {
- // DbType = DbType.Sqlite,
- // ConnectionString = "Data Source=hyosung.db",
- // IsAutoCloseConnection = true,
- // InitKeyType = InitKeyType.Attribute
- // }
- //);
+ // SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig()
+ // {
+ // DbType = DbType.Sqlite,
+ // ConnectionString = "Data Source=hyosung.db",
+ // IsAutoCloseConnection = true,
+ // InitKeyType = InitKeyType.Attribute
+ // }
+ // );
//#endif
return sqlSugar;
});
@@ -50,13 +50,13 @@ public static class ServiceExtensions
public static void UseHyosungData(this IServiceProvider provider)
{
- //var db = provider.GetRequiredService();
- //db.DbMaintenance.CreateDatabase();
- //db.CodeFirst.InitTables(typeof(VarietyEntity),
- // typeof(PalletEntity),
- // typeof(ScannedYarnEntity),
- // typeof(TrayEntity),
- // typeof(AgvBinEntity),
- // typeof(DictEntity));
+ var db = provider.GetRequiredService();
+ db.DbMaintenance.CreateDatabase();
+ db.CodeFirst.InitTables(typeof(VarietyEntity),
+ typeof(PalletEntity),
+ typeof(ScannedYarnEntity),
+ typeof(TrayEntity),
+ typeof(AgvBinEntity),
+ typeof(DictEntity));
}
}
\ No newline at end of file
diff --git a/Seyounth.Hyosung.Data/Services/VarietyService.cs b/Seyounth.Hyosung.Data/Services/VarietyService.cs
index 78a42a6..902a27f 100644
--- a/Seyounth.Hyosung.Data/Services/VarietyService.cs
+++ b/Seyounth.Hyosung.Data/Services/VarietyService.cs
@@ -19,10 +19,10 @@ public class VarietyService : IVarietyService
{
_varietyRepository =
provider.CreateScope().ServiceProvider.GetRequiredService>();
- _palletRepository = provider.CreateScope().ServiceProvider.GetRequiredService>();
+ _palletRepository = provider.CreateScope().ServiceProvider.GetRequiredService>();
//_varietyRepository = provider.GetService>();
- // _palletRepository = provider.GetService>();
- _varietiesCache = new List(_varietyRepository.GetList());
+ // _palletRepository = provider.GetService>();
+ _varietiesCache = new List(_varietyRepository.GetList());
_palletsCache = new List(_palletRepository.GetList());
}
catch (Exception e)
@@ -49,14 +49,23 @@ public class VarietyService : IVarietyService
{
try
{
- var entity = await _varietyRepository.InsertReturnEntityAsync(variety.ToEntity());
- _varietiesCache.Add(entity);
+ var entity = _varietiesCache.FirstOrDefault(p => p.Id == variety.Id);
+ if (entity == null)
+ {
+ entity = await _varietyRepository.InsertReturnEntityAsync(variety.ToEntity());
+ _varietiesCache.Add(entity);
+ }
+ else
+ {
+ entity = variety.ToEntity();
+ await _varietyRepository.UpdateAsync(entity);
+ _varietiesCache[_varietiesCache.IndexOf(entity)] = entity;
+ }
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
-
}
public async Task UpdateVarietyAsync(Variety variety)
@@ -89,15 +98,20 @@ public class VarietyService : IVarietyService
public async Task GetLastNo(int varietyId)
{
- var variety = await (_varietyRepository.CopyNew().GetFirstAsync(x=>x.Id==varietyId));
+ var variety = await (_varietyRepository.CopyNew().GetFirstAsync(x => x.Id == varietyId));
return variety.LastNo;
}
- public async Task SetLastNo(int varietyId,int lastNo)
+ public async Task SetLastNo(int varietyId, int lastNo)
{
await _varietyRepository.CopyNew().AsUpdateable()
.Where(x => x.Id == varietyId)
- .SetColumns(x => x.LastNo , lastNo)
+ .SetColumns(x => x.LastNo, lastNo)
.ExecuteCommandAsync();
+ var variety = _varietiesCache.FirstOrDefault(x => x.Id == varietyId);
+ if (variety != null)
+ {
+ variety.LastNo = lastNo;
+ }
}
}
\ No newline at end of file
diff --git a/Seyounth.Hyosung.UI/App.xaml b/Seyounth.Hyosung.UI/App.xaml
new file mode 100644
index 0000000..12af9cf
--- /dev/null
+++ b/Seyounth.Hyosung.UI/App.xaml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Seyounth.Hyosung.UI/App.xaml.cs b/Seyounth.Hyosung.UI/App.xaml.cs
new file mode 100644
index 0000000..3459174
--- /dev/null
+++ b/Seyounth.Hyosung.UI/App.xaml.cs
@@ -0,0 +1,105 @@
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Seyounth.Hyosung.UI.Services;
+using Seyounth.Hyosung.UI.ViewModels.Pages;
+using Seyounth.Hyosung.UI.ViewModels.Windows;
+using Seyounth.Hyosung.UI.Views.Pages;
+using Seyounth.Hyosung.UI.Views.Windows;
+using System.IO;
+using System.Reflection;
+using System.Windows.Threading;
+using Microsoft.Extensions.Logging;
+using NLog.Extensions.Logging;
+using Seyounth.Hyosung.Core.Printer;
+using Seyounth.Hyosung.Runtime;
+using Wpf.Ui;
+
+namespace Seyounth.Hyosung.UI
+{
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App
+ {
+ private static IHost _host;
+
+ public App()
+ {
+ var builder = Host
+ .CreateApplicationBuilder();
+ builder.Logging.ClearProviders();
+ builder.Logging.SetMinimumLevel(LogLevel.Trace);
+ builder.Logging.AddNLog("nlog.config");
+ builder.Configuration.AddJsonFile("PrintTemp.json", true, true);
+ builder.Configuration.AddJsonFile("appsettings.json", true, true);
+ builder.Services.Configure(builder.Configuration.GetSection("Print"));
+ builder.Services.AddHostedService();
+
+ // Page resolver service
+ builder.Services.AddSingleton();
+ builder.Services.AddSingleton();
+ // Theme manipulation
+ builder.Services.AddSingleton();
+
+ // TaskBar manipulation
+ builder.Services.AddSingleton();
+
+ // Service containing navigation, same as INavigationWindow... but without window
+ builder.Services.AddSingleton();
+
+ // Main window with navigation
+ builder.Services.AddSingleton();
+ builder.Services.AddSingleton();
+
+ builder.Services.AddSingleton();
+ builder.Services.AddSingleton();
+ builder.Services.AddSingleton();
+ builder.Services.AddSingleton();
+ builder.Services.AddSingleton();
+ builder.Services.AddSingleton();
+ builder.Services.AddSingleton();
+ builder.Services.AddSingleton();
+ builder.Services.AddHyosung(builder.Configuration);
+ _host = builder.Build();
+ }
+
+ ///
+ /// Gets registered service.
+ ///
+ /// Type of the service to get.
+ /// Instance of the service or .
+ public static T GetService()
+ where T : class
+ {
+ return _host.Services.GetService(typeof(T)) as T;
+ }
+
+ ///
+ /// Occurs when the application is loading.
+ ///
+ private void OnStartup(object sender, StartupEventArgs e)
+ {
+ _host.Services.UseHyosung();
+ _host.Start();
+ }
+
+ ///
+ /// Occurs when the application is closing.
+ ///
+ private async void OnExit(object sender, ExitEventArgs e)
+ {
+ await _host.StopAsync();
+
+ _host.Dispose();
+ }
+
+ ///
+ /// Occurs when an exception is thrown by an application but not handled.
+ ///
+ private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
+ {
+ // For more info see https://docs.microsoft.com/en-us/dotnet/api/system.windows.application.dispatcherunhandledexception?view=windowsdesktop-6.0
+ }
+ }
+}
\ No newline at end of file
diff --git a/Seyounth.Hyosung.UI/AssemblyInfo.cs b/Seyounth.Hyosung.UI/AssemblyInfo.cs
new file mode 100644
index 0000000..7ad982e
--- /dev/null
+++ b/Seyounth.Hyosung.UI/AssemblyInfo.cs
@@ -0,0 +1,10 @@
+using System.Windows;
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+//(used if a resource is not found in the page,
+// app, or any theme specific resource dictionaries)
+)]
diff --git a/Seyounth.Hyosung.UI/Assets/wpfui-icon-1024.png b/Seyounth.Hyosung.UI/Assets/wpfui-icon-1024.png
new file mode 100644
index 0000000..b70c4ed
Binary files /dev/null and b/Seyounth.Hyosung.UI/Assets/wpfui-icon-1024.png differ
diff --git a/Seyounth.Hyosung.UI/Assets/wpfui-icon-256.png b/Seyounth.Hyosung.UI/Assets/wpfui-icon-256.png
new file mode 100644
index 0000000..6b5cf5d
Binary files /dev/null and b/Seyounth.Hyosung.UI/Assets/wpfui-icon-256.png differ
diff --git a/Seyounth.Hyosung.UI/Helpers/EnumBindingSourceExtension.cs b/Seyounth.Hyosung.UI/Helpers/EnumBindingSourceExtension.cs
new file mode 100644
index 0000000..36ae896
--- /dev/null
+++ b/Seyounth.Hyosung.UI/Helpers/EnumBindingSourceExtension.cs
@@ -0,0 +1,21 @@
+using System.Windows.Markup;
+
+namespace Seyounth.Hyosung.UI.Helpers;
+
+public class EnumBindingSourceExtension : MarkupExtension
+{
+ public Type EnumType { get; private set; }
+
+ public EnumBindingSourceExtension(Type enumType)
+ {
+ if (enumType is null || !enumType.IsEnum)
+ throw new Exception("EnumType must be specified and be an Enum");
+
+ EnumType = enumType;
+ }
+
+ public override object? ProvideValue(IServiceProvider serviceProvider)
+ {
+ return Enum.GetValues(EnumType);
+ }
+}
\ No newline at end of file
diff --git a/Seyounth.Hyosung.UI/Helpers/EnumDescriptionConverter.cs b/Seyounth.Hyosung.UI/Helpers/EnumDescriptionConverter.cs
new file mode 100644
index 0000000..0f0bf57
--- /dev/null
+++ b/Seyounth.Hyosung.UI/Helpers/EnumDescriptionConverter.cs
@@ -0,0 +1,23 @@
+using System.ComponentModel;
+using System.Globalization;
+using System.Reflection;
+using System.Windows.Data;
+
+namespace Seyounth.Hyosung.UI.Helpers;
+
+public class EnumDescriptionConverter : IValueConverter
+{
+ public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ if (value == null) return string.Empty;
+
+ var field = value.GetType().GetField(value.ToString());
+ var attr = field?.GetCustomAttribute();
+ return attr?.Description ?? value.ToString();
+ }
+
+ public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/Seyounth.Hyosung.UI/Helpers/EnumToBooleanConverter.cs b/Seyounth.Hyosung.UI/Helpers/EnumToBooleanConverter.cs
new file mode 100644
index 0000000..698b3c1
--- /dev/null
+++ b/Seyounth.Hyosung.UI/Helpers/EnumToBooleanConverter.cs
@@ -0,0 +1,36 @@
+using System.Globalization;
+using System.Windows.Data;
+using Wpf.Ui.Appearance;
+
+namespace Seyounth.Hyosung.UI.Helpers
+{
+ internal class EnumToBooleanConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (parameter is not String enumString)
+ {
+ throw new ArgumentException("ExceptionEnumToBooleanConverterParameterMustBeAnEnumName");
+ }
+
+ if (!Enum.IsDefined(typeof(ApplicationTheme), value))
+ {
+ throw new ArgumentException("ExceptionEnumToBooleanConverterValueMustBeAnEnum");
+ }
+
+ var enumValue = Enum.Parse(typeof(ApplicationTheme), enumString);
+
+ return enumValue.Equals(value);
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (parameter is not String enumString)
+ {
+ throw new ArgumentException("ExceptionEnumToBooleanConverterParameterMustBeAnEnumName");
+ }
+
+ return Enum.Parse(typeof(ApplicationTheme), enumString);
+ }
+ }
+}
diff --git a/Seyounth.Hyosung.UI/Models/AppConfig.cs b/Seyounth.Hyosung.UI/Models/AppConfig.cs
new file mode 100644
index 0000000..741ba78
--- /dev/null
+++ b/Seyounth.Hyosung.UI/Models/AppConfig.cs
@@ -0,0 +1,9 @@
+namespace Seyounth.Hyosung.UI.Models
+{
+ public class AppConfig
+ {
+ public string ConfigurationsFolder { get; set; }
+
+ public string AppPropertiesFileName { get; set; }
+ }
+}
diff --git a/Seyounth.Hyosung.UI/Models/DataColor.cs b/Seyounth.Hyosung.UI/Models/DataColor.cs
new file mode 100644
index 0000000..f1c3f68
--- /dev/null
+++ b/Seyounth.Hyosung.UI/Models/DataColor.cs
@@ -0,0 +1,9 @@
+using System.Windows.Media;
+
+namespace Seyounth.Hyosung.UI.Models
+{
+ public struct DataColor
+ {
+ public Brush Color { get; set; }
+ }
+}
diff --git a/Seyounth.Hyosung.UI/Resources/Translations.cs b/Seyounth.Hyosung.UI/Resources/Translations.cs
new file mode 100644
index 0000000..d1e09b5
--- /dev/null
+++ b/Seyounth.Hyosung.UI/Resources/Translations.cs
@@ -0,0 +1,6 @@
+namespace Seyounth.Hyosung.UI.Resources
+{
+ public partial class Translations
+ {
+ }
+}
diff --git a/Seyounth.Hyosung.UI/Services/ApplicationHostService.cs b/Seyounth.Hyosung.UI/Services/ApplicationHostService.cs
new file mode 100644
index 0000000..a7d467e
--- /dev/null
+++ b/Seyounth.Hyosung.UI/Services/ApplicationHostService.cs
@@ -0,0 +1,59 @@
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Seyounth.Hyosung.UI.Views.Pages;
+using Seyounth.Hyosung.UI.Views.Windows;
+using Wpf.Ui;
+
+namespace Seyounth.Hyosung.UI.Services
+{
+ ///
+ /// Managed host of the application.
+ ///
+ public class ApplicationHostService : IHostedService
+ {
+ private readonly IServiceProvider _serviceProvider;
+
+ private INavigationWindow _navigationWindow;
+
+ public ApplicationHostService(IServiceProvider serviceProvider)
+ {
+ _serviceProvider = serviceProvider;
+ }
+
+ ///
+ /// Triggered when the application host is ready to start the service.
+ ///
+ /// Indicates that the start process has been aborted.
+ public async Task StartAsync(CancellationToken cancellationToken)
+ {
+ await HandleActivationAsync();
+ }
+
+ ///
+ /// Triggered when the application host is performing a graceful shutdown.
+ ///
+ /// Indicates that the shutdown process should no longer be graceful.
+ public async Task StopAsync(CancellationToken cancellationToken)
+ {
+ await Task.CompletedTask;
+ }
+
+ ///
+ /// Creates main window during activation.
+ ///
+ private async Task HandleActivationAsync()
+ {
+ if (!Application.Current.Windows.OfType().Any())
+ {
+ _navigationWindow = (
+ _serviceProvider.GetService(typeof(INavigationWindow)) as INavigationWindow
+ )!;
+ _navigationWindow!.ShowWindow();
+
+ _navigationWindow.Navigate(typeof(Views.Pages.DashboardPage));
+ }
+
+ await Task.CompletedTask;
+ }
+ }
+}
diff --git a/Seyounth.Hyosung.UI/Services/PageService.cs b/Seyounth.Hyosung.UI/Services/PageService.cs
new file mode 100644
index 0000000..9d69896
--- /dev/null
+++ b/Seyounth.Hyosung.UI/Services/PageService.cs
@@ -0,0 +1,42 @@
+using Wpf.Ui;
+
+namespace Seyounth.Hyosung.UI.Services
+{
+ ///
+ /// Service that provides pages for navigation.
+ ///
+ public class PageService : IPageService
+ {
+ ///
+ /// Service which provides the instances of pages.
+ ///
+ private readonly IServiceProvider _serviceProvider;
+
+ ///
+ /// Creates new instance and attaches the .
+ ///
+ public PageService(IServiceProvider serviceProvider)
+ {
+ _serviceProvider = serviceProvider;
+ }
+
+ ///
+ public T? GetPage()
+ where T : class
+ {
+ if (!typeof(FrameworkElement).IsAssignableFrom(typeof(T)))
+ throw new InvalidOperationException("The page should be a WPF control.");
+
+ return (T?)_serviceProvider.GetService(typeof(T));
+ }
+
+ ///
+ public FrameworkElement? GetPage(Type pageType)
+ {
+ if (!typeof(FrameworkElement).IsAssignableFrom(pageType))
+ throw new InvalidOperationException("The page should be a WPF control.");
+
+ return _serviceProvider.GetService(pageType) as FrameworkElement;
+ }
+ }
+}
diff --git a/Seyounth.Hyosung.UI/Seyounth.Hyosung.UI.csproj b/Seyounth.Hyosung.UI/Seyounth.Hyosung.UI.csproj
new file mode 100644
index 0000000..1ad74d9
--- /dev/null
+++ b/Seyounth.Hyosung.UI/Seyounth.Hyosung.UI.csproj
@@ -0,0 +1,38 @@
+
+
+
+ WinExe
+ net8.0-windows
+ app.manifest
+ wpfui-icon.ico
+ true
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Seyounth.Hyosung.UI/Usings.cs b/Seyounth.Hyosung.UI/Usings.cs
new file mode 100644
index 0000000..5efad98
--- /dev/null
+++ b/Seyounth.Hyosung.UI/Usings.cs
@@ -0,0 +1,4 @@
+global using CommunityToolkit.Mvvm.ComponentModel;
+global using CommunityToolkit.Mvvm.Input;
+global using System;
+global using System.Windows;
diff --git a/Seyounth.Hyosung.UI/ViewModels/Pages/DashboardViewModel.cs b/Seyounth.Hyosung.UI/ViewModels/Pages/DashboardViewModel.cs
new file mode 100644
index 0000000..2981d40
--- /dev/null
+++ b/Seyounth.Hyosung.UI/ViewModels/Pages/DashboardViewModel.cs
@@ -0,0 +1,100 @@
+using System.Collections.ObjectModel;
+using Seyounth.Hyosung.Data.Models;
+using Seyounth.Hyosung.Data.Services;
+using Seyounth.Hyosung.Runtime;
+using Wpf.Ui;
+using Wpf.Ui.Controls;
+
+namespace Seyounth.Hyosung.UI.ViewModels.Pages
+{
+ public partial class DashboardViewModel : ObservableObject, INavigationAware
+ {
+ [ObservableProperty] private ObservableCollection _varieties;
+
+ [ObservableProperty] private Variety _selectedVariety;
+
+ [ObservableProperty] private List _yarnCarTypes;
+
+ [ObservableProperty] private List _yarnCarSideType;
+
+ [ObservableProperty] private int _selectedYarnCarTypeIndex;
+
+ [ObservableProperty] private int _selectedYarnCarSideTypeIndex;
+
+ private readonly IVarietyService _varietyService;
+
+ private readonly IPalletService _palletService;
+
+ private readonly ISnackbarService _snackbarService;
+
+ private readonly IHyosungRuntime _runtime;
+
+ public DashboardViewModel(IVarietyService varietyService, ISnackbarService snackbarService,
+ IHyosungRuntime runtime)
+ {
+ _runtime = runtime;
+ SelectedYarnCarTypeIndex = 0;
+ SelectedYarnCarSideTypeIndex = 0;
+ _varietyService = varietyService;
+ _snackbarService = snackbarService;
+ Varieties = new ObservableCollection(varietyService.GetAll());
+
+ YarnCarTypes =
+ [
+ "A",
+ "B",
+ "C",
+ "D"
+ ];
+
+ YarnCarSideType =
+ [
+ "正面",
+ "反面"
+ ];
+ }
+
+ public void OnNavigatedTo()
+ {
+ Varieties = new ObservableCollection(_varietyService.GetAll());
+ }
+
+ public void OnNavigatedFrom()
+ {
+ }
+
+ [RelayCommand]
+ private void OnChangeVariety()
+ {
+ try
+ {
+ SelectedVariety.YarnCarType = SelectedYarnCarTypeIndex + 1;
+ SelectedVariety.YarnCarSide = SelectedYarnCarSideTypeIndex + 1;
+ _runtime.SendVarietyToPlcAsync(SelectedVariety);
+ _snackbarService.Show("切换成功", $"当前产品为: {SelectedVariety.Name}", ControlAppearance.Success,
+ new SymbolIcon(SymbolRegular.ArrowCircleUp24), TimeSpan.FromSeconds(5));
+ }
+ catch (Exception e)
+ {
+ _snackbarService.Show("切换异常", e.Message, ControlAppearance.Danger,
+ new SymbolIcon(SymbolRegular.ArrowCircleUp24), TimeSpan.FromSeconds(5));
+ }
+ }
+
+ [RelayCommand]
+ private void OnChangeVarietyLastNo()
+ {
+ if (SelectedVariety.LastNo != null)
+ {
+ _varietyService.SetLastNo(SelectedVariety.Id, SelectedVariety.LastNo.Value);
+ _snackbarService.Show("保存成功", "当前控制号保存成功", ControlAppearance.Success,
+ new SymbolIcon(SymbolRegular.Save24), TimeSpan.FromSeconds(5));
+ }
+ else
+ {
+ _snackbarService.Show("保存失败", "当前控制号为空", ControlAppearance.Danger,
+ new SymbolIcon(SymbolRegular.Save24), TimeSpan.FromSeconds(5));
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Seyounth.Hyosung.UI/ViewModels/Pages/DataViewModel.cs b/Seyounth.Hyosung.UI/ViewModels/Pages/DataViewModel.cs
new file mode 100644
index 0000000..3a2b4a8
--- /dev/null
+++ b/Seyounth.Hyosung.UI/ViewModels/Pages/DataViewModel.cs
@@ -0,0 +1,100 @@
+using System.Collections.ObjectModel;
+using Seyounth.Hyosung.UI.Models;
+using System.Windows.Media;
+using CommunityToolkit.Mvvm.Messaging;
+using Seyounth.Hyosung.Data.Models;
+using Seyounth.Hyosung.Data.Services;
+using Wpf.Ui.Controls;
+
+namespace Seyounth.Hyosung.UI.ViewModels.Pages
+{
+ public partial class DataViewModel : ObservableObject, INavigationAware
+ {
+ public class SavePalletCompletedMessage;
+
+ [ObservableProperty] private ObservableCollection _varieties;
+
+ [ObservableProperty] private ObservableCollection _pallets;
+
+ [ObservableProperty] private ObservableCollection _honeyPallets = new();
+
+ [ObservableProperty] private ObservableCollection _paperPallets = new();
+
+ [ObservableProperty] private ObservableCollection _trays = new();
+
+ private readonly IVarietyService _varietyService;
+ private readonly IPalletService _palletService;
+
+ public DataViewModel(IVarietyService varietyService, IPalletService palletService)
+ {
+ _varietyService = varietyService;
+ _palletService = palletService;
+ }
+
+ public void OnNavigatedTo()
+ {
+ Pallets = new ObservableCollection(_palletService.GetPallets());
+ HoneyPallets = new ObservableCollection(Pallets.Where(p => p.Type == PalletType.Honey));
+ var papers = Pallets.Where(p => p.Type == PalletType.Paper).ToList();
+ papers.Add(new Pallet());
+ papers = papers.OrderBy(p => p.Length).ToList();
+ PaperPallets = new ObservableCollection(papers);
+ Trays = new ObservableCollection(Pallets.Where(p =>
+ p.Type is PalletType.Plywood or PalletType.Wood));
+ var varieties = _varietyService.GetAll().Select(v =>
+ {
+ // 匹配相同ID的托盘对象
+ v.TopAndBottomPallet = HoneyPallets.FirstOrDefault(p => p.Id == v.TopAndBottomPallet.Id);
+ v.MiddlePallet = HoneyPallets.FirstOrDefault(p => p.Id == v.MiddlePallet.Id);
+ v.Tray = Trays.FirstOrDefault(p => p.Id == v.Tray.Id);
+ v.PaperTray = v.PaperTray is null
+ ? PaperPallets.First()
+ : PaperPallets.FirstOrDefault(p =>
+ p.Id == v.PaperTray.Id);
+ return v;
+ });
+
+ Varieties = new ObservableCollection(varieties);
+ }
+
+ public void OnNavigatedFrom()
+ {
+ }
+
+ [RelayCommand]
+ private void AddVariety()
+ {
+ var variety = new Variety
+ {
+ /* 初始化默认值 */
+ };
+ Varieties.Add(variety);
+ }
+
+ [RelayCommand]
+ private void OnDeleteVariety(object obj)
+ {
+ if (obj is Variety variety)
+ {
+ Varieties.Remove(variety);
+ _varietyService.DeleteVarietyAsync(variety);
+ }
+ else
+ {
+ Console.Write("Object is not a variety");
+ }
+ }
+
+ [RelayCommand]
+ private async Task OnSaveVariety(object obj)
+ {
+ if (obj is Variety variety)
+ {
+ await _varietyService.AddVarietyAsync(variety);
+ //Pallets = new ObservableCollection(_palletService.GetPallets());
+ }
+
+ WeakReferenceMessenger.Default.Send(new SavePalletCompletedMessage());
+ }
+ }
+}
\ No newline at end of file
diff --git a/Seyounth.Hyosung.UI/ViewModels/Pages/PalletManagementViewModel.cs b/Seyounth.Hyosung.UI/ViewModels/Pages/PalletManagementViewModel.cs
new file mode 100644
index 0000000..55a4012
--- /dev/null
+++ b/Seyounth.Hyosung.UI/ViewModels/Pages/PalletManagementViewModel.cs
@@ -0,0 +1,72 @@
+using System.Collections.ObjectModel;
+using CommunityToolkit.Mvvm.Messaging;
+using Seyounth.Hyosung.Data.Models;
+using Seyounth.Hyosung.Data.Services;
+using Wpf.Ui.Controls;
+
+namespace Seyounth.Hyosung.UI.ViewModels.Pages;
+
+public partial class PalletManagementViewModel : ObservableObject, INavigationAware
+{
+ public class SavePalletCompletedMessage;
+
+ [ObservableProperty] private ObservableCollection _pallets = [];
+ private readonly IPalletService _palletService;
+
+ ///
+ public PalletManagementViewModel(IPalletService palletService)
+ {
+ _palletService = palletService;
+ Pallets = new ObservableCollection(_palletService.GetPallets());
+ }
+
+ public void OnNavigatedTo()
+ {
+ Pallets = new ObservableCollection(_palletService.GetPallets());
+ }
+
+ public void OnNavigatedFrom()
+ {
+ }
+
+ [RelayCommand]
+ private void AddPallet()
+ {
+ var newPallet = new Pallet
+ {
+ /* 初始化默认值 */
+ };
+ Pallets.Add(newPallet);
+ }
+
+ [RelayCommand]
+ private void OnDeletePallet(object obj)
+ {
+ if (obj is Pallet pallet)
+ {
+ Pallets.Remove(pallet);
+ _palletService.DeletePalletAsync(pallet);
+ }
+ else
+ {
+ Console.Write("Object is not a Pallet");
+ }
+ }
+
+ [RelayCommand]
+ private void OnSavePallet(object obj)
+ {
+ if (obj is Pallet pallet)
+ {
+ if (pallet.Id == 0)
+ {
+ var id = _palletService.AddPalletAsync(pallet).Result;
+ //Pallets = new ObservableCollection(_palletService.GetPallets());
+ }
+ else
+ _palletService.UpdatePalletAsync(pallet);
+ }
+
+ WeakReferenceMessenger.Default.Send(new SavePalletCompletedMessage());
+ }
+}
\ No newline at end of file
diff --git a/Seyounth.Hyosung.UI/ViewModels/Pages/SettingsViewModel.cs b/Seyounth.Hyosung.UI/ViewModels/Pages/SettingsViewModel.cs
new file mode 100644
index 0000000..5d03bb4
--- /dev/null
+++ b/Seyounth.Hyosung.UI/ViewModels/Pages/SettingsViewModel.cs
@@ -0,0 +1,63 @@
+using Wpf.Ui.Appearance;
+using Wpf.Ui.Controls;
+
+namespace Seyounth.Hyosung.UI.ViewModels.Pages
+{
+ public partial class SettingsViewModel : ObservableObject, INavigationAware
+ {
+ private bool _isInitialized = false;
+
+ [ObservableProperty]
+ private string _appVersion = String.Empty;
+
+ [ObservableProperty]
+ private ApplicationTheme _currentTheme = ApplicationTheme.Unknown;
+
+ public void OnNavigatedTo()
+ {
+ if (!_isInitialized)
+ InitializeViewModel();
+ }
+
+ public void OnNavigatedFrom() { }
+
+ private void InitializeViewModel()
+ {
+ CurrentTheme = ApplicationThemeManager.GetAppTheme();
+ AppVersion = $"UiDesktopApp1 - {GetAssemblyVersion()}";
+
+ _isInitialized = true;
+ }
+
+ private string GetAssemblyVersion()
+ {
+ return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version?.ToString()
+ ?? String.Empty;
+ }
+
+ [RelayCommand]
+ private void OnChangeTheme(string parameter)
+ {
+ switch (parameter)
+ {
+ case "theme_light":
+ if (CurrentTheme == ApplicationTheme.Light)
+ break;
+
+ ApplicationThemeManager.Apply(ApplicationTheme.Light);
+ CurrentTheme = ApplicationTheme.Light;
+
+ break;
+
+ default:
+ if (CurrentTheme == ApplicationTheme.Dark)
+ break;
+
+ ApplicationThemeManager.Apply(ApplicationTheme.Dark);
+ CurrentTheme = ApplicationTheme.Dark;
+
+ break;
+ }
+ }
+ }
+}
diff --git a/Seyounth.Hyosung.UI/ViewModels/Windows/MainWindowViewModel.cs b/Seyounth.Hyosung.UI/ViewModels/Windows/MainWindowViewModel.cs
new file mode 100644
index 0000000..d153bc1
--- /dev/null
+++ b/Seyounth.Hyosung.UI/ViewModels/Windows/MainWindowViewModel.cs
@@ -0,0 +1,69 @@
+using System.Collections.ObjectModel;
+using Wpf.Ui.Controls;
+
+namespace Seyounth.Hyosung.UI.ViewModels.Windows
+{
+ public partial class MainWindowViewModel : ObservableObject
+ {
+ [ObservableProperty]
+ private string _applicationTitle = "WPF UI - Seyounth.Hyosung.UI";
+
+ [ObservableProperty]
+ private ObservableCollection