From 8c4e6115ad046e763ea36d3030119770ae14e6c1 Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Wed, 13 Aug 2025 10:26:44 +0800 Subject: [PATCH] =?UTF-8?q?rfid=E6=88=90=E5=8A=9F=E8=8E=B7=E5=8F=96TID?= =?UTF-8?q?=E5=B9=B6=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/base/entity/LabelSettingData.java | 3 +- .../base/service/Impl/BaseServiceImpl.java | 3 - .../Impl/ReportLabelListServiceImpl.java | 141 ++++++++++++++---- src/main/resources/mapper/base/BaseMapper.xml | 7 +- 4 files changed, 117 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/gaotao/modules/base/entity/LabelSettingData.java b/src/main/java/com/gaotao/modules/base/entity/LabelSettingData.java index a26d362..7b20df5 100644 --- a/src/main/java/com/gaotao/modules/base/entity/LabelSettingData.java +++ b/src/main/java/com/gaotao/modules/base/entity/LabelSettingData.java @@ -14,8 +14,9 @@ public class LabelSettingData { private String searchFlag;//是否查询 private String newLabelNo;//新的标签编号 private String printDirection; + private String rfidFlag; //是否使用RFID private String zplCode; - + // 新增纸张尺寸和DPI相关字段 private String paperSize; // 纸张尺寸规格 (如: 4x6, 2x3, 2x4等) private String paperOrientation; // 纸张方向 (portrait/landscape) diff --git a/src/main/java/com/gaotao/modules/base/service/Impl/BaseServiceImpl.java b/src/main/java/com/gaotao/modules/base/service/Impl/BaseServiceImpl.java index 5410ec1..c0fe568 100644 --- a/src/main/java/com/gaotao/modules/base/service/Impl/BaseServiceImpl.java +++ b/src/main/java/com/gaotao/modules/base/service/Impl/BaseServiceImpl.java @@ -45,9 +45,6 @@ public class BaseServiceImpl implements BaseService { String labelType = inData.getLabelType(); String labelClass = inData.getLabelClass(); //判断空值 - if (labelName == null || "".equals(labelName)) { - throw new XJException("报表文件名不能为空!"); - } if (labelType == null || "".equals(labelType)) { throw new XJException("标签类型不能为空!"); } 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 31cd2dd..26b282b 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 @@ -155,6 +155,15 @@ public class ReportLabelListServiceImpl extends ServiceImpl labelSettingDataList = baseService.getLabelSettingList(labelSettingData); + if (labelSettingDataList.isEmpty()) { + throw new RuntimeException("未找到对应的标签"); + } else { + rfidFlag = labelSettingDataList.getFirst().getRfidFlag(); + } try { // 1. 验证打印请求 if (printRequest.getZplCode() == null || printRequest.getZplCode().trim().isEmpty()) { @@ -181,8 +190,8 @@ public class ReportLabelListServiceImpl extends ServiceImpl 0 ? printRequest.getCopies() : 1; - // 4. 发送ZPL到打印机(RFID模式下始终只处理一张标签) - sendZplToPrinter(printerIP, printRequest.getZplCode(), 1); + // 4. 发送ZPL到打印机 + sendZplToPrinter(printerIP, printRequest.getZplCode(), requestedCopies,rfidFlag); // 5. 记录打印日志 log.info("RFID标签打印任务执行成功,请求参数: {}", printRequest); @@ -196,12 +205,12 @@ public class ReportLabelListServiceImpl extends ServiceImpl 写入EPC -> 打印标签 */ - private RfidProcessResult processRfidLabel(String printerIP, String originalZplCode, int labelIndex) { + private RfidProcessResult processRfidLabel(String printerIP, String originalZplCode, int labelIndex, String rfidFlag) { RfidProcessResult result = new RfidProcessResult(labelIndex); java.net.Socket socket = null; try { - // 检查RFID功能是否启用 - if (true) { - // 如果RFID功能未启用,直接打印普通标签 + if (rfidFlag==null || "N".equals(rfidFlag)) { socket = new java.net.Socket(printerIP, 9100); socket.setSoTimeout(10000); - OutputStream outputStream = socket.getOutputStream(); - printLabel(outputStream, originalZplCode); - - result.markCompleted(true, "RFID功能未启用,已打印普通标签"); - log.info("第{}张标签 - RFID功能未启用,已打印普通标签", labelIndex); + // 清理原始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); return result; } socket = new java.net.Socket(printerIP, 9100); @@ -264,50 +273,122 @@ public class ReportLabelListServiceImpl extends ServiceImpl 0) { int bytesRead = inputStream.read(buffer); if (bytesRead > 0) { String data = new String(buffer, 0, bytesRead, "UTF-8"); response.append(data); - log.info("收到TID数据: {}", data.trim()); + 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(100); + Thread.sleep(200); // 增加等待间隔 } } - String responseStr = response.toString(); - if (responseStr.trim().isEmpty()) { + + String responseStr = response.toString().trim(); + log.info("完整响应数据: {}", responseStr); + + if (responseStr.isEmpty()) { throw new RuntimeException("未收到TID响应数据,请检查RFID标签是否正确放置"); } + // 如果收到的是状态信息而不是TID数据 if (responseStr.length() > 200 || responseStr.contains("RFID READER") || responseStr.contains("FIRMWARE") || responseStr.contains("RESOLUTION")) { throw new RuntimeException("收到打印机状态信息而非TID数据,请检查标签是否为RFID标签"); } - log.info("完整TID响应: {}", responseStr); + return responseStr; } + /** + * 生成有效的EPC数据 + * EPC必须是12个十六进制字符(6字节) + */ + private String generateValidEpc() { + // 生成基于时间戳的EPC,确保唯一性和有效性 + long timestamp = System.currentTimeMillis(); + String epc = String.format("%012X", timestamp & 0xFFFFFFFFFFFFL); + + // 确保EPC长度正确(12个字符) + if (epc.length() > 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; + } + + /** + * 清理ZPL代码,移除可能导致多张打印的指令 + */ + private String cleanZplForSinglePrint(String zplCode) { + if (zplCode == null) { + return ""; + } + + log.info("开始清理ZPL代码,原始内容: {}", zplCode); + + // 移除所有可能导致多张打印的指令 + String cleaned = zplCode + .replaceAll("\\^PQ\\d+", "") // 移除 ^PQ 指令(打印份数) + .replaceAll("\\^PQ\\d+,\\d+", "") // 移除带参数的 ^PQ 指令 + .replaceAll("\\^PQ\\d+,\\d+,\\d+", "") // 移除完整参数的 ^PQ 指令 + .replaceAll("\\^XA", "") // 移除额外的 ^XA 开始符 + .replaceAll("\\^XZ", "") // 移除所有 ^XZ 结束符,我们会在最后添加一个 + .replaceAll("\\n\\s*\\n", "\n") // 清理多余的空行 + .trim(); + + // 确保以 ^XZ 结束 + if (!cleaned.endsWith("^XZ")) { + cleaned += "\n^XZ"; + } + + log.info("ZPL清理完成 - 原始长度: {}, 清理后长度: {}, 清理后内容: {}", + zplCode.length(), cleaned.length(), cleaned); + return cleaned; + } + /** * 清空输入流缓冲区 */ diff --git a/src/main/resources/mapper/base/BaseMapper.xml b/src/main/resources/mapper/base/BaseMapper.xml index bca1014..d1cc246 100644 --- a/src/main/resources/mapper/base/BaseMapper.xml +++ b/src/main/resources/mapper/base/BaseMapper.xml @@ -6,7 +6,7 @@