From 663d94b0c6cc668ec3a90fe691d494356d6175b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Tue, 26 May 2026 14:24:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=92=A2=E6=9E=84=E4=BB=B6?= =?UTF-8?q?=E9=80=81=E8=B4=A7=E5=8D=95=E8=AF=A6=E6=83=85=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E2=80=9C=E6=89=98=E7=9B=98=E6=A0=87=E7=AD=BE=E2=80=9D=E3=80=81?= =?UTF-8?q?=E2=80=9C=E6=89=98=E7=9B=98=E8=80=81=E9=BC=A0=E5=9B=BE=E2=80=9D?= =?UTF-8?q?=E3=80=81=E2=80=9C=E5=AF=BC=E5=87=BAExcel=E2=80=9D=E3=80=81?= =?UTF-8?q?=E2=80=9C=E6=A0=87=E7=AD=BE=E7=BA=B8=E6=89=93=E5=8D=B0=E2=80=9D?= =?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StructuralPackageOrderController.java | 153 +++++++++++++++--- ...liverStructuralPackageOrderTrayItemVO.java | 5 + ...sStructuralPackageOrderTrayItemMapper.java | 2 + ...StructuralPackageOrderTrayItemService.java | 2 + ...cturalPackageOrderTrayItemServiceImpl.java | 5 + ...msStructuralPackageOrderTrayItemMapper.xml | 15 ++ 6 files changed, 156 insertions(+), 26 deletions(-) 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 2556f480..b37e9b67 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 @@ -411,7 +411,6 @@ public class StructuralPackageOrderController extends BaseController { /** * 搜索 - * * @param request 请求参数 */ @PostMapping("search") @@ -421,7 +420,6 @@ public class StructuralPackageOrderController extends BaseController { /** * 根据单据号获取列表 - * * @param orderNo 单据号 */ @GetMapping("getList") @@ -431,7 +429,6 @@ public class StructuralPackageOrderController extends BaseController { /** * 获取订单托盘详情 - * * @param id 订单id */ @GetMapping("getTrayInfo") @@ -455,9 +452,9 @@ public class StructuralPackageOrderController extends BaseController { // 获取托盘号:如果物料项有关联的托盘,则使用托盘号;否则为空 if (item.getTrayId() != null) { WmsStructuralPackageOrderTray tray = trays.stream() - .filter(t -> t.getId().equals(item.getTrayId())) - .findFirst() - .orElse(null); + .filter(t -> t.getId().equals(item.getTrayId())) + .findFirst() + .orElse(null); if (tray != null) { ivo.setNo(tray.getNo()); } else { @@ -480,7 +477,6 @@ public class StructuralPackageOrderController extends BaseController { /** * 删除 - * * @param ids 要删除的id列表 */ @PostMapping("delete") @@ -491,7 +487,6 @@ public class StructuralPackageOrderController extends BaseController { /** * 根据订单状态搜索 - * * @param request 请求参数 */ @PostMapping("searchByState") @@ -501,7 +496,6 @@ public class StructuralPackageOrderController extends BaseController { /** * 导出选中的id列表 - * * @param ids id列表 */ @PostMapping("exportByIds") @@ -512,7 +506,6 @@ public class StructuralPackageOrderController extends BaseController { /** * 导出搜索结果 - * * @param request 搜索参数 */ @PostMapping("exportSearchByState") @@ -526,7 +519,6 @@ public class StructuralPackageOrderController extends BaseController { /** * 获取托盘零件列表 - * * @param id 订单id */ @GetMapping("getItems") @@ -549,7 +541,6 @@ public class StructuralPackageOrderController extends BaseController { /** * 导出老鼠图PDF - * * @param id 订单id */ @GetMapping("exportPdf") @@ -629,7 +620,7 @@ public class StructuralPackageOrderController extends BaseController { variables.put("list", datas); String html = ThymeleafUtil.generator("/template/qrcode/", "spitem", ".html", variables); URL baseUrl = new ClassPathResource("template/qrcode/").getURL(); - PdfGeneratorUtil.generatePdf("零件标签"+DateTimeUtil.format(LocalDateTime.now(),"yyyyMMddHHmmss"), html, baseUrl.toString(), response); + PdfGeneratorUtil.generatePdf("零件标签" + DateTimeUtil.format(LocalDateTime.now(), "yyyyMMddHHmmss"), html, baseUrl.toString(), response); } /** @@ -1542,7 +1533,6 @@ public class StructuralPackageOrderController extends BaseController { /** * 添加备注 - * * @param request 请求参数 */ @PostMapping("itemRemark") @@ -1560,7 +1550,6 @@ public class StructuralPackageOrderController extends BaseController { /** * 根据指定托盘数量重新生成订单托盘信息 - * * @param request 请求参数 */ @Transactional @@ -1762,10 +1751,10 @@ public class StructuralPackageOrderController extends BaseController { .filter(t -> StrUtil.equals(t.getNo(), trayQO.getTrayNo())) .findFirst() .orElse(null); - + // 收集当前托盘需要绑定的托盘项 List currentTrayItems = new ArrayList<>(); - + // 处理托盘中的每个物料 for (TrayMaterialQO materialQO : trayQO.getItems()) { // 从订单级别的所有托盘项中查找匹配的物料(排除已使用的,且trayId为null或-1表示未绑定) @@ -1814,12 +1803,12 @@ public class StructuralPackageOrderController extends BaseController { allQrCodeDTOs.addAll(dtos); } } - + // 批量更新当前托盘项的trayId if (CollectionUtil.isNotEmpty(currentTrayItems)) { structuralPackageOrderTrayItemService.updateBatchById(currentTrayItems); } - + // 更新托盘状态为已打包 VUtil.trueThrowBusinessError(!structuralPackageOrderTrayService.lambdaUpdate() .set(WmsStructuralPackageOrderTray::getState, OrderState.Packaged.getState()) @@ -1853,7 +1842,7 @@ public class StructuralPackageOrderController extends BaseController { VUtil.trueThrowBusinessError(StrUtil.isBlank(diffItem.getRemark())) .throwMessage("物料" + diffItem.getMaterialNo() + "的差异原因不能为空"); } - + // 2. 根据orderId查询订单信息 DeliverStructuralPackageOrderVO order = structuralPackageOrderService.getInfo(request.getOrderId()); VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在"); @@ -1889,10 +1878,10 @@ public class StructuralPackageOrderController extends BaseController { .filter(t -> StrUtil.equals(t.getNo(), trayQO.getTrayNo())) .findFirst() .orElse(null); - + // 收集当前托盘需要绑定的托盘项 List currentTrayItems = new ArrayList<>(); - + // 处理托盘中的每个物料 for (TrayMaterialQO materialQO : trayQO.getItems()) { // 从订单级别的所有托盘项中查找匹配的物料(排除已使用的,且trayId为null或-1表示未绑定) @@ -1948,12 +1937,12 @@ public class StructuralPackageOrderController extends BaseController { allQrCodeDTOs.addAll(dtos); } } - + // 批量更新当前托盘项的trayId if (CollectionUtil.isNotEmpty(currentTrayItems)) { structuralPackageOrderTrayItemService.updateBatchById(currentTrayItems); } - + // 更新托盘状态为已打包 VUtil.trueThrowBusinessError(!structuralPackageOrderTrayService.lambdaUpdate() .set(WmsStructuralPackageOrderTray::getState, OrderState.Packaged.getState()) @@ -1999,14 +1988,14 @@ public class StructuralPackageOrderController extends BaseController { // 9. 构建返回结果 PackTraySubmitWithDiffVO result = new PackTraySubmitWithDiffVO(); result.setOrderId(request.getOrderId()); - + // 转换托盘列表 List trayVOs = new ArrayList<>(); for (TraySubmitQO trayQO : request.getTrays()) { TrayItemVO2 trayVO = new TrayItemVO2(); trayVO.setTrayNo(trayQO.getTrayNo()); trayVO.setOrderId(trayQO.getOrderId()); - + List materialVOs = new ArrayList<>(); for (TrayMaterialQO materialQO : trayQO.getItems()) { TrayMaterialVO materialVO = new TrayMaterialVO(); @@ -2038,4 +2027,116 @@ public class StructuralPackageOrderController extends BaseController { return ApiResult.success(result); } + + /** + * 根据托盘id列表导出托盘标签PDF + * @param ids 托盘id列表 + */ + @PostMapping("exportTrayPdfByTrayIds") + public void exportTrayPdfByTrayIds(HttpServletResponse response, @RequestBody @NotEmpty List ids) throws Exception { + List trays = structuralPackageOrderTrayService.listByIds(ids); + 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("数据不存在"); + trayVO.setQrCode(QRCodeUtil.generateQRCodeBase64(trayVO.getTrayNo(), 100, 100)); + Map variables = new HashMap<>(); + variables.put("info", trayVO); + String html = ThymeleafUtil.generator("/template/qrcode/", "tray", ".html", variables); + htmlList.add(html); + } + + // 将所有托盘标签合并成一个PDF文件,每页一个标签 + PdfGeneratorUtil.generatePdf("托盘标签", htmlList, response); + } + + /** + * 根据托盘id列表导出托盘标签图片ZIP + * @param ids 托盘id列表 + */ + @PostMapping(value = "exportTrayImageZipByTrayIds", produces = MediaType.IMAGE_PNG_VALUE) + public ResponseEntity exportTrayImageZipByTrayIds(@RequestBody @NotEmpty List ids) throws Exception { + List trays = structuralPackageOrderTrayService.listByIds(ids); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(trays)).throwMessage("数据不存在"); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (ZipOutputStream zos = new ZipOutputStream(baos)) { + for (WmsStructuralPackageOrderTray tray : trays) { + DeliverStructuralPackageOrderExtendVO trayVO = structuralPackageOrderTrayService.getInfo(tray.getId()); + VUtil.trueThrowBusinessError(Objects.isNull(trayVO)).throwMessage("数据不存在"); + trayVO.setQrCode(QRCodeUtil.generateQRCodeBase64(trayVO.getTrayNo(), 200, 200)); + Map variables = new HashMap<>(); + variables.put("info", trayVO); + String html = ThymeleafUtil.generator("/template/qrcode/", "tray-label", ".html", variables); + ZipEntry entry = new ZipEntry(trayVO.getTrayNo() + ".png"); + zos.putNextEntry(entry); + byte[] imageBytes = HtmlToImageUtil.convertToPng(html, 600); + zos.write(imageBytes, 0, imageBytes.length); + zos.closeEntry(); + } + } + byte[] zipBytes = baos.toByteArray(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.valueOf("application/zip")); + headers.setContentLength(zipBytes.length); + return new ResponseEntity<>(zipBytes, headers, HttpStatus.OK); + } + + /** + * 根据托盘id列表导出托盘零件列表 + * @param ids 托盘id列表 + */ + @PostMapping("exportItemsByTrayIds") + public void exportItemsByTrayIds(HttpServletResponse response, @RequestBody @NotEmpty List ids) throws IOException { + List list = structuralPackageOrderTrayItemService.getListVOByTrayIds(ids); + EecExcelUtil.export("零件信息", "sheet1", list, response); + } + + /** + * 根据托盘id列表导出老鼠图PDF + * @param ids 托盘id列表 + */ + @PostMapping("exportPdfByTrayIds") + public ApiResult exportPdfByTrayIds(@RequestBody @NotEmpty List ids) throws Exception { + List list = structuralPackageOrderTrayItemService.getListVOByTrayIds(ids); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(list)).throwMessage("数据不存在"); + DeliverStructuralPackageOrderExtendVO trayVO = structuralPackageOrderTrayService.getInfo(list.get(0).getTrayId()); + + PackageVO vo = new PackageVO() + .setNo(trayVO.getPackageNo()) + .setExternalOrderNo(trayVO.getExternalOrderNo()) + .setRowNo(trayVO.getRowNo()) + .setSupplierName(trayVO.getSupplierName()) + .setModelNos(trayVO.getModelNo()) + .setVersion(trayVO.getPackageVersion()) + .setWorkbenchCode(trayVO.getWorkbenchCode()) + .setCate(trayVO.getPackageCate()) + .setWeight(trayVO.getWeight()) + .setDrawingNo(trayVO.getPackageDrawingNo()) + .setName(trayVO.getPackageDesc()) + .setQrCode(QRCodeUtil.generateQRCodeBase64(trayVO.getPackageNo(), 100, 100)); + + List items = list.stream() + .map(item -> new PackageMaterialDTO() + .setImage(item.getImage()) + .setNo(item.getMaterialNo()) + .setDrawingNo(item.getDrawingNo()) + .setName(item.getMaterialDesc()) + .setNum(item.getShipmentNum()) + .setWeight(item.getWeight()) + ).collect(Collectors.toList()); + Map variables = new HashMap<>(); + variables.put("info", vo); + variables.put("pages", PdfPageDTO.create(items, 9, new PackageMaterialDTO())); + String html = ThymeleafUtil.generator("/template/", "钢构件老鼠图", ".html", variables); +// PdfGeneratorUtil.generatePdf(vo.getExternalOrderNo() + "-" + vo.getWorkbenchCode() + "老鼠图", html, response); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PdfGeneratorUtil.generatePdf(vo.getExternalOrderNo() + "-" + vo.getWorkbenchCode() + "老鼠图", html, outputStream); + InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); + return ApiResult.success(fileUploadService.upload("tmp/sp/" + RandomUtil.randomString(10) + "/" + "老鼠图.pdf", inputStream, MediaType.APPLICATION_PDF_VALUE)); + } } \ No newline at end of file diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/DeliverStructuralPackageOrderTrayItemVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/DeliverStructuralPackageOrderTrayItemVO.java index 71822428..2fbee5f3 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/DeliverStructuralPackageOrderTrayItemVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/DeliverStructuralPackageOrderTrayItemVO.java @@ -20,6 +20,11 @@ public class DeliverStructuralPackageOrderTrayItemVO implements Serializable { private Long id; + /** + * 托盘ID + */ + private Long trayId; + /** * 托盘号 */ diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsStructuralPackageOrderTrayItemMapper.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsStructuralPackageOrderTrayItemMapper.java index cece5de3..a692de40 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsStructuralPackageOrderTrayItemMapper.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/WmsStructuralPackageOrderTrayItemMapper.java @@ -27,4 +27,6 @@ public interface WmsStructuralPackageOrderTrayItemMapper extends BaseMapper getListByOrderId(Long orderId); List getListVOByIds(List ids); + + List getListVOByTrayIds(List ids); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsStructuralPackageOrderTrayItemService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsStructuralPackageOrderTrayItemService.java index dc6fba7c..195f791a 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsStructuralPackageOrderTrayItemService.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsStructuralPackageOrderTrayItemService.java @@ -39,4 +39,6 @@ public interface IWmsStructuralPackageOrderTrayItemService extends IService getListVOByOrderId(@Valid @NotNull Long orderId); List getListVOByIds(List ids); + + List getListVOByTrayIds(List ids); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsStructuralPackageOrderTrayItemServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsStructuralPackageOrderTrayItemServiceImpl.java index d3acae44..dc21d6d1 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsStructuralPackageOrderTrayItemServiceImpl.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsStructuralPackageOrderTrayItemServiceImpl.java @@ -64,4 +64,9 @@ public class WmsStructuralPackageOrderTrayItemServiceImpl extends ServiceImpl getListVOByIds(List ids) { return baseMapper.getListVOByIds(ids); } + + @Override + public List getListVOByTrayIds(List ids) { + return baseMapper.getListVOByTrayIds(ids); + } } diff --git a/nflg-wms-repository/src/main/resources/mapper/WmsStructuralPackageOrderTrayItemMapper.xml b/nflg-wms-repository/src/main/resources/mapper/WmsStructuralPackageOrderTrayItemMapper.xml index 87d2eaa6..99eddd7f 100644 --- a/nflg-wms-repository/src/main/resources/mapper/WmsStructuralPackageOrderTrayItemMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/WmsStructuralPackageOrderTrayItemMapper.xml @@ -49,4 +49,19 @@ order by oti.id + +