From be5783c8a7e13bbc76d33c95643d75779cce21db Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期六, 18 七月 2026 15:39:05 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_business' into dev_business

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java |   96 +++++++++++++++++++++++++++--------------------
 1 files changed, 55 insertions(+), 41 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
index e7148ee..d704d07 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
@@ -1,14 +1,16 @@
 package cn.iocoder.yudao.module.mes.service.pro.feedback;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackPageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductBomDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemconsume.MesWmItemConsumeDO;
@@ -17,8 +19,8 @@
 import cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback.MesProFeedbackMapper;
 import cn.iocoder.yudao.module.mes.enums.pro.MesProFeedbackStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
-import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService;
 import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService;
+import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductBomService;
 import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService;
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
 import cn.iocoder.yudao.module.mes.service.wm.itemconsume.MesWmItemConsumeService;
@@ -31,6 +33,8 @@
 import org.springframework.validation.annotation.Validated;
 
 import java.math.BigDecimal;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -53,7 +57,7 @@
     @Resource
     private MesProRouteProcessService routeProcessService;
     @Resource
-    private MesMdWorkstationService workstationService;
+    private MesProRouteProductBomService routeProductBomService;
     @Resource
     @Lazy // 閬垮厤寰幆渚濊禆
     private MesProTaskService taskService;
@@ -102,6 +106,19 @@
     @Override
     public MesProFeedbackDO getFeedback(Long id) {
         return feedbackMapper.selectById(id);
+    }
+
+    @Override
+    public List<MesProFeedbackDO> getFeedbackListByTaskIds(Collection<Long> taskIds) {
+        if (CollUtil.isEmpty(taskIds)) {
+            return Collections.emptyList();
+        }
+        return feedbackMapper.selectListByTaskIds(taskIds);
+    }
+
+    @Override
+    public List<MesProFeedbackDO> getFeedbackListByTaskId(Long taskId) {
+        return feedbackMapper.selectListByTaskId(taskId);
     }
 
     @Override
@@ -154,10 +171,20 @@
             throw exception(PRO_FEEDBACK_UNCHECK_QUANTITY_EXISTS, feedback.getUncheckQuantity());
         }
 
-        // 3. 鐗╂枡娑堣�楋細鏍规嵁宸ュ簭 BOM 鐢熸垚娑堣�楄褰曞苟鎵ц鎵e噺
-        MesWmItemConsumeDO itemConsume = itemConsumeService.generateItemConsume(feedback);
-        if (itemConsume != null) {
-            itemConsumeService.finishItemConsume(itemConsume.getId());
+        // 3. 鐗╂枡娑堣�楋細鍊掑啿宸ュ簭鎸� BOM 鑷姩鎵f枡锛涢潪鍊掑啿宸ュ簭璺宠繃锛堢墿鏂欒蛋鎵嬪伐棰嗘枡/鎶曟枡锛�
+        boolean backflushFlag = routeProcess != null && Boolean.TRUE.equals(routeProcess.getBackflushFlag());
+        if (backflushFlag) {
+            // 3.1 鏍¢獙鍊掑啿宸ュ簭蹇呴』閰嶇疆 BOM 娑堣�楋紝閬垮厤闈欓粯涓嶆墸鏂�
+            List<MesProRouteProductBomDO> boms = routeProductBomService.getRouteProductBomList(
+                    feedback.getRouteId(), feedback.getProcessId(), feedback.getItemId());
+            if (CollUtil.isEmpty(boms)) {
+                throw exception(PRO_FEEDBACK_BACKFLUSH_BOM_REQUIRED);
+            }
+            // 3.2 鐢熸垚娑堣�楄褰曞苟鎵ц鎵e噺锛圔OM 脳 鎶ュ伐鏁伴噺锛孎IFO 鎵g嚎杈瑰簱锛�
+            MesWmItemConsumeDO itemConsume = itemConsumeService.generateItemConsume(feedback);
+            if (itemConsume != null) {
+                itemConsumeService.finishItemConsume(itemConsume.getId());
+            }
         }
 
         // 4. 鍏抽敭宸ュ簭锛氱敓鎴愪骇鍑哄崟锛屽苟鏍规嵁鏄惁闇�瑕佹楠屽喅瀹氬叆搴撴柟寮�
@@ -174,6 +201,12 @@
             MesWmProductProduceDO produce = productProduceService.generateProductProduce(feedback, false);
             productProduceService.finishProductProduce(produce.getId());
             updateTaskAndWorkOrderByFeedback(feedback);
+        } else {
+            // 4.3 闈炲叧閿伐搴忥細鍙洿鏂颁换鍔$殑宸茬敓浜ф暟閲忥紙宸ュ崟涓嶆洿鏂帮紝宸ュ崟鍙湅鍏抽敭宸ュ簭浜у嚭锛�
+            taskService.updateProducedQuantity(feedback.getTaskId(),
+                    feedback.getFeedbackQuantity(),
+                    ObjectUtil.defaultIfNull(feedback.getQualifiedQuantity(), BigDecimal.ZERO),
+                    ObjectUtil.defaultIfNull(feedback.getUnqualifiedQuantity(), BigDecimal.ZERO));
         }
 
         // 5. 闈炲叧閿伐搴� / 鍏抽敭闈炶川妫�宸ュ簭锛氱洿鎺ュ畬鎴愶紙娓呴浂 uncheckQuantity 闃叉 !key+check 鐣欒剰鏁版嵁锛�
