From 66c6ab9883ecb5e0595f02fec6b66e962d1fbf67 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 03 六月 2026 10:12:23 +0800
Subject: [PATCH] Merge branch 'dev_New_pro' into dev_宁夏_英泽防锈
---
src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java | 285 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 271 insertions(+), 14 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 3e710a8..931159e 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -12,6 +12,8 @@
import com.ruoyi.approve.mapper.ApprovalInstanceMapper;
import com.ruoyi.approve.mapper.ApprovalTemplateNodeApproverMapper;
import com.ruoyi.approve.mapper.FinReimbursementMapper;
+import com.ruoyi.approve.mapper.VehicleBorrowRecordMapper;
+import com.ruoyi.approve.mapper.VehicleMapper;
import com.ruoyi.approve.pojo.*;
import com.ruoyi.approve.service.*;
import com.ruoyi.approve.utils.ApproveProcessConfigNodeUtils;
@@ -25,6 +27,7 @@
import com.ruoyi.collaborativeApproval.pojo.EnterpriseNewsScopeDept;
import com.ruoyi.collaborativeApproval.pojo.EnterpriseNewsScopeUser;
import com.ruoyi.common.enums.*;
+import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.security.LoginUser;
@@ -85,6 +88,8 @@
private final SalesQuotationMapper salesQuotationMapper;
private final ShippingInfoMapper shippingInfoMapper;
private final QualityInspectHelper qualityInspectHelper;
+ private final VehicleBorrowRecordMapper vehicleBorrowRecordMapper;
+ private final VehicleMapper vehicleMapper;
private final EnterpriseNewsScopeUserMapper enterpriseNewsScopeUserMapper;
private final SysUserMapper sysUserMapper;
private final SysUserDeptMapper sysUserDeptMapper;
@@ -104,6 +109,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();
@@ -139,7 +168,7 @@
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean add(ApprovalInstanceDto approvalInstanceDto) {
- String instanceNo = OrderUtils.countTodayByCreateTime(approvalInstanceMapper, "SP", "instance_no");
+ String instanceNo = OrderUtils.countTodayByCreateTime(approvalInstanceMapper, "SP", "instance_no", approvalInstanceDto.getCreateTime() != null ? approvalInstanceDto.getCreateTime() : LocalDateTime.now());
approvalInstanceDto.setInstanceNo(instanceNo);
approvalInstanceDto.setStatus("PENDING");
approvalInstanceDto.setCurrentLevel(1);
@@ -158,6 +187,16 @@
public Boolean update(ApprovalInstanceDto approvalInstanceDto) {
if (approvalInstanceDto == null || approvalInstanceDto.getId() == null) {
return false;
+ }
+ // 鍒ゆ柇鏄惁鏈夋鍦ㄨ繘琛岀殑瀹℃壒浠诲姟锛屾湁鍒欎笉鍏佽淇敼
+ long pendingTaskCount = approvalTaskService.count(
+ Wrappers.<ApprovalTask>lambdaQuery()
+ .eq(ApprovalTask::getInstanceId, approvalInstanceDto.getId())
+ .eq(ApprovalTask::getTaskStatus, "PENDING")
+ .eq(ApprovalTask::getDeleted, 0)
+ );
+ if (pendingTaskCount > 0) {
+ throw new ServiceException("璇ュ鎵瑰崟鏈夋鍦ㄨ繘琛岀殑瀹℃壒浠诲姟锛屼笉鍏佽淇敼");
}
boolean updated = this.updateById(approvalInstanceDto);
if (!updated) {
@@ -259,6 +298,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;
@@ -304,6 +424,8 @@
instance.setStatus("REJECTED");
instance.setFinishTime(now);
this.updateById(instance);
+ // 缁熶竴澶勭悊涓氬姟鐘舵�佹洿鏂�
+ handleBusinessAfterApprovalFinished(instance);
// 椹冲洖瀵瑰簲鐨勪紒涓氭柊闂伙紝 宸梾鎶ラ攢
if (instance.getBusinessType().equals(TypeEnums.ENTERPRISE_NEWS_APPROVAL.getCode())) {
enterpriseNewsMapper.update(
@@ -317,6 +439,26 @@
.eq(FinReimbursement::getId, instance.getBusinessId())
.set(FinReimbursement::getBillStatus, "REJECTED")
);
+ } else if (TypeEnums.VEHICLE_BORROW_APPROVAL.getCode().equals(instance.getBusinessType())) {
+ vehicleBorrowRecordMapper.update(
+ null,
+ new LambdaUpdateWrapper<VehicleBorrowRecord>()
+ .eq(VehicleBorrowRecord::getId, instance.getBusinessId())
+ .set(VehicleBorrowRecord::getBorrowStatus, "REJECTED")
+ .set(VehicleBorrowRecord::getApprovalInstanceId, instance.getId())
+ );
+ VehicleBorrowRecord borrowRecord = vehicleBorrowRecordMapper.selectById(instance.getBusinessId());
+ if (borrowRecord != null) {
+ syncVehicleBorrowStatus(borrowRecord.getVehicleId());
+ }
+ } else if (TypeEnums.VEHICLE_DELAY_APPROVAL.getCode().equals(instance.getBusinessType())) {
+ vehicleBorrowRecordMapper.update(
+ null,
+ new LambdaUpdateWrapper<VehicleBorrowRecord>()
+ .eq(VehicleBorrowRecord::getId, instance.getBusinessId())
+ .set(VehicleBorrowRecord::getExtendStatus, "REJECTED")
+ .set(VehicleBorrowRecord::getExtendApprovalInstanceId, null)
+ );
}
return R.ok("瀹℃壒宸查┏鍥�");
}
@@ -325,6 +467,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("褰撳墠鑺傜偣宸插鐞嗗畬鎴�");
}
@@ -348,14 +498,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("瀹℃壒鎴愬姛锛屽凡娴佽浆鍒颁笅涓�鑺傜偣");
}
@@ -379,7 +531,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("瀹℃壒鎴愬姛锛屽凡娴佽浆鍒颁笅涓�鑺傜偣");
}
@@ -434,6 +588,11 @@
}
if (TypeEnums.ENTERPRISE_NEWS_APPROVAL.getCode().equals(businessType)) {
handleNewsApprovalFinished(instance, status);
+ return;
+ }
+ if (TypeEnums.VEHICLE_BORROW_APPROVAL.getCode().equals(businessType)
+ || TypeEnums.VEHICLE_DELAY_APPROVAL.getCode().equals(businessType)) {
+ handleVehicleBorrowApprovalFinished(instance, status);
}
}
@@ -496,7 +655,7 @@
private void handlePurchaseApprovalFinished(ApprovalInstance instance, String status) {
PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(
new LambdaQueryWrapper<PurchaseLedger>()
- .eq(PurchaseLedger::getPurchaseContractNumber, instance.getTitle())
+ .eq(PurchaseLedger::getId, instance.getBusinessId())
.last("limit 1")
);
if (purchaseLedger == null) {
@@ -534,7 +693,7 @@
private void handleSalesQuotationApprovalFinished(ApprovalInstance instance, String status) {
SalesQuotation salesQuote = salesQuotationMapper.selectOne(
new LambdaQueryWrapper<SalesQuotation>()
- .eq(SalesQuotation::getQuotationNo, instance.getTitle())
+ .eq(SalesQuotation::getId, instance.getBusinessId())
.last("limit 1")
);
if (salesQuote == null) {
@@ -573,6 +732,104 @@
shippingInfo.setStatus(ShippingStatusEnum.IN_PROGRESS.getCode());
}
shippingInfoMapper.updateById(shippingInfo);
+ }
+
+ private void handleVehicleBorrowApprovalFinished(ApprovalInstance instance, String status) {
+ if (instance == null || instance.getBusinessId() == null) {
+ return;
+ }
+
+ VehicleBorrowRecord record = vehicleBorrowRecordMapper.selectById(instance.getBusinessId());
+ if (record == null || Integer.valueOf(1).equals(record.getDeleted())) {
+ return;
+ }
+
+ if (TypeEnums.VEHICLE_BORROW_APPROVAL.getCode().equals(instance.getBusinessType())) {
+ if ("APPROVED".equals(status)) {
+ Vehicle vehicle = vehicleMapper.selectById(record.getVehicleId());
+ if (vehicle == null) {
+ throw new ServiceException("杞﹁締涓嶅瓨鍦�");
+ }
+ VehicleBorrowRecord update = new VehicleBorrowRecord();
+ update.setId(record.getId());
+ update.setBorrowStatus("BORROWING");
+ update.setApprovedTime(instance.getFinishTime());
+ update.setApprovalInstanceId(instance.getId());
+ vehicleBorrowRecordMapper.updateById(update);
+ syncVehicleBorrowStatus(vehicle.getId());
+ return;
+ }
+ if ("REJECTED".equals(status)) {
+ VehicleBorrowRecord update = new VehicleBorrowRecord();
+ update.setId(record.getId());
+ update.setBorrowStatus("REJECTED");
+ update.setApprovalInstanceId(instance.getId());
+ vehicleBorrowRecordMapper.updateById(update);
+ syncVehicleBorrowStatus(record.getVehicleId());
+ return;
+ }
+ if ("PENDING".equals(status)) {
+ VehicleBorrowRecord update = new VehicleBorrowRecord();
+ update.setId(record.getId());
+ update.setBorrowStatus("IN_APPROVAL");
+ update.setApprovalInstanceId(instance.getId());
+ vehicleBorrowRecordMapper.updateById(update);
+ }
+ return;
+ }
+
+ if (TypeEnums.VEHICLE_DELAY_APPROVAL.getCode().equals(instance.getBusinessType())) {
+ if ("APPROVED".equals(status)) {
+ vehicleBorrowRecordMapper.update(
+ null,
+ new LambdaUpdateWrapper<VehicleBorrowRecord>()
+ .eq(VehicleBorrowRecord::getId, record.getId())
+ .set(VehicleBorrowRecord::getBorrowStatus, "BORROWING")
+ .set(VehicleBorrowRecord::getExtendStatus, "APPROVED")
+ .set(VehicleBorrowRecord::getExtendApprovedTime, instance.getFinishTime())
+ .set(VehicleBorrowRecord::getPlannedReturnTime, record.getExtendTargetReturnTime())
+ .set(VehicleBorrowRecord::getExtendApprovalInstanceId, null)
+ );
+ return;
+ }
+ if ("REJECTED".equals(status)) {
+ vehicleBorrowRecordMapper.update(
+ null,
+ new LambdaUpdateWrapper<VehicleBorrowRecord>()
+ .eq(VehicleBorrowRecord::getId, record.getId())
+ .set(VehicleBorrowRecord::getExtendStatus, "REJECTED")
+ .set(VehicleBorrowRecord::getExtendApprovalInstanceId, null)
+ );
+ return;
+ }
+ if ("PENDING".equals(status)) {
+ VehicleBorrowRecord update = new VehicleBorrowRecord();
+ update.setId(record.getId());
+ update.setExtendStatus("PENDING");
+ update.setExtendApprovalInstanceId(instance.getId());
+ vehicleBorrowRecordMapper.updateById(update);
+ }
+ }
+ }
+
+ private void syncVehicleBorrowStatus(Long vehicleId) {
+ if (vehicleId == null) {
+ return;
+ }
+ long activeBorrowCount = vehicleBorrowRecordMapper.selectCount(
+ new LambdaQueryWrapper<VehicleBorrowRecord>()
+ .eq(VehicleBorrowRecord::getVehicleId, vehicleId)
+ .eq(VehicleBorrowRecord::getDeleted, 0)
+ .in(VehicleBorrowRecord::getBorrowStatus, "IN_APPROVAL", "BORROWING")
+ );
+ Vehicle vehicle = vehicleMapper.selectById(vehicleId);
+ if (vehicle == null) {
+ throw new ServiceException("杞﹁締涓嶅瓨鍦�");
+ }
+ Vehicle vehicleUpdate = new Vehicle();
+ vehicleUpdate.setId(vehicleId);
+ vehicleUpdate.setStatus(activeBorrowCount > 0 ? "IN_USE" : "IDLE");
+ vehicleMapper.updateById(vehicleUpdate);
}
private List<ApprovalTask> createNodeAndTasks(ApprovalInstance instance, ApprovalTemplateNode templateNode) {
@@ -629,7 +886,7 @@
String title = StringUtils.hasText(instance.getTemplateName()) ? instance.getTemplateName() : "瀹℃壒鎻愰啋";
String message = "瀹℃壒鍗曞彿 " + instance.getInstanceNo() + " 闇�瑕佹偍瀹℃壒";
- String jumpPath = "/approvalInstance?id=" + instance.getId();
+ String jumpPath = "/officeProcessAutomation/ApproveManage/approve-list?id=" + instance.getId();
sysNoticeService.simpleNoticeByUser(title, message, approverIds, jumpPath);
}
@@ -644,7 +901,7 @@
}
String title = "浼佷笟鏂伴椈";
String message = "鎮ㄦ湁鏂扮殑浼佷笟鏂伴椈銆�" + enterpriseNews.getTitle() + "銆嬭鍙婃椂鏌ラ槄";
- String jumpPath = "/enterpriseNews?id=" + newsId;
+ String jumpPath = "/officeProcessAutomation/EnterpriseNews?id=" + newsId;
sysNoticeService.simpleNoticeByUser(title, message, userIds, jumpPath);
}
--
Gitblit v1.9.3