From fb1fb9e2654152eeee91d51a4d6bc89f6bf70544 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Fri, 27 Mar 2026 16:35:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(shipment):=20=E6=96=B0=E5=A2=9E=E7=89=A9?= =?UTF-8?q?=E6=96=99=E7=A0=81=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=94=9F=E4=BA=A7=E8=AE=A2=E5=8D=95=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 MaterialCodeController 控制器实现物料清单的增删改查功能 - 实现物料清单导入导出 Excel 模板功能 - 添加物料清单明细项的二维码生成功能 - 优化生产订单中二维码生成逻辑,支持齐套物料批量处理 - 重构生产订单打印数据查询逻辑,过滤父级物料项目 - 更新订单详情展示逻辑,按层级结构显示物料及子物料 - 修复生产订单中齐套物料扫描类型判断逻辑 - 完善物料码相关服务接口和数据模型定义 --- .../controller/InProduceOrderController.java | 155 ++++++++++-------- .../common/pojo/qo/MaterialCodeSearchQO.java | 5 - .../common/pojo/vo/InProduceOrderItemVO.java | 6 + .../wms/common/pojo/vo/InProduceOrderVO.java | 3 +- .../controller/MaterialCodeController.java | 3 +- 5 files changed, 96 insertions(+), 76 deletions(-) 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 de22439a..4dc0b180 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 @@ -159,26 +159,12 @@ public class InProduceOrderController extends BaseController { .setBatchNo(date + index) .setSernr(request.getSernr()); produceOrderItemService.save(parent); - qrCodeMasterService.save(new WmsQrCodeMaster() - .setBarcodeCode(KeyUtil.next()) - .setProcessStage(BarCodeProcessStage.ForStorage.getState()) - .setBarcodeType(BarCodeType.Production.getState()) - .setMaterialCode(parent.getMaterialNo()) - .setMaterialDescription(parent.getMaterialDesc()) - .setPackagingType((short) 0) - .setQuantity(parent.getNum()) - .setUnit(parent.getUnit()) - .setBatchNo(parent.getBatchNo()) - .setSerialNo(parent.getSernr()) - .setExtendId(parent.getId()) - .setCreateUserId(UserUtil.getUserId()) - .setCreateUserName(UserUtil.getUserName()) - .setCreateTime(LocalDateTime.now()) - ); if (request.getList()) { List children = bomService.getChildren(request.getMatnr()); - VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(children)).throwMessage("请先添加齐套信息"); - produceOrderItemService.saveBatch(children.stream().map(it -> new WmsInProduceOrderItem() + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(children)).throwMessage("请先添加齐套物料"); + List items = children.stream() + .map(it -> new WmsInProduceOrderItem() + .setId(IdUtil.getSnowflakeNextId()) .setOrderId(order.getId()) .setParentId(parent.getId()) .setNum(request.getNum().multiply(it.getNum())) @@ -188,8 +174,46 @@ public class InProduceOrderController extends BaseController { .setFactoryNo(request.getPwerk()) .setWarehouseNo(request.getLgort()) .setOrderNum(request.getPsmng()) + .setBatchNo(parent.getBatchNo()) + .setSernr(request.getSernr()) + ) + .toList(); + produceOrderItemService.saveBatch(items); + qrCodeMasterService.saveBatch( + items.stream().map(it -> new WmsQrCodeMaster() + .setBarcodeCode(KeyUtil.next()) + .setProcessStage(BarCodeProcessStage.ForStorage.getState()) + .setBarcodeType(BarCodeType.Production.getState()) + .setMaterialCode(it.getMaterialNo()) + .setMaterialDescription(it.getMaterialDesc()) + .setPackagingType((short) 0) + .setQuantity(it.getNum()) + .setUnit(it.getUnit()) + .setBatchNo(it.getBatchNo()) + .setSerialNo(it.getSernr()) + .setExtendId(it.getId()) + .setCreateUserId(UserUtil.getUserId()) + .setCreateUserName(UserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()) ).toList() ); + } else { + qrCodeMasterService.save(new WmsQrCodeMaster() + .setBarcodeCode(KeyUtil.next()) + .setProcessStage(BarCodeProcessStage.ForStorage.getState()) + .setBarcodeType(BarCodeType.Production.getState()) + .setMaterialCode(parent.getMaterialNo()) + .setMaterialDescription(parent.getMaterialDesc()) + .setPackagingType((short) 0) + .setQuantity(parent.getNum()) + .setUnit(parent.getUnit()) + .setBatchNo(parent.getBatchNo()) + .setSerialNo(parent.getSernr()) + .setExtendId(parent.getId()) + .setCreateUserId(UserUtil.getUserId()) + .setCreateUserName(UserUtil.getUserName()) + .setCreateTime(LocalDateTime.now()) + ); } return ApiResult.success(order.getId()); } @@ -248,16 +272,13 @@ public class InProduceOrderController extends BaseController { , @Valid @RequestParam @NotNull Integer type) throws Exception { WmsInProduceOrder order = produceOrderService.getById(id); VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在"); - List datas = convertToPrintDTO(qrCodeMasterService.getByExtendIds( - produceOrderItemService.lambdaQuery() - .select(WmsInProduceOrderItem::getId) - .eq(WmsInProduceOrderItem::getOrderId, id) - .list() - .stream() - .map(WmsInProduceOrderItem::getId) - .toList() - ) - ); + List items = produceOrderItemService.lambdaQuery() + .eq(WmsInProduceOrderItem::getOrderId, id) + .list(); + if (order.getList()) { + items.removeIf(it -> it.getParentId() == 0); + } + List datas = convertToPrintDTO(qrCodeMasterService.getByExtendIds(items.stream().map(WmsInProduceOrderItem::getId).toList())); Map variables = new HashMap<>(); variables.put("list", datas); if (Objects.equals(type, 1)) { @@ -279,16 +300,13 @@ public class InProduceOrderController extends BaseController { public ResponseEntity exportItemImageZip(@Valid @RequestParam @NotNull Long id) throws Exception { WmsInProduceOrder order = produceOrderService.getById(id); VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在"); - List datas = convertToPrintDTO(qrCodeMasterService.getByExtendIds( - produceOrderItemService.lambdaQuery() - .select(WmsInProduceOrderItem::getId) - .eq(WmsInProduceOrderItem::getOrderId, id) - .list() - .stream() - .map(WmsInProduceOrderItem::getId) - .toList() - ) - ); + List items = produceOrderItemService.lambdaQuery() + .eq(WmsInProduceOrderItem::getOrderId, id) + .list(); + if (order.getList()) { + items.removeIf(it -> it.getParentId() == 0); + } + List datas = convertToPrintDTO(qrCodeMasterService.getByExtendIds(items.stream().map(WmsInProduceOrderItem::getId).toList())); ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (ZipOutputStream zos = new ZipOutputStream(baos)) { for (QrCodeMasterPrintDTO it : datas) { @@ -336,7 +354,7 @@ public class InProduceOrderController extends BaseController { VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在"); List list = produceOrderItemService.getVOByOrderId(id); if (order.getList()) { - list.removeIf(item -> Objects.equals(item.getParentId(), 0L)); + list.removeIf(item -> item.getParentId() != 0L); } InProduceOrderItemVO first = list.get(0); Map base = new HashMap<>(); @@ -362,33 +380,32 @@ public class InProduceOrderController extends BaseController { VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在"); VUtil.trueThrowBusinessError(!Objects.equals(order.getState(), (short) 0)) .throwMessage("该订单非待收货状态"); - InProduceOrderVO vo=Convert.convert(InProduceOrderVO.class,order); + InProduceOrderVO vo = Convert.convert(InProduceOrderVO.class, order); List list = produceOrderItemService.getVOByOrderId(order.getId()); - if (order.getList()) { - List datas = new ArrayList<>(); - list.stream().filter(it -> Objects.equals(it.getParentId(), 0L)).forEach(it -> { - List children = list.stream() - .filter(child -> Objects.equals(child.getParentId(), it.getId())) - .toList(); - Integer type = bomService.getScanType(it.getMaterialNo()); - children.forEach(child -> { - child.setQiTao(type > 0); - if (Objects.equals(type, 0)) { - child.setMustScan(false); - } - child.setBinNo(binService.getBinNo(child.getMaterialNo(), child.getFactoryNo(), child.getWarehouseNo())); - child.setIsDisableLocation(warehouseService.isEnableLocation(child.getFactoryNo(), child.getWarehouseNo())); - }); - datas.addAll(children); - }); - vo.setItems(datas); - } else { - list.forEach(it -> { + list.forEach(it -> { + if (it.getParentId() == 0) { it.setBinNo(binService.getBinNo(it.getMaterialNo(), it.getFactoryNo(), it.getWarehouseNo())); it.setIsDisableLocation(warehouseService.isEnableLocation(it.getFactoryNo(), it.getWarehouseNo())); - }); - vo.setItems(list); - } + vo.getItems().add(it); + if (order.getList()) { + List children = list.stream() + .filter(child -> Objects.equals(child.getParentId(), it.getId())) + .toList(); + Integer type = bomService.getScanType(it.getMaterialNo()); + it.setQiTao(type > 0); + if (Objects.equals(type, 0)) { + it.setMustScan(false); + } + children.forEach(child -> { + child.setQiTao(it.isQiTao()); + child.setMustScan(it.isMustScan()); + child.setBinNo(binService.getBinNo(child.getMaterialNo(), child.getFactoryNo(), child.getWarehouseNo())); + child.setIsDisableLocation(warehouseService.isEnableLocation(child.getFactoryNo(), child.getWarehouseNo())); + }); + it.setChildren(children); + } + } + }); return ApiResult.success(vo); } @@ -431,10 +448,12 @@ public class InProduceOrderController extends BaseController { .flatMap(Collection::stream) .map(InventoryInItemQRCodeQO::getQrCode) .collect(Collectors.toSet()); - List qrCodeMasters = CollectionUtil.isEmpty(allQrCodes) ? Collections.emptyList() : qrCodeMasterService.lambdaQuery() - .ne(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState()) - .in(WmsQrCodeMaster::getBarcodeCode, allQrCodes) - .list(); + List qrCodeMasters = CollectionUtil.isEmpty(allQrCodes) + ? Collections.emptyList() + : qrCodeMasterService.lambdaQuery() + .ne(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState()) + .in(WmsQrCodeMaster::getBarcodeCode, allQrCodes) + .list(); datas.forEach(it -> { InventoryIn1ItemQO qitem = request.getItems().stream() .filter(item -> Objects.equals(item.getItemId(), it.getId())) @@ -581,7 +600,7 @@ public class InProduceOrderController extends BaseController { ); } OptRecordDTO optRecordDTO = new OptRecordDTO(); - optRecordDTO.setOperationType((short)1); + optRecordDTO.setOperationType((short) 1); optRecordDTO.setOrderId(order.getNo()); optRecordService.add(optRecordDTO); //同步入库信息到SAP diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialCodeSearchQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialCodeSearchQO.java index c8763011..09469b2d 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialCodeSearchQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/MaterialCodeSearchQO.java @@ -25,11 +25,6 @@ public class MaterialCodeSearchQO extends SearchBaseQO { */ private String customerName; - /** - * 装箱状态 - */ - private Integer packingStatus; - /** * 下单开始日期 */ diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InProduceOrderItemVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InProduceOrderItemVO.java index 94e8e2f6..f26948e3 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InProduceOrderItemVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InProduceOrderItemVO.java @@ -5,6 +5,7 @@ import lombok.Data; import lombok.experimental.Accessors; import java.math.BigDecimal; +import java.util.List; @Data @Accessors(chain = true) @@ -83,4 +84,9 @@ public class InProduceOrderItemVO { */ @JsonProperty("isDisableLocation") private Boolean isDisableLocation = true; + + /** + * 清点件的齐套物料列表 + */ + private List children; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InProduceOrderVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InProduceOrderVO.java index a8fb2393..fbb4fa0c 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InProduceOrderVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InProduceOrderVO.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; @Data @@ -67,5 +68,5 @@ public class InProduceOrderVO { */ private LocalDateTime updateTime; - private List items; + private List items=new ArrayList<>(); } 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 b5889362..bf1a4544 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 @@ -161,8 +161,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()) - .eq(Objects.nonNull(request.getPackingStatus()), WmsShipmentMaterialCode::getStatus, request.getPackingStatus()) .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())) );