From 15edc521582e08e0e59ee5da9eaec2f2049bb462 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期六, 24 十月 2026 21:57:46 +0800
Subject: [PATCH] fix(mes): 自动生成生产入库及倒冲领料单
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptServiceImpl.java | 77 ++++++++++++++++++++++++++++++++++++++
1 files changed, 77 insertions(+), 0 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptServiceImpl.java
index 6c39b88..dbdf2cc 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptServiceImpl.java
@@ -11,7 +11,11 @@
import cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.MesWmProductReceiptImportRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.MesWmProductReceiptPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.MesWmProductReceiptSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productreceipt.MesWmProductReceiptDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productreceipt.MesWmProductReceiptDetailDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productreceipt.MesWmProductReceiptLineDO;
@@ -19,10 +23,14 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productreceipt.MesWmProductReceiptMapper;
+import cn.iocoder.yudao.module.mes.dal.mysql.wm.productreceipt.MesWmProductReceiptLineMapper;
import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductReceiptStatusEnum;
+import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
+import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
+import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
@@ -34,6 +42,7 @@
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
+import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
@@ -51,6 +60,8 @@
@Resource
private MesWmProductReceiptMapper productReceiptMapper;
+ @Resource
+ private MesWmProductReceiptLineMapper productReceiptLineMapper;
@Resource
private MesWmProductReceiptLineService productReceiptLineService;
@@ -60,6 +71,10 @@
private MesWmTransactionService wmTransactionService;
@Resource
private MesProWorkOrderService workOrderService;
+ @Resource
+ private MesMdItemService mdItemService;
+ @Resource
+ private MesWmMaterialStockService materialStockService;
@Resource
private MesWmWarehouseService warehouseService;
@Resource
@@ -83,6 +98,68 @@
}
@Override
+ @Transactional(rollbackFor = Exception.class)
+ public Long generateProductReceipt(MesWmProductProduceDO produce,
+ List<MesWmProductProduceLineDO> produceLines) {
+ List<MesWmProductProduceLineDO> qualifiedLines = produceLines.stream()
+ .filter(line -> ObjUtil.equal(line.getQualityStatus(), MesWmQualityStatusEnum.PASS.getStatus()))
+ .filter(line -> line.getQuantity() != null && line.getQuantity().compareTo(BigDecimal.ZERO) > 0)
+ .toList();
+ if (CollUtil.isEmpty(qualifiedLines)) {
+ return null;
+ }
+
+ String code = "AUTO-PR-" + produce.getId();
+ MesWmProductReceiptDO existing = productReceiptMapper.selectByCode(code);
+ if (existing != null) {
+ return existing.getId();
+ }
+
+ MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(produce.getWorkOrderId());
+ MesMdItemDO firstItem = mdItemService.getItem(qualifiedLines.get(0).getItemId());
+ Long firstMdmItemId = firstItem != null && firstItem.getMdmItemId() != null
+ ? firstItem.getMdmItemId() : qualifiedLines.get(0).getItemId();
+ String workOrderCode = workOrder != null ? workOrder.getCode() : String.valueOf(produce.getWorkOrderId());
+
+ MesWmProductReceiptDO receipt = MesWmProductReceiptDO.builder()
+ .code(code)
+ .name("鐢熶骇瀹屾垚鑷姩鍏ュ簱-" + workOrderCode)
+ .workOrderId(produce.getWorkOrderId())
+ .itemId(firstMdmItemId)
+ .receiptDate(LocalDateTime.now())
+ .status(MesWmProductReceiptStatusEnum.PREPARE.getStatus())
+ .remark("鏈亾宸ュ簭浜у嚭鑷姩鐢熸垚锛屼骇鍑哄崟ID锛�" + produce.getId())
+ .build();
+ productReceiptMapper.insert(receipt);
+
+ MesWmWarehouseDO virtualWarehouse = warehouseService.getWarehouseByCode(
+ MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE);
+ MesWmWarehouseLocationDO virtualLocation = locationService.getWarehouseLocationByCode(
+ MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION);
+ MesWmWarehouseAreaDO virtualArea = areaService.getWarehouseAreaByCode(
+ MesWmWarehouseAreaDO.WIP_VIRTUAL_AREA);
+
+ for (MesWmProductProduceLineDO produceLine : qualifiedLines) {
+ MesMdItemDO item = mdItemService.getItem(produceLine.getItemId());
+ Long mdmItemId = item != null && item.getMdmItemId() != null
+ ? item.getMdmItemId() : produceLine.getItemId();
+ MesWmMaterialStockDO stock = materialStockService.getMaterialStockByCompositeKey(
+ mdmItemId, virtualWarehouse.getId(), virtualLocation.getId(), virtualArea.getId(),
+ produceLine.getBatchId(), null);
+ productReceiptLineMapper.insert(MesWmProductReceiptLineDO.builder()
+ .receiptId(receipt.getId())
+ .itemId(mdmItemId)
+ .materialStockId(stock != null ? stock.getId() : null)
+ .quantity(produceLine.getQuantity())
+ .batchId(produceLine.getBatchId())
+ .batchCode(produceLine.getBatchCode())
+ .remark("鏈亾宸ュ簭鍚堟牸鍝佽嚜鍔ㄧ敓鎴�")
+ .build());
+ }
+ return receipt.getId();
+ }
+
+ @Override
public void updateProductReceipt(MesWmProductReceiptSaveReqVO updateReqVO) {
// 1.1 鏍¢獙瀛樺湪 + 鑽夌鐘舵��
validateProductReceiptExistsAndDraft(updateReqVO.getId());
--
Gitblit v1.9.3