From b3fe06c151dc8455649bf0a46e481ceb83e3ea2a Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期六, 07 十一月 2026 13:37:54 +0800
Subject: [PATCH] feat: 完成好水川 MOM 需求1/2/4/5/8(装箱、BOM成本、销售合同、劳动合同、留样)
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java | 59 +++++++++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 45 insertions(+), 14 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 e380ac7..8c0783b 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
@@ -22,6 +22,7 @@
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.enums.pro.MesProWorkOrderStatusEnum;
import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService;
@@ -53,7 +54,7 @@
/**
* MES 鐢熶骇涓昏鍒掞紙MPS锛塖ervice 瀹炵幇绫�
*
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
*/
@Service
@Validated
@@ -71,6 +72,8 @@
private MesProMpsMergeItemMapper mergeItemMapper;
@Resource
private MesProWorkOrderService workOrderService;
+ @Resource
+ private cn.iocoder.yudao.module.mes.service.pro.cost.MesProWorkOrderCostService workOrderCostService;
@Resource
private MesMdItemService itemService;
@Resource
@@ -282,14 +285,32 @@
throw exception(PRO_MPS_NOT_ISSUED);
}
- // 绾ц仈鍙栨秷鍏宠仈鐨勭敓浜у伐鍗�
+ // 绾ц仈鍙栨秷鍏宠仈鐨勭敓浜у伐鍗曪紙璺熼殢宸ュ崟褰撳墠鐘舵�侊紝涓斾笉璇激鍚堝苟涓嬪彂鐨勫叡浜伐鍗曪級
if (mps.getWorkOrderId() != null) {
- try {
- workOrderService.cancelWorkOrder(mps.getWorkOrderId());
- log.info("[cancelMps] 绾ц仈鍙栨秷鐢熶骇宸ュ崟锛寃orkOrderId={}", mps.getWorkOrderId());
- } catch (Exception e) {
- // 宸ュ崟鍙兘宸插畬鎴愭垨宸插彇娑堬紝璁板綍鏃ュ織浣嗕笉闃绘 MPS 鍙栨秷
- log.warn("[cancelMps] 鍙栨秷鐢熶骇宸ュ崟澶辫触锛寃orkOrderId={}锛屽師鍥狅細{}", mps.getWorkOrderId(), e.getMessage());
+ // 鏂板閫昏緫锛氳嫢璇ュ伐鍗曟湁鎶ュ伐璁板綍锛屽垯涓嶅厑璁稿彇娑� MPS
+ Long feedbackCount = feedbackMapper.selectCount(MesProFeedbackDO::getWorkOrderId, mps.getWorkOrderId());
+ if (feedbackCount != null && feedbackCount > 0) {
+ throw exception(PRO_MPS_WORK_ORDER_HAS_FEEDBACK);
+ }
+
+ // 1. 缁熻璇ュ伐鍗曡澶氬皯鏉� MPS 寮曠敤锛氬悎骞朵笅鍙戠殑澶氭潯 MPS 鍏变韩鍚屼竴涓伐鍗�
+ Long refCount = mpsMapper.selectCount(MesProMpsDO::getWorkOrderId, mps.getWorkOrderId());
+ if (refCount != null && refCount > 1) {
+ // 鍏变韩宸ュ崟锛氬彧鍙栨秷褰撳墠 MPS锛屼笉鍔ㄥ伐鍗�
+ log.info("[cancelMps] 鐢熶骇宸ュ崟({}) 琚� {} 鏉� MPS 鍏辩敤锛岃烦杩囩骇鑱斿彇娑堝伐鍗�",
+ mps.getWorkOrderId(), refCount);
+ } else {
+ MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(mps.getWorkOrderId());
+ if (workOrder != null
+ && MesProWorkOrderStatusEnum.CONFIRMED.getStatus().equals(workOrder.getStatus())) {
+ // 鍙湁"宸茬‘璁�"鐘舵�佺殑宸ュ崟鎵嶉渶瑕佺骇鑱斿彇娑�
+ workOrderService.cancelWorkOrder(mps.getWorkOrderId());
+ log.info("[cancelMps] 绾ц仈鍙栨秷鐢熶骇宸ュ崟锛寃orkOrderId={}", mps.getWorkOrderId());
+ } else {
+ // 宸ュ崟宸叉槸鑽夌/宸插畬鎴�/宸插彇娑堬紝鏃犻渶绾ц仈鍙栨秷锛岀洿鎺ュ彇娑� MPS
+ log.info("[cancelMps] 鐢熶骇宸ュ崟({}) 鐘舵�佷负 {}锛屾棤闇�绾ц仈鍙栨秷",
+ mps.getWorkOrderId(), workOrder != null ? workOrder.getStatus() : "null");
+ }
}
}
@@ -329,9 +350,7 @@
@Override
public PageResult<MesProMpsDO> getMpsPage(MesProMpsPageReqVO pageReqVO) {
- // 鑾峰彇鐢ㄦ埛鏈夋潈闄愮殑瀹㈡埛 ID 鍒楄〃
- List<Long> permittedClientIds = customerApi.getPermittedCustomerIds();
- return mpsMapper.selectPage(pageReqVO, permittedClientIds);
+ return mpsMapper.selectPage(pageReqVO, (List<Long>) null);
}
@Override
@@ -424,6 +443,10 @@
* 鍒ゆ柇鍗曚釜 MPS 鏄惁瀹屾垚
*/
private boolean isMpsFinished(MesProMpsDO mps) {
+ // 宸插彇娑堢殑 MPS 瑙嗕负缁堟�侊紝涓嶅啀闃诲鐢熶骇瀹屾垚鍒ゆ柇锛堜笌 checkCanCreateSalesNotice 鐨勫彛寰勪繚鎸佷竴鑷达級
+ if (MesProMpsStatusEnum.CANCELED.getStatus().equals(mps.getStatus())) {
+ return true;
+ }
// 1. 宸茬敓浜ф暟閲� >= 璁″垝鏁伴噺
BigDecimal quantityProduced = ObjUtil.defaultIfNull(mps.getQuantityProduced(), BigDecimal.ZERO);
if (quantityProduced.compareTo(mps.getQuantity()) < 0) {
@@ -519,8 +542,9 @@
}
Long routeId = routeProduct.getRouteId();
- // 2. 鏍¢獙宸ヨ壓璺嚎鏄惁鏈夊伐搴�
- List<MesProRouteProcessDO> routeProcesses = routeProcessService.getRouteProcessListByRouteId(routeId);
+ // 2. 鏍¢獙宸ヨ壓璺嚎鏄惁鏈夊伐搴忥紙鎸変骇鍝佽繃婊ゅ叾瀹冧骇鍝佺殑浜у嚭鐗╂枡锛�
+ List<MesProRouteProcessDO> routeProcesses = routeProcessService
+ .getRouteProcessListByProductId(mps.getProductId());
if (CollUtil.isEmpty(routeProcesses)) {
throw exception(PRO_ROUTE_ENABLE_NO_PROCESS);
}
@@ -560,6 +584,10 @@
.map(Long::valueOf).collect(Collectors.toList()));
}
process.setColorCode(rp.getColorCode());
+ // 甯﹀叆宸ヨ壓璺嚎浜у搧閰嶇疆鐨勬姤宸ヤ粨搴�
+ process.setWarehouseId(routeProduct.getWarehouseId());
+ process.setLocationId(routeProduct.getLocationId());
+ process.setAreaId(routeProduct.getAreaId());
// 甯﹀叆宸ュ簭鎶曟枡BOM
List<MesProRouteProductBomDO> routeBomItems = bomMap != null ? bomMap.get(rp.getProcessId()) : null;
if (CollUtil.isNotEmpty(routeBomItems)) {
@@ -576,6 +604,9 @@
processList.add(process);
}
workOrderProcessService.batchSaveWorkOrderProcess(processList);
+
+ // 5.1 宸ュ簭鎶曟枡 BOM 鐢熸垚鍚庨噸绠楁爣鍑嗙墿鏂欐垚鏈紙璺嚎 BOM 涓庝骇鍝� BOM 鍙兘瀛樺湪宸紓锛�
+ workOrderCostService.recalculateWorkOrderCost(workOrderId);
// 6. 宸ュ崟鐩存帴纭涓哄凡纭鐘舵��
workOrderService.confirmWorkOrder(workOrderId);
@@ -595,4 +626,4 @@
}
}
-}
\ No newline at end of file
+}
--
Gitblit v1.9.3