Merge branch 'dev_qinhongzhanWMS' into wms_dev
This commit is contained in:
+130
-1
@@ -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 + "相同的记录不允许使用重复的批次号");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+4
@@ -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;
|
||||
|
||||
+4
@@ -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;
|
||||
|
||||
+8
-1
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user