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