入库管理收货打印修改

This commit is contained in:
秦鸿展
2026-01-28 13:29:50 +08:00
parent c88d22c185
commit d9ec7cd352
4 changed files with 146 additions and 2 deletions
@@ -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<ReceiptMaterialDetail
private IdGenerator idGenerator;
@Resource
private SystemServiceFeign systemServiceFeign;
@Autowired
private IMaterialInventoryService materialInventoryService;
@Autowired
private com.mhd.wms.domain.stockInOrder.repository.facade.IStockInOrderService stockInOrderService;
@Autowired
private MaterialInventoryMapper materialInventoryMapper;
/**
* 查询物料明细列表
*/
@@ -204,12 +215,30 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
throw new ServiceException("物料明细不能为空");
}
LoginUser loginUser = SecurityUtils.getLoginUser();
// 获取货主ID(从收货单中获取)
Long shipperId = stockReceiptOrderDO.getShipperId();
// 如果收货单中没有货主ID,尝试从入库单获取
if (shipperId == null && stockReceiptOrderDO.getInOrderNumber() != null) {
try {
com.mhd.wms.domain.stockInOrder.repository.todo.StockInOrderDO stockInOrderDO = new com.mhd.wms.domain.stockInOrder.repository.todo.StockInOrderDO();
stockInOrderDO.setInOrderNumber(stockReceiptOrderDO.getInOrderNumber());
List<com.mhd.wms.domain.stockInOrder.repository.po.StockInOrderPO> stockInOrderList = stockInOrderService.queryList(stockInOrderDO);
if (!CollectionUtils.isEmpty(stockInOrderList)) {
shipperId = stockInOrderList.get(0).getShipperId();
}
} catch (Exception e) {
// 如果获取失败,记录日志但继续处理
}
}
//批量新增或修改物料信息
List<ReceiptMaterialDetail> receiptMaterialDetailList = new ArrayList<>();
// 批量修改更多属性和新增序列号
List<MaterialMoreDetail> materialMoreDetailList = new ArrayList<>();
List<InMaterialDetailSerialNumber> materialDetailSerialNumberList = new ArrayList<>();
for (ReceiptMaterialDetailDO receiptMaterialDetailDO : receiptMaterialDetailDOList){
// 自动生成批次号并校验唯一性(包括子项)
generateAndValidateBatchNumber(receiptMaterialDetailDO, shipperId);
//更多属性
materialMoreDetailList.addAll(genMaterialMoreDetail(receiptMaterialDetailDO));
//序列号
@@ -344,7 +373,7 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
* @return void
*/
private void fillAttributeValueFromInMaterialDetail(ReceiptMaterialDetailPO receiptMaterialDetailPO, List<MaterialMoreDetailPO> materialMoreDetailList) {
if (CollectionUtils.isEmpty(materialMoreDetailList) || receiptMaterialDetailPO.getInUniqueId() == null) {
if (receiptMaterialDetailPO.getInUniqueId() == null) {
return;
}
// 查询入库单明细
@@ -355,6 +384,26 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
if (inMaterialDetail == null) {
return;
}
// 如果收货单明细中的料号、物料名称、规格型号、批次号为空,则从入库单明细中获取
if (StringUtils.isBlank(receiptMaterialDetailPO.getMaterialCode()) && StringUtils.isNotBlank(inMaterialDetail.getMaterialCode())) {
receiptMaterialDetailPO.setMaterialCode(inMaterialDetail.getMaterialCode());
}
if (StringUtils.isBlank(receiptMaterialDetailPO.getMaterialName()) && StringUtils.isNotBlank(inMaterialDetail.getMaterialName())) {
receiptMaterialDetailPO.setMaterialName(inMaterialDetail.getMaterialName());
}
if (StringUtils.isBlank(receiptMaterialDetailPO.getSpecificationModel()) && StringUtils.isNotBlank(inMaterialDetail.getSpecificationModel())) {
receiptMaterialDetailPO.setSpecificationModel(inMaterialDetail.getSpecificationModel());
}
if (StringUtils.isBlank(receiptMaterialDetailPO.getBatchNumber()) && StringUtils.isNotBlank(inMaterialDetail.getBatchNumber())) {
receiptMaterialDetailPO.setBatchNumber(inMaterialDetail.getBatchNumber());
}
// 如果materialMoreDetailList为空,直接返回
if (CollectionUtils.isEmpty(materialMoreDetailList)) {
return;
}
// 根据attributeOption从入库单明细中获取对应的值并填充到attributeValue
for (MaterialMoreDetailPO materialMoreDetail : materialMoreDetailList) {
String attributeOption = materialMoreDetail.getAttributeOption();
@@ -546,4 +595,84 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
);
}
/**
* @description 自动生成批次号并校验唯一性
* @author Auto
* @date 2026/1/28
* @param receiptMaterialDetailDO 收货明细
* @param shipperId 货主ID
* @return void
*/
private void generateAndValidateBatchNumber(ReceiptMaterialDetailDO receiptMaterialDetailDO, Long shipperId) {
if (receiptMaterialDetailDO == null) {
return;
}
// 处理当前明细
processBatchNumberForDetail(receiptMaterialDetailDO, shipperId);
// 递归处理子项
List<ReceiptMaterialDetailDO> 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<MaterialInventory> wrapper =
new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<MaterialInventory>()
.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<MaterialInventory> 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 + "相同的记录不允许使用重复的批次号");
}
}
}
}
@@ -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;
@@ -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;
@@ -15,6 +15,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="materialCode" column="material_code" />
<result property="materialName" column="MATERIAL_NAME" />
<result property="barCode" column="bar_code" />
<result property="specificationModel" column="specification_model" />
<result property="quantity" column="quantity" />
<result property="receiptQuantity" column="receipt_quantity" />
<result property="receiptStatus" column="receipt_status" />
@@ -69,10 +70,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<sql id="selectReceiptMaterialDetailPo">
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
</sql>
<sql id="selectReceiptMaterialDetailPo1">