From 8c65f898ed6e5b0c7a94c792c4562f6ec831dccd Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期六, 07 十一月 2026 08:50:53 +0800
Subject: [PATCH] feat: 完善质检、生产、销售、财务与人事模块并接入审批流程

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java |   31 ++++++++++++++++++++++++++-----
 1 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java
index c50473e..6186aa8 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java
@@ -95,6 +95,9 @@
     }
 
     private void createTransactionList(Long produceId, List<MesWmProductProduceLineDO> lines) {
+        // 鐢熶骇璁㈠崟 ID 鍐椾綑鍒版祦姘达紝渚夸簬鍑哄簱鍙拌处鎸夌敓浜ц鍗曡拷婧�
+        MesWmProductProduceDO produce = productProduceMapper.selectById(produceId);
+        Long workOrderId = produce != null ? produce.getWorkOrderId() : null;
         for (MesWmProductProduceLineDO line : lines) {
             if (MesWmQualityStatusEnum.FAIL.getStatus().equals(line.getQualityStatus())) {
                 // 涓嶅悎鏍间骇鍑轰繚鐣欒褰曪紝浜ょ敱涓嶅悎鏍煎搧澶勭悊锛屼笉鐢熸垚鍚堟牸搴撳瓨娴佹按銆�
@@ -118,7 +121,7 @@
                         .setQuantity(detail.getQuantity())
                         .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode())
                         .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId())
-                        .setBizType(MesBizTypeConstants.WM_PRODUCT_PRODUCE).setBizId(produceId)
+                        .setBizType(MesBizTypeConstants.WM_PRODUCT_PRODUCE).setBizId(produceId).setWorkOrderId(workOrderId)
                         .setBizCode("").setBizLineId(line.getId()));
             }
         }
@@ -128,8 +131,7 @@
     @Transactional(rollbackFor = Exception.class)
     public MesWmProductProduceDO generateProductProduce(MesProFeedbackDO feedback, boolean checkFlag,
                                                          MesProFeedbackApproveReqVO approveReqVO) {
-        if (!checkFlag) throw exception(WM_PRODUCT_PRODUCE_QUALITY_PENDING);
-        // 0. 鏌ヨ鍏宠仈鐨勫伐鍗曪紙鐢ㄤ簬鑾峰彇 clientId 绛変俊鎭級
+        // 0. 鏌ヨ鍏宠仈鐨勫伐鍗曪紙鐢ㄤ簬鑾峰彇 clientId銆佷骇鍝佺瓑淇℃伅锛�
         MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(feedback.getWorkOrderId());
 
         // 1. 鍒涘缓浜у嚭鍗曞ご
@@ -169,11 +171,26 @@
         Long batchId = batch != null ? batch.getId() : null;
         String batchCode = batch != null ? batch.getCode() : null;
 
-        // 鏂版姤宸ヤ骇鍑虹粺涓�寰呮锛屽巻鍙蹭笉妫�楠屽嵆鍏ュ簱鍒嗘敮宸茬Щ闄ゃ��
+        // 鍗婃垚鍝侊紙鎶ュ伐鐗╂枡 != 宸ュ崟鎴愬搧锛夋寜鐢熶骇 BOM 鐩存帴鑷姩鍏ュ簱锛屼笉绛夎川妫�銆佷笉璧板鎵癸紱
+        // 鎴愬搧浠嶇粺涓�寰呮锛岃川妫�鍚堟牸鍚庢墠鐢熸垚鍏ュ簱娴佹按銆�
+        boolean semiFinished = workOrder != null && feedback.getItemId() != null
+                && ObjUtil.notEqual(feedback.getItemId(), workOrder.getProductId());
         MesWmProductProduceLineDO line = buildProduceLine(produce, feedback, batchId, batchCode,
-                feedback.getFeedbackQuantity(), MesWmQualityStatusEnum.PENDING.getStatus(),
+                feedback.getFeedbackQuantity(),
+                semiFinished ? MesWmQualityStatusEnum.PASS.getStatus() : MesWmQualityStatusEnum.PENDING.getStatus(),
                 workOrder != null ? workOrder.getReelNo() : null);
         productProduceLineService.createProductProduceLine(line);
+        if (semiFinished) {
+            WarehouseTarget target = resolveOutputTarget(feedback.getWorkOrderId(), feedback.getProcessId(),
+                    feedback.getItemId());
+            productProduceDetailService.createProductProduceDetail(MesWmProductProduceDetailDO.builder()
+                    .produceId(produce.getId()).lineId(line.getId())
+                    .itemId(feedback.getItemId()).quantity(feedback.getFeedbackQuantity())
+                    .batchId(batchId).batchCode(batchCode).reelNo(line.getReelNo())
+                    .warehouseId(target.warehouseId()).locationId(target.locationId()).areaId(target.areaId())
+                    .build());
+            finishProductProduce(produce.getId());
+        }
         return produce;
     }
 
@@ -218,6 +235,10 @@
         if (produce == null) {
             throw exception(WM_PRODUCT_PRODUCE_NOT_EXISTS);
         }
+        // 鍗婃垚鍝佸湪鎶ュ伐瀹℃壒鏃跺凡鑷姩鍏ュ簱锛堜骇鍑哄崟宸插畬鎴愶級锛岃川妫�瀹屾垚鏃朵笉鍐嶉噸澶嶆媶鍒嗗叆搴�
+        if (ObjUtil.equal(produce.getStatus(), MesWmProductProduceStatusEnum.FINISHED.getStatus())) {
+            return;
+        }
         // 2. 閫氳繃 sourceLineId 鐩存帴瀹氫綅寰呮楠岃
         MesWmProductProduceLineDO pendingLine = productProduceLineService.validateProductProduceLineExists(sourceLineId);
         if (!ObjUtil.equal(pendingLine.getProduceId(), produce.getId())

--
Gitblit v1.9.3