From d9ec7cd3529519edc42473d7c5b9a2de21f74bce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Wed, 28 Jan 2026 13:29:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=A5=E5=BA=93=E7=AE=A1=E7=90=86=E6=94=B6?= =?UTF-8?q?=E8=B4=A7=E6=89=93=E5=8D=B0=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReceiptMaterialDetailImpl.java | 131 +++++++++++++++++- .../po/ReceiptMaterialDetailPO.java | 4 + .../todo/ReceiptMaterialDetailDO.java | 4 + .../ReceiptMaterialDetailMapper.xml | 9 +- 4 files changed, 146 insertions(+), 2 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java index ca59b61f7..3aeec1fd9 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java @@ -33,11 +33,16 @@ import com.mhd.wms.domain.receiptMaterialDetail.repository.todo.ReceiptMaterialD import com.mhd.wms.domain.stockReceiptOrder.entity.StockReceiptOrder; import com.mhd.wms.domain.stockReceiptOrder.repository.mapper.StockReceiptOrderMapper; import com.mhd.wms.domain.stockReceiptOrder.repository.todo.StockReceiptOrderDO; +import com.mhd.wms.domain.materialInventory.entity.MaterialInventory; +import com.mhd.wms.domain.materialInventory.repository.facade.IMaterialInventoryService; +import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryDO; +import com.mhd.wms.domain.materialInventory.repository.mapper.MaterialInventoryMapper; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import com.mhd.common.core.utils.StringUtils; import javax.annotation.Resource; import java.util.ArrayList; @@ -67,6 +72,12 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl stockInOrderList = stockInOrderService.queryList(stockInOrderDO); + if (!CollectionUtils.isEmpty(stockInOrderList)) { + shipperId = stockInOrderList.get(0).getShipperId(); + } + } catch (Exception e) { + // 如果获取失败,记录日志但继续处理 + } + } + //批量新增或修改物料信息 List receiptMaterialDetailList = new ArrayList<>(); // 批量修改更多属性和新增序列号 List materialMoreDetailList = new ArrayList<>(); List materialDetailSerialNumberList = new ArrayList<>(); for (ReceiptMaterialDetailDO receiptMaterialDetailDO : receiptMaterialDetailDOList){ + // 自动生成批次号并校验唯一性(包括子项) + generateAndValidateBatchNumber(receiptMaterialDetailDO, shipperId); //更多属性 materialMoreDetailList.addAll(genMaterialMoreDetail(receiptMaterialDetailDO)); //序列号 @@ -344,7 +373,7 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl materialMoreDetailList) { - if (CollectionUtils.isEmpty(materialMoreDetailList) || receiptMaterialDetailPO.getInUniqueId() == null) { + if (receiptMaterialDetailPO.getInUniqueId() == null) { return; } // 查询入库单明细 @@ -355,6 +384,26 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl children = receiptMaterialDetailDO.getChildren(); + if (!CollectionUtils.isEmpty(children)) { + for (ReceiptMaterialDetailDO child : children) { + generateAndValidateBatchNumber(child, shipperId); + } + } + } + + /** + * @description 为单个收货明细生成批次号并校验唯一性 + * @author Auto + * @date 2026/1/28 + * @param receiptMaterialDetailDO 收货明细 + * @param shipperId 货主ID + * @return void + */ + private void processBatchNumberForDetail(ReceiptMaterialDetailDO receiptMaterialDetailDO, Long shipperId) { + if (receiptMaterialDetailDO == null) { + return; + } + + Long materialBaseInfoId = receiptMaterialDetailDO.getMaterialBaseInfoId(); + String materialStatusCode = receiptMaterialDetailDO.getMaterialStatusCode(); + String batchNumber = receiptMaterialDetailDO.getBatchNumber(); + + // 如果批次号为空,自动生成 + if (batchNumber == null || batchNumber.trim().isEmpty()) { + batchNumber = OrderSequence.getOrderCode("PC"); // PC = 批次号前缀 + receiptMaterialDetailDO.setBatchNumber(batchNumber); + } + + // 校验批次号唯一性:货主+商品+库存属性值相同时,批次号不能重复 + if (shipperId != null && materialBaseInfoId != null && batchNumber != null && !batchNumber.trim().isEmpty()) { + // 使用 LambdaQueryWrapper 查询库存表中是否存在相同的货主+商品+库存属性值+批次号的记录 + com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper wrapper = + new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(MaterialInventory::getShipperId, shipperId) + .eq(MaterialInventory::getMaterialBaseInfoId, materialBaseInfoId) + .eq(MaterialInventory::getBatchNumber, batchNumber) + .eq(MaterialInventory::getDelFlag, 1); + + // 如果库存属性值不为空,需要精确匹配;如果为空,查询库存属性值为空或null的记录 + if (materialStatusCode != null && !materialStatusCode.trim().isEmpty()) { + wrapper.eq(MaterialInventory::getMaterialStatusCode, materialStatusCode); + } else { + // 如果库存属性值为空,查询库存属性值为null或空字符串的记录 + wrapper.and(w -> w.isNull(MaterialInventory::getMaterialStatusCode) + .or() + .eq(MaterialInventory::getMaterialStatusCode, "")); + } + + List existingInventoryList = materialInventoryMapper.selectList(wrapper); + + // 如果存在相同的货主+商品+库存属性值+批次号的记录,抛出异常 + if (!CollectionUtils.isEmpty(existingInventoryList)) { + String statusCodeDesc = (materialStatusCode != null && !materialStatusCode.trim().isEmpty()) + ? ",库存属性值:" + materialStatusCode + : ",库存属性值:空"; + throw new ServiceException("批次号【" + batchNumber + "】已存在,货主ID【" + shipperId + "】+商品ID【" + materialBaseInfoId + "】" + statusCodeDesc + "相同的记录不允许使用重复的批次号"); + } + } + } + } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/po/ReceiptMaterialDetailPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/po/ReceiptMaterialDetailPO.java index ef3835c3e..f16bbd0d5 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/po/ReceiptMaterialDetailPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/po/ReceiptMaterialDetailPO.java @@ -66,6 +66,10 @@ public class ReceiptMaterialDetailPO extends BaseVOEntity { @Excel(name = "物料条形码") private String barCode; + @ApiModelProperty("规格型号") + @Excel(name = "规格型号") + private String specificationModel; + @ApiModelProperty("计划数量") @Excel(name = "计划数量") private BigDecimal quantity; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/todo/ReceiptMaterialDetailDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/todo/ReceiptMaterialDetailDO.java index d00d21761..b57a51108 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/todo/ReceiptMaterialDetailDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/todo/ReceiptMaterialDetailDO.java @@ -64,6 +64,10 @@ public class ReceiptMaterialDetailDO extends BaseVOEntity { @Excel(name = "物料条形码") private String barCode; + @ApiModelProperty("规格型号") + @Excel(name = "规格型号") + private String specificationModel; + @ApiModelProperty("计划数量") @Excel(name = "计划数量") private BigDecimal quantity; diff --git a/mhd_wms/src/main/resources/mapper/receiptMaterialDetail/ReceiptMaterialDetailMapper.xml b/mhd_wms/src/main/resources/mapper/receiptMaterialDetail/ReceiptMaterialDetailMapper.xml index ffec31046..c49d35bb2 100644 --- a/mhd_wms/src/main/resources/mapper/receiptMaterialDetail/ReceiptMaterialDetailMapper.xml +++ b/mhd_wms/src/main/resources/mapper/receiptMaterialDetail/ReceiptMaterialDetailMapper.xml @@ -15,6 +15,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -69,10 +70,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select a.MATERIAL_DETAIL_ID, a.ORGANIZATION_ID, a.ORGANIZATION_NAME, a.TOP_ORGANIZATION_ID, a.UNIQUE_ID, a.RECEIPT_ORDER_NUMBER, a.MATERIAL_BASE_INFO_ID, a.MATERIAL_CODE, a.MATERIAL_NAME, a.BAR_CODE, a.QUANTITY, a.ALREADY_RECEIPT_QUANTITY, a.RECEIPT_QUANTITY, a.RECEIPT_STATUS, a.PACK_ID, a.PACK_CODE, a.PACK_NAME, a.PACK_DETAIL_ID, a.UNIT_CODE, a.UNIT_NAME, a.UNIT_NUMBER, a.MATERIAL_WAREHOUSE_CONTROL_ID, a.SERIAL_NUMBER_MANAGE, a.QUALITY_INSPECTION_MANAGE, a.QUALITY_INSPECTION_STAGE, a.QUALITY_INSPECTION_RULE, a.QUALITY_INSPECTION_RATIO, a.QUALITY_INSPECTION_TERM, a.QUALITY_INSPECTION_RESULTS, a.ALLOW_OVERCHARGE, a.OVERCHARGE_RATIO, a.BATCH_NUMBER, a.MATERIAL_STATUS_CODE, a.MATERIAL_STATUS_NAME, a.DISTRIBUTE_RULE_ID, a.DISTRIBUTE_RULE_CODE, a.DISTRIBUTE_RULE_NAME, a.CONTAINER_ID, a.CONTAINER_CODE, a.CONTAINER_TYPE, a.CONTAINER_TYPE_NAME, a.LEVEL, a.PARENT_UNIQUE_ID, a.IN_UNIQUE_ID, a.ALLOW_MODIFY, a.REMARK, a.CREATE_TIME, a.CREATE_BY, a.CREATE_BY_NAME, a.UPDATE_TIME, a.UPDATE_BY, a.UPDATE_BY_NAME, a.GEN_STOCK_SHELF, a.DEL_FLAG, + select a.MATERIAL_DETAIL_ID, a.ORGANIZATION_ID, a.ORGANIZATION_NAME, a.TOP_ORGANIZATION_ID, a.UNIQUE_ID, a.RECEIPT_ORDER_NUMBER, a.MATERIAL_BASE_INFO_ID, + ifnull(a.MATERIAL_CODE, c.MATERIAL_CODE) MATERIAL_CODE, + ifnull(a.MATERIAL_NAME, c.MATERIAL_NAME) MATERIAL_NAME, + a.BAR_CODE, + c.SPECIFICATION_MODEL, + a.QUANTITY, a.ALREADY_RECEIPT_QUANTITY, a.RECEIPT_QUANTITY, a.RECEIPT_STATUS, a.PACK_ID, a.PACK_CODE, a.PACK_NAME, a.PACK_DETAIL_ID, a.UNIT_CODE, a.UNIT_NAME, a.UNIT_NUMBER, a.MATERIAL_WAREHOUSE_CONTROL_ID, a.SERIAL_NUMBER_MANAGE, a.QUALITY_INSPECTION_MANAGE, a.QUALITY_INSPECTION_STAGE, a.QUALITY_INSPECTION_RULE, a.QUALITY_INSPECTION_RATIO, a.QUALITY_INSPECTION_TERM, a.QUALITY_INSPECTION_RESULTS, a.ALLOW_OVERCHARGE, a.OVERCHARGE_RATIO, a.BATCH_NUMBER, a.MATERIAL_STATUS_CODE, a.MATERIAL_STATUS_NAME, a.DISTRIBUTE_RULE_ID, a.DISTRIBUTE_RULE_CODE, a.DISTRIBUTE_RULE_NAME, a.CONTAINER_ID, a.CONTAINER_CODE, a.CONTAINER_TYPE, a.CONTAINER_TYPE_NAME, a.LEVEL, a.PARENT_UNIQUE_ID, a.IN_UNIQUE_ID, a.ALLOW_MODIFY, a.REMARK, a.CREATE_TIME, a.CREATE_BY, a.CREATE_BY_NAME, a.UPDATE_TIME, a.UPDATE_BY, a.UPDATE_BY_NAME, a.GEN_STOCK_SHELF, a.DEL_FLAG, b.TOTAL_NET_WEIGHT, b.TOTAL_GROSS_WEIGHT, b.TOTAL_VOLUME, b.TOTAL_AREA, b.INVOICE_NO, b.BATCH_REF_NO, b.SHEET_REF_NO, b.BOX_PALLET_NO from RECEIPT_MATERIAL_DETAIL a LEFT JOIN IN_MATERIAL_DETAIL b ON a.IN_UNIQUE_ID = b.UNIQUE_ID AND b.DEL_FLAG = 1 + LEFT JOIN MATERIAL_BASE_INFO c ON a.MATERIAL_BASE_INFO_ID = c.MATERIAL_BASE_INFO_ID AND c.DEL_FLAG = 1