新增密炼物料皮重策略功能,包括相关实体、服务、控制器及接口,支持桌面端免密CRUD操作,优化打印记录与原料入场记录的衍生字段填充逻辑,提升用户体验。

This commit is contained in:
geht
2026-06-02 16:28:51 +08:00
parent 37239e1b0a
commit fef7d25e3c
75 changed files with 4407 additions and 170 deletions

View File

@@ -124,6 +124,7 @@
<DataGridTextColumn Header="供料客户" Binding="{Binding SupplyCustomer}" CellStyle="{StaticResource CusDataGridCellStyle}" Width="120"/>
<DataGridTextColumn Header="供应商名称" Binding="{Binding SupplierName}" CellStyle="{StaticResource CusDataGridCellStyle}" Width="140"/>
<DataGridTextColumn Header="总重(KG)" Binding="{Binding TotalWeight, StringFormat=N2}" CellStyle="{StaticResource CusDataGridCellStyle}" Width="90"/>
<DataGridTextColumn Header="托盘及皮重(合计)" Binding="{Binding PalletTareTotal, StringFormat=N2}" CellStyle="{StaticResource CusDataGridCellStyle}" Width="120"/>
<DataGridTextColumn Header="总份数" Binding="{Binding TotalPortions}" CellStyle="{StaticResource CusDataGridCellStyle}" Width="70"/>
<DataGridTextColumn Header="检测结果" Binding="{Binding TestResultText}" CellStyle="{StaticResource CusDataGridCellStyle}" Width="85"/>
<DataGridTextColumn Header="检测状态" Binding="{Binding TestStatusText}" CellStyle="{StaticResource CusDataGridCellStyle}" Width="85"/>

View File

