From 79cceefe43f14643781b76def9b980398990d458 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期三, 20 五月 2026 11:48:10 +0800
Subject: [PATCH] feat(approve): 添加审批实例相关DTO、VO类及审批流程工具类

---
 src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java |   71 ++++++++++++++++++++++++++---------
 1 files changed, 53 insertions(+), 18 deletions(-)

diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
index 2bcb92b..983e717 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
@@ -7,12 +7,16 @@
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.approve.pojo.ApproveProcess;
-import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
+import com.ruoyi.approve.bean.dto.ApprovalInstanceDto;
 import com.ruoyi.approve.bean.vo.ApproveGetAndUpdateVo;
 import com.ruoyi.approve.bean.vo.ApproveProcessVO;
-import com.ruoyi.basic.dto.CustomerPrivatePoolDto;
-import com.ruoyi.basic.mapper.CustomerPrivatePoolMapper;
+import com.ruoyi.approve.mapper.ApprovalTemplateMapper;
+import com.ruoyi.approve.pojo.ApproveProcess;
+import com.ruoyi.approve.service.ApprovalInstanceService;
+import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
+import com.ruoyi.basic.mapper.CustomerMapper;
+import com.ruoyi.basic.pojo.Customer;
+import com.ruoyi.common.enums.IsDeleteEnum;
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
@@ -29,8 +33,8 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDate;
-import java.util.Collections;
-import java.util.List;
+import java.time.LocalDateTime;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -42,7 +46,9 @@
     private final SalesQuotationProductService salesQuotationProductService;
 
     private final ApproveProcessServiceImpl approveProcessService;
-    private final CustomerPrivatePoolMapper customerPrivatePoolMapper;
+    private final CustomerMapper customerMapper;
+    private final ApprovalTemplateMapper approvalTemplateMapper;
+    private final ApprovalInstanceService approvalInstanceService;
 
     @Override
     public IPage<SalesQuotationDto> listPage(Page page, SalesQuotationDto salesQuotationDto) {
@@ -50,10 +56,26 @@
         if(CollectionUtils.isEmpty(salesQuotationDtoIPage.getRecords())){
             return salesQuotationDtoIPage;
         }
-        salesQuotationDtoIPage.getRecords().forEach(record -> {
-            List<SalesQuotationProduct> products = salesQuotationProductMapper.selectBySalesQuotationId(record.getId());
-            record.setProducts(products);
-        });
+
+        // 鎵归噺鏌ヨ浜у搧锛岄伩鍏� N+1 闂
+        List<Long> quotationIds = salesQuotationDtoIPage.getRecords().stream()
+                .map(SalesQuotationDto::getId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+
+        if (!quotationIds.isEmpty()) {
+            List<SalesQuotationProduct> allProducts = salesQuotationProductMapper.selectList(
+                    new LambdaQueryWrapper<SalesQuotationProduct>()
+                            .in(SalesQuotationProduct::getSalesQuotationId, quotationIds)
+            );
+
+            Map<Long, List<SalesQuotationProduct>> productMap = allProducts.stream()
+                    .collect(Collectors.groupingBy(SalesQuotationProduct::getSalesQuotationId));
+
+            salesQuotationDtoIPage.getRecords().forEach(record ->
+                    record.setProducts(productMap.getOrDefault(record.getId(), new ArrayList<>()))
+            );
+        }
         return salesQuotationDtoIPage;
     }
 
@@ -61,10 +83,11 @@
     public boolean add(SalesQuotationDto salesQuotationDto) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         SalesQuotation salesQuotation = new SalesQuotation();
-        CustomerPrivatePoolDto customerPrivatePoolDto = customerPrivatePoolMapper.selectInfo(Long.valueOf(salesQuotationDto.getCustomer()));
-        if (ObjectUtils.isNotEmpty(customerPrivatePoolDto))  {
-            BeanUtils.copyProperties(salesQuotationDto, salesQuotation);
-            salesQuotation.setCustomer(customerPrivatePoolDto.getCustomerName());
+        BeanUtils.copyProperties(salesQuotationDto, salesQuotation);
+        salesQuotation.setId(null);
+        Customer customer = customerMapper.selectById(Long.valueOf(salesQuotationDto.getCustomerId()));
+        if (ObjectUtils.isNotEmpty(customer))  {
+            salesQuotation.setCustomer(customer.getCustomerName());
         }
         String quotationNo = OrderUtils.countTodayByCreateTime(salesQuotationMapper, "QT","quotation_no");
         salesQuotation.setQuotationNo(quotationNo);
@@ -91,10 +114,21 @@
         approveProcessVO.setPrice(salesQuotationDto.getTotalAmount());
         try {
             approveProcessService.addApprove(approveProcessVO);
-        }catch (Exception e){
-            log.error("SalesQuotationServiceImpl error:{}", e);
-            throw                                new RuntimeException("瀹℃壒澶辫触");
+        } catch (Exception e) {
+            log.error("SalesQuotationServiceImpl approve error for quotationNo: {}", e);
+            throw new RuntimeException("瀹℃壒澶辫触: " + e.getMessage(), e);
         }
+        // 鎶ヤ环瀹℃壒
+        ApprovalInstanceDto approvalInstanceDto = new ApprovalInstanceDto();
+        approvalInstanceDto.setTemplateId(salesQuotationDto.getTemplateId());
+        approvalInstanceDto.setBusinessId(salesQuotationDto.getId());
+        approvalInstanceDto.setBusinessType(7L);
+        approvalInstanceDto.setTitle("鎶ヤ环缂栧彿锛�" + quotationNo);
+        approvalInstanceDto.setApplicantId(SecurityUtils.getUserId());
+        approvalInstanceDto.setTemplateName(approvalTemplateMapper.selectById(salesQuotationDto.getTemplateId()).getTemplateName());
+        approvalInstanceDto.setApplicantName(SecurityUtils.getLoginUser().getNickName());
+        approvalInstanceDto.setApplyTime(LocalDateTime.now());
+        approvalInstanceService.add(approvalInstanceDto);
         return true;
     }
     @Override
@@ -137,6 +171,7 @@
         // 鍒犻櫎鎶ヤ环瀹℃壒
         ApproveProcess one = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>()
                 .eq(ApproveProcess::getApproveType, 6)
+                .eq(ApproveProcess::getApproveDelete, IsDeleteEnum.NOT_DELETED)
                 .eq(ApproveProcess::getApproveReason, salesQuotation.getQuotationNo()));
         if(one != null){
             approveProcessService.delByIds(Collections.singletonList(one.getId()));

--
Gitblit v1.9.3