diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java index 3e1dba37..165bd75b 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java @@ -211,12 +211,33 @@ public class StructuralPackageOrderController extends BaseController { : supplierCode; } + // 构建托盘号前缀:S+供应商代码后4位+年后2位+月2位+日2位 + String trayPrefix = "S" + supplierSuffix + datePart; + + // 查询数据库中该前缀的最新托盘号,获取当前最大流水号 + int startSeq = 1; + String lastTrayNo = structuralPackageOrderTrayService.getLast(trayPrefix); + if (StrUtil.isNotBlank(lastTrayNo)) { + // 从托盘号中提取流水号(格式:Sxxxxxx-序号) + int lastDashIndex = lastTrayNo.lastIndexOf('-'); + if (lastDashIndex > 0 && lastDashIndex < lastTrayNo.length() - 1) { + try { + String seqStr = lastTrayNo.substring(lastDashIndex + 1); + startSeq = Integer.parseInt(seqStr) + 1; + } catch (NumberFormatException e) { + // 如果解析失败,从1开始 + startSeq = 1; + } + } + } + List trays = new ArrayList<>(); - // 根据托盘数量生成托盘 - for (int i = 1; i <= trayNum; i++) { + // 根据托盘数量生成托盘,使用数据库最新流水号+1开始 + for (int i = 0; i < trayNum; i++) { + int currentSeq = startSeq + i; // 生成托盘号:S+供应商代码后4位+年后2位+月2位+日2位-序号 - String generatedTrayNo = "S" + supplierSuffix + datePart + "-" + i; + String generatedTrayNo = trayPrefix + "-" + currentSeq; TrayVO tray = new TrayVO() .setNo(generatedTrayNo) @@ -684,8 +705,10 @@ public class StructuralPackageOrderController extends BaseController { List trays = structuralPackageOrderTrayService.getList(id); VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(trays)).throwMessage("数据不存在"); - // 这里需要为订单下的所有托盘生成标签 - // 由于原方法只处理单个托盘,现在需要遍历所有托盘 + // 收集所有托盘的HTML内容 + List htmlList = new ArrayList<>(); + + // 遍历所有托盘,生成每个托盘的HTML内容 for (WmsStructuralPackageOrderTray tray : trays) { DeliverStructuralPackageOrderExtendVO trayVO = structuralPackageOrderTrayService.getInfo(tray.getId()); VUtil.trueThrowBusinessError(Objects.isNull(trayVO)).throwMessage("数据不存在"); @@ -693,10 +716,11 @@ public class StructuralPackageOrderController extends BaseController { Map variables = new HashMap<>(); variables.put("info", trayVO); String html = ThymeleafUtil.generator("/template/qrcode/", "tray", ".html", variables); - URL baseUrl = new ClassPathResource("template/qrcode/").getURL(); - // 注意:这里会多次调用response,实际使用时可能需要合并PDF或返回ZIP - PdfGeneratorUtil.generatePdf("托盘标签" + trayVO.getTrayNo(), html, baseUrl.toString(), response); + htmlList.add(html); } + + // 将所有托盘标签合并成一个PDF文件,每页一个标签 + PdfGeneratorUtil.generatePdf("托盘标签", htmlList, response); } /** @@ -726,7 +750,7 @@ public class StructuralPackageOrderController extends BaseController { */ @GetMapping("exportQiTaoPdf") public void exportQiTaoPdf(HttpServletResponse response, @Valid @RequestParam @NotNull Long id) throws Exception { - // 根据订单ID获取所有托盘,为每个托盘生成齐套标签 + // 根据订单ID获取所有托盘 List trays = structuralPackageOrderTrayService.getList(id); VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(trays)).throwMessage("数据不存在"); @@ -737,18 +761,17 @@ public class StructuralPackageOrderController extends BaseController { List codes = qrCodeMasterService.getByExtendId(id); VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(codes)).throwMessage("未找到二维码信息"); - // 为每个托盘生成齐套标签 - for (WmsStructuralPackageOrderTray tray : trays) { - DeliverStructuralPackageOrderExtendVO trayVO = structuralPackageOrderTrayService.getInfo(tray.getId()); - VUtil.trueThrowBusinessError(Objects.isNull(trayVO)).throwMessage("数据不存在"); - String temp = trayVO.getExternalOrderNo() + "$" + trayVO.getRowNo() + "$" + trayVO.getPackageNo(); - trayVO.setQrCode(QRCodeUtil.generateQRCodeBase64(codes.get(0).getBarcodeCode() + "$" + temp, 100, 100)); - Map variables = new HashMap<>(); - variables.put("info", trayVO); - String html = ThymeleafUtil.generator("/template/qrcode/", "qitao", ".html", variables); - URL baseUrl = new ClassPathResource("template/qrcode/").getURL(); - PdfGeneratorUtil.generatePdf("齐套标签" + trayVO.getTrayNo(), html, baseUrl.toString(), response); - } + // 注意:齐套标签内容基于订单信息(外部订单号、行号、包号),同一订单下所有托盘的标签内容相同 + // 因此只需取第一个托盘生成一个标签即可 + DeliverStructuralPackageOrderExtendVO trayVO = structuralPackageOrderTrayService.getInfo(trays.get(0).getId()); + VUtil.trueThrowBusinessError(Objects.isNull(trayVO)).throwMessage("数据不存在"); + String temp = trayVO.getExternalOrderNo() + "$" + trayVO.getRowNo() + "$" + trayVO.getPackageNo(); + trayVO.setQrCode(QRCodeUtil.generateQRCodeBase64(codes.get(0).getBarcodeCode() + "$" + temp, 100, 100)); + Map variables = new HashMap<>(); + variables.put("info", trayVO); + String html = ThymeleafUtil.generator("/template/qrcode/", "qitao", ".html", variables); + + PdfGeneratorUtil.generatePdf("齐套标签", html, response); } /** @@ -1489,53 +1512,90 @@ public class StructuralPackageOrderController extends BaseController { BigDecimal trayNumDecimal = request.getTrayNum(); VUtil.trueThrowBusinessError(trayNumDecimal == null || trayNumDecimal.compareTo(BigDecimal.ZERO) <= 0) .throwMessage("托盘数量必须大于0"); - Integer trayNum = trayNumDecimal.intValue(); + Integer newTrayNum = trayNumDecimal.intValue(); - // 4. 获取钢构包信息 + // 4. 获取数据库中当前的托盘列表 + List existingTrays = structuralPackageOrderTrayService.getList(order.getId()); + int existingTrayCount = existingTrays.size(); + + // 5. 校验新传入的托盘数量必须比数据库中的大 + VUtil.trueThrowBusinessError(newTrayNum <= existingTrayCount) + .throwMessage("新托盘数量必须大于当前托盘数量(" + existingTrayCount + ")"); + + // 6. 计算需要新增的托盘数量 + int addTrayCount = newTrayNum - existingTrayCount; + + // 7. 获取钢构包信息 PackageVO packageVO = structuralPackageService.getInfo(order.getPackageId()); VUtil.trueThrowBusinessError(Objects.isNull(packageVO)).throwMessage("钢构包不存在"); - // 5. 获取供应商代码 + // 8. 获取供应商代码 UserSupplier supplier = userSupplierService.getById(order.getSupplierId()); VUtil.trueThrowBusinessError(Objects.isNull(supplier)).throwMessage("供应商不存在"); String supplierCode = supplier.getSupplierCode(); - // 6. 重新生成托盘信息(使用前端传入的托盘数量) - GenerateTrayVO trayVO = generateTrayWithTrayNum(packageVO, supplierCode, - BigDecimal.valueOf(order.getNum()), order.getPlanNum(), trayNum); + // 9. 生成日期部分:年后2位+月2位+日2位 + LocalDate now = LocalDate.now(); + String datePart = String.format("%02d%02d%02d", + now.getYear() % 100, + now.getMonthValue(), + now.getDayOfMonth()); - // 7. 删除旧的托盘和托盘项 - structuralPackageOrderTrayService.deleteByOrderId(order.getId()); - structuralPackageOrderTrayItemService.deleteByOrderId(order.getId()); + // 10. 供应商代码后4位 + String supplierSuffix = ""; + if (StrUtil.isNotBlank(supplierCode)) { + supplierSuffix = supplierCode.length() >= 4 + ? supplierCode.substring(supplierCode.length() - 4) + : supplierCode; + } - // 8. 保存新的托盘信息 - List trays = trayVO.getTrays().stream().map(it -> new WmsStructuralPackageOrderTray() - .setId(IdUtil.getSnowflakeNextId()) - .setOrderId(order.getId()) - .setNo(it.getNo()) - .setWeight(BigDecimal.ZERO) - .setNum(BigDecimal.ZERO) - .setStation(it.getStation()) - .setTray(it.getTray())).toList(); + // 11. 构建托盘号前缀:S+供应商代码后4位+年后2位+月2位+日2位 + String trayPrefix = "S" + supplierSuffix + datePart; - List items = new ArrayList<>(); - trays.forEach(tray -> { - List itemVOS = trayVO.getItems().stream() - .filter(it -> StrUtil.equals(it.getNo(), tray.getNo())) - .toList(); - items.addAll(itemVOS.stream().map(it -> { - WmsStructuralPackageOrderTrayItem item = Convert.convert(WmsStructuralPackageOrderTrayItem.class, it); - item.setOrderId(order.getId()); - item.setTrayId(tray.getId()); - tray.setNum(tray.getNum().add(item.getShipmentNum())); - tray.setWeight(tray.getWeight().add(NumberUtil.mul(it.getWeight(), item.getShipmentNum()))); - return item; - }).toList() - ); - }); + // 12. 查询数据库中该前缀的最新托盘号,获取当前最大流水号 + int startSeq = 1; + String lastTrayNo = structuralPackageOrderTrayService.getLast(trayPrefix); + if (StrUtil.isNotBlank(lastTrayNo)) { + // 从托盘号中提取流水号(格式:Sxxxxxx-序号) + int lastDashIndex = lastTrayNo.lastIndexOf('-'); + if (lastDashIndex > 0 && lastDashIndex < lastTrayNo.length() - 1) { + try { + String seqStr = lastTrayNo.substring(lastDashIndex + 1); + startSeq = Integer.parseInt(seqStr) + 1; + } catch (NumberFormatException e) { + // 如果解析失败,从1开始 + startSeq = 1; + } + } + } - structuralPackageOrderTrayService.saveBatch(trays); - structuralPackageOrderTrayItemService.saveBatch(items); + // 13. 保留原有托盘,只生成新增的托盘 + List traysToKeep = new ArrayList<>(existingTrays); + List traysToAdd = new ArrayList<>(); + + // 生成新增的托盘 + for (int i = 0; i < addTrayCount; i++) { + int currentSeq = startSeq + i; + String generatedTrayNo = trayPrefix + "-" + currentSeq; + + WmsStructuralPackageOrderTray newTray = new WmsStructuralPackageOrderTray() + .setId(IdUtil.getSnowflakeNextId()) + .setOrderId(order.getId()) + .setNo(generatedTrayNo) + .setWeight(BigDecimal.ZERO) + .setNum(BigDecimal.ZERO) + .setStation("") + .setTray(""); + traysToAdd.add(newTray); + } + + // 14. 合并所有托盘(原有 + 新增) + List allTrays = new ArrayList<>(); + allTrays.addAll(traysToKeep); + allTrays.addAll(traysToAdd); + + // 15. 保存所有托盘 + structuralPackageOrderTrayService.saveOrUpdateBatch(allTrays); return ApiResult.success(); }