增加功能

This commit is contained in:
anerx 2025-03-17 22:17:28 +08:00
parent 42dfa6d96c
commit 550d0b7308
21 changed files with 625 additions and 256 deletions

View File

@ -15,7 +15,6 @@ public class HyosungPlcService(ILogger<HyosungPlcService> logger) : IHyosungPlcS
public async Task StartAsync(CancellationToken token) public async Task StartAsync(CancellationToken token)
{ {
token = token;
List<Task<int>> ls = List<Task<int>> ls =
[ [
_reader.ConnectAsync(), _reader.ConnectAsync(),

View File

@ -12,7 +12,20 @@ public class McPlc(string host, int port, Mitsubishi.McFrame type)
_mc.HostName = host; _mc.HostName = host;
_mc.PortNumber = port; _mc.PortNumber = port;
_mc.CommandFrame = type; _mc.CommandFrame = type;
return await _mc.Open(); using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1));
var openTask = Task.Run(()=>_mc.Open(), cts.Token) ;
var completedTask = await Task.WhenAny(
openTask,
Task.Delay(Timeout.Infinite, cts.Token)
);
if (completedTask != openTask)
{
throw new TimeoutException("PLC 连接超时 (1 秒未响应)");
}
return await openTask;
} }
public Task<int> CloseAsync() public Task<int> CloseAsync()

View File

@ -1,8 +1,13 @@
using Seyounth.Core.Extensions;
using Seyounth.Hyosung.Data.Entities; using Seyounth.Hyosung.Data.Entities;
namespace Seyounth.Hyosung.Data.Models; namespace Seyounth.Hyosung.Data.Models;
public class Pallet : PalletEntity { public class Pallet : PalletEntity
{
public string Name =>
$"{Type.GetDescription()}({Width}*{Height}*{Length})({HoleCount}|{(IsBigHole != null && IsBigHole.Value ? "" : "")})";
public static Pallet FromEntity(PalletEntity p) public static Pallet FromEntity(PalletEntity p)
{ {
return new Pallet() return new Pallet()
@ -16,6 +21,4 @@ public class Pallet : PalletEntity {
Type = p.Type Type = p.Type
}; };
} }
}
}

View File

@ -1,3 +1,5 @@
using System.ComponentModel;
namespace Seyounth.Hyosung.Data.Models; namespace Seyounth.Hyosung.Data.Models;
public enum PalletType public enum PalletType
@ -5,20 +7,20 @@ public enum PalletType
/// <summary> /// <summary>
/// 纸板托盘 /// 纸板托盘
/// </summary> /// </summary>
Paper=0, [Description("纸板")] Paper = 0,
/// <summary> /// <summary>
/// 胶合板托盘 /// 胶合板托盘
/// </summary> /// </summary>
Plywood = 1, [Description("胶合板")] Plywood = 1,
/// <summary> /// <summary>
/// 木板托盘 /// 木板托盘
/// </summary> /// </summary>
Wood = 2, [Description("木托")] Wood = 2,
/// <summary> /// <summary>
/// 蜂窝板 /// 蜂窝板
/// </summary> /// </summary>
Honey=3 [Description("蜂窝板")] Honey = 3
} }

View File

@ -17,22 +17,22 @@ public static class ServiceExtensions
services.AddSingleton<ISqlSugarClient>(s => services.AddSingleton<ISqlSugarClient>(s =>
{ {
//#if RELEASE //#if RELEASE
// SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig()
// {
// DbType = DbType.SqlServer,
// ConnectionString = connectionString,
// IsAutoCloseConnection = true,
// }
// );
//#elif DEBUG
SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig() SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig()
{ {
DbType = DbType.SqlServer, DbType = DbType.Sqlite,
ConnectionString = connectionString, ConnectionString = "Data Source=hyosung.db",
IsAutoCloseConnection = true, IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute
} }
); );
//#elif DEBUG
//SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig()
// {
// DbType = DbType.Sqlite,
// ConnectionString = "Data Source=hyosung.db",
// IsAutoCloseConnection = true,
// InitKeyType = InitKeyType.Attribute
// }
//);
//#endif //#endif
return sqlSugar; return sqlSugar;
}); });
@ -43,6 +43,7 @@ public static class ServiceExtensions
services.AddSingleton<IAgvBinService, AgvBinService>(); services.AddSingleton<IAgvBinService, AgvBinService>();
services.AddSingleton<IDictService, DictService>(); services.AddSingleton<IDictService, DictService>();
services.AddSingleton<IHyosungWmsService, HyosungWmsService>(); services.AddSingleton<IHyosungWmsService, HyosungWmsService>();
services.AddSingleton<IPalletService, PalletService>();
return services; return services;
} }

