Merge remote-tracking branch 'origin/wms_dev' 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.entity.StockReceiptOrder;
|
||||||
import com.mhd.wms.domain.stockReceiptOrder.repository.mapper.StockReceiptOrderMapper;
|
import com.mhd.wms.domain.stockReceiptOrder.repository.mapper.StockReceiptOrderMapper;
|
||||||
import com.mhd.wms.domain.stockReceiptOrder.repository.todo.StockReceiptOrderDO;
|
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.BeanUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import com.mhd.common.core.utils.StringUtils;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -67,6 +72,12 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
|
|||||||
private IdGenerator idGenerator;
|
private IdGenerator idGenerator;
|
||||||
@Resource
|
@Resource
|
||||||
private SystemServiceFeign systemServiceFeign;
|
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("物料明细不能为空");
|
throw new ServiceException("物料明细不能为空");
|
||||||
}
|
}
|
||||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
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<ReceiptMaterialDetail> receiptMaterialDetailList = new ArrayList<>();
|
||||||
// 批量修改更多属性和新增序列号
|
// 批量修改更多属性和新增序列号
|
||||||
List<MaterialMoreDetail> materialMoreDetailList = new ArrayList<>();
|
List<MaterialMoreDetail> materialMoreDetailList = new ArrayList<>();
|
||||||
List<InMaterialDetailSerialNumber> materialDetailSerialNumberList = new ArrayList<>();
|
List<InMaterialDetailSerialNumber> materialDetailSerialNumberList = new ArrayList<>();
|
||||||
for (ReceiptMaterialDetailDO receiptMaterialDetailDO : receiptMaterialDetailDOList){
|
for (ReceiptMaterialDetailDO receiptMaterialDetailDO : receiptMaterialDetailDOList){
|
||||||
|
// 自动生成批次号并校验唯一性(包括子项)
|
||||||
|
generateAndValidateBatchNumber(receiptMaterialDetailDO, shipperId);
|
||||||
//更多属性
|
//更多属性
|
||||||
materialMoreDetailList.addAll(genMaterialMoreDetail(receiptMaterialDetailDO));
|
materialMoreDetailList.addAll(genMaterialMoreDetail(receiptMaterialDetailDO));
|
||||||
//序列号
|
//序列号
|
||||||
@@ -344,7 +373,7 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
|
|||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
private void fillAttributeValueFromInMaterialDetail(ReceiptMaterialDetailPO receiptMaterialDetailPO, List<MaterialMoreDetailPO> materialMoreDetailList) {
|
private void fillAttributeValueFromInMaterialDetail(ReceiptMaterialDetailPO receiptMaterialDetailPO, List<MaterialMoreDetailPO> materialMoreDetailList) {
|
||||||
if (CollectionUtils.isEmpty(materialMoreDetailList) || receiptMaterialDetailPO.getInUniqueId() == null) {
|
if (receiptMaterialDetailPO.getInUniqueId() == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 查询入库单明细
|
// 查询入库单明细
|
||||||
@@ -355,6 +384,26 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
|
|||||||
if (inMaterialDetail == null) {
|
if (inMaterialDetail == null) {
|
||||||
return;
|
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
|
// 根据attributeOption从入库单明细中获取对应的值并填充到attributeValue
|
||||||
for (MaterialMoreDetailPO materialMoreDetail : materialMoreDetailList) {
|
for (MaterialMoreDetailPO materialMoreDetail : materialMoreDetailList) {
|
||||||
String attributeOption = materialMoreDetail.getAttributeOption();
|
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 = "物料条形码")
|
@Excel(name = "物料条形码")
|
||||||
private String barCode;
|
private String barCode;
|
||||||
|
|
||||||
|
@ApiModelProperty("规格型号")
|
||||||
|
@Excel(name = "规格型号")
|
||||||
|
private String specificationModel;
|
||||||
|
|
||||||
@ApiModelProperty("计划数量")
|
@ApiModelProperty("计划数量")
|
||||||
@Excel(name = "计划数量")
|
@Excel(name = "计划数量")
|
||||||
private BigDecimal quantity;
|
private BigDecimal quantity;
|
||||||
|
|||||||
+4
@@ -64,6 +64,10 @@ public class ReceiptMaterialDetailDO extends BaseVOEntity {
|
|||||||
@Excel(name = "物料条形码")
|
@Excel(name = "物料条形码")
|
||||||
private String barCode;
|
private String barCode;
|
||||||
|
|
||||||
|
@ApiModelProperty("规格型号")
|
||||||
|
@Excel(name = "规格型号")
|
||||||
|
private String specificationModel;
|
||||||
|
|
||||||
@ApiModelProperty("计划数量")
|
@ApiModelProperty("计划数量")
|
||||||
@Excel(name = "计划数量")
|
@Excel(name = "计划数量")
|
||||||
private BigDecimal quantity;
|
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="materialCode" column="material_code" />
|
||||||
<result property="materialName" column="MATERIAL_NAME" />
|
<result property="materialName" column="MATERIAL_NAME" />
|
||||||
<result property="barCode" column="bar_code" />
|
<result property="barCode" column="bar_code" />
|
||||||
|
<result property="specificationModel" column="specification_model" />
|
||||||
<result property="quantity" column="quantity" />
|
<result property="quantity" column="quantity" />
|
||||||
<result property="receiptQuantity" column="receipt_quantity" />
|
<result property="receiptQuantity" column="receipt_quantity" />
|
||||||
<result property="receiptStatus" column="receipt_status" />
|
<result property="receiptStatus" column="receipt_status" />
|
||||||
@@ -69,10 +70,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
|
|
||||||
|
|
||||||
<sql id="selectReceiptMaterialDetailPo">
|
<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
|
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
|
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 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>
|
||||||
|
|
||||||
<sql id="selectReceiptMaterialDetailPo1">
|
<sql id="selectReceiptMaterialDetailPo1">
|
||||||
|
|||||||
Reference in New Issue
Block a user