From fdb632b25e13186c2af67e53e019acecaf363ac0 Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期五, 29 五月 2026 16:32:34 +0800
Subject: [PATCH] feat: 采购合同号重复问题调整

---
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java |  231 +++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 165 insertions(+), 66 deletions(-)

diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index a7d5765..d3d7e32 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -50,10 +50,12 @@
 import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FilenameUtils;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
@@ -83,51 +85,71 @@
  * @date 2025-05-09
  */
 @Service
-@RequiredArgsConstructor
 @Slf4j
 public class PurchaseLedgerServiceImpl extends ServiceImpl<PurchaseLedgerMapper, PurchaseLedger> implements IPurchaseLedgerService {
-    private final AccountExpenseService accountExpenseService;
-    private final PurchaseLedgerMapper purchaseLedgerMapper;
+    @Autowired
+    private  AccountExpenseService accountExpenseService;
+    @Autowired
+    private  PurchaseLedgerMapper purchaseLedgerMapper;
 
-    private final SalesLedgerMapper salesLedgerMapper;
-    private final SalesLedgerProductMapper salesLedgerProductMapper;
+    @Autowired
+    private  SalesLedgerMapper salesLedgerMapper;
+    @Autowired
+    private  SalesLedgerProductMapper salesLedgerProductMapper;
 
-    private final SysUserMapper userMapper;
+    @Autowired
+    private  SysUserMapper userMapper;
 
-    private final TempFileMapper tempFileMapper;
+    @Autowired
+    private  TempFileMapper tempFileMapper;
 
-    private final CommonFileMapper commonFileMapper;
+    @Autowired
+    private  CommonFileMapper commonFileMapper;
 
-    private final SupplierManageMapper supplierManageMapper;
+    @Autowired
+    private  SupplierManageMapper supplierManageMapper;
 
-    private final ProductMapper productMapper;
+    @Autowired
+    private  ProductMapper productMapper;
 
-    private final ProductModelMapper productModelMapper;
+    @Autowired
+    private  ProductModelMapper productModelMapper;
 
-    private final SysUserMapper sysUserMapper;
+    @Autowired
+    private  SysUserMapper sysUserMapper;
 
-    private final TicketRegistrationMapper ticketRegistrationMapper;
+    @Autowired
+    private  TicketRegistrationMapper ticketRegistrationMapper;
 
-    private final ProductRecordMapper productRecordMapper;
+    @Autowired
+    private  ProductRecordMapper productRecordMapper;
 
-    private final PaymentRegistrationMapper paymentRegistrationMapper;
-
-    private final InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
-
-    private final StringRedisTemplate redisTemplate;
-    private final QualityInspectMapper qualityInspectMapper;
-    private final QualityTestStandardBindingMapper qualityTestStandardBindingMapper;
-    private final QualityTestStandardParamMapper qualityTestStandardParamMapper;
-    private final QualityTestStandardMapper qualityTestStandardMapper;
-    private final QualityInspectParamMapper qualityInspectParamMapper;
-
-    private final ApproveProcessServiceImpl approveProcessService;
-
-    private final ProcurementRecordMapper procurementRecordStorageMapper;
-
-    private final PurchaseLedgerTemplateMapper purchaseLedgerTemplateMapper;
-
-    private final SalesLedgerProductTemplateMapper salesLedgerProductTemplateMapper;
+    @Autowired
+    private  PaymentRegistrationMapper paymentRegistrationMapper;
+    @Autowired
+    private  InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
+    @Autowired
+    private  StringRedisTemplate redisTemplate;
+    @Autowired
+    private  QualityInspectMapper qualityInspectMapper;
+    @Autowired
+    private  CommonFileServiceImpl commonFileService;
+    @Autowired
+    private  QualityTestStandardBindingMapper qualityTestStandardBindingMapper;
+    @Autowired
+    private  QualityTestStandardParamMapper qualityTestStandardParamMapper;
+    @Autowired
+    private  QualityTestStandardMapper qualityTestStandardMapper;
+    @Autowired
+    private  QualityInspectParamMapper qualityInspectParamMapper;
+    @Autowired
+    private  ApproveProcessServiceImpl approveProcessService;
+    @Autowired
+    private  ProcurementRecordMapper procurementRecordStorageMapper;
+    @Autowired
+    private  PurchaseLedgerTemplateMapper purchaseLedgerTemplateMapper;
+    @Autowired
+    private  SalesLedgerProductTemplateMapper salesLedgerProductTemplateMapper;
     @Value("${file.upload-dir}")
     private String uploadDir;
 
@@ -136,6 +158,12 @@
         LambdaQueryWrapper<PurchaseLedger> queryWrapper = new LambdaQueryWrapper<>();
         if (StringUtils.isNotBlank(purchaseLedger.getPurchaseContractNumber())) {
             queryWrapper.like(PurchaseLedger::getPurchaseContractNumber, purchaseLedger.getPurchaseContractNumber());
+        }
+        if(purchaseLedger.getSupplierId()!=null){
+            queryWrapper.eq(PurchaseLedger::getSupplierId, purchaseLedger.getSupplierId());
+        }
+        if (purchaseLedger.getApprovalStatus() != null) {
+            queryWrapper.eq(PurchaseLedger::getApprovalStatus, purchaseLedger.getApprovalStatus());
         }
         return purchaseLedgerMapper.selectList(queryWrapper);
     }
