From 8d4f6bb8b7e7d3a91d5071d8dd77813a46788453 Mon Sep 17 00:00:00 2001
From: zhang_nuo <zhang_12370@163.com>
Date: 星期一, 21 九月 2026 20:58:12 +0800
Subject: [PATCH] 采购导入报错详细信息 修复会议发布问题

---
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java |  273 ++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 173 insertions(+), 100 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 96b0a54..329ea08 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -59,7 +59,10 @@
 import org.springframework.beans.BeanUtils;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.DefaultTransactionDefinition;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.InputStream;
@@ -102,6 +105,7 @@
     private final QualityInspectParamMapper qualityInspectParamMapper;
     private final ApproveProcessServiceImpl approveProcessService;
     private final ProcurementRecordMapper procurementRecordStorageMapper;
+    private final PlatformTransactionManager transactionManager;
     private final FileUtil fileUtil;
 
     @Override
@@ -490,121 +494,190 @@
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public AjaxResult importData(MultipartFile file) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
+        int successCount = 0;
+        int skipCount = 0;
+        int failCount = 0;
+        List<String> failList = new ArrayList<>();
+        List<String> skipList = new ArrayList<>();
+
         try {
             InputStream inputStream = file.getInputStream();
             ExcelUtil<PurchaseLedgerImportDto> salesLedgerImportDtoExcelUtil = new ExcelUtil<>(PurchaseLedgerImportDto.class);
-            Map<String, List<PurchaseLedgerImportDto>> stringListMap = salesLedgerImportDtoExcelUtil.importExcelMultiSheet(Arrays.asList("閲囪喘鍙拌处鏁版嵁", "閲囪喘浜у搧鏁版嵁"), inputStream, 0);
+            Map<String, List<PurchaseLedgerImportDto>> stringListMap = salesLedgerImportDtoExcelUtil.importExcelMultiSheet(
+                    Arrays.asList("閲囪喘鍙拌处鏁版嵁", "閲囪喘浜у搧鏁版嵁"), inputStream, 0);
             if (CollectionUtils.isEmpty(stringListMap)) return AjaxResult.error("閲囪喘琛ㄦ牸涓虹┖锛�");
-            // 涓氬姟灞傚悎骞�
-            List<PurchaseLedgerImportDto> salesLedgerImportDtoList = stringListMap.get("閲囪喘鍙拌处鏁版嵁");
-            if (CollectionUtils.isEmpty(salesLedgerImportDtoList)) return AjaxResult.error("閲囪喘鍙拌处鏁版嵁涓虹┖锛�");
-            List<PurchaseLedgerImportDto> salesLedgerProductImportDtoList = stringListMap.get("閲囪喘浜у搧鏁版嵁");
-            if (CollectionUtils.isEmpty(salesLedgerProductImportDtoList)) return AjaxResult.error("閲囪喘浜у搧鏁版嵁涓虹┖锛�");
-            // 渚涘簲鍟嗘暟鎹�
-            List<SupplierManage> customers = supplierManageMapper.selectList(new LambdaQueryWrapper<SupplierManage>().in(SupplierManage::getSupplierName,
-                    salesLedgerImportDtoList.stream().map(PurchaseLedgerImportDto::getSupplierName).collect(Collectors.toList())));
-            List<Map<String,Object>> list = productModelMapper.getProductAndModelList();
-            // 褰曞叆浜烘暟鎹�
-            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())
+
+            List<PurchaseLedgerImportDto> ledgerList = stringListMap.get("閲囪喘鍙拌处鏁版嵁");
+            if (CollectionUtils.isEmpty(ledgerList)) return AjaxResult.error("閲囪喘鍙拌处鏁版嵁涓虹┖锛�");
+            List<PurchaseLedgerImportDto> productList = stringListMap.get("閲囪喘浜у搧鏁版嵁");
+            if (CollectionUtils.isEmpty(productList)) return AjaxResult.error("閲囪喘浜у搧鏁版嵁涓虹┖锛�");
+
+            // 棰勫姞杞戒緵搴斿晢銆佷骇鍝併�佸綍鍏ヤ汉鏁版嵁锛堝叏閲忥紝閬垮厤姣忔潯閮芥煡锛�
+            List<SupplierManage> customers = supplierManageMapper.selectList(Wrappers.lambdaQuery());
+            List<Map<String, Object>> productModelList = productModelMapper.getProductAndModelList();
+            List<SysUser> sysUsers = sysUserMapper.selectList(Wrappers.lambdaQuery());
+
+            int rowNum = 0;
+            for (PurchaseLedgerImportDto dto : ledgerList) {
+                rowNum++;
+                String contractNo = dto.getPurchaseContractNumber();
+                String rowLabel = "绗�" + rowNum + "琛孾" + (contractNo != null ? contractNo : "鏃犻噰璐崟鍙�") + "]";
+
+                // 宸插瓨鍦ㄥ垯璺宠繃
+                PurchaseLedger exist = purchaseLedgerMapper.selectOne(Wrappers.<PurchaseLedger>lambdaQuery()
+                        .eq(PurchaseLedger::getPurchaseContractNumber, contractNo)
                         .last("limit 1"));
-                if(purchaseLedger != null){
+                if (exist != null) {
+                    skipCount++;
+                    skipList.add(rowLabel + " 閲囪喘鍗曞彿宸插瓨鍦紝璺宠繃");
                     continue;
                 }
-                PurchaseLedger salesLedger = new PurchaseLedger();
-                BeanUtils.copyProperties(salesLedgerImportDto, salesLedger);
-                // 閫氳繃渚涘簲鍟嗗悕绉版煡璇D
-                salesLedger.setSupplierId(customers.stream()
-                        .filter(customer -> customer.getSupplierName().equals(salesLedger.getSupplierName()))
-                        .findFirst()
-                        .map(SupplierManage::getId)
-                        .orElse(null));
-                Long aLong = sysUsers.stream()
-                        .filter(sysUser -> sysUser.getNickName().equals(salesLedger.getRecorderName()))
-                        .findFirst()
-                        .map(SysUser::getUserId)
-                        .orElse(null);
-                if (aLong == null)
-                    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() + ",鏃犲搴斾骇鍝佹暟鎹紒");
-                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());
-                }
-                if (StringUtils.hasText(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) {
-                    SalesLedgerProduct salesLedgerProduct = new SalesLedgerProduct();
-                    BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct);
-                    salesLedgerProduct.setSalesLedgerId(salesLedger.getId());
-                    salesLedgerProduct.setType(2);
-                    AmountUtils.normalizeSalesLedgerProduct(salesLedgerProduct);
-                    // 璁$畻涓嶅惈绋庢�讳环
-                    salesLedgerProduct.setTaxExclusiveTotalPrice(
-                            AmountUtils.calcTaxExclusiveTotalPrice(
-                                    salesLedgerProduct.getTaxInclusiveTotalPrice(),
-                                    salesLedgerProduct.getTaxRate()
-                            )
-                    );
-                    list.stream()
-                            .filter(map -> map.get("productName").equals(salesLedgerProduct.getProductCategory()) && map.get("model").equals(salesLedgerProduct.getSpecificationModel()))
-                            .findFirst()
-                            .ifPresent(map -> {
-                                salesLedgerProduct.setProductModelId(Long.parseLong(map.get("modelId").toString()));
-                                salesLedgerProduct.setProductId(Long.parseLong(map.get("id").toString()));
-                            });
-                    salesLedgerProduct.setRegister(loginUser.getNickName());
-                    salesLedgerProduct.setRegisterDate(LocalDateTime.now());
-                    salesLedgerProduct.setApproveStatus(0);
-                    // 鏄惁璐ㄦ鍒ゆ柇
-                    salesLedgerProduct.setIsChecked(salesLedgerProductImportDto.getIsChecked() == 1);
-                    if(salesLedgerProductImportDto.getIsChecked() == 1){
-                        addQualityInspect(salesLedger, salesLedgerProduct);
-                    }
-                    salesLedgerProductMapper.insert(salesLedgerProduct);
+                // 姣忔潯涓�涓嫭绔嬩簨鍔★紝澶辫触鍙洖婊氬綋鍓嶆潯
+                TransactionStatus txStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
+                try {
+                    importOneLedger(dto, productList, customers, productModelList, sysUsers, loginUser);
+                    transactionManager.commit(txStatus);
+                    successCount++;
+                } catch (Exception e) {
+                    transactionManager.rollback(txStatus);
+                    failCount++;
+                    failList.add(rowLabel + " " + e.getMessage());
+                    log.error("瀵煎叆澶辫触 - {}", rowLabel, e);
                 }
-                // 閲囪喘瀹℃牳
-                addApproveByPurchase(loginUser,salesLedger);
             }
 
