From 85156554438bb13930c89072ee0b7fa93192a7fe Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 16 七月 2026 17:43:30 +0800
Subject: [PATCH] 1.联调优化采购申请到入库的整个逻辑
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java | 83 ++++++++++++++++++++++++++++++++---------
1 files changed, 64 insertions(+), 19 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
index 2f5f920..ea57d40 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
@@ -12,10 +12,12 @@
import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeMapper;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmArrivalNoticeStatusEnum;
import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi;
+import cn.iocoder.yudao.module.erp.api.purchase.ErpSupplierApi;
import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO;
import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcService;
+import cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
@@ -44,8 +46,9 @@
@Resource
private MesWmArrivalNoticeLineService arrivalNoticeLineService;
+
@Resource
- private cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService vendorService;
+ private ErpSupplierApi supplierApi;
@Resource
private ErpPurchaseOrderApi purchaseOrderApi;
@@ -84,8 +87,8 @@
private void validateArrivalNoticeSaveData(MesWmArrivalNoticeSaveReqVO reqVO) {
// 鏍¢獙缂栫爜鍞竴
validateCodeUnique(reqVO.getId(), reqVO.getCode());
- // 鏍¢獙渚涘簲鍟嗗瓨鍦ㄤ笖鍚敤
- vendorService.validateVendorExistsAndEnable(reqVO.getVendorId());
+ // 鏍¢獙渚涘簲鍟嗗瓨鍦紙ERP 閲囪喘渚涘簲鍟嗭級
+ supplierApi.validateSupplier(reqVO.getVendorId());
// 鏍¢獙閲囪喘璁㈠崟瀛樺湪
if (reqVO.getPurchaseOrderId() != null) {
ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(reqVO.getPurchaseOrderId()).getCheckedData();
@@ -161,7 +164,7 @@
@Override
@Transactional(rollbackFor = Exception.class)
- public void updateArrivalNoticeWhenIqcFinish(Long id, Long lineId, Long iqcId, BigDecimal qualifiedQuantity) {
+ public void updateArrivalNoticeWhenIqcFinish(Long id, Long lineId, Long iqcId, Integer checkResult, BigDecimal qualifiedQuantity) {
// 1.1 鏍¢獙鍒拌揣閫氱煡鍗曞瓨鍦�
MesWmArrivalNoticeDO notice = validateArrivalNoticeExists(id);
// 1.2 鏍¢獙鐘舵�佷负寰呰川妫�
@@ -169,18 +172,28 @@
throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_PENDING_QC);
}
- // 2. 鏇存柊鍒拌揣閫氱煡鍗曡锛氱粦瀹� iqcId + 鍚堟牸鏁伴噺
- arrivalNoticeLineService.updateArrivalNoticeLineWhenIqcFinish(lineId, iqcId, qualifiedQuantity);
+ // 2. 鏇存柊鍒拌揣閫氱煡鍗曡锛氱粦瀹� iqcId + 璐ㄦ缁撴灉 + 鍚堟牸鏁伴噺
+ arrivalNoticeLineService.updateArrivalNoticeLineWhenIqcFinish(lineId, iqcId, checkResult, qualifiedQuantity);
- // 3.1 鍒ゆ柇鏄惁鎵�鏈夐渶妫�琛岄兘宸插畬鎴�
+ // 3.1 鍒ゆ柇鏄惁鎵�鏈夐渶妫�琛岄兘宸插畬鎴愯川妫�
List<MesWmArrivalNoticeLineDO> lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(id);
boolean hasUnchecked = CollectionUtils.anyMatch(lines,
- line -> Boolean.TRUE.equals(line.getIqcCheckFlag()) && line.getIqcId() == null);
+ line -> Boolean.TRUE.equals(line.getIqcCheckFlag()) && line.getIqcCheckResult() == null);
if (hasUnchecked) {
log.info("[updateArrivalNoticeWhenIqcFinish][鍒拌揣閫氱煡鍗�({}) 杩樻湁鏈畬鎴愭楠岀殑琛岋紝鏆備笉鏇存柊鐘舵�乚", id);
return;
}
- // 3.2 鎵�鏈夎妫�楠屽畬鎴愶紝鏇存柊涓昏〃鐘舵�� PENDING_QC 鈫� PENDING_RECEIPT
+
+ // 3.2 鍒ゆ柇鏄惁鎵�鏈夐渶妫�琛岄兘鍙互鍏ュ簱锛堝悎鏍兼垨鐗归噰锛�
+ boolean hasNonInbound = CollectionUtils.anyMatch(lines,
+ line -> Boolean.TRUE.equals(line.getIqcCheckFlag())
+ && !MesQcCheckResultEnum.canInbound(line.getIqcCheckResult()));
+ if (hasNonInbound) {
+ log.info("[updateArrivalNoticeWhenIqcFinish][鍒拌揣閫氱煡鍗�({}) 瀛樺湪涓嶅彲鍏ュ簱鐨勮锛堥��璐�/鎶ュ簾锛夛紝鐘舵�佷繚鎸佸緟璐ㄦ]", id);
+ return;
+ }
+
+ // 3.3 鎵�鏈夎妫�楠屽畬鎴愪笖鍙叆搴擄紝鏇存柊涓昏〃鐘舵�� PENDING_QC 鈫� PENDING_RECEIPT
arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO()
.setId(id).setStatus(MesWmArrivalNoticeStatusEnum.PENDING_RECEIPT.getStatus()));
}
@@ -285,44 +298,76 @@
@Override
@Transactional(rollbackFor = Exception.class)
public Long generateArrivalNoticeFromPurchaseOrder(Long purchaseOrderId) {
- // 1. 鑾峰彇閲囪喘璁㈠崟
+ // 1. 鏍¢獙鏄惁宸茬敓鎴愯繃鍒拌揣閫氱煡鍗曪紙闃叉閲嶅鐢熸垚锛�
+ MesWmArrivalNoticeDO existNotice = arrivalNoticeMapper.selectByPurchaseOrderId(purchaseOrderId);
+ if (existNotice != null) {
+ throw exception(WM_ARRIVAL_NOTICE_ALREADY_EXISTS);
+ }
+
+ // 2. 鑾峰彇閲囪喘璁㈠崟
ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(purchaseOrderId).getCheckedData();
if (purchaseOrder == null) {
throw exception(WM_PURCHASE_ORDER_NOT_EXISTS);
}
- // 2. 鑾峰彇閲囪喘璁㈠崟鏄庣粏
+ // 3. 鑾峰彇閲囪喘璁㈠崟鏄庣粏
List<ErpPurchaseOrderItemRespDTO> items = purchaseOrderApi.getPurchaseOrderItemList(purchaseOrderId).getCheckedData();
if (CollUtil.isEmpty(items)) {
throw exception(WM_PURCHASE_ORDER_NO_ITEM);
}
- // 3. 鐢熸垚鍒拌揣閫氱煡鍗曠紪鐮侊紙浣跨敤缂栫爜瑙勫垯鏈嶅姟锛�
+ // 4. 鐢熸垚鍒拌揣閫氱煡鍗曠紪鐮�
String code = generateArrivalNoticeCode();
- // 4. 鍒涘缓鍒拌揣閫氱煡鍗曚富琛�
+ // 5. 鍒涘缓鍒拌揣閫氱煡鍗曚富琛紝鐩存帴璁句负寰呭叆搴撶姸鎬�
MesWmArrivalNoticeDO notice = new MesWmArrivalNoticeDO();
notice.setCode(code);
notice.setName(purchaseOrder.getNo() + "鍒拌揣閫氱煡");
notice.setPurchaseOrderId(purchaseOrderId);
notice.setPurchaseOrderCode(purchaseOrder.getNo());
notice.setVendorId(purchaseOrder.getSupplierId());
- notice.setStatus(MesWmArrivalNoticeStatusEnum.PREPARE.getStatus());
+ notice.setArrivalDate(java.time.LocalDateTime.now()); // 鍒拌揣鏃堕棿涓哄綋鍓嶆椂闂�
+ notice.setStatus(MesWmArrivalNoticeStatusEnum.PENDING_RECEIPT.getStatus());
arrivalNoticeMapper.insert(notice);
- // 5. 閬嶅巻鏄庣粏鍒涘缓鍒拌揣閫氱煡鍗曡
+ // 6. 閬嶅巻鏄庣粏鍒涘缓鍒拌揣閫氱煡鍗曡
+ boolean hasNeedQc = false;
for (ErpPurchaseOrderItemRespDTO item : items) {
MesWmArrivalNoticeLineDO line = new MesWmArrivalNoticeLineDO();
line.setNoticeId(notice.getId());
line.setPurchaseOrderItemId(item.getId());
- // 娉ㄦ剰锛氳繖閲岄渶瑕佹牴鎹� ERP 浜у搧 ID 鏄犲皠鍒� MES 鐗╂枡 ID
- // 瀹為檯椤圭洰涓渶瑕侀�氳繃鏄犲皠鏈嶅姟澶勭悊锛岃繖閲屾殏鏃剁暀绌鸿鐢ㄦ埛鎵嬪姩閫夋嫨
- line.setArrivalQuantity(item.getCount() != null ? item.getCount().subtract(item.getInCount() != null ? item.getInCount() : BigDecimal.ZERO) : BigDecimal.ZERO);
+ line.setItemId(item.getProductId()); // 浠庨噰璐鍗曟槑缁嗗甫鍏ョ墿鏂欑紪鍙�
+ BigDecimal arrivalQuantity = item.getCount() != null ? item.getCount().subtract(item.getInCount() != null ? item.getInCount() : BigDecimal.ZERO) : BigDecimal.ZERO;
+ line.setArrivalQuantity(arrivalQuantity);
// 浠庨噰璐鍗曟槑缁嗗甫鍏ヨ川妫�鏍囪瘑
- line.setIqcCheckFlag(Boolean.TRUE.equals(item.getQcCheckFlag()));
+ boolean needQc = Boolean.TRUE.equals(item.getQcCheckFlag());
+ line.setIqcCheckFlag(needQc);
+ // 濡傛灉涓嶉渶瑕佽川妫�锛屽悎鏍兼暟閲忕瓑浜庡埌璐ф暟閲�
+ if (!needQc) {
+ line.setQualifiedQuantity(arrivalQuantity);
+ } else {
+ hasNeedQc = true;
+ }
arrivalNoticeLineService.createArrivalNoticeLineFromPurchaseOrderItem(line);
}
+ // 7. 濡傛灉鏈夐渶瑕佽川妫�鐨勮锛屾洿鏂扮姸鎬佷负寰呰川妫�骞惰嚜鍔ㄥ垱寤� IQC 鍗�
+ if (hasNeedQc) {
+ arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO()
+ .setId(notice.getId()).setStatus(MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus()));
+ // 涓洪渶瑕佽川妫�鐨勮鑷姩鍒涘缓 IQC 妫�楠屽崟
+ List<MesWmArrivalNoticeLineDO> lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(notice.getId());
+ for (MesWmArrivalNoticeLineDO line : lines) {
+ if (Boolean.TRUE.equals(line.getIqcCheckFlag())) {
+ Long iqcId = iqcService.createIqcFromArrivalNotice(
+ notice.getId(), line, notice.getCode(), notice.getVendorId());
+ arrivalNoticeLineService.updateArrivalNoticeLineIqcId(line.getId(), iqcId);
+ log.info("[generateArrivalNoticeFromPurchaseOrder][鍒拌揣閫氱煡鍗�({}) 琛�({}) 鑷姩鍒涘缓 IQC 妫�楠屽崟({})]",
+ notice.getId(), line.getId(), iqcId);
+ }
+ }
+ }
+
return notice.getId();
}
--
Gitblit v1.9.3