From 42aa4f39f08bce889d09963a2185d4fdb45d828e Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期六, 30 五月 2026 15:07:33 +0800
Subject: [PATCH] 协同审批返回采购,发货,报价单号
---
src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java | 135 ++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 126 insertions(+), 9 deletions(-)
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
index 2a4f52a..5da3984 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -105,6 +105,30 @@
}
records.forEach(vo -> {
vo.setBusinessName(TypeEnums.getLabelByValue(vo.getBusinessType()));
+
+ // 鏍规嵁涓氬姟绫诲瀷鏌ヨ瀵瑰簲鐨勫崟鍙�
+ if (vo.getBusinessType() != null && vo.getBusinessId() != null) {
+ if (TypeEnums.PURCHASE_APPROVAL.getCode().equals(vo.getBusinessType())) {
+ // 閲囪喘瀹℃壒 - 鏌ヨ閲囪喘鍗曞彿
+ PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(vo.getBusinessId());
+ System.out.println("涓氬姟绫诲瀷锛�" + purchaseLedger.getPurchaseContractNumber());
+ if (purchaseLedger != null) {
+ vo.setPurchaseContractNumber(purchaseLedger.getPurchaseContractNumber());
+ }
+ } else if (TypeEnums.QUOTATION_APPROVAL.getCode().equals(vo.getBusinessType())) {
+ // 鎶ヤ环瀹℃壒 - 鏌ヨ鎶ヤ环鍗曞彿
+ SalesQuotation salesQuotation = salesQuotationMapper.selectById(vo.getBusinessId());
+ if (salesQuotation != null) {
+ vo.setQuotationNo(salesQuotation.getQuotationNo());
+ }
+ } else if (TypeEnums.SHIPPING_APPROVAL.getCode().equals(vo.getBusinessType())) {
+ // 鍙戣揣瀹℃壒 - 鏌ヨ鍙戣揣鍗曞彿
+ ShippingInfo shippingInfo = shippingInfoMapper.selectById(vo.getBusinessId());
+ if (shippingInfo != null) {
+ vo.setShippingNo(shippingInfo.getShippingNo());
+ }
+ }
+ }
});
Long currentUserId = SecurityUtils.getUserId();
@@ -270,6 +294,87 @@
return approveAndMoveNext(instance, currentNode, approvalInstanceDto, now);
}
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public R autoApprove(Long instanceId) {
+ if (instanceId == null) {
+ return R.fail("瀹℃壒瀹炰緥 ID 涓嶈兘涓虹┖");
+ }
+
+ ApprovalInstance instance = getPendingApprovalInstance(instanceId);
+ if (instance == null) {
+ return R.fail("瀹℃壒瀹炰緥涓嶅瓨鍦�");
+ }
+ if ("REJECTED".equals(instance.getStatus())) {
+ return R.fail("瀹℃壒宸查┏鍥烇紝鏃犳硶鑷姩閫氳繃");
+ }
+ if ("APPROVED".equals(instance.getStatus())) {
+ return R.ok("瀹℃壒宸插畬鎴�");
+ }
+
+ ApprovalInstanceDto autoApproveDto = new ApprovalInstanceDto();
+ autoApproveDto.setId(instanceId);
+ autoApproveDto.setApproveComment("绯荤粺鑷姩瀹℃壒");
+
+ int loopCount = 0;
+ while (loopCount++ < 20) {
+ ApprovalInstance currentInstance = getPendingApprovalInstance(instanceId);
+ if (currentInstance == null) {
+ return R.fail("瀹℃壒瀹炰緥涓嶅瓨鍦�");
+ }
+ if ("APPROVED".equals(currentInstance.getStatus())) {
+ return R.ok("瀹℃壒宸插畬鎴�");
+ }
+ if ("REJECTED".equals(currentInstance.getStatus())) {
+ return R.fail("瀹℃壒宸查┏鍥烇紝鏃犳硶鑷姩閫氳繃");
+ }
+
+ ApprovalInstanceNode currentNode = approveProcessConfigNodeUtils.getCurrentNode(currentInstance.getId());
+ if (currentNode == null) {
+ currentInstance.setStatus("APPROVED");
+ currentInstance.setFinishTime(LocalDateTime.now());
+ this.updateById(currentInstance);
+ handleBusinessAfterApprovalFinished(currentInstance);
+ return R.ok("瀹℃壒宸插畬鎴�");
+ }
+
+ List<ApprovalTask> pendingTasks = approvalTaskService.list(
+ Wrappers.<ApprovalTask>lambdaQuery()
+ .eq(ApprovalTask::getInstanceId, currentInstance.getId())
+ .eq(ApprovalTask::getNodeId, currentNode.getId())
+ .eq(ApprovalTask::getTaskStatus, "PENDING")
+ .eq(ApprovalTask::getDeleted, 0)
+ );
+
+ LocalDateTime now = LocalDateTime.now();
+ for (ApprovalTask currentTask : pendingTasks) {
+ if (!updateCurrentTask(autoApproveDto, "APPROVED", currentTask, now)) {
+ return R.fail("褰撳墠浠诲姟宸茶澶勭悊锛岃鍒锋柊鍚庨噸璇�");
+ }
+ saveApprovalRecord(
+ currentInstance.getId(),
+ currentNode.getId(),
+ currentTask.getId(),
+ 0L,
+ "绯荤粺鑷姩瀹℃壒",
+ "APPROVED",
+ autoApproveDto.getApproveComment()
+ );
+ }
+
+ if (!approveProcessConfigNodeUtils.canProceedToNextLevel(currentInstance.getId(), currentNode.getApproveType())) {
+ return R.ok("瀹℃壒鎴愬姛锛岀瓑寰呭叾浠栧鎵逛汉澶勭悊");
+ }
+
+ R moveResult = moveToNextLevel(currentInstance, currentNode, autoApproveDto, now, false);
+ if (!R.isSuccess(moveResult)) {
+ return moveResult;
+ }
+ }
+
+ return R.fail("鑷姩瀹℃壒寰幆娆℃暟瓒呴檺");
+ }
+
private String normalizeApproveAction(String approveAction) {
if (!StringUtils.hasText(approveAction)) {
return null;
@@ -336,6 +441,14 @@
ApprovalInstanceNode currentNode,
ApprovalInstanceDto approvalInstanceDto,
LocalDateTime now) {
+ return moveToNextLevel(instance, currentNode, approvalInstanceDto, now, true);
+ }
+
+ private R moveToNextLevel(ApprovalInstance instance,
+ ApprovalInstanceNode currentNode,
+ ApprovalInstanceDto approvalInstanceDto,
+ LocalDateTime now,
+ boolean notifyNextNode) {
if (!updateCurrentNodeStatus(currentNode.getId(), "APPROVED", now)) {
return R.ok("褰撳墠鑺傜偣宸插鐞嗗畬鎴�");
}
@@ -359,14 +472,16 @@
instance.setCurrentLevel(nextLevel);
instance.setStatus("PENDING");
this.updateById(instance);
- List<ApprovalTask> nextTasks = approvalTaskService.list(
- Wrappers.<ApprovalTask>lambdaQuery()
- .eq(ApprovalTask::getInstanceId, instance.getId())
- .eq(ApprovalTask::getNodeId, nextInstanceNode.getId())
- .eq(ApprovalTask::getTaskStatus, "PENDING")
- .eq(ApprovalTask::getDeleted, 0)
- );
- sendApproveNotice(instance, nextTasks);
+ if (notifyNextNode) {
+ List<ApprovalTask> nextTasks = approvalTaskService.list(
+ Wrappers.<ApprovalTask>lambdaQuery()
+ .eq(ApprovalTask::getInstanceId, instance.getId())
+ .eq(ApprovalTask::getNodeId, nextInstanceNode.getId())
+ .eq(ApprovalTask::getTaskStatus, "PENDING")
+ .eq(ApprovalTask::getDeleted, 0)
+ );
+ sendApproveNotice(instance, nextTasks);
+ }
return R.ok("瀹℃壒鎴愬姛锛屽凡娴佽浆鍒颁笅涓�鑺傜偣");
}
@@ -390,7 +505,9 @@
instance.setStatus("PENDING");
this.updateById(instance);
approveProcessConfigNodeUtils.createCurrentNodeAndTasks(instance, false);
- sendApproveNotice(instance, approveProcessConfigNodeUtils.getCurrentPendingTasks(approvalInstanceDto.getId()));
+ if (notifyNextNode) {
+ sendApproveNotice(instance, approveProcessConfigNodeUtils.getCurrentPendingTasks(approvalInstanceDto.getId()));
+ }
return R.ok("瀹℃壒鎴愬姛锛屽凡娴佽浆鍒颁笅涓�鑺傜偣");
}
--
Gitblit v1.9.3