From 1eb432710b7a3a2e820be10b17c0138b377ee1b8 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期四, 20 八月 2026 16:50:12 +0800
Subject: [PATCH] 仓储物流-采购退货新增关联采购订单及带入物料功能
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/MesWmReturnVendorSaveReqVO.java | 3 +
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDO.java | 6 +++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorService.java | 8 ++++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 2 +
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/MesWmReturnVendorRespVO.java | 3 +
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorController.java | 14 ++++++-
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java | 78 +++++++++++++++++++++++++++++++++++++++
7 files changed, 112 insertions(+), 2 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorController.java
index 8cbe7ec..24e5253 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorController.java
@@ -146,6 +146,14 @@
return success(returnVendorService.checkReturnVendorQuantity(id));
}
+ @PostMapping("/import-purchase-order-items")
+ @Operation(summary = "鏍规嵁鍏宠仈閲囪喘璁㈠崟甯﹀叆鐗╂枡鏄庣粏")
+ @Parameter(name = "id", description = "缂栧彿", required = true)
+ @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:update')")
+ public CommonResult<Integer> importPurchaseOrderItems(@RequestParam("id") Long id) {
+ return success(returnVendorService.importPurchaseOrderItems(id));
+ }
+
// ==================== 鎷兼帴 VO ====================
private List<MesWmReturnVendorRespVO> buildRespVOList(List<MesWmReturnVendorDO> list) {
@@ -158,8 +166,10 @@
.collect(java.util.stream.Collectors.toMap(SrmSupplierRespDTO::getId, s -> s));
// 2. 鏋勫缓缁撴灉
return BeanUtils.toBean(list, MesWmReturnVendorRespVO.class, vo ->
- MapUtils.findAndThen(vendorMap, vo.getVendorId(), vendor ->
- vo.setVendorName(vendor.getName())));
+ MapUtils.findAndThen(vendorMap, vo.getVendorId(), vendor -> {
+ vo.setVendorName(vendor.getName());
+ vo.setVendorCode(vendor.getCode());
+ }));
}
}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/MesWmReturnVendorRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/MesWmReturnVendorRespVO.java
index e6f0263..63797fd 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/MesWmReturnVendorRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/MesWmReturnVendorRespVO.java
@@ -18,6 +18,9 @@
@Schema(description = "閫�璐у崟鍚嶇О", requiredMode = Schema.RequiredMode.REQUIRED, example = "渚涘簲鍟嗛��璐�")
private String name;
+ @Schema(description = "閲囪喘璁㈠崟缂栧彿", example = "1")
+ private Long purchaseOrderId;
+
@Schema(description = "閲囪喘璁㈠崟缂栧彿", example = "PO20250226001")
private String purchaseOrderCode;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/MesWmReturnVendorSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/MesWmReturnVendorSaveReqVO.java
index 720348a..8932b98 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/MesWmReturnVendorSaveReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/vo/MesWmReturnVendorSaveReqVO.java
@@ -22,6 +22,9 @@
@NotBlank(message = "閫�璐у崟鍚嶇О涓嶈兘涓虹┖")
private String name;
+ @Schema(description = "閲囪喘璁㈠崟缂栧彿", example = "1")
+ private Long purchaseOrderId;
+
@Schema(description = "閲囪喘璁㈠崟缂栧彿", example = "PO20250226001")
private String purchaseOrderCode;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDO.java
index 9b8b4be..02dba0b 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDO.java
@@ -38,6 +38,12 @@
private String name;
/**
* 閲囪喘璁㈠崟缂栧彿
+ *
+ * 鍏宠仈 ERP 閲囪喘璁㈠崟 {@link cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO#getId()}
+ */
+ private Long purchaseOrderId;
+ /**
+ * 閲囪喘璁㈠崟缂栫爜锛堝啑浣欏瓧娈碉紝鐢ㄤ簬鏄剧ず锛�
*/
private String purchaseOrderCode;
/**
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
index dec84a2..4f717ea 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -615,6 +615,8 @@
ErrorCode WM_RETURN_VENDOR_DETAIL_NOT_EXISTS = new ErrorCode(1_040_711_200, "渚涘簲鍟嗛��璐у崟鏄庣粏涓嶅瓨鍦�");
ErrorCode WM_RETURN_VENDOR_DETAIL_QUANTITY_INVALID = new ErrorCode(1_040_711_201, "閫�璐ф槑缁嗘暟閲忓繀椤诲ぇ浜� 0");
ErrorCode WM_RETURN_VENDOR_DETAIL_LINE_NOT_MATCH = new ErrorCode(1_040_711_202, "鎷h揣鏄庣粏涓嶅睘浜庢寚瀹氱殑渚涘簲鍟嗛��璐у崟");
+ ErrorCode WM_RETURN_VENDOR_PURCHASE_ORDER_REQUIRED = new ErrorCode(1_040_711_008, "璇峰厛閫夋嫨閲囪喘璁㈠崟");
+ ErrorCode WM_RETURN_VENDOR_PURCHASE_ORDER_NO_ITEM = new ErrorCode(1_040_711_009, "閲囪喘璁㈠崟鏃犳槑缁嗘暟鎹紝鏃犳硶甯﹀叆鐗╂枡");
// ========== MES 浠撳簱绠$悊-浜у搧鏀惰揣鍗曪紙1-040-712-000锛� ==========
ErrorCode WM_PRODUCT_RECPT_NOT_EXISTS = new ErrorCode(1_040_712_000, "浜у搧鏀惰揣鍗曚笉瀛樺湪");
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorService.java
index 9a74087..e46cb53 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorService.java
@@ -102,6 +102,14 @@
Long getReturnVendorCountByVendorId(Long vendorId);
/**
+ * 鏍规嵁鍏宠仈鐨勯噰璐鍗曪紝甯﹀叆鐗╂枡鏄庣粏鍒伴��璐у崟琛�
+ *
+ * @param id 閫�璐у崟缂栧彿
+ * @return 甯﹀叆鐨勭墿鏂欒鏁�
+ */
+ int importPurchaseOrderItems(Long id);
+
+ /**
* 鏍¢獙渚涘簲鍟嗛��璐у崟瀛樺湪涓斾负鑽夌鐘舵��
*
* @param id 缂栧彿
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java
index 37f56fb..ae6d530 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java
@@ -8,6 +8,7 @@
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorSaveReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLineSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDetailDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO;
@@ -15,6 +16,9 @@
import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnVendorStatusEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
+import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi;
+import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO;
+import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO;
import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
@@ -24,7 +28,9 @@
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
@@ -48,12 +54,16 @@
private SrmSupplierApi srmSupplierApi;
@Resource
private MesWmTransactionService wmTransactionService;
+ @Resource
+ private ErpPurchaseOrderApi purchaseOrderApi;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createReturnVendor(MesWmReturnVendorSaveReqVO createReqVO) {
// 1. 鏍¢獙鏁版嵁
validateReturnVendorSaveData(createReqVO);
+ // 1.1. 鑻ラ噰璐鍗曞彿涓虹┖浣嗗叧鑱斾簡閲囪喘璁㈠崟锛屽垯浠� ERP 閲囪喘璁㈠崟琛ラ綈璁㈠崟鍙�
+ fillPurchaseOrderCode(createReqVO);
// 2. 鎻掑叆涓昏〃
MesWmReturnVendorDO returnVendor = BeanUtils.toBean(createReqVO, MesWmReturnVendorDO.class);
@@ -67,10 +77,29 @@
public void updateReturnVendor(MesWmReturnVendorSaveReqVO updateReqVO) {
// 1. 鏍¢獙鏁版嵁
validateReturnVendorSaveData(updateReqVO);
+ // 1.1. 鑻ラ噰璐鍗曞彿涓虹┖浣嗗叧鑱斾簡閲囪喘璁㈠崟锛屽垯浠� ERP 閲囪喘璁㈠崟琛ラ綈璁㈠崟鍙�
+ fillPurchaseOrderCode(updateReqVO);
// 2. 鏇存柊涓昏〃
MesWmReturnVendorDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnVendorDO.class);
returnVendorMapper.updateById(updateObj);
+ }
+
+ /**
+ * 褰撻噰璐鍗曞彿涓虹┖銆佷絾鍏宠仈浜嗛噰璐鍗曟椂锛屼粠 ERP 閲囪喘璁㈠崟琛ラ綈閲囪喘璁㈠崟鍙�
+ */
+ private void fillPurchaseOrderCode(MesWmReturnVendorSaveReqVO reqVO) {
+ if (reqVO == null || reqVO.getPurchaseOrderId() == null) {
+ return;
+ }
+ if (cn.hutool.core.util.StrUtil.isNotBlank(reqVO.getPurchaseOrderCode())) {
+ return;
+ }
+ ErpPurchaseOrderRespDTO purchaseOrder =
+ purchaseOrderApi.getPurchaseOrder(reqVO.getPurchaseOrderId()).getCheckedData();
+ if (purchaseOrder != null) {
+ reqVO.setPurchaseOrderCode(purchaseOrder.getNo());
+ }
}
@Override
@@ -240,4 +269,53 @@
return returnVendorMapper.selectCountByVendorId(vendorId);
}
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public int importPurchaseOrderItems(Long id) {
+ // 1. 鏍¢獙閫�璐у崟瀛樺湪涓斾负鑽夌鐘舵��
+ MesWmReturnVendorDO returnVendor = validateReturnVendorExistsAndPrepare(id);
+ if (returnVendor.getPurchaseOrderId() == null) {
+ throw exception(WM_RETURN_VENDOR_PURCHASE_ORDER_REQUIRED);
+ }
+
+ // 2. 鑾峰彇閲囪喘璁㈠崟鍙婃槑缁�
+ ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(returnVendor.getPurchaseOrderId()).getCheckedData();
+ if (purchaseOrder == null) {
+ throw exception(WM_PURCHASE_ORDER_NOT_EXISTS);
+ }
+ List<ErpPurchaseOrderItemRespDTO> items = purchaseOrderApi.getPurchaseOrderItemList(returnVendor.getPurchaseOrderId()).getCheckedData();
+ if (CollUtil.isEmpty(items)) {
+ throw exception(WM_RETURN_VENDOR_PURCHASE_ORDER_NO_ITEM);
+ }
+
+ // 3. 宸插瓨鍦ㄧ殑琛岀墿鏂欓泦鍚堬紙鎸夌墿鏂欏幓閲嶏紝閬垮厤閲嶅甯﹀叆锛�
+ Set<Long> existsItemIds = new HashSet<>();
+ List<MesWmReturnVendorLineDO> existingLines = returnVendorLineService.getReturnVendorLineListByReturnId(id);
+ if (CollUtil.isNotEmpty(existingLines)) {
+ existsItemIds.addAll(convertList(existingLines, MesWmReturnVendorLineDO::getItemId));
+ }
+
+ // 4. 閬嶅巻閲囪喘璁㈠崟鏄庣粏锛岀敓鎴愰��璐ц锛堝彲閫�鏁伴噺 = 宸插叆搴� - 宸查��璐э級
+ int importedCount = 0;
+ for (ErpPurchaseOrderItemRespDTO item : items) {
+ if (item.getProductId() == null || existsItemIds.contains(item.getProductId())) {
+ continue;
+ }
+ BigDecimal inCount = item.getInCount() != null ? item.getInCount() : BigDecimal.ZERO;
+ BigDecimal returnCount = item.getReturnCount() != null ? item.getReturnCount() : BigDecimal.ZERO;
+ BigDecimal quantity = inCount.subtract(returnCount);
+ if (quantity.compareTo(BigDecimal.ZERO) <= 0) {
+ continue;
+ }
+ MesWmReturnVendorLineSaveReqVO lineReqVO = new MesWmReturnVendorLineSaveReqVO();
+ lineReqVO.setReturnId(id);
+ lineReqVO.setItemId(item.getProductId());
+ lineReqVO.setQuantity(quantity);
+ lineReqVO.setRemark(item.getRemark());
+ returnVendorLineService.createReturnVendorLine(lineReqVO);
+ importedCount++;
+ }
+ return importedCount;
+ }
+
}
--
Gitblit v1.9.3