桌面端密炼计划、胶料快检调整

This commit is contained in:
2026-06-18 15:18:11 +08:00
parent 372dc10be2
commit c54d54b40f
20 changed files with 1509 additions and 311 deletions

View File

@@ -28,7 +28,7 @@
<Grid Margin="12">
<Grid.RowDefinitions>
<RowDefinition Height="64"/>
<RowDefinition Height="80"/>
<RowDefinition Height="*"/>
<RowDefinition Height="56"/>
</Grid.RowDefinitions>
@@ -40,19 +40,19 @@
<Border Width="40" Height="40" CornerRadius="8" Background="{DynamicResource PrimaryBrush}" Margin="0,0,12,0">
<md:PackIcon Kind="Flask" Width="22" Height="22" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<StackPanel>
<TextBlock Text="快检记录" FontSize="18" FontWeight="Bold"/>
<TextBlock Text="密炼快检试验操作台" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}"/>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="无转子流变仪 MDR S3L" FontSize="24" FontWeight="Bold"/>
<TextBlock Text="胶料快检记录 · 密炼快检试验操作台" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}" Margin="0,4,0,0"/>
</StackPanel>
</StackPanel>
</Border>
<!-- 主体 2:1 -->
<!-- 主体 3:2 -->
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="3*"/>
<ColumnDefinition Width="12"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
<!-- 左侧:曲线 + 试验结果 -->
@@ -62,7 +62,7 @@
<StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,0,8">
<Border Width="4" Height="18" CornerRadius="2" Background="#1890ff"/>
<TextBlock Text="温度(℃)曲线" Style="{StaticResource SectionTitleStyle}"/>
<TextBlock Text="温度(℃)曲线" Style="{StaticResource SectionTitleStyle}"/>
<Button Content="刷新演示" Command="{Binding RefreshChartDemoCommand}" Style="{StaticResource ButtonDefault}" Height="28" Padding="10,0" Margin="12,0,0,0"/>
</StackPanel>
<TextBlock Text="{Binding ChartDemoHint}" FontSize="11" Foreground="{DynamicResource SecondaryTextBrush}" Margin="0,0,0,6"/>
@@ -79,7 +79,7 @@
<StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,0,8">
<Border Width="4" Height="18" CornerRadius="2" Background="#1890ff"/>
<TextBlock Text="S'(dNm)曲线" Style="{StaticResource SectionTitleStyle}"/>
<TextBlock Text="S'(dNm)曲线" Style="{StaticResource SectionTitleStyle}"/>
</StackPanel>
<Border Height="200" CornerRadius="4">
<lvc:CartesianChart Series="{Binding TorqueSeries}"
@@ -157,11 +157,24 @@
<Border Width="4" Height="18" CornerRadius="2" Background="#1890ff"/>
<TextBlock Text="试验信息" Style="{StaticResource SectionTitleStyle}"/>
</StackPanel>
<Button Content="刷新计划" Command="{Binding RefreshPlansCommand}"
<Button Content="刷新本地数据" Command="{Binding RefreshPlansCommand}"
Style="{StaticResource ButtonDefault}" Height="26" Padding="8,0"
HorizontalAlignment="Right" VerticalAlignment="Center"/>
</Grid>
<hc:Row Gutter="10">
<!-- 快检记录号(保存后生成,单独一行) -->
<hc:Col Span="24">
<hc:TextBox Text="{Binding RecordNo, Mode=OneWay}"
IsReadOnly="True"
hc:InfoElement.Title="快检记录号"
hc:InfoElement.TitleWidth="90"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.Placeholder="保存后自动生成"
Margin="0,0,0,8"/>
</hc:Col>
</hc:Row>
<hc:Row Gutter="10">
<!-- 密炼日期 -->
<hc:Col Span="12">
@@ -198,11 +211,11 @@
hc:InfoElement.Symbol="*"
Margin="0,0,0,8"/>
</hc:Col>
<!-- 密炼生产计划 -->
<!-- 密炼计划(计划+胶料号) -->
<hc:Col Span="24">
<hc:ComboBox ItemsSource="{Binding PlanOptions}"
SelectedItem="{Binding SelectedPlan}"
DisplayMemberPath="DisplayText"
DisplayMemberPath="PlanMaterialNo"
hc:InfoElement.Title="密炼计划"
hc:InfoElement.TitleWidth="90"
hc:InfoElement.TitlePlacement="Left"
@@ -211,18 +224,6 @@
hc:InfoElement.Symbol="*"
Margin="0,0,0,8"/>
</hc:Col>
<!-- 生产订单号 -->
<hc:Col Span="12">
<hc:TextBox Text="{Binding ProductionOrderNo, Mode=OneWay}"
IsReadOnly="True"
hc:InfoElement.Title="生产订单号"
hc:InfoElement.TitleWidth="90"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.Placeholder="选择计划后自动带出"
hc:InfoElement.Necessary="True"
hc:InfoElement.Symbol="*"
Margin="0,0,0,8"/>
</hc:Col>
<!-- 胶料名称 -->
<hc:Col Span="12">
<hc:TextBox Text="{Binding RubberMaterialName, Mode=OneWay}"
@@ -233,6 +234,29 @@
hc:InfoElement.Placeholder="选择计划后自动带出"
Margin="0,0,0,8"/>
</hc:Col>
<!-- 实验标准 -->
<hc:Col Span="12">
<hc:ComboBox ItemsSource="{Binding StdOptions}"
SelectedItem="{Binding SelectedStd}"
DisplayMemberPath="StdName"
hc:InfoElement.Title="实验标准"
hc:InfoElement.TitleWidth="90"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.Placeholder="按胶料名称筛选后选择"
hc:InfoElement.Necessary="True"
hc:InfoElement.Symbol="*"
Margin="0,0,0,8"/>
</hc:Col>
<!-- 实验方法 -->
<hc:Col Span="12">
<hc:TextBox Text="{Binding TestMethodName, Mode=OneWay}"
IsReadOnly="True"
hc:InfoElement.Title="实验方法"
hc:InfoElement.TitleWidth="90"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.Placeholder="选择标准后自动带出"
Margin="0,0,0,8"/>
</hc:Col>
<!-- 车次 -->
<hc:Col Span="12">
<hc:TextBox Text="{Binding TrainNo, UpdateSourceTrigger=PropertyChanged}"
@@ -255,11 +279,31 @@
hc:InfoElement.Necessary="True"
hc:InfoElement.Symbol="*"
hc:InfoElement.ShowClearButton="True"
Margin="0,0,0,8"/>
</hc:Col>
<!-- 检验结果(由试验结果区域自动判定,只读) -->
<hc:Col Span="12">
<hc:TextBox Text="{Binding OverallInspectResultDisplay, Mode=OneWay}"
IsReadOnly="True"
hc:InfoElement.Title="检验结果"
hc:InfoElement.TitleWidth="90"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.Placeholder="自动判定"
Margin="0,0,0,8"/>
</hc:Col>
<!-- 检验人(当前登录用户,只读) -->
<hc:Col Span="24">
<hc:TextBox Text="{Binding InspectorDisplay, Mode=OneWay}"
IsReadOnly="True"
hc:InfoElement.Title="检验人"
hc:InfoElement.TitleWidth="90"
hc:InfoElement.TitlePlacement="Left"
hc:InfoElement.Placeholder="当前登录用户"
Margin="0,0,0,0"/>
</hc:Col>
</hc:Row>
<TextBlock Text="按密炼日期 → 机台 → 班次筛选生产计划;胶料名称用于匹配快检实验标准"
<TextBlock Text="密炼计划、实验标准均来自桌面端本地缓存;按密炼日期筛选计划,再按胶料名称选择实验标准"
FontSize="11"
Foreground="{DynamicResource SecondaryTextBrush}"
Margin="0,8,0,0"
@@ -278,11 +322,24 @@
AutoGenerateColumns="False"
IsReadOnly="True"
HeadersVisibility="Column"
MaxHeight="240">
MaxHeight="240"
ColumnWidth="*">
<DataGrid.Columns>
<DataGridTextColumn Header="数据点" Binding="{Binding PointName}" Width="*"/>
<DataGridTextColumn Header="下限值" Binding="{Binding LowerLimit}" Width="70"/>
<DataGridTextColumn Header="上限值" Binding="{Binding UpperLimit}" Width="70"/>
<DataGridTextColumn Header="数据点" Binding="{Binding PointName}" Width="5*"/>
<DataGridTextColumn Header="下限值" Binding="{Binding LowerLimit}" Width="2.5*">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="上限值" Binding="{Binding UpperLimit}" Width="2.5*">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
@@ -294,7 +351,7 @@
<!-- 底部操作 -->
<Border Grid.Row="2" Background="{DynamicResource RegionBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0" Margin="-12,8,-12,-12">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="20,0">
<Button Content="保存快检记录" Command="{Binding SaveCommand}" Style="{StaticResource ButtonPrimary}" Height="36" Width="140"/>
<Button Content="保存胶料快检记录" Command="{Binding SaveCommand}" Style="{StaticResource ButtonPrimary}" Height="36" Width="160"/>
</StackPanel>
</Border>
</Grid>

