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/feedback/MesProFeedbackServiceImpl.java | 86 ++++++++++++++++++++++++-------------------
1 files changed, 48 insertions(+), 38 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 71f0852..096b440 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
@@ -6,7 +6,6 @@
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;
@@ -20,7 +19,6 @@
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;
@@ -28,7 +26,11 @@
import cn.iocoder.yudao.module.mes.service.wm.itemconsume.MesWmItemConsumeService;
import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceLineService;
import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceService;
+import cn.iocoder.yudao.module.mes.api.mps.MesProMpsApi;
+import cn.iocoder.yudao.module.mes.api.mps.dto.MesProMpsRespDTO;
+import cn.iocoder.yudao.module.mes.api.event.ProductionFinishedEvent;
import jakarta.annotation.Resource;
+import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -61,8 +63,6 @@
@Resource
private MesProRouteProductBomService routeProductBomService;
@Resource
- private MesMdWorkstationService workstationService;
- @Resource
@Lazy // 閬垮厤寰幆渚濊禆
private MesProTaskService taskService;
@Resource
@@ -71,6 +71,10 @@
private MesWmProductProduceService productProduceService;
@Resource
private MesWmProductProduceLineService produceLineService;
+ @Resource
+ private MesProMpsApi mpsApi;
+ @Resource
+ private ApplicationEventPublisher eventPublisher;
@Override
public Long createFeedback(MesProFeedbackSaveReqVO createReqVO) {
@@ -205,6 +209,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 鐣欒剰鏁版嵁锛�
@@ -245,6 +255,25 @@
// 3. 鏇存柊宸ュ崟鐨勫凡鐢熶骇鏁伴噺
workOrderService.updateProducedQuantity(feedback.getWorkOrderId(),
feedback.getFeedbackQuantity());
+
+ // 4. 妫�鏌ュ苟鍙戝竷鐢熶骇瀹屾垚浜嬩欢
+ checkAndPublishProductionFinished(feedback.getWorkOrderId());
+ }
+
+ /**
+ * 妫�鏌ュ苟鍙戝竷鐢熶骇瀹屾垚浜嬩欢
+ */
+ private void checkAndPublishProductionFinished(Long workOrderId) {
+ // 1. 鑾峰彇宸ュ崟鍏宠仈鐨� MPS
+ MesProMpsRespDTO mps = mpsApi.getMpsByWorkOrderId(workOrderId);
+ if (mps == null || mps.getSaleOrderId() == null) {
+ return; // 闈為攢鍞鍗曟潵婧愮殑宸ュ崟锛岃烦杩�
+ }
+
+ // 2. 妫�鏌ラ攢鍞鍗曟墍鏈夌敓浜ф槸鍚﹀畬鎴�
+ if (mpsApi.checkSaleOrderProductionFinished(mps.getSaleOrderId())) {
+ eventPublisher.publishEvent(new ProductionFinishedEvent(mps.getSaleOrderId(), java.time.LocalDateTime.now()));
+ }
}
// ==================== 鏍¢獙鏂规硶 ====================
@@ -277,23 +306,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
@@ -310,33 +346,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