Compare commits
17 Commits
master
...
change-UI-
| Author | SHA1 | Date | |
|---|---|---|---|
| a4fc1b7c9c | |||
|
|
88a65ffc61 | ||
|
|
41f5df88be | ||
|
|
6d221df494 | ||
|
|
2347c07d10 | ||
|
|
1cbd295691 | ||
|
|
c7e3c0fe81 | ||
|
|
af40353527 | ||
|
|
e8194d006e | ||
|
|
2f0cc7d1ce | ||
|
|
83edcfa45e | ||
|
|
5692f92c99 | ||
|
|
6f7f0faf54 | ||
|
|
f014fc19da | ||
|
|
07e4c7a2d9 | ||
|
|
3d81c7d4a1 | ||
|
|
fd0445a4d4 |
15
.idea/.idea.Seyounth.Hyosung/.idea/avalonia.xml
generated
Normal file
15
.idea/.idea.Seyounth.Hyosung/.idea/avalonia.xml
generated
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="AvaloniaProject">
|
||||||
|
<option name="projectPerEditor">
|
||||||
|
<map>
|
||||||
|
<entry key="Seyounth.Hyosung.Ava/App.axaml" value="Seyounth.Hyosung.Ava/Seyounth.Hyosung.Ava.csproj" />
|
||||||
|
<entry key="Seyounth.Hyosung.Ava/Views/AgvBinManagerPage.axaml" value="Seyounth.Hyosung.Ava/Seyounth.Hyosung.Ava.csproj" />
|
||||||
|
<entry key="Seyounth.Hyosung.Ava/Views/HomePage.axaml" value="Seyounth.Hyosung.Ava/Seyounth.Hyosung.Ava.csproj" />
|
||||||
|
<entry key="Seyounth.Hyosung.Ava/Views/MainWindow.axaml" value="Seyounth.Hyosung.Ava/Seyounth.Hyosung.Ava.csproj" />
|
||||||
|
<entry key="Seyounth.Hyosung.Ava/Views/PalletManagerPage.axaml" value="Seyounth.Hyosung.Ava/Seyounth.Hyosung.Ava.csproj" />
|
||||||
|
<entry key="Seyounth.Hyosung.Ava/Views/VarietyManagerPage.axaml" value="Seyounth.Hyosung.Ava/Seyounth.Hyosung.Ava.csproj" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
@ -8,5 +8,12 @@
|
|||||||
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/Seyounth.Hyosung/bin/Debug/net8.0-windows/hyosung.test</jdbc-url>
|
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/Seyounth.Hyosung/bin/Debug/net8.0-windows/hyosung.test</jdbc-url>
|
||||||
<working-dir>$ProjectFileDir$</working-dir>
|
<working-dir>$ProjectFileDir$</working-dir>
|
||||||
</data-source>
|
</data-source>
|
||||||
|
<data-source source="LOCAL" name="hyosung.db" uuid="fc9f4212-d271-41ba-908e-c4274b657472">
|
||||||
|
<driver-ref>sqlite.xerial</driver-ref>
|
||||||
|
<synchronize>true</synchronize>
|
||||||
|
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
|
||||||
|
<jdbc-url>jdbc:sqlite:D:\RiderProjects\seyounth.hyosung.ty\Seyounth.Hyosung.Ava\bin\Debug\net8.0\hyosung.db</jdbc-url>
|
||||||
|
<working-dir>$ProjectFileDir$</working-dir>
|
||||||
|
</data-source>
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
||||||
17
Seyounth.Hyosung.Ava/App.axaml
Normal file
17
Seyounth.Hyosung.Ava/App.axaml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<Application xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
x:Class="Seyounth.Hyosung.Ava.App"
|
||||||
|
xmlns:suki="clr-namespace:SukiUI;assembly=SukiUI"
|
||||||
|
xmlns:local="using:Seyounth.Hyosung.Ava"
|
||||||
|
RequestedThemeVariant="Light">
|
||||||
|
<!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. -->
|
||||||
|
|
||||||
|
<Application.DataTemplates>
|
||||||
|
<local:ViewLocator />
|
||||||
|
</Application.DataTemplates>
|
||||||
|
|
||||||
|
<Application.Styles>
|
||||||
|
|
||||||
|
<suki:SukiTheme Locale="zh-CN" ThemeColor="Blue" />
|
||||||
|
</Application.Styles>
|
||||||
|
</Application>
|
||||||
66
Seyounth.Hyosung.Ava/App.axaml.cs
Normal file
66
Seyounth.Hyosung.Ava/App.axaml.cs
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
using Avalonia;
|
||||||
|
using Avalonia.Controls.ApplicationLifetimes;
|
||||||
|
using Avalonia.Markup.Xaml;
|
||||||
|
using Avalonia.Styling;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using NLog.Extensions.Logging;
|
||||||
|
using Seyounth.Hyosung.Ava.ViewModels;
|
||||||
|
using Seyounth.Hyosung.Ava.Views;
|
||||||
|
using Seyounth.Hyosung.Core;
|
||||||
|
using Seyounth.Hyosung.Core.Printer;
|
||||||
|
using Seyounth.Hyosung.Data;
|
||||||
|
using Seyounth.Hyosung.Runtime;
|
||||||
|
using SukiUI;
|
||||||
|
using SukiUI.Toasts;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.Ava;
|
||||||
|
|
||||||
|
public partial class App : Application
|
||||||
|
{
|
||||||
|
public static IHost _Host { get; private set; }
|
||||||
|
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
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<PrintTemp>(builder.Configuration.GetSection("Print"));
|
||||||
|
builder.Services.AddSingleton<MainWindowViewModel>();
|
||||||
|
builder.Services.AddSingleton<MainWindow>();
|
||||||
|
builder.Services.AddSingleton<HomePage>();
|
||||||
|
builder.Services.AddSingleton<HomeViewModel>();
|
||||||
|
builder.Services.AddSingleton<VarietyManagerPage>();
|
||||||
|
builder.Services.AddSingleton<VarietyManagerViewModel>();
|
||||||
|
builder.Services.AddSingleton<PalletManagerPage>();
|
||||||
|
builder.Services.AddSingleton<PalletManagerViewModel>();
|
||||||
|
builder.Services.AddSingleton<ISukiToastManager, SukiToastManager>();
|
||||||
|
builder.Services.AddSingleton<AgvBinManagerPage>();
|
||||||
|
builder.Services.AddSingleton<AgvBinManagerViewModel>();
|
||||||
|
builder.Services.AddHyosung(builder.Configuration);
|
||||||
|
|
||||||
|
_Host = builder.Build();
|
||||||
|
_Host.Services.UseHyosung();
|
||||||
|
_Host.RunAsync();
|
||||||
|
AvaloniaXamlLoader.Load(this);
|
||||||
|
SukiTheme.GetInstance().ChangeBaseTheme(ThemeVariant.Dark);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override void OnFrameworkInitializationCompleted()
|
||||||
|
{
|
||||||
|
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
|
||||||
|
{
|
||||||
|
desktop.MainWindow = _Host.Services.GetRequiredService<MainWindow>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
base.OnFrameworkInitializationCompleted();
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Seyounth.Hyosung.Ava/Assets/avalonia-logo.ico
Normal file
BIN
Seyounth.Hyosung.Ava/Assets/avalonia-logo.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 172 KiB |
23
Seyounth.Hyosung.Ava/Models/EnumBindingSourceExtension.cs
Normal file
23
Seyounth.Hyosung.Ava/Models/EnumBindingSourceExtension.cs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
using System;
|
||||||
|
using System.Windows.Markup;
|
||||||
|
using Avalonia.Markup.Xaml;
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
24
Seyounth.Hyosung.Ava/Models/EnumDescriptionConverter.cs
Normal file
24
Seyounth.Hyosung.Ava/Models/EnumDescriptionConverter.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
using System;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Reflection;
|
||||||
|
using Avalonia.Data.Converters;
|
||||||
|
|
||||||
|
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<DescriptionAttribute>();
|
||||||
|
return attr?.Description ?? value.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
9
Seyounth.Hyosung.Ava/Models/PalletTypeExtensions.cs
Normal file
9
Seyounth.Hyosung.Ava/Models/PalletTypeExtensions.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
using System;
|
||||||
|
using Seyounth.Hyosung.Data.Models;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.UI.Helpers;
|
||||||
|
|
||||||
|
public static class PalletTypeExtensions
|
||||||
|
{
|
||||||
|
public static Array Values => Enum.GetValues(typeof(PalletType));
|
||||||
|
}
|
||||||
9
Seyounth.Hyosung.Ava/PageBase.cs
Normal file
9
Seyounth.Hyosung.Ava/PageBase.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
using Material.Icons;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.Ava;
|
||||||
|
|
||||||
|
public partial class PageBase(string displayName, MaterialIconKind icon, int index = 0) : ObservableValidator
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
23
Seyounth.Hyosung.Ava/Program.cs
Normal file
23
Seyounth.Hyosung.Ava/Program.cs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
using Avalonia;
|
||||||
|
using Avalonia.ReactiveUI;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.Ava;
|
||||||
|
|
||||||
|
sealed class Program
|
||||||
|
{
|
||||||
|
// Initialization code. Don't use any Avalonia, third-party APIs or any
|
||||||
|
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
|
||||||
|
// yet and stuff might break.
|
||||||
|
[STAThread]
|
||||||
|
public static void Main(string[] args) => BuildAvaloniaApp()
|
||||||
|
.StartWithClassicDesktopLifetime(args);
|
||||||
|
|
||||||
|
// Avalonia configuration, don't remove; also used by visual designer.
|
||||||
|
public static AppBuilder BuildAvaloniaApp()
|
||||||
|
=> AppBuilder.Configure<App>()
|
||||||
|
.UsePlatformDetect()
|
||||||
|
.WithInterFont()
|
||||||
|
.LogToTrace()
|
||||||
|
.UseReactiveUI();
|
||||||
|
}
|
||||||
46
Seyounth.Hyosung.Ava/Seyounth.Hyosung.Ava.csproj
Normal file
46
Seyounth.Hyosung.Ava/Seyounth.Hyosung.Ava.csproj
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>WinExe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
|
||||||
|
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||||
|
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<AvaloniaResource Include="Assets\**"/>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Avalonia" Version="11.2.6" />
|
||||||
|
<PackageReference Include="Avalonia.Controls.TreeDataGrid" Version="11.1.1" />
|
||||||
|
<PackageReference Include="Avalonia.Desktop" Version="11.2.6" />
|
||||||
|
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.2.6" />
|
||||||
|
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.2.6" />
|
||||||
|
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
|
||||||
|
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.2.6" />
|
||||||
|
<PackageReference Include="Avalonia.ReactiveUI" Version="11.2.6" />
|
||||||
|
<PackageReference Include="Material.Icons.Avalonia" Version="2.3.1" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
|
||||||
|
<PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" />
|
||||||
|
<PackageReference Include="SukiUI" Version="6.0.1" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Seyounth.Hyosung.Core\Seyounth.Hyosung.Core.csproj" />
|
||||||
|
<ProjectReference Include="..\Seyounth.Hyosung.Runtime\Seyounth.Hyosung.Runtime.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Update="appsettings.json">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Update="nlog.config">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
32
Seyounth.Hyosung.Ava/ViewLocator.cs
Normal file
32
Seyounth.Hyosung.Ava/ViewLocator.cs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
using System;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Controls.Templates;
|
||||||
|
using Seyounth.Hyosung.Ava.ViewModels;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.Ava;
|
||||||
|
|
||||||
|
public class ViewLocator : IDataTemplate
|
||||||
|
{
|
||||||
|
public Control? Build(object? data)
|
||||||
|
{
|
||||||
|
if (data is null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var name = data.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal);
|
||||||
|
var type = Type.GetType(name);
|
||||||
|
|
||||||
|
if (type != null)
|
||||||
|
{
|
||||||
|
var control = (Control)Activator.CreateInstance(type)!;
|
||||||
|
control.DataContext = data;
|
||||||
|
return control;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TextBlock { Text = "Not Found: " + name };
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Match(object? data)
|
||||||
|
{
|
||||||
|
return data is ViewModelBase;
|
||||||
|
}
|
||||||
|
}
|
||||||
36
Seyounth.Hyosung.Ava/ViewModels/AgvBinManagerViewModel.cs
Normal file
36
Seyounth.Hyosung.Ava/ViewModels/AgvBinManagerViewModel.cs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
using Seyounth.Hyosung.Data.Entities;
|
||||||
|
using Seyounth.Hyosung.Data.Models;
|
||||||
|
using Seyounth.Hyosung.Data.Services;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.Ava.ViewModels;
|
||||||
|
|
||||||
|
public partial class AgvBinManagerViewModel : ObservableObject
|
||||||
|
{
|
||||||
|
[ObservableProperty] private ObservableCollection<AgvBin> _bines;
|
||||||
|
|
||||||
|
private IAgvBinService _agvBinService;
|
||||||
|
|
||||||
|
public AgvBinManagerViewModel(IAgvBinService agvBinService)
|
||||||
|
{
|
||||||
|
_agvBinService = agvBinService;
|
||||||
|
NavigatedTo();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void NavigatedTo()
|
||||||
|
{
|
||||||
|
Bines = new ObservableCollection<AgvBin>((_agvBinService.GetAllAsync().Result).Select(AgvBin.FromEntity));
|
||||||
|
foreach (var agvBin in Bines)
|
||||||
|
{
|
||||||
|
agvBin.OnDeletedChanged += AgvBinOnOnDeletedChanged;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task AgvBinOnOnDeletedChanged(AgvBin arg1, bool arg2)
|
||||||
|
{
|
||||||
|
await _agvBinService.ChangeDeletedStatus(arg1.Id, arg2);
|
||||||
|
}
|
||||||
|
}
|
||||||
124
Seyounth.Hyosung.Ava/ViewModels/HomeViewModel.cs
Normal file
124
Seyounth.Hyosung.Ava/ViewModels/HomeViewModel.cs
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using Avalonia.Controls.Notifications;
|
||||||
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
using CommunityToolkit.Mvvm.Input;
|
||||||
|
using Seyounth.Hyosung.Data.Models;
|
||||||
|
using Seyounth.Hyosung.Data.Services;
|
||||||
|
using Seyounth.Hyosung.Runtime;
|
||||||
|
using SukiUI.Toasts;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.Ava.ViewModels;
|
||||||
|
|
||||||
|
public partial class HomeViewModel : ObservableObject
|
||||||
|
{
|
||||||
|
[ObservableProperty] private ObservableCollection<Variety> _varieties;
|
||||||
|
|
||||||
|
[ObservableProperty] private Variety _selectedVariety;
|
||||||
|
|
||||||
|
[ObservableProperty] private List<string> _yarnCarTypes;
|
||||||
|
|
||||||
|
[ObservableProperty] private List<string> _yarnCarSideType;
|
||||||
|
|
||||||
|
[ObservableProperty] private int _selectedYarnCarTypeIndex;
|
||||||
|
|
||||||
|
[ObservableProperty] private int _selectedYarnCarSideTypeIndex;
|
||||||
|
|
||||||
|
[ObservableProperty] private bool _isSendToErp;
|
||||||
|
|
||||||
|
|
||||||
|
private readonly IVarietyService _varietyService;
|
||||||
|
|
||||||
|
private readonly IHyosungRuntime _runtime;
|
||||||
|
|
||||||
|
private readonly ISukiToastManager _toastManager;
|
||||||
|
|
||||||
|
|
||||||
|
partial void OnIsSendToErpChanged(bool value)
|
||||||
|
{
|
||||||
|
if (_runtime is not null)
|
||||||
|
_runtime.SetIsSendToErp(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public HomeViewModel(IVarietyService varietyService, IHyosungRuntime runtime, ISukiToastManager toastManager)
|
||||||
|
{
|
||||||
|
IsSendToErp = runtime.GetIsSendToErp();
|
||||||
|
_varietyService = varietyService;
|
||||||
|
_runtime = runtime;
|
||||||
|
_toastManager = toastManager;
|
||||||
|
YarnCarTypes =
|
||||||
|
[
|
||||||
|
"A",
|
||||||
|
"B",
|
||||||
|
"C",
|
||||||
|
"D"
|
||||||
|
];
|
||||||
|
|
||||||
|
YarnCarSideType =
|
||||||
|
[
|
||||||
|
"正面",
|
||||||
|
"反面"
|
||||||
|
];
|
||||||
|
SelectedYarnCarTypeIndex = 0;
|
||||||
|
SelectedYarnCarSideTypeIndex = 0;
|
||||||
|
NavigatedTo();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void NavigatedTo()
|
||||||
|
{
|
||||||
|
Varieties = new ObservableCollection<Variety>(_varietyService.GetAll());
|
||||||
|
}
|
||||||
|
|
||||||
|
[RelayCommand]
|
||||||
|
private void OnChangeVariety()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
SelectedVariety.YarnCarType = SelectedYarnCarTypeIndex + 1;
|
||||||
|
SelectedVariety.YarnCarSide = SelectedYarnCarSideTypeIndex + 1;
|
||||||
|
_runtime.SendVarietyToPlcAsync(SelectedVariety);
|
||||||
|
_toastManager.CreateToast()
|
||||||
|
.WithTitle("发送成功")
|
||||||
|
.Dismiss().After(TimeSpan.FromSeconds(3))
|
||||||
|
.OfType(NotificationType.Success)
|
||||||
|
.Dismiss().ByClicking()
|
||||||
|
.Queue();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
_toastManager.CreateToast()
|
||||||
|
.WithTitle("发送失败")
|
||||||
|
.WithContent(e.Message)
|
||||||
|
.Dismiss().After(TimeSpan.FromSeconds(3))
|
||||||
|
.OfType(NotificationType.Error)
|
||||||
|
.Dismiss().ByClicking()
|
||||||
|
.Queue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[RelayCommand]
|
||||||
|
private void OnChangeVarietyLastNo()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_varietyService.SetLastNo(SelectedVariety.Id, SelectedVariety.LastNo.Value);
|
||||||
|
_toastManager.CreateToast()
|
||||||
|
.WithTitle("更改控制号成功")
|
||||||
|
.Dismiss().After(TimeSpan.FromSeconds(3))
|
||||||
|
.OfType(NotificationType.Success)
|
||||||
|
.Dismiss().ByClicking()
|
||||||
|
.Queue();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
_toastManager.CreateToast()
|
||||||
|
.WithTitle("更改控制号失败")
|
||||||
|
.WithContent(e.Message)
|
||||||
|
.Dismiss().After(TimeSpan.FromSeconds(3))
|
||||||
|
.OfType(NotificationType.Error)
|
||||||
|
.Dismiss().ByClicking()
|
||||||
|
.Queue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
55
Seyounth.Hyosung.Ava/ViewModels/MainWindowViewModel.cs
Normal file
55
Seyounth.Hyosung.Ava/ViewModels/MainWindowViewModel.cs
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Reactive;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Material.Icons;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using ReactiveUI;
|
||||||
|
using Seyounth.Hyosung.Ava.Views;
|
||||||
|
using Seyounth.Hyosung.Data.Models;
|
||||||
|
using Seyounth.Hyosung.Data.Services;
|
||||||
|
using SukiUI.Controls;
|
||||||
|
using SukiUI.Toasts;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.Ava.ViewModels;
|
||||||
|
|
||||||
|
public class MainWindowViewModel : ViewModelBase
|
||||||
|
{
|
||||||
|
public ISukiToastManager ToastManager { get; }
|
||||||
|
public List<SukiSideMenuItem> ItemCollections { get; set; }
|
||||||
|
|
||||||
|
public MainWindowViewModel(IServiceProvider provider, ISukiToastManager toastManager)
|
||||||
|
{
|
||||||
|
ToastManager = toastManager;
|
||||||
|
ItemCollections =
|
||||||
|
[
|
||||||
|
new SukiSideMenuItem
|
||||||
|
{
|
||||||
|
Header = "首页",
|
||||||
|
PageContent = provider.GetService<HomePage>(),
|
||||||
|
Classes = { "Compact" }
|
||||||
|
},
|
||||||
|
|
||||||
|
new SukiSideMenuItem
|
||||||
|
{
|
||||||
|
Header = "品类管理",
|
||||||
|
PageContent = provider.GetService<VarietyManagerPage>(),
|
||||||
|
Classes = { "Compact" }
|
||||||
|
},
|
||||||
|
|
||||||
|
new SukiSideMenuItem
|
||||||
|
{
|
||||||
|
Header = "辅料管理",
|
||||||
|
PageContent = provider.GetService<PalletManagerPage>(),
|
||||||
|
Classes = { "Compact" }
|
||||||
|
},
|
||||||
|
new SukiSideMenuItem
|
||||||
|
{
|
||||||
|
Header = "库位管理",
|
||||||
|
PageContent = provider.GetService<AgvBinManagerPage>(),
|
||||||
|
Classes = { "Compact" }
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
100
Seyounth.Hyosung.Ava/ViewModels/PalletManagerViewModel.cs
Normal file
100
Seyounth.Hyosung.Ava/ViewModels/PalletManagerViewModel.cs
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Avalonia.Controls.Notifications;
|
||||||
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
using CommunityToolkit.Mvvm.Input;
|
||||||
|
using CommunityToolkit.Mvvm.Messaging;
|
||||||
|
using Seyounth.Hyosung.Data.Models;
|
||||||
|
using Seyounth.Hyosung.Data.Services;
|
||||||
|
using Seyounth.Hyosung.Data.Services.Hyosung;
|
||||||
|
using SukiUI.Toasts;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.Ava.ViewModels;
|
||||||
|
|
||||||
|
public partial class PalletManagerViewModel : ObservableObject
|
||||||
|
{
|
||||||
|
public class SavePalletCompletedMessage;
|
||||||
|
|
||||||
|
public string Title => "辅料管理";
|
||||||
|
[ObservableProperty] private ObservableCollection<Pallet> _pallets;
|
||||||
|
|
||||||
|
private readonly ISukiToastManager _toastManager;
|
||||||
|
|
||||||
|
private readonly IPalletService _palletService;
|
||||||
|
|
||||||
|
|
||||||
|
public PalletManagerViewModel(IPalletService palletService, ISukiToastManager toastManager)
|
||||||
|
{
|
||||||
|
_toastManager = toastManager;
|
||||||
|
_palletService = palletService;
|
||||||
|
Pallets = new ObservableCollection<Pallet>(palletService.GetPallets());
|
||||||
|
}
|
||||||
|
|
||||||
|
[RelayCommand]
|
||||||
|
private void AddNewRow()
|
||||||
|
{
|
||||||
|
Pallets.Add(new Pallet());
|
||||||
|
}
|
||||||
|
|
||||||
|
[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);
|
||||||
|
_toastManager.CreateToast()
|
||||||
|
.Dismiss().After(TimeSpan.FromSeconds(3))
|
||||||
|
.OfType(NotificationType.Success)
|
||||||
|
.Dismiss().ByClicking()
|
||||||
|
.Queue();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.Write("Object is not a Pallet");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[RelayCommand]
|
||||||
|
private async Task OnSavePallet(object obj)
|
||||||
|
{
|
||||||
|
if (obj is Pallet pallet)
|
||||||
|
{
|
||||||
|
if (pallet.Id == 0)
|
||||||
|
{
|
||||||
|
await _palletService.AddPalletAsync(pallet);
|
||||||
|
_toastManager.CreateToast()
|
||||||
|
.WithTitle("新增辅料成功")
|
||||||
|
.Dismiss().After(TimeSpan.FromSeconds(3))
|
||||||
|
.OfType(NotificationType.Success)
|
||||||
|
.Dismiss().ByClicking()
|
||||||
|
.Queue();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await _palletService.UpdatePalletAsync(pallet);
|
||||||
|
_toastManager.CreateToast()
|
||||||
|
.WithTitle("修改辅料成功")
|
||||||
|
.Dismiss().After(TimeSpan.FromSeconds(3))
|
||||||
|
.OfType(NotificationType.Success)
|
||||||
|
.Dismiss().ByClicking()
|
||||||
|
.Queue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
WeakReferenceMessenger.Default.Send(new SavePalletCompletedMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
180
Seyounth.Hyosung.Ava/ViewModels/VarietyManagerViewModel.cs
Normal file
180
Seyounth.Hyosung.Ava/ViewModels/VarietyManagerViewModel.cs
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Avalonia.Controls.Notifications;
|
||||||
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
using CommunityToolkit.Mvvm.Input;
|
||||||
|
using CommunityToolkit.Mvvm.Messaging;
|
||||||
|
using Seyounth.Hyosung.Data.Models;
|
||||||
|
using Seyounth.Hyosung.Data.Services;
|
||||||
|
using Seyounth.Hyosung.Data.Services.Hyosung;
|
||||||
|
using SukiUI.Toasts;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.Ava.ViewModels;
|
||||||
|
|
||||||
|
public partial class VarietyManagerViewModel : ObservableObject
|
||||||
|
{
|
||||||
|
[ObservableProperty] private ObservableCollection<Variety> _varieties;
|
||||||
|
[ObservableProperty] private ObservableCollection<Pallet> _pallets;
|
||||||
|
|
||||||
|
[ObservableProperty] private ObservableCollection<Pallet> _honeyPallets = new();
|
||||||
|
|
||||||
|
[ObservableProperty] private ObservableCollection<Pallet> _paperPallets = new();
|
||||||
|
|
||||||
|
[ObservableProperty] private ObservableCollection<Pallet> _trays = new();
|
||||||
|
|
||||||
|
|
||||||
|
private readonly ISukiToastManager _toastManager;
|
||||||
|
private readonly IVarietyService _varietyService;
|
||||||
|
private readonly IPalletService _palletService;
|
||||||
|
private readonly IHyosungWmsService _wmsService;
|
||||||
|
public void Reload()
|
||||||
|
{
|
||||||
|
Pallets = new ObservableCollection<Pallet>(_palletService.GetPallets());
|
||||||
|
HoneyPallets = new ObservableCollection<Pallet>(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<Pallet>(papers);
|
||||||
|
Trays = new ObservableCollection<Pallet>(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<Variety>(varieties);
|
||||||
|
}
|
||||||
|
|
||||||
|
public VarietyManagerViewModel(IVarietyService varietyService, ISukiToastManager toastManager,
|
||||||
|
IPalletService palletService,IHyosungWmsService wmsService)
|
||||||
|
{
|
||||||
|
_wmsService = wmsService;
|
||||||
|
_toastManager = toastManager;
|
||||||
|
_palletService = palletService;
|
||||||
|
_varietyService = varietyService;
|
||||||
|
Reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[RelayCommand]
|
||||||
|
private void AddNewRow()
|
||||||
|
{
|
||||||
|
Varieties.Add(new Variety());
|
||||||
|
}
|
||||||
|
|
||||||
|
[RelayCommand]
|
||||||
|
private void OnCopyNew(object obj)
|
||||||
|
{
|
||||||
|
if (obj is Variety variety)
|
||||||
|
{
|
||||||
|
var newVariety = new Variety
|
||||||
|
{
|
||||||
|
Id = variety.Id,
|
||||||
|
TopAndBottomPallet = variety.TopAndBottomPallet,
|
||||||
|
MiddlePallet = variety.MiddlePallet,
|
||||||
|
Tray = variety.Tray,
|
||||||
|
PaperTray = variety.PaperTray,
|
||||||
|
StackingLayers = variety.StackingLayers,
|
||||||
|
YarnCarType = variety.YarnCarType,
|
||||||
|
NeedAngleBeam = variety.NeedAngleBeam,
|
||||||
|
NeedFilmCoating = variety.NeedFilmCoating,
|
||||||
|
NeedFilmWrapping = variety.NeedFilmWrapping,
|
||||||
|
HasBox = variety.HasBox,
|
||||||
|
Specifications = variety.Specifications,
|
||||||
|
InnerDiameter = variety.InnerDiameter,
|
||||||
|
LastNo = variety.LastNo,
|
||||||
|
OuterDiameter = variety.OuterDiameter,
|
||||||
|
TotalCount = variety.TotalCount,
|
||||||
|
YarnDiameter = variety.YarnDiameter,
|
||||||
|
YarnThickness = variety.YarnThickness,
|
||||||
|
MasterLabelCount = variety.MasterLabelCount,
|
||||||
|
NeedPackStrap = variety.NeedPackStrap,
|
||||||
|
NeedTopBoard = variety.NeedTopBoard,
|
||||||
|
PaperTubeHeight = variety.PaperTubeHeight,
|
||||||
|
StackHeadCount = variety.StackHeadCount,
|
||||||
|
SubLabelCount = variety.SubLabelCount,
|
||||||
|
YarnCarSide = variety.YarnCarSide,
|
||||||
|
StackHeadSpec = variety.StackHeadSpec,
|
||||||
|
Code = variety.Code,
|
||||||
|
ControlNo = variety.ControlNo,
|
||||||
|
GrossWeight = variety.GrossWeight,
|
||||||
|
NetWeight = variety.NetWeight,
|
||||||
|
SingleWeight = variety.SingleWeight,
|
||||||
|
IsTurn = variety.IsTurn,
|
||||||
|
Lot = variety.Lot,
|
||||||
|
};
|
||||||
|
Varieties.Add(newVariety);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[RelayCommand]
|
||||||
|
private void OnDeletePallet(object obj)
|
||||||
|
{
|
||||||
|
if (obj is Variety variety)
|
||||||
|
{
|
||||||
|
Varieties.Remove(variety);
|
||||||
|
_varietyService.DeleteVarietyAsync(variety);
|
||||||
|
_toastManager.CreateToast()
|
||||||
|
.WithTitle("删除成功")
|
||||||
|
.Dismiss().After(TimeSpan.FromSeconds(3))
|
||||||
|
.OfType(NotificationType.Success)
|
||||||
|
.Dismiss().ByClicking()
|
||||||
|
.Queue();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.Write("Object is not a Pallet");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[RelayCommand]
|
||||||
|
private async Task OnSavePallet(object obj)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (obj is Variety variety)
|
||||||
|
{
|
||||||
|
var mod = await _wmsService.GetItemInfoByItemCode(variety.Code);
|
||||||
|
if(mod is null)
|
||||||
|
{
|
||||||
|
_toastManager.CreateToast()
|
||||||
|
.WithTitle("保存失败")
|
||||||
|
.WithContent("无法从上游获取产品信息,请检查产品代码是否正确!")
|
||||||
|
.Dismiss().After(TimeSpan.FromSeconds(3))
|
||||||
|
.OfType(NotificationType.Error)
|
||||||
|
.Dismiss().ByClicking()
|
||||||
|
.Queue();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (variety.GrossWeight < variety.NetWeight)
|
||||||
|
{
|
||||||
|
_toastManager.CreateToast()
|
||||||
|
.WithTitle("保存失败")
|
||||||
|
.WithContent("毛重小于净重,请检查是否输入错误!")
|
||||||
|
.Dismiss().After(TimeSpan.FromSeconds(3))
|
||||||
|
.OfType(NotificationType.Error)
|
||||||
|
.Dismiss().ByClicking()
|
||||||
|
.Queue();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await _varietyService.AddVarietyAsync(variety);
|
||||||
|
_toastManager.CreateToast()
|
||||||
|
.WithTitle("保存成功")
|
||||||
|
.Dismiss().After(TimeSpan.FromSeconds(3))
|
||||||
|
.OfType(NotificationType.Success)
|
||||||
|
.Dismiss().ByClicking()
|
||||||
|
.Queue();
|
||||||
|
//Pallets = new ObservableCollection<Pallet>(_palletService.GetPallets());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
7
Seyounth.Hyosung.Ava/ViewModels/ViewModelBase.cs
Normal file
7
Seyounth.Hyosung.Ava/ViewModels/ViewModelBase.cs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
using ReactiveUI;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.Ava.ViewModels;
|
||||||
|
|
||||||
|
public class ViewModelBase : ReactiveObject
|
||||||
|
{
|
||||||
|
}
|
||||||
28
Seyounth.Hyosung.Ava/Views/AgvBinManagerPage.axaml
Normal file
28
Seyounth.Hyosung.Ava/Views/AgvBinManagerPage.axaml
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:suki="https://github.com/kikipoulet/SukiUI"
|
||||||
|
xmlns:viewModels="clr-namespace:Seyounth.Hyosung.Ava.ViewModels"
|
||||||
|
xmlns:views="clr-namespace:Seyounth.Hyosung.Ava.Views"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
x:DataType="views:AgvBinManagerPage"
|
||||||
|
x:Name="PalletPage"
|
||||||
|
x:Class="Seyounth.Hyosung.Ava.Views.AgvBinManagerPage">
|
||||||
|
<suki:SukiStackPage>
|
||||||
|
<suki:SukiStackPage.Content>
|
||||||
|
<Grid x:Name="库位管理" RowDefinitions="Auto,*">
|
||||||
|
<DataGrid Grid.Row="1" GridLinesVisibility="All"
|
||||||
|
ItemsSource="{Binding ViewModel.Bines, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
|
||||||
|
<DataGrid.Columns>
|
||||||
|
<DataGridTextColumn IsReadOnly="True" Header="库位名称" Binding="{Binding BinCode}" />
|
||||||
|
<DataGridTextColumn IsReadOnly="True" Header="代码" Binding="{Binding CtnrCode}" />
|
||||||
|
<DataGridTextColumn Header="序号" Binding="{Binding Sort}" />
|
||||||
|
<DataGridCheckBoxColumn IsReadOnly="True" Header="是否空闲" Binding="{Binding IsFree}" />
|
||||||
|
<DataGridCheckBoxColumn Header="禁用" Binding="{Binding IsDeleted}" />
|
||||||
|
</DataGrid.Columns>
|
||||||
|
</DataGrid>
|
||||||
|
</Grid>
|
||||||
|
</suki:SukiStackPage.Content>
|
||||||
|
</suki:SukiStackPage>
|
||||||
|
</UserControl>
|
||||||
24
Seyounth.Hyosung.Ava/Views/AgvBinManagerPage.axaml.cs
Normal file
24
Seyounth.Hyosung.Ava/Views/AgvBinManagerPage.axaml.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
using Avalonia;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Interactivity;
|
||||||
|
using Avalonia.Markup.Xaml;
|
||||||
|
using Seyounth.Hyosung.Ava.ViewModels;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.Ava.Views;
|
||||||
|
|
||||||
|
public partial class AgvBinManagerPage : UserControl
|
||||||
|
{
|
||||||
|
public AgvBinManagerViewModel ViewModel { get; }
|
||||||
|
public AgvBinManagerPage(AgvBinManagerViewModel viewModel)
|
||||||
|
{
|
||||||
|
ViewModel = viewModel;
|
||||||
|
DataContext = this;
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnLoaded(RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
ViewModel.NavigatedTo();
|
||||||
|
base.OnLoaded(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
72
Seyounth.Hyosung.Ava/Views/HomePage.axaml
Normal file
72
Seyounth.Hyosung.Ava/Views/HomePage.axaml
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:suki="https://github.com/kikipoulet/SukiUI"
|
||||||
|
xmlns:views="clr-namespace:Seyounth.Hyosung.Ava.Views"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
x:DataType="views:HomePage"
|
||||||
|
x:Class="Seyounth.Hyosung.Ava.Views.HomePage">
|
||||||
|
<suki:SukiStackPage>
|
||||||
|
<suki:SukiStackPage.Content>
|
||||||
|
<Grid x:Name="首页" RowDefinitions="Auto,*" ColumnDefinitions="*,*">
|
||||||
|
<suki:GlassCard>
|
||||||
|
<suki:GroupBox Header="入车设置">
|
||||||
|
<Grid RowDefinitions="*,*,*,*,*,*,*,*,*" ColumnDefinitions="*,*">
|
||||||
|
<TextBlock VerticalAlignment="Center" Text="产品类型" />
|
||||||
|
<ComboBox Grid.Row="0" Grid.Column="1"
|
||||||
|
SelectedValue="{Binding ViewModel.SelectedVariety, Mode=TwoWay}"
|
||||||
|
ItemsSource="{Binding ViewModel.Varieties}"
|
||||||
|
DisplayMemberBinding="{Binding Name}" />
|
||||||
|
<TextBlock Grid.Column="0" Grid.Row="1" VerticalAlignment="Center" Text="纱车类型" />
|
||||||
|
<ComboBox Grid.Row="1" Grid.Column="1"
|
||||||
|
SelectedIndex="{Binding ViewModel.SelectedYarnCarTypeIndex, Mode=TwoWay}"
|
||||||
|
ItemsSource="{Binding ViewModel.YarnCarTypes}" />
|
||||||
|
<TextBlock Grid.Column="0" Grid.Row="2" VerticalAlignment="Center" Text="纱车正反面" />
|
||||||
|
<ComboBox Grid.Column="1" Grid.Row="2"
|
||||||
|
SelectedIndex="{Binding ViewModel.SelectedYarnCarSideTypeIndex, Mode=TwoWay}"
|
||||||
|
ItemsSource="{Binding ViewModel.YarnCarSideType}" />
|
||||||
|
<TextBlock Grid.Column="0" Grid.Row="3" VerticalAlignment="Center" Text="当前控制号" />
|
||||||
|
<StackPanel Grid.Column="1" Grid.Row="3" Orientation="Horizontal">
|
||||||
|
<TextBox Width="300" Text="{Binding ViewModel.SelectedVariety.LastNo,Mode=TwoWay}" />
|
||||||
|
<Button Margin="10,0,0,0" Classes="Outlined Accent" Content="修改"
|
||||||
|
Command="{Binding ViewModel.ChangeVarietyLastNoCommand }" />
|
||||||
|
</StackPanel>
|
||||||
|
<TextBlock Grid.Column="0" Grid.Row="4" VerticalAlignment="Center" Text="产品编码" />
|
||||||
|
<TextBox IsEnabled="False" Grid.Column="1" Grid.Row="4"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
Text="{Binding ViewModel.SelectedVariety.Code}" />
|
||||||
|
<TextBlock Grid.Column="0" Grid.Row="5" VerticalAlignment="Center" Text="LOT" />
|
||||||
|
<TextBox IsEnabled="False" Grid.Column="1" Grid.Row="5"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
Text="{Binding ViewModel.SelectedVariety.Lot}" />
|
||||||
|
<TextBlock Grid.Column="0" Grid.Row="6" VerticalAlignment="Center" Text="码垛层数" />
|
||||||
|
<TextBox IsEnabled="False" Grid.Column="1" Grid.Row="6"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
Text="{Binding ViewModel.SelectedVariety.StackingLayers}" />
|
||||||
|
<TextBlock Grid.Column="0" Grid.Row="7" VerticalAlignment="Center" Text="总数" />
|
||||||
|
<TextBox IsEnabled="False" Grid.Column="1" Grid.Row="7"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
Text="{Binding ViewModel.SelectedVariety.TotalCount}" />
|
||||||
|
<Button Grid.Row="8" Grid.Column="1" Content="切换"
|
||||||
|
Command="{Binding ViewModel.ChangeVarietyCommand }" Classes="Outlined" />
|
||||||
|
</Grid>
|
||||||
|
</suki:GroupBox>
|
||||||
|
</suki:GlassCard>
|
||||||
|
<suki:GlassCard Grid.Row="0" Grid.Column="1">
|
||||||
|
<suki:GroupBox Header="便捷设置">
|
||||||
|
<Grid RowDefinitions="*,*,*,*,*,*,*,*,*" ColumnDefinitions="*,*">
|
||||||
|
<TextBlock Grid.Column="0" Grid.Row="0" VerticalAlignment="Center" Text="传送至ERP" />
|
||||||
|
<ToggleSwitch x:Name="IsSendToErp" HorizontalAlignment="Right" Grid.Column="1" Grid.Row="0"
|
||||||
|
IsChecked="{Binding ViewModel.IsSendToErp}" />
|
||||||
|
</Grid>
|
||||||
|
</suki:GroupBox>
|
||||||
|
</suki:GlassCard>
|
||||||
|
</Grid>
|
||||||
|
</suki:SukiStackPage.Content>
|
||||||
|
</suki:SukiStackPage>
|
||||||
|
</UserControl>
|
||||||
26
Seyounth.Hyosung.Ava/Views/HomePage.axaml.cs
Normal file
26
Seyounth.Hyosung.Ava/Views/HomePage.axaml.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
using Avalonia;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Interactivity;
|
||||||
|
using Avalonia.Markup.Xaml;
|
||||||
|
using Seyounth.Hyosung.Ava.ViewModels;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.Ava.Views;
|
||||||
|
|
||||||
|
public partial class HomePage : UserControl
|
||||||
|
{
|
||||||
|
public HomeViewModel ViewModel { get; }
|
||||||
|
|
||||||
|
public HomePage(HomeViewModel viewModel)
|
||||||
|
{
|
||||||
|
ViewModel = viewModel;
|
||||||
|
DataContext = this;
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnLoaded(RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
ViewModel.NavigatedTo();
|
||||||
|
base.OnLoaded(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
44
Seyounth.Hyosung.Ava/Views/MainWindow.axaml
Normal file
44
Seyounth.Hyosung.Ava/Views/MainWindow.axaml
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
<suki:SukiWindow xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:vm="using:Seyounth.Hyosung.Ava.ViewModels"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:suki="https://github.com/kikipoulet/SukiUI"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
x:Class="Seyounth.Hyosung.Ava.Views.MainWindow"
|
||||||
|
x:DataType="vm:MainWindowViewModel"
|
||||||
|
Icon="/Assets/avalonia-logo.ico"
|
||||||
|
Title="Seyounth.Hyosung.Ava">
|
||||||
|
|
||||||
|
<Design.DataContext>
|
||||||
|
<!-- This only sets the DataContext for the previewer in an IDE,
|
||||||
|
to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) -->
|
||||||
|
<vm:MainWindowViewModel />
|
||||||
|
</Design.DataContext>
|
||||||
|
<suki:SukiWindow.Hosts>
|
||||||
|
<suki:SukiToastHost Manager="{Binding ToastManager}"/>
|
||||||
|
</suki:SukiWindow.Hosts>
|
||||||
|
|
||||||
|
<suki:SukiSideMenu
|
||||||
|
ItemsSource="{Binding ItemCollections}">
|
||||||
|
<suki:SukiSideMenu.Styles>
|
||||||
|
<Style Selector="Image.AppIcon">
|
||||||
|
<Setter Property="Transitions">
|
||||||
|
<Transitions>
|
||||||
|
<DoubleTransition Property="Opacity" Duration="0.1" />
|
||||||
|
</Transitions>
|
||||||
|
</Setter>
|
||||||
|
<Style Selector="^:pointerover">
|
||||||
|
<Setter Property="Opacity" Value="0.5" />
|
||||||
|
</Style>
|
||||||
|
</Style>
|
||||||
|
</suki:SukiSideMenu.Styles>
|
||||||
|
<suki:SukiSideMenu.HeaderContent>
|
||||||
|
<!-- Header Content -->
|
||||||
|
</suki:SukiSideMenu.HeaderContent>
|
||||||
|
|
||||||
|
<suki:SukiSideMenu.FooterContent>
|
||||||
|
<!-- Footer Content -->
|
||||||
|
</suki:SukiSideMenu.FooterContent>
|
||||||
|
</suki:SukiSideMenu>
|
||||||
|
</suki:SukiWindow>
|
||||||
14
Seyounth.Hyosung.Ava/Views/MainWindow.axaml.cs
Normal file
14
Seyounth.Hyosung.Ava/Views/MainWindow.axaml.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
using Avalonia.Controls;
|
||||||
|
using Seyounth.Hyosung.Ava.ViewModels;
|
||||||
|
using SukiUI.Controls;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.Ava.Views;
|
||||||
|
|
||||||
|
public partial class MainWindow :SukiWindow
|
||||||
|
{
|
||||||
|
public MainWindow(MainWindowViewModel viewModel)
|
||||||
|
{
|
||||||
|
DataContext = viewModel;
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
77
Seyounth.Hyosung.Ava/Views/PalletManagerPage.axaml
Normal file
77
Seyounth.Hyosung.Ava/Views/PalletManagerPage.axaml
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:viewModels="clr-namespace:Seyounth.Hyosung.Ava.ViewModels"
|
||||||
|
xmlns:views="clr-namespace:Seyounth.Hyosung.Ava.Views"
|
||||||
|
xmlns:models="clr-namespace:Seyounth.Hyosung.Data.Models;assembly=Seyounth.Hyosung.Data"
|
||||||
|
xmlns:helpers="clr-namespace:Seyounth.Hyosung.UI.Helpers"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
xmlns:suki="https://github.com/kikipoulet/SukiUI"
|
||||||
|
x:DataType="viewModels:PalletManagerViewModel"
|
||||||
|
x:Name="PalletPage"
|
||||||
|
x:Class="Seyounth.Hyosung.Ava.Views.PalletManagerPage">
|
||||||
|
<UserControl.Resources>
|
||||||
|
<helpers:EnumDescriptionConverter x:Key="EnumDescriptionConverter" />
|
||||||
|
</UserControl.Resources>
|
||||||
|
|
||||||
|
<suki:SukiStackPage>
|
||||||
|
<suki:SukiStackPage.Content>
|
||||||
|
<Grid x:Name="辅料管理" RowDefinitions="Auto,*">
|
||||||
|
<StackPanel Margin="20" Orientation="Horizontal">
|
||||||
|
<Button Content="新增" Classes="Outlined" Command="{Binding AddNewRowCommand }" />
|
||||||
|
</StackPanel>
|
||||||
|
<DataGrid Grid.Row="1" GridLinesVisibility="All"
|
||||||
|
ItemsSource="{Binding Pallets, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
|
||||||
|
<DataGrid.Columns>
|
||||||
|
<DataGridTextColumn Header="ID"
|
||||||
|
IsReadOnly="True"
|
||||||
|
Binding="{Binding Id}" />
|
||||||
|
<DataGridTemplateColumn Header="辅料类型">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox SelectedItem="{Binding Type, Mode=TwoWay}"
|
||||||
|
ItemsSource="{Binding Source={helpers:EnumBindingSource {x:Type models:PalletType}}}"
|
||||||
|
SelectionChanged="ComboBox_SelectionChanged">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock
|
||||||
|
Text="{Binding ., Converter={StaticResource EnumDescriptionConverter}}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTextColumn Header="长度(Length)" Binding="{Binding Length}" />
|
||||||
|
<DataGridTextColumn Header="宽度(Width)" Binding="{Binding Width}" />
|
||||||
|
<DataGridTextColumn Header="高度(Height)" Binding="{Binding Height}" />
|
||||||
|
<DataGridCheckBoxColumn Header="大孔(BigHole)" Binding="{Binding IsBigHole}" />
|
||||||
|
<DataGridTextColumn Header="孔数(HoleCount)" Binding="{Binding HoleCount}" />
|
||||||
|
<DataGridTemplateColumn Header="操作">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<Button VerticalAlignment="Center" Margin="10,0,10,0"
|
||||||
|
Content="修改"
|
||||||
|
Classes="Outlined Accent"
|
||||||
|
Command="{Binding ElementName=PalletPage, Path=ViewModel.SavePalletCommand}"
|
||||||
|
CommandParameter="{Binding}"
|
||||||
|
IsVisible="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, Path=IsEditing}" />
|
||||||
|
<!-- 删除按钮 -->
|
||||||
|
<Button VerticalAlignment="Center" Content="删除" Margin="10,0,10,0"
|
||||||
|
Command="{Binding ElementName=PalletPage, Path=ViewModel.DeletePalletCommand}"
|
||||||
|
CommandParameter="{Binding}" />
|
||||||
|
<!-- 保存按钮,根据 DataGridRow 的 IsEditing 属性控制可见性 -->
|
||||||
|
</StackPanel>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
</DataGrid.Columns>
|
||||||
|
</DataGrid>
|
||||||
|
</Grid>
|
||||||
|
</suki:SukiStackPage.Content>
|
||||||
|
|
||||||
|
</suki:SukiStackPage>
|
||||||
|
|
||||||
|
</UserControl>
|
||||||
24
Seyounth.Hyosung.Ava/Views/PalletManagerPage.axaml.cs
Normal file
24
Seyounth.Hyosung.Ava/Views/PalletManagerPage.axaml.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
using Avalonia;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Markup.Xaml;
|
||||||
|
using Seyounth.Hyosung.Ava.ViewModels;
|
||||||
|
using SukiUI.Controls;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.Ava.Views;
|
||||||
|
|
||||||
|
public partial class PalletManagerPage :UserControl
|
||||||
|
{
|
||||||
|
public PalletManagerViewModel ViewModel { get; }
|
||||||
|
|
||||||
|
public PalletManagerPage(PalletManagerViewModel viewModel)
|
||||||
|
{
|
||||||
|
ViewModel = viewModel;
|
||||||
|
DataContext = ViewModel;
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ComboBox_SelectionChanged(object? sender, SelectionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
251
Seyounth.Hyosung.Ava/Views/VarietyManagerPage.axaml
Normal file
251
Seyounth.Hyosung.Ava/Views/VarietyManagerPage.axaml
Normal file
@ -0,0 +1,251 @@
|
|||||||
|
<UserControl xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
|
xmlns:suki="https://github.com/kikipoulet/SukiUI"
|
||||||
|
xmlns:models1="clr-namespace:Seyounth.Hyosung.Data.Models;assembly=Seyounth.Hyosung.Data"
|
||||||
|
xmlns:views="clr-namespace:Seyounth.Hyosung.Ava.Views"
|
||||||
|
xmlns:helpers="clr-namespace:Seyounth.Hyosung.UI.Helpers"
|
||||||
|
x:DataType="views:VarietyManagerPage"
|
||||||
|
x:Name="VarietyPage"
|
||||||
|
x:Class="Seyounth.Hyosung.Ava.Views.VarietyManagerPage">
|
||||||
|
<UserControl.Resources>
|
||||||
|
<helpers:EnumDescriptionConverter x:Key="EnumDescriptionConverter" />
|
||||||
|
</UserControl.Resources>
|
||||||
|
<suki:SukiStackPage>
|
||||||
|
<suki:SukiStackPage.Content>
|
||||||
|
<Grid x:Name="品类管理" RowDefinitions="Auto,*">
|
||||||
|
<StackPanel Margin="20" Orientation="Horizontal">
|
||||||
|
<Button Content="新增" Classes="Outlined" Command="{Binding ViewModel.AddNewRowCommand}" />
|
||||||
|
</StackPanel>
|
||||||
|
<DataGrid Grid.Row="1" GridLinesVisibility="All"
|
||||||
|
ItemsSource="{Binding ViewModel.Varieties,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
|
||||||
|
<DataGrid.Columns>
|
||||||
|
<DataGridTemplateColumn Header="复制">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<Button VerticalAlignment="Center" Margin="10,0,10,0"
|
||||||
|
Content="复制"
|
||||||
|
Classes="Outlined Accent"
|
||||||
|
Command="{Binding ElementName=VarietyPage, Path=ViewModel.CopyNewCommand}"
|
||||||
|
CommandParameter="{Binding}"
|
||||||
|
IsVisible="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, Path=IsEditing}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTextColumn Header="编号"
|
||||||
|
Binding="{Binding Id}" />
|
||||||
|
<DataGridTextColumn MinWidth="200" Header="产品编码" Binding="{Binding Code}" />
|
||||||
|
<DataGridTextColumn Header="Lot" Binding="{Binding Lot}" />
|
||||||
|
<DataGridTextColumn Header="规格" Binding="{Binding Specifications}" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding InnerDiameter }"
|
||||||
|
Header="内径(D1)"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding OuterDiameter }"
|
||||||
|
Header="外径(D2)"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding YarnDiameter }"
|
||||||
|
Header="直径(D3)"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding PaperTubeHeight }"
|
||||||
|
Header="纸管高(H1)"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding YarnThickness }"
|
||||||
|
Header="纱线厚(H2)"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding SingleWeight }"
|
||||||
|
Header="单筒重"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding StackingLayers }"
|
||||||
|
Header="码层数"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding TotalCount }"
|
||||||
|
Header="个/托"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTemplateColumn Width="180" Header="蜂窝板(中间)">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectedItem="{Binding MiddlePallet, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding ElementName=VarietyPage, Path=ViewModel.HoneyPallets}"
|
||||||
|
DisplayMemberBinding="{Binding Name}">
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
|
||||||
|
<DataGridTemplateColumn Width="180" Header="蜂窝板(上下)">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectedItem="{Binding TopAndBottomPallet, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding ElementName=VarietyPage, Path=ViewModel.HoneyPallets}"
|
||||||
|
DisplayMemberBinding="{Binding Name}">
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTemplateColumn Width="180" Header="底托">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectedItem="{Binding Tray, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding ElementName=VarietyPage, Path=ViewModel.Trays}"
|
||||||
|
DisplayMemberBinding="{Binding Name}">
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTemplateColumn Width="180" Header="隔板">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectedItem="{Binding PaperTray, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding ElementName=VarietyPage, Path=ViewModel.PaperPallets}"
|
||||||
|
DisplayMemberBinding="{Binding Name}">
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding StackHeadSpec }"
|
||||||
|
Header="垛头尺寸" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding StackHeadCount }"
|
||||||
|
Header="垛头数量" />
|
||||||
|
<DataGridCheckBoxColumn Header="套箱" Binding="{Binding HasBox}" />
|
||||||
|
|
||||||
|
|
||||||
|
<DataGridTemplateColumn Header="顶板">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectedItem="{Binding NeedTopBoard, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding Source={helpers:EnumBindingSource {x:Type models1:NeedType}}}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock
|
||||||
|
Text="{Binding ., Converter={StaticResource EnumDescriptionConverter}}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTemplateColumn Header="护角">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectedItem="{Binding NeedAngleBeam, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding Source={helpers:EnumBindingSource {x:Type models1:NeedType}}}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock
|
||||||
|
Text="{Binding ., Converter={StaticResource EnumDescriptionConverter}}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTemplateColumn Header="打带">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectedItem="{Binding NeedPackStrap, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding Source={helpers:EnumBindingSource {x:Type models1:NeedType}}}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock
|
||||||
|
Text="{Binding ., Converter={StaticResource EnumDescriptionConverter}}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTemplateColumn Header="缠膜">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectedItem="{Binding NeedFilmWrapping, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding Source={helpers:EnumBindingSource {x:Type models1:NeedType}}}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock
|
||||||
|
Text="{Binding ., Converter={StaticResource EnumDescriptionConverter}}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTemplateColumn Header="覆膜">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectedItem="{Binding NeedFilmCoating, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding Source={helpers:EnumBindingSource {x:Type models1:NeedType}}}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock
|
||||||
|
Text="{Binding ., Converter={StaticResource EnumDescriptionConverter}}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding MasterLabelCount }"
|
||||||
|
Header="主标签数量"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding SubLabelCount }"
|
||||||
|
Header="副标签数量"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn Header="毛重"
|
||||||
|
Binding="{Binding GrossWeight}" />
|
||||||
|
<DataGridTextColumn Header="净重"
|
||||||
|
Binding="{Binding NetWeight}" />
|
||||||
|
<DataGridTextColumn Header="控制号"
|
||||||
|
Binding="{Binding LastNo}" />
|
||||||
|
<DataGridTextColumn Header="主标签颜色"
|
||||||
|
Binding="{Binding LabelColor}" />
|
||||||
|
|
||||||
|
<DataGridTemplateColumn Header="操作">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<Button VerticalAlignment="Center" Margin="10,0,10,0"
|
||||||
|
Content="修改"
|
||||||
|
Classes="Outlined Accent"
|
||||||
|
Command="{Binding ElementName=VarietyPage, Path=ViewModel.SavePalletCommand}"
|
||||||
|
CommandParameter="{Binding}"
|
||||||
|
IsVisible="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, Path=IsEditing}" />
|
||||||
|
<!-- 删除按钮 -->
|
||||||
|
<Button VerticalAlignment="Center" Content="删除" Margin="10,0,10,0"
|
||||||
|
Command="{Binding ElementName=VarietyPage, Path=ViewModel.DeletePalletCommand}"
|
||||||
|
CommandParameter="{Binding}" />
|
||||||
|
<!-- 保存按钮,根据 DataGridRow 的 IsEditing 属性控制可见性 -->
|
||||||
|
</StackPanel>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
</DataGrid.Columns>
|
||||||
|
|
||||||
|
</DataGrid>
|
||||||
|
</Grid>
|
||||||
|
</suki:SukiStackPage.Content>
|
||||||
|
</suki:SukiStackPage>
|
||||||
|
|
||||||
|
</UserControl>
|
||||||
26
Seyounth.Hyosung.Ava/Views/VarietyManagerPage.axaml.cs
Normal file
26
Seyounth.Hyosung.Ava/Views/VarietyManagerPage.axaml.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
using Avalonia;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Interactivity;
|
||||||
|
using Avalonia.Markup.Xaml;
|
||||||
|
using Seyounth.Hyosung.Ava.ViewModels;
|
||||||
|
using SukiUI.Controls;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.Ava.Views;
|
||||||
|
|
||||||
|
public partial class VarietyManagerPage : UserControl
|
||||||
|
{
|
||||||
|
public VarietyManagerViewModel ViewModel { get; }
|
||||||
|
|
||||||
|
public VarietyManagerPage(VarietyManagerViewModel viewModel)
|
||||||
|
{
|
||||||
|
ViewModel = viewModel;
|
||||||
|
DataContext = this;
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnLoaded(RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
ViewModel.Reload();
|
||||||
|
base.OnLoaded(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
18
Seyounth.Hyosung.Ava/app.manifest
Normal file
18
Seyounth.Hyosung.Ava/app.manifest
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<!-- This manifest is used on Windows only.
|
||||||
|
Don't remove it as it might cause problems with window transparency and embedded controls.
|
||||||
|
For more details visit https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests -->
|
||||||
|
<assemblyIdentity version="1.0.0.0" name="Seyounth.Hyosung.Ava.Desktop"/>
|
||||||
|
|
||||||
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||||
|
<application>
|
||||||
|
<!-- A list of the Windows versions that this application has been tested on
|
||||||
|
and is designed to work with. Uncomment the appropriate elements
|
||||||
|
and Windows will automatically select the most compatible environment. -->
|
||||||
|
|
||||||
|
<!-- Windows 10 -->
|
||||||
|
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
|
||||||
|
</application>
|
||||||
|
</compatibility>
|
||||||
|
</assembly>
|
||||||
5
Seyounth.Hyosung.Ava/appsettings.json
Normal file
5
Seyounth.Hyosung.Ava/appsettings.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"ConnectionStrings": {
|
||||||
|
"DefaultConnection": "server=DESKTOP-AJ6K895;database=seyounth.hyosung;Trusted_Connection=SSPI;Encrypt=True;TrustServerCertificate=True;"
|
||||||
|
}
|
||||||
|
}
|
||||||
26
Seyounth.Hyosung.Ava/nlog.config
Normal file
26
Seyounth.Hyosung.Ava/nlog.config
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
autoReload="true"
|
||||||
|
internalLogLevel="Info"
|
||||||
|
internalLogFile="c:\temp\nlog-internal.log">
|
||||||
|
|
||||||
|
<!-- 定义目标,即日志输出的位置 -->
|
||||||
|
<targets>
|
||||||
|
<!-- 输出到控制台 -->
|
||||||
|
<target name="console" xsi:type="Console" />
|
||||||
|
|
||||||
|
<!-- 输出到文件 -->
|
||||||
|
<target name="file" xsi:type="File" fileName="${basedir}/logs/${shortdate}.log"
|
||||||
|
layout="${longdate} ${uppercase:${level}} ${message} ${onexception:${exception:format=tostring} | ${stacktrace}}" />
|
||||||
|
</targets>
|
||||||
|
|
||||||
|
<!-- 定义规则,决定哪些日志应该输出到哪些目标 -->
|
||||||
|
<rules>
|
||||||
|
<!-- 记录所有级别的日志到控制台 -->
|
||||||
|
<logger name="*" minlevel="Trace" writeTo="console" />
|
||||||
|
|
||||||
|
<!-- 记录所有级别的日志到文件 -->
|
||||||
|
<logger name="*" minlevel="Trace" writeTo="file" />
|
||||||
|
</rules>
|
||||||
|
</nlog>
|
||||||
@ -106,10 +106,10 @@ public class HyosungPlcService(ILogger<HyosungPlcService> logger) : IHyosungPlcS
|
|||||||
await _writer.WriteShortsAsync(12120, ls.ToArray());
|
await _writer.WriteShortsAsync(12120, ls.ToArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task WritePrintLableOptionsAsync(int side, int slave)
|
public async Task WritePrintLabelOptionsAsync(int master, int slave, int color, bool isSendToErp)
|
||||||
{
|
{
|
||||||
short masterCount = 0;
|
short masterCount = 0;
|
||||||
switch (side)
|
switch (master)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
masterCount = 1;
|
masterCount = 1;
|
||||||
@ -148,12 +148,23 @@ public class HyosungPlcService(ILogger<HyosungPlcService> logger) : IHyosungPlcS
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
await _writer.WriteShortsAsync(13050, [1, 1, 1, 2]);
|
masterCount=isSendToErp ? masterCount : (short)2;
|
||||||
|
if (color == 1)
|
||||||
|
{
|
||||||
|
await _writer.WriteShortsAsync(13050, [1, 1, 1, masterCount]);
|
||||||
|
await _writer.WriteShortsAsync(13055, [1, 1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await _writer.WriteShortsAsync(13050, [1, 1, 1, 1]);
|
||||||
|
await _writer.WriteShortsAsync(13055, [1, masterCount]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task WritePrintLabelResultAsync(int index, bool result)
|
public async Task WritePrintLabelResultAsync(int index, bool result)
|
||||||
{
|
{
|
||||||
var address = index == 1 ? 13060 : 13061;
|
var address = 13059 + index;
|
||||||
|
|
||||||
await _writer.WriteShortsAsync(address, (short)(result ? 1 : 2));
|
await _writer.WriteShortsAsync(address, (short)(result ? 1 : 2));
|
||||||
}
|
}
|
||||||
@ -375,7 +386,7 @@ public class HyosungPlcService(ILogger<HyosungPlcService> logger) : IHyosungPlcS
|
|||||||
|
|
||||||
private async Task QueryPrintLabel()
|
private async Task QueryPrintLabel()
|
||||||
{
|
{
|
||||||
var requestPrintLabel = await _reader.ReadShortsAsync(13010, 3);
|
var requestPrintLabel = await _reader.ReadShortsAsync(13010, 4);
|
||||||
if (requestPrintLabel[0] == 1)
|
if (requestPrintLabel[0] == 1)
|
||||||
{
|
{
|
||||||
await _writer.WriteShortsAsync(13010, 0);
|
await _writer.WriteShortsAsync(13010, 0);
|
||||||
@ -389,5 +400,12 @@ public class HyosungPlcService(ILogger<HyosungPlcService> logger) : IHyosungPlcS
|
|||||||
await _writer.WriteShortsAsync(13012, 0);
|
await _writer.WriteShortsAsync(13012, 0);
|
||||||
OnRequestPrintLabel?.Invoke(2, requestPrintLabel[2]);
|
OnRequestPrintLabel?.Invoke(2, requestPrintLabel[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (requestPrintLabel[3] == 1)
|
||||||
|
{
|
||||||
|
await _writer.WriteShortsAsync(13013, 0);
|
||||||
|
await _writer.WriteShortsAsync(13012, 0);
|
||||||
|
OnRequestPrintLabel?.Invoke(3, requestPrintLabel[2]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -58,7 +58,7 @@ public interface IHyosungPlcService
|
|||||||
|
|
||||||
Task WritePackLineOptionAsync(PackLineOption option);
|
Task WritePackLineOptionAsync(PackLineOption option);
|
||||||
|
|
||||||
Task WritePrintLableOptionsAsync(int side,int slaveCount);
|
Task WritePrintLabelOptionsAsync(int masterCount, int slaveCount, int color,bool isSendToErp);
|
||||||
|
|
||||||
Task WritePrintLabelResultAsync(int index, bool result);
|
Task WritePrintLabelResultAsync(int index, bool result);
|
||||||
|
|
||||||
|
|||||||
@ -15,55 +15,58 @@ public class HyosungPrinter(
|
|||||||
IHyosungWmsService hyosungWmsService,
|
IHyosungWmsService hyosungWmsService,
|
||||||
IOptions<PrintTemp> options) : IHyosungPrinter
|
IOptions<PrintTemp> options) : IHyosungPrinter
|
||||||
{
|
{
|
||||||
private readonly AveryPrinter _masterPrinter = new("192.168.3.61", 9100);
|
private readonly Dictionary<int, AveryPrinter> _printers = new Dictionary<int, AveryPrinter>()
|
||||||
private readonly AveryPrinter _slavePrinter = new("192.168.3.60", 9100);
|
{
|
||||||
|
{ 1001, new AveryPrinter("192.168.3.61", 9100) },
|
||||||
|
{ 2, new AveryPrinter("192.168.3.62", 9100) },
|
||||||
|
{ 1, new AveryPrinter("192.168.3.60", 9100) }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
public async Task StartAsync(CancellationToken token)
|
public async Task StartAsync(CancellationToken token)
|
||||||
{
|
{
|
||||||
List<Task> ls = new List<Task>();
|
List<Task> ls = new List<Task>();
|
||||||
ls.Add(_masterPrinter.ConnectAsync(token));
|
foreach (var (_, printer) in _printers)
|
||||||
ls.Add(_slavePrinter.ConnectAsync(token));
|
{
|
||||||
|
ls.Add(printer.ConnectAsync(token));
|
||||||
|
}
|
||||||
|
|
||||||
await Task.WhenAll(ls);
|
await Task.WhenAll(ls);
|
||||||
logger.LogInformation("printer connected");
|
logger.LogInformation("printer connected");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task StopAsync(CancellationToken token)
|
public async Task StopAsync(CancellationToken token)
|
||||||
{
|
{
|
||||||
await _masterPrinter.CloseAsync(token);
|
foreach (var (_, printer) in _printers)
|
||||||
await _slavePrinter.CloseAsync(token);
|
{
|
||||||
|
printer.CloseAsync(token);
|
||||||
|
}
|
||||||
|
|
||||||
logger.LogInformation("printer disconnected");
|
logger.LogInformation("printer disconnected");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task PrintAsync(int index, string trayCode)
|
public async Task PrintMasterLabelAsync(int color, string trayCode)
|
||||||
{
|
{
|
||||||
var tray = await trayService.GetByCode(trayCode);
|
var tray = await trayService.GetByCode(trayCode);
|
||||||
if (index == 1)
|
var content = await GetMasterLabelContent(tray);
|
||||||
{
|
await _printers[color].CleanContextAsync();
|
||||||
await PrintLabel1Async(tray);
|
await _printers[color].SendContentAsync(content);
|
||||||
}
|
await _printers[color].PrintAsync();
|
||||||
else
|
|
||||||
{
|
|
||||||
await PrintLabel2Async(tray);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task PrintLabel1Async(Tray tray)
|
public async Task PrintSubLabelAsync(string trayCode)
|
||||||
{
|
{
|
||||||
await _masterPrinter.CleanContextAsync();
|
var tray = await trayService.GetByCode(trayCode);
|
||||||
var content = await GetPrint1Content(tray);
|
var content = await GetSubLabelContentAsync(tray);
|
||||||
await _masterPrinter.SendContentAsync(content);
|
await _printers[1001].CleanContextAsync();
|
||||||
await _masterPrinter.PrintAsync();
|
await _printers[1001].SendContentAsync(content);
|
||||||
|
await _printers[1001].PrintAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task PrintLabel2Async(Tray tray)
|
|
||||||
{
|
|
||||||
await _slavePrinter.CleanContextAsync();
|
|
||||||
var content = await GetPrint2Content(tray);
|
|
||||||
await _slavePrinter.SendContentAsync(content);
|
|
||||||
await _slavePrinter.PrintAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<string> GetPrint1Content(Tray tray)
|
|
||||||
|
|
||||||
|
private async Task<string> GetSubLabelContentAsync(Tray tray)
|
||||||
{
|
{
|
||||||
var variety = await varietyService.GetById(tray.VarietyId);
|
var variety = await varietyService.GetById(tray.VarietyId);
|
||||||
var yarns = await yarnService.GetYarnsByTrayIdAsync(tray.Id);
|
var yarns = await yarnService.GetYarnsByTrayIdAsync(tray.Id);
|
||||||
@ -100,7 +103,7 @@ public class HyosungPrinter(
|
|||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<string> GetPrint2Content(Tray tray)
|
private async Task<string> GetMasterLabelContent(Tray tray)
|
||||||
{
|
{
|
||||||
var variety = await varietyService.GetById(tray.VarietyId);
|
var variety = await varietyService.GetById(tray.VarietyId);
|
||||||
|
|
||||||
@ -128,6 +131,7 @@ public class HyosungPrinter(
|
|||||||
{
|
{
|
||||||
content = content.Replace(key, value);
|
content = content.Replace(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.LogInformation($"print content: {content}");
|
logger.LogInformation($"print content: {content}");
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,10 +6,9 @@ public interface IHyosungPrinter
|
|||||||
|
|
||||||
Task StopAsync(CancellationToken token);
|
Task StopAsync(CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 打印指定垛的标签
|
|
||||||
/// </summary>
|
Task PrintMasterLabelAsync(int color, string trayCode);
|
||||||
/// <param name="trayCode"></param>
|
|
||||||
/// <returns></returns>
|
Task PrintSubLabelAsync(string trayCode);
|
||||||
Task PrintAsync(int index,string trayCode);
|
|
||||||
}
|
}
|
||||||
@ -29,9 +29,9 @@ public class HyosungScannerService : IHyosungScannerService
|
|||||||
_fixtureScanners.TryAdd(3, new HikScanner("192.168.3.33", 2001));
|
_fixtureScanners.TryAdd(3, new HikScanner("192.168.3.33", 2001));
|
||||||
_fixtureScanners.TryAdd(4, new HikScanner("192.168.3.30", 2001));
|
_fixtureScanners.TryAdd(4, new HikScanner("192.168.3.30", 2001));
|
||||||
_carScanners.Add(new HikScanner("192.168.30.46", 2001,5000));
|
_carScanners.Add(new HikScanner("192.168.30.46", 2001,5000));
|
||||||
//_carScanners.Add(new HikScanner("1920.168.3.48", 2001,5000));
|
_carScanners.Add(new HikScanner("1920.168.3.48", 2001,5000));
|
||||||
_varietyScanners.Add(new HikScanner("192.168.30.47", 2001,10000));
|
_varietyScanners.Add(new HikScanner("192.168.30.47", 2001,10000));
|
||||||
//_varietyScanners.Add(new HikScanner("192.168.3.49", 2001,10000));
|
_varietyScanners.Add(new HikScanner("192.168.3.49", 2001,10000));
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
lastCodes.Add("");
|
lastCodes.Add("");
|
||||||
lastCodes.Add("");
|
lastCodes.Add("");
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
using SqlSugar;
|
using SqlSugar;
|
||||||
|
|
||||||
namespace Seyounth.Hyosung.Data.Entities;
|
namespace Seyounth.Hyosung.Data.Entities;
|
||||||
|
|||||||
@ -6,7 +6,7 @@ namespace Seyounth.Hyosung.Data.Entities;
|
|||||||
[SugarTable("system_variety", TableDescription = "品种表")]
|
[SugarTable("system_variety", TableDescription = "品种表")]
|
||||||
public class VarietyEntity
|
public class VarietyEntity
|
||||||
{
|
{
|
||||||
[SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
|
[SugarColumn(IsPrimaryKey = true, ColumnDescription = "主键")]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
[SugarColumn(ColumnDescription = "品种代码")]
|
[SugarColumn(ColumnDescription = "品种代码")]
|
||||||
@ -51,7 +51,7 @@ public class VarietyEntity
|
|||||||
[SugarColumn(ColumnDescription = "托盘ID")]
|
[SugarColumn(ColumnDescription = "托盘ID")]
|
||||||
public int TrayId { get; set; }
|
public int TrayId { get; set; }
|
||||||
|
|
||||||
[SugarColumn(ColumnDescription = "垛头尺寸")]
|
[SugarColumn(ColumnDescription = "垛头尺寸", IsNullable = true)]
|
||||||
public string? StackHeadSpec { get; set; }
|
public string? StackHeadSpec { get; set; }
|
||||||
|
|
||||||
[SugarColumn(ColumnDescription = "垛头数量")]
|
[SugarColumn(ColumnDescription = "垛头数量")]
|
||||||
@ -84,13 +84,12 @@ public class VarietyEntity
|
|||||||
[SugarColumn(ColumnDescription = "副标签数量")]
|
[SugarColumn(ColumnDescription = "副标签数量")]
|
||||||
public int SubLabelCount { get; set; }
|
public int SubLabelCount { get; set; }
|
||||||
|
|
||||||
[SugarColumn(IsNullable =true)]
|
[SugarColumn(ColumnDescription = "标签颜色 1=红色 2=黑色")]
|
||||||
public int? LastNo { get; set; }
|
public int LabelColor { get; set; }
|
||||||
|
|
||||||
[SugarColumn(IsNullable =true)]
|
[SugarColumn(IsNullable = true)] public int? LastNo { get; set; }
|
||||||
public double? NetWeight { get; set; }
|
|
||||||
|
|
||||||
[SugarColumn(IsNullable =true)]
|
[SugarColumn(IsNullable = true)] public double? NetWeight { get; set; }
|
||||||
public double? GrossWeight { get; set; }
|
|
||||||
|
|
||||||
|
[SugarColumn(IsNullable = true)] public double? GrossWeight { get; set; }
|
||||||
}
|
}
|
||||||
38
Seyounth.Hyosung.Data/Models/AgvBin.cs
Normal file
38
Seyounth.Hyosung.Data/Models/AgvBin.cs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
using Seyounth.Hyosung.Data.Entities;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.Data.Models;
|
||||||
|
|
||||||
|
public partial class AgvBin : ObservableObject
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
public string BinCode { get; set; }
|
||||||
|
public string CtnrCode { get; set; }
|
||||||
|
|
||||||
|
public bool IsFree { get; set; }
|
||||||
|
|
||||||
|
public int Sort { get; set; }
|
||||||
|
|
||||||
|
[ObservableProperty] private bool _isDeleted;
|
||||||
|
|
||||||
|
public event Func<AgvBin, bool, Task>? OnDeletedChanged;
|
||||||
|
|
||||||
|
partial void OnIsDeletedChanged(bool value)
|
||||||
|
{
|
||||||
|
// 触发视图模型的保存方法
|
||||||
|
OnDeletedChanged?.Invoke(this, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AgvBin FromEntity(AgvBinEntity entity)
|
||||||
|
{
|
||||||
|
return new AgvBin()
|
||||||
|
{
|
||||||
|
Id = entity.Id,
|
||||||
|
BinCode = entity.BinCode,
|
||||||
|
CtnrCode = entity.CtnrCode,
|
||||||
|
IsDeleted = entity.IsDeleted,
|
||||||
|
Sort = entity.Sort,
|
||||||
|
IsFree = entity.IsFree,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -5,8 +5,24 @@ namespace Seyounth.Hyosung.Data.Models;
|
|||||||
|
|
||||||
public class Pallet : PalletEntity
|
public class Pallet : PalletEntity
|
||||||
{
|
{
|
||||||
public string Name =>
|
public string Name
|
||||||
$"{Type.GetDescription()}({Width}*{Height}*{Length})({HoleCount}|{(IsBigHole != null && IsBigHole.Value ? "大" : "小")})";
|
{
|
||||||
|
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)
|
public static Pallet FromEntity(PalletEntity p)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -12,7 +12,7 @@ public enum PalletType
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 胶合板托盘
|
/// 胶合板托盘
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Description("胶合板")] Plywood = 1,
|
[Description("胶托")] Plywood = 1,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 木板托盘
|
/// 木板托盘
|
||||||
|
|||||||
@ -70,6 +70,8 @@ public class Variety
|
|||||||
|
|
||||||
public double? GrossWeight { get; set; }
|
public double? GrossWeight { get; set; }
|
||||||
|
|
||||||
|
public int LabelColor { get; set; }
|
||||||
|
|
||||||
public static Variety Create(VarietyEntity entity, List<PalletEntity> pallets)
|
public static Variety Create(VarietyEntity entity, List<PalletEntity> pallets)
|
||||||
{
|
{
|
||||||
var variety = new Variety()
|
var variety = new Variety()
|
||||||
@ -101,7 +103,8 @@ public class Variety
|
|||||||
HasBox = entity.HasBox,
|
HasBox = entity.HasBox,
|
||||||
LastNo = entity.LastNo,
|
LastNo = entity.LastNo,
|
||||||
NetWeight = entity.NetWeight,
|
NetWeight = entity.NetWeight,
|
||||||
GrossWeight = entity.GrossWeight
|
GrossWeight = entity.GrossWeight,
|
||||||
|
LabelColor = entity.LabelColor,
|
||||||
};
|
};
|
||||||
if (entity.PaperTrayId != null && entity.PaperTrayId != 0)
|
if (entity.PaperTrayId != null && entity.PaperTrayId != 0)
|
||||||
variety.PaperTray = Pallet.FromEntity(pallets.First(x => x.Id == entity.PaperTrayId));
|
variety.PaperTray = Pallet.FromEntity(pallets.First(x => x.Id == entity.PaperTrayId));
|
||||||
@ -141,7 +144,8 @@ public class Variety
|
|||||||
HasBox = HasBox,
|
HasBox = HasBox,
|
||||||
LastNo = LastNo,
|
LastNo = LastNo,
|
||||||
NetWeight = NetWeight,
|
NetWeight = NetWeight,
|
||||||
GrossWeight = GrossWeight
|
GrossWeight = GrossWeight,
|
||||||
|
LabelColor = LabelColor,
|
||||||
};
|
};
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -50,13 +50,13 @@ public static class ServiceExtensions
|
|||||||
|
|
||||||
public static void UseHyosungData(this IServiceProvider provider)
|
public static void UseHyosungData(this IServiceProvider provider)
|
||||||
{
|
{
|
||||||
//var db = provider.GetRequiredService<ISqlSugarClient>();
|
var db = provider.GetRequiredService<ISqlSugarClient>();
|
||||||
//db.DbMaintenance.CreateDatabase();
|
db.DbMaintenance.CreateDatabase();
|
||||||
//db.CodeFirst.InitTables(typeof(VarietyEntity),
|
db.CodeFirst.InitTables(typeof(VarietyEntity),
|
||||||
// typeof(PalletEntity),
|
typeof(PalletEntity),
|
||||||
// typeof(ScannedYarnEntity),
|
typeof(ScannedYarnEntity),
|
||||||
// typeof(TrayEntity),
|
typeof(TrayEntity),
|
||||||
// typeof(AgvBinEntity),
|
typeof(AgvBinEntity),
|
||||||
// typeof(DictEntity));
|
typeof(DictEntity));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6,7 +6,7 @@ namespace Seyounth.Hyosung.Data.Services;
|
|||||||
|
|
||||||
public class AgvBinService : IAgvBinService
|
public class AgvBinService : IAgvBinService
|
||||||
{
|
{
|
||||||
private readonly List<AgvBinEntity> _cache;
|
// private readonly List<AgvBinEntity> _cache;
|
||||||
|
|
||||||
private readonly IRepository<AgvBinEntity> _repository;
|
private readonly IRepository<AgvBinEntity> _repository;
|
||||||
|
|
||||||
@ -14,21 +14,27 @@ public class AgvBinService : IAgvBinService
|
|||||||
{
|
{
|
||||||
_repository = provider.CreateScope().ServiceProvider.GetRequiredService<IRepository<AgvBinEntity>>();
|
_repository = provider.CreateScope().ServiceProvider.GetRequiredService<IRepository<AgvBinEntity>>();
|
||||||
//_repository = provider.GetService<IRepository<AgvBinEntity>>();
|
//_repository = provider.GetService<IRepository<AgvBinEntity>>();
|
||||||
_cache = _repository.GetList();
|
// _cache = _repository.GetList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<AgvBinEntity> GetAvailableBin(int height)
|
public async Task<AgvBinEntity> GetAvailableBin(int height)
|
||||||
{
|
{
|
||||||
var bin = await _repository.CopyNew().AsQueryable()
|
var bin = await _repository.CopyNew().AsQueryable()
|
||||||
.Where(x => x.IsFree && !x.IsDeleted).OrderBy(x => x.Sort).FirstAsync();
|
.Where(x => x.IsFree && !x.IsDeleted).OrderBy(x => x.Sort).FirstAsync();
|
||||||
if (bin.BinCode == "B10")
|
var maxRackType1 = await _repository.CopyNew().AsQueryable()
|
||||||
|
.Where(x => x.RackType == 1)
|
||||||
|
.MaxAsync(r => r.Sort);
|
||||||
|
var maxRackType2 = await _repository.CopyNew().AsQueryable()
|
||||||
|
.Where(x => x.RackType == 2)
|
||||||
|
.MaxAsync(r => r.Sort);
|
||||||
|
if (bin.Sort == maxRackType1)
|
||||||
{
|
{
|
||||||
await _repository.CopyNew().AsUpdateable()
|
await _repository.CopyNew().AsUpdateable()
|
||||||
.Where(x => x.RackType == 2 && !x.IsDeleted)
|
.Where(x => x.RackType == 2 && !x.IsDeleted)
|
||||||
.SetColumns(x => x.IsFree, true)
|
.SetColumns(x => x.IsFree, true)
|
||||||
.ExecuteCommandAsync();
|
.ExecuteCommandAsync();
|
||||||
}
|
}
|
||||||
else if (bin.BinCode == "B33")
|
else if (bin.Sort == maxRackType2)
|
||||||
{
|
{
|
||||||
await _repository.CopyNew().AsUpdateable()
|
await _repository.CopyNew().AsUpdateable()
|
||||||
.Where(x => x.RackType == 1 && !x.IsDeleted)
|
.Where(x => x.RackType == 1 && !x.IsDeleted)
|
||||||
@ -41,8 +47,22 @@ public class AgvBinService : IAgvBinService
|
|||||||
|
|
||||||
public Task BindAsync(AgvBinEntity entity)
|
public Task BindAsync(AgvBinEntity entity)
|
||||||
{
|
{
|
||||||
entity.IsFree = false;
|
// entity.IsFree = false;
|
||||||
_cache.First(e => e.Id == entity.Id).IsFree = false;
|
// _cache.First(e => e.Id == entity.Id).IsFree = false;
|
||||||
return _repository.CopyNew().UpdateAsync(entity);
|
return _repository.CopyNew().UpdateAsync(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<List<AgvBinEntity>> GetAllAsync()
|
||||||
|
{
|
||||||
|
var rs = await _repository.CopyNew().GetListAsync();
|
||||||
|
return rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task ChangeDeletedStatus(int id, bool isDeleted)
|
||||||
|
{
|
||||||
|
await _repository.CopyNew().AsUpdateable()
|
||||||
|
.Where(x => x.Id == id)
|
||||||
|
.SetColumns(x => x.IsDeleted, isDeleted)
|
||||||
|
.ExecuteCommandAsync();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -33,7 +33,8 @@ public class DictService : IDictService
|
|||||||
public async Task SetValue(string type, string key, string value)
|
public async Task SetValue(string type, string key, string value)
|
||||||
{
|
{
|
||||||
await _repository.CopyNew().AsUpdateable()
|
await _repository.CopyNew().AsUpdateable()
|
||||||
.Where(x => x.Type == type && x.Key == key).SetColumns(x => x.Value, value).ExecuteCommandAsync(); ;
|
.Where(x => x.Type == type && x.Key == key).SetColumns(x => x.Value, value).ExecuteCommandAsync();
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<string> GetValue(string type, string key)
|
public async Task<string> GetValue(string type, string key)
|
||||||
@ -41,4 +42,20 @@ public class DictService : IDictService
|
|||||||
var dict = await _repository.CopyNew().GetFirstAsync(x => x.Type == type && x.Key == key);
|
var dict = await _repository.CopyNew().GetFirstAsync(x => x.Type == type && x.Key == key);
|
||||||
return dict.Value;
|
return dict.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<string> GetOrAddNewValue(string type, string key, string defaultValue = "")
|
||||||
|
{
|
||||||
|
var newRepo = _repository.CopyNew();
|
||||||
|
var dict = await newRepo.GetFirstAsync(x => x.Type == type && x.Key == key);
|
||||||
|
if (dict is null)
|
||||||
|
{
|
||||||
|
dict = new DictEntity();
|
||||||
|
dict.Type = type;
|
||||||
|
dict.Key = key;
|
||||||
|
dict.Value = defaultValue;
|
||||||
|
await newRepo.InsertAsync(dict);
|
||||||
|
}
|
||||||
|
|
||||||
|
return dict.Value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -33,7 +33,7 @@ public class LabelResult
|
|||||||
|
|
||||||
public string COMMON_S3 { get; set; } = "";
|
public string COMMON_S3 { get; set; } = "";
|
||||||
public string COMMON_S4 { get; set; } = "";
|
public string COMMON_S4 { get; set; } = "";
|
||||||
public string COMMON_S5 { get; set; } = "";
|
public string COMMON_S5 { get; set; } = "0";
|
||||||
|
|
||||||
//public string COMMON_S4 { get; set; } = "";
|
//public string COMMON_S4 { get; set; } = "";
|
||||||
//public string COMMON_S5 { get; set; } = "";
|
//public string COMMON_S5 { get; set; } = "";
|
||||||
@ -46,6 +46,8 @@ public class LabelResult
|
|||||||
|
|
||||||
public double COMMON_N1 { get; set; } = 0;
|
public double COMMON_N1 { get; set; } = 0;
|
||||||
|
|
||||||
|
public string TRI_INTERFACE_YN { get; set; } = "N";
|
||||||
|
|
||||||
public LabelResult(Tray tray, Variety variety)
|
public LabelResult(Tray tray, Variety variety)
|
||||||
{
|
{
|
||||||
LABEL_ID = tray.TrayCode;
|
LABEL_ID = tray.TrayCode;
|
||||||
|
|||||||
@ -0,0 +1,17 @@
|
|||||||
|
namespace Seyounth.Hyosung.Data.Services.Hyosung.Entities;
|
||||||
|
|
||||||
|
[SqlSugar.SugarTable("PDA_PUTAWAY")]
|
||||||
|
public class PDA_PUTAWAY
|
||||||
|
{
|
||||||
|
public string BE_ID { get; set; }
|
||||||
|
public string BARCODE_TYPE { get; set; }
|
||||||
|
public string BAR_CODE { get; set; }
|
||||||
|
public DateTime SCAN_DATE { get; set; }
|
||||||
|
public string ISSUE_FLAG { get; set; }
|
||||||
|
public string SCAN_TYPE { get; set; }
|
||||||
|
public string PALLET_NO { get; set; }
|
||||||
|
public string LOCATION { get; set; }
|
||||||
|
public string PDA_USER_ID { get; set; }
|
||||||
|
public string CREATED_BY { get; set; }
|
||||||
|
public string STATUS { get; set; }
|
||||||
|
}
|
||||||
@ -102,10 +102,30 @@ public class HyosungWmsService : IHyosungWmsService
|
|||||||
.FirstAsync(v => v.ITEM_CODE == result.ITEM_CODE);
|
.FirstAsync(v => v.ITEM_CODE == result.ITEM_CODE);
|
||||||
result.MFG_LINE = (workCenter?.WORK_CENTER) ?? "TYJP11";
|
result.MFG_LINE = (workCenter?.WORK_CENTER) ?? "TYJP11";
|
||||||
await _db.Insertable(result).ExecuteCommandAsync();
|
await _db.Insertable(result).ExecuteCommandAsync();
|
||||||
}catch(Exception e)
|
}
|
||||||
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task AddPdaPutawayRecord(string barcode)
|
||||||
|
{
|
||||||
|
await _db.Insertable(new PDA_PUTAWAY
|
||||||
|
{
|
||||||
|
BE_ID = "2240",
|
||||||
|
BARCODE_TYPE = "1111111",
|
||||||
|
BAR_CODE = barcode,
|
||||||
|
SCAN_DATE = DateTime.Now,
|
||||||
|
ISSUE_FLAG = "N",
|
||||||
|
SCAN_TYPE = "",
|
||||||
|
PALLET_NO = "",
|
||||||
|
LOCATION = "",
|
||||||
|
PDA_USER_ID = "TY_ACP",
|
||||||
|
CREATED_BY = "seyounth",
|
||||||
|
STATUS = "R"
|
||||||
|
}).ExecuteCommandAsync();
|
||||||
|
//await _db.Updateable<LabelResult>()
|
||||||
|
// .Where(x => x.BAR_CODE == barcode)
|
||||||
|
// .SetColumns(x => x.TRI_INTERFACE_YN, "Y").ExecuteCommandAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -14,4 +14,6 @@ public interface IHyosungWmsService
|
|||||||
Task<LabelResult> GetLabelResult(string itemCode, string lot, int controlNo);
|
Task<LabelResult> GetLabelResult(string itemCode, string lot, int controlNo);
|
||||||
|
|
||||||
Task AddLabelResult(LabelResult result);
|
Task AddLabelResult(LabelResult result);
|
||||||
|
|
||||||
|
Task AddPdaPutawayRecord(string barcode);
|
||||||
}
|
}
|
||||||
@ -18,4 +18,8 @@ public interface IAgvBinService
|
|||||||
/// <param name="entity"></param>
|
/// <param name="entity"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task BindAsync(AgvBinEntity entity);
|
Task BindAsync(AgvBinEntity entity);
|
||||||
|
|
||||||
|
Task<List<AgvBinEntity>> GetAllAsync();
|
||||||
|
|
||||||
|
Task ChangeDeletedStatus(int id,bool isDeleted);
|
||||||
}
|
}
|
||||||
@ -11,4 +11,6 @@ public interface IDictService
|
|||||||
Task SetValue(string type, string key,string value);
|
Task SetValue(string type, string key,string value);
|
||||||
|
|
||||||
Task<string> GetValue(string type, string key);
|
Task<string> GetValue(string type, string key);
|
||||||
|
|
||||||
|
Task<string> GetOrAddNewValue(string type, string key, string defaultValue = "");
|
||||||
}
|
}
|
||||||
@ -49,14 +49,23 @@ public class VarietyService : IVarietyService
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var entity = await _varietyRepository.InsertReturnEntityAsync(variety.ToEntity());
|
var entity = _varietiesCache.FirstOrDefault(p => p.Id == variety.Id);
|
||||||
|
if (entity == null)
|
||||||
|
{
|
||||||
|
entity = await _varietyRepository.InsertReturnEntityAsync(variety.ToEntity());
|
||||||
_varietiesCache.Add(entity);
|
_varietiesCache.Add(entity);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
entity = variety.ToEntity();
|
||||||
|
await _varietyRepository.UpdateAsync(entity);
|
||||||
|
_varietiesCache[_varietiesCache.IndexOf(entity)] = entity;
|
||||||
|
}
|
||||||
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Console.WriteLine(e.Message);
|
Console.WriteLine(e.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UpdateVarietyAsync(Variety variety)
|
public async Task UpdateVarietyAsync(Variety variety)
|
||||||
@ -99,5 +108,10 @@ public class VarietyService : IVarietyService
|
|||||||
.Where(x => x.Id == varietyId)
|
.Where(x => x.Id == varietyId)
|
||||||
.SetColumns(x => x.LastNo, lastNo)
|
.SetColumns(x => x.LastNo, lastNo)
|
||||||
.ExecuteCommandAsync();
|
.ExecuteCommandAsync();
|
||||||
|
var variety = _varietiesCache.FirstOrDefault(x => x.Id == varietyId);
|
||||||
|
if (variety != null)
|
||||||
|
{
|
||||||
|
variety.LastNo = lastNo;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -36,6 +36,8 @@ public class HyosungRuntime(
|
|||||||
|
|
||||||
private string currentPrintTrayCode = "";
|
private string currentPrintTrayCode = "";
|
||||||
|
|
||||||
|
private bool _isSendToErp = false;
|
||||||
|
|
||||||
public async Task StartAsync(CancellationToken token)
|
public async Task StartAsync(CancellationToken token)
|
||||||
{
|
{
|
||||||
reportExportService.ExportNoExportAsync();
|
reportExportService.ExportNoExportAsync();
|
||||||
@ -52,6 +54,7 @@ public class HyosungRuntime(
|
|||||||
hyosungPlcService.OnRequestPrintLabel += OnPlcRequestPrintLabel;
|
hyosungPlcService.OnRequestPrintLabel += OnPlcRequestPrintLabel;
|
||||||
hyosungPlcService.OnRequestGetPrintLableOption += OnRequestGetPrintLabel;
|
hyosungPlcService.OnRequestGetPrintLableOption += OnRequestGetPrintLabel;
|
||||||
hyosungPlcService.OnRequestScanEntry += OnPlcRequestScanEntry;
|
hyosungPlcService.OnRequestScanEntry += OnPlcRequestScanEntry;
|
||||||
|
_isSendToErp = bool.Parse(dictService.GetOrAddNewValue("system", "IsSendToErp", "true").Result);
|
||||||
await hyosungPlcService.StartAsync(token);
|
await hyosungPlcService.StartAsync(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,10 +124,20 @@ public class HyosungRuntime(
|
|||||||
var trays = await trayService.GetTodayTrayAsync();
|
var trays = await trayService.GetTodayTrayAsync();
|
||||||
foreach (var tray in trays)
|
foreach (var tray in trays)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool GetIsSendToErp()
|
||||||
|
{
|
||||||
|
return _isSendToErp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task SetIsSendToErp(bool isSendToErp)
|
||||||
|
{
|
||||||
|
_isSendToErp = isSendToErp;
|
||||||
|
await dictService.SetValue("system", "IsSendToErp", isSendToErp.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 处理PLC请求扫描治具事件
|
/// 处理PLC请求扫描治具事件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -208,6 +221,9 @@ public class HyosungRuntime(
|
|||||||
await hyosungAgvService.StorageAsync(info.TrayCode);
|
await hyosungAgvService.StorageAsync(info.TrayCode);
|
||||||
//标志下线已完成
|
//标志下线已完成
|
||||||
await hyosungPlcService.LeaveCompletedAsync();
|
await hyosungPlcService.LeaveCompletedAsync();
|
||||||
|
var tray = await trayService.GetByCode(info.TrayCode);
|
||||||
|
if (_isSendToErp)
|
||||||
|
await hyosungWmsService.AddPdaPutawayRecord(tray.Barcode);
|
||||||
logger.LogInformation($"plc leaving production line success");
|
logger.LogInformation($"plc leaving production line success");
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
@ -372,28 +388,16 @@ public class HyosungRuntime(
|
|||||||
var tray = await trayService.GetByCode(arg);
|
var tray = await trayService.GetByCode(arg);
|
||||||
var variety = await varietyService.GetById(tray.VarietyId);
|
var variety = await varietyService.GetById(tray.VarietyId);
|
||||||
var mod = await hyosungWmsService.GetItemInfoByItemCode(variety.Code);
|
var mod = await hyosungWmsService.GetItemInfoByItemCode(variety.Code);
|
||||||
// var grade = "1";
|
_ = await trayService.PrintTrayAsync(arg, mod, variety);
|
||||||
// if (mod.GRADE != "AA") grade = mod.GRADE;
|
|
||||||
// int? controlNo;
|
|
||||||
// if (tray.ControlNo is null || tray.ControlNo == 0)
|
|
||||||
// {
|
|
||||||
// controlNo = await varietyService.GetLastNo(variety.Id);
|
|
||||||
// if (controlNo is null)
|
|
||||||
// controlNo = await hyosungWmsService.GetControlNo(variety, grade);
|
|
||||||
// else
|
|
||||||
// controlNo += 1;
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
tray = await trayService.PrintTrayAsync(arg, mod, variety);
|
|
||||||
await dictService.SetValue("System", "CurrentPackingTrayCode", arg);
|
await dictService.SetValue("System", "CurrentPackingTrayCode", arg);
|
||||||
await hyosungPlcService.WritePrintLableOptionsAsync(variety.MasterLabelCount, variety.SubLabelCount);
|
await hyosungPlcService.WritePrintLabelOptionsAsync(variety.MasterLabelCount, variety.SubLabelCount,
|
||||||
|
variety.LabelColor, _isSendToErp);
|
||||||
logger.LogInformation("request print option succeed");
|
logger.LogInformation("request print option succeed");
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
logger.LogError(e, "GetPrintOptionError");
|
logger.LogError(e, "GetPrintOptionError");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -415,19 +419,19 @@ public class HyosungRuntime(
|
|||||||
{
|
{
|
||||||
if (arg1 == 1)
|
if (arg1 == 1)
|
||||||
{
|
{
|
||||||
await printer.PrintAsync(1, tray.TrayCode);
|
await printer.PrintSubLabelAsync(tray.TrayCode);
|
||||||
await hyosungPlcService.WritePrintLabelResultAsync(arg1, true);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
await printer.PrintAsync(2, tray.TrayCode);
|
//if (arg1 == 3)
|
||||||
await hyosungPlcService.WritePrintLabelResultAsync(arg1, true);
|
// arg1 = 2;
|
||||||
var version=await hyosungWmsService.GetItemInfoByItemCode(variety.Code);
|
await printer.PrintMasterLabelAsync(arg1 - 1, tray.TrayCode);
|
||||||
// await varietyService.SetLastNo(variety.Id, tray.ControlNo.Value);
|
if (_isSendToErp)
|
||||||
//await hyosungWmsService.UpdateControlNo(variety, tray.ControlNo.Value);
|
await hyosungWmsService.AddLabelResult(new LabelResult(tray, variety));
|
||||||
// await hyosungWmsService.AddLabelResult(new LabelResult(tray, variety));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await hyosungPlcService.WritePrintLabelResultAsync(arg1, true);
|
||||||
|
|
||||||
logger.LogInformation($"plc request print label success");
|
logger.LogInformation($"plc request print label success");
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|||||||
@ -38,4 +38,8 @@ public interface IHyosungRuntime
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task GenerateReportAsync();
|
Task GenerateReportAsync();
|
||||||
|
|
||||||
|
bool GetIsSendToErp();
|
||||||
|
|
||||||
|
Task SetIsSendToErp(bool isSendToErp);
|
||||||
}
|
}
|
||||||
17
Seyounth.Hyosung.UI/App.xaml
Normal file
17
Seyounth.Hyosung.UI/App.xaml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<Application
|
||||||
|
x:Class="Seyounth.Hyosung.UI.App"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
|
||||||
|
DispatcherUnhandledException="OnDispatcherUnhandledException"
|
||||||
|
Exit="OnExit"
|
||||||
|
Startup="OnStartup">
|
||||||
|
<Application.Resources>
|
||||||
|
<ResourceDictionary>
|
||||||
|
<ResourceDictionary.MergedDictionaries>
|
||||||
|
<ui:ThemesDictionary Theme="Light" />
|
||||||
|
<ui:ControlsDictionary />
|
||||||
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
</ResourceDictionary>
|
||||||
|
</Application.Resources>
|
||||||
|
</Application>
|
||||||
110
Seyounth.Hyosung.UI/App.xaml.cs
Normal file
110
Seyounth.Hyosung.UI/App.xaml.cs
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
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.Media;
|
||||||
|
using System.Windows.Media.Animation;
|
||||||
|
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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Interaction logic for App.xaml
|
||||||
|
/// </summary>
|
||||||
|
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<PrintTemp>(builder.Configuration.GetSection("Print"));
|
||||||
|
builder.Services.AddHostedService<ApplicationHostService>();
|
||||||
|
|
||||||
|
// Page resolver service
|
||||||
|
builder.Services.AddSingleton<IPageService, PageService>();
|
||||||
|
builder.Services.AddSingleton<ISnackbarService, SnackbarService>();
|
||||||
|
// Theme manipulation
|
||||||
|
builder.Services.AddSingleton<IThemeService, ThemeService>();
|
||||||
|
|
||||||
|
// TaskBar manipulation
|
||||||
|
builder.Services.AddSingleton<ITaskBarService, TaskBarService>();
|
||||||
|
|
||||||
|
// Service containing navigation, same as INavigationWindow... but without window
|
||||||
|
builder.Services.AddSingleton<INavigationService, NavigationService>();
|
||||||
|
|
||||||
|
// Main window with navigation
|
||||||
|
builder.Services.AddSingleton<INavigationWindow, MainWindow>();
|
||||||
|
builder.Services.AddSingleton<MainWindowViewModel>();
|
||||||
|
|
||||||
|
builder.Services.AddSingleton<DashboardPage>();
|
||||||
|
builder.Services.AddSingleton<DashboardViewModel>();
|
||||||
|
builder.Services.AddSingleton<DataPage>();
|
||||||
|
builder.Services.AddSingleton<DataViewModel>();
|
||||||
|
builder.Services.AddSingleton<SettingsPage>();
|
||||||
|
builder.Services.AddSingleton<SettingsViewModel>();
|
||||||
|
builder.Services.AddSingleton<PalletManagementPage>();
|
||||||
|
builder.Services.AddSingleton<PalletManagementViewModel>();
|
||||||
|
builder.Services.AddSingleton<AgvBinPage>();
|
||||||
|
builder.Services.AddSingleton<AgvBinViewModel>();
|
||||||
|
builder.Services.AddHyosung(builder.Configuration);
|
||||||
|
_host = builder.Build();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets registered service.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Type of the service to get.</typeparam>
|
||||||
|
/// <returns>Instance of the service or <see langword="null"/>.</returns>
|
||||||
|
public static T GetService<T>()
|
||||||
|
where T : class
|
||||||
|
{
|
||||||
|
return _host.Services.GetService(typeof(T)) as T;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Occurs when the application is loading.
|
||||||
|
/// </summary>
|
||||||
|
private void OnStartup(object sender, StartupEventArgs e)
|
||||||
|
{
|
||||||
|
RenderOptions.ProcessRenderMode = System.Windows.Interop.RenderMode.Default;
|
||||||
|
_host.Services.UseHyosung();
|
||||||
|
_host.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Occurs when the application is closing.
|
||||||
|
/// </summary>
|
||||||
|
private async void OnExit(object sender, ExitEventArgs e)
|
||||||
|
{
|
||||||
|
await _host.StopAsync();
|
||||||
|
|
||||||
|
_host.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Occurs when an exception is thrown by an application but not handled.
|
||||||
|
/// </summary>
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
10
Seyounth.Hyosung.UI/AssemblyInfo.cs
Normal file
10
Seyounth.Hyosung.UI/AssemblyInfo.cs
Normal file
@ -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)
|
||||||
|
)]
|
||||||
BIN
Seyounth.Hyosung.UI/Assets/agv.png
Normal file
BIN
Seyounth.Hyosung.UI/Assets/agv.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 704 KiB |
BIN
Seyounth.Hyosung.UI/Assets/wpfui-icon-1024.png
Normal file
BIN
Seyounth.Hyosung.UI/Assets/wpfui-icon-1024.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 10 KiB |
BIN
Seyounth.Hyosung.UI/Assets/wpfui-icon-256.png
Normal file
BIN
Seyounth.Hyosung.UI/Assets/wpfui-icon-256.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.3 KiB |
21
Seyounth.Hyosung.UI/Helpers/EnumBindingSourceExtension.cs
Normal file
21
Seyounth.Hyosung.UI/Helpers/EnumBindingSourceExtension.cs
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
23
Seyounth.Hyosung.UI/Helpers/EnumDescriptionConverter.cs
Normal file
23
Seyounth.Hyosung.UI/Helpers/EnumDescriptionConverter.cs
Normal file
@ -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<DescriptionAttribute>();
|
||||||
|
return attr?.Description ?? value.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
36
Seyounth.Hyosung.UI/Helpers/EnumToBooleanConverter.cs
Normal file
36
Seyounth.Hyosung.UI/Helpers/EnumToBooleanConverter.cs
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
Seyounth.Hyosung.UI/Models/AppConfig.cs
Normal file
9
Seyounth.Hyosung.UI/Models/AppConfig.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
namespace Seyounth.Hyosung.UI.Models
|
||||||
|
{
|
||||||
|
public class AppConfig
|
||||||
|
{
|
||||||
|
public string ConfigurationsFolder { get; set; }
|
||||||
|
|
||||||
|
public string AppPropertiesFileName { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
9
Seyounth.Hyosung.UI/Models/DataColor.cs
Normal file
9
Seyounth.Hyosung.UI/Models/DataColor.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
using System.Windows.Media;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.UI.Models
|
||||||
|
{
|
||||||
|
public struct DataColor
|
||||||
|
{
|
||||||
|
public Brush Color { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
6
Seyounth.Hyosung.UI/Resources/Translations.cs
Normal file
6
Seyounth.Hyosung.UI/Resources/Translations.cs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
namespace Seyounth.Hyosung.UI.Resources
|
||||||
|
{
|
||||||
|
public partial class Translations
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
59
Seyounth.Hyosung.UI/Services/ApplicationHostService.cs
Normal file
59
Seyounth.Hyosung.UI/Services/ApplicationHostService.cs
Normal file
@ -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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Managed host of the application.
|
||||||
|
/// </summary>
|
||||||
|
public class ApplicationHostService : IHostedService
|
||||||
|
{
|
||||||
|
private readonly IServiceProvider _serviceProvider;
|
||||||
|
|
||||||
|
private INavigationWindow _navigationWindow;
|
||||||
|
|
||||||
|
public ApplicationHostService(IServiceProvider serviceProvider)
|
||||||
|
{
|
||||||
|
_serviceProvider = serviceProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Triggered when the application host is ready to start the service.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="cancellationToken">Indicates that the start process has been aborted.</param>
|
||||||
|
public async Task StartAsync(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
await HandleActivationAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Triggered when the application host is performing a graceful shutdown.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="cancellationToken">Indicates that the shutdown process should no longer be graceful.</param>
|
||||||
|
public async Task StopAsync(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates main window during activation.
|
||||||
|
/// </summary>
|
||||||
|
private async Task HandleActivationAsync()
|
||||||
|
{
|
||||||
|
if (!Application.Current.Windows.OfType<MainWindow>().Any())
|
||||||
|
{
|
||||||
|
_navigationWindow = (
|
||||||
|
_serviceProvider.GetService(typeof(INavigationWindow)) as INavigationWindow
|
||||||
|
)!;
|
||||||
|
_navigationWindow!.ShowWindow();
|
||||||
|
|
||||||
|
_navigationWindow.Navigate(typeof(Views.Pages.DashboardPage));
|
||||||
|
}
|
||||||
|
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
42
Seyounth.Hyosung.UI/Services/PageService.cs
Normal file
42
Seyounth.Hyosung.UI/Services/PageService.cs
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
using Wpf.Ui;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.UI.Services
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Service that provides pages for navigation.
|
||||||
|
/// </summary>
|
||||||
|
public class PageService : IPageService
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Service which provides the instances of pages.
|
||||||
|
/// </summary>
|
||||||
|
private readonly IServiceProvider _serviceProvider;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates new instance and attaches the <see cref="IServiceProvider"/>.
|
||||||
|
/// </summary>
|
||||||
|
public PageService(IServiceProvider serviceProvider)
|
||||||
|
{
|
||||||
|
_serviceProvider = serviceProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public T? GetPage<T>()
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
46
Seyounth.Hyosung.UI/Seyounth.Hyosung.UI.csproj
Normal file
46
Seyounth.Hyosung.UI/Seyounth.Hyosung.UI.csproj
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>WinExe</OutputType>
|
||||||
|
<TargetFramework>net8.0-windows</TargetFramework>
|
||||||
|
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||||
|
<ApplicationIcon>wpfui-icon.ico</ApplicationIcon>
|
||||||
|
<UseWPF>true</UseWPF>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="wpfui-icon.ico" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" />
|
||||||
|
<PackageReference Include="WPF-UI" Version="3.0.4" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
|
||||||
|
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Remove="Assets\wpfui-icon-256.png" />
|
||||||
|
<None Remove="Assets\wpfui-icon-1024.png" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Resource Include="Assets\agv.png" />
|
||||||
|
<Resource Include="Assets\wpfui-icon-256.png" />
|
||||||
|
<Resource Include="Assets\wpfui-icon-1024.png" />
|
||||||
|
<None Remove="Resources\1744195034778.png" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Seyounth.Hyosung.Runtime\Seyounth.Hyosung.Runtime.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Update="appsettings.json">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
4
Seyounth.Hyosung.UI/Usings.cs
Normal file
4
Seyounth.Hyosung.UI/Usings.cs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
global using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
global using CommunityToolkit.Mvvm.Input;
|
||||||
|
global using System;
|
||||||
|
global using System.Windows;
|
||||||
14
Seyounth.Hyosung.UI/ViewModels/Pages/AgvBinViewModel.cs
Normal file
14
Seyounth.Hyosung.UI/ViewModels/Pages/AgvBinViewModel.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
using Wpf.Ui.Controls;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.UI.ViewModels.Pages;
|
||||||
|
|
||||||
|
public partial class AgvBinViewModel : ObservableObject, INavigationAware
|
||||||
|
{
|
||||||
|
public void OnNavigatedTo()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnNavigatedFrom()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
100
Seyounth.Hyosung.UI/ViewModels/Pages/DashboardViewModel.cs
Normal file
100
Seyounth.Hyosung.UI/ViewModels/Pages/DashboardViewModel.cs
Normal file
@ -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<Variety> _varieties;
|
||||||
|
|
||||||
|
[ObservableProperty] private Variety _selectedVariety;
|
||||||
|
|
||||||
|
[ObservableProperty] private List<string> _yarnCarTypes;
|
||||||
|
|
||||||
|
[ObservableProperty] private List<string> _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<Variety>(varietyService.GetAll());
|
||||||
|
|
||||||
|
YarnCarTypes =
|
||||||
|
[
|
||||||
|
"A",
|
||||||
|
"B",
|
||||||
|
"C",
|
||||||
|
"D"
|
||||||
|
];
|
||||||
|
|
||||||
|
YarnCarSideType =
|
||||||
|
[
|
||||||
|
"正面",
|
||||||
|
"反面"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnNavigatedTo()
|
||||||
|
{
|
||||||
|
Varieties = new ObservableCollection<Variety>(_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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
100
Seyounth.Hyosung.UI/ViewModels/Pages/DataViewModel.cs
Normal file
100
Seyounth.Hyosung.UI/ViewModels/Pages/DataViewModel.cs
Normal file
@ -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<Variety> _varieties;
|
||||||
|
|
||||||
|
[ObservableProperty] private ObservableCollection<Pallet> _pallets;
|
||||||
|
|
||||||
|
[ObservableProperty] private ObservableCollection<Pallet> _honeyPallets = new();
|
||||||
|
|
||||||
|
[ObservableProperty] private ObservableCollection<Pallet> _paperPallets = new();
|
||||||
|
|
||||||
|
[ObservableProperty] private ObservableCollection<Pallet> _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<Pallet>(_palletService.GetPallets());
|
||||||
|
HoneyPallets = new ObservableCollection<Pallet>(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<Pallet>(papers);
|
||||||
|
Trays = new ObservableCollection<Pallet>(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<Variety>(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<Pallet>(_palletService.GetPallets());
|
||||||
|
}
|
||||||
|
|
||||||
|
WeakReferenceMessenger.Default.Send(new SavePalletCompletedMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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<Pallet> _pallets = [];
|
||||||
|
private readonly IPalletService _palletService;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public PalletManagementViewModel(IPalletService palletService)
|
||||||
|
{
|
||||||
|
_palletService = palletService;
|
||||||
|
Pallets = new ObservableCollection<Pallet>(_palletService.GetPallets());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnNavigatedTo()
|
||||||
|
{
|
||||||
|
Pallets = new ObservableCollection<Pallet>(_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<Pallet>(_palletService.GetPallets());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
_palletService.UpdatePalletAsync(pallet);
|
||||||
|
}
|
||||||
|
|
||||||
|
WeakReferenceMessenger.Default.Send(new SavePalletCompletedMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
63
Seyounth.Hyosung.UI/ViewModels/Pages/SettingsViewModel.cs
Normal file
63
Seyounth.Hyosung.UI/ViewModels/Pages/SettingsViewModel.cs
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,65 @@
|
|||||||
|
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<object> _menuItems = new()
|
||||||
|
{
|
||||||
|
new NavigationViewItem()
|
||||||
|
{
|
||||||
|
Content = "主页",
|
||||||
|
Icon = new SymbolIcon { Symbol = SymbolRegular.Home24 },
|
||||||
|
TargetPageType = typeof(Views.Pages.DashboardPage)
|
||||||
|
},
|
||||||
|
new NavigationViewItem()
|
||||||
|
{
|
||||||
|
Content = "产品管理",
|
||||||
|
Icon = new SymbolIcon { Symbol = SymbolRegular.Production24 },
|
||||||
|
TargetPageType = typeof(Views.Pages.DataPage)
|
||||||
|
},
|
||||||
|
new NavigationViewItem()
|
||||||
|
{
|
||||||
|
Content = "辅料管理",
|
||||||
|
Icon = new SymbolIcon { Symbol = SymbolRegular.Production24 },
|
||||||
|
TargetPageType = typeof(Views.Pages.PalletManagementPage)
|
||||||
|
},
|
||||||
|
new NavigationViewItem()
|
||||||
|
{
|
||||||
|
Content = "标签管理",
|
||||||
|
Icon = new SymbolIcon { Symbol = SymbolRegular.Print24 },
|
||||||
|
TargetPageType = typeof(Views.Pages.DataPage)
|
||||||
|
},
|
||||||
|
new NavigationViewItem()
|
||||||
|
{
|
||||||
|
Content = "入库管理",
|
||||||
|
Icon = new SymbolIcon { Symbol = SymbolRegular.DataHistogram24 },
|
||||||
|
TargetPageType = typeof(Views.Pages.DataPage)
|
||||||
|
},
|
||||||
|
new NavigationViewItem()
|
||||||
|
{
|
||||||
|
Content = "AGV库位管理",
|
||||||
|
Icon = new SymbolIcon { Symbol = SymbolRegular.DataHistogram24 },
|
||||||
|
TargetPageType = typeof(Views.Pages.AgvBinPage)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
[ObservableProperty] private ObservableCollection<object> _footerMenuItems = new()
|
||||||
|
{
|
||||||
|
new NavigationViewItem()
|
||||||
|
{
|
||||||
|
Content = "Settings",
|
||||||
|
Icon = new SymbolIcon { Symbol = SymbolRegular.Settings24 },
|
||||||
|
TargetPageType = typeof(Views.Pages.SettingsPage)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
[ObservableProperty] private ObservableCollection<MenuItem> _trayMenuItems = new()
|
||||||
|
{
|
||||||
|
new MenuItem { Header = "Home", Tag = "tray_home" }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
20
Seyounth.Hyosung.UI/Views/Pages/AgvBinPage.xaml
Normal file
20
Seyounth.Hyosung.UI/Views/Pages/AgvBinPage.xaml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<Page x:Class="Seyounth.Hyosung.UI.Views.Pages.AgvBinPage"
|
||||||
|
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:Seyounth.Hyosung.UI.Views.Pages"
|
||||||
|
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
|
||||||
|
d:DataContext="{d:DesignInstance local:AgvBinPage,
|
||||||
|
IsDesignTimeCreatable=False}"
|
||||||
|
d:DesignHeight="800"
|
||||||
|
d:DesignWidth="1200"
|
||||||
|
ui:Design.Background="{DynamicResource ApplicationBackgroundBrush}"
|
||||||
|
ui:Design.Foreground="{DynamicResource TextFillColorPrimaryBrush}"
|
||||||
|
Foreground="{DynamicResource TextFillColorPrimaryBrush}"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
<!-- 更多线路 -->
|
||||||
|
<Page.Background>
|
||||||
|
<ImageBrush ImageSource="pack://application:,,,/Assets/agv.png"/>
|
||||||
|
</Page.Background>
|
||||||
|
</Page>
|
||||||
16
Seyounth.Hyosung.UI/Views/Pages/AgvBinPage.xaml.cs
Normal file
16
Seyounth.Hyosung.UI/Views/Pages/AgvBinPage.xaml.cs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
using System.Windows.Controls;
|
||||||
|
using Seyounth.Hyosung.UI.ViewModels.Pages;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.UI.Views.Pages;
|
||||||
|
|
||||||
|
public partial class AgvBinPage : Page
|
||||||
|
{
|
||||||
|
public AgvBinViewModel ViewModel { get; }
|
||||||
|
|
||||||
|
public AgvBinPage(AgvBinViewModel viewModel)
|
||||||
|
{
|
||||||
|
ViewModel = viewModel;
|
||||||
|
DataContext = this;
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
102
Seyounth.Hyosung.UI/Views/Pages/DashboardPage.xaml
Normal file
102
Seyounth.Hyosung.UI/Views/Pages/DashboardPage.xaml
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
<Page
|
||||||
|
x:Class="Seyounth.Hyosung.UI.Views.Pages.DashboardPage"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:local="clr-namespace:Seyounth.Hyosung.UI.Views.Pages"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
|
||||||
|
Title="生产看板"
|
||||||
|
d:DataContext="{d:DesignInstance local:DashboardPage,
|
||||||
|
IsDesignTimeCreatable=False}"
|
||||||
|
d:DesignHeight="800"
|
||||||
|
d:DesignWidth="1200"
|
||||||
|
ui:Design.Background="{DynamicResource ApplicationBackgroundBrush}"
|
||||||
|
ui:Design.Foreground="{DynamicResource TextFillColorPrimaryBrush}"
|
||||||
|
Foreground="{DynamicResource TextFillColorPrimaryBrush}"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="*" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Grid Grid.Row="0">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<ui:CardControl Header="自动发行标签" Margin="0,20,10,20">
|
||||||
|
<ui:ToggleSwitch></ui:ToggleSwitch>
|
||||||
|
</ui:CardControl>
|
||||||
|
<ui:CardControl Grid.Column="1" Header="自动入库" Margin="10,20,10,20">
|
||||||
|
<ui:ToggleSwitch></ui:ToggleSwitch>
|
||||||
|
</ui:CardControl>
|
||||||
|
<ui:CardControl Grid.Column="2" Margin="10,20,0,20">
|
||||||
|
<ui:ToggleSwitch></ui:ToggleSwitch>
|
||||||
|
</ui:CardControl>
|
||||||
|
</Grid>
|
||||||
|
<Grid Grid.Row="1">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<StackPanel Grid.Column="0" Orientation="Vertical"
|
||||||
|
VirtualizingStackPanel.IsVirtualizing="True"
|
||||||
|
ScrollViewer.CanContentScroll="True">
|
||||||
|
<Border
|
||||||
|
Padding="16"
|
||||||
|
Background="{ui:ThemeResource CardBackgroundFillColorDefaultBrush}"
|
||||||
|
BorderBrush="{ui:ThemeResource CardStrokeColorDefaultBrush}"
|
||||||
|
BorderThickness="1,1,1,0"
|
||||||
|
CornerRadius="8,8,0,0">
|
||||||
|
<ui:TextBlock FontTypography="Subtitle" Text="产品设置" />
|
||||||
|
</Border>
|
||||||
|
<ui:CardControl CornerRadius="0,0,0,0" Header="产品ID">
|
||||||
|
<ComboBox Margin="0,0,10,0" Width="400"
|
||||||
|
VirtualizingPanel.IsVirtualizing="True"
|
||||||
|
VirtualizingPanel.VirtualizationMode="Recycling"
|
||||||
|
ScrollViewer.CanContentScroll="True"
|
||||||
|
ItemsSource="{Binding ViewModel.Varieties}"
|
||||||
|
SelectedItem="{Binding ViewModel.SelectedVariety, Mode=TwoWay}"
|
||||||
|
DisplayMemberPath="Name" />
|
||||||
|
</ui:CardControl>
|
||||||
|
<ui:CardControl CornerRadius="0,0,0,0" Header="纱车类型">
|
||||||
|
<ComboBox
|
||||||
|
SelectedIndex="{Binding ViewModel.SelectedYarnCarTypeIndex,Mode=TwoWay}"
|
||||||
|
ItemsSource="{Binding ViewModel.YarnCarTypes}" Margin="0,0,10,0" Width="400" />
|
||||||
|
</ui:CardControl>
|
||||||
|
<ui:CardControl CornerRadius="0,0,0,0" Header="纱车正反面">
|
||||||
|
<ComboBox
|
||||||
|
SelectedIndex="{Binding ViewModel.SelectedYarnCarSideTypeIndex,Mode=TwoWay}"
|
||||||
|
ItemsSource="{Binding ViewModel.YarnCarSideType}" Margin="0,0,10,0" Width="400" />
|
||||||
|
</ui:CardControl>
|
||||||
|
<ui:CardControl CornerRadius="0,0,0,0" Header="上一个的控制号">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<TextBox Margin="0,0,10,0" Width="348"
|
||||||
|
Text="{Binding ViewModel.SelectedVariety.LastNo,Mode=TwoWay}" />
|
||||||
|
<ui:Button Content="更改" Command="{Binding ViewModel.ChangeVarietyLastNoCommand}"></ui:Button>
|
||||||
|
</StackPanel>
|
||||||
|
</ui:CardControl>
|
||||||
|
<ui:CardControl CornerRadius="0,0,0,0" Header="产品编码">
|
||||||
|
<TextBlock Margin="0,0,10,0" Text="{Binding ViewModel.SelectedVariety.Code}" />
|
||||||
|
</ui:CardControl>
|
||||||
|
<ui:CardControl CornerRadius="0,0,0,0" Header="Lot">
|
||||||
|
<TextBlock Margin="0,0,10,0" Text="{Binding ViewModel.SelectedVariety.Lot}" />
|
||||||
|
</ui:CardControl>
|
||||||
|
<ui:CardControl CornerRadius="0,0,0,0" Header="码垛层数">
|
||||||
|
<TextBlock Margin="0,0,10,0" Text="{Binding ViewModel.SelectedVariety.StackingLayers}" />
|
||||||
|
</ui:CardControl>
|
||||||
|
<ui:CardControl CornerRadius="0,0,0,0" Header="总数">
|
||||||
|
<TextBlock Margin="0,0,10,0" Text="{Binding ViewModel.SelectedVariety.TotalCount}" />
|
||||||
|
</ui:CardControl>
|
||||||
|
<ui:CardControl CornerRadius="0,0,8,8" Header="切换">
|
||||||
|
<ui:Button Command="{Binding ViewModel.ChangeVarietyCommand}"
|
||||||
|
Appearance="Primary" Content="切换"
|
||||||
|
Margin="0,0,10,0" Width="80" />
|
||||||
|
</ui:CardControl>
|
||||||
|
</StackPanel>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
</Grid>
|
||||||
|
</Page>
|
||||||
19
Seyounth.Hyosung.UI/Views/Pages/DashboardPage.xaml.cs
Normal file
19
Seyounth.Hyosung.UI/Views/Pages/DashboardPage.xaml.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
using Seyounth.Hyosung.UI.ViewModels.Pages;
|
||||||
|
using Wpf.Ui.Controls;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.UI.Views.Pages
|
||||||
|
{
|
||||||
|
public partial class DashboardPage : INavigableView<DashboardViewModel>
|
||||||
|
{
|
||||||
|
public DashboardViewModel ViewModel { get; }
|
||||||
|
|
||||||
|
public DashboardPage(DashboardViewModel viewModel)
|
||||||
|
{
|
||||||
|
ViewModel = viewModel;
|
||||||
|
DataContext = this;
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
262
Seyounth.Hyosung.UI/Views/Pages/DataPage.xaml
Normal file
262
Seyounth.Hyosung.UI/Views/Pages/DataPage.xaml
Normal file
@ -0,0 +1,262 @@
|
|||||||
|
<Page
|
||||||
|
x:Class="Seyounth.Hyosung.UI.Views.Pages.DataPage"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:local="clr-namespace:Seyounth.Hyosung.UI.Views.Pages"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
|
||||||
|
xmlns:helpers="clr-namespace:Seyounth.Hyosung.UI.Helpers"
|
||||||
|
xmlns:models1="clr-namespace:Seyounth.Hyosung.Data.Models;assembly=Seyounth.Hyosung.Data"
|
||||||
|
x:Name="VarietyPage"
|
||||||
|
Title="DataPage"
|
||||||
|
d:DataContext="{d:DesignInstance local:DataPage,
|
||||||
|
IsDesignTimeCreatable=False}"
|
||||||
|
d:DesignHeight="450"
|
||||||
|
d:DesignWidth="800"
|
||||||
|
ui:Design.Background="{DynamicResource ApplicationBackgroundBrush}"
|
||||||
|
ui:Design.Foreground="{DynamicResource TextFillColorPrimaryBrush}"
|
||||||
|
Foreground="{DynamicResource TextFillColorPrimaryBrush}"
|
||||||
|
ScrollViewer.CanContentScroll="False"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
<Page.Resources>
|
||||||
|
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
|
||||||
|
<helpers:EnumDescriptionConverter x:Key="EnumDescriptionConverter" />
|
||||||
|
</Page.Resources>
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="*" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Menu Grid.Row="0">
|
||||||
|
<ui:MenuItem Header="新增" Command="{Binding ViewModel.AddVarietyCommand}" Icon="{ui:SymbolIcon Add24}" />
|
||||||
|
</Menu>
|
||||||
|
|
||||||
|
<ui:DataGrid x:Name="VarietyDataGrid" Margin="0,0,0,20" AutoGenerateColumns="False"
|
||||||
|
HeadersVisibility="All"
|
||||||
|
VerticalContentAlignment="Center"
|
||||||
|
CanUserAddRows="False"
|
||||||
|
EnableRowVirtualization="True"
|
||||||
|
EnableColumnVirtualization="True"
|
||||||
|
VirtualizingPanel.VirtualizationMode="Recycling"
|
||||||
|
ScrollViewer.CanContentScroll="True"
|
||||||
|
AddingNewItem="VarietyDataGrid_AddingNewItem"
|
||||||
|
CellEditEnding="VarietyDataGrid_CellEditEnding"
|
||||||
|
ItemsSource="{Binding ViewModel.Varieties, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
Grid.Row="1">
|
||||||
|
<ui:DataGrid.Columns>
|
||||||
|
<DataGridTextColumn Header="编号"
|
||||||
|
Binding="{Binding Id}" />
|
||||||
|
<DataGridTextColumn Width="200" Header="产品编码" Binding="{Binding Code}" />
|
||||||
|
<DataGridTextColumn Width="60" Header="Lot" Binding="{Binding Lot}" />
|
||||||
|
<DataGridTextColumn Width="60" Header="规格" Binding="{Binding Specifications}" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding InnerDiameter }"
|
||||||
|
Header="内径(D1)"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding OuterDiameter }"
|
||||||
|
Header="外径(D2)"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding YarnDiameter }"
|
||||||
|
Header="直径(D3)"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding PaperTubeHeight }"
|
||||||
|
Header="纸管高(H1)"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding YarnThickness }"
|
||||||
|
Header="纱线厚(H2)"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding SingleWeight }"
|
||||||
|
Header="单筒重"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding StackingLayers }"
|
||||||
|
Header="码层数"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding TotalCount }"
|
||||||
|
Header="个/托"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTemplateColumn Width="180" Header="蜂窝板(中间)">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectionChanged="ComboBox_SelectionChanged"
|
||||||
|
SelectedItem="{Binding MiddlePallet, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding Path=ViewModel.HoneyPallets,RelativeSource={RelativeSource AncestorType={x:Type Page},Mode=FindAncestor}}"
|
||||||
|
DisplayMemberPath="Name">
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTemplateColumn Width="180" Header="蜂窝板(上下)">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectionChanged="ComboBox_SelectionChanged"
|
||||||
|
SelectedItem="{Binding TopAndBottomPallet, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding Path=ViewModel.HoneyPallets,RelativeSource={RelativeSource AncestorType={x:Type Page},Mode=FindAncestor}}"
|
||||||
|
DisplayMemberPath="Name">
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTemplateColumn Width="180" Header="底托">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectionChanged="ComboBox_SelectionChanged"
|
||||||
|
SelectedItem="{Binding Tray, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding Path=ViewModel.Trays,RelativeSource={RelativeSource AncestorType={x:Type Page},Mode=FindAncestor}}"
|
||||||
|
DisplayMemberPath="Name">
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTemplateColumn Width="180" Header="隔板">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectionChanged="ComboBox_SelectionChanged"
|
||||||
|
SelectedItem="{Binding PaperTray, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding Path=ViewModel.PaperPallets,RelativeSource={RelativeSource AncestorType={x:Type Page},Mode=FindAncestor}}"
|
||||||
|
DisplayMemberPath="Name">
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding StackHeadSpec }"
|
||||||
|
Header="垛头尺寸"
|
||||||
|
Width="120" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding StackHeadCount }"
|
||||||
|
Header="垛头数量"
|
||||||
|
Width="80" />
|
||||||
|
<DataGridCheckBoxColumn Header="套箱" Binding="{Binding HasBox}" />
|
||||||
|
<DataGridTemplateColumn Width="120" Header="顶板">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectionChanged="ComboBox_SelectionChanged"
|
||||||
|
SelectedItem="{Binding NeedTopBoard, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding Source={helpers:EnumBindingSource {x:Type models1:NeedType}}}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock
|
||||||
|
Text="{Binding ., Converter={StaticResource EnumDescriptionConverter}}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTemplateColumn Width="120" Header="护角">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectionChanged="ComboBox_SelectionChanged"
|
||||||
|
SelectedItem="{Binding NeedAngleBeam, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding Source={helpers:EnumBindingSource {x:Type models1:NeedType}}}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock
|
||||||
|
Text="{Binding ., Converter={StaticResource EnumDescriptionConverter}}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTemplateColumn Width="120" Header="打带">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectionChanged="ComboBox_SelectionChanged"
|
||||||
|
SelectedItem="{Binding NeedPackStrap, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding Source={helpers:EnumBindingSource {x:Type models1:NeedType}}}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock
|
||||||
|
Text="{Binding ., Converter={StaticResource EnumDescriptionConverter}}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTemplateColumn Width="120" Header="缠膜">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectionChanged="ComboBox_SelectionChanged"
|
||||||
|
SelectedItem="{Binding NeedFilmWrapping, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding Source={helpers:EnumBindingSource {x:Type models1:NeedType}}}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock
|
||||||
|
Text="{Binding ., Converter={StaticResource EnumDescriptionConverter}}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTemplateColumn Width="120" Header="覆膜">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox
|
||||||
|
SelectionChanged="ComboBox_SelectionChanged"
|
||||||
|
SelectedItem="{Binding NeedFilmCoating, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
ItemsSource="{Binding Source={helpers:EnumBindingSource {x:Type models1:NeedType}}}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock
|
||||||
|
Text="{Binding ., Converter={StaticResource EnumDescriptionConverter}}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding MasterLabelCount }"
|
||||||
|
Header="主标签数量"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Binding="{Binding SubLabelCount }"
|
||||||
|
Header="副标签数量"
|
||||||
|
Width="Auto" />
|
||||||
|
<DataGridTextColumn Header="毛重"
|
||||||
|
Binding="{Binding GrossWeight}" />
|
||||||
|
<DataGridTextColumn Header="净重"
|
||||||
|
Binding="{Binding NetWeight}" />
|
||||||
|
<DataGridTextColumn Header="控制号"
|
||||||
|
Binding="{Binding LastNo}" />
|
||||||
|
<DataGridTemplateColumn Header="操作">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<ui:Button Appearance="Primary" VerticalAlignment="Center" Margin="10,0,10,0"
|
||||||
|
Content="保存"
|
||||||
|
Command="{Binding ElementName=VarietyPage, Path=DataContext.ViewModel.SaveVarietyCommand}"
|
||||||
|
CommandParameter="{Binding}"
|
||||||
|
Visibility="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, Path=IsEditing, Converter={StaticResource BooleanToVisibilityConverter}}" />
|
||||||
|
<!-- 删除按钮 -->
|
||||||
|
<ui:Button VerticalAlignment="Center" Content="删除" Margin="10,0,10,0"
|
||||||
|
Command="{Binding ElementName=VarietyPage, Path=DataContext.ViewModel.DeleteVarietyCommand}"
|
||||||
|
CommandParameter="{Binding}" />
|
||||||
|
<!-- 保存按钮,根据 DataGridRow 的 IsEditing 属性控制可见性 -->
|
||||||
|
</StackPanel>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
</ui:DataGrid.Columns>
|
||||||
|
</ui:DataGrid>
|
||||||
|
</Grid>
|
||||||
|
</Page>
|
||||||
80
Seyounth.Hyosung.UI/Views/Pages/DataPage.xaml.cs
Normal file
80
Seyounth.Hyosung.UI/Views/Pages/DataPage.xaml.cs
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Threading;
|
||||||
|
using CommunityToolkit.Mvvm.Messaging;
|
||||||
|
using Seyounth.Hyosung.UI.ViewModels.Pages;
|
||||||
|
using Wpf.Ui.Controls;
|
||||||
|
using DataGrid = System.Windows.Controls.DataGrid;
|
||||||
|
using TextBox = System.Windows.Controls.TextBox;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.UI.Views.Pages
|
||||||
|
{
|
||||||
|
public partial class DataPage : INavigableView<DataViewModel>
|
||||||
|
{
|
||||||
|
public DataViewModel ViewModel { get; }
|
||||||
|
|
||||||
|
public DataPage(DataViewModel viewModel)
|
||||||
|
{
|
||||||
|
ViewModel = viewModel;
|
||||||
|
DataContext = this;
|
||||||
|
|
||||||
|
InitializeComponent();
|
||||||
|
WeakReferenceMessenger.Default.Register<PalletManagementViewModel.SavePalletCompletedMessage>(this, (r, m) =>
|
||||||
|
{
|
||||||
|
// 提交当前编辑并取消编辑模式
|
||||||
|
VarietyDataGrid.CommitEdit();
|
||||||
|
VarietyDataGrid.CancelEdit();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void VarietyDataGrid_AddingNewItem(object? sender, AddingNewItemEventArgs e)
|
||||||
|
{
|
||||||
|
Dispatcher.BeginInvoke(new Action(() =>
|
||||||
|
{
|
||||||
|
if (VarietyDataGrid.Items.Count == 0) return;
|
||||||
|
|
||||||
|
var lastIndex = VarietyDataGrid.Items.Count - 1;
|
||||||
|
VarietyDataGrid.ScrollIntoView(VarietyDataGrid.Items[lastIndex]);
|
||||||
|
VarietyDataGrid.SelectedIndex = lastIndex;
|
||||||
|
|
||||||
|
if (VarietyDataGrid.ItemContainerGenerator.ContainerFromIndex(lastIndex) is not DataGridRow row) return;
|
||||||
|
row.Focus();
|
||||||
|
VarietyDataGrid.CurrentColumn = VarietyDataGrid.Columns[0];
|
||||||
|
VarietyDataGrid.BeginEdit();
|
||||||
|
}), DispatcherPriority.ContextIdle);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void VarietyDataGrid_CellEditEnding(object? sender, DataGridCellEditEndingEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.EditAction == DataGridEditAction.Commit)
|
||||||
|
{
|
||||||
|
var binding = e.EditingElement.GetBindingExpression(TextBox.TextProperty);
|
||||||
|
binding?.UpdateSource();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (sender is ComboBox comboBox)
|
||||||
|
{
|
||||||
|
// 获取所在DataGrid行
|
||||||
|
var dataGridRow = FindVisualParent<DataGridRow>(comboBox);
|
||||||
|
var dataGrid = FindVisualParent<DataGrid>(comboBox);
|
||||||
|
if (dataGrid != null && dataGridRow != null && !dataGridRow.IsEditing)
|
||||||
|
{
|
||||||
|
dataGrid.CurrentItem = dataGridRow.Item;
|
||||||
|
dataGrid.BeginEdit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static T FindVisualParent<T>(DependencyObject child) where T : DependencyObject
|
||||||
|
{
|
||||||
|
while (child != null && child is not T)
|
||||||
|
{
|
||||||
|
child = VisualTreeHelper.GetParent(child);
|
||||||
|
}
|
||||||
|
return child as T;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
87
Seyounth.Hyosung.UI/Views/Pages/PalletManagementPage.xaml
Normal file
87
Seyounth.Hyosung.UI/Views/Pages/PalletManagementPage.xaml
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
<Page x:Class="Seyounth.Hyosung.UI.Views.Pages.PalletManagementPage"
|
||||||
|
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:Seyounth.Hyosung.UI.Views.Pages"
|
||||||
|
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
|
||||||
|
xmlns:models="clr-namespace:Seyounth.Hyosung.Data.Models;assembly=Seyounth.Hyosung.Data"
|
||||||
|
xmlns:helpers="clr-namespace:Seyounth.Hyosung.UI.Helpers"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
x:Name="PalletPage"
|
||||||
|
Title="PalletManagementPage"
|
||||||
|
d:DataContext="{d:DesignInstance local:PalletManagementPage,
|
||||||
|
IsDesignTimeCreatable=False}"
|
||||||
|
d:DesignHeight="450"
|
||||||
|
d:DesignWidth="800"
|
||||||
|
ui:Design.Background="{DynamicResource ApplicationBackgroundBrush}"
|
||||||
|
ui:Design.Foreground="{DynamicResource TextFillColorPrimaryBrush}"
|
||||||
|
Foreground="{DynamicResource TextFillColorPrimaryBrush}"
|
||||||
|
ScrollViewer.CanContentScroll="False">
|
||||||
|
<Page.Resources>
|
||||||
|
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
|
||||||
|
<helpers:EnumDescriptionConverter x:Key="EnumDescriptionConverter" />
|
||||||
|
</Page.Resources>
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="*" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Menu>
|
||||||
|
<ui:MenuItem Command="{Binding ViewModel.AddPalletCommand }" Header="新增" Icon="{ui:SymbolIcon Add24}" />
|
||||||
|
</Menu>
|
||||||
|
<ui:DataGrid x:Name="PalletsDataGrid" Margin="0,0,0,20" AutoGenerateColumns="False"
|
||||||
|
HeadersVisibility="All"
|
||||||
|
VerticalContentAlignment="Center"
|
||||||
|
CanUserAddRows="False"
|
||||||
|
AddingNewItem="PalletsDataGrid_AddingNewItem"
|
||||||
|
|
||||||
|
CellEditEnding="PalletDataGrid_CellEditEnding"
|
||||||
|
ItemsSource="{Binding ViewModel.Pallets, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
Grid.Row="1">
|
||||||
|
<ui:DataGrid.Columns>
|
||||||
|
<DataGridTextColumn IsReadOnly="True" Header="编号(Id)"
|
||||||
|
Binding="{Binding Id}" />
|
||||||
|
<DataGridTemplateColumn Width="120" Header="托盘类型(Type)">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<ComboBox SelectedItem="{Binding Type, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
SelectionChanged="ComboBox_SelectionChanged"
|
||||||
|
ItemsSource="{Binding Source={helpers:EnumBindingSource {x:Type models:PalletType}}}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock
|
||||||
|
Text="{Binding ., Converter={StaticResource EnumDescriptionConverter}}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
<DataGridTextColumn Width="120" Header="长度(Length)" Binding="{Binding Length}" />
|
||||||
|
<DataGridTextColumn Width="120" Header="宽度(Width)" Binding="{Binding Width}" />
|
||||||
|
<DataGridTextColumn Width="120" Header="高度(Height)" Binding="{Binding Height}" />
|
||||||
|
<DataGridCheckBoxColumn Header="大孔(BigHole)" Binding="{Binding IsBigHole}" />
|
||||||
|
<DataGridTextColumn Width="120" Header="孔数(HoleCount)" Binding="{Binding HoleCount}" />
|
||||||
|
<DataGridTemplateColumn Header="操作">
|
||||||
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<ui:Button Appearance="Primary" VerticalAlignment="Center" Margin="10,0,10,0"
|
||||||
|
Content="保存"
|
||||||
|
Command="{Binding ElementName=PalletPage, Path=DataContext.ViewModel.SavePalletCommand}"
|
||||||
|
CommandParameter="{Binding}"
|
||||||
|
Visibility="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, Path=IsEditing, Converter={StaticResource BooleanToVisibilityConverter}}" />
|
||||||
|
<!-- 删除按钮 -->
|
||||||
|
<ui:Button VerticalAlignment="Center" Content="删除" Margin="10,0,10,0"
|
||||||
|
Command="{Binding ElementName=PalletPage, Path=DataContext.ViewModel.DeletePalletCommand}"
|
||||||
|
CommandParameter="{Binding}" />
|
||||||
|
<!-- 保存按钮,根据 DataGridRow 的 IsEditing 属性控制可见性 -->
|
||||||
|
</StackPanel>
|
||||||
|
</DataTemplate>
|
||||||
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
</DataGridTemplateColumn>
|
||||||
|
</ui:DataGrid.Columns>
|
||||||
|
</ui:DataGrid>
|
||||||
|
</Grid>
|
||||||
|
</Page>
|
||||||
83
Seyounth.Hyosung.UI/Views/Pages/PalletManagementPage.xaml.cs
Normal file
83
Seyounth.Hyosung.UI/Views/Pages/PalletManagementPage.xaml.cs
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Threading;
|
||||||
|
using CommunityToolkit.Mvvm.Messaging;
|
||||||
|
using Seyounth.Hyosung.UI.ViewModels.Pages;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.UI.Views.Pages;
|
||||||
|
|
||||||
|
public partial class PalletManagementPage : Page
|
||||||
|
{
|
||||||
|
public PalletManagementViewModel ViewModel { get; }
|
||||||
|
|
||||||
|
public PalletManagementPage(PalletManagementViewModel viewModel)
|
||||||
|
{
|
||||||
|
ViewModel = viewModel;
|
||||||
|
DataContext = this;
|
||||||
|
InitializeComponent();
|
||||||
|
WeakReferenceMessenger.Default.Register<PalletManagementViewModel.SavePalletCompletedMessage>(this, (r, m) =>
|
||||||
|
{
|
||||||
|
// 提交当前编辑并取消编辑模式
|
||||||
|
PalletsDataGrid.CommitEdit();
|
||||||
|
PalletsDataGrid.CancelEdit();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PalletsDataGrid_AddingNewItem(object sender, AddingNewItemEventArgs e)
|
||||||
|
{
|
||||||
|
// 确保新项已添加到集合
|
||||||
|
Dispatcher.BeginInvoke(new Action(() =>
|
||||||
|
{
|
||||||
|
if (PalletsDataGrid.Items.Count == 0) return;
|
||||||
|
|
||||||
|
var lastIndex = PalletsDataGrid.Items.Count - 1;
|
||||||
|
PalletsDataGrid.ScrollIntoView(PalletsDataGrid.Items[lastIndex]);
|
||||||
|
PalletsDataGrid.SelectedIndex = lastIndex;
|
||||||
|
|
||||||
|
if (PalletsDataGrid.ItemContainerGenerator.ContainerFromIndex(lastIndex) is not DataGridRow row) return;
|
||||||
|
row.Focus();
|
||||||
|
PalletsDataGrid.CurrentColumn = PalletsDataGrid.Columns[0];
|
||||||
|
PalletsDataGrid.BeginEdit();
|
||||||
|
}), DispatcherPriority.ContextIdle);
|
||||||
|
}
|
||||||
|
|
||||||
|
// private void PalletDataGrid_RowEditEnding(object? sender, DataGridRowEditEndingEventArgs e)
|
||||||
|
// {
|
||||||
|
// if (e.EditAction != DataGridEditAction.Commit) return;
|
||||||
|
// var dataGrid = (DataGrid)sender;
|
||||||
|
// dataGrid.CommitEdit(DataGridEditingUnit.Row, true);
|
||||||
|
// }
|
||||||
|
|
||||||
|
private void PalletDataGrid_CellEditEnding(object? sender, DataGridCellEditEndingEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.EditAction == DataGridEditAction.Commit)
|
||||||
|
{
|
||||||
|
var binding = e.EditingElement.GetBindingExpression(TextBox.TextProperty);
|
||||||
|
binding?.UpdateSource();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (sender is ComboBox comboBox)
|
||||||
|
{
|
||||||
|
// 获取所在DataGrid行
|
||||||
|
var dataGridRow = FindVisualParent<DataGridRow>(comboBox);
|
||||||
|
var dataGrid = FindVisualParent<DataGrid>(comboBox);
|
||||||
|
if (dataGrid != null && dataGridRow != null && !dataGridRow.IsEditing)
|
||||||
|
{
|
||||||
|
dataGrid.CurrentItem = dataGridRow.Item;
|
||||||
|
dataGrid.BeginEdit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static T FindVisualParent<T>(DependencyObject child) where T : DependencyObject
|
||||||
|
{
|
||||||
|
while (child != null && child is not T)
|
||||||
|
{
|
||||||
|
child = VisualTreeHelper.GetParent(child);
|
||||||
|
}
|
||||||
|
return child as T;
|
||||||
|
}
|
||||||
|
}
|
||||||
51
Seyounth.Hyosung.UI/Views/Pages/SettingsPage.xaml
Normal file
51
Seyounth.Hyosung.UI/Views/Pages/SettingsPage.xaml
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<Page
|
||||||
|
x:Class="Seyounth.Hyosung.UI.Views.Pages.SettingsPage"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:helpers="clr-namespace:Seyounth.Hyosung.UI.Helpers"
|
||||||
|
xmlns:local="clr-namespace:Seyounth.Hyosung.UI.Views.Pages"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
|
||||||
|
Title="SettingsPage"
|
||||||
|
d:DataContext="{d:DesignInstance local:SettingsPage,
|
||||||
|
IsDesignTimeCreatable=False}"
|
||||||
|
d:DesignHeight="450"
|
||||||
|
d:DesignWidth="800"
|
||||||
|
ui:Design.Background="{DynamicResource ApplicationBackgroundBrush}"
|
||||||
|
ui:Design.Foreground="{DynamicResource TextFillColorPrimaryBrush}"
|
||||||
|
Foreground="{DynamicResource TextFillColorPrimaryBrush}"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
<Page.Resources>
|
||||||
|
<helpers:EnumToBooleanConverter x:Key="EnumToBooleanConverter" />
|
||||||
|
</Page.Resources>
|
||||||
|
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock
|
||||||
|
FontSize="20"
|
||||||
|
FontWeight="Medium"
|
||||||
|
Text="Personalization" />
|
||||||
|
<TextBlock Margin="0,12,0,0" Text="Theme" />
|
||||||
|
<RadioButton
|
||||||
|
Margin="0,12,0,0"
|
||||||
|
Command="{Binding ViewModel.ChangeThemeCommand, Mode=OneWay}"
|
||||||
|
CommandParameter="theme_light"
|
||||||
|
Content="Light"
|
||||||
|
GroupName="themeSelect"
|
||||||
|
IsChecked="{Binding ViewModel.CurrentTheme, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter=Light, Mode=OneWay}" />
|
||||||
|
<RadioButton
|
||||||
|
Margin="0,8,0,0"
|
||||||
|
Command="{Binding ViewModel.ChangeThemeCommand, Mode=OneWay}"
|
||||||
|
CommandParameter="theme_dark"
|
||||||
|
Content="Dark"
|
||||||
|
GroupName="themeSelect"
|
||||||
|
IsChecked="{Binding ViewModel.CurrentTheme, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter=Dark, Mode=OneWay}" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Margin="0,24,0,0"
|
||||||
|
FontSize="20"
|
||||||
|
FontWeight="Medium"
|
||||||
|
Text="About Seyounth.Hyosung.UI" />
|
||||||
|
<TextBlock Margin="0,12,0,0" Text="{Binding ViewModel.AppVersion, Mode=OneWay}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Page>
|
||||||
18
Seyounth.Hyosung.UI/Views/Pages/SettingsPage.xaml.cs
Normal file
18
Seyounth.Hyosung.UI/Views/Pages/SettingsPage.xaml.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
using Seyounth.Hyosung.UI.ViewModels.Pages;
|
||||||
|
using Wpf.Ui.Controls;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.UI.Views.Pages
|
||||||
|
{
|
||||||
|
public partial class SettingsPage : INavigableView<SettingsViewModel>
|
||||||
|
{
|
||||||
|
public SettingsViewModel ViewModel { get; }
|
||||||
|
|
||||||
|
public SettingsPage(SettingsViewModel viewModel)
|
||||||
|
{
|
||||||
|
ViewModel = viewModel;
|
||||||
|
DataContext = this;
|
||||||
|
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
<ui:FluentWindow x:Class="Seyounth.Hyosung.UI.Views.Windows.AddOrUpdatePalletWindow"
|
||||||
|
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:Seyounth.Hyosung.UI.Views.Windows"
|
||||||
|
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
Title="" Height="450" Width="800">
|
||||||
|
<Grid>
|
||||||
|
|
||||||
|
</Grid>
|
||||||
|
</ui:FluentWindow>
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
namespace Seyounth.Hyosung.UI.Views.Windows;
|
||||||
|
|
||||||
|
public partial class AddOrUpdatePalletWindow
|
||||||
|
{
|
||||||
|
public AddOrUpdatePalletWindow()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
}
|
||||||
65
Seyounth.Hyosung.UI/Views/Windows/MainWindow.xaml
Normal file
65
Seyounth.Hyosung.UI/Views/Windows/MainWindow.xaml
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
<ui:FluentWindow
|
||||||
|
x:Class="Seyounth.Hyosung.UI.Views.Windows.MainWindow"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:local="clr-namespace:Seyounth.Hyosung.UI.Views.Windows"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
|
||||||
|
Title="{Binding ViewModel.ApplicationTitle, Mode=OneWay}"
|
||||||
|
Width="1100"
|
||||||
|
Height="650"
|
||||||
|
d:DataContext="{d:DesignInstance local:MainWindow,
|
||||||
|
IsDesignTimeCreatable=True}"
|
||||||
|
d:DesignHeight="450"
|
||||||
|
d:DesignWidth="800"
|
||||||
|
ui:Design.Background="{DynamicResource ApplicationBackgroundBrush}"
|
||||||
|
ui:Design.Foreground="{DynamicResource TextFillColorPrimaryBrush}"
|
||||||
|
ExtendsContentIntoTitleBar="True"
|
||||||
|
Foreground="{DynamicResource TextFillColorPrimaryBrush}"
|
||||||
|
WindowBackdropType="Mica"
|
||||||
|
WindowCornerPreference="Round"
|
||||||
|
WindowStartupLocation="CenterScreen"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="*" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<ui:NavigationView
|
||||||
|
x:Name="RootNavigation"
|
||||||
|
Grid.Row="1"
|
||||||
|
Padding="42,0,42,0"
|
||||||
|
BreadcrumbBar="{Binding ElementName=BreadcrumbBar}"
|
||||||
|
FooterMenuItemsSource="{Binding ViewModel.FooterMenuItems, Mode=OneWay}"
|
||||||
|
FrameMargin="0"
|
||||||
|
IsBackButtonVisible="Visible"
|
||||||
|
IsPaneToggleVisible="True"
|
||||||
|
MenuItemsSource="{Binding ViewModel.MenuItems, Mode=OneWay}"
|
||||||
|
PaneDisplayMode="Left">
|
||||||
|
<ui:NavigationView.Header>
|
||||||
|
<ui:BreadcrumbBar x:Name="BreadcrumbBar" Margin="42,32,42,20" />
|
||||||
|
</ui:NavigationView.Header>
|
||||||
|
<ui:NavigationView.ContentOverlay>
|
||||||
|
<Grid>
|
||||||
|
<ui:SnackbarPresenter x:Name="SnackbarPresenter" />
|
||||||
|
</Grid>
|
||||||
|
</ui:NavigationView.ContentOverlay>
|
||||||
|
</ui:NavigationView>
|
||||||
|
|
||||||
|
<ContentPresenter
|
||||||
|
x:Name="RootContentDialog"
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.RowSpan="2" />
|
||||||
|
|
||||||
|
<ui:TitleBar
|
||||||
|
x:Name="TitleBar"
|
||||||
|
Title="{Binding ViewModel.ApplicationTitle}"
|
||||||
|
Grid.Row="0"
|
||||||
|
CloseWindowByDoubleClickOnIcon="True">
|
||||||
|
<ui:TitleBar.Icon>
|
||||||
|
<ui:ImageIcon Source="pack://application:,,,/Assets/wpfui-icon-256.png" />
|
||||||
|
</ui:TitleBar.Icon>
|
||||||
|
</ui:TitleBar>
|
||||||
|
</Grid>
|
||||||
|
</ui:FluentWindow>
|
||||||
65
Seyounth.Hyosung.UI/Views/Windows/MainWindow.xaml.cs
Normal file
65
Seyounth.Hyosung.UI/Views/Windows/MainWindow.xaml.cs
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
using Seyounth.Hyosung.UI.ViewModels.Windows;
|
||||||
|
using Wpf.Ui;
|
||||||
|
using Wpf.Ui.Appearance;
|
||||||
|
using Wpf.Ui.Controls;
|
||||||
|
|
||||||
|
namespace Seyounth.Hyosung.UI.Views.Windows
|
||||||
|
{
|
||||||
|
public partial class MainWindow : INavigationWindow
|
||||||
|
{
|
||||||
|
public MainWindowViewModel ViewModel { get; }
|
||||||
|
|
||||||
|
public MainWindow(
|
||||||
|
MainWindowViewModel viewModel,
|
||||||
|
IPageService pageService,
|
||||||
|
ISnackbarService snackbarService,
|
||||||
|
INavigationService navigationService
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ViewModel = viewModel;
|
||||||
|
DataContext = this;
|
||||||
|
|
||||||
|
SystemThemeWatcher.Watch(this);
|
||||||
|
|
||||||
|
InitializeComponent();
|
||||||
|
SetPageService(pageService);
|
||||||
|
snackbarService.SetSnackbarPresenter(SnackbarPresenter);
|
||||||
|
navigationService.SetNavigationControl(RootNavigation);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region INavigationWindow methods
|
||||||
|
|
||||||
|
public INavigationView GetNavigation() => RootNavigation;
|
||||||
|
|
||||||
|
public bool Navigate(Type pageType) => RootNavigation.Navigate(pageType);
|
||||||
|
|
||||||
|
public void SetPageService(IPageService pageService) => RootNavigation.SetPageService(pageService);
|
||||||
|
|
||||||
|
public void ShowWindow() => Show();
|
||||||
|
|
||||||
|
public void CloseWindow() => Close();
|
||||||
|
|
||||||
|
#endregion INavigationWindow methods
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Raises the closed event.
|
||||||
|
/// </summary>
|
||||||
|
protected override void OnClosed(EventArgs e)
|
||||||
|
{
|
||||||
|
base.OnClosed(e);
|
||||||
|
|
||||||
|
// Make sure that closing this window will begin the process of closing the application.
|
||||||
|
Application.Current.Shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
INavigationView INavigationWindow.GetNavigation()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetServiceProvider(IServiceProvider serviceProvider)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
75
Seyounth.Hyosung.UI/app.manifest
Normal file
75
Seyounth.Hyosung.UI/app.manifest
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<assemblyIdentity version="1.0.0.0" name="Seyounth.Hyosung.UI.app"/>
|
||||||
|
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||||
|
<security>
|
||||||
|
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<!-- UAC Manifest Options
|
||||||
|
If you want to change the Windows User Account Control level replace the
|
||||||
|
requestedExecutionLevel node with one of the following.
|
||||||
|
|
||||||
|
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||||
|
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
|
||||||
|
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
|
||||||
|
|
||||||
|
Specifying requestedExecutionLevel element will disable file and registry virtualization.
|
||||||
|
Remove this element if your application requires this virtualization for backwards
|
||||||
|
compatibility.
|
||||||
|
-->
|
||||||
|
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||||
|
</requestedPrivileges>
|
||||||
|
</security>
|
||||||
|
</trustInfo>
|
||||||
|
|
||||||
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||||
|
<application>
|
||||||
|
<!-- A list of the Windows versions that this application has been tested on
|
||||||
|
and is designed to work with. Uncomment the appropriate elements
|
||||||
|
and Windows will automatically select the most compatible environment. -->
|
||||||
|
|
||||||
|
<!-- Windows Vista -->
|
||||||
|
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
|
||||||
|
|
||||||
|
<!-- Windows 7 -->
|
||||||
|
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
|
||||||
|
|
||||||
|
<!-- Windows 8 -->
|
||||||
|
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
|
||||||
|
|
||||||
|
<!-- Windows 8.1 -->
|
||||||
|
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
|
||||||
|
|
||||||
|
<!-- Windows 10 -->
|
||||||
|
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
</compatibility>
|
||||||
|
|
||||||
|
<!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher
|
||||||
|
DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need
|
||||||
|
to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should
|
||||||
|
also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config.
|
||||||
|
|
||||||
|
Makes the application long-path aware. See https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation -->
|
||||||
|
|
||||||
|
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<windowsSettings>
|
||||||
|
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitor</dpiAwareness>
|
||||||
|
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
|
||||||
|
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
|
||||||
|
</windowsSettings>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
<!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
|
||||||
|
<dependency>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity
|
||||||
|
type="win32"
|
||||||
|
name="Microsoft.Windows.Common-Controls"
|
||||||
|
version="6.0.0.0"
|
||||||
|
processorArchitecture="*"
|
||||||
|
publicKeyToken="6595b64144ccf1df"
|
||||||
|
language="*" />
|
||||||
|
</dependentAssembly>
|
||||||
|
</dependency>
|
||||||
|
</assembly>
|
||||||
5
Seyounth.Hyosung.UI/appsettings.json
Normal file
5
Seyounth.Hyosung.UI/appsettings.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"ConnectionStrings": {
|
||||||
|
"DefaultConnection": "server=DESKTOP-AJ6K895;database=seyounth.hyosung;Trusted_Connection=SSPI;Encrypt=True;TrustServerCertificate=True;"
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Seyounth.Hyosung.UI/wpfui-icon.ico
Normal file
BIN
Seyounth.Hyosung.UI/wpfui-icon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 19 KiB |
@ -1,20 +1,27 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Seyounth.Hyosung.Core", "Seyounth.Hyosung.Core\Seyounth.Hyosung.Core.csproj", "{B6FCBC79-2C82-4915-BE52-16F4F22F2650}"
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.8.34316.72
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Seyounth.Hyosung.Core", "Seyounth.Hyosung.Core\Seyounth.Hyosung.Core.csproj", "{B6FCBC79-2C82-4915-BE52-16F4F22F2650}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Seyounth.Hyosung.Data", "Seyounth.Hyosung.Data\Seyounth.Hyosung.Data.csproj", "{BC51516E-38D1-482C-913B-CE8F514CF978}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Seyounth.Hyosung.Data", "Seyounth.Hyosung.Data\Seyounth.Hyosung.Data.csproj", "{BC51516E-38D1-482C-913B-CE8F514CF978}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Seyounth.Hyosung.Runtime", "Seyounth.Hyosung.Runtime\Seyounth.Hyosung.Runtime.csproj", "{CB32CBA4-8760-490A-8E48-91CB10AD3965}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Seyounth.Hyosung.Runtime", "Seyounth.Hyosung.Runtime\Seyounth.Hyosung.Runtime.csproj", "{CB32CBA4-8760-490A-8E48-91CB10AD3965}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Seyounth.Core", "Seyounth.Core\Seyounth.Core.csproj", "{BC139001-2C26-4E95-982F-DA90DC0CFB4A}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Seyounth.Core", "Seyounth.Core\Seyounth.Core.csproj", "{BC139001-2C26-4E95-982F-DA90DC0CFB4A}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tester", "Tester", "{F94CF5F9-01E3-4159-BC91-1EC9D8112837}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tester", "Tester", "{F94CF5F9-01E3-4159-BC91-1EC9D8112837}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HyosungDataTester", "HyosungDataTester\HyosungDataTester.csproj", "{6D6BC0D1-1460-42A7-8A47-81B22B2C7A07}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HyosungDataTester", "HyosungDataTester\HyosungDataTester.csproj", "{6D6BC0D1-1460-42A7-8A47-81B22B2C7A07}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HyosungTester", "HyosungTester\HyosungTester.csproj", "{95193F01-653D-4664-84F3-1956994703D6}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HyosungTester", "HyosungTester\HyosungTester.csproj", "{95193F01-653D-4664-84F3-1956994703D6}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Seyounth.Hyosung", "Seyounth.Hyosung\Seyounth.Hyosung.csproj", "{16C5CC9B-FEA9-4B1E-805F-C6DBF5865DC0}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Seyounth.Hyosung", "Seyounth.Hyosung\Seyounth.Hyosung.csproj", "{16C5CC9B-FEA9-4B1E-805F-C6DBF5865DC0}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Seyounth.Hyosung.UI", "Seyounth.Hyosung.UI\Seyounth.Hyosung.UI.csproj", "{C4C7C083-6AE5-4DFE-8798-70E1E62C558C}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Seyounth.Hyosung.Ava", "Seyounth.Hyosung.Ava\Seyounth.Hyosung.Ava.csproj", "{E09FBD1D-CFFD-4E60-94BD-87890AA199A8}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@ -50,6 +57,17 @@ Global
|
|||||||
{16C5CC9B-FEA9-4B1E-805F-C6DBF5865DC0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{16C5CC9B-FEA9-4B1E-805F-C6DBF5865DC0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{16C5CC9B-FEA9-4B1E-805F-C6DBF5865DC0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{16C5CC9B-FEA9-4B1E-805F-C6DBF5865DC0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{16C5CC9B-FEA9-4B1E-805F-C6DBF5865DC0}.Release|Any CPU.Build.0 = Release|Any CPU
|
{16C5CC9B-FEA9-4B1E-805F-C6DBF5865DC0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{C4C7C083-6AE5-4DFE-8798-70E1E62C558C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{C4C7C083-6AE5-4DFE-8798-70E1E62C558C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{C4C7C083-6AE5-4DFE-8798-70E1E62C558C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{C4C7C083-6AE5-4DFE-8798-70E1E62C558C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{E09FBD1D-CFFD-4E60-94BD-87890AA199A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{E09FBD1D-CFFD-4E60-94BD-87890AA199A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{E09FBD1D-CFFD-4E60-94BD-87890AA199A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{E09FBD1D-CFFD-4E60-94BD-87890AA199A8}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(NestedProjects) = preSolution
|
GlobalSection(NestedProjects) = preSolution
|
||||||
{6D6BC0D1-1460-42A7-8A47-81B22B2C7A07} = {F94CF5F9-01E3-4159-BC91-1EC9D8112837}
|
{6D6BC0D1-1460-42A7-8A47-81B22B2C7A07} = {F94CF5F9-01E3-4159-BC91-1EC9D8112837}
|
||||||
|
|||||||
@ -1,21 +1,134 @@
|
|||||||
<Application x:Class="Seyounth.Hyosung.App"
|
<Application x:Class="Seyounth.Hyosung.App"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:local="clr-namespace:Seyounth.Hyosung"
|
xmlns:ui="https://opensource.panuon.com/wpf-ui"
|
||||||
DispatcherUnhandledException="OnDispatcherUnhandledException"
|
DispatcherUnhandledException="OnDispatcherUnhandledException"
|
||||||
Exit="OnExit"
|
Exit="OnExit"
|
||||||
Startup="OnStartup">
|
Startup="OnStartup">
|
||||||
<Application.Resources>
|
<Application.Resources>
|
||||||
<ResourceDictionary>
|
<ResourceDictionary>
|
||||||
<ResourceDictionary.MergedDictionaries>
|
<ResourceDictionary.MergedDictionaries>
|
||||||
<ResourceDictionary
|
<ResourceDictionary>
|
||||||
Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/materialdesigntheme.dark.xaml" />
|
<ui:MessageBoxXSettings x:Key="messageSetting">
|
||||||
<ResourceDictionary
|
<ui:MessageBoxXSettings.WindowXStyle>
|
||||||
Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
|
<Style TargetType="ui:WindowX"
|
||||||
<ResourceDictionary
|
BasedOn="{StaticResource {x:Static ui:MessageBoxX.WindowXStyleKey}}">
|
||||||
Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.DeepPurple.xaml" />
|
<Setter Property="SizeToContent"
|
||||||
<ResourceDictionary
|
Value="Manual" />
|
||||||
Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Lime.xaml" />
|
<Setter Property="Width"
|
||||||
|
Value="400" />
|
||||||
|
<Setter Property="Height"
|
||||||
|
Value="200" />
|
||||||
|
<Setter Property="Background"
|
||||||
|
Value="{DynamicResource WindowBackground}" />
|
||||||
|
<Setter Property="Foreground"
|
||||||
|
Value="{DynamicResource BodyForeground}" />
|
||||||
|
</Style>
|
||||||
|
</ui:MessageBoxXSettings.WindowXStyle>
|
||||||
|
<ui:MessageBoxXSettings.ButtonStyle>
|
||||||
|
<Style TargetType="Button"
|
||||||
|
BasedOn="{StaticResource {x:Static ui:MessageBoxX.ButtonStyleKey}}">
|
||||||
|
<Setter Property="ui:ButtonHelper.CornerRadius"
|
||||||
|
Value="4" />
|
||||||
|
<Style.Triggers>
|
||||||
|
<Trigger Property="IsDefault"
|
||||||
|
Value="True">
|
||||||
|
<Setter Property="Foreground"
|
||||||
|
Value="#FFFFFF" />
|
||||||
|
<Setter Property="Background"
|
||||||
|
Value="#80BEE8" />
|
||||||
|
</Trigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</ui:MessageBoxXSettings.ButtonStyle>
|
||||||
|
</ui:MessageBoxXSettings>
|
||||||
|
|
||||||
|
<ui:NoticeBoxSettings x:Key="noticeSetting"
|
||||||
|
Position="TopRight">
|
||||||
|
<ui:NoticeBoxSettings.NoticeBoxItemStyle>
|
||||||
|
<Style TargetType="ui:NoticeBoxItem"
|
||||||
|
BasedOn="{StaticResource {x:Static ui:NoticeBox.NoticeBoxItemStyleKey}}">
|
||||||
|
<Setter Property="Background"
|
||||||
|
Value="{DynamicResource WindowBackground}" />
|
||||||
|
<Setter Property="BorderBrush"
|
||||||
|
Value="#4E4E4E" />
|
||||||
|
<Setter Property="Foreground"
|
||||||
|
Value="{DynamicResource BodyForeground}" />
|
||||||
|
</Style>
|
||||||
|
</ui:NoticeBoxSettings.NoticeBoxItemStyle>
|
||||||
|
</ui:NoticeBoxSettings>
|
||||||
|
|
||||||
|
<ui:PendingBoxSettings x:Key="pendingSetting">
|
||||||
|
<ui:PendingBoxSettings.WindowStyle>
|
||||||
|
<Style BasedOn="{StaticResource {x:Static ui:PendingBox.WindowStyleKey}}"
|
||||||
|
TargetType="Window">
|
||||||
|
<Setter Property="SizeToContent"
|
||||||
|
Value="Manual" />
|
||||||
|
<Setter Property="Width"
|
||||||
|
Value="400" />
|
||||||
|
<Setter Property="Height"
|
||||||
|
Value="200" />
|
||||||
|
<Setter Property="Background"
|
||||||
|
Value="{DynamicResource WindowBackground}" />
|
||||||
|
<Setter Property="Foreground"
|
||||||
|
Value="{DynamicResource BodyForeground}" />
|
||||||
|
</Style>
|
||||||
|
</ui:PendingBoxSettings.WindowStyle>
|
||||||
|
<ui:PendingBoxSettings.SpinStyle>
|
||||||
|
<Style BasedOn="{StaticResource {x:Static ui:PendingBox.SpinStyleKey}}"
|
||||||
|
TargetType="ui:Spin">
|
||||||
|
<Setter Property="SpinStyle"
|
||||||
|
Value="Ring2" />
|
||||||
|
<Setter Property="GlyphBrush"
|
||||||
|
Value="#6CBCEA" />
|
||||||
|
</Style>
|
||||||
|
</ui:PendingBoxSettings.SpinStyle>
|
||||||
|
<ui:PendingBoxSettings.CancelButtonStyle>
|
||||||
|
<!--Attention : CancelButtonStyle in PendingBox does not support Helpers in PanuonUI-->
|
||||||
|
<Style BasedOn="{StaticResource {x:Static ui:PendingBox.CancelButtonStyleKey}}"
|
||||||
|
TargetType="Button">
|
||||||
|
<Setter Property="Background"
|
||||||
|
Value="#6CBCEA" />
|
||||||
|
<Setter Property="Foreground"
|
||||||
|
Value="White" />
|
||||||
|
<Setter Property="Height"
|
||||||
|
Value="30" />
|
||||||
|
<Style.Triggers>
|
||||||
|
<Trigger Property="IsPressed"
|
||||||
|
Value="True">
|
||||||
|
<Setter Property="Background"
|
||||||
|
Value="#6CABEA" />
|
||||||
|
</Trigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</ui:PendingBoxSettings.CancelButtonStyle>
|
||||||
|
</ui:PendingBoxSettings>
|
||||||
|
|
||||||
|
<ui:ToastSettings x:Key="toastSetting"
|
||||||
|
Spacing="25">
|
||||||
|
<ui:ToastSettings.LabelStyle>
|
||||||
|
<Style TargetType="Label"
|
||||||
|
BasedOn="{StaticResource {x:Static ui:Toast.LabelStyleKey}}">
|
||||||
|
<Setter Property="Background"
|
||||||
|
Value="{DynamicResource ToastBackground}" />
|
||||||
|
<Setter Property="Foreground"
|
||||||
|
Value="{DynamicResource ToastForeground}" />
|
||||||
|
</Style>
|
||||||
|
</ui:ToastSettings.LabelStyle>
|
||||||
|
</ui:ToastSettings>
|
||||||
|
|
||||||
|
<ui:GlobalSettings x:Key="settings">
|
||||||
|
<ui:GlobalSettings.Themes>
|
||||||
|
<ui:ApplicationTheme Key="Light"
|
||||||
|
ResourceDictionary="/Samples;component/Themes/Light.xaml" />
|
||||||
|
<ui:ApplicationTheme Key="Dark"
|
||||||
|
ResourceDictionary="/Samples;component/Themes/Dark.xaml" />
|
||||||
|
</ui:GlobalSettings.Themes>
|
||||||
|
</ui:GlobalSettings>
|
||||||
|
</ResourceDictionary>
|
||||||
|
|
||||||
|
<ui:StyleDictionary Includes="All" />
|
||||||
|
|
||||||
</ResourceDictionary.MergedDictionaries>
|
</ResourceDictionary.MergedDictionaries>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
</Application.Resources>
|
</Application.Resources>
|
||||||
|
|||||||
@ -10,9 +10,9 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
|
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
|
||||||
<PackageReference Include="MaterialDesignThemes" Version="4.9.0" />
|
|
||||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.3" />
|
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.3" />
|
||||||
<PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" />
|
<PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" />
|
||||||
|
<PackageReference Include="Panuon.WPF.UI" Version="1.3.0.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
<Window x:Class="Seyounth.Hyosung.Views.MainWindow"
|
<ui:WindowX x:Class="Seyounth.Hyosung.Views.MainWindow"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
@ -6,124 +6,396 @@
|
|||||||
xmlns:local="clr-namespace:Seyounth.Hyosung"
|
xmlns:local="clr-namespace:Seyounth.Hyosung"
|
||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
xmlns:views="clr-namespace:Seyounth.Hyosung.Views"
|
xmlns:views="clr-namespace:Seyounth.Hyosung.Views"
|
||||||
|
xmlns:ui="https://opensource.panuon.com/wpf-ui"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
d:DataContext="{d:DesignInstance views:MainWindow,
|
d:DataContext="{d:DesignInstance views:MainWindow,
|
||||||
IsDesignTimeCreatable=True}"
|
IsDesignTimeCreatable=True}"
|
||||||
|
ui:WindowXCaption.Height="50"
|
||||||
|
ui:WindowXCaption.Foreground="#F1F1F1"
|
||||||
|
ui:WindowXCaption.Background="#C62F2F"
|
||||||
Title="{Binding ViewModel.ApplicationTitle, Mode=OneWay}"
|
Title="{Binding ViewModel.ApplicationTitle, Mode=OneWay}"
|
||||||
Height="1080" Width="1920"
|
Height="1080" Width="1920">
|
||||||
WindowStartupLocation="CenterScreen"
|
<ui:WindowX.Resources>
|
||||||
WindowStyle="None"
|
<Style x:Key="HeaderSolidIconButtonStyle"
|
||||||
AllowsTransparency="True"
|
TargetType="Button"
|
||||||
WindowState="Maximized"
|
BasedOn="{StaticResource {x:Type Button}}">
|
||||||
Background="Transparent">
|
<Setter Property="ui:ButtonHelper.CornerRadius"
|
||||||
<Border Background="{DynamicResource MaterialDesignPaper}"
|
Value="3,0,0,3" />
|
||||||
CornerRadius="4"
|
<Setter Property="Height"
|
||||||
Margin="10"
|
Value="25" />
|
||||||
materialDesign:ElevationAssist.Elevation="Dp2">
|
<Setter Property="Width"
|
||||||
|
Value="30" />
|
||||||
|
<Setter Property="FontFamily"
|
||||||
|
Value="{StaticResource PanuonIconFont}" />
|
||||||
|
<Setter Property="Background"
|
||||||
|
Value="Transparent" />
|
||||||
|
<Setter Property="BorderBrush"
|
||||||
|
Value="#B12323" />
|
||||||
|
<Setter Property="BorderThickness"
|
||||||
|
Value="1" />
|
||||||
|
<Setter Property="Foreground"
|
||||||
|
Value="#F1F1F1" />
|
||||||
|
<Setter Property="ui:ButtonHelper.HoverBackground"
|
||||||
|
Value="#1A3E3E3E" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style x:Key="HeaderLinkIconButtonStyle"
|
||||||
|
TargetType="Button"
|
||||||
|
BasedOn="{StaticResource {x:Type Button}}">
|
||||||
|
<Setter Property="ui:ButtonHelper.CornerRadius"
|
||||||
|
Value="3,0,0,3" />
|
||||||
|
<Setter Property="FontFamily"
|
||||||
|
Value="{StaticResource PanuonIconFont}" />
|
||||||
|
<Setter Property="FontSize"
|
||||||
|
Value="16" />
|
||||||
|
<Setter Property="Background"
|
||||||
|
Value="Transparent" />
|
||||||
|
<Setter Property="Foreground"
|
||||||
|
Value="#E8E8E8" />
|
||||||
|
<Setter Property="ui:ButtonHelper.HoverForeground"
|
||||||
|
Value="#E1E1E1" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style x:Key="SearchBoxStyle"
|
||||||
|
TargetType="ui:SearchBox">
|
||||||
|
<Setter Property="ui:ShadowHelper.Opacity"
|
||||||
|
Value="0.5" />
|
||||||
|
<Setter Property="ui:ShadowHelper.BlurRadius"
|
||||||
|
Value="25" />
|
||||||
|
<Setter Property="ui:DropDownHelper.ShadowColor"
|
||||||
|
Value="#C62F2F" />
|
||||||
|
<Setter Property="ui:DropDownHelper.BorderBrush"
|
||||||
|
Value="#C62F2F" />
|
||||||
|
<Setter Property="ui:DropDownHelper.Background"
|
||||||
|
Value="White" />
|
||||||
|
<Setter Property="ui:DropDownHelper.CornerRadius"
|
||||||
|
Value="4" />
|
||||||
|
<Setter Property="ui:WindowX.IsDragMoveArea"
|
||||||
|
Value="False" />
|
||||||
|
<Setter Property="FocusedShadowColor"
|
||||||
|
Value="#C62F2F" />
|
||||||
|
<Setter Property="CornerRadius"
|
||||||
|
Value="13" />
|
||||||
|
<Setter Property="Height"
|
||||||
|
Value="26" />
|
||||||
|
<Setter Property="Width"
|
||||||
|
Value="220" />
|
||||||
|
<Setter Property="FontSize"
|
||||||
|
Value="12" />
|
||||||
|
<Setter Property="Background"
|
||||||
|
Value="#B12323" />
|
||||||
|
<Setter Property="Foreground"
|
||||||
|
Value="#F1F1F1" />
|
||||||
|
<Setter Property="Padding"
|
||||||
|
Value="10,0,30,0" />
|
||||||
|
<Setter Property="Watermark"
|
||||||
|
Value="Search musics, vedios, radios" />
|
||||||
|
<Setter Property="ItemsBorderBrush"
|
||||||
|
Value="#C62F2F" />
|
||||||
|
<Setter Property="ItemsCornerRadius"
|
||||||
|
Value="4" />
|
||||||
|
<Setter Property="ItemsHeight"
|
||||||
|
Value="35" />
|
||||||
|
<Setter Property="ItemsForeground"
|
||||||
|
Value="#1E1E1E" />
|
||||||
|
<Setter Property="ItemsHoverBackground"
|
||||||
|
Value="{x:Null}" />
|
||||||
|
<Setter Property="ItemsHoverForeground"
|
||||||
|
Value="#C62F2F" />
|
||||||
|
<Setter Property="ItemContainerStyle">
|
||||||
|
<Setter.Value>
|
||||||
|
<Style TargetType="ui:SearchBoxItem">
|
||||||
|
<Setter Property="Height"
|
||||||
|
Value="50" />
|
||||||
|
</Style>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
<Setter Property="ItemTemplate">
|
||||||
|
<Setter.Value>
|
||||||
|
<DataTemplate>
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<ColumnDefinition Width="Auto" />
|
||||||
<RowDefinition Height="*" />
|
<ColumnDefinition />
|
||||||
</Grid.RowDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<materialDesign:ColorZone Padding="16"
|
<TextBlock FontSize="14"
|
||||||
materialDesign:ElevationAssist.Elevation="Dp4"
|
Text=""
|
||||||
DockPanel.Dock="Top"
|
FontFamily="{StaticResource PanuonIconFont}"
|
||||||
Mode="PrimaryMid">
|
VerticalAlignment="Center" />
|
||||||
<DockPanel>
|
<TextBlock Grid.Column="1"
|
||||||
|
Margin="5,0,0,0"
|
||||||
<StackPanel DockPanel.Dock="Right" Orientation="Horizontal">
|
Text="{Binding}"
|
||||||
<Button x:Name="One" Margin="-20,-20,10,-20"
|
VerticalAlignment="Center" />
|
||||||
Content="_"
|
|
||||||
Command="{Binding ViewModel.MinimizeCommand}" />
|
|
||||||
<Button x:Name="Exit"
|
|
||||||
Content="X"
|
|
||||||
Command="{Binding ViewModel.ExitCommand}" />
|
|
||||||
|
|
||||||
</StackPanel>
|
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
FontSize="22"
|
|
||||||
Text="Hyosung -- Seyounth Auto" />
|
|
||||||
</DockPanel>
|
|
||||||
</materialDesign:ColorZone>
|
|
||||||
<materialDesign:Card Grid.Row="1">
|
|
||||||
<TabControl
|
|
||||||
x:Name="MenuTab"
|
|
||||||
materialDesign:ColorZoneAssist.Mode="Standard"
|
|
||||||
materialDesign:ElevationAssist.Elevation="Dp8"
|
|
||||||
Style="{StaticResource MaterialDesignNavigationRailTabControl}">
|
|
||||||
<TabItem x:Name="Home">
|
|
||||||
<TabItem.Header>
|
|
||||||
<StackPanel
|
|
||||||
Width="auto"
|
|
||||||
Height="auto">
|
|
||||||
<materialDesign:PackIcon
|
|
||||||
Width="24"
|
|
||||||
Height="24"
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
Kind="Home" />
|
|
||||||
<TextBlock
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
Text="仪表盘" />
|
|
||||||
</StackPanel>
|
|
||||||
</TabItem.Header>
|
|
||||||
<Frame Padding="16" HorizontalAlignment="Stretch"
|
|
||||||
VerticalAlignment="Stretch" x:Name="HomeFrame" />
|
|
||||||
</TabItem>
|
|
||||||
<TabItem x:Name="VarietyTabItem">
|
|
||||||
<TabItem.Header>
|
|
||||||
<StackPanel
|
|
||||||
Width="auto"
|
|
||||||
Height="auto">
|
|
||||||
<materialDesign:PackIcon
|
|
||||||
Width="24"
|
|
||||||
Height="24"
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
Kind="ListBox" />
|
|
||||||
<TextBlock
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
Text="产品信息" />
|
|
||||||
</StackPanel>
|
|
||||||
</TabItem.Header>
|
|
||||||
<Frame Padding="16" HorizontalAlignment="Stretch"
|
|
||||||
VerticalAlignment="Stretch" x:Name="VarietyFrame" />
|
|
||||||
</TabItem>
|
|
||||||
<TabItem>
|
|
||||||
<TabItem.Header>
|
|
||||||
<StackPanel
|
|
||||||
Width="auto"
|
|
||||||
Height="auto">
|
|
||||||
<materialDesign:PackIcon
|
|
||||||
Width="24"
|
|
||||||
Height="24"
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
Kind="Info" />
|
|
||||||
<TextBlock
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
Text="运行状态" />
|
|
||||||
</StackPanel>
|
|
||||||
</TabItem.Header>
|
|
||||||
</TabItem>
|
|
||||||
<TabItem>
|
|
||||||
<TabItem.Header>
|
|
||||||
<StackPanel
|
|
||||||
Width="auto"
|
|
||||||
Height="auto">
|
|
||||||
<materialDesign:PackIcon
|
|
||||||
Width="24"
|
|
||||||
Height="24"
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
Kind="Settings" />
|
|
||||||
<TextBlock
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
Text="系统设置" />
|
|
||||||
</StackPanel>
|
|
||||||
</TabItem.Header>
|
|
||||||
</TabItem>
|
|
||||||
</TabControl>
|
|
||||||
</materialDesign:Card>
|
|
||||||
</Grid>
|
</Grid>
|
||||||
|
</DataTemplate>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style x:Key="MainMenuTreeViewStyle"
|
||||||
|
TargetType="TreeView"
|
||||||
|
BasedOn="{StaticResource {x:Type TreeView}}">
|
||||||
|
<Setter Property="ui:IconHelper.FontFamily"
|
||||||
|
Value="{StaticResource PanuonIconFont}" />
|
||||||
|
<Setter Property="ui:IconHelper.FontSize"
|
||||||
|
Value="20" />
|
||||||
|
<Setter Property="ui:TreeViewHelper.ItemsBorderBrush"
|
||||||
|
Value="Transparent" />
|
||||||
|
<Setter Property="ui:TreeViewHelper.ItemsSelectedBorderBrush"
|
||||||
|
Value="#C62F2F" />
|
||||||
|
<Setter Property="ui:TreeViewHelper.ItemsSelectedBackground"
|
||||||
|
Value="#E8E8E8" />
|
||||||
|
<Setter Property="ui:TreeViewHelper.ItemsBorderThickness"
|
||||||
|
Value="3,0,0,0" />
|
||||||
|
<Setter Property="ui:TreeViewHelper.ItemsHeight"
|
||||||
|
Value="35" />
|
||||||
|
<Setter Property="BorderThickness"
|
||||||
|
Value="0" />
|
||||||
|
<Setter Property="ui:TreeViewHelper.ToggleArrowToggleButtonStyle"
|
||||||
|
Value="{x:Null}" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style x:Key="SubMenuTabControlStyle"
|
||||||
|
TargetType="TabControl"
|
||||||
|
BasedOn="{StaticResource {x:Type TabControl}}">
|
||||||
|
<Setter Property="ui:TabControlHelper.HeaderPanelAlignment"
|
||||||
|
Value="Center" />
|
||||||
|
<Setter Property="ui:TabControlHelper.ItemsHeight"
|
||||||
|
Value="45" />
|
||||||
|
<Setter Property="ui:TabControlHelper.ItemsPadding"
|
||||||
|
Value="15,0" />
|
||||||
|
<Setter Property="BorderThickness"
|
||||||
|
Value="0" />
|
||||||
|
<Setter Property="ui:TabControlHelper.ItemsHoverBackground"
|
||||||
|
Value="{x:Null}" />
|
||||||
|
<Setter Property="ui:TabControlHelper.ItemsRibbonLineVisibility"
|
||||||
|
Value="Visible" />
|
||||||
|
<Setter Property="ui:TabControlHelper.ItemsRibbonLinePlacement"
|
||||||
|
Value="Bottom" />
|
||||||
|
<Setter Property="ui:TabControlHelper.ItemsRibbonLineBrush"
|
||||||
|
Value="Transparent" />
|
||||||
|
<Setter Property="ui:TabControlHelper.ItemsHoverRibbonLineBrush"
|
||||||
|
Value="#C62F2F" />
|
||||||
|
<Setter Property="ui:TabControlHelper.ItemsHoverRibbonLineThickness"
|
||||||
|
Value="1" />
|
||||||
|
<Setter Property="ui:TabControlHelper.ItemsSelectedRibbonLineBrush"
|
||||||
|
Value="#C62F2F" />
|
||||||
|
<Setter Property="ui:TabControlHelper.ItemsSelectedRibbonLineThickness"
|
||||||
|
Value="3" />
|
||||||
|
<Setter Property="ui:TabControlHelper.ItemsSelectedBackground"
|
||||||
|
Value="{x:Null}" />
|
||||||
|
<Setter Property="ui:TabControlHelper.HeaderPanelBorderBrush"
|
||||||
|
Value="LightGray" />
|
||||||
|
<Setter Property="ui:TabControlHelper.HeaderPanelBorderThickness"
|
||||||
|
Value="0,0,0,1" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style x:Key="CarouselStyle"
|
||||||
|
TargetType="ui:Carousel">
|
||||||
|
<Setter Property="Animation"
|
||||||
|
Value="Flow,Fade" />
|
||||||
|
<Setter Property="AnimationEasing"
|
||||||
|
Value="CubicOut" />
|
||||||
|
<Setter Property="IndicatorVisibility"
|
||||||
|
Value="Visible" />
|
||||||
|
<Setter Property="IndicatorPaginationStyle">
|
||||||
|
<Setter.Value>
|
||||||
|
<Style TargetType="ui:Pagination"
|
||||||
|
BasedOn="{StaticResource {x:Static ui:Carousel.IndicatorPaginationStyleKey}}">
|
||||||
|
<Setter Property="ItemsWidth"
|
||||||
|
Value="NaN" />
|
||||||
|
<Setter Property="ItemsHeight"
|
||||||
|
Value="NaN" />
|
||||||
|
<Setter Property="ItemsBackground"
|
||||||
|
Value="Transparent" />
|
||||||
|
<Setter Property="ItemsForeground"
|
||||||
|
Value="#55000000" />
|
||||||
|
<Setter Property="ItemsSelectedBackground"
|
||||||
|
Value="{x:Null}" />
|
||||||
|
<Setter Property="ItemsSelectedForeground"
|
||||||
|
Value="#C62F2F" />
|
||||||
|
<Setter Property="ItemContainerStyle">
|
||||||
|
<Setter.Value>
|
||||||
|
<Style TargetType="ui:PaginationItem">
|
||||||
|
<Setter Property="Cursor"
|
||||||
|
Value="Hand" />
|
||||||
|
<Setter Property="ContentTemplate">
|
||||||
|
<Setter.Value>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock Text=""
|
||||||
|
FontFamily="{StaticResource PanuonIconFont}"
|
||||||
|
FontSize="16" />
|
||||||
|
</DataTemplate>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
</Style>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
</Style>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
</Style>
|
||||||
|
</ui:WindowX.Resources>
|
||||||
|
<ui:WindowXCaption.MinimizeButtonStyle>
|
||||||
|
<Style TargetType="Button"
|
||||||
|
BasedOn="{StaticResource {x:Static ui:WindowXCaption.MinimizeButtonStyleKey}}">
|
||||||
|
<Setter Property="VerticalAlignment"
|
||||||
|
Value="Center" />
|
||||||
|
<Setter Property="Background"
|
||||||
|
Value="Transparent" />
|
||||||
|
<Setter Property="Foreground"
|
||||||
|
Value="#E8E8E8" />
|
||||||
|
<Setter Property="ui:ButtonHelper.HoverForeground"
|
||||||
|
Value="#E1E1E1" />
|
||||||
|
<Setter Property="ui:ButtonHelper.HoverBackground"
|
||||||
|
Value="{x:Null}" />
|
||||||
|
</Style>
|
||||||
|
</ui:WindowXCaption.MinimizeButtonStyle>
|
||||||
|
<ui:WindowXCaption.MaximizeButtonStyle>
|
||||||
|
<Style TargetType="Button"
|
||||||
|
BasedOn="{StaticResource {x:Static ui:WindowXCaption.MaximizeButtonStyleKey}}">
|
||||||
|
<Setter Property="VerticalAlignment"
|
||||||
|
Value="Center" />
|
||||||
|
<Setter Property="Background"
|
||||||
|
Value="Transparent" />
|
||||||
|
<Setter Property="Foreground"
|
||||||
|
Value="#E8E8E8" />
|
||||||
|
<Setter Property="ui:ButtonHelper.HoverForeground"
|
||||||
|
Value="#E1E1E1" />
|
||||||
|
<Setter Property="ui:ButtonHelper.HoverBackground"
|
||||||
|
Value="{x:Null}" />
|
||||||
|
</Style>
|
||||||
|
</ui:WindowXCaption.MaximizeButtonStyle>
|
||||||
|
<ui:WindowXCaption.CloseButtonStyle>
|
||||||
|
<Style TargetType="Button"
|
||||||
|
BasedOn="{StaticResource {x:Static ui:WindowXCaption.CloseButtonStyleKey}}">
|
||||||
|
<Setter Property="VerticalAlignment"
|
||||||
|
Value="Center" />
|
||||||
|
<Setter Property="Background"
|
||||||
|
Value="Transparent" />
|
||||||
|
<Setter Property="Foreground"
|
||||||
|
Value="#E8E8E8" />
|
||||||
|
<Setter Property="ui:ButtonHelper.HoverForeground"
|
||||||
|
Value="#E1E1E1" />
|
||||||
|
<Setter Property="ui:ButtonHelper.HoverBackground"
|
||||||
|
Value="{x:Null}" />
|
||||||
|
</Style>
|
||||||
|
</ui:WindowXCaption.CloseButtonStyle>
|
||||||
|
<ui:WindowXCaption.HeaderTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<TextBlock FontSize="18"
|
||||||
|
FontWeight="Light"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Margin="15,0,30,0"
|
||||||
|
Foreground="White"
|
||||||
|
Text="NETEASE MUSIC (SIM)" />
|
||||||
|
<StackPanel Grid.Column="1"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<Button ui:WindowX.IsDragMoveArea="False"
|
||||||
|
Style="{StaticResource HeaderSolidIconButtonStyle}"
|
||||||
|
Content="" />
|
||||||
|
<Button ui:WindowX.IsDragMoveArea="False"
|
||||||
|
Style="{StaticResource HeaderSolidIconButtonStyle}"
|
||||||
|
Content="" />
|
||||||
|
</StackPanel>
|
||||||
|
<Grid Grid.Column="2"
|
||||||
|
Margin="10,0,0,0">
|
||||||
|
<ui:SearchBox x:Name="SchBox"
|
||||||
|
Style="{StaticResource SearchBoxStyle}"
|
||||||
|
VerticalAlignment="Center">
|
||||||
|
</ui:SearchBox>
|
||||||
|
<Button ui:WindowX.IsDragMoveArea="False"
|
||||||
|
Style="{StaticResource HeaderLinkIconButtonStyle}"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
Margin="0,0,7,0"
|
||||||
|
Content="" />
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</DataTemplate>
|
||||||
|
</ui:WindowXCaption.HeaderTemplate>
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="250"/>
|
||||||
|
<ColumnDefinition />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid Background="#F5F5F5">
|
||||||
|
<TreeView Grid.Row="1"
|
||||||
|
Style="{StaticResource MainMenuTreeViewStyle}">
|
||||||
|
<TreeViewItem Margin="0,10,0,10"
|
||||||
|
Padding="10,0,0,0"
|
||||||
|
ui:TreeViewItemHelper.IsStyleless="True"
|
||||||
|
Header="码垛管理" />
|
||||||
|
<TreeViewItem ui:TreeViewItemHelper.Icon=""
|
||||||
|
Header="生产看板"
|
||||||
|
IsSelected="True" />
|
||||||
|
<TreeViewItem ui:TreeViewItemHelper.Icon=""
|
||||||
|
Header="Perseonnel FM" />
|
||||||
|
<TreeViewItem ui:TreeViewItemHelper.Icon=""
|
||||||
|
Header="Vedios" />
|
||||||
|
<TreeViewItem ui:TreeViewItemHelper.Icon=""
|
||||||
|
Header="Friends" />
|
||||||
|
<TreeViewItem Margin="0,10,0,10"
|
||||||
|
Padding="10,0,0,0"
|
||||||
|
ui:TreeViewItemHelper.IsStyleless="True"
|
||||||
|
Header="Storage" />
|
||||||
|
<TreeViewItem ui:TreeViewItemHelper.Icon=""
|
||||||
|
Header="Local" />
|
||||||
|
<TreeViewItem ui:TreeViewItemHelper.Icon=""
|
||||||
|
Header="Downloads" />
|
||||||
|
<TreeViewItem Margin="0,10,0,10"
|
||||||
|
Padding="10,0,0,0"
|
||||||
|
ui:TreeViewItemHelper.IsStyleless="True"
|
||||||
|
Header="My" />
|
||||||
|
<TreeViewItem ui:TreeViewItemHelper.Icon=""
|
||||||
|
Header="Favorites" />
|
||||||
|
</TreeView>
|
||||||
|
</Grid>
|
||||||
|
<ScrollViewer Grid.Column="1">
|
||||||
|
<StackPanel>
|
||||||
|
<ui:Carousel Style="{StaticResource CarouselStyle}"
|
||||||
|
AutoPlayDuration="0:0:2"
|
||||||
|
Height="300"
|
||||||
|
TextBlock.FontSize="40"
|
||||||
|
TextBlock.TextAlignment="Center">
|
||||||
|
<Border Background="#FAFAFA">
|
||||||
|
<TextBlock Text="Page 1"
|
||||||
|
VerticalAlignment="Center" />
|
||||||
</Border>
|
</Border>
|
||||||
</Window>
|
<Border Background="#FAFAFA">
|
||||||
|
<TextBlock Text="Page 2"
|
||||||
|
VerticalAlignment="Center" />
|
||||||
|
</Border>
|
||||||
|
<Border Background="#FAFAFA">
|
||||||
|
<TextBlock Text="Page 3"
|
||||||
|
VerticalAlignment="Center" />
|
||||||
|
</Border>
|
||||||
|
<Border Background="#FAFAFA">
|
||||||
|
<TextBlock Text="Page 4"
|
||||||
|
VerticalAlignment="Center" />
|
||||||
|
</Border>
|
||||||
|
<Border Background="#FAFAFA">
|
||||||
|
<TextBlock Text="Page 5"
|
||||||
|
VerticalAlignment="Center" />
|
||||||
|
</Border>
|
||||||
|
</ui:Carousel>
|
||||||
|
|
||||||
|
<TabControl Style="{StaticResource SubMenuTabControlStyle}">
|
||||||
|
<TabItem Header="Recommend" />
|
||||||
|
<TabItem Header="List" />
|
||||||
|
<TabItem Header="Radio" />
|
||||||
|
<TabItem Header="Charts" />
|
||||||
|
<TabItem Header="Singer" />
|
||||||
|
<TabItem Header="Newest" />
|
||||||
|
</TabControl>
|
||||||
|
</StackPanel>
|
||||||
|
</ScrollViewer>
|
||||||
|
</Grid>
|
||||||
|
</ui:WindowX>
|
||||||
@ -1,8 +1,4 @@
|
|||||||
using System.Windows;
|
using Seyounth.Hyosung.ViewModels;
|
||||||
using Seyounth.Hyosung.Data.Models;
|
|
||||||
using Seyounth.Hyosung.Data.Services;
|
|
||||||
using Seyounth.Hyosung.Runtime;
|
|
||||||
using Seyounth.Hyosung.ViewModels;
|
|
||||||
using Seyounth.Hyosung.Views.Pages;
|
using Seyounth.Hyosung.Views.Pages;
|
||||||
|
|
||||||
namespace Seyounth.Hyosung.Views;
|
namespace Seyounth.Hyosung.Views;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user