From ce415b718aa4a92183bf8e4ad88ff094b0d8a3e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Tue, 16 Dec 2025 18:01:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(printing):=20=E4=BC=98=E5=8C=96=E6=9D=A1?= =?UTF-8?q?=E7=A0=81=E6=A0=87=E7=AD=BE=E6=A8=A1=E6=9D=BF=E5=92=8C=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E7=94=9F=E6=88=90=E5=B0=BA=E5=AF=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将普通物料标签模板更新为新样式 dp-1-label.html - 调整条码打印 HTML 渲染宽高至 480px x 320px - 将生成条码图片的 DPI 从 60 提升到 480,提高打印清晰度 - 修改储位二维码模板为储位二维码-label.html - 储位二维码图片 DPI 从 40 增加至 400,提升二维码精度 - 删除旧版普通物料标签模板中页面大小限制样式 --- .../controller/BarcodePrintingController.java | 4 +- .../controller/InProduceOrderController.java | 20 ++-- .../InProduceOrderSurplusController.java | 4 +- .../controller/NormalOrderController.java | 4 +- .../StructuralPackageOrderController.java | 20 ++-- .../admin/service/BinControllerService.java | 4 +- .../nflg/wms/admin/service/SapService.java | 14 +-- .../nflg/wms/admin/util/HtmlToImageUtil.java | 4 +- .../resources/template/qrcode/dp-1-label.html | 76 +++++++++++++ .../main/resources/template/qrcode/dp-1.html | 4 - .../template/qrcode/qitao-label.html | 95 +++++++++++++++++ .../main/resources/template/qrcode/qitao.html | 5 - .../template/qrcode/spitem-label.html | 100 ++++++++++++++++++ .../resources/template/qrcode/spitem.html | 5 - .../resources/template/qrcode/tray-label.html | 83 +++++++++++++++ .../main/resources/template/qrcode/tray.html | 5 - .../template/储位二维码-label.html | 44 ++++++++ .../wms/common/pojo/dto/ZWM00MB007DTO.java | 5 - .../qo/InProduceOrderGenerateMaterialsQO.java | 7 -- readme.md | 10 ++ 20 files changed, 440 insertions(+), 73 deletions(-) create mode 100644 nflg-wms-admin/src/main/resources/template/qrcode/dp-1-label.html create mode 100644 nflg-wms-admin/src/main/resources/template/qrcode/qitao-label.html create mode 100644 nflg-wms-admin/src/main/resources/template/qrcode/spitem-label.html create mode 100644 nflg-wms-admin/src/main/resources/template/qrcode/tray-label.html create mode 100644 nflg-wms-admin/src/main/resources/template/储位二维码-label.html create mode 100644 readme.md diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/BarcodePrintingController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/BarcodePrintingController.java index d713d003..6beeceb6 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/BarcodePrintingController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/BarcodePrintingController.java @@ -330,10 +330,10 @@ public class BarcodePrintingController extends BaseController { for (DeliverNormalOrderItemDTO it : datas) { Map variables = new HashMap<>(); variables.put("list", datas); - String html = ThymeleafUtil.generator("/template/qrcode/", "dp-1", ".html", variables); + String html = ThymeleafUtil.generator("/template/qrcode/", "dp-1-label", ".html", variables); ZipEntry entry = new ZipEntry(it.getPrintNo() + ".png"); zos.putNextEntry(entry); - byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 60); + byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 480); zos.write(imageBytes, 0, imageBytes.length); zos.closeEntry(); } diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java index 8f830645..bf220c2e 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java @@ -19,6 +19,7 @@ import com.nflg.wms.common.pojo.dto.*; import com.nflg.wms.common.pojo.qo.*; import com.nflg.wms.common.pojo.vo.InProduceOrderItemVO; import com.nflg.wms.common.pojo.vo.InProduceOrderMaterialVO; +import com.nflg.wms.common.util.DateTimeUtil; import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.VUtil; import com.nflg.wms.repository.entity.*; @@ -32,6 +33,7 @@ import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.ClassPathResource; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -43,8 +45,10 @@ import java.io.ByteArrayOutputStream; import java.math.BigDecimal; import java.net.URL; import java.time.Instant; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -96,6 +100,9 @@ public class InProduceOrderController extends BaseController { @Resource private BasdeSerialNumberControllerService serialNumberControllerService; + @Resource + private StringRedisTemplate stringRedisTemplate; + /** * 从SAP查询生产订单信息 * @param no 生产订单号 @@ -122,6 +129,9 @@ public class InProduceOrderController extends BaseController { .setCreateBy(UserUtil.getUserName()) .setCreateTime(LocalDateTime.now()); produceOrderService.save(order); + String date = DateTimeUtil.format(LocalDate.now(), "yyMMdd"); + stringRedisTemplate.opsForValue().setIfAbsent("index:batchNo:" + date, "0", 24 - LocalDateTime.now().getHour(), TimeUnit.HOURS); + String index = StrUtil.padPre(String.valueOf(stringRedisTemplate.opsForValue().increment("index:batchNo:" + date)), 4, "0"); WmsInProduceOrderItem parent = new WmsInProduceOrderItem() .setOrderId(order.getId()) .setParentId(0L) @@ -132,7 +142,7 @@ public class InProduceOrderController extends BaseController { .setFactoryNo(request.getPwerk()) .setWarehouseNo(request.getLgort()) .setOrderNum(request.getPsmng()) - .setBatchNo(request.getBatchNo()) + .setBatchNo(date + index) .setSernr(request.getSernr()); produceOrderItemService.save(parent); if (request.getList()) { @@ -286,14 +296,10 @@ public class InProduceOrderController extends BaseController { for (DeliverNormalOrderItemDTO it : datas) { Map variables = new HashMap<>(); variables.put("list", datas); - String html = ThymeleafUtil.generator("/template/qrcode/", "dp-1", ".html", variables); -// HtmlToImageUtil.convertToPng(html, 800); -// response.setContentType("image/png"); -// response.getOutputStream().write(HtmlToImageUtil.convertToPng(html, 60)); -// break; + String html = ThymeleafUtil.generator("/template/qrcode/", "dp-1-label", ".html", variables); ZipEntry entry = new ZipEntry(it.getPrintNo() + ".png"); zos.putNextEntry(entry); - byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 60); + byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 480); zos.write(imageBytes, 0, imageBytes.length); zos.closeEntry(); } diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderSurplusController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderSurplusController.java index 632c8a42..f6e5c245 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderSurplusController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderSurplusController.java @@ -412,14 +412,14 @@ public class InProduceOrderSurplusController extends BaseController { for (DeliverNormalOrderItemDTO it : datas) { Map variables = new HashMap<>(); variables.put("list", datas); - String html = ThymeleafUtil.generator("/template/qrcode/", "dp-1", ".html", variables); + String html = ThymeleafUtil.generator("/template/qrcode/", "dp-1-label", ".html", variables); // HtmlToImageUtil.convertToPng(html, 800); // response.setContentType("image/png"); // response.getOutputStream().write(HtmlToImageUtil.convertToPng(html, 60)); // break; ZipEntry entry = new ZipEntry(it.getPrintNo() + ".png"); zos.putNextEntry(entry); - byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 60); + byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 480); zos.write(imageBytes, 0, imageBytes.length); zos.closeEntry(); } diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalOrderController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalOrderController.java index 8e88832a..41f1be56 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalOrderController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/NormalOrderController.java @@ -339,10 +339,10 @@ public class NormalOrderController extends BaseController { for (DeliverNormalOrderItemDTO it : list) { Map variables = new HashMap<>(); variables.put("list", List.of(it)); - String html = ThymeleafUtil.generator("/template/qrcode/", "dp-1", ".html", variables); + String html = ThymeleafUtil.generator("/template/qrcode/", "dp-1-label", ".html", variables); ZipEntry entry = new ZipEntry(it.getPrintNo() + ".png"); zos.putNextEntry(entry); - byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 60); + byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 480); zos.write(imageBytes, 0, imageBytes.length); zos.closeEntry(); } 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 b682f9f7..5f53c84c 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 @@ -161,7 +161,7 @@ public class StructuralPackageOrderController extends BaseController { .toList(); if (Objects.equals(request.getType(), 1)) { datas.forEach(it -> { - it.setBatchNo(NoUtil.getBatchNo(request.getSupplierNo())); + it.setBatchNo(NoUtil.getBatchNo(it.getSupplierNo())); }); } return ApiResult.success(datas); @@ -512,14 +512,10 @@ public class StructuralPackageOrderController extends BaseController { variables.put("list", datas); variables.put("info", trayVO); variables.put("index", index); - String html = ThymeleafUtil.generator("/template/qrcode/", "spitem", ".html", variables); -// HtmlToImageUtil.convertToPng(html, 800); -// response.setContentType("image/png"); -// response.getOutputStream().write(HtmlToImageUtil.convertToPng(html, 60)); -// break; + String html = ThymeleafUtil.generator("/template/qrcode/", "spitem-label", ".html", variables); ZipEntry entry = new ZipEntry(it.getId() + ".png"); zos.putNextEntry(entry); - byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 60); + byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 600); zos.write(imageBytes, 0, imageBytes.length); zos.closeEntry(); } @@ -555,11 +551,11 @@ public class StructuralPackageOrderController extends BaseController { public ResponseEntity exportTrayImage(@Valid @RequestParam @NotNull Long id) throws Exception { DeliverStructuralPackageOrderExtendVO trayVO = deliverStructuralPackageOrderTrayService.getInfo(id); VUtil.trueThrowBusinessError(Objects.isNull(trayVO)).throwMessage("数据不存在"); - trayVO.setQrCode(QRCodeUtil.generateQRCodeBase64(trayVO.getTrayNo(), 100, 100)); + trayVO.setQrCode(QRCodeUtil.generateQRCodeBase64(trayVO.getTrayNo(), 200, 200)); Map variables = new HashMap<>(); variables.put("info", trayVO); - String html = ThymeleafUtil.generator("/template/qrcode/", "tray", ".html", variables); - byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 60); + String html = ThymeleafUtil.generator("/template/qrcode/", "tray-label", ".html", variables); + byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 600); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.IMAGE_PNG); headers.setContentLength(imageBytes.length); @@ -597,8 +593,8 @@ public class StructuralPackageOrderController extends BaseController { trayVO.setQrCode(QRCodeUtil.generateQRCodeBase64(uniqueCode + "$" + temp, 100, 100)); Map variables = new HashMap<>(); variables.put("info", trayVO); - String html = ThymeleafUtil.generator("/template/qrcode/", "qitao", ".html", variables); - byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 60); + String html = ThymeleafUtil.generator("/template/qrcode/", "qitao-label", ".html", variables); + byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 600); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.IMAGE_PNG); headers.setContentLength(imageBytes.length); diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/BinControllerService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/BinControllerService.java index 0d061a6b..2e40ed71 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/BinControllerService.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/BinControllerService.java @@ -236,10 +236,10 @@ public class BinControllerService { for (QRCodeDTO it : datas) { Map variables = new HashMap<>(); variables.put("datas", List.of(it)); - String html = ThymeleafUtil.generator("/template/", "储位二维码", ".html", variables); + String html = ThymeleafUtil.generator("/template/", "储位二维码-label", ".html", variables); ZipEntry entry = new ZipEntry(it.getNo() + ".png"); zos.putNextEntry(entry); - byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 40); + byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 400); zos.write(imageBytes, 0, imageBytes.length); zos.closeEntry(); } diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/SapService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/SapService.java index 1b60fe37..7bdf18b5 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/SapService.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/SapService.java @@ -21,14 +21,10 @@ import com.nflg.wms.common.util.VUtil; import com.sap.conn.jco.*; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import java.math.BigDecimal; -import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.*; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Slf4j @@ -41,9 +37,6 @@ public class SapService { @Resource private JCoRepository repository; - @Resource - private StringRedisTemplate stringRedisTemplate; - /** * 生产订单副产品(拆解)入库过账 */ @@ -164,13 +157,8 @@ public class SapService { VUtil.trueThrowBusinessError(!StrUtil.equals(eReturn.getString("TYPE"), "S")) .throwMessage("SAP:" + eReturn.getString("MESSAGE")); return null; - } else { - String date = DateTimeUtil.format(LocalDate.now(), "yyMMdd"); - stringRedisTemplate.opsForValue().setIfAbsent("index:batchNo:" + date, "0", 24 - LocalDateTime.now().getHour(), TimeUnit.HOURS); - String index = StrUtil.padPre(String.valueOf(stringRedisTemplate.opsForValue().increment("index:batchNo:" + date)), 4, "0"); - dto.setBatchNo(date + index); - return dto; } + return dto; } /** diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/util/HtmlToImageUtil.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/util/HtmlToImageUtil.java index 0d901992..b728557e 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/util/HtmlToImageUtil.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/util/HtmlToImageUtil.java @@ -17,7 +17,7 @@ public class HtmlToImageUtil { /** * 将HTML内容转换为PNG图片 * @param htmlContent HTML内容 - * @param width 图片宽度,单位mm + * @param width 图片宽度 * @return PNG图片字节数组 * @throws Exception 转换异常 */ @@ -36,7 +36,7 @@ public class HtmlToImageUtil { command.add("wkhtmltoimage"); // 可选参数:设置宽度 (例如 1200px) command.add("--width"); - command.add(String.valueOf((int) (width * 3.78))); + command.add(String.valueOf(width)); // 可选参数:指定图片类型 (例如 PNG) command.add("--format"); command.add("png"); diff --git a/nflg-wms-admin/src/main/resources/template/qrcode/dp-1-label.html b/nflg-wms-admin/src/main/resources/template/qrcode/dp-1-label.html new file mode 100644 index 00000000..49e2a86b --- /dev/null +++ b/nflg-wms-admin/src/main/resources/template/qrcode/dp-1-label.html @@ -0,0 +1,76 @@ + + + + + 普通物料标签 + + + + + + + + + +
+ +
20250227100950-0
+
+
logo +
+
SAP编码: 88888888888
+
名称: 测试测试测试测试测试测试测试测试 +
+
数量: 25.000
+
批次号: 20251024006
+
+ + \ No newline at end of file diff --git a/nflg-wms-admin/src/main/resources/template/qrcode/dp-1.html b/nflg-wms-admin/src/main/resources/template/qrcode/dp-1.html index d9570cd8..50657670 100644 --- a/nflg-wms-admin/src/main/resources/template/qrcode/dp-1.html +++ b/nflg-wms-admin/src/main/resources/template/qrcode/dp-1.html @@ -5,10 +5,6 @@ 普通物料标签 + + + + + + + + + + + + + + + + + + + + + + + +
+ 左踏板连接架左踏板连接架左踏板连接架左踏板连接架左踏板连接架左踏板连接架 +
+ + + 采购单号 + + S2507090053 +
+ 行号 + + 00100 +
+ SAP编码 + + 2100080450 +
+ 供应商 + + 晋江市阳田金属制品有限公司品有限公司品有限公司 +
+ + \ No newline at end of file diff --git a/nflg-wms-admin/src/main/resources/template/qrcode/qitao.html b/nflg-wms-admin/src/main/resources/template/qrcode/qitao.html index 594f2af4..b6040b54 100644 --- a/nflg-wms-admin/src/main/resources/template/qrcode/qitao.html +++ b/nflg-wms-admin/src/main/resources/template/qrcode/qitao.html @@ -5,11 +5,6 @@ 齐套标签 + + +
+
1
+ + + + + + + + + + + + + + + + + + +
+
+ 833-33-07-NF左踏板连接架(00001016NF左踏板连接架NF左踏板连接架 +
+
+ + 833-33-07-NF
SAP编码2100080450
+ +
+ 1244565616465_1 +
+
+ + \ No newline at end of file diff --git a/nflg-wms-admin/src/main/resources/template/qrcode/spitem.html b/nflg-wms-admin/src/main/resources/template/qrcode/spitem.html index 0d44230d..2e41f3a2 100644 --- a/nflg-wms-admin/src/main/resources/template/qrcode/spitem.html +++ b/nflg-wms-admin/src/main/resources/template/qrcode/spitem.html @@ -4,11 +4,6 @@ 钢构件物料标签 + + + + + + + + + + + + + + + + + + + +
+ 左踏板连接架左踏板连接架左踏板连接架左踏板连接架左踏板连接架左 +
+ + + 托盘号 + + S2507090053 +
+ SAP编码 + + 2100080450 +
+ 供应商 + + 晋江市阳田金属制品有限公司 +
+ + \ No newline at end of file diff --git a/nflg-wms-admin/src/main/resources/template/qrcode/tray.html b/nflg-wms-admin/src/main/resources/template/qrcode/tray.html index 640b19ac..0e357ca0 100644 --- a/nflg-wms-admin/src/main/resources/template/qrcode/tray.html +++ b/nflg-wms-admin/src/main/resources/template/qrcode/tray.html @@ -5,11 +5,6 @@ 托盘标签 + + +
+
+
+ +
+
ICO2156115651
+
+
+ + \ No newline at end of file diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/ZWM00MB007DTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/ZWM00MB007DTO.java index 7d209fc5..06a4ea43 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/ZWM00MB007DTO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/ZWM00MB007DTO.java @@ -72,9 +72,4 @@ public class ZWM00MB007DTO { * 序列号 */ private String sernr; - - /** - * 批次号 - */ - private String batchNo; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/InProduceOrderGenerateMaterialsQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/InProduceOrderGenerateMaterialsQO.java index ac828c1b..e2124f88 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/InProduceOrderGenerateMaterialsQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/InProduceOrderGenerateMaterialsQO.java @@ -1,7 +1,6 @@ package com.nflg.wms.common.pojo.qo; import com.nflg.wms.common.pojo.dto.ZWM00MB007DTO; -import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Positive; import lombok.Data; @@ -30,10 +29,4 @@ public class InProduceOrderGenerateMaterialsQO extends ZWM00MB007DTO { @NotNull @Positive(message = "收货数量必须大于0") private BigDecimal num; - - /** - * 批次号 - */ - @NotBlank - private String batchNo; } diff --git a/readme.md b/readme.md new file mode 100644 index 00000000..02df4ae8 --- /dev/null +++ b/readme.md @@ -0,0 +1,10 @@ +## 需要安装的软件 + +- wkhtmltoimage + +> 用于将HTML转为图片,打印标签需要 + +```bash +wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox-0.12.6-1.centos7.x86_64.rpm +yum localinstall wkhtmltox-0.12.6-1.centos7.x86_64.rpm +``` \ No newline at end of file