@@ -132,6 +132,7 @@
<RowDefinition Height="36"/> <!-- 厂家物料名称 / 保质期 -->
<RowDefinition Height="40"/> <!-- 总重 / 总份数 — 多 4px 给 NumericUpDown 上下间距,否则 spinner 箭头会被裁切 -->
<RowDefinition Height="36"/> <!-- 每份总重 / 每份包数 -->
<RowDefinition Height="36"/> <!-- 托盘及皮重(合计) -->
<RowDefinition Height="36"/> <!-- 库位 / 卸货人 -->
<RowDefinition Height="60"/> <!-- 备注 -->
</Grid.RowDefinitions>
@@ -205,7 +206,7 @@
<Border Grid.Row="1" Grid.Column="3"
BorderThickness="0,0,0,1" BorderBrush="{DynamicResource BorderBrush}" Padding="4,3">
<!-- 自定义日期时间选择器:日历 + 时/分/秒 三列 + 此刻/确定 -->
<ctrls:DateTimeListPicker SelectedDateTime="{Binding Entry.EntryTime, Mode=TwoWay}"
<ctrls:DateTimeListPicker SelectedDateTime="{Binding EntryTimeInput, Mode=TwoWay}"
DateTimeFormat="yyyy-MM-dd HH:mm:ss"
Placeholder="请选择入场时间"/>
</Border>
@@ -458,14 +459,30 @@
</Grid>
</Border>
<!-- ===== Row 7: 库位 / 卸货人 ===== -->
<!-- ===== Row 7: 托盘及皮重(合计) ===== -->
<Border Grid.Row="7" Grid.Column="0"
Background="{DynamicResource SecondaryRegionBrush}"
BorderThickness="0,0,1,1" BorderBrush="{DynamicResource BorderBrush}">
<TextBlock Text="托盘及皮重(合计)" HorizontalAlignment="Center" VerticalAlignment="Center"
FontSize="11" Foreground="{DynamicResource PrimaryTextBrush}"
TextWrapping="Wrap" TextAlignment="Center"/>
</Border>
<Border Grid.Row="7" Grid.Column="1" Grid.ColumnSpan="3"
BorderThickness="0,0,0,1" BorderBrush="{DynamicResource BorderBrush}" Padding="6,0">
<TextBlock Text="{Binding PalletTareTotalDisplay, StringFormat={}{0:0.##}}"
VerticalAlignment="Center" FontSize="13"
Foreground="{DynamicResource SecondaryTextBrush}"
ToolTip="由拆码明细自动汇总:Σ份数×(包装物皮重+托盘重量)"/>
</Border>
<!-- ===== Row 8: 库位 / 卸货人 ===== -->
<Border Grid.Row="8" Grid.Column="0"
Background="{DynamicResource SecondaryRegionBrush}"
BorderThickness="0,0,1,1" BorderBrush="{DynamicResource BorderBrush}">
<TextBlock Text="库位" HorizontalAlignment="Center" VerticalAlignment="Center"
FontSize="12" Foreground="{DynamicResource PrimaryTextBrush}"/>
</Border>
<Border Grid.Row="7" Grid.Column="1"
<Border Grid.Row="8" Grid.Column="1"
BorderThickness="0,0,1,1" BorderBrush="{DynamicResource BorderBrush}" Padding="4,0">
<Grid>
<TextBox Text="{Binding Entry.WarehouseLocation, UpdateSourceTrigger=PropertyChanged}"
@@ -490,13 +507,13 @@
</TextBlock>
</Grid>
</Border>
<Border Grid.Row="7" Grid.Column="2"
<Border Grid.Row="8" Grid.Column="2"
Background="{DynamicResource SecondaryRegionBrush}"
BorderThickness="0,0,1,1" BorderBrush="{DynamicResource BorderBrush}">
<TextBlock Text="卸货人" HorizontalAlignment="Center" VerticalAlignment="Center"
FontSize="12" Foreground="{DynamicResource PrimaryTextBrush}"/>
</Border>
<Border Grid.Row="7" Grid.Column="3"
<Border Grid.Row="8" Grid.Column="3"
BorderThickness="0,0,0,1" BorderBrush="{DynamicResource BorderBrush}" Padding="4,0">
<Grid>
<TextBox Text="{Binding Entry.UnloadOperator, UpdateSourceTrigger=PropertyChanged}"
@@ -522,14 +539,14 @@
</Grid>
</Border>
<!-- ===== Row 8: 备注(末行,无内部底边线) ===== -->
<Border Grid.Row="8" Grid.Column="0"
<!-- ===== Row 9: 备注(末行,无内部底边线) ===== -->
<Border Grid.Row="9" Grid.Column="0"
Background="{DynamicResource SecondaryRegionBrush}"
BorderThickness="0,0,1,0" BorderBrush="{DynamicResource BorderBrush}">
<TextBlock Text="备注" HorizontalAlignment="Center" VerticalAlignment="Center"
FontSize="12" Foreground="{DynamicResource PrimaryTextBrush}"/>
</Border>
<Border Grid.Row="8" Grid.Column="1" Grid.ColumnSpan="3" Padding="4,4">
<Border Grid.Row="9" Grid.Column="1" Grid.ColumnSpan="3" Padding="4,4">
<Grid>
<TextBox Text="{Binding Entry.Remark, UpdateSourceTrigger=PropertyChanged}"
TextWrapping="Wrap" AcceptsReturn="True"
@@ -644,42 +661,54 @@
</StackPanel>
</DockPanel>
<StackPanel>
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
<StackPanel MinWidth="820">
<!-- 表头 -->
<Grid Background="{DynamicResource SecondaryRegionBrush}" Height="40">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="130"/>
<ColumnDefinition Width="70"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="90"/>
<ColumnDefinition Width="90"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="140"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="120"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="份数"
HorizontalAlignment="Center" VerticalAlignment="Center"
FontWeight="SemiBold" FontSize="13"
FontWeight="SemiBold" FontSize="12"
Foreground="{DynamicResource PrimaryTextBrush}"/>
<TextBlock Grid.Column="1" Text="每份重量(KG)"
HorizontalAlignment="Center" VerticalAlignment="Center"
FontWeight="SemiBold" FontSize="13"
FontWeight="SemiBold" FontSize="12"
Foreground="{DynamicResource PrimaryTextBrush}"/>
<TextBlock Grid.Column="2" Text="每份包数"
HorizontalAlignment="Center" VerticalAlignment="Center"
FontWeight="SemiBold" FontSize="13"
FontWeight="SemiBold" FontSize="12"
Foreground="{DynamicResource PrimaryTextBrush}"/>
<!-- 库位列保存时非必填点击「生成原材料卡片」时必填ToolTip 给出说明 -->
<TextBlock Grid.Column="3" Text="库位"
<TextBlock Grid.Column="3" Text="包装物皮重"
HorizontalAlignment="Center" VerticalAlignment="Center"
FontWeight="SemiBold" FontSize="13"
FontWeight="SemiBold" FontSize="12"
Foreground="{DynamicResource PrimaryTextBrush}"
ToolTip="自动匹配皮重策略;点击可手动选择"/>
<TextBlock Grid.Column="4" Text="托盘重量"
HorizontalAlignment="Center" VerticalAlignment="Center"
FontWeight="SemiBold" FontSize="12"
Foreground="{DynamicResource PrimaryTextBrush}"
ToolTip="由皮重策略自动匹配未匹配时为0"/>
<TextBlock Grid.Column="5" Text="库位"
HorizontalAlignment="Center" VerticalAlignment="Center"
FontWeight="SemiBold" FontSize="12"
Foreground="{DynamicResource PrimaryTextBrush}"
ToolTip="生成原材料卡片时为必填项"/>
<TextBlock Grid.Column="4" Text="打印标记"
<TextBlock Grid.Column="6" Text="打印标记"
HorizontalAlignment="Center" VerticalAlignment="Center"
FontWeight="SemiBold" FontSize="13"
FontWeight="SemiBold" FontSize="12"
Foreground="{DynamicResource PrimaryTextBrush}"/>
<TextBlock Grid.Column="5" Text="操作"
<TextBlock Grid.Column="7" Text="操作"
HorizontalAlignment="Center" VerticalAlignment="Center"
FontWeight="SemiBold" FontSize="13"
FontWeight="SemiBold" FontSize="12"
Foreground="{DynamicResource PrimaryTextBrush}"/>
</Grid>
@@ -736,19 +765,21 @@
</DataTemplate.Resources>
<Grid Height="44">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="130"/>
<ColumnDefinition Width="70"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="90"/>
<ColumnDefinition Width="90"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="140"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="120"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
<TextBox Text="{Binding Portions, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource LockableSplitTextBoxStyle}"/>
</Border>
<Border Grid.Column="1" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
<TextBox Text="{Binding PortionWeight, UpdateSourceTrigger=PropertyChanged}"
<TextBox Text="{Binding PortionWeightText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
Style="{StaticResource LockableSplitTextBoxStyle}"/>
</Border>
<Border Grid.Column="2" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
@@ -756,6 +787,59 @@
Style="{StaticResource LockableSplitTextBoxStyle}"/>
</Border>
<Border Grid.Column="3" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
<Button Command="{Binding DataContext.OpenTareStrategyPickerCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
CommandParameter="{Binding}"
ToolTip="{Binding TareStrategyDisplay}"
Cursor="Hand"
VerticalAlignment="Center"
Height="32"
Margin="4,0"
Focusable="False">
<Button.Style>
<Style TargetType="Button">
<Setter Property="IsEnabled" Value="True"/>
<Setter Property="ToolTip" Value="点击选择皮重策略"/>
<Style.Triggers>
<DataTrigger Binding="{Binding HasCard}" Value="True">
<Setter Property="IsEnabled" Value="False"/>
<Setter Property="ToolTip" Value="该行已生成原材料卡片,不可修改。如需调整请先点「重新拆码」清空全部卡片"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
<Button.Template>
<ControlTemplate TargetType="Button">
<Border x:Name="Bd"
BorderBrush="#D9D9D9" BorderThickness="1"
CornerRadius="2"
Background="White">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"
FontSize="13"
Text="{Binding PackagingTare, StringFormat={}{0:0.##}}"
Foreground="{DynamicResource PrimaryTextBrush}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd" Property="BorderBrush" Value="#4096FF"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#F0F7FF"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="Bd" Property="Background" Value="#F5F5F5"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
</Button>
</Border>
<Border Grid.Column="4" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
<TextBlock Text="{Binding PalletWeight, StringFormat={}{0:0.##}}"
HorizontalAlignment="Center" VerticalAlignment="Center"
FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}"
ToolTip="{Binding TareStrategyDisplay}"/>
</Border>
<Border Grid.Column="5" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
<!--
InputBindings 内 RelativeSource 不在可视树中,查找会静默失败。
改用 Button + ControlTemplateCommand 写在 Button 元素上可视树正常RelativeSource 可靠。
@@ -836,11 +920,7 @@
</Button.Template>
</Button>
</Border>
<!--
打印标记列行级状态HasCard与「继续拆码」流程契合。
旧行(已生成卡片)显示绿色「已打印」;新增的待生成行显示灰色「未打印」。
-->
<Border Grid.Column="4" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
<Border Grid.Column="6" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
<Grid>
<Border CornerRadius="2" Padding="6,2" VerticalAlignment="Center" HorizontalAlignment="Center">
<Border.Style>
@@ -873,7 +953,7 @@
</Border>
</Grid>
</Border>
<Border Grid.Column="5" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
<Border Grid.Column="7" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,0,0,1">
<!-- 行级HasCard==true该行已生成卡片时隐藏删除按钮新增的待生成行可正常删除 -->
<Button Content="删除"
Command="{Binding DataContext.RemoveSplitDetailCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
@@ -897,6 +977,7 @@
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</ScrollViewer>
</StackPanel>
</Border>
</StackPanel>

