From 5f230d03ea46eafccfb507b87acda16f6ec95878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Thu, 5 Feb 2026 09:11:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=8B=E5=8A=A8=E5=88=86=E9=85=8D=EF=BC=88?= =?UTF-8?q?=E5=8F=96=E6=B6=88=E5=88=86=E9=85=8D=EF=BC=89=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StockOutOrderApplicationService.java | 46 +++------ .../entity/OutMaterialDetail.java | 36 +++++++ .../persistence/OutMaterialDetailImpl.java | 98 ++++++++++++++++--- .../repository/po/OutMaterialDetailPO.java | 3 + .../repository/todo/OutMaterialDetailDO.java | 3 + .../OutMaterialDetailDTO.java | 3 + 6 files changed, 144 insertions(+), 45 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 0a1b1e33c..79b5e8fc5 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 @@ -192,7 +192,6 @@ public class StockOutOrderApplicationService { Long materialBaseInfoId = outMaterialDetailPO.getMaterialBaseInfoId(); Long materialInventoryId = outMaterialDetailPO.getMaterialInventoryId(); - // 只保留isDisplay=1的批次属性(从batchDetailMap中获取,已经过滤过了) // 创建新的materialMoreDetailList,只包含isDisplay=1的属性 List materialMoreDetailList = new ArrayList<>(); @@ -218,6 +217,7 @@ public class StockOutOrderApplicationService { } } + // 只保留isDisplay=1的批次属性(从batchDetailMap中获取,已经过滤过了) if (materialBaseInfoId != null && batchDetailMap.containsKey(materialBaseInfoId)) { List batchDetailFeignPOList = batchDetailMap.get(materialBaseInfoId); // 用于跟踪已添加到列表中的batchDetailId @@ -257,7 +257,7 @@ public class StockOutOrderApplicationService { String fieldValue = null; String usedFieldName = null; - // 优先从库存表获取值(如果已分配库存) + // 只有在已分配库存时,才从库存表获取值并设置到attributeValue if (inventoryPO != null) { // 优先使用fieldName(如果存在) if (StringUtils.isNotBlank(batchDetailFeignPO.getFieldName())) { @@ -277,36 +277,18 @@ public class StockOutOrderApplicationService { 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={}, 从物料明细表获取到的值={}", - 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(outMaterialDetailPO, usedFieldName); - 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()); + } else { + // 未分配库存时,attributeValue保持为空(不设置值) + log.info("批次属性未分配库存,batchDetailId={}, batchLabels={}, attributeValue为空", + materialMoreDetailPO.getBatchDetailId(), materialMoreDetailPO.getBatchLabels()); } } } @@ -941,6 +923,8 @@ public class StockOutOrderApplicationService { outMaterialDetailDO.setContainerCode(materialInventoryPO.getContainerCode()); outMaterialDetailDO.setContainerType(materialInventoryPO.getContainerType()); outMaterialDetailDO.setContainerTypeName(materialInventoryPO.getContainerTypeName()); + // 库存数量,仅用于前端展示 + outMaterialDetailDO.setInventoryQuantity(materialInventoryPO.getInventoryQuantity()); } /** diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/entity/OutMaterialDetail.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/entity/OutMaterialDetail.java index 632a2512a..9580dadbb 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/entity/OutMaterialDetail.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/entity/OutMaterialDetail.java @@ -11,6 +11,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; +import java.util.Date; /** @@ -386,6 +387,41 @@ public class OutMaterialDetail extends BaseVOEntity { @Excel(name = "单位") private String unit; + @ApiModelProperty("扩展属性1") + @Excel(name = "扩展属性1") + private String extAttr1; + + @ApiModelProperty("扩展属性2") + @Excel(name = "扩展属性2") + private String extAttr2; + + @ApiModelProperty("生产日期") + @Excel(name = "生产日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date productionDate; + + @ApiModelProperty("过期日期") + @Excel(name = "过期日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date expiryDate; + + @ApiModelProperty("存货日期") + @Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date inventoryDate; + + @ApiModelProperty("扩展属性3") + @Excel(name = "扩展属性3", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date extAttr3; + + @ApiModelProperty("扩展属性4") + @Excel(name = "扩展属性4", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date extAttr4; + + /** + * 库存数量(仅用于前端展示,从material_inventory表中带出) + */ + @ApiModelProperty("库存数量") + @TableField(exist = false) + private BigDecimal inventoryQuantity; + @TableField(exist = false) private BigDecimal actualQuantity; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java index 4e4a38941..293bfbd1b 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java @@ -377,10 +377,23 @@ public class OutMaterialDetailImpl extends ServiceImpl 0){ throw new ServiceException("物料" + outMaterialDetailDb.getMaterialName() + ",取消分配数量不能大于已分配数量"); } - // 取消分配:只减少已分配数量,分配数量保持不变 - // 取消分配的目的是:把之前分配给库存的分配给取消掉,让库存可以重新分配 - // allocation_quantity(分配数量)不应该减少,因为取消分配后可以重新分配 - // already_allocation_quantity(已分配数量)应该减少,表示取消了多少已分配的数量 BigDecimal dbAllocationQuantity = outMaterialDetailDb.getAllocationQuantity() != null ? outMaterialDetailDb.getAllocationQuantity() : BigDecimal.ZERO; - // 分配数量保持不变(取消分配后可以重新分配) - outMaterialDetail.setAllocationQuantity(dbAllocationQuantity); - // 已分配数量减少(取消已分配的数量) + // 分配数量和已分配数量都减少:本次手动取消分配视为“把这条明细已分配的全部撤回” + BigDecimal newAllocationQuantity = dbAllocationQuantity.subtract(allocationQuantity); + if (newAllocationQuantity.compareTo(BigDecimal.ZERO) < 0) { + throw new ServiceException("物料" + outMaterialDetailDb.getMaterialName() + ",取消分配数量不能大于分配总数"); + } + outMaterialDetail.setAllocationQuantity(newAllocationQuantity); outMaterialDetail.setAlreadyAllocationQuantity(dbAlreadyAllocationQuantity.subtract(allocationQuantity)); + + // 同时清空该明细的目标仓库/库区/库位信息(回到未分配状态) + outMaterialDetail.setWarehouseId(null); + outMaterialDetail.setWarehouseCode(null); + outMaterialDetail.setWarehouseName(null); + outMaterialDetail.setStorageSectionId(null); + outMaterialDetail.setStorageCode(null); + outMaterialDetail.setStorageName(null); + outMaterialDetail.setStorageLocationId(null); + outMaterialDetail.setStorageLocationCode(null); + outMaterialDetail.setStorageLocationName(null); + + // 清空与分配库存相关的批次、容器信息 + outMaterialDetail.setMaterialInventoryId(null); + outMaterialDetail.setBatchNumber(null); + outMaterialDetail.setMaterialStatusCode(null); + outMaterialDetail.setMaterialStatusName(null); + outMaterialDetail.setContainerId(null); + outMaterialDetail.setContainerCode(null); + outMaterialDetail.setContainerType(null); + outMaterialDetail.setContainerTypeName(null); // 设置 actualQuantity 用于 qxfp 方法更新库存(取消分配的数量) outMaterialDetail.setActualQuantity(allocationQuantity); outMaterialDetailList.add(outMaterialDetail); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailPO.java index f6b19dbb1..0912d00c3 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailPO.java @@ -168,6 +168,9 @@ public class OutMaterialDetailPO extends StockOutOrderBaseDO { @Excel(name = "容器类型名称 数据字典") private String containerTypeName; + @ApiModelProperty("库存数量(仅展示)") + private BigDecimal inventoryQuantity; + @ApiModelProperty("分配仓库id") private Long warehouseId; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/todo/OutMaterialDetailDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/todo/OutMaterialDetailDO.java index 1e362dcc5..502f3492e 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/todo/OutMaterialDetailDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/todo/OutMaterialDetailDO.java @@ -158,6 +158,9 @@ public class OutMaterialDetailDO extends BaseVOEntity { @Excel(name = "容器类型名称 数据字典") private String containerTypeName; + @ApiModelProperty("库存数量(仅展示)") + private BigDecimal inventoryQuantity; + @ApiModelProperty("分配仓库id") private Long warehouseId; diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outMaterialDetail/OutMaterialDetailDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outMaterialDetail/OutMaterialDetailDTO.java index aba09239d..edc9cfa9b 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outMaterialDetail/OutMaterialDetailDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outMaterialDetail/OutMaterialDetailDTO.java @@ -167,6 +167,9 @@ public class OutMaterialDetailDTO extends BaseVOEntity { @Excel(name = "容器类型名称 数据字典") private String containerTypeName; + @ApiModelProperty("库存数量(仅展示)") + private BigDecimal inventoryQuantity; + @ApiModelProperty("分配仓库id") private Long warehouseId;