From ac28c343201a816fad993e58f551ed64a4abe08a Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 29 五月 2026 11:50:55 +0800
Subject: [PATCH] feat(approve): 添加车辆管理模块及审批功能

---
 src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java |  146 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 142 insertions(+), 4 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 251ff05..50052a5 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;
@@ -139,7 +144,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 +163,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) {
@@ -317,6 +332,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("瀹℃壒宸查┏鍥�");
     }
@@ -434,6 +469,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 +536,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 +574,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) {
@@ -554,7 +594,7 @@
     private void handleShippingApprovalFinished(ApprovalInstance instance, String status) {
         ShippingInfo shippingInfo = shippingInfoMapper.selectOne(
                 new LambdaQueryWrapper<ShippingInfo>()
-                        .eq(ShippingInfo::getShippingNo, instance.getTitle())
+                        .eq(ShippingInfo::getId, instance.getTitle())
                         .orderByDesc(ShippingInfo::getCreateTime)
                         .last("limit 1")
         );
@@ -575,6 +615,104 @@
         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) {
         List<ApprovalTemplateNodeApprover> approvers = approvalTemplateNodeApproverMapper.selectList(
                 new LambdaQueryWrapper<ApprovalTemplateNodeApprover>()

--
Gitblit v1.9.3