总计 3 次浏览

目录

一、需求

二、硬件

三、程序

四、数据库设计(MySQL)

五、部分核心代码


一、需求

客户是汽车配件生产厂家,按照客户要求,半成品需要粘二维码。这个二维码是总装时各个工序间识别的唯一编码,绝对不能重复。打印是西铁城条码打印机,使用碳带与标签纸(定制)输出二维码,2个工位(不同办公室)2台打印机分工打印。

在实际打印中发现很多重复标签,原因大致有如下几种:

1.卡纸处理后,打印机会再次打印未完成的任务,导致重复标签

2.缺纸、碳带佣金,更换后也会出现重复标签

3.两台打印机分工时失误,导致大量重复标签

解决以上问题,除了人工核对外,计划采程序自动识别重复,然后提示管理员处理。

二、硬件

电脑、条码打印机、二维码扫描头、服务器

条码/二维码打印机防重复系统插图

三、程序

名称:《条码打印在线防重 检测系统

整体架构

条码/二维码打印机防重复系统插图1

基本功能:

扫描头读取标签二维码,上传至 数据库 比对,没有重复就记录到数据库,发现重复就暂停打印机。在电脑屏幕上弹出提示,告知管理员重复的二维码,经处理后再继续打印。

四、数据库设计(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(); // 暂停当前正在打印的任务 
}
}

By 站长

发表回复

普人特福的博客cnzz&51la for wordpress,cnzz for wordpress,51la for wordpress