初始化
This commit is contained in:
@@ -41,85 +41,12 @@
|
|||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<Grid Grid.Row="2">
|
<Grid Grid.Row="2">
|
||||||
<Grid.ColumnDefinitions>
|
<Border Style="{StaticResource CardBorderStyle}" Margin="0">
|
||||||
<ColumnDefinition Width="300" />
|
|
||||||
<ColumnDefinition Width="12" />
|
|
||||||
<ColumnDefinition Width="*" />
|
|
||||||
</Grid.ColumnDefinitions>
|
|
||||||
|
|
||||||
<ScrollViewer Grid.Column="0" VerticalScrollBarVisibility="Auto">
|
|
||||||
<StackPanel>
|
|
||||||
<Border Style="{StaticResource CardBorderStyle}" Margin="0,0,0,12">
|
|
||||||
<StackPanel>
|
|
||||||
<TextBlock Style="{StaticResource SectionTitleStyle}" Text="检测总览" />
|
|
||||||
<UniformGrid Columns="1">
|
|
||||||
<Border Margin="0,0,0,8" Padding="14" Background="#FFE7F5F3" CornerRadius="14">
|
|
||||||
<StackPanel>
|
|
||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="合格率" />
|
|
||||||
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="24" Text="{Binding ComplianceDisplay}" />
|
|
||||||
</StackPanel>
|
|
||||||
</Border>
|
|
||||||
<Border Margin="0,0,0,8" Padding="14" Background="#FFF6EFE2" CornerRadius="14">
|
|
||||||
<StackPanel>
|
|
||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="压差" />
|
|
||||||
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="24" Text="{Binding DeltaPressureDisplay}" />
|
|
||||||
</StackPanel>
|
|
||||||
</Border>
|
|
||||||
<Border Margin="0,0,0,8" Padding="14" Background="#FFE9EFF9" CornerRadius="14">
|
|
||||||
<StackPanel>
|
|
||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="合格项" />
|
|
||||||
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="24" Text="{Binding QualifiedCount}" />
|
|
||||||
</StackPanel>
|
|
||||||
</Border>
|
|
||||||
<Border Padding="14" Background="#FFFDEBE7" CornerRadius="14">
|
|
||||||
<StackPanel>
|
|
||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="预警/不合格" />
|
|
||||||
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="24" Text="{Binding WarningCount}" />
|
|
||||||
</StackPanel>
|
|
||||||
</Border>
|
|
||||||
</UniformGrid>
|
|
||||||
</StackPanel>
|
|
||||||
</Border>
|
|
||||||
|
|
||||||
<Border Style="{StaticResource CardBorderStyle}">
|
|
||||||
<StackPanel>
|
|
||||||
<TextBlock Style="{StaticResource SectionTitleStyle}" Text="流量快照" />
|
|
||||||
<Border Margin="0,0,0,8" Padding="12" Background="#FFEAF6F3" CornerRadius="14">
|
|
||||||
<StackPanel>
|
|
||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="主泵" />
|
|
||||||
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding PumpFlowDisplay}" />
|
|
||||||
</StackPanel>
|
|
||||||
</Border>
|
|
||||||
<Border Margin="0,0,0,8" Padding="12" Background="#FFEFF1FA" CornerRadius="14">
|
|
||||||
<StackPanel>
|
|
||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="引流" />
|
|
||||||
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding DrainageFlowDisplay}" />
|
|
||||||
</StackPanel>
|
|
||||||
</Border>
|
|
||||||
<Border Padding="12" Background="#FFFDF0E5" CornerRadius="14">
|
|
||||||
<StackPanel>
|
|
||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="回输" />
|
|
||||||
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding ReturnFlowDisplay}" />
|
|
||||||
</StackPanel>
|
|
||||||
</Border>
|
|
||||||
</StackPanel>
|
|
||||||
</Border>
|
|
||||||
</StackPanel>
|
|
||||||
</ScrollViewer>
|
|
||||||
|
|
||||||
<Border Grid.Column="2" Style="{StaticResource CardBorderStyle}" Margin="0">
|
|
||||||
<TabControl>
|
<TabControl>
|
||||||
<TabItem Header="项目检测">
|
<TabItem Header="项目检测">
|
||||||
<Grid Margin="0,6,0,0">
|
<ScrollViewer Margin="0,6,0,0" VerticalScrollBarVisibility="Auto" CanContentScroll="False">
|
||||||
<Grid.RowDefinitions>
|
<StackPanel>
|
||||||
<RowDefinition Height="Auto" />
|
<Border Style="{StaticResource CardBorderStyle}">
|
||||||
<RowDefinition Height="Auto" />
|
|
||||||
<RowDefinition Height="280" />
|
|
||||||
<RowDefinition Height="Auto" />
|
|
||||||
<RowDefinition Height="*" />
|
|
||||||
</Grid.RowDefinitions>
|
|
||||||
|
|
||||||
<Border Grid.Row="0" Style="{StaticResource CardBorderStyle}">
|
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock Style="{StaticResource SectionTitleStyle}" Text="项目检索与采集策略" />
|
<TextBlock Style="{StaticResource SectionTitleStyle}" Text="项目检索与采集策略" />
|
||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="根据 YY 0948-2025 将项目区分为“实时监控”“实时显示+手动录入”和“手动录入”三类。" TextWrapping="Wrap" />
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="根据 YY 0948-2025 将项目区分为“实时监控”“实时显示+手动录入”和“手动录入”三类。" TextWrapping="Wrap" />
|
||||||
@@ -158,7 +85,7 @@
|
|||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<UniformGrid Grid.Row="1" Columns="3" Margin="0,0,0,12">
|
<UniformGrid Columns="3" Margin="0,0,0,12">
|
||||||
<Border Margin="0,0,8,8" Padding="14" Background="#FFE7F5F3" CornerRadius="14">
|
<Border Margin="0,0,8,8" Padding="14" Background="#FFE7F5F3" CornerRadius="14">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="实时监控" />
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="实时监控" />
|
||||||
@@ -182,7 +109,7 @@
|
|||||||
</Border>
|
</Border>
|
||||||
</UniformGrid>
|
</UniformGrid>
|
||||||
|
|
||||||
<Border Grid.Row="2" Style="{StaticResource CardBorderStyle}">
|
<Border Style="{StaticResource CardBorderStyle}">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock Style="{StaticResource SectionTitleStyle}" Text="项目清单" />
|
<TextBlock Style="{StaticResource SectionTitleStyle}" Text="项目清单" />
|
||||||
<DataGrid Margin="0,4,0,0"
|
<DataGrid Margin="0,4,0,0"
|
||||||
@@ -194,6 +121,7 @@
|
|||||||
CanUserDeleteRows="False"
|
CanUserDeleteRows="False"
|
||||||
SelectionMode="Single"
|
SelectionMode="Single"
|
||||||
SelectionUnit="FullRow"
|
SelectionUnit="FullRow"
|
||||||
|
Height="280"
|
||||||
ScrollViewer.VerticalScrollBarVisibility="Auto"
|
ScrollViewer.VerticalScrollBarVisibility="Auto"
|
||||||
VirtualizingPanel.ScrollUnit="Pixel">
|
VirtualizingPanel.ScrollUnit="Pixel">
|
||||||
<DataGrid.Columns>
|
<DataGrid.Columns>
|
||||||
@@ -224,7 +152,7 @@
|
|||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<UniformGrid Grid.Row="3" Columns="4" Margin="0,0,0,12">
|
<UniformGrid Columns="4" Margin="0,0,0,12">
|
||||||
<Border Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}">
|
<Border Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="当前项目" />
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="当前项目" />
|
||||||
@@ -252,17 +180,10 @@
|
|||||||
</Border>
|
</Border>
|
||||||
</UniformGrid>
|
</UniformGrid>
|
||||||
|
|
||||||
<Border Grid.Row="4" Style="{StaticResource CardBorderStyle}" Margin="0">
|
<Border Style="{StaticResource CardBorderStyle}" Margin="0">
|
||||||
<DockPanel LastChildFill="True">
|
<StackPanel>
|
||||||
<WrapPanel DockPanel.Dock="Bottom" Margin="0,8,0,0">
|
<TextBlock Style="{StaticResource SectionTitleStyle}" Text="项目详情与结果填写" />
|
||||||
<Button Command="{Binding SelectPreviousItemCommand}" Content="上一项" Background="#FF6B8791" />
|
<Grid>
|
||||||
<Button Command="{Binding SelectNextItemCommand}" Content="下一项" Background="#FF6B8791" />
|
|
||||||
<Button Command="{Binding ApplyResultCommand}" Content="保存" />
|
|
||||||
</WrapPanel>
|
|
||||||
<ScrollViewer VerticalScrollBarVisibility="Auto" CanContentScroll="True">
|
|
||||||
<StackPanel>
|
|
||||||
<TextBlock Style="{StaticResource SectionTitleStyle}" Text="项目详情与结果填写" />
|
|
||||||
<Grid>
|
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="1.12*" />
|
<ColumnDefinition Width="1.12*" />
|
||||||
<ColumnDefinition Width="16" />
|
<ColumnDefinition Width="16" />
|
||||||
@@ -415,41 +336,76 @@
|
|||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="备注" />
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="备注" />
|
||||||
<TextBox Text="{Binding ResultNote, UpdateSourceTrigger=PropertyChanged}" MinHeight="104" AcceptsReturn="True" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" IsReadOnly="{Binding SelectedItemUsesRealtimeValue}" />
|
<TextBox Text="{Binding ResultNote, UpdateSourceTrigger=PropertyChanged}" MinHeight="104" AcceptsReturn="True" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" IsReadOnly="{Binding SelectedItemUsesRealtimeValue}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
</StackPanel>
|
<WrapPanel Margin="0,8,0,0">
|
||||||
</ScrollViewer>
|
<Button Command="{Binding SelectPreviousItemCommand}" Content="上一项" Background="#FF6B8791" />
|
||||||
</DockPanel>
|
<Button Command="{Binding SelectNextItemCommand}" Content="下一项" Background="#FF6B8791" />
|
||||||
|
<Button Command="{Binding ApplyResultCommand}" Content="保存" />
|
||||||
|
</WrapPanel>
|
||||||
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
</Grid>
|
</StackPanel>
|
||||||
|
</ScrollViewer>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
<TabItem Header="实时数据">
|
<TabItem Header="实时数据">
|
||||||
<ScrollViewer VerticalScrollBarVisibility="Auto">
|
<ScrollViewer VerticalScrollBarVisibility="Auto">
|
||||||
<StackPanel Margin="0,6,0,0">
|
<StackPanel Margin="0,6,0,0">
|
||||||
<UniformGrid Columns="4" Margin="0,0,0,12">
|
<Border Style="{StaticResource CardBorderStyle}">
|
||||||
<Border Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}"><StackPanel><TextBlock Style="{StaticResource CaptionStyle}" Text="阶段" /><TextBlock Style="{StaticResource MetricValueStyle}" FontSize="20" Text="{Binding CurrentStage}" TextWrapping="Wrap" /></StackPanel></Border>
|
<StackPanel>
|
||||||
<Border Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}"><StackPanel><TextBlock Style="{StaticResource CaptionStyle}" Text="设备" /><TextBlock Style="{StaticResource MetricValueStyle}" FontSize="20" Text="{Binding DeviceStatus}" TextWrapping="Wrap" /></StackPanel></Border>
|
<TextBlock Style="{StaticResource SectionTitleStyle}" Text="实时总览" />
|
||||||
<Border Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}"><StackPanel><TextBlock Style="{StaticResource CaptionStyle}" Text="待检" /><TextBlock Style="{StaticResource MetricValueStyle}" FontSize="20" Text="{Binding PendingCount}" /></StackPanel></Border>
|
<WrapPanel Margin="0,0,0,4">
|
||||||
<Border Margin="0,0,0,8" Style="{StaticResource PanelSectionStyle}"><StackPanel><TextBlock Style="{StaticResource CaptionStyle}" Text="告警" /><TextBlock Style="{StaticResource MetricValueStyle}" FontSize="20" Text="{Binding AlarmMessages.Count}" /></StackPanel></Border>
|
<Border Width="150" Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}">
|
||||||
</UniformGrid>
|
<StackPanel>
|
||||||
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="阶段" />
|
||||||
<UniformGrid Columns="2" Margin="0,0,0,12">
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="20" Text="{Binding CurrentStage}" TextWrapping="Wrap" />
|
||||||
<Border Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}"><StackPanel><TextBlock Style="{StaticResource CaptionStyle}" Text="再循环率" /><TextBlock Style="{StaticResource MetricValueStyle}" FontSize="24" Text="{Binding RealtimeRecirculationDisplay}" /></StackPanel></Border>
|
</StackPanel>
|
||||||
<Border Margin="0,0,0,8" Style="{StaticResource PanelSectionStyle}"><StackPanel><TextBlock Style="{StaticResource CaptionStyle}" Text="主泵/回输差" /><TextBlock Style="{StaticResource MetricValueStyle}" FontSize="24" Text="{Binding FlowImbalanceDisplay}" /></StackPanel></Border>
|
</Border>
|
||||||
</UniformGrid>
|
<Border Width="150" Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}">
|
||||||
|
<StackPanel>
|
||||||
<UniformGrid Columns="4" Margin="0,0,0,12">
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="设备" />
|
||||||
<Border Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}"><StackPanel><TextBlock Style="{StaticResource CaptionStyle}" Text="压力降" /><TextBlock Style="{StaticResource MetricValueStyle}" FontSize="20" Text="{Binding DeltaPressureDisplay}" /></StackPanel></Border>
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="20" Text="{Binding DeviceStatus}" TextWrapping="Wrap" />
|
||||||
<Border Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}"><StackPanel><TextBlock Style="{StaticResource CaptionStyle}" Text="负压辅助引流" /><TextBlock Style="{StaticResource MetricValueStyle}" FontSize="20" Text="{Binding NegativeAssistPressureDisplay}" /></StackPanel></Border>
|
</StackPanel>
|
||||||
<Border Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}"><StackPanel><TextBlock Style="{StaticResource CaptionStyle}" Text="fHb 趋势" /><TextBlock Style="{StaticResource MetricValueStyle}" FontSize="20" Text="{Binding FreeHemoglobinDisplay}" /></StackPanel></Border>
|
</Border>
|
||||||
<Border Margin="0,0,0,8" Style="{StaticResource PanelSectionStyle}"><StackPanel><TextBlock Style="{StaticResource CaptionStyle}" Text="白细胞减少率" /><TextBlock Style="{StaticResource MetricValueStyle}" FontSize="20" Text="{Binding WhiteCellLossDisplay}" /></StackPanel></Border>
|
<Border Width="150" Margin="0,0,8,8" Padding="14" Background="#FFE7F5F3" CornerRadius="14">
|
||||||
</UniformGrid>
|
<StackPanel>
|
||||||
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="合格率" />
|
||||||
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="24" Text="{Binding ComplianceDisplay}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
<Border Width="150" Margin="0,0,8,8" Padding="14" Background="#FFE9EFF9" CornerRadius="14">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="合格项" />
|
||||||
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="24" Text="{Binding QualifiedCount}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
<Border Width="150" Margin="0,0,8,8" Padding="14" Background="#FFFDEBE7" CornerRadius="14">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="预警/不合格" />
|
||||||
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="24" Text="{Binding WarningCount}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
<Border Width="150" Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="待检" />
|
||||||
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="20" Text="{Binding PendingCount}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
<Border Width="150" Margin="0,0,0,8" Style="{StaticResource PanelSectionStyle}">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="告警" />
|
||||||
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="20" Text="{Binding AlarmMessages.Count}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</WrapPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
<Border Style="{StaticResource CardBorderStyle}">
|
<Border Style="{StaticResource CardBorderStyle}">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock Style="{StaticResource SectionTitleStyle}" Text="流量传感器" />
|
<TextBlock Style="{StaticResource SectionTitleStyle}" Text="流量快照" />
|
||||||
<UniformGrid Columns="3" Margin="0,0,0,8">
|
<UniformGrid Columns="3" Margin="0,0,0,8">
|
||||||
<Border Margin="0,0,8,0" Style="{StaticResource PanelSectionStyle}">
|
<Border Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="主泵" />
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="主泵" />
|
||||||
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding PumpFlowDisplay}" />
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding PumpFlowDisplay}" />
|
||||||
@@ -457,7 +413,7 @@
|
|||||||
<ProgressBar Minimum="0" Maximum="1" Value="{Binding PumpFlowNormalizedValue, Mode=OneWay}" Height="10" Foreground="{StaticResource AccentBrush}" Background="#FFDDE7EC" />
|
<ProgressBar Minimum="0" Maximum="1" Value="{Binding PumpFlowNormalizedValue, Mode=OneWay}" Height="10" Foreground="{StaticResource AccentBrush}" Background="#FFDDE7EC" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
<Border Margin="0,0,8,0" Style="{StaticResource PanelSectionStyle}">
|
<Border Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="引流" />
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="引流" />
|
||||||
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding DrainageFlowDisplay}" />
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding DrainageFlowDisplay}" />
|
||||||
@@ -465,7 +421,7 @@
|
|||||||
<ProgressBar Minimum="0" Maximum="1" Value="{Binding DrainageFlowNormalizedValue, Mode=OneWay}" Height="10" Foreground="{StaticResource AccentBrush}" Background="#FFDDE7EC" />
|
<ProgressBar Minimum="0" Maximum="1" Value="{Binding DrainageFlowNormalizedValue, Mode=OneWay}" Height="10" Foreground="{StaticResource AccentBrush}" Background="#FFDDE7EC" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
<Border Style="{StaticResource PanelSectionStyle}">
|
<Border Margin="0,0,0,8" Style="{StaticResource PanelSectionStyle}">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="回输" />
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="回输" />
|
||||||
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding ReturnFlowDisplay}" />
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding ReturnFlowDisplay}" />
|
||||||
@@ -474,33 +430,72 @@
|
|||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
</UniformGrid>
|
</UniformGrid>
|
||||||
|
<WrapPanel>
|
||||||
|
<Border Width="180" Margin="0,0,8,8" Padding="14" Background="#FFEAF6F3" CornerRadius="14">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="再循环率" />
|
||||||
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding RealtimeRecirculationDisplay}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
<Border Width="180" Margin="0,0,8,8" Padding="14" Background="#FFF6EFE2" CornerRadius="14">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="压力降" />
|
||||||
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding DeltaPressureDisplay}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
<Border Width="180" Margin="0,0,0,8" Padding="14" Background="#FFEFF1FA" CornerRadius="14">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="主泵/回输差" />
|
||||||
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding FlowImbalanceDisplay}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</WrapPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<Border Style="{StaticResource CardBorderStyle}">
|
<Border Style="{StaticResource CardBorderStyle}">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock Style="{StaticResource SectionTitleStyle}" Text="辅助实时指标" />
|
<TextBlock Style="{StaticResource SectionTitleStyle}" Text="压力与辅助指标" />
|
||||||
<UniformGrid Columns="3">
|
<WrapPanel Margin="0,0,0,4">
|
||||||
<Border Margin="0,0,8,0" Style="{StaticResource PanelSectionStyle}">
|
<Border Width="180" Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="入口/出口压力" />
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="近端压力" />
|
||||||
<TextBlock FontSize="18" FontWeight="Bold" Text="{Binding SelectedItemLiveDisplay}" TextWrapping="Wrap" />
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding Channels[4].DisplayValue}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
<Border Margin="0,0,8,0" Style="{StaticResource PanelSectionStyle}">
|
<Border Width="180" Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="远端压力" />
|
||||||
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding Channels[3].DisplayValue}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
<Border Width="180" Margin="0,0,8,8" Style="{StaticResource PanelSectionStyle}">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="负压辅助引流" />
|
||||||
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding NegativeAssistPressureDisplay}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
<Border Width="180" Margin="0,0,0,8" Style="{StaticResource PanelSectionStyle}">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="模拟血液温度" />
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="模拟血液温度" />
|
||||||
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding TemperatureDisplay}" />
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding TemperatureDisplay}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
<Border Style="{StaticResource PanelSectionStyle}">
|
</WrapPanel>
|
||||||
|
<WrapPanel>
|
||||||
|
<Border Width="220" Margin="0,0,8,0" Style="{StaticResource PanelSectionStyle}">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock Style="{StaticResource CaptionStyle}" Text="当前选中条款策略" />
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="fHb 趋势" />
|
||||||
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="20" Text="{Binding SelectedItemCaptureModeText}" TextWrapping="Wrap" />
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding FreeHemoglobinDisplay}" />
|
||||||
<TextBlock Margin="0,6,0,0" Style="{StaticResource CaptionStyle}" Text="{Binding SelectedItemMeasurementSource}" TextWrapping="Wrap" />
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
</UniformGrid>
|
<Border Width="220" Margin="0,0,0,0" Style="{StaticResource PanelSectionStyle}">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Style="{StaticResource CaptionStyle}" Text="白细胞减少率" />
|
||||||
|
<TextBlock Style="{StaticResource MetricValueStyle}" FontSize="22" Text="{Binding WhiteCellLossDisplay}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</WrapPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using Cardiopulmonarybypasssystems.Models;
|
using Cardiopulmonarybypasssystems.Models;
|
||||||
using NModbus;
|
using NModbus;
|
||||||
|
|
||||||
@@ -11,6 +13,8 @@ public sealed class MockModbusTelemetryService : IModbusTelemetryService, IDispo
|
|||||||
private const byte SlaveId = 1;
|
private const byte SlaveId = 1;
|
||||||
private const ushort ProximalPressureRegister = 1330;
|
private const ushort ProximalPressureRegister = 1330;
|
||||||
private const ushort DistalPressureRegister = 1380;
|
private const ushort DistalPressureRegister = 1380;
|
||||||
|
private static readonly TimeSpan ConnectionAttemptTimeout = TimeSpan.FromMilliseconds(300);
|
||||||
|
private static readonly TimeSpan ConnectionRetryInterval = TimeSpan.FromSeconds(5);
|
||||||
|
|
||||||
private readonly object _syncRoot = new();
|
private readonly object _syncRoot = new();
|
||||||
private readonly Random _random = new();
|
private readonly Random _random = new();
|
||||||
@@ -32,16 +36,18 @@ public sealed class MockModbusTelemetryService : IModbusTelemetryService, IDispo
|
|||||||
private TcpClient? _tcpClient;
|
private TcpClient? _tcpClient;
|
||||||
private IModbusMaster? _master;
|
private IModbusMaster? _master;
|
||||||
private bool _connectionInitialized;
|
private bool _connectionInitialized;
|
||||||
|
private Task? _connectionTask;
|
||||||
|
private DateTime _nextConnectionAttemptUtc = DateTime.MinValue;
|
||||||
|
|
||||||
public IReadOnlyList<DeviceChannel> GetChannels()
|
public IReadOnlyList<DeviceChannel> GetChannels()
|
||||||
{
|
{
|
||||||
EnsureConnected();
|
EnsureConnectionScheduled();
|
||||||
return _channels;
|
return _channels;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IReadOnlyList<AlarmMessage> UpdateChannels()
|
public IReadOnlyList<AlarmMessage> UpdateChannels()
|
||||||
{
|
{
|
||||||
EnsureConnected();
|
EnsureConnectionScheduled();
|
||||||
|
|
||||||
lock (_syncRoot)
|
lock (_syncRoot)
|
||||||
{
|
{
|
||||||
@@ -74,14 +80,19 @@ public sealed class MockModbusTelemetryService : IModbusTelemetryService, IDispo
|
|||||||
{
|
{
|
||||||
lock (_syncRoot)
|
lock (_syncRoot)
|
||||||
{
|
{
|
||||||
_master?.Dispose();
|
ReleaseConnection();
|
||||||
_tcpClient?.Dispose();
|
|
||||||
_master = null;
|
|
||||||
_tcpClient = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EnsureConnected()
|
private void ReleaseConnection()
|
||||||
|
{
|
||||||
|
_master?.Dispose();
|
||||||
|
_tcpClient?.Dispose();
|
||||||
|
_master = null;
|
||||||
|
_tcpClient = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void EnsureConnectionScheduled()
|
||||||
{
|
{
|
||||||
lock (_syncRoot)
|
lock (_syncRoot)
|
||||||
{
|
{
|
||||||
@@ -90,20 +101,50 @@ public sealed class MockModbusTelemetryService : IModbusTelemetryService, IDispo
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Dispose();
|
if (_connectionTask is { IsCompleted: false })
|
||||||
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
_tcpClient = new TcpClient();
|
return;
|
||||||
_tcpClient.Connect(IpAddress, Port);
|
|
||||||
_master = _factory.CreateMaster(_tcpClient);
|
|
||||||
_connectionInitialized = true;
|
|
||||||
}
|
}
|
||||||
catch
|
|
||||||
|
if (DateTime.UtcNow < _nextConnectionAttemptUtc)
|
||||||
{
|
{
|
||||||
_master = null;
|
return;
|
||||||
_tcpClient?.Dispose();
|
}
|
||||||
_tcpClient = null;
|
|
||||||
|
_nextConnectionAttemptUtc = DateTime.UtcNow.Add(ConnectionRetryInterval);
|
||||||
|
_connectionTask = Task.Run(ConnectWithTimeout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ConnectWithTimeout()
|
||||||
|
{
|
||||||
|
TcpClient? tcpClient = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
tcpClient = new TcpClient();
|
||||||
|
using var cancellation = new CancellationTokenSource(ConnectionAttemptTimeout);
|
||||||
|
tcpClient.ConnectAsync(IpAddress, Port, cancellation.Token).GetAwaiter().GetResult();
|
||||||
|
tcpClient.ReceiveTimeout = (int)ConnectionAttemptTimeout.TotalMilliseconds;
|
||||||
|
tcpClient.SendTimeout = (int)ConnectionAttemptTimeout.TotalMilliseconds;
|
||||||
|
var master = _factory.CreateMaster(tcpClient);
|
||||||
|
|
||||||
|
lock (_syncRoot)
|
||||||
|
{
|
||||||
|
ReleaseConnection();
|
||||||
|
_tcpClient = tcpClient;
|
||||||
|
_master = master;
|
||||||
|
_connectionInitialized = true;
|
||||||
|
tcpClient = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
tcpClient?.Dispose();
|
||||||
|
|
||||||
|
lock (_syncRoot)
|
||||||
|
{
|
||||||
|
ReleaseConnection();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -126,7 +167,12 @@ public sealed class MockModbusTelemetryService : IModbusTelemetryService, IDispo
|
|||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
Dispose();
|
lock (_syncRoot)
|
||||||
|
{
|
||||||
|
ReleaseConnection();
|
||||||
|
_nextConnectionAttemptUtc = DateTime.MinValue;
|
||||||
|
}
|
||||||
|
|
||||||
SimulatePressureChannels();
|
SimulatePressureChannels();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -191,6 +191,8 @@ public partial class MainViewModel : ObservableObject
|
|||||||
public string PumpFlowDisplay => $"{PumpFlow:F2} L/min";
|
public string PumpFlowDisplay => $"{PumpFlow:F2} L/min";
|
||||||
public string DrainageFlowDisplay => $"{DrainageFlow:F2} L/min";
|
public string DrainageFlowDisplay => $"{DrainageFlow:F2} L/min";
|
||||||
public string ReturnFlowDisplay => $"{ReturnFlow:F2} L/min";
|
public string ReturnFlowDisplay => $"{ReturnFlow:F2} L/min";
|
||||||
|
public string ProximalPressureDisplay => $"{ChannelValue("近端压力"):F1} mmHg";
|
||||||
|
public string DistalPressureDisplay => $"{ChannelValue("远端压力"):F1} mmHg";
|
||||||
public string FlowImbalanceDisplay => $"{Math.Abs(PumpFlow - ReturnFlow):F2} L/min";
|
public string FlowImbalanceDisplay => $"{Math.Abs(PumpFlow - ReturnFlow):F2} L/min";
|
||||||
public string PumpFlowLoadDisplay => $"{ChannelNormalizedValue("主泵流量"):P0} 量程";
|
public string PumpFlowLoadDisplay => $"{ChannelNormalizedValue("主泵流量"):P0} 量程";
|
||||||
public string DrainageFlowLoadDisplay => $"{ChannelNormalizedValue("静脉引流流量"):P0} 量程";
|
public string DrainageFlowLoadDisplay => $"{ChannelNormalizedValue("静脉引流流量"):P0} 量程";
|
||||||
@@ -569,9 +571,11 @@ public partial class MainViewModel : ObservableObject
|
|||||||
private void RefreshTelemetry()
|
private void RefreshTelemetry()
|
||||||
{
|
{
|
||||||
var alarms = _telemetryService.UpdateChannels();
|
var alarms = _telemetryService.UpdateChannels();
|
||||||
|
AlarmMessages.Clear();
|
||||||
|
|
||||||
foreach (var alarm in alarms.OrderByDescending(a => a.Timestamp))
|
foreach (var alarm in alarms.OrderByDescending(a => a.Timestamp))
|
||||||
{
|
{
|
||||||
AlarmMessages.Insert(0, alarm);
|
AlarmMessages.Add(alarm);
|
||||||
}
|
}
|
||||||
|
|
||||||
RefreshTelemetryPanel();
|
RefreshTelemetryPanel();
|
||||||
@@ -591,6 +595,8 @@ public partial class MainViewModel : ObservableObject
|
|||||||
OnPropertyChanged(nameof(PumpFlowDisplay));
|
OnPropertyChanged(nameof(PumpFlowDisplay));
|
||||||
OnPropertyChanged(nameof(DrainageFlowDisplay));
|
OnPropertyChanged(nameof(DrainageFlowDisplay));
|
||||||
OnPropertyChanged(nameof(ReturnFlowDisplay));
|
OnPropertyChanged(nameof(ReturnFlowDisplay));
|
||||||
|
OnPropertyChanged(nameof(ProximalPressureDisplay));
|
||||||
|
OnPropertyChanged(nameof(DistalPressureDisplay));
|
||||||
OnPropertyChanged(nameof(RealtimeRecirculationDisplay));
|
OnPropertyChanged(nameof(RealtimeRecirculationDisplay));
|
||||||
OnPropertyChanged(nameof(FlowImbalanceDisplay));
|
OnPropertyChanged(nameof(FlowImbalanceDisplay));
|
||||||
OnPropertyChanged(nameof(NegativeAssistPressureDisplay));
|
OnPropertyChanged(nameof(NegativeAssistPressureDisplay));
|
||||||
|
|||||||
Reference in New Issue
Block a user