From c3a2f7b5441bc9506925b438deee9530763b5eaa Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Wed, 13 Aug 2025 15:31:31 +0800 Subject: [PATCH] =?UTF-8?q?rfid=E6=88=90=E5=8A=9F=E8=8E=B7=E5=8F=96TID?= =?UTF-8?q?=E3=80=81=E5=86=99=E5=85=A5epc=E5=B9=B6=E6=89=93=E5=8D=B0?= =?UTF-8?q?=EF=BC=8C=E4=BD=86=E6=98=AF98mm*28mm=E6=A0=87=E7=AD=BE=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=9A=84=E7=AC=AC=E4=BA=8C=E5=BC=A0=E7=BA=B8=E7=9A=84?= =?UTF-8?q?TID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Impl/ReportLabelListServiceImpl.java | 149 ++++++++++++------ 1 file changed, 100 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java b/src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java index 26b282b..49e745a 100644 --- a/src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java +++ b/src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java @@ -194,7 +194,7 @@ public class ReportLabelListServiceImpl extends ServiceImpl 写入EPC -> 打印标签 + * 处理RFID标签的多份打印 + * 由于RFID标签的特殊性,需要逐张处理,并在每张之间留有足够的间隔 + */ + private void handleRfidMultiplePrint(String printerIP, String zplCode, Integer copies) { + log.info("开始处理RFID多份打印,份数: {}", copies); + + for (int i = 1; i <= copies; i++) { + try { + log.info("开始处理第{}张RFID标签", i); + + // 每张标签之间留有间隔,避免RFID模块冲突 + if (i > 1) { + Thread.sleep(2000); // 2秒间隔 + log.info("等待间隔完成,开始处理第{}张标签", i); + } + + RfidProcessResult result = processRfidLabel(printerIP, zplCode, i, "Y"); + if (!result.isSuccess()) { + throw new RuntimeException("第" + i + "张RFID标签处理失败: " + result.getErrorMessage()); + } + + log.info("第{}张RFID标签处理成功", i); + + } catch (Exception e) { + log.error("第{}张RFID标签处理失败: {}", i, e.getMessage()); + throw new RuntimeException("第" + i + "张RFID标签处理失败: " + e.getMessage()); + } + } + + log.info("RFID多份打印完成,总计{}张", copies); + } + + /** + * 处理标签打印:支持RFID和普通标签 */ - private RfidProcessResult processRfidLabel(String printerIP, String originalZplCode, int labelIndex, String rfidFlag) { - RfidProcessResult result = new RfidProcessResult(labelIndex); + private RfidProcessResult processRfidLabel(String printerIP, String originalZplCode, int copiesOrIndex, String rfidFlag) { + RfidProcessResult result = new RfidProcessResult(copiesOrIndex); java.net.Socket socket = null; try { - if (rfidFlag==null || "N".equals(rfidFlag)) { + if (rfidFlag == null || "N".equals(rfidFlag)) { + // 普通标签模式:可以直接设置打印份数 socket = new java.net.Socket(printerIP, 9100); socket.setSoTimeout(10000); OutputStream outputStream = socket.getOutputStream(); - // 清理原始ZPL代码,确保只打印1张 - String cleanedZpl = cleanZplForSinglePrint(originalZplCode); - String singlePrintZpl = "^XA\n^PQ1\n" + cleanedZpl.substring(3); - log.info("发送清理后的ZPL(跳过RFID): {}", singlePrintZpl); - printLabel(outputStream, singlePrintZpl); - result.markCompleted(true, "调试模式:跳过RFID,已打印普通标签"); - log.info("第{}张标签 - 调试模式:跳过RFID,已打印普通标签", labelIndex); + + // 清理原始ZPL代码,设置正确的打印份数 + String cleanedZpl = cleanZplForMultiplePrint(originalZplCode, copiesOrIndex); + + log.info("发送普通标签ZPL,份数: {}", copiesOrIndex); + printLabel(outputStream, cleanedZpl); + result.markCompleted(true, "普通标签打印完成,份数: " + copiesOrIndex); + log.info("普通标签打印完成,份数: {}", copiesOrIndex); return result; } + // RFID标签模式:单张处理 socket = new java.net.Socket(printerIP, 9100); - socket.setSoTimeout(10000); + socket.setSoTimeout(15000); // 增加超时时间 OutputStream outputStream = socket.getOutputStream(); InputStream inputStream = socket.getInputStream(); + // 步骤1: 读取RFID标签的TID - String tid = readRfidTid(outputStream, inputStream,originalZplCode); + String tid = readRfidTid(outputStream, inputStream, originalZplCode); result.setTid(tid); - log.info("第{}张标签 - 读取到TID: {}", labelIndex, tid); + log.info("第{}张RFID标签 - 读取到TID: {}", copiesOrIndex, tid); result.markCompleted(true, null); } catch (Exception e) { - String errorMsg = "第" + labelIndex + "张标签处理失败: " + e.getMessage(); + String errorMsg; + if ("Y".equals(rfidFlag)) { + errorMsg = "第" + copiesOrIndex + "张RFID标签处理失败: " + e.getMessage(); + } else { + errorMsg = "普通标签打印失败(份数:" + copiesOrIndex + "): " + e.getMessage(); + } System.err.println(errorMsg); result.markCompleted(false, e.getMessage()); throw new RuntimeException(errorMsg); @@ -276,23 +322,23 @@ public class ReportLabelListServiceImpl extends ServiceImpl 0) { String data = new String(buffer, 0, bytesRead, "UTF-8"); response.append(data); - hasReceivedData = true; - log.info("收到数据片段: {}", data.trim()); - - // 如果收到的数据看起来像TID数据,可以提前结束等待 - if (data.trim().length() >= 12 && data.trim().matches("[0-9A-Fa-f]+")) { - log.info("检测到TID格式数据,提前结束等待"); - break; - } } } else { Thread.sleep(200); // 增加等待间隔 @@ -324,18 +362,14 @@ public class ReportLabelListServiceImpl extends ServiceImpl 200 || responseStr.contains("RFID READER") || responseStr.contains("FIRMWARE") || responseStr.contains("RESOLUTION")) { throw new RuntimeException("收到打印机状态信息而非TID数据,请检查标签是否为RFID标签"); } - return responseStr; } @@ -347,14 +381,12 @@ public class ReportLabelListServiceImpl extends ServiceImpl 12) { epc = epc.substring(epc.length() - 12); } else if (epc.length() < 12) { epc = String.format("%012s", epc).replace(' ', '0'); } - log.info("生成EPC: {}", epc); return epc; } @@ -366,9 +398,6 @@ public class ReportLabelListServiceImpl extends ServiceImpl