目录
一、需求
客户是汽车配件生产厂家,按照客户要求,半成品需要粘二维码。这个二维码是总装时各个工序间识别的唯一编码,绝对不能重复。打印是西铁城条码打印机,使用碳带与标签纸(定制)输出二维码,2个工位(不同办公室)2台打印机分工打印。
在实际打印中发现很多重复标签,原因大致有如下几种:
1.卡纸处理后,打印机会再次打印未完成的任务,导致重复标签
2.缺纸、碳带佣金,更换后也会出现重复标签
3.两台打印机分工时失误,导致大量重复标签
解决以上问题,除了人工核对外,计划采程序自动识别重复,然后提示管理员处理。
二、硬件
电脑、条码打印机、二维码扫描头、服务器等

三、程序
名称:《条码打印在线防重 检测系统 》
整体架构

基本功能:
扫描头读取标签二维码,上传至 数据库 比对,没有重复就记录到数据库,发现重复就暂停打印机。在电脑屏幕上弹出提示,告知管理员重复的二维码,经处理后再继续打印。
四、数据库设计(MySQL)
-- 打印记录表 CREATE TABLE print_records ( id BIGINT AUTO_INCREMENT PRIMARY KEY, barcode VARCHAR(255) NOT NULL, station_id VARCHAR(50) NOT NULL, -- 机位编号 printer_name VARCHAR(100), -- 打印机名称 print_time DATETIME NOT NULL, status TINYINT DEFAULT 1, -- 1正常 2重复异常 UNIQUE KEY uk_barcode (barcode) -- 条码唯一索引,查重核心 ); -- 异常记录表 CREATE TABLE alert_records ( id BIGINT AUTO_INCREMENT PRIMARY KEY, barcode VARCHAR(255) NOT NULL, station_id VARCHAR(50) NOT NULL, alert_time DATETIME NOT NULL, resolved TINYINT DEFAULT 0, resolved_by VARCHAR(50), resolved_time DATETIME );
五、部分核心代码
public class StationScanner : IDisposable
{
private readonly SerialPort _serialPort;
private readonly StringBuilder _buffer = new StringBuilder();
public string StationId { get; }
public string PrinterName { get; }
// 扫码事件:传出机位ID和条码内容
public event Action<string, string> OnBarcodeScanned;
public StationScanner(string stationId, string comPort,
int baudRate, string printerName)
{
StationId = stationId;
PrinterName = printerName;
_serialPort = new SerialPort(comPort, baudRate,
Parity.None, 8, StopBits.One)
{
ReadTimeout = 1000,
WriteTimeout = 1000
};
_serialPort.DataReceived += OnDataReceived;
}
public bool Open()
{
try { _serialPort.Open(); return true; }
catch { return false; }
}
private void OnDataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = _serialPort.ReadExisting();
_buffer.Append(data);
// 以回车换行作为一条完整条码的结束标志
while (_buffer.ToString().Contains("\r\n"))
{
string full = _buffer.ToString();
int idx = full.IndexOf("\r\n", StringComparison.Ordinal);
string barcode = full.Substring(0, idx).Trim();
_buffer.Remove(0, idx + 2);
if (!string.IsNullOrWhiteSpace(barcode))
{
OnBarcodeScanned?.Invoke(StationId, barcode);
}
}
}
public void Dispose()
{
_serialPort?.Close();
_serialPort?.Dispose();
}
}
发现异常暂停打印机任务
using System.Printing;
PrintQueue queue = new PrintQueue(new PrintServer(), "你的打印机名称");
foreach (PrintSystemJobInfo job in queue.GetPrintJobInfoCollection())
{
if ((job.JobStatus & PrintJobStatus.Printing) == PrintJobStatus.Printing)
{
job.Pause(); // 暂停当前正在打印的任务
}
}