配合示方生成混炼示方优化
This commit is contained in:
@@ -526,7 +526,10 @@ public class RawMaterialEntryEditDialogViewModel : BaseViewModel, IDialogResulta
|
||||
.Initialize<WeightRecordPickerDialogViewModel>(vm =>
|
||||
{
|
||||
pickerVm = vm;
|
||||
vm.Initialize(Entry?.BillNo);
|
||||
vm.Initialize(
|
||||
Entry?.BillNo,
|
||||
SelectedMaterial?.Id ?? Entry?.MaterialId,
|
||||
SelectedMaterial?.MaterialName ?? Entry?.MaterialName);
|
||||
})
|
||||
.GetResultAsync<bool>());
|
||||
}
|
||||
|
||||
@@ -24,6 +24,26 @@ public class WeightRecordPickerDialogViewModel : BaseViewModel, IDialogResultabl
|
||||
set => SetProperty(ref _searchPlateNumber, value);
|
||||
}
|
||||
|
||||
/// <summary>入场记录已选密炼物料ID:有值时仅展示关联该物料的磅单。</summary>
|
||||
private string? _filterMixerMaterialId;
|
||||
private string? _filterMixerMaterialName;
|
||||
|
||||
public string FilterHint
|
||||
{
|
||||
get
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(_filterMixerMaterialId))
|
||||
{
|
||||
return "未选择密炼物料时显示全部进厂磅单;已选物料时仅匹配含该物料的磅单。";
|
||||
}
|
||||
|
||||
var name = string.IsNullOrWhiteSpace(_filterMixerMaterialName)
|
||||
? _filterMixerMaterialId
|
||||
: _filterMixerMaterialName;
|
||||
return $"已按密炼物料「{name}」自动匹配关联磅单";
|
||||
}
|
||||
}
|
||||
|
||||
public ObservableCollection<MesXslWeightRecord> Records { get; } = new();
|
||||
|
||||
private MesXslWeightRecord? _selectedRecord;
|
||||
@@ -40,7 +60,7 @@ public class WeightRecordPickerDialogViewModel : BaseViewModel, IDialogResultabl
|
||||
}
|
||||
|
||||
public string SelectedRecordDisplay => _selectedRecord != null
|
||||
? $"[{_selectedRecord.BillNo}] 供应商:{_selectedRecord.SenderUnit ?? "-"}"
|
||||
? $"[{_selectedRecord.BillNo}] 供应商:{_selectedRecord.SenderUnit ?? "-"} 物料:{_selectedRecord.MixerMaterialNames ?? "-"}"
|
||||
: "选中榜单后点击「确认选择」";
|
||||
|
||||
public bool HasSelectedRecord => _selectedRecord != null;
|
||||
@@ -67,16 +87,24 @@ public class WeightRecordPickerDialogViewModel : BaseViewModel, IDialogResultabl
|
||||
SearchCommand = new DelegateCommand(async () => await LoadAsync());
|
||||
ConfirmCommand = new DelegateCommand(Confirm, () => SelectedRecord != null);
|
||||
CancelCommand = new DelegateCommand(() => CloseAction?.Invoke());
|
||||
_ = LoadAsync();
|
||||
// 不在构造时加载:等 Initialize 带入密炼物料过滤条件后再查,避免竞态覆盖筛选结果
|
||||
}
|
||||
|
||||
public void Initialize(string? billNo)
|
||||
/// <param name="billNo">已选榜单号(用于回显搜索)</param>
|
||||
/// <param name="mixerMaterialId">已选密炼物料ID,有值则只匹配含该物料的磅单</param>
|
||||
/// <param name="mixerMaterialName">密炼物料名称(提示展示)</param>
|
||||
public void Initialize(string? billNo, string? mixerMaterialId = null, string? mixerMaterialName = null)
|
||||
{
|
||||
_filterMixerMaterialId = string.IsNullOrWhiteSpace(mixerMaterialId) ? null : mixerMaterialId.Trim();
|
||||
_filterMixerMaterialName = string.IsNullOrWhiteSpace(mixerMaterialName) ? null : mixerMaterialName.Trim();
|
||||
RaisePropertyChanged(nameof(FilterHint));
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(billNo))
|
||||
{
|
||||
SearchBillNo = billNo.Trim();
|
||||
_ = LoadAsync();
|
||||
}
|
||||
|
||||
_ = LoadAsync();
|
||||
}
|
||||
|
||||
private async Task LoadAsync()
|
||||
@@ -92,7 +120,7 @@ public class WeightRecordPickerDialogViewModel : BaseViewModel, IDialogResultabl
|
||||
filterInoutDirection: "1");
|
||||
|
||||
Records.Clear();
|
||||
foreach (var record in result.Records)
|
||||
foreach (var record in result.Records.Where(MatchesSelectedMixerMaterial))
|
||||
{
|
||||
Records.Add(record);
|
||||
}
|
||||
@@ -102,6 +130,11 @@ public class WeightRecordPickerDialogViewModel : BaseViewModel, IDialogResultabl
|
||||
SelectedRecord = Records.FirstOrDefault(x =>
|
||||
string.Equals(x.BillNo, SearchBillNo, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
else if (!string.IsNullOrWhiteSpace(_filterMixerMaterialId) && Records.Count == 1)
|
||||
{
|
||||
// 仅匹配到一条时自动选中,便于快速确认
|
||||
SelectedRecord = Records[0];
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
@@ -113,6 +146,25 @@ public class WeightRecordPickerDialogViewModel : BaseViewModel, IDialogResultabl
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>未指定物料时不过滤;指定时要求磅单 MixerMaterialIds 含该ID。</summary>
|
||||
private bool MatchesSelectedMixerMaterial(MesXslWeightRecord record)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(_filterMixerMaterialId))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(record.MixerMaterialIds))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var parts = record.MixerMaterialIds.Split(
|
||||
new[] { ';', ',', ';', ',' },
|
||||
StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
||||
return parts.Any(p => string.Equals(p, _filterMixerMaterialId, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
private void Confirm()
|
||||
{
|
||||
if (SelectedRecord == null)
|
||||
|
||||
@@ -34,6 +34,44 @@ public class WeightRecordEditDialogViewModel : BaseViewModel, IDialogResultable<
|
||||
public bool IsAddMode => string.IsNullOrWhiteSpace(Record?.Id);
|
||||
public string DialogTitle => IsAddMode ? "新增磅单" : "编辑磅单";
|
||||
|
||||
/// <summary>毛重输入:变更后自动重算净重</summary>
|
||||
public double? GrossWeightInput
|
||||
{
|
||||
get => Record?.GrossWeight;
|
||||
set
|
||||
{
|
||||
if (Record == null || Nullable.Equals(Record.GrossWeight, value)) return;
|
||||
Record.GrossWeight = value;
|
||||
RaisePropertyChanged(nameof(GrossWeightInput));
|
||||
RecalcNetWeight();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>皮重输入:变更后自动用毛重-皮重填充净重</summary>
|
||||
public double? TareWeightInput
|
||||
{
|
||||
get => Record?.TareWeight;
|
||||
set
|
||||
{
|
||||
if (Record == null || Nullable.Equals(Record.TareWeight, value)) return;
|
||||
Record.TareWeight = value;
|
||||
RaisePropertyChanged(nameof(TareWeightInput));
|
||||
RecalcNetWeight();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>净重(只读展示,由毛重/皮重自动计算)</summary>
|
||||
public double? NetWeightInput
|
||||
{
|
||||
get => Record?.NetWeight;
|
||||
private set
|
||||
{
|
||||
if (Record == null || Nullable.Equals(Record.NetWeight, value)) return;
|
||||
Record.NetWeight = value;
|
||||
RaisePropertyChanged(nameof(NetWeightInput));
|
||||
}
|
||||
}
|
||||
|
||||
public ObservableCollection<KeyValuePair<string, string>> InoutDirectionOptions { get; } = new();
|
||||
|
||||
private bool _result;
|
||||
@@ -121,6 +159,7 @@ public class WeightRecordEditDialogViewModel : BaseViewModel, IDialogResultable<
|
||||
};
|
||||
RaisePropertyChanged(nameof(IsAddMode));
|
||||
RaisePropertyChanged(nameof(DialogTitle));
|
||||
RaiseWeightInputsChanged();
|
||||
}
|
||||
|
||||
public void InitializeForEdit(MesXslWeightRecord record)
|
||||
@@ -151,6 +190,31 @@ public class WeightRecordEditDialogViewModel : BaseViewModel, IDialogResultable<
|
||||
RaisePropertyChanged(nameof(HasSelectedMixerMaterials));
|
||||
RaisePropertyChanged(nameof(IsAddMode));
|
||||
RaisePropertyChanged(nameof(DialogTitle));
|
||||
RaiseWeightInputsChanged();
|
||||
// 编辑打开时若已有毛重+皮重,立即校正净重展示
|
||||
RecalcNetWeight();
|
||||
}
|
||||
|
||||
private void RaiseWeightInputsChanged()
|
||||
{
|
||||
RaisePropertyChanged(nameof(GrossWeightInput));
|
||||
RaisePropertyChanged(nameof(TareWeightInput));
|
||||
RaisePropertyChanged(nameof(NetWeightInput));
|
||||
}
|
||||
|
||||
/// <summary>毛重、皮重均有效时:净重 = 毛重 - 皮重(保留两位小数)</summary>
|
||||
private void RecalcNetWeight()
|
||||
{
|
||||
if (Record == null) return;
|
||||
if (Record.GrossWeight.HasValue && Record.GrossWeight.Value > 0
|
||||
&& Record.TareWeight.HasValue && Record.TareWeight.Value > 0)
|
||||
{
|
||||
NetWeightInput = Math.Round(Record.GrossWeight.Value - Record.TareWeight.Value, 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
NetWeightInput = null;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task SaveAsync()
|
||||
@@ -168,12 +232,8 @@ public class WeightRecordEditDialogViewModel : BaseViewModel, IDialogResultable<
|
||||
return;
|
||||
}
|
||||
|
||||
// 净重自动计算(0 视为未称,不计算净重)
|
||||
if (Record.GrossWeight.HasValue && Record.GrossWeight.Value > 0
|
||||
&& Record.TareWeight.HasValue && Record.TareWeight.Value > 0)
|
||||
Record.NetWeight = Math.Round(Record.GrossWeight.Value - Record.TareWeight.Value, 2);
|
||||
else
|
||||
Record.NetWeight = null;
|
||||
// 保存前再算一次,防止未触发属性变更时净重未更新
|
||||
RecalcNetWeight();
|
||||
|
||||
// 写入密炼物料
|
||||
Record.MixerMaterialIds = _mixerMaterialIds;
|
||||
|
||||
@@ -8,10 +8,11 @@
|
||||
xmlns:prism="http://prismlibrary.com/"
|
||||
prism:ViewModelLocator.AutoWireViewModel="True"
|
||||
mc:Ignorable="d"
|
||||
Width="760">
|
||||
Width="920">
|
||||
|
||||
<Grid Background="{DynamicResource ThirdlyRegionBrush}">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="360"/>
|
||||
@@ -34,7 +35,11 @@
|
||||
Padding="0" HorizontalAlignment="Right" VerticalAlignment="Center"/>
|
||||
</hc:SimplePanel>
|
||||
|
||||
<Border Grid.Row="1" Background="{DynamicResource RegionBrush}" Padding="16,10">
|
||||
<TextBlock Grid.Row="1" Margin="20,0,20,8" FontSize="12"
|
||||
Foreground="{DynamicResource SecondaryTextBrush}"
|
||||
Text="{Binding FilterHint}" TextWrapping="Wrap"/>
|
||||
|
||||
<Border Grid.Row="2" Background="{DynamicResource RegionBrush}" Padding="16,10">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
@@ -70,7 +75,7 @@
|
||||
</Border>
|
||||
|
||||
<DataGrid x:Name="WeightRecordsGrid"
|
||||
Grid.Row="2"
|
||||
Grid.Row="3"
|
||||
Margin="16,8,16,0"
|
||||
ItemsSource="{Binding Records}"
|
||||
SelectedItem="{Binding SelectedRecord}"
|
||||
@@ -135,20 +140,21 @@
|
||||
</Style>
|
||||
</DataGrid.CellStyle>
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="榜单号" Binding="{Binding BillNo}" Width="180"/>
|
||||
<DataGridTextColumn Header="车牌号" Binding="{Binding PlateNumber}" Width="100"/>
|
||||
<DataGridTextColumn Header="榜单号" Binding="{Binding BillNo}" Width="160"/>
|
||||
<DataGridTextColumn Header="车牌号" Binding="{Binding PlateNumber}" Width="90"/>
|
||||
<DataGridTextColumn Header="密炼物料" Binding="{Binding MixerMaterialNames}" Width="160"/>
|
||||
<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"/>
|
||||
<DataGridTextColumn Header="净重(KG)" Binding="{Binding NetWeight, StringFormat=N2}" Width="80"/>
|
||||
<DataGridTextColumn Header="已入场(KG)" Binding="{Binding EnteredWeight, StringFormat=N2}" Width="90"/>
|
||||
<DataGridTextColumn Header="货物皮重" Binding="{Binding CargoTareWeight, StringFormat=N2}" Width="80"/>
|
||||
<DataGridTextColumn Header="称重日期" Binding="{Binding WeighDate, StringFormat='yyyy-MM-dd'}" Width="100"/>
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
|
||||
<Border Grid.Row="3" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0"
|
||||
<Border Grid.Row="4" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0"
|
||||
Padding="16,12">
|
||||
<Grid>
|
||||
<TextBlock VerticalAlignment="Center" FontSize="13" MaxWidth="420"
|
||||
<TextBlock VerticalAlignment="Center" FontSize="13" MaxWidth="560"
|
||||
TextTrimming="CharacterEllipsis" HorizontalAlignment="Left"
|
||||
Text="{Binding SelectedRecordDisplay}">
|
||||
<TextBlock.Style>
|
||||
|
||||
@@ -144,7 +144,7 @@
|
||||
|
||||
<!-- 毛重 -->
|
||||
<hc:Col Span="12">
|
||||
<hc:NumericUpDown Value="{Binding Record.GrossWeight}"
|
||||
<hc:NumericUpDown Value="{Binding GrossWeightInput, UpdateSourceTrigger=PropertyChanged}"
|
||||
Minimum="0"
|
||||
DecimalPlaces="2"
|
||||
Style="{StaticResource NumericUpDownPlus}"
|
||||
@@ -158,7 +158,7 @@
|
||||
|
||||
<!-- 皮重 -->
|
||||
<hc:Col Span="12">
|
||||
<hc:NumericUpDown Value="{Binding Record.TareWeight}"
|
||||
<hc:NumericUpDown Value="{Binding TareWeightInput, UpdateSourceTrigger=PropertyChanged}"
|
||||
Minimum="0"
|
||||
DecimalPlaces="2"
|
||||
Style="{StaticResource NumericUpDownPlus}"
|
||||
@@ -170,17 +170,18 @@
|
||||
Margin="0,0,0,16"/>
|
||||
</hc:Col>
|
||||
|
||||
<!-- 净重(只读) -->
|
||||
<!-- 净重(自动:毛重-皮重) -->
|
||||
<hc:Col Span="12">
|
||||
<hc:NumericUpDown Value="{Binding Record.NetWeight}"
|
||||
<hc:NumericUpDown Value="{Binding NetWeightInput, Mode=OneWay}"
|
||||
Minimum="0"
|
||||
DecimalPlaces="2"
|
||||
Style="{StaticResource NumericUpDownPlus}"
|
||||
IsEnabled="True"
|
||||
IsReadOnly="True"
|
||||
IsEnabled="False"
|
||||
hc:InfoElement.Title="净重(KG)"
|
||||
hc:InfoElement.TitleWidth="80"
|
||||
hc:InfoElement.TitlePlacement="Left"
|
||||
hc:InfoElement.Placeholder="自动计算"
|
||||
hc:InfoElement.Placeholder="毛重-皮重自动计算"
|
||||
Margin="0,0,0,16"/>
|
||||
</hc:Col>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user