✨ 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

@@ -0,0 +1,64 @@
using AxiOmron.PcbCheck.Models;
using AxiOmron.PcbCheck.Services.Implementations;
using Xunit;
namespace AxiOmron.PcbCheck.Tests;
/// <summary>
/// 验证双扫码枪结果汇总规则。
/// </summary>
public sealed class DualScannerResultMergerTests
{
/// <summary>
/// 任一扫码枪成功时,应使用成功条码继续后续 SFTP 流程。
/// </summary>
[Fact]
public void Merge_ShouldUseSecondBarcode_WhenOnlySecondScannerSucceeds()
{
var first = new ScanOperationResult
{
IsSuccess = false,
DeviceConnected = true,
ErrorMessage = "扫码枪1超时"
};
var second = new ScanOperationResult
{
IsSuccess = true,
DeviceConnected = true,
Barcode = "PCB-SECOND"
};
ScanOperationResult result = DualScannerResultMerger.Merge(first, second);
Assert.True(result.IsSuccess);
Assert.Equal("PCB-SECOND", result.Barcode);
Assert.Contains("扫码枪2", result.RawMessage);
}
/// <summary>
/// 两把扫码枪都成功但内容不一致时,应优先使用扫码枪1条码并保留不一致说明。
/// </summary>
[Fact]
public void Merge_ShouldPreferFirstBarcode_WhenBothScannersReturnDifferentBarcodes()
{
var first = new ScanOperationResult
{
IsSuccess = true,
DeviceConnected = true,
Barcode = "PCB-FIRST"
};
var second = new ScanOperationResult
{
IsSuccess = true,
DeviceConnected = true,
Barcode = "PCB-SECOND"
};
ScanOperationResult result = DualScannerResultMerger.Merge(first, second);
Assert.True(result.IsSuccess);
Assert.Equal("PCB-FIRST", result.Barcode);
Assert.Contains("不一致", result.ErrorMessage);
Assert.Contains("PCB-SECOND", result.RawMessage);
}
}