View File

@@ -0,0 +1,48 @@
<UserControl x:Class="YY.Admin.Views.RawMaterialEntry.TareStrategyPickerDialogView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:hc="https://handyorg.github.io/handycontrol"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
Width="820" MinHeight="420">
<Grid Background="{DynamicResource ThirdlyRegionBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Margin="20,16,20,8" Text="选择皮重策略"
FontSize="16" FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryTextBrush}"/>
<DataGrid Grid.Row="1" Margin="16,0"
ItemsSource="{Binding Records}"
SelectedItem="{Binding SelectedStrategy}"
AutoGenerateColumns="False"
IsReadOnly="True"
CanUserAddRows="False"
HeadersVisibility="Column">
<DataGrid.Columns>
<DataGridTextColumn Header="物料规格" Binding="{Binding MaterialSpec}" Width="100"/>
<DataGridTextColumn Header="包装物重量" Binding="{Binding TareWeight}" Width="100"/>
<DataGridTextColumn Header="托盘重量" Binding="{Binding PalletWeight}" Width="100"/>
<DataGridTextColumn Header="单位" Binding="{Binding UnitName}" Width="80"/>
<DataGridTextColumn Header="生效开始" Binding="{Binding EffectiveStartDate, StringFormat=yyyy-MM-dd}" Width="110"/>
<DataGridTextColumn Header="生效截止" Binding="{Binding EffectiveEndDate, StringFormat=yyyy-MM-dd}" Width="110"/>
</DataGrid.Columns>
</DataGrid>
<StackPanel Grid.Row="2" Margin="16,12">
<TextBlock Text="{Binding SelectedStrategyDisplay}"
Foreground="{DynamicResource SecondaryTextBrush}"
TextWrapping="Wrap" Margin="0,0,0,10"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Content="取消" Command="{Binding CancelCommand}" Style="{StaticResource ButtonDefault}" Width="100" Margin="0,0,10,0"/>
<Button Content="使用自动匹配" Command="{Binding UseAutoMatchCommand}" Style="{StaticResource ButtonDefault}" Width="120" Margin="0,0,10,0"/>
<Button Content="确认选择" Command="{Binding ConfirmCommand}" Style="{StaticResource ButtonPrimary}" Width="100"/>
</StackPanel>
</StackPanel>
</Grid>
</UserControl>

View File

@@ -0,0 +1,9 @@
namespace YY.Admin.Views.RawMaterialEntry;
public partial class TareStrategyPickerDialogView
{
public TareStrategyPickerDialogView()
{
InitializeComponent();
}
}

View File

@@ -140,6 +140,7 @@
<DataGridTextColumn Header="供应商(发货单位)" Binding="{Binding SenderUnit}" Width="*"/>
<DataGridTextColumn Header="净重(KG)" Binding="{Binding NetWeight, StringFormat=N2}" Width="90"/>
<DataGridTextColumn Header="已入场(KG)" Binding="{Binding EnteredWeight, StringFormat=N2}" Width="100"/>
<DataGridTextColumn Header="货物皮重" Binding="{Binding CargoTareWeight, StringFormat=N2}" Width="90"/>
<DataGridTextColumn Header="称重日期" Binding="{Binding WeighDate, StringFormat='yyyy-MM-dd'}" Width="110"/>
</DataGrid.Columns>
</DataGrid>