@@ -187,15 +215,15 @@
         if (productList != null && !productList.isEmpty()) {
             handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType());
         }
-        //鏂板鍘熸潗鏂欐楠�
-        if (productList != null) {
-            for (SalesLedgerProduct saleProduct : productList) {
-                //鏄惁鎺ㄩ�佽川妫�锛屽鏋渢rue灏辨坊鍔�
-                if (saleProduct.getIsChecked()) {
-                    addQualityInspect(purchaseLedger, saleProduct);
-                }
-            }
-        }
+        //鏂板鍘熸潗鏂欐楠�  瀹℃壒涔嬪悗鎵嶇敓鎴愭楠�
+//        if (productList != null) {
+//            for (SalesLedgerProduct saleProduct : productList) {
+//                //鏄惁鎺ㄩ�佽川妫�锛屽鏋渢rue灏辨坊鍔�
+//                if (saleProduct.getIsChecked()) {
+//                    addQualityInspect(purchaseLedger, saleProduct);
+//                }
+//            }
+//        }
         // 5. 杩佺Щ涓存椂鏂囦欢鍒版寮忕洰褰�
         if (purchaseLedgerDto.getTempFileIds() != null && !purchaseLedgerDto.getTempFileIds().isEmpty()) {
             migrateTempFilesToFormal(purchaseLedger.getId(), purchaseLedgerDto.getTempFileIds());
@@ -203,7 +231,8 @@
         return 1;
     }
 