View File

@ -0,0 +1,14 @@
using Seyounth.Hyosung.Data.Models;
namespace Seyounth.Hyosung.Data.Services;
public interface IPalletService
{
List<Pallet> GetPallets();
Task<int> AddPalletAsync(Pallet pallet);
Task DeletePalletAsync(Pallet pallet);
Task UpdatePalletAsync(Pallet pallet);
}

View File

@ -0,0 +1,44 @@
using Microsoft.Extensions.DependencyInjection;
using Seyounth.Hyosung.Data.Entities;
using Seyounth.Hyosung.Data.Models;
using Seyounth.Hyosung.Data.Repositories;
namespace Seyounth.Hyosung.Data.Services;
public class PalletService : IPalletService
{
private readonly List<Pallet> _pallets;
public readonly IRepository<PalletEntity> _palletRepository;
public PalletService(IServiceProvider serviceProvider)
{
_palletRepository = serviceProvider.CreateScope().ServiceProvider
.GetRequiredService<IRepository<PalletEntity>>();
_pallets = _palletRepository.GetList().Select(Pallet.FromEntity).ToList();
}
public List<Pallet> GetPallets()
{
return _pallets;
}
public async Task<int> AddPalletAsync(Pallet pallet)
{
var id = await _palletRepository.InsertReturnIdentityAsync(pallet);
pallet.Id = id;
_pallets.Add(pallet);
return id;
}
public async Task DeletePalletAsync(Pallet pallet)
{
await _palletRepository.DeleteAsync(pallet);
_pallets.Remove(pallet);
}
public async Task UpdatePalletAsync(Pallet pallet)
{
await _palletRepository.UpdateAsync(pallet);
_pallets[_pallets.IndexOf(pallet)] = pallet;
}
}

View File

