From d436601507c51ad67a023a2771fa3cb7093ba5ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Tue, 3 Feb 2026 17:50:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=87=BA=E5=BA=93=E7=AE=A1=E7=90=86=E6=89=8B?= =?UTF-8?q?=E5=8A=A8=E5=88=86=E9=85=8D=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StockOutOrderApplicationService.java | 73 +++++++++++++++---- .../MaterialInventoryQueryListDTO.java | 12 +++ .../stockOutOrder/StockOutOrderApi.java | 44 +---------- 3 files changed, 71 insertions(+), 58 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java index 6eadce3eb..0a1b1e33c 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java @@ -23,6 +23,7 @@ import com.mhd.system.api.domain.WarehouseFeignPO; import com.mhd.system.api.domain.cache.AssociationWarehouseCacheDO; import com.mhd.system.api.domain.cache.SystemServiceCacheUtil; import com.mhd.system.api.model.LoginUser; +import com.mhd.wms.domain.materialInventory.repository.mapper.MaterialInventoryMapper; import com.mhd.wms.domain.materialInventory.repository.po.MaterialInventoryPO; import com.mhd.wms.domain.materialInventory.service.MaterialInventoryDomainService; import com.mhd.wms.domain.materialMoreDetail.repository.po.MaterialMoreDetailPO; @@ -61,6 +62,8 @@ public class StockOutOrderApplicationService { @Autowired private MaterialInventoryDomainService materialInventoryDomainService; @Autowired + private MaterialInventoryMapper materialInventoryMapper; + @Autowired private UserServiceFeign userServiceFeign; @Autowired private SystemServiceFeign systemServiceFeign; @@ -173,7 +176,9 @@ public class StockOutOrderApplicationService { } /** - * 递归为出库物料明细设置更多属性(从物料明细表中获取值) + * 递归为出库物料明细设置更多属性 + * 如果已分配库存(materialInventoryId不为空),则从库存表中获取批次属性值 + * 否则从物料明细表中获取值 * @param outMaterialDetailPOList 出库物料明细列表 * @param batchDetailMap 批次属性Map */ @@ -185,6 +190,7 @@ public class StockOutOrderApplicationService { outMaterialDetailPOList.forEach(outMaterialDetailPO -> { Long materialBaseInfoId = outMaterialDetailPO.getMaterialBaseInfoId(); + Long materialInventoryId = outMaterialDetailPO.getMaterialInventoryId(); // 只保留isDisplay=1的批次属性(从batchDetailMap中获取,已经过滤过了) // 创建新的materialMoreDetailList,只包含isDisplay=1的属性 @@ -201,6 +207,17 @@ public class StockOutOrderApplicationService { } } + // 如果已分配库存,从库存表中获取批次属性值 + MaterialInventoryPO inventoryPO = null; + if (materialInventoryId != null && materialInventoryId > 0) { + try { + inventoryPO = materialInventoryMapper.selectByIdWithBatchAttributes(materialInventoryId); + log.info("从库存表获取批次属性,materialInventoryId={}", materialInventoryId); + } catch (Exception e) { + log.warn("从库存表获取批次属性失败,materialInventoryId={},错误:{}", materialInventoryId, e.getMessage()); + } + } + if (materialBaseInfoId != null && batchDetailMap.containsKey(materialBaseInfoId)) { List batchDetailFeignPOList = batchDetailMap.get(materialBaseInfoId); // 用于跟踪已添加到列表中的batchDetailId @@ -236,15 +253,39 @@ public class StockOutOrderApplicationService { addedBatchDetailIds.add(batchDetailId); } - // 根据fieldName或batchLabels从物料明细中获取对应的字段值 - if (outMaterialDetailPO != null) { - String fieldValue = null; - String usedFieldName = null; + // 根据fieldName或batchLabels获取对应的字段值 + String fieldValue = null; + String usedFieldName = null; + + // 优先从库存表获取值(如果已分配库存) + if (inventoryPO != null) { + // 优先使用fieldName(如果存在) + if (StringUtils.isNotBlank(batchDetailFeignPO.getFieldName())) { + usedFieldName = batchDetailFeignPO.getFieldName(); + fieldValue = getFieldValueByFieldName(inventoryPO, usedFieldName); + log.info("批次属性 batchDetailId={}, fieldName={}, 从库存表获取到的值={}", + batchDetailFeignPO.getBatchDetailId(), usedFieldName, fieldValue); + } + // 如果fieldName为空,尝试根据batchLabels映射到字段名 + else if (StringUtils.isNotBlank(batchDetailFeignPO.getBatchLabels())) { + String fieldNameByLabel = getFieldNameByBatchLabel(batchDetailFeignPO.getBatchLabels()); + if (StringUtils.isNotBlank(fieldNameByLabel)) { + usedFieldName = fieldNameByLabel; + fieldValue = getFieldValueByFieldName(inventoryPO, usedFieldName); + log.info("批次属性 batchDetailId={}, batchLabels={}, 映射字段名={}, 从库存表获取到的值={}", + batchDetailFeignPO.getBatchDetailId(), batchDetailFeignPO.getBatchLabels(), + usedFieldName, fieldValue); + } + } + } + + // 如果从库存表没有获取到值,且未分配库存,则从物料明细表中获取值 + if (fieldValue == null && inventoryPO == null && outMaterialDetailPO != null) { // 优先使用fieldName(如果存在) if (StringUtils.isNotBlank(batchDetailFeignPO.getFieldName())) { usedFieldName = batchDetailFeignPO.getFieldName(); fieldValue = getFieldValueByFieldName(outMaterialDetailPO, usedFieldName); - log.info("批次属性 batchDetailId={}, fieldName={}, 获取到的值={}", + log.info("批次属性 batchDetailId={}, fieldName={}, 从物料明细表获取到的值={}", batchDetailFeignPO.getBatchDetailId(), usedFieldName, fieldValue); } // 如果fieldName为空,尝试根据batchLabels映射到字段名 @@ -253,24 +294,26 @@ public class StockOutOrderApplicationService { if (StringUtils.isNotBlank(fieldNameByLabel)) { usedFieldName = fieldNameByLabel; fieldValue = getFieldValueByFieldName(outMaterialDetailPO, usedFieldName); - log.info("批次属性 batchDetailId={}, batchLabels={}, 映射字段名={}, 获取到的值={}", + log.info("批次属性 batchDetailId={}, batchLabels={}, 映射字段名={}, 从物料明细表获取到的值={}", batchDetailFeignPO.getBatchDetailId(), batchDetailFeignPO.getBatchLabels(), usedFieldName, fieldValue); } } - // 只有当获取到值时才更新attributeValue(避免覆盖已有的值) - if (fieldValue != null) { - materialMoreDetailPO.setAttributeValue(fieldValue); - log.info("设置更多属性:batchDetailId={}, batchLabels={}, attributeValue={}", - materialMoreDetailPO.getBatchDetailId(), materialMoreDetailPO.getBatchLabels(), - materialMoreDetailPO.getAttributeValue()); - } + } + + // 只有当获取到值时才更新attributeValue(避免覆盖已有的值) + if (fieldValue != null) { + materialMoreDetailPO.setAttributeValue(fieldValue); + log.info("设置更多属性:batchDetailId={}, batchLabels={}, attributeValue={}", + materialMoreDetailPO.getBatchDetailId(), materialMoreDetailPO.getBatchLabels(), + materialMoreDetailPO.getAttributeValue()); } } } outMaterialDetailPO.setMaterialMoreDetailList(materialMoreDetailList); - log.info("出库物料明细 uniqueId={}, materialBaseInfoId={}, materialMoreDetailList大小={}", + log.info("出库物料明细 uniqueId={}, materialBaseInfoId={}, materialInventoryId={}, materialMoreDetailList大小={}", outMaterialDetailPO.getUniqueId(), outMaterialDetailPO.getMaterialBaseInfoId(), + outMaterialDetailPO.getMaterialInventoryId(), materialMoreDetailList != null ? materialMoreDetailList.size() : 0); // 递归处理子集 diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialInventory/MaterialInventoryQueryListDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialInventory/MaterialInventoryQueryListDTO.java index e91222bed..a1c0a8fa0 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialInventory/MaterialInventoryQueryListDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialInventory/MaterialInventoryQueryListDTO.java @@ -168,4 +168,16 @@ public class MaterialInventoryQueryListDTO extends MaterialBaseDTO { @ApiModelProperty("物料/库位信息") @Excel(name = "物料/库位信息") private String storageInfo; + + @ApiModelProperty("Batch Ref NO's") + @Excel(name = "Batch Ref NO's") + private String batchRefNo; + + @ApiModelProperty("Sheet Ref NO's") + @Excel(name = "Sheet Ref NO's") + private String sheetRefNo; + + @ApiModelProperty("箱号/卡板号") + @Excel(name = "箱号/卡板号") + private String boxPalletNo; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java index 8ba8ebf50..528949e51 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java @@ -24,7 +24,6 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.IOException; -import java.util.ArrayList; import java.util.List; /** @@ -165,48 +164,7 @@ public class StockOutOrderApi extends BaseController { return toAjax(stockOutOrderApplicationService.cancelAssign(stockOutOrderDO)); } - /** - * 手动取消分配(点击确认后直接取消分配) - * 前端点击取消分配按钮时弹出确认对话框,点击确认后调用此接口 - * 只需要传递出库单ID和物料明细ID,会自动取消该明细的所有已分配数量 - */ - @ApiOperation("手动取消分配") - @PostMapping("/manualCancelAssign") - public AjaxResult manualCancelAssign(@RequestBody StockOutOrderDTO stockOutOrderDTO) { - // 检查参数 - if (stockOutOrderDTO.getOutOrderId() == null) { - return error("出库单ID不能为空"); - } - if (stockOutOrderDTO.getMaterialDetailList() == null || stockOutOrderDTO.getMaterialDetailList().isEmpty()) { - return error("物料明细不能为空,请选择要取消分配的物料明细"); - } - - StockOutOrderDO stockOutOrderDO = new StockOutOrderDO(); - BeanUtils.copyProperties(stockOutOrderDTO, stockOutOrderDO); - // 转换物料明细列表,手动转换确保materialDetailId字段正确传递 - List materialDetailList = new ArrayList<>(); - for (OutMaterialDetailDTO detailDTO : stockOutOrderDTO.getMaterialDetailList()) { - OutMaterialDetailDO detailDO = new OutMaterialDetailDO(); - // 只复制必要的字段,确保materialDetailId被正确传递 - detailDO.setMaterialDetailId(detailDTO.getMaterialDetailId()); - detailDO.setUniqueId(detailDTO.getUniqueId()); - detailDO.setAllocationQuantity(detailDTO.getAllocationQuantity()); - // 如果有子明细,也转换 - if (detailDTO.getMaterialDetailList() != null && !detailDTO.getMaterialDetailList().isEmpty()) { - List children = new ArrayList<>(); - for (OutMaterialDetailDTO childDTO : detailDTO.getMaterialDetailList()) { - OutMaterialDetailDO childDO = new OutMaterialDetailDO(); - childDO.setMaterialDetailId(childDTO.getMaterialDetailId()); - childDO.setAllocationQuantity(childDTO.getAllocationQuantity()); - children.add(childDO); - } - detailDO.setChildren(children); - } - materialDetailList.add(detailDO); - } - stockOutOrderDO.setMaterialDetailList(materialDetailList); - return toAjax(stockOutOrderApplicationService.manualCancelAssign(stockOutOrderDO)); - } + /** * 生成拣货单