@@ -246,23 +279,30 @@
     /**
      * 鏍¢獙鎶ュ伐鍗曠殑涓氬姟鏁版嵁锛堝垱寤� & 淇敼鍏辩敤锛�
      *
+     * <p>浠ョ敓浜т换鍔′负鏍稿績锛氬墠绔彧闇�浼� taskId锛寃orkOrderId銆乺outeId銆乸rocessId銆乮temId銆亀orkstationId
+     * 浠庝换鍔¤嚜鍔ㄥ~鍏咃紝鏃犻渶鍓嶇閲嶅浼犲叆銆�
+     *
      * @param reqVO 鎶ュ伐璇锋眰
      * @return 鍏宠仈鐨勭敓浜т换鍔�
      */
     private MesProTaskDO validateFeedbackData(MesProFeedbackSaveReqVO reqVO) {
-        // 1. 鏍¢獙宸ヤ綔绔欏瓨鍦�
-        MesMdWorkstationDO workstation = workstationService.validateWorkstationExists(reqVO.getWorkstationId());
-        if (ObjUtil.notEqual(workstation.getProcessId(), reqVO.getProcessId())) {
-            throw exception(PRO_WORKSTATION_PROCESS_MISMATCH);
-        }
+        // 1. 鏍¢獙浠诲姟瀛樺湪涓旀湭缁堟��
+        MesProTaskDO task = taskService.validateTaskNotFinished(reqVO.getTaskId());
 
-        // 2.1 鏍¢獙宸ヨ壓璺嚎 + 宸ュ簭閰嶇疆鏈夋晥
+        // 2. 浠庝换鍔¤嚜鍔ㄥ~鍏呭叧鑱斿瓧娈碉紙鍓嶇鏃犻渶浼犲叆锛屽悗绔粺涓�浠庝换鍔¤幏鍙栵級
+        reqVO.setWorkOrderId(task.getWorkOrderId());
+        reqVO.setRouteId(task.getRouteId());
+        reqVO.setProcessId(task.getProcessId());
+        reqVO.setItemId(task.getItemId());
+        reqVO.setWorkstationId(task.getWorkstationId());
+
+        // 3. 鏍¢獙宸ヨ壓璺嚎 + 宸ュ簭閰嶇疆鏈夋晥
         MesProRouteProcessDO routeProcess = routeProcessService.getRouteProcessByRouteIdAndProcessId(
-                reqVO.getRouteId(), reqVO.getProcessId());
+                task.getRouteId(), task.getProcessId());
         if (routeProcess == null) {
             throw exception(PRO_FEEDBACK_ROUTE_PROCESS_INVALID);
         }
-        // 2.2 鏍¢獙鏁伴噺
+        // 4.1 鏍¢獙鏁伴噺
         boolean checkFlag = Boolean.TRUE.equals(routeProcess.getCheckFlag());
         if (checkFlag) {
             // 闇�瑕佹楠岋細鍙渶濉姤宸ユ暟閲忥紝涓斿繀椤� > 0
@@ -279,33 +319,7 @@
             }
         }
 
-        // 3. 鏍¢獙宸ュ崟宸茬‘璁�
-        MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId());
-        if (ObjUtil.notEqual(workOrder.getProductId(), reqVO.getItemId())) {
-            throw exception(PRO_WORK_ORDER_PRODUCT_MISMATCH);
-        }
-
-        // 4. 鏍¢獙浠诲姟瀛樺湪涓旀湭缁堟�侊紙宸插畬鎴�/宸插彇娑堬級锛屽苟杩斿洖浠诲姟鐢ㄤ簬鍐椾綑 itemId
-        MesProTaskDO task = taskService.validateTaskNotFinished(reqVO.getTaskId());
-        validateTaskRelation(task, workstation, workOrder, reqVO);
         return task;
-    }
-
-    private void validateTaskRelation(MesProTaskDO task, MesMdWorkstationDO workstation,
-                                      MesProWorkOrderDO workOrder, MesProFeedbackSaveReqVO reqVO) {
-        if (ObjUtil.notEqual(task.getWorkOrderId(), workOrder.getId())) {
-            throw exception(PRO_TASK_WORK_ORDER_MISMATCH);
-        }
-        if (ObjUtil.notEqual(task.getWorkstationId(), workstation.getId())) {
-            throw exception(PRO_TASK_WORKSTATION_MISMATCH);
-        }
-        if (ObjUtil.notEqual(task.getRouteId(), reqVO.getRouteId())
-                || ObjUtil.notEqual(task.getProcessId(), reqVO.getProcessId())) {
-            throw exception(PRO_TASK_ROUTE_PROCESS_MISMATCH);
-        }
-        if (ObjUtil.notEqual(task.getItemId(), reqVO.getItemId())) {
-            throw exception(PRO_TASK_ITEM_MISMATCH);
-        }
     }
 
     @Override

--
Gitblit v1.9.3