@ -32,6 +32,7 @@ public class HyosungRuntime(
{ {
//启动扫码服务 //启动扫码服务
await hyosungScannerService.StartAsync(token); await hyosungScannerService.StartAsync(token);
await printer.StartAsync(token);
//最后启动PLC服务 //最后启动PLC服务
hyosungPlcService.OnPlcRequestScanProduct += OnPlcRequestScanProduct; hyosungPlcService.OnPlcRequestScanProduct += OnPlcRequestScanProduct;
hyosungPlcService.OnPlcRequestScanFixture += OnPlcRequestScanFixture; hyosungPlcService.OnPlcRequestScanFixture += OnPlcRequestScanFixture;
@ -46,7 +47,7 @@ public class HyosungRuntime(
public async Task StopAsync(CancellationToken token) public async Task StopAsync(CancellationToken token)
{ {
//先停止扫码服务 //先停止扫码服务
// await hyosungScannerService.StopAsync(token); await hyosungScannerService.StopAsync(token);
await printer.StopAsync(token); await printer.StopAsync(token);
//先停止PLC服务 //先停止PLC服务
//解绑相关事件 //解绑相关事件

View File

@ -12,7 +12,7 @@ public class HyosungWorker(IHyosungRuntime runtime) : BackgroundService
public override async Task StartAsync(CancellationToken cancellationToken) public override async Task StartAsync(CancellationToken cancellationToken)
{ {
await runtime.StartAsync(cancellationToken); runtime.StartAsync(cancellationToken);
await base.StartAsync(cancellationToken); await base.StartAsync(cancellationToken);
} }

View File

@ -16,6 +16,7 @@ using Seyounth.Hyosung.Services;
using Seyounth.Hyosung.ViewModels; using Seyounth.Hyosung.ViewModels;
using Seyounth.Hyosung.Views; using Seyounth.Hyosung.Views;
using Seyounth.Hyosung.Views.Pages; using Seyounth.Hyosung.Views.Pages;
using Seyounth.Hyosung.Views.Windows;
namespace Seyounth.Hyosung; namespace Seyounth.Hyosung;
@ -40,6 +41,8 @@ public partial class App : Application
builder.Services.AddSingleton<VarietyViewModel>(); builder.Services.AddSingleton<VarietyViewModel>();
builder.Services.AddSingleton<HomeViewPage>(); builder.Services.AddSingleton<HomeViewPage>();
builder.Services.AddSingleton<HomeViewModel>(); builder.Services.AddSingleton<HomeViewModel>();
builder.Services.AddTransient<PalletManagerWindow>();
builder.Services.AddSingleton<PalletManagerViewModel>();
builder.Services.AddHyosung(builder.Configuration); builder.Services.AddHyosung(builder.Configuration);
_host = builder.Build(); _host = builder.Build();

View File

@ -0,0 +1,12 @@
using System.ComponentModel;
using System.Reflection;
public class EnumDisplayHelper
{
public static string DisplayName(object item)
{
if (item == null) return "";
var field = item.GetType().GetField(item.ToString());
return field?.GetCustomAttribute<DescriptionAttribute>()?.Description ?? item.ToString();
}
}

View File

@ -0,0 +1,24 @@
using System.ComponentModel;
using System.Globalization;
using System.Windows.Data;
namespace Seyounth.Hyosung.ViewConverter;
public class EnumDescriptionConverter : IValueConverter
{
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
if (value == null) return null;
var field = value.GetType().GetField(value.ToString() ?? string.Empty);
if (field == null) return null;
var attributes = field.GetCustomAttributes(typeof(DescriptionAttribute), false);
return attributes.Length == 0 ? value.ToString() : ((DescriptionAttribute)attributes[0]).Description;
}
public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

View File

@ -0,0 +1,40 @@
using System.Globalization;
using System.Net.Mime;
using System.Windows;
using System.Windows.Data;
using Seyounth.Hyosung.Data.Models;
using Seyounth.Hyosung.ViewModels;
namespace Seyounth.Hyosung.ViewConverter;
public class PalletToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Pallet pallet)
{
// 这里根据 Pallet 类的属性选择合适的字符串表示
return pallet.Name;
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string palletName)
{
// 这里需要根据实际情况实现反向转换逻辑
// 例如,从名称查找对应的 Pallet 对象
// 假设在 ViewModel 中有一个 Pallets 集合
// 修正:获取正确的 ViewModel 引用
var viewModel = Application.Current.MainWindow.DataContext as VarietyViewModel;
if (viewModel != null)
{
return viewModel.Pallets.FirstOrDefault(p => p.Name == palletName);
}
}
return null;
}
}

View File

@ -0,0 +1,55 @@
using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
using Seyounth.Hyosung.Data.Models;
using Seyounth.Hyosung.Data.Services;
namespace Seyounth.Hyosung.ViewModels;
public partial class PalletManagerViewModel : ObservableObject
{
[ObservableProperty] private ObservableCollection<Pallet> _pallets;
private readonly IPalletService _palletService;
public PalletManagerViewModel(IPalletService palletService)
{
Pallets = new ObservableCollection<Pallet>(palletService.GetPallets());
_palletService = palletService;
}
public class SavePalletCompletedMessage
{
}
[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)
{
_palletService.AddPalletAsync(pallet);
}
else
_palletService.UpdatePalletAsync(pallet);
}
WeakReferenceMessenger.Default.Send(new SavePalletCompletedMessage());
}
}

View File

@ -1,3 +1,4 @@
using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using Seyounth.Core.Extensions; using Seyounth.Core.Extensions;
using Seyounth.Hyosung.Data.Entities; using Seyounth.Hyosung.Data.Entities;
@ -7,12 +8,17 @@ namespace Seyounth.Hyosung.ViewModels;
public partial class VarietyViewModel : ObservableObject public partial class VarietyViewModel : ObservableObject
{ {
[ObservableProperty] private List<VarietyEntity> _varieties; [ObservableProperty] private ObservableCollection<Variety> _varieties;
[ObservableProperty] private ObservableCollection<Pallet> _pallets;
public IEnumerable<NeedTypeEnumItem> NeedTypeItems { get; } public IEnumerable<NeedTypeEnumItem> NeedTypeItems { get; }
public VarietyViewModel()
public VarietyViewModel(PalletManagerViewModel palletManagerViewModel)
{ {
_varieties = new List<VarietyEntity>(); Pallets = new ObservableCollection<Pallet>(palletManagerViewModel.Pallets);
_varieties = new ObservableCollection<Variety>();
var needTypes = EnumHelper.GetValues<NeedType>(); var needTypes = EnumHelper.GetValues<NeedType>();
NeedTypeItems = needTypes.Select(nt => new NeedTypeEnumItem NeedTypeItems = needTypes.Select(nt => new NeedTypeEnumItem
{ {
@ -20,6 +26,4 @@ public partial class VarietyViewModel : ObservableObject
Description = nt.GetDescription() Description = nt.GetDescription()
}); });
} }
} }

View File

@ -1,62 +0,0 @@
<UserControl x:Class="Seyounth.Hyosung.Views.Controls.AddVarietyControl"
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.Views.Controls"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<StackPanel
Margin="16">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="产品编号:" VerticalAlignment="Center" Margin="0,0,10,0"/>
<TextBox Grid.Column="1"
x:Name="VarietyCodeTextBox">
</TextBox>
</Grid>
<TextBox Grid.Row="1"
x:Name="LotTextBox"
materialDesign:HintAssist.Hint="Lot">
</TextBox>
</Grid>
<StackPanel
HorizontalAlignment="Right"
Orientation="Horizontal">
<Button
Margin="0,8,8,0"
Content="ACCEPT"
IsDefault="True"
Style="{StaticResource MaterialDesignFlatButton}">
<Button.CommandParameter>
<system:Boolean
xmlns:system="clr-namespace:System;assembly=mscorlib">
True
</system:Boolean>
</Button.CommandParameter>
</Button>
<Button
Margin="0,8,8,0"
Content="CANCEL"
IsCancel="True"
Style="{StaticResource MaterialDesignFlatButton}">
<Button.CommandParameter>
<system:Boolean
xmlns:system="clr-namespace:System;assembly=mscorlib">
False
</system:Boolean>
</Button.CommandParameter>
</Button>
</StackPanel>
</StackPanel>
</UserControl>

View File

@ -1,22 +0,0 @@
using System.Windows;
using System.Windows.Controls;
namespace Seyounth.Hyosung.Views.Controls;
public partial class AddVarietyControl : UserControl
{
public AddVarietyControl()
{
InitializeComponent();
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
throw new NotImplementedException();
}
private void OkButton_Click(object sender, RoutedEventArgs e)
{
throw new NotImplementedException();
}
}

View File

@ -5,138 +5,237 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Seyounth.Hyosung.Views.Pages" xmlns:local="clr-namespace:Seyounth.Hyosung.Views.Pages"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:viewConverter="clr-namespace:Seyounth.Hyosung.ViewConverter"
xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"
xmlns:models="clr-namespace:Seyounth.Hyosung.Data.Models;assembly=Seyounth.Hyosung.Data"
xmlns:system="clr-namespace:System;assembly=System.Runtime"
mc:Ignorable="d" mc:Ignorable="d"
x:Name="VarietyRoot"
Width="Auto" Width="Auto"
Height="Auto" Height="Auto"
d:DataContext="{d:DesignInstance local:VarietyPage, d:DataContext="{d:DesignInstance local:VarietyPage,
IsDesignTimeCreatable=True}"> IsDesignTimeCreatable=True}">
<materialDesign:DialogHost x:Name="Root" <Page.Resources>
DialogMargin="8" <ObjectDataProvider x:Key="NeedType"
Style="{StaticResource MaterialDesignEmbeddedDialogHost}" > ObjectType="{x:Type system:Enum}"
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Height="Auto"> MethodName="GetValues">
<Grid.RowDefinitions> <ObjectDataProvider.MethodParameters>
<RowDefinition Height="Auto" /> <x:Type TypeName="models:NeedType" />
<RowDefinition Height="Auto" /> </ObjectDataProvider.MethodParameters>
</Grid.RowDefinitions> </ObjectDataProvider>
<ToolBarTray> <viewConverter:EnumDescriptionConverter x:Key="EnumDescriptionConverter" />
<ToolBar ClipToBounds="False" <viewConverter:PalletToStringConverter x:Key="PalletToStringConverter" />
Style="{StaticResource MaterialDesignToolBar}"> </Page.Resources>
<Button <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Height="Auto">
Content="{materialDesign:PackIcon Kind=Add}" <Grid.RowDefinitions>
Click="ButtonBase_OnClick" <RowDefinition Height="Auto" />
ToolTip="新增" /> <RowDefinition Height="Auto" />
<Button </Grid.RowDefinitions>
Content="{materialDesign:PackIcon Kind=Edit}" <ToolBarTray>
ToolTip="编辑" /> <ToolBar ClipToBounds="False"
<Button Style="{StaticResource MaterialDesignToolBar}">
Content="{materialDesign:PackIcon Kind=Delete}" <ComboBox Margin="8"
ToolTip="删除" /> FontSize="20"
<Separator /> VerticalAlignment="Center"
<ComboBox Margin="8" Width="400"
Width="400" materialDesign:HintAssist.Hint="品类编号"
materialDesign:HintAssist.Hint="品类编号" materialDesign:TextFieldAssist.HasClearButton="False"
materialDesign:TextFieldAssist.HasClearButton="False" IsEditable="False"
IsEditable="False" ItemsSource="{Binding ViewModel.Varieties}"
ItemsSource="{Binding ViewModel.Varieties}" DisplayMemberPath="Code"
DisplayMemberPath="Code" Style="{StaticResource MaterialDesignOutlinedComboBox}">
Style="{StaticResource MaterialDesignFilledComboBox}"> </ComboBox>
</ComboBox> <Button Content="{materialDesign:PackIcon Kind=Search}" />
<Button <Separator />
Content="{materialDesign:PackIcon Kind=Search}" <TextBox Margin="8"
ToolTip="搜索" /> Width="100"
</ToolBar> FontSize="20"
</ToolBarTray> HorizontalContentAlignment="Left"
<materialDesign:Card Margin="0,10,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" materialDesign:HintAssist.Hint="LOT"
Width="Auto" Style="{StaticResource MaterialDesignOutlinedTextBox}" />
Height="Auto" <Button Content="{materialDesign:PackIcon Kind=Search}" />
Grid.Row="1"> <Separator />
<DataGrid x:Name="VarietyDataGrid" <Button x:Name="TrayManagerButton"
CanUserAddRows="True" Content="{materialDesign:PackIcon Kind=ShippingPallet}"
AutoGenerateColumns="False" Click="TrayManagerButton_OnClick"
HeadersVisibility="All" ToolTip="托盘/隔板管理" />
ItemsSource="{Binding ViewModel.Varieties, Mode=OneWay}" </ToolBar>
SelectionUnit="{Binding ElementName=selectionUnitComboBox, Path=SelectedValue}"> </ToolBarTray>
<DataGrid.Columns> <DataGrid Grid.Row="0" x:Name="VarietyDataGrid"
<DataGridTextColumn FontSize="20"
Binding="{Binding Code}" CanUserAddRows="True"
Header="代码" AutoGenerateColumns="False"
Width="Auto" /> HeadersVisibility="All"
<DataGridTextColumn VerticalContentAlignment="Center"
Binding="{Binding Lot }" ItemsSource="{Binding ViewModel.Varieties, Mode=OneWay}">
Header="LOT" <DataGrid.Columns>
Width="Auto" /> <DataGridTextColumn
<DataGridTextColumn Binding="{Binding Id}"
Binding="{Binding Specifications }" Header="ID"
Header="规格" Width="Auto" />
Width="Auto" /> <DataGridTextColumn
<DataGridTextColumn Binding="{Binding Code}"
Binding="{Binding InnerDiameter }" Header="代码"
Header="内径(D1)" Width="Auto" />
Width="Auto" /> <DataGridTextColumn
<DataGridTextColumn Binding="{Binding Lot }"
Binding="{Binding OuterDiameter }" Header="LOT"
Header="外径(D2)" Width="Auto" />
Width="Auto" /> <DataGridTextColumn
<DataGridTextColumn Binding="{Binding Specifications }"
Binding="{Binding YarnDiameter }" Header="规格"
Header="直径(D3)" Width="Auto" />
Width="Auto" /> <DataGridTextColumn
<DataGridTextColumn Binding="{Binding InnerDiameter }"
Binding="{Binding PaperTubeHeight }" Header="内径(D1)"
Header="纸管高(H1)" Width="Auto" />
Width="Auto" /> <DataGridTextColumn
<DataGridTextColumn Binding="{Binding OuterDiameter }"
Binding="{Binding YarnThickness }" Header="外径(D2)"
Header="纱线厚(H2)" Width="Auto" />
Width="Auto" /> <DataGridTextColumn
<DataGridTextColumn Binding="{Binding YarnDiameter }"
Binding="{Binding SingleWeight }" Header="直径(D3)"
Header="单筒重" Width="Auto" />
Width="Auto" /> <DataGridTextColumn
<DataGridTextColumn Binding="{Binding PaperTubeHeight }"
Binding="{Binding StackingLayers }" Header="纸管高(H1)"
Header="码层数" Width="Auto" />
Width="Auto" /> <DataGridTextColumn
<DataGridTextColumn Binding="{Binding YarnThickness }"
Binding="{Binding TotalCount }" Header="纱线厚(H2)"
Header="个/托" Width="Auto" />
Width="Auto" /> <DataGridTextColumn
<DataGridTextColumn Binding="{Binding SingleWeight }"
Binding="{Binding StackHeadSpec }" Header="单筒重"
Header="垛头尺寸" Width="Auto" />
Width="Auto" /> <DataGridTextColumn
<DataGridTextColumn Binding="{Binding StackingLayers }"
Binding="{Binding StackHeadCount }" Header="码层数"
Header="垛头数量" Width="Auto" />
Width="Auto" /> <DataGridTextColumn
<DataGridComboBoxColumn Binding="{Binding TotalCount }"
TextBinding="{Binding NeedTopBoard }" Header="个/托"
ItemsSource="{Binding }" Width="Auto" />
Header="顶板" <DataGridTemplateColumn Header="蜂窝板(中间)">
Width="Auto" /> <DataGridTemplateColumn.CellTemplate>
<DataGridComboBoxColumn <DataTemplate>
TextBinding="{Binding NeedAngleBeam }" <ComboBox SelectedValue="{Binding Path=MiddlePallet}"
Header="护角" ItemsSource="{Binding Path=ViewModel.Pallets,RelativeSource={RelativeSource AncestorType={x:Type Page},Mode=FindAncestor}}"
Width="Auto" /> DisplayMemberPath="Name">
<DataGridComboBoxColumn </ComboBox>
TextBinding="{Binding NeedFilmWrapping }" </DataTemplate>
Header="缠膜" </DataGridTemplateColumn.CellTemplate>
Width="Auto" /> </DataGridTemplateColumn>
<DataGridComboBoxColumn <DataGridTemplateColumn Header="蜂窝板(上下)">
TextBinding="{Binding NeedFilmCoating }" <DataGridTemplateColumn.CellTemplate>
Header="覆膜" <DataTemplate>
Width="Auto" /> <ComboBox SelectedValue="{Binding Path=MiddlePallet}"
<DataGridTextColumn ItemsSource="{Binding Path=ViewModel.Pallets,RelativeSource={RelativeSource AncestorType={x:Type Page},Mode=FindAncestor}}"
Binding="{Binding MasterLabelCount }" DisplayMemberPath="Name"
Header="主标签数量" materialDesign:TextFieldAssist.HasClearButton="True">
Width="Auto" /> </ComboBox>
<DataGridTextColumn </DataTemplate>
Binding="{Binding SubLabelCount }" </DataGridTemplateColumn.CellTemplate>
Header="副标签数量" </DataGridTemplateColumn>
Width="Auto" /> <DataGridTemplateColumn Header="托盘">
</DataGrid.Columns> <DataGridTemplateColumn.CellTemplate>
</DataGrid> <DataTemplate>
</materialDesign:Card> <ComboBox SelectedValue="{Binding Path=MiddlePallet}"
</Grid> ItemsSource="{Binding Path=ViewModel.Pallets,RelativeSource={RelativeSource AncestorType={x:Type Page},Mode=FindAncestor}}"
</materialDesign:DialogHost> DisplayMemberPath="Name" materialDesign:TextFieldAssist.HasClearButton="True">
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="纸板">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedValue="{Binding Path=MiddlePallet}"
ItemsSource="{Binding Path=ViewModel.Pallets,RelativeSource={RelativeSource AncestorType={x:Type Page},Mode=FindAncestor}}"
DisplayMemberPath="Name" materialDesign:TextFieldAssist.HasClearButton="True">
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn
Binding="{Binding StackHeadSpec }"
Header="垛头尺寸"
Width="Auto" />
<DataGridTextColumn
Binding="{Binding StackHeadCount }"
Header="垛头数量"
Width="Auto" />
<DataGridComboBoxColumn
TextBinding="{Binding NeedTopBoard }"
ItemsSource="{Binding }"
Header="顶板"
Width="Auto" />
<DataGridComboBoxColumn
TextBinding="{Binding NeedAngleBeam }"
Header="护角"
Width="Auto" />
<DataGridComboBoxColumn
TextBinding="{Binding NeedFilmWrapping }"
Header="缠膜"
Width="Auto" />
<DataGridComboBoxColumn Header="覆膜" MinWidth="120"
ItemsSource="{Binding Source={StaticResource NeedType}}"
SelectedValueBinding="{Binding NeedFilmCoating, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
TextBinding="{Binding NeedFilmCoating}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock
Text="{Binding Converter={StaticResource EnumDescriptionConverter}}" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock
Text="{Binding Converter={StaticResource EnumDescriptionConverter}}" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
<DataGridTextColumn
Binding="{Binding MasterLabelCount }"
Header="主标签数量"
Width="Auto" />
<DataGridTextColumn
Binding="{Binding SubLabelCount }"
Header="副标签数量"
Width="Auto" />
<DataGridTemplateColumn Header="操作">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button Margin="0,0,10,0" Content="保存"
Command="{Binding ElementName=PalletWindow, Path=DataContext.ViewModel.SavePalletCommand}"
CommandParameter="{Binding}"
Visibility="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, Path=IsEditing, Converter={StaticResource BooleanToVisibilityConverter}}" />
<!-- 删除按钮 -->
<Button Content="删除"
Background="Red"
Command="{Binding ElementName=PalletWindow, Path=DataContext.ViewModel.DeletePalletCommand}"
CommandParameter="{Binding}" />
<!-- 保存按钮,根据 DataGridRow 的 IsEditing 属性控制可见性 -->
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Page> </Page>

View File

@ -1,10 +1,9 @@
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using MaterialDesignThemes.Wpf; using Microsoft.Extensions.DependencyInjection;
using Seyounth.Hyosung.Data.Entities; using Seyounth.Hyosung.Data.Entities;
using Seyounth.Hyosung.Data.Models;
using Seyounth.Hyosung.ViewModels; using Seyounth.Hyosung.ViewModels;
using Seyounth.Hyosung.Views.Controls; using Seyounth.Hyosung.Views.Windows;
namespace Seyounth.Hyosung.Views.Pages; namespace Seyounth.Hyosung.Views.Pages;
@ -12,25 +11,20 @@ public partial class VarietyPage : Page
{ {
public VarietyViewModel ViewModel { get; set; } public VarietyViewModel ViewModel { get; set; }
private readonly IServiceProvider _serviceProvider;
public VarietyPage(VarietyViewModel viewModel) public VarietyPage(VarietyViewModel viewModel, IServiceProvider serviceProvider)
{ {
_serviceProvider = serviceProvider;
ViewModel = viewModel; ViewModel = viewModel;
DataContext = this; DataContext = this;
InitializeComponent(); InitializeComponent();
} }
private void TrayManagerButton_OnClick(object sender, RoutedEventArgs e)
private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{ {
var blankVariety = new VarietyEntity() var dialog = _serviceProvider.GetService<PalletManagerWindow>();
; dialog.ShowDialog();
// 将空白对象添加到数据源中
ViewModel.Varieties.Add(blankVariety);
// 滚动到新添加的行并使其进入编辑状态
VarietyDataGrid.ScrollIntoView(blankVariety);
var index = ViewModel.Varieties.IndexOf(blankVariety);
VarietyDataGrid.SelectedIndex = index;
VarietyDataGrid.BeginEdit();
} }
} }

View File

@ -0,0 +1,106 @@
<Window x:Class="Seyounth.Hyosung.Views.Windows.PalletManagerWindow"
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.Views.Windows"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:viewConverter="clr-namespace:Seyounth.Hyosung.ViewConverter"
xmlns:system="clr-namespace:System;assembly=System.Runtime"
xmlns:models="clr-namespace:Seyounth.Hyosung.Data.Models;assembly=Seyounth.Hyosung.Data"
xmlns:global="clr-namespace:"
mc:Ignorable="d" WindowStyle="None"
SizeToContent="WidthAndHeight"
AllowsTransparency="True"
x:Name="PalletWindow"
Margin="0" Padding="0"
d:DesignHeight="800" d:DesignWidth="600"
d:DataContext="{d:DesignInstance local:PalletManagerWindow,
IsDesignTimeCreatable=True}"
WindowStartupLocation="CenterScreen">
<Window.Resources>
<ObjectDataProvider x:Key="PalletTypes"
MethodName="GetValues"
ObjectType="{x:Type system:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="models:PalletType" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
<viewConverter:EnumDescriptionConverter x:Key="EnumDescriptionConverter" />
</Window.Resources>
<GroupBox materialDesign:ElevationAssist.Elevation="Dp6"
FontSize="22"
Header="托盘\隔板管理"
Style="{StaticResource MaterialDesignCardGroupBox}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<DataGrid x:Name="PalletDataGrid" FontSize="20" Grid.Row="0"
ItemsSource="{Binding ViewModel.Pallets, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
AutoGenerateColumns="False"
CellEditEnding="DataGrid_CellEditEnding"> <!-- 添加事件处理 -->
<DataGrid.Columns>
<DataGridComboBoxColumn Header="托盘类型" MinWidth="120"
ItemsSource="{Binding Source={StaticResource PalletTypes}}"
SelectedValueBinding="{Binding Type, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
TextBinding="{Binding Type}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock
Text="{Binding Converter={StaticResource EnumDescriptionConverter}}" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock
Text="{Binding Converter={StaticResource EnumDescriptionConverter}}" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
<DataGridTextColumn Header="长度" Binding="{Binding Length}" />
<DataGridTextColumn Header="宽度" Binding="{Binding Width}" />
<DataGridTextColumn Header="高度" Binding="{Binding Height}" />
<DataGridTextColumn Header="孔数" Binding="{Binding HoleCount}" />
<DataGridCheckBoxColumn Header="大孔" Binding="{Binding IsBigHole}" />
<DataGridTemplateColumn Header="操作">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button Margin="0,0,10,0" Content="保存"
Command="{Binding ElementName=PalletWindow, Path=DataContext.ViewModel.SavePalletCommand}"
CommandParameter="{Binding}"
Visibility="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, Path=IsEditing, Converter={StaticResource BooleanToVisibilityConverter}}" />
<!-- 删除按钮 -->
<Button Content="删除"
Background="Red"
Command="{Binding ElementName=PalletWindow, Path=DataContext.ViewModel.DeletePalletCommand}"
CommandParameter="{Binding}" />
<!-- 保存按钮,根据 DataGridRow 的 IsEditing 属性控制可见性 -->
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<StackPanel Margin="16" Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right">
<Button x:Name="ExitButton" Click="ExitButton_OnClick" Width="100" FontSize="22" Content="确定" />
</StackPanel>
</Grid>
</GroupBox>
</Window>

View File

@ -0,0 +1,39 @@
using System.Windows;
using System.Windows.Controls;
using CommunityToolkit.Mvvm.Messaging;
using Seyounth.Hyosung.ViewModels;
namespace Seyounth.Hyosung.Views.Windows;
public partial class PalletManagerWindow : Window
{
public PalletManagerViewModel ViewModel { get; set; }
public PalletManagerWindow(PalletManagerViewModel viewModel)
{
ViewModel = viewModel;
DataContext = this;
InitializeComponent();
WeakReferenceMessenger.Default.Register<PalletManagerViewModel.SavePalletCompletedMessage>(this, (r, m) =>
{
// 提交当前编辑并取消编辑模式
PalletDataGrid.CommitEdit();
PalletDataGrid.CancelEdit();
});
}
private void ExitButton_OnClick(object sender, RoutedEventArgs e)
{
this.Close();
}
private void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
// 强制提交编辑
if (e.EditAction == DataGridEditAction.Commit)
{
var binding = e.EditingElement.GetBindingExpression(TextBox.TextProperty);
binding?.UpdateSource();
}
}
}