✨ 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

@@ -15,6 +15,11 @@ public sealed class AppConfig
/// </summary>
public ScannerOptions Scanner { get; set; } = new();
/// <summary>
/// 获取或设置统一文件校验配置。
/// </summary>
public FileCheckOptions FileCheck { get; set; } = new();
/// <summary>
/// 获取或设置 SFTP 校验配置。
/// </summary>
@@ -41,6 +46,64 @@ public sealed class AppConfig
public SecurityOptions Security { get; set; } = new();
}
/// <summary>
/// 表示文件校验通道类型。
/// </summary>
public enum FileCheckProvider
{
/// <summary>
/// 使用 SFTP 目录作为文件校验来源。
/// </summary>
Sftp,
/// <summary>
/// 使用本地磁盘目录作为文件校验来源。
/// </summary>
Local
}
/// <summary>
/// 表示统一文件校验配置。
/// </summary>
public sealed class FileCheckOptions
{
/// <summary>
/// 获取或设置当前启用的文件校验通道。
/// </summary>
public FileCheckProvider Provider { get; set; } = FileCheckProvider.Sftp;
/// <summary>
/// 获取或设置文件名匹配模板。
/// </summary>
public string FileNamePattern { get; set; } = "${barcode}.txt";
/// <summary>
/// 获取或设置首次未命中后的重试间隔,单位为秒。
/// </summary>
public int RetryIntervalSeconds { get; set; } = 2;
/// <summary>
/// 获取或设置首次未命中后的最大重试次数。
/// </summary>
public int MaxRetryCount { get; set; } = 3;
/// <summary>
/// 获取或设置本地磁盘文件校验配置。
/// </summary>
public LocalFileCheckOptions Local { get; set; } = new();
}
/// <summary>
/// 表示本地磁盘文件校验配置。
/// </summary>
public sealed class LocalFileCheckOptions
{
/// <summary>
/// 获取或设置本地文件校验根目录。
/// </summary>
public string RootPath { get; set; } = "D:\\PcbCheck\\Files";
}
/// <summary>
/// 表示 PLC 通信参数与点位映射配置。
/// </summary>
@@ -54,12 +117,17 @@ public sealed class PlcOptions
/// <summary>
/// 获取或设置 PLC 端口。
/// </summary>
public int Port { get; set; } = 502;
public int Port { get; set; } = 9600;
/// <summary>
/// 获取或设置 Modbus 从站号。
/// 获取或设置 FINS 目标单元地址。
/// </summary>
public byte UnitId { get; set; } = 1;
public byte UnitAddress { get; set; }
/// <summary>
/// 获取或设置上位机节点编号。
/// </summary>
public byte SourceNodeAddress { get; set; } = 25;
/// <summary>
/// 获取或设置轮询周期,单位为毫秒。
@@ -98,54 +166,75 @@ public sealed class PlcOptions
}
/// <summary>
/// 表示扫码枪串口参数配置。
/// 表示双 TCP 扫码枪参数配置。
/// </summary>
public sealed class ScannerOptions
{
/// <summary>
/// 获取或设置串口号。
/// 获取或设置扫码枪1配置。
/// </summary>
public string PortName { get; set; } = "COM1";
public TcpScannerEndpointOptions Scanner1 { get; set; } = new()
{
Name = "扫码枪1",
Host = "127.0.0.1",
Port = 9001
};
/// <summary>
/// 获取或设置波特率。
/// 获取或设置扫码枪2配置。
/// </summary>
public int BaudRate { get; set; } = 9600;
public TcpScannerEndpointOptions Scanner2 { get; set; } = new()
{
Name = "扫码枪2",
Host = "127.0.0.1",
Port = 9002
};
/// <summary>
/// 获取或设置数据位。
/// 获取或设置 TCP 连接超时,单位为毫秒。
/// </summary>
public int DataBits { get; set; } = 8;
public int ConnectTimeoutMs { get; set; } = 3000;
/// <summary>
/// 获取或设置校验位名称。
/// 获取或设置扫码枪触发命令,支持转义字符。
/// </summary>
public string Parity { get; set; } = "None";
public string TriggerCommand { get; set; } = "T";
/// <summary>
/// 获取或设置停止位名称。
/// 获取或设置返回报文结束符,支持转义字符;为空时读取到首批非空数据即返回。
/// </summary>
public string StopBits { get; set; } = "One";
public string ResponseTerminator { get; set; } = "\\r";
/// <summary>
/// 获取或设置是否并发触发两把扫码枪。
/// </summary>
public bool TriggerInParallel { get; set; } = true;
/// <summary>
/// 获取或设置单次扫码超时,单位为毫秒。
/// </summary>
public int ReadTimeoutMs { get; set; } = 3000;
}
/// <summary>
/// 表示单把 TCP 扫码枪连接参数。
/// </summary>
public sealed class TcpScannerEndpointOptions
{
/// <summary>
/// 获取或设置扫码枪名称。
/// </summary>
public string Name { get; set; } = string.Empty;
/// <summary>
/// 获取或设置触发命令,支持转义字符。
/// 获取或设置扫码枪 IP 或主机名。
/// </summary>
public string TriggerCommand { get; set; } = "SCAN\\r";
public string Host { get; set; } = "127.0.0.1";
/// <summary>
/// 获取或设置返回报文结束符,支持转义字符。
/// 获取或设置扫码枪 TCP 端口。
/// </summary>
public string ResponseTerminator { get; set; } = "\\r";
/// <summary>
/// 获取或设置最大扫码尝试次数。
/// </summary>
public int MaxScanAttempts { get; set; } = 3;
public int Port { get; set; } = 9001;
}
/// <summary>
@@ -331,33 +420,33 @@ public sealed class PlcInputAddressOptions
/// <summary>
/// 获取或设置 PCB 到位点位地址。
/// </summary>
public int PcbArrived { get; set; } = 10001;
public int PcbArrived { get; set; } = 1001;
/// <summary>
/// 获取或设置 PLC 复位点位地址。
/// </summary>
public int PlcReset { get; set; } = 10002;
public int PlcReset { get; set; } = 1002;
/// <summary>
/// 获取或设置 PLC 放行应答点位地址。
/// </summary>
public int PlcAckRelease { get; set; } = 10003;
public int PlcAckRelease { get; set; } = 1003;
}
/// <summary>
/// 表示 PLC 输出线圈地址配置。
/// 表示 PLC 输出地址配置。
/// </summary>
public sealed class PlcOutputAddressOptions
{
/// <summary>
/// 获取或设置 PC 忙碌位地址。
/// </summary>
public int PcBusy { get; set; } = 51;
public int PcBusy { get; set; } = 1051;
/// <summary>
/// 获取或设置放行位地址。
/// </summary>
public int ReleasePermit { get; set; } = 52;
public int ReleasePermit { get; set; } = 1052;
}
/// <summary>
@@ -368,7 +457,5 @@ public sealed class PlcRegisterAddressOptions
/// <summary>
/// 获取或设置结果代码寄存器地址。
/// </summary>
public int ResultCode { get; set; } = 40001;
/// <summary>
public int ResultCode { get; set; } = 1100;
}