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