From 0bf4494fb6b80332856c077bdc3a4daafcb686e7 Mon Sep 17 00:00:00 2001 From: yf001217 <834502597@qq.com> Date: Thu, 2 Apr 2026 18:40:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=89=A9=E6=96=99=E8=80=81?= =?UTF-8?q?=E9=BC=A0=E5=9B=BE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/common/pojo/dto/MaterialPdfDTO.java | 44 +++++ .../wms/common/pojo/qo/MaterialPdfQO.java | 37 +++++ .../wms/common/pojo/vo/MaterialPdfVO.java | 41 +++++ nflg-wms-shipment/pom.xml | 6 + .../controller/MaterialCodeController.java | 85 +++++++++- .../controller/PackagingCodeController.java | 7 +- .../resources/template/物料老鼠图.html | 150 ++++++++++++++++++ 7 files changed, 367 insertions(+), 3 deletions(-) create mode 100644 nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/MaterialPdfDTO.java create mode 100644 nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialPdfQO.java create mode 100644 nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/MaterialPdfVO.java create mode 100644 nflg-wms-shipment/src/main/resources/template/物料老鼠图.html diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/MaterialPdfDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/MaterialPdfDTO.java new file mode 100644 index 00000000..c7e52e67 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/MaterialPdfDTO.java @@ -0,0 +1,44 @@ +package com.nflg.wms.common.pojo.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +@Data +@Accessors(chain = true) +public class MaterialPdfDTO { + /** + * 图片 + */ + private String image; + /** + * 编号 + */ + @NotBlank + private String materialNo; + + /** + * 图号 + */ + private String drawingNo; + + /** + * 名称 + */ + @NotBlank + private String materialDescribe; + + /** + * 数量 + */ + @NotNull + private BigDecimal num; + + /** + * 重量 + */ + private BigDecimal weight; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialPdfQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialPdfQO.java new file mode 100644 index 00000000..cfe28a9c --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialPdfQO.java @@ -0,0 +1,37 @@ +package com.nflg.wms.common.pojo.qo; + +import lombok.Data; + +import java.util.List; + +@Data +public class MaterialPdfQO { + /** + * 清单编号 + */ + private String no; + /** + * 机台编号 + */ + private String deviceNo; + /** + * 物料编码 + */ + private String materialNo; + /** + * 销售订单号 + */ + private String soNo; + /** + * 客户名称 + */ + private String customerName; + /** + * 下单日期 + */ + private String orderDay; + /** + * 物料id + */ + private List materialIds; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/MaterialPdfVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/MaterialPdfVO.java new file mode 100644 index 00000000..bfca853d --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/MaterialPdfVO.java @@ -0,0 +1,41 @@ +package com.nflg.wms.common.pojo.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class MaterialPdfVO { + /** + * 清单编号 + */ + private String no; + /** + * 机台编号 + */ + private String deviceNo; + /** + * 物料编码 + */ + private String materialNo; + /** + * 销售订单号 + */ + private String soNo; + /** + * 客户名称 + */ + private String customerName; + /** + * 下单日期 + */ + private String orderDay; + /** + * 重量 + */ + private BigDecimal weight; + /** + * 二维码 + */ + private String qrCode; +} diff --git a/nflg-wms-shipment/pom.xml b/nflg-wms-shipment/pom.xml index 4a6b59c9..983eef4b 100644 --- a/nflg-wms-shipment/pom.xml +++ b/nflg-wms-shipment/pom.xml @@ -132,6 +132,12 @@ hypersistence-tsid 2.1.4 + + com.nflg + nflg-wms-admin + 1.0.0-SNAPSHOT + compile + diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/MaterialCodeController.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/MaterialCodeController.java index bf1a4544..4d2f174e 100644 --- a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/MaterialCodeController.java +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/MaterialCodeController.java @@ -3,12 +3,17 @@ package com.nflg.wms.shipment.controller; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.nflg.wms.admin.pojo.dto.PdfPageDTO; +import com.nflg.wms.admin.util.PdfGeneratorUtil; import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.PageData; +import com.nflg.wms.common.pojo.dto.MaterialPdfDTO; import com.nflg.wms.common.pojo.qo.*; +import com.nflg.wms.common.pojo.vo.MaterialPdfVO; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeItemVO; import com.nflg.wms.common.util.EecExcelUtil; @@ -25,6 +30,7 @@ import com.nflg.wms.shipment.util.KeyUtil; import com.nflg.wms.shipment.util.QRCodeUtil; import com.nflg.wms.shipment.util.ThymeleafUtil; import com.nflg.wms.starter.BaseController; +import com.nflg.wms.starter.service.FileUploadService; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; @@ -43,8 +49,11 @@ import org.ttzero.excel.entity.TemplateSheet; import org.ttzero.excel.entity.Workbook; import org.ttzero.excel.reader.ExcelReader; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.math.BigDecimal; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; @@ -83,6 +92,9 @@ public class MaterialCodeController extends BaseController { @Resource private IWmsShipmentMaterialService materialService; + @Resource + private FileUploadService fileUploadService; + /** * 清单-新增 */ @@ -153,7 +165,7 @@ public class MaterialCodeController extends BaseController { public ApiResult> search(@Valid @RequestBody MaterialCodeSearchQO request) { return ApiResult.success( materialCodeService.lambdaQuery() - .eq(Objects.nonNull(request.getStatus()),WmsShipmentMaterialCode::getStatus, request.getStatus()) + .eq(Objects.nonNull(request.getStatus()), WmsShipmentMaterialCode::getStatus, request.getStatus()) .ge(Objects.nonNull(request.getOrderStartDate()), WmsShipmentMaterialCode::getOrderDate, request.getOrderStartDate()) .le(Objects.nonNull(request.getOrderEndDate()), WmsShipmentMaterialCode::getOrderDate, request.getOrderEndDate()) .ge(Objects.nonNull(request.getStartDate()), WmsShipmentMaterialCode::getCreateTime, request.getStartDate()) @@ -161,7 +173,7 @@ public class MaterialCodeController extends BaseController { .like(StrUtil.isNotBlank(request.getNo()), WmsShipmentMaterialCode::getNo, request.getNo()) .like(StrUtil.isNotBlank(request.getSoNo()), WmsShipmentMaterialCode::getSoNo, request.getSoNo()) .like(StrUtil.isNotBlank(request.getMaterialNo()), WmsShipmentMaterialCode::getMaterialNo, request.getMaterialNo()) - .like(StrUtil.isNotBlank(request.getCustomerName()), WmsShipmentMaterialCode::getCustomerName, request.getCustomerName()) .orderByAsc(WmsShipmentMaterialCode::getStatus) + .like(StrUtil.isNotBlank(request.getCustomerName()), WmsShipmentMaterialCode::getCustomerName, request.getCustomerName()).orderByAsc(WmsShipmentMaterialCode::getStatus) .orderByDesc(WmsShipmentMaterialCode::getId) .page(new Page<>(request.getPage(), request.getPageSize())) ); @@ -391,6 +403,7 @@ public class MaterialCodeController extends BaseController { /** * 清单明细-导入 + * * @param materialCodeId 清单ID * @param cover 导入模式,true:覆盖,false:新增 * @param file 文件 @@ -549,6 +562,7 @@ public class MaterialCodeController extends BaseController { /** * 清单明细-根据二维码唯一号获取物料信息(PDA使用) + * * @param code 二维码唯一号 */ @GetMapping("getInfoByQRCode") @@ -578,6 +592,7 @@ public class MaterialCodeController extends BaseController { /** * 根据清单导出标签图片ZIP(用于直连打印机打印) + * * @param ids 清单id列表 */ @PostMapping("exportItemImageZip1") @@ -589,6 +604,7 @@ public class MaterialCodeController extends BaseController { /** * 根据清单项导出标签图片ZIP(用于直连打印机打印) + * * @param ids 清单明细id列表 */ @PostMapping("exportItemImageZip") @@ -631,6 +647,7 @@ public class MaterialCodeController extends BaseController { /** * 代发物料-导入 + * * @param id 清单ID */ @PostMapping("importForward") @@ -742,4 +759,68 @@ public class MaterialCodeController extends BaseController { .update(); return ApiResult.success(); } + + /** + * 导出老鼠图PDF + */ + @PostMapping("exportPdf") + public ApiResult exportPdf(HttpServletResponse response, @RequestBody MaterialPdfQO request) throws Exception { + List materialCodeIts =materialCodeItemService.lambdaQuery() + .in(WmsShipmentMaterialCodeItem::getId, request.getMaterialIds()).list(); + //根据前端传入的物料ID查询对应的物料编号再查询物料主数据 + List shipmentMaterials = materialService.lambdaQuery() + .in(WmsShipmentMaterial::getNo, materialCodeIts + .stream() + .map(WmsShipmentMaterialCodeItem::getMaterialNo) + .toList()) + .list(); + //根据前端传入的物料ID查询物料明细 + List materialCodeItems = materialCodeItemService.lambdaQuery() + .in(WmsShipmentMaterialCodeItem::getId, request.getMaterialIds()).list(); + //将主数据转换成PDF需要的DTO列表 + List items = Convert.toList(MaterialPdfDTO.class, materialCodeIts); + Map materialMap = shipmentMaterials.stream() + .collect(Collectors.toMap(WmsShipmentMaterial::getNo, m -> m)); + for (MaterialPdfDTO dto : items) { + WmsShipmentMaterial mat = materialMap.get(dto.getMaterialNo()); + if (mat != null) { + dto.setImage(mat.getImage()); + dto.setWeight(mat.getWeight()); + dto.setDrawingNo(mat.getDrawingNo()); + } + } + //计算总重量 = 单个重量 * 数量 累加 + BigDecimal allWeight = new BigDecimal(0); + for (WmsShipmentMaterialCodeItem temp : materialCodeItems) { + WmsShipmentMaterial material = shipmentMaterials.stream() + .filter(s -> s.getNo().equals(temp.getMaterialNo())) + .findFirst() + .orElse(null); + if (material == null) continue; + BigDecimal weight = material.getWeight() == null ? BigDecimal.ZERO : material.getWeight(); + BigDecimal num = temp.getActualNum() == null ? BigDecimal.ZERO : temp.getActualNum(); + allWeight = allWeight.add(weight.multiply(num)); + } + MaterialPdfVO material = Convert.convert(MaterialPdfVO.class, request); + material.setWeight(allWeight); + material.setQrCode(com.nflg.wms.admin.util.QRCodeUtil.generateQRCodeBase64(request.getNo(), 100, 100)); + //制作pdf + Map variables = new HashMap<>(); + variables.put("info", material); + variables.put("pages", PdfPageDTO.create(items, 9, new MaterialPdfDTO())); + String html = ThymeleafUtil.generator( + "/template/", + "物料老鼠图", + ".html", + variables + ); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PdfGeneratorUtil.generatePdf( + "文件名", + html, + outputStream + ); + InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); + return ApiResult.success(fileUploadService.upload("tmp/sp/" + RandomUtil.randomString(10) + "/" + material.getNo() + "老鼠图.pdf", inputStream, MediaType.APPLICATION_PDF_VALUE)); + } } \ No newline at end of file diff --git a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/PackagingCodeController.java b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/PackagingCodeController.java index 2e178720..c099aa5f 100644 --- a/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/PackagingCodeController.java +++ b/nflg-wms-shipment/src/main/java/com/nflg/wms/shipment/controller/PackagingCodeController.java @@ -2,6 +2,7 @@ package com.nflg.wms.shipment.controller; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -25,8 +26,10 @@ import com.nflg.wms.shipment.util.QRCodeUtil; import com.nflg.wms.shipment.util.ThymeleafUtil; import com.nflg.wms.starter.BaseController; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -161,6 +164,7 @@ public class PackagingCodeController extends BaseController { /** * 根据二维码唯一号获取箱子(PDA使用) + * * @param code 二维码唯一号 */ @GetMapping("getInfoByQRCode") @@ -216,7 +220,7 @@ public class PackagingCodeController extends BaseController { */ @Transactional @PostMapping("pcPack") - public ApiResult pcPack(@Valid @RequestBody ShipmentPCPackingQO shipmentPCPackingQO){ + public ApiResult pcPack(@Valid @RequestBody ShipmentPCPackingQO shipmentPCPackingQO) { List ids = shipmentPCPackingQO.getCodes().stream() .map(code -> materialCodeItemQrService.getInfoByQRCode(code)) .filter(Objects::nonNull) @@ -265,6 +269,7 @@ public class PackagingCodeController extends BaseController { /** * 获取包装已打包的物料列表(PDA使用) + * * @param packagingCodeId 包装箱ID */ @GetMapping("getPackList") diff --git a/nflg-wms-shipment/src/main/resources/template/物料老鼠图.html b/nflg-wms-shipment/src/main/resources/template/物料老鼠图.html new file mode 100644 index 00000000..0348cf97 --- /dev/null +++ b/nflg-wms-shipment/src/main/resources/template/物料老鼠图.html @@ -0,0 +1,150 @@ + + + + + + + 物料老鼠图 + + + +
+ + + + + + + + + + + + + + + + + + + + +
清单编号:12255665451615机台编号:1111物料编号:12255665451615 + 二维码 +
销售订单号:1客户名称:12255665451615
下单日期:1总重:348.41页码:1/2
+
+
+
+ +
+
+
SAP编码:2222222222
+
图号:图号图号图号图号图号图号图号图号图号图号图号图号图号图号图号图号 +
+
名称:名称名称名称名称名称名称名称名称名称名名称名名称名称名称称名称名称名称称名称名称名称 +
+
数量:1    重量:348.41
+
+
+ + \ No newline at end of file