From 3be684af887afe4c0e45f281cc53adfef6f12b78 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 20 七月 2026 09:48:44 +0800
Subject: [PATCH] feat(erp): 添加销售订单生产状态跟踪功能

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java |   56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 56 insertions(+), 0 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java
index 34ca046..2ddacaf 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java
@@ -12,7 +12,10 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.mps.MesProMpsMergeItemDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.pro.mps.MesProMpsMapper;
 import cn.iocoder.yudao.module.mes.dal.mysql.pro.mps.MesProMpsMergeItemMapper;
+import cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback.MesProFeedbackMapper;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO;
 import cn.iocoder.yudao.module.mes.enums.pro.MesProMpsStatusEnum;
+import cn.iocoder.yudao.module.mes.enums.pro.MesProFeedbackStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderSourceTypeEnum;
 import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
@@ -61,6 +64,8 @@
     private MesMdAutoCodeRecordService autoCodeRecordService;
     @Resource
     private CrmCustomerApi customerApi;
+    @Resource
+    private MesProFeedbackMapper feedbackMapper;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -331,6 +336,57 @@
         mpsMapper.updateProducedQuantity(id, incrQuantity);
     }
 
+    @Override
+    public Boolean checkSaleOrderProductionFinished(Long saleOrderId) {
+        if (saleOrderId == null) {
+            return false;
+        }
+        // 1. 鏌ヨ璇ラ攢鍞鍗曟墍鏈� MPS锛堥�氳繃 saleOrderId 鍏宠仈锛�
+        List<MesProMpsDO> mpsList = mpsMapper.selectList(
+                MesProMpsDO::getSaleOrderId, saleOrderId);
+        if (CollUtil.isEmpty(mpsList)) {
+            // 鏃� MPS 鍏宠仈锛岃涓哄畬鎴�
+            return true;
+        }
+        // 2. 妫�鏌ユ瘡涓� MPS 鏄惁瀹屾垚
+        for (MesProMpsDO mps : mpsList) {
+            if (!isMpsFinished(mps)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public MesProMpsDO getMpsByWorkOrderId(Long workOrderId) {
+        if (workOrderId == null) {
+            return null;
+        }
+        return mpsMapper.selectOne(MesProMpsDO::getWorkOrderId, workOrderId);
+    }
+
+    /**
+     * 鍒ゆ柇鍗曚釜 MPS 鏄惁瀹屾垚
+     */
+    private boolean isMpsFinished(MesProMpsDO mps) {
+        // 1. 宸茬敓浜ф暟閲� >= 璁″垝鏁伴噺
+        BigDecimal quantityProduced = ObjUtil.defaultIfNull(mps.getQuantityProduced(), BigDecimal.ZERO);
+        if (quantityProduced.compareTo(mps.getQuantity()) < 0) {
+            return false;
+        }
+        // 2. 妫�鏌ュ伐鍗曚笅鎵�鏈夋姤宸ユ槸鍚﹀畬鎴愶紙纭繚璐ㄦ瀹屾垚锛�
+        if (mps.getWorkOrderId() != null) {
+            Long unfinishedCount = feedbackMapper.selectCount(
+                    new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<MesProFeedbackDO>()
+                            .eq(MesProFeedbackDO::getWorkOrderId, mps.getWorkOrderId())
+                            .ne(MesProFeedbackDO::getStatus, MesProFeedbackStatusEnum.FINISHED.getStatus()));
+            if (unfinishedCount > 0) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     // ========== 绉佹湁鏂规硶 ==========
 
     /**

--
Gitblit v1.9.3