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 |  113 ++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 84 insertions(+), 29 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 b23148a..d3d7e32 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -669,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())));
@@ -676,13 +712,24 @@
             // 褰曞叆浜烘暟鎹�
             List<SysUser> sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>().in(SysUser::getNickName,
                     salesLedgerImportDtoList.stream().map(PurchaseLedgerImportDto::getRecorderName).collect(Collectors.toList())));
-            for (PurchaseLedgerImportDto salesLedgerImportDto : salesLedgerImportDtoList) {
-                PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>()
-                        .eq(PurchaseLedger::getPurchaseContractNumber, salesLedgerImportDto.getPurchaseContractNumber())
-                        .last("limit 1"));
-                if(purchaseLedger != null){
+            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);
                 // 閫氳繃渚涘簲鍟嗗悕绉版煡璇D
@@ -700,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) {
@@ -760,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