✨ feat(*): 重构PCB放行流程并接入双扫码校验

- 将流程改为 OMRON FINS + TCP 双扫码 + SFTP 文件校验
- 新增文件校验与扫码结果汇总实现,补充对应单测
- 同步更新流程设计文档、配置和系统设置页面文案
This commit is contained in:
2026-05-17 14:08:05 +08:00
parent 9a2211ccaa
commit ce356bffff
37 changed files with 4443 additions and 2436 deletions

View File

@@ -1,67 +1,67 @@
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace AxiOmron.PcbCheck.Converters;
/// <summary>
/// 将布尔值转换为 <see cref="Visibility"/>,支持通过 ConverterParameter 反转判定。
/// </summary>
/// <remarks>
/// 当 ConverterParameter 为 "Invert"、"Inverse" 或 "!" 时,布尔值的真假意义取反。
/// </remarks>
public sealed class BooleanToVisibilityConverter : IValueConverter
{
/// <summary>
/// 将布尔值转换为可见性。
/// </summary>
/// <param name="value">源布尔值。</param>
/// <param name="targetType">目标类型。</param>
/// <param name="parameter">若为 "Invert"/"!" 则反转判定。</param>
/// <param name="culture">当前区域信息。</param>
/// <returns><see cref="Visibility.Visible"/> 或 <see cref="Visibility.Collapsed"/>。</returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool flag = value is bool b && b;
if (IsInvert(parameter))
{
flag = !flag;
}
return flag ? Visibility.Visible : Visibility.Collapsed;
}
/// <summary>
/// 将可见性反向转换为布尔值。
/// </summary>
/// <param name="value">目标可见性。</param>
/// <param name="targetType">目标类型。</param>
/// <param name="parameter">若为 "Invert"/"!" 则反转判定。</param>
/// <param name="culture">当前区域信息。</param>
/// <returns>布尔值。</returns>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
bool flag = value is Visibility v && v == Visibility.Visible;
if (IsInvert(parameter))
{
flag = !flag;
}
return flag;
}
/// <summary>
/// 判断参数是否要求反转判定。
/// </summary>
/// <param name="parameter">参数值。</param>
/// <returns>是否反转。</returns>
private static bool IsInvert(object? parameter)
{
if (parameter is null)
{
return false;
}
string token = parameter.ToString() ?? string.Empty;
return token.Equals("Invert", StringComparison.OrdinalIgnoreCase)
|| token.Equals("Inverse", StringComparison.OrdinalIgnoreCase)
|| token.Equals("!", StringComparison.Ordinal);
}
}
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace AxiOmron.PcbCheck.Converters;
/// <summary>
/// 将布尔值转换为 <see cref="Visibility"/>,支持通过 ConverterParameter 反转判定。
/// </summary>
/// <remarks>
/// 当 ConverterParameter 为 "Invert"、"Inverse" 或 "!" 时,布尔值的真假意义取反。
/// </remarks>
public sealed class BooleanToVisibilityConverter : IValueConverter
{
/// <summary>
/// 将布尔值转换为可见性。
/// </summary>
/// <param name="value">源布尔值。</param>
/// <param name="targetType">目标类型。</param>
/// <param name="parameter">若为 "Invert"/"!" 则反转判定。</param>
/// <param name="culture">当前区域信息。</param>
/// <returns><see cref="Visibility.Visible"/> 或 <see cref="Visibility.Collapsed"/>。</returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool flag = value is bool b && b;
if (IsInvert(parameter))
{
flag = !flag;
}
return flag ? Visibility.Visible : Visibility.Collapsed;
}
/// <summary>
/// 将可见性反向转换为布尔值。
/// </summary>
/// <param name="value">目标可见性。</param>
/// <param name="targetType">目标类型。</param>
/// <param name="parameter">若为 "Invert"/"!" 则反转判定。</param>
/// <param name="culture">当前区域信息。</param>
/// <returns>布尔值。</returns>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
bool flag = value is Visibility v && v == Visibility.Visible;
if (IsInvert(parameter))
{
flag = !flag;
}
return flag;
}
/// <summary>
/// 判断参数是否要求反转判定。
/// </summary>
/// <param name="parameter">参数值。</param>
/// <returns>是否反转。</returns>
private static bool IsInvert(object? parameter)
{
if (parameter is null)
{
return false;
}
string token = parameter.ToString() ?? string.Empty;
return token.Equals("Invert", StringComparison.OrdinalIgnoreCase)
|| token.Equals("Inverse", StringComparison.OrdinalIgnoreCase)
|| token.Equals("!", StringComparison.Ordinal);
}
}