From 1ffce1f78f41accc8032e3e38dbae7db730cc725 Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Sat, 27 Sep 2025 09:08:44 +0800 Subject: [PATCH] =?UTF-8?q?unitId=E8=A7=84=E5=88=99=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Impl/ReportLabelListServiceImpl.java | 57 +++--------- .../HandlingUnitIdGeneratorService.java | 16 ++++ .../HandlingUnitIdGeneratorServiceImpl.java | 89 +++++++++++++++++++ .../task/IfsInspectionHistoryTask.java | 4 +- .../po/service/impl/PoServiceImpl.java | 20 +++-- src/main/resources/mapper/base/BaseMapper.xml | 3 + 6 files changed, 136 insertions(+), 53 deletions(-) create mode 100644 src/main/java/com/gaotao/modules/handlingunit/service/HandlingUnitIdGeneratorService.java create mode 100644 src/main/java/com/gaotao/modules/handlingunit/service/impl/HandlingUnitIdGeneratorServiceImpl.java 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 1ba812f..61d038e 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 @@ -229,13 +229,12 @@ public class ReportLabelListServiceImpl extends ServiceImpl labelData = i < labelDataList.size() ? labelDataList.get(i) : new HashMap<>(); // 发送ZPL到打印机 - RfidProcessResult printResult = sendZplToPrinterAndGetResult(printerIP, zplCode, requestedCopies, rfidFlag); + RfidProcessResult printResult = sendZplToPrinterAndGetResult(printerIP, zplCode, requestedCopies, rfidFlag,labelData); // 打印成功后保存标签记录 if (printResult.isSuccess()) { - java.util.Map labelData = i < labelDataList.size() ? labelDataList.get(i) : new HashMap<>(); saveWmsLabelRecord(printRequest, labelSettingDataList.getFirst().getLabelType(), printResult, defaultLabelSettingData.getLabelNo(), i + 1, labelData); } } @@ -251,21 +250,22 @@ public class ReportLabelListServiceImpl extends ServiceImpl labelData) { try { log.info("开始处理标签打印: {}, 请求份数: {}, RFID标志: {}", printerIP, copies, rfidFlag); RfidProcessResult result; if ("Y".equals(rfidFlag)) { // RFID模式:单张处理,返回第一个结果 - result = processRfidLabel(printerIP, zplCode, 1, rfidFlag); + result = processRfidLabel(printerIP, zplCode, 1, rfidFlag,labelData); if (!result.isSuccess()) { throw new RuntimeException("RFID标签打印失败: " + result.getErrorMessage()); } log.info("RFID标签打印完成,TID: {}", result.getTid()); } else { // 普通模式:直接处理 - result = processRfidLabel(printerIP, zplCode, copies, rfidFlag); + result = processRfidLabel(printerIP, zplCode, copies, rfidFlag,labelData); if (!result.isSuccess()) { throw new RuntimeException("普通标签打印失败: " + result.getErrorMessage()); } @@ -417,43 +417,11 @@ public class ReportLabelListServiceImpl extends ServiceImpl 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 copiesOrIndex, String rfidFlag) { + private RfidProcessResult processRfidLabel(String printerIP, String originalZplCode, int copiesOrIndex, + String rfidFlag,Map labelData) { RfidProcessResult result = new RfidProcessResult(copiesOrIndex); java.net.Socket socket = null; try { @@ -479,7 +447,7 @@ public class ReportLabelListServiceImpl extends ServiceImpl labelData) throws Exception { log.info("开始读取RFID标签TID..."); // 清空输入流缓冲区,避免之前的数据干扰 clearInputStreamBuffer(inputStream); // 生成有效的EPC数据 - 确保格式正确,避免写入失败 - String epc = "1234567890AB1234567890AB"; // 示例EPC数据,实际应用中应生成或获取有效的EPC + String epc = getStringValue(labelData, "unit_id", ""); + // 补齐到24位,不足的在前面加0 + epc = String.format("%024s", epc); // 处理原始ZPL代码,移除可能的打印份数指令,确保只打印1张 String cleanedZplCode = cleanZplForSinglePrint(originalZplCode.substring(3)); // 组装 ZPL - 优化RFID指令,确保EPC写入成功 diff --git a/src/main/java/com/gaotao/modules/handlingunit/service/HandlingUnitIdGeneratorService.java b/src/main/java/com/gaotao/modules/handlingunit/service/HandlingUnitIdGeneratorService.java new file mode 100644 index 0000000..97787a0 --- /dev/null +++ b/src/main/java/com/gaotao/modules/handlingunit/service/HandlingUnitIdGeneratorService.java @@ -0,0 +1,16 @@ +package com.gaotao.modules.handlingunit.service; + +/** + * 处理单元ID生成服务接口 + * 生成格式:P+site+YYYYMMDD+8位自增流水码 + * 流水码每天根据前缀从1开始计数 + */ +public interface HandlingUnitIdGeneratorService { + + /** + * 生成新的处理单元ID + * @param site 工厂代码 + * @return 生成的处理单元ID,格式:P+site+YYYYMMDD+8位自增流水码 + */ + String generateUnitId(String site); +} diff --git a/src/main/java/com/gaotao/modules/handlingunit/service/impl/HandlingUnitIdGeneratorServiceImpl.java b/src/main/java/com/gaotao/modules/handlingunit/service/impl/HandlingUnitIdGeneratorServiceImpl.java new file mode 100644 index 0000000..7a14c62 --- /dev/null +++ b/src/main/java/com/gaotao/modules/handlingunit/service/impl/HandlingUnitIdGeneratorServiceImpl.java @@ -0,0 +1,89 @@ +package com.gaotao.modules.handlingunit.service.impl; + +import com.gaotao.modules.handlingunit.service.HandlingUnitIdGeneratorService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +/** + * 处理单元ID生成服务实现类 + * 生成格式:P+site+YYYYMMDD+8位自增流水码 + * 流水码每天根据前缀从1开始计数 + */ +@Slf4j +@Service +public class HandlingUnitIdGeneratorServiceImpl implements HandlingUnitIdGeneratorService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + /** + * 生成新的处理单元ID + * @param site 工厂代码 + * @return 生成的处理单元ID,格式:A+site+YYYYMMDD+8位自增流水码 + */ + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW) + public String generateUnitId(String site) { + // 生成当前日期字符串 YYYYMMDD + String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); + + // 生成前缀:A+site+YYYYMMDD + String prefix = "A" + site + dateStr; + + // 获取下一个流水号(8位,从1开始每天重置) + int sequenceNo = getNextSequenceNumber(prefix); + + // 格式化为8位流水号(补齐前导零) + String formattedSequence = String.format("%08d", sequenceNo); + + // 组合完整的处理单元ID + String unitId = prefix + formattedSequence; + + log.debug("生成处理单元ID: site={}, prefix={}, sequence={}, unitId={}", + site, prefix, sequenceNo, unitId); + + return unitId; + } + + /** + * 获取下一个流水号 + * 使用数据库保证并发安全,每天重置计数 + * @param prefix 日期前缀 (P+site+YYYYMMDD) + * @return 下一个流水号 + */ + private int getNextSequenceNumber(String prefix) { + try { + // 检查是否已存在当天的记录 + String checkSql = "SELECT COUNT(*) FROM handling_unit_sequence WHERE prefix = ?"; + Integer count = jdbcTemplate.queryForObject(checkSql, Integer.class, prefix); + + if (count == null || count == 0) { + // 不存在记录,插入新记录,流水号从1开始 + String insertSql = "INSERT INTO handling_unit_sequence (prefix, next_sequence, created_date) VALUES (?, 1, GETDATE())"; + jdbcTemplate.update(insertSql, prefix); + return 1; + } else { + // 存在记录,更新并返回下一个流水号 + String updateSql = "UPDATE handling_unit_sequence SET next_sequence = next_sequence + 1, modified_date = GETDATE() " + + "WHERE prefix = ?"; + jdbcTemplate.update(updateSql, prefix); + + // 获取更新后的流水号 + String selectSql = "SELECT next_sequence FROM handling_unit_sequence WHERE prefix = ?"; + Integer nextSequence = jdbcTemplate.queryForObject(selectSql, Integer.class, prefix); + return nextSequence != null ? nextSequence : 1; + } + } catch (Exception e) { + log.error("获取流水号失败,prefix={}, error={}", prefix, e.getMessage(), e); + // 发生错误时,尝试使用系统时间作为备用方案 + return (int) (System.currentTimeMillis() % 100000000); // 取后8位作为备用 + } + } +} diff --git a/src/main/java/com/gaotao/modules/inspection/task/IfsInspectionHistoryTask.java b/src/main/java/com/gaotao/modules/inspection/task/IfsInspectionHistoryTask.java index 6869a24..80a305d 100644 --- a/src/main/java/com/gaotao/modules/inspection/task/IfsInspectionHistoryTask.java +++ b/src/main/java/com/gaotao/modules/inspection/task/IfsInspectionHistoryTask.java @@ -26,11 +26,11 @@ public class IfsInspectionHistoryTask { */ private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); - @Scheduled(cron = "0 02 16 * * ?") +/* @Scheduled(cron = "0 02 16 * * ?") public void syncIfsInspectionHistory() { log.info("=== 开始执行IFS检验历史同步定时任务 ==="); doSync(1); - } + }*/ private void doSync(int attempt) { try { diff --git a/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java b/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java index cd851ec..c9d23fd 100644 --- a/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java +++ b/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java @@ -17,6 +17,7 @@ import com.gaotao.modules.handlingunit.entity.HandlingUnit; import com.gaotao.modules.handlingunit.entity.HandlingUnitDetail; import com.gaotao.modules.handlingunit.service.HandlingUnitDetailService; import com.gaotao.modules.handlingunit.service.HandlingUnitService; +import com.gaotao.modules.handlingunit.service.HandlingUnitIdGeneratorService; import com.gaotao.modules.po.dao.PoMapper; import com.gaotao.modules.po.entity.PoReceipt; import com.gaotao.modules.po.entity.PoReceiptDetail; @@ -66,6 +67,8 @@ public class PoServiceImpl extends ServiceImpl implemen private AgvClientUtil agvClientUtil; @Autowired private AccessSiteMapper accessSiteMapper; + @Autowired + private HandlingUnitIdGeneratorService handlingUnitIdGeneratorService; @Value("${custom.ifs-url}") private String ifsUrl; @@ -200,10 +203,10 @@ public class PoServiceImpl extends ServiceImpl implemen private void handlingUnitPart(TransDetailDto inData, int i, TransHeader transHeader, SysUserEntity currentUser, Integer shelfLife) { TransDetailSubDto huInfo = inData.getHandlingUnitList().get(i); - String subType = "HU"; for (int j = 0; j < huInfo.getPerQty(); j++) { // 获取流水号 - TransNoControl huTrans = transNoService.getTransNo(inData.getSite(), subType, 10); + // 生成处理单元ID - 使用新的格式:A+site+YYYYMMDD+8位自增流水码 + String unitId = handlingUnitIdGeneratorService.generateUnitId(inData.getSite()); // 创建TransDetailSub记录(保持原有逻辑) TransDetailSub transDetailSub = new TransDetailSub(); transDetailSub.setSite(inData.getSite()); @@ -212,17 +215,16 @@ public class PoServiceImpl extends ServiceImpl implemen transDetailSub.setSeqNo(inData.getItemNo()); transDetailSub.setSubQty(huInfo.getPackageQty()); transDetailSub.setOrderRef1(inData.getPoNo()); - transDetailSub.setOrderRef2(huTrans.getNewTransNo()); + transDetailSub.setOrderRef2(unitId); transDetailSub.setLocationId(inData.getLocationNo()); transDetailSub.setBatchNo(inData.getBatchNo()); transDetailSub.setPartNo(inData.getPartNo()); - transDetailSub.setSubNo(huTrans.getNewTransNo()); + transDetailSub.setSubNo(unitId); transDetailSub.setOrderRef3(inData.getWdr()); + transDetailSub.setDirection("+"); subService.save(transDetailSub); // 创建HandlingUnit主记录 HandlingUnit handlingUnit = new HandlingUnit(); - // 生成处理单元ID - String unitId = huTrans.getNewTransNo(); handlingUnit.setUnitId(unitId); handlingUnit.setSite(inData.getSite()); handlingUnit.setUnitType("ROLL"); @@ -303,6 +305,7 @@ public class PoServiceImpl extends ServiceImpl implemen String pmResponse = HttpUtils.doGetWithBody(ifsUrl+"POLineSupplierMaterial",pmJsonBody,null); List> poLineData = objectMapper.readValue(pmResponse, new TypeReference<>() {}); if (poLineData.isEmpty()) { + log.info("普通ordinary PO,PO号: {}", inData.getOrderNo()); return null; } else { // 获取对应行号和releaseNo的数据 @@ -310,6 +313,7 @@ public class PoServiceImpl extends ServiceImpl implemen String lineNo = line.get("lineNo") != null ? line.get("lineNo").toString() : ""; String releaseNo = line.get("releaseNo") != null ? line.get("releaseNo").toString() : ""; if (inData.getLineNo().equals(lineNo) && (inData.getReleaseNo() != null && inData.getReleaseNo().equals(releaseNo))) { + log.info("委外ordinary PO,PO号: {}", inData.getOrderNo()); return line; } } @@ -615,7 +619,7 @@ public class PoServiceImpl extends ServiceImpl implemen if (inData.getPurchaseUOM() != null && !"KG".equalsIgnoreCase(inData.getPurchaseUOM())) { poReceiptDetail.setWidth(BigDecimal.valueOf(1000)); } else { - poReceiptDetail.setWidth(BigDecimal.valueOf(0)); + poReceiptDetail.setWidth(null); } } // length就是数量除以width再乘以1000 @@ -625,7 +629,7 @@ public class PoServiceImpl extends ServiceImpl implemen .multiply(BigDecimal.valueOf(1000)); poReceiptDetail.setLength(length); } else { - poReceiptDetail.setLength(BigDecimal.valueOf(0)); + poReceiptDetail.setLength(null); } // 备注信息 String remarkText = "PO接收自动创建"; diff --git a/src/main/resources/mapper/base/BaseMapper.xml b/src/main/resources/mapper/base/BaseMapper.xml index 44a486f..b7f5d70 100644 --- a/src/main/resources/mapper/base/BaseMapper.xml +++ b/src/main/resources/mapper/base/BaseMapper.xml @@ -503,6 +503,9 @@ AND location_id = #{params.locationId} + + AND wdr = #{params.wdr} +