-            return AjaxResult.success("瀵煎叆鎴愬姛");
+            // 鏋勫缓杩斿洖缁撴灉
+            StringBuilder msg = new StringBuilder();
+            msg.append("瀵煎叆瀹屾垚锛氭垚鍔�").append(successCount).append("鏉�");
+            if (skipCount > 0) msg.append("锛岃烦杩�").append(skipCount).append("鏉�");
+            if (failCount > 0) msg.append("锛屽け璐�").append(failCount).append("鏉�");
+
+            Map<String, Object> result = new HashMap<>();
+            result.put("successCount", successCount);
+            result.put("skipCount", skipCount);
+            result.put("failCount", failCount);
+            result.put("failList", failList);
+            result.put("skipList", skipList);
+            result.put("msg", msg.toString());
+
+            AjaxResult ajaxResult = AjaxResult.success(msg.toString());
+            ajaxResult.putAll(result);
+            return ajaxResult;
+
         } catch (Exception e) {
-            e.printStackTrace();
+            log.error("閲囪喘鍙拌处瀵煎叆寮傚父", e);
+            return AjaxResult.error("瀵煎叆寮傚父锛�" + e.getMessage());
         }
-        return AjaxResult.success("瀵煎叆澶辫触");
+    }
+
+    /**
+     * 瀵煎叆鍗曟潯閲囪喘鍙拌处锛堝惈浜у搧鏄庣粏+瀹℃壒娴佺▼锛�
+     */
+    private void importOneLedger(PurchaseLedgerImportDto dto,
+                                 List<PurchaseLedgerImportDto> productList,
+                                 List<SupplierManage> customers,
+                                 List<Map<String, Object>> productModelList,
+                                 List<SysUser> sysUsers,
+                                 LoginUser loginUser) throws Exception {
+        PurchaseLedger ledger = new PurchaseLedger();
+        BeanUtils.copyProperties(dto, ledger);
+
+        // 渚涘簲鍟�
+        ledger.setSupplierId(customers.stream()
+                .filter(c -> c.getSupplierName() != null && c.getSupplierName().equals(dto.getSupplierName()))
+                .findFirst()
+                .map(SupplierManage::getId)
+                .orElse(null));
+        if (ledger.getSupplierId() == null) {
+            throw new RuntimeException("渚涘簲鍟嗕笉瀛樺湪锛�" + dto.getSupplierName());
+        }
+
+        // 褰曞叆浜�
+        Long recorderId = sysUsers.stream()
+                .filter(u -> u.getNickName() != null && u.getNickName().equals(dto.getRecorderName()))
+                .findFirst()
+                .map(SysUser::getUserId)
+                .orElse(null);
+        if (recorderId == null) {
+            throw new RuntimeException("褰曞叆浜轰笉瀛樺湪锛�" + dto.getRecorderName());
+        }
+        ledger.setRecorderId(recorderId);
+
+        // 浜у搧鏄庣粏
+        List<PurchaseLedgerProductImportDto> productDtos = productList.stream()
+                .filter(p -> p.getPurchaseContractNumber() != null
+                        && p.getPurchaseContractNumber().equals(dto.getPurchaseContractNumber()))
+                .collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(productDtos)) {
+            throw new RuntimeException("鏃犲搴斾骇鍝佹暟鎹�");
+        }
+        ledger.setContractAmount(productDtos.stream()
+                .map(PurchaseLedgerProductImportDto::getTaxInclusiveTotalPrice)
+                .reduce(BigDecimal.ZERO, BigDecimal::add));
+
+        // 鍏宠仈閿�鍞崟鍙�
+        SalesLedger salesLedger = salesLedgerMapper.selectOne(Wrappers.<SalesLedger>lambdaQuery()
+                .eq(SalesLedger::getSalesContractNo, dto.getSalesContractNo())
+                .last("LIMIT 1"));
+        if (salesLedger != null) {
+            ledger.setSalesLedgerId(salesLedger.getId());
+        }
+
+        // 瀹℃牳浜猴紙涓枃閫楀彿鍒嗛殧鐨勫鍚嶈浆ID锛�
+        if (StringUtils.hasText(ledger.getApproveUserIds())) {
+            String[] split = ledger.getApproveUserIds().split("锛�");
+            List<Long> ids = new ArrayList<>();
+            for (String name : split) {
+                String trimmed = name.trim();
+                if (trimmed.isEmpty()) continue;
+                sysUsers.stream()
+                        .filter(u -> trimmed.equals(u.getNickName()))
+                        .findFirst()
+                        .ifPresent(u -> ids.add(u.getUserId()));
+            }
+            ledger.setApproveUserIds(ids.stream().map(String::valueOf).collect(Collectors.joining(",")));
+        }
+
+        purchaseLedgerMapper.insert(ledger);
+
+        // 浜у搧鏄庣粏鍏ュ簱
+        for (PurchaseLedgerProductImportDto prodDto : productDtos) {
+            SalesLedgerProduct product = new SalesLedgerProduct();
+            BeanUtils.copyProperties(prodDto, product);
+            product.setSalesLedgerId(ledger.getId());
+            product.setType(2);
+            AmountUtils.normalizeSalesLedgerProduct(product);
+            product.setTaxExclusiveTotalPrice(
+                    AmountUtils.calcTaxExclusiveTotalPrice(
+                            product.getTaxInclusiveTotalPrice(),
+                            product.getTaxRate()
+                    )
+            );
+            productModelList.stream()
+                    .filter(map -> prodDto.getProductCategory() != null
+                            && prodDto.getSpecificationModel() != null
+                            && prodDto.getProductCategory().equals(map.get("productName"))
+                            && prodDto.getSpecificationModel().equals(map.get("model")))
+                    .findFirst()
+                    .ifPresent(map -> {
+                        product.setProductModelId(Long.parseLong(map.get("modelId").toString()));
+                        product.setProductId(Long.parseLong(map.get("id").toString()));
+                    });
+            product.setRegister(loginUser.getNickName());
+            product.setRegisterDate(LocalDateTime.now());
+            product.setApproveStatus(0);
+            product.setIsChecked(prodDto.getIsChecked() != null && prodDto.getIsChecked() == 1);
+            if (prodDto.getIsChecked() != null && prodDto.getIsChecked() == 1) {
+                addQualityInspect(ledger, product);
+            }
+            salesLedgerProductMapper.insert(product);
+        }
+
+        // 閲囪喘瀹℃牳
+        addApproveByPurchase(loginUser, ledger);
     }
 
     @Override

--
Gitblit v1.9.3