-    private void addQualityInspect(PurchaseLedger purchaseLedger, SalesLedgerProduct saleProduct) {
+
+    public void addQualityInspect(PurchaseLedger purchaseLedger, SalesLedgerProduct saleProduct) {
         QualityInspect qualityInspect = new QualityInspect();
         qualityInspect.setInspectType(0);
         qualityInspect.setSupplier(purchaseLedger.getSupplierName());
@@ -398,6 +427,12 @@
         if (ids == null || ids.length == 0) {
            throw new BaseException("璇烽�変腑鑷冲皯涓�鏉℃暟鎹�");
         }
+        for (Long id : ids) {
+            PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(id);
+            if (purchaseLedger.getApprovalStatus().equals(3)) {
+                throw new BaseException(purchaseLedger.getPurchaseContractNumber()+"宸茬粡瀹℃壒閫氳繃锛屼笉鍏佽鍒犻櫎");
+            }
+        }
         // 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐叆搴撹褰�
         LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductQueryWrapper = new LambdaQueryWrapper<>();
         salesLedgerProductQueryWrapper.in(SalesLedgerProduct::getSalesLedgerId, ids)
@@ -431,6 +466,7 @@
         //鎵归噺鍒犻櫎妫�楠屾爣鍑�
         LambdaQueryWrapper<QualityInspect> materialInspectLambdaQueryWrapper = new LambdaQueryWrapper<>();
         materialInspectLambdaQueryWrapper.in(QualityInspect::getPurchaseLedgerId, ids);
+
         List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(materialInspectLambdaQueryWrapper);
         qualityInspects.stream().forEach(qualityInspect -> {
             if (ObjectUtils.isNotEmpty(qualityInspect.getInspectState())&&qualityInspect.getInspectState().equals(1)) {
@@ -462,6 +498,8 @@
         }
         //鎵归噺鍒犻櫎鍘熸潗鏂欐楠屾暟鎹�
         qualityInspectMapper.delete(materialInspectLambdaQueryWrapper);
+        //鍒犻櫎闄勪欢
+        commonFileService.deleteByBusinessIds(Arrays.asList(ids), 2);
         // 鎵归噺鍒犻櫎閲囪喘鍙拌处
         return purchaseLedgerMapper.deleteBatchIds(Arrays.asList(ids));
     }
@@ -631,6 +669,42 @@
             if (CollectionUtils.isEmpty(salesLedgerImportDtoList)) return AjaxResult.error("閲囪喘鍙拌处鏁版嵁涓虹┖锛�");
             List<PurchaseLedgerImportDto> salesLedgerProductImportDtoList = stringListMap.get("閲囪喘浜у搧鏁版嵁");
             if (CollectionUtils.isEmpty(salesLedgerProductImportDtoList)) return AjaxResult.error("閲囪喘浜у搧鏁版嵁涓虹┖锛�");
+
+            // 涓洪噰璐悎鍚屽彿涓虹┖鐨勬暟鎹嚜鍔ㄧ敓鎴愰噰璐悎鍚屽彿
+            for (PurchaseLedgerImportDto dto : salesLedgerImportDtoList) {
+                if (StringUtils.isBlank(dto.getPurchaseContractNumber())) {
+                    dto.setPurchaseContractNumber(getPurchaseNo());
+                }
+            }
+
+            // 妫�鏌xcel涓槸鍚︽湁閲嶅鐨勯噰璐崟鍙凤紙鎺掗櫎绌哄�硷級
+            Map<String, Long> purchaseNoCountMap = salesLedgerImportDtoList.stream()
+                    .filter(dto -> StringUtils.isNotBlank(dto.getPurchaseContractNumber()))
+                    .collect(Collectors.groupingBy(PurchaseLedgerImportDto::getPurchaseContractNumber, Collectors.counting()));
+            List<String> duplicateInExcel = purchaseNoCountMap.entrySet().stream()
+                    .filter(entry -> entry.getValue() > 1)
+                    .map(Map.Entry::getKey)
+                    .collect(Collectors.toList());
+            if (!duplicateInExcel.isEmpty()) {
+                return AjaxResult.error("Excel涓瓨鍦ㄩ噸澶嶇殑閲囪喘鍗曞彿锛�" + String.join("銆�", duplicateInExcel));
+            }
+
+            // 妫�鏌ユ暟鎹簱涓凡瀛樺湪鐨勯噰璐崟鍙�
+            List<String> purchaseNos = salesLedgerImportDtoList.stream()
+                    .filter(dto -> StringUtils.isNotBlank(dto.getPurchaseContractNumber()))
+                    .map(PurchaseLedgerImportDto::getPurchaseContractNumber)
+                    .collect(Collectors.toList());
+            if (!purchaseNos.isEmpty()) {
+                List<PurchaseLedger> existingLedgers = purchaseLedgerMapper.selectList(new LambdaQueryWrapper<PurchaseLedger>()
+                        .in(PurchaseLedger::getPurchaseContractNumber, purchaseNos));
+                List<String> existingPurchaseNos = existingLedgers.stream()
+                        .map(PurchaseLedger::getPurchaseContractNumber)
+                        .collect(Collectors.toList());
+                if (!existingPurchaseNos.isEmpty()) {
+                    return AjaxResult.error("浠ヤ笅閲囪喘鍗曞彿宸插瓨鍦細" + String.join("銆�", existingPurchaseNos));
+                }
+            }
+
             // 渚涘簲鍟嗘暟鎹�
             List<SupplierManage> customers = supplierManageMapper.selectList(new LambdaQueryWrapper<SupplierManage>().in(SupplierManage::getSupplierName,
                     salesLedgerImportDtoList.stream().map(PurchaseLedgerImportDto::getSupplierName).collect(Collectors.toList())));
@@ -638,6 +712,23 @@
             // 褰曞叆浜烘暟鎹�
             List<SysUser> sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>().in(SysUser::getNickName,
                     salesLedgerImportDtoList.stream().map(PurchaseLedgerImportDto::getRecorderName).collect(Collectors.toList())));
+            int successCount = 0;
+
+            // 寤虹珛閲囪喘鍗曞彿涓庝骇鍝佹暟鎹殑鏄犲皠鍏崇郴锛堝寘鎷嚜鍔ㄧ敓鎴愮殑閲囪喘鍗曞彿锛�
+            Map<String, List<PurchaseLedgerProductImportDto>> productMap = new HashMap<>();
+            for (PurchaseLedgerImportDto ledgerDto : salesLedgerImportDtoList) {
+                String purchaseContractNumber = ledgerDto.getPurchaseContractNumber();
+                // 濡傛灉閲囪喘鍗曞彿涓虹┖锛屼骇鍝佹暟鎹�氳繃鍏朵粬鏂瑰紡鍖归厤锛堝琛屽彿锛�
+                if (StringUtils.isBlank(purchaseContractNumber)) {
+                    continue;
+                }
+                List<PurchaseLedgerProductImportDto> products = salesLedgerProductImportDtoList.stream()
+                        .filter(productDto -> productDto.getPurchaseContractNumber() != null &&
+                                productDto.getPurchaseContractNumber().equals(purchaseContractNumber))
+                        .collect(Collectors.toList());
+                productMap.put(purchaseContractNumber, products);
+            }
+
             for (PurchaseLedgerImportDto salesLedgerImportDto : salesLedgerImportDtoList) {
                 PurchaseLedger salesLedger = new PurchaseLedger();
                 BeanUtils.copyProperties(salesLedgerImportDto, salesLedger);
@@ -656,35 +747,42 @@
                     throw new RuntimeException("褰曞叆浜�:" + salesLedger.getRecorderName() + ",鏃犲搴旂敤鎴凤紒");
                 salesLedger.setRecorderId(aLong);
                 // 閲囪喘浜у搧鏁版嵁缁戝畾锛岄�氳繃閲囪喘鍗曞彿鑾峰彇瀵瑰簲閲囪喘浜у搧鏁版嵁
-                List<PurchaseLedgerProductImportDto> salesLedgerProductImportDtos = salesLedgerProductImportDtoList.stream()
-                        .filter(salesLedgerProductImportDto -> salesLedgerProductImportDto.getPurchaseContractNumber().equals(salesLedger.getPurchaseContractNumber()))
-                        .collect(Collectors.toList());
-                if (CollectionUtils.isEmpty(salesLedgerProductImportDtos))
-                    throw new RuntimeException("閲囪喘鍗曞彿:" + salesLedgerImportDto.getPurchaseContractNumber() + ",鏃犲搴斾骇鍝佹暟鎹紒");
+                String purchaseContractNumber = salesLedgerImportDto.getPurchaseContractNumber();
+                List<PurchaseLedgerProductImportDto> salesLedgerProductImportDtos = productMap.get(purchaseContractNumber);
+                if (CollectionUtils.isEmpty(salesLedgerProductImportDtos)) {
+                    // 濡傛灉浜у搧鏁版嵁涓殑閲囪喘鍗曞彿涓虹┖锛屾寜椤哄簭鍖归厤锛堥�傜敤浜庡鍏ユ椂浜у搧鏁版嵁閲囪喘鍗曞彿涔熶负绌虹殑鎯呭喌锛�
+                    salesLedgerProductImportDtos = salesLedgerProductImportDtoList.stream()
+                            .filter(dto -> StringUtils.isBlank(dto.getPurchaseContractNumber()))
+                            .collect(Collectors.toList());
+                }
                 salesLedger.setContractAmount(salesLedgerProductImportDtos.stream()
                         .map(PurchaseLedgerProductImportDto::getTaxInclusiveTotalPrice)
                         .reduce(BigDecimal.ZERO,BigDecimal::add));
                 // 閫氳繃閿�鍞崟鍙风粦瀹氶攢鍞�
-                SalesLedger salesLedger1 = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>()
-                        .eq(SalesLedger::getSalesContractNo, salesLedger.getSalesContractNo())
-                        .last("LIMIT 1"));
-                if(salesLedger1 != null){
-                    salesLedger.setSalesLedgerId(salesLedger1.getId());
-                }
-                // 閲囪喘瀹℃牳
-                // 閫氳繃鏄电О鑾峰彇鐢ㄦ埛ID
-                String[] split = salesLedger.getApproveUserIds().split("锛�");
-                List<Long> ids = new ArrayList<>();
-                for (int i = 0; i < split.length; i++) {
-                    SysUser sysUser = sysUserMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getNickName, split[i])
+                if (StringUtils.isNotBlank(salesLedger.getSalesContractNo())) {
+                    SalesLedger salesLedger1 = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>()
+                            .eq(SalesLedger::getSalesContractNo, salesLedger.getSalesContractNo())
                             .last("LIMIT 1"));
-                    if (sysUser != null) {
-                        ids.add(sysUser.getUserId());
+                    if(salesLedger1 != null){
+                        salesLedger.setSalesLedgerId(salesLedger1.getId());
                     }
                 }
-                // 灏嗛泦鍚堣浆涓哄瓧绗︿覆锛岄殧寮�
-                String collect = ids.stream().map(Object::toString).collect(Collectors.joining(","));
-                salesLedger.setApproveUserIds(collect);
+                // 閲囪喘瀹℃牳
+                if (StringUtils.isNotBlank(salesLedger.getApproveUserIds())) {
+                    // 閫氳繃鏄电О鑾峰彇鐢ㄦ埛ID
+                    String[] split = salesLedger.getApproveUserIds().split("锛�");
+                    List<Long> ids = new ArrayList<>();
+                    for (int i = 0; i < split.length; i++) {
+                        SysUser sysUser = sysUserMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getNickName, split[i])
+                                .last("LIMIT 1"));
+                        if (sysUser != null) {
+                            ids.add(sysUser.getUserId());
+                        }
+                    }
+                    // 灏嗛泦鍚堣浆涓哄瓧绗︿覆锛岄殧寮�
+                    String collect = ids.stream().map(Object::toString).collect(Collectors.joining(","));
+                    salesLedger.setApproveUserIds(collect);
+                }
                 purchaseLedgerMapper.insert(salesLedger);
 
                 for (PurchaseLedgerProductImportDto salesLedgerProductImportDto : salesLedgerProductImportDtos) {
@@ -716,13 +814,14 @@
                 }
                 // 閲囪喘瀹℃牳
                 addApproveByPurchase(loginUser,salesLedger);
+                successCount++;
             }
 
-            return AjaxResult.success("瀵煎叆鎴愬姛");
+            return AjaxResult.success("瀵煎叆鎴愬姛锛屽叡瀵煎叆" + successCount + "鏉℃暟鎹�");
         } catch (Exception e) {
             e.printStackTrace();
         }
-        return AjaxResult.success("瀵煎叆澶辫触");
+        return AjaxResult.error("瀵煎叆澶辫触");
     }
 
     @Override

--
Gitblit v1.9.3