View File

@@ -1,72 +1,118 @@
using System.Collections.Specialized;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using YY.Admin.ViewModels.RubberQuickTest;
namespace YY.Admin.Views.RubberQuickTest;
public partial class RubberQuickTestOperationView : UserControl
{
private RubberQuickTestOperationViewModel? _vm;
private RubberQuickTestOperationViewModel? _vm;
public RubberQuickTestOperationView()
{
InitializeComponent();
DataContextChanged += OnDataContextChanged;
}
private void OnDataContextChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e)
{
if (_vm != null)
_vm.InspectColumnsChanged -= RebuildInspectColumns;
_vm = DataContext as RubberQuickTestOperationViewModel;
if (_vm != null)
public RubberQuickTestOperationView()
{
_vm.InspectColumnsChanged += RebuildInspectColumns;
RebuildInspectColumns();
}
}
private void RebuildInspectColumns()
{
if (_vm == null) return;
InspectResultGrid.Columns.Clear();
InspectResultGrid.Columns.Add(new DataGridTextColumn
{
Header = "编号",
Binding = new System.Windows.Data.Binding("RowNo"),
IsReadOnly = true,
Width = 80
});
for (int i = 0; i < _vm.DataPointColumns.Count; i++)
{
var col = _vm.DataPointColumns[i];
var binding = new System.Windows.Data.Binding($"Cells[{i}].Value")
{
UpdateSourceTrigger = System.Windows.Data.UpdateSourceTrigger.PropertyChanged,
Mode = System.Windows.Data.BindingMode.TwoWay
};
InspectResultGrid.Columns.Add(new DataGridTextColumn
{
Header = col.PointName ?? $"点{i + 1}",
Binding = binding,
Width = 90,
IsReadOnly = false
});
InitializeComponent();
Loaded += OnLoaded;
DataContextChanged += OnDataContextChanged;
Unloaded += (_, _) => DetachViewModel();
}
InspectResultGrid.Columns.Add(new DataGridTextColumn
private void OnLoaded(object sender, RoutedEventArgs e)
{
Header = "实验结果",
Binding = new System.Windows.Data.Binding("InspectResultText"),
IsReadOnly = true,
Width = 90
});
}
// 兜底AutoWireViewModel 可能在构造函数订阅 DataContextChanged 之前就设置了 DataContext
AttachViewModel(DataContext as RubberQuickTestOperationViewModel);
}
private void InspectResultGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (_vm == null) return;
_vm.SelectedInspectRow = InspectResultGrid.SelectedItem as QuickTestInspectRowViewModel;
}
private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
DetachViewModel();
AttachViewModel(DataContext as RubberQuickTestOperationViewModel);
}
private void AttachViewModel(RubberQuickTestOperationViewModel? vm)
{
if (vm == null || ReferenceEquals(_vm, vm)) return;
_vm = vm;
_vm.InspectColumnsChanged += RebuildInspectColumns;
_vm.DataPointColumns.CollectionChanged += OnDataPointColumnsChanged;
RebuildInspectColumns();
}
private void DetachViewModel()
{
if (_vm == null) return;
_vm.InspectColumnsChanged -= RebuildInspectColumns;
_vm.DataPointColumns.CollectionChanged -= OnDataPointColumnsChanged;
_vm = null;
}
private void OnDataPointColumnsChanged(object? sender, NotifyCollectionChangedEventArgs e)
=> RebuildInspectColumns();
private void RebuildInspectColumns()
{
if (!Dispatcher.CheckAccess())
{
Dispatcher.Invoke(RebuildInspectColumns);
return;
}
var vm = _vm ?? DataContext as RubberQuickTestOperationViewModel;
if (vm == null) return;
InspectResultGrid.Columns.Clear();
InspectResultGrid.Columns.Add(new DataGridTextColumn
{
Header = "编号",
Binding = new Binding(nameof(QuickTestInspectRowViewModel.RowNo))
{
Mode = BindingMode.OneWay
},
IsReadOnly = true,
Width = 80
});
for (int i = 0; i < vm.DataPointColumns.Count; i++)
{
var col = vm.DataPointColumns[i];
var columnIndex = i;
var header = string.IsNullOrWhiteSpace(col.PointName)
? $"数据点{columnIndex + 1}"
: col.PointName;
InspectResultGrid.Columns.Add(new DataGridTextColumn
{
Header = header,
Binding = new Binding($"Cells[{columnIndex}].Value")
{
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
Mode = BindingMode.TwoWay,
TargetNullValue = string.Empty
},
Width = 100,
IsReadOnly = false
});
}
InspectResultGrid.Columns.Add(new DataGridTextColumn
{
Header = "实验结果",
Binding = new Binding(nameof(QuickTestInspectRowViewModel.InspectResultText))
{
Mode = BindingMode.OneWay
},
IsReadOnly = true,
Width = 90
});
}
private void InspectResultGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var vm = _vm ?? DataContext as RubberQuickTestOperationViewModel;
if (vm == null) return;
vm.SelectedInspectRow = InspectResultGrid.SelectedItem as QuickTestInspectRowViewModel;
}
}