From 8c65f898ed6e5b0c7a94c792c4562f6ec831dccd Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期六, 07 十一月 2026 08:50:53 +0800
Subject: [PATCH] feat: 完善质检、生产、销售、财务与人事模块并接入审批流程
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java | 95 +++++++++++++++++++++++++++++++++++++++++------
1 files changed, 82 insertions(+), 13 deletions(-)
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 f08d468..387146e 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
@@ -62,6 +62,7 @@
* 闄勪欢涓氬姟绫诲瀷锛歁ES 渚涘簲鍟嗛��璐у崟
*/
public static final String RETURN_VENDOR_RECORD_TYPE = "mes_wm_return_vendor";
+ private static final String RETURN_VENDOR_APPROVAL_KEY = "purchase_return_vendor_approve";
@Resource
private MesWmReturnVendorMapper returnVendorMapper;
@@ -185,26 +186,25 @@
@Override
@Transactional(rollbackFor = Exception.class)
public void submitReturnVendor(Long id) {
- // 鏍¢獙瀛樺湪 + 鑽夌鐘舵��
- validateReturnVendorExistsAndPrepare(id);
- // 鏍¢獙鑷冲皯鏈変竴鏉¤
- List<MesWmReturnVendorLineDO> lines = returnVendorLineService.getReturnVendorLineListByReturnId(id);
- if (CollUtil.isEmpty(lines)) {
- throw exception(WM_RETURN_VENDOR_NO_LINE);
- }
-
- // 鎻愪氦锛堣崏绋� -> 寰呮嫞璐э級
- returnVendorMapper.updateById(new MesWmReturnVendorDO()
- .setId(id).setStatus(MesWmReturnVendorStatusEnum.APPROVING.getStatus()));
+ submitReturnVendorApproval(id, RETURN_VENDOR_APPROVAL_KEY);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void submitReturnVendorApproval(Long id, String processDefinitionKey) {
+ if (!RETURN_VENDOR_APPROVAL_KEY.equals(processDefinitionKey)) {
+ throw exception(WM_RETURN_VENDOR_APPROVAL_PROCESS_INVALID, RETURN_VENDOR_APPROVAL_KEY);
+ }
// 1. 鏍¢獙瀛樺湪 + 鑽夌鐘舵�� + 鑷冲皯涓�鏉¤
MesWmReturnVendorDO returnVendor = validateReturnVendorExistsAndPrepare(id);
if (CollUtil.isEmpty(returnVendorLineService.getReturnVendorLineListByReturnId(id))) {
throw exception(WM_RETURN_VENDOR_NO_LINE);
+ }
+ validateReturnVendorOrderQuantity(returnVendor);
+ // 鎷h揣鍙湪瀹℃壒閫氳繃鍚庤繘琛岋紱濡傚凡鎻愬墠褰曞叆鏄庣粏锛屽垯鎻愪氦鍓嶅繀椤绘暟閲忓畧鎭掋��
+ if (CollUtil.isNotEmpty(returnVendorDetailService.getReturnVendorDetailListByReturnId(id))
+ && !checkReturnVendorQuantity(id)) {
+ throw exception(WM_RETURN_VENDOR_DETAIL_QUANTITY_MISMATCH);
}
// 1.1. 璐ㄩ噺閮ㄥ彂璧烽��璐у繀椤讳笂浼犻檮浠讹紙璐ㄦ鎶ュ憡銆佷笉鍚堟牸鐓х墖绛夛級锛屽惁鍒欏鎵逛汉鏃犳硶鍒ゆ柇閫�璐т緷鎹�
if (CollUtil.isEmpty(storageAttachmentApi.listAttachments(RETURN_VENDOR_RECORD_TYPE, id))) {
@@ -284,6 +284,11 @@
if (ObjUtil.notEqual(MesWmReturnVendorStatusEnum.APPROVING.getStatus(), returnVendor.getStatus())) {
throw exception(WM_RETURN_VENDOR_STATUS_INVALID);
}
+ validateReturnVendorApproval(returnVendor);
+ if (!checkReturnVendorQuantity(id)) {
+ throw exception(WM_RETURN_VENDOR_DETAIL_QUANTITY_MISMATCH);
+ }
+ validateReturnVendorOrderQuantity(returnVendor);
// 鎵ц鎷h揣锛堝緟鎷h揣 -> 寰呮墽琛岄��璐э級
returnVendorMapper.updateById(new MesWmReturnVendorDO()
.setId(id).setStatus(MesWmReturnVendorStatusEnum.APPROVED.getStatus()));
@@ -297,11 +302,16 @@
if (ObjUtil.notEqual(MesWmReturnVendorStatusEnum.APPROVED.getStatus(), returnVendor.getStatus())) {
throw exception(WM_RETURN_VENDOR_STATUS_INVALID);
}
+ validateReturnVendorApproval(returnVendor);
// 1.2 鏍¢獙鏄庣粏涓嶄负绌�
List<MesWmReturnVendorDetailDO> details = returnVendorDetailService.getReturnVendorDetailListByReturnId(id);
if (CollUtil.isEmpty(details)) {
throw exception(WM_RETURN_VENDOR_NO_DETAIL);
}
+ if (!checkReturnVendorQuantity(id)) {
+ throw exception(WM_RETURN_VENDOR_DETAIL_QUANTITY_MISMATCH);
+ }
+ validateReturnVendorOrderQuantity(returnVendor);
// 1.3 鏍¢獙澶勭悊鏂瑰紡锛堥��娆� / 鎹㈣揣锛�
if (!MesWmReturnVendorHandleTypeEnum.isValid(returnVendor.getHandleType())) {
@@ -326,6 +336,13 @@
}
}
+ private void validateReturnVendorApproval(MesWmReturnVendorDO returnVendor) {
+ if (!RETURN_VENDOR_APPROVAL_KEY.equals(returnVendor.getProcessDefinitionKey())
+ || returnVendor.getProcessInstanceId() == null) {
+ throw exception(WM_RETURN_VENDOR_APPROVAL_REQUIRED, returnVendor.getCode());
+ }
+ }
+
/**
* 鎶婇��璐ф暟閲忓閲忓洖鍐欏埌鍏宠仈閲囪喘璁㈠崟鐨勬槑缁嗚锛屽苟鍚屾璁㈠崟绾ч��璐ф暟閲�
*/
@@ -343,15 +360,58 @@
return;
}
Map<Long, Long> purchaseOrderItemIdMap = new HashMap<>();
+ Set<Long> ambiguousProductIds = new HashSet<>();
orderItems.stream()
.filter(item -> item.getProductId() != null)
- .forEach(item -> purchaseOrderItemIdMap.putIfAbsent(item.getProductId(), item.getId()));
+ .forEach(item -> {
+ if (purchaseOrderItemIdMap.putIfAbsent(item.getProductId(), item.getId()) != null) {
+ ambiguousProductIds.add(item.getProductId());
+ }
+ });
for (MesWmReturnVendorLineDO line : lines) {
+ if (ambiguousProductIds.contains(line.getItemId())) {
+ throw exception(WM_RETURN_VENDOR_PURCHASE_ITEM_AMBIGUOUS, line.getItemId());
+ }
Long purchaseOrderItemId = purchaseOrderItemIdMap.get(line.getItemId());
if (purchaseOrderItemId == null || line.getQuantity() == null) {
continue;
}
- purchaseOrderApi.updateOrderItemReturnCount(purchaseOrderItemId, line.getQuantity());
+ if (!Boolean.TRUE.equals(purchaseOrderApi.updateOrderItemReturnCount(purchaseOrderItemId, line.getQuantity()).getCheckedData())) {
+ throw exception(WM_RETURN_VENDOR_ITEM_NOT_IN_PURCHASE_ORDER);
+ }
+ }
+ }
+
+ private void validateReturnVendorOrderQuantity(MesWmReturnVendorDO returnVendor) {
+ if (returnVendor.getPurchaseOrderId() == null) {
+ return;
+ }
+ List<ErpPurchaseOrderItemRespDTO> items = purchaseOrderApi
+ .getPurchaseOrderItemList(returnVendor.getPurchaseOrderId()).getCheckedData();
+ Map<Long, ErpPurchaseOrderItemRespDTO> byProduct = new HashMap<>();
+ Set<Long> ambiguousProductIds = new HashSet<>();
+ for (ErpPurchaseOrderItemRespDTO item : items) {
+ if (item.getProductId() != null && byProduct.putIfAbsent(item.getProductId(), item) != null) {
+ ambiguousProductIds.add(item.getProductId());
+ }
+ }
+ Map<Long, BigDecimal> requested = new HashMap<>();
+ for (MesWmReturnVendorLineDO line : returnVendorLineService.getReturnVendorLineListByReturnId(returnVendor.getId())) {
+ requested.merge(line.getItemId(), line.getQuantity(), BigDecimal::add);
+ }
+ for (Map.Entry<Long, BigDecimal> entry : requested.entrySet()) {
+ if (ambiguousProductIds.contains(entry.getKey())) {
+ throw exception(WM_RETURN_VENDOR_PURCHASE_ITEM_AMBIGUOUS, entry.getKey());
+ }
+ ErpPurchaseOrderItemRespDTO item = byProduct.get(entry.getKey());
+ if (item == null) {
+ throw exception(WM_RETURN_VENDOR_ITEM_NOT_IN_PURCHASE_ORDER);
+ }
+ BigDecimal available = (item.getInCount() == null ? BigDecimal.ZERO : item.getInCount())
+ .subtract(item.getReturnCount() == null ? BigDecimal.ZERO : item.getReturnCount());
+ if (entry.getValue().compareTo(available) > 0) {
+ throw exception(WM_RETURN_VENDOR_QUANTITY_EXCEED, entry.getKey(), entry.getValue(), available);
+ }
}
}
@@ -506,6 +566,15 @@
throw exception(WM_RETURN_VENDOR_CANCEL_NOT_ALLOWED);
}
+ // 瀹℃壒涓厛鎾ら攢 BPM 瀹炰緥锛屾挙閿�澶辫触鏃朵繚鐣欏崟鎹師鐘舵�佸拰寰呭姙銆�
+ if (MesWmReturnVendorStatusEnum.BPM_APPROVING.getStatus().equals(returnVendor.getStatus())) {
+ if (StrUtil.isBlank(returnVendor.getProcessInstanceId())) {
+ throw exception(WM_RETURN_VENDOR_APPROVAL_REQUIRED, returnVendor.getCode());
+ }
+ processInstanceApi.cancelProcessInstanceByStartUser(getCurrentUserId(),
+ returnVendor.getProcessInstanceId(), "渚涘簲鍟嗛��璐у崟鍙栨秷");
+ }
+
// 鍙栨秷
returnVendorMapper.updateById(new MesWmReturnVendorDO()
.setId(id).setStatus(MesWmReturnVendorStatusEnum.CANCELED.getStatus()));
--
Gitblit v1.9.3