Sfoglia il codice sorgente

优化装运明细查询效率

lingpeng.li 2 mesi fa
parent
commit
f16c425c1b

+ 193 - 86
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/storageBill/service/impl/StorageBillServiceImpl.java

@@ -3958,82 +3958,125 @@ public class StorageBillServiceImpl extends ServiceImpl<StorageBillMapper, Stora
 
 
     public void processRollClubOneDetails(List<RollClubOneDetails> rollClubOneDetailsList) {
+        if (CollectionUtils.isEmpty(rollClubOneDetailsList)) {
+            return;
+        }
+
+        // 1. 统一收集所有 billetNo,避免多次查询
+        Set<String> allBilletNos = rollClubOneDetailsList.stream()
+                .map(RollClubOneDetails::getBilletNo)
+                .filter(StringUtils::isNotBlank)
+                .flatMap(billetNo -> Arrays.stream(billetNo.split(",")))
+                .map(String::trim)
+                .filter(StringUtils::isNotBlank)
+                .collect(Collectors.toSet());
+
+        // 2. 一次性查询 BilletBasicInfo,避免重复查询数据库
+        Map<String, String> billetToAssemblyMap = new HashMap<>();
+        if (CollectionUtils.isNotEmpty(allBilletNos)) {
+            List<BilletBasicInfo> billetBasicInfoList = billetBasicInfoService.list(
+                    new LambdaQueryWrapper<BilletBasicInfo>().in(BilletBasicInfo::getBilletNo, allBilletNos));
+
+            // 构建 billetNo -> assemblyNumber 映射
+            billetToAssemblyMap = billetBasicInfoList.stream()
+                    .collect(Collectors.toMap(
+                            BilletBasicInfo::getBilletNo,
+                            BilletBasicInfo::getAssemblyNumber,
+                            (existing, replacement) -> existing // 遇到重复 billetNo,保留第一个
+                    ));
+        }
+
+        // 3. 遍历 details 并更新 assemblyNumber
         for (RollClubOneDetails details : rollClubOneDetailsList) {
-            // 1. 解析 billetNo 为 Set<String>,去重
+            // 解析 billetNo
             Set<String> billetNoSet = Optional.ofNullable(details.getBilletNo())
-                    .map(billetNo -> Arrays.stream(billetNo.split(",")) // 按逗号分割
-                            .map(String::trim) // 去除前后空格
-                            .filter(StringUtils::isNotBlank) // 过滤空值
+                    .map(billetNo -> Arrays.stream(billetNo.split(","))
+                            .map(String::trim)
+                            .filter(StringUtils::isNotBlank)
                             .collect(Collectors.toSet()))
                     .orElse(Collections.emptySet());
 
-            // 2. 如果 billetNoSet 为空,则无需查询,跳过
             if (billetNoSet.isEmpty()) {
                 continue;
             }
 
-            // 3. 查询 BilletBasicInfo 获取 assemblyNumber
-            List<BilletBasicInfo> billetBasicInfoList = billetBasicInfoService.list(
-                    new LambdaQueryWrapper<BilletBasicInfo>().in(BilletBasicInfo::getBilletNo, billetNoSet)
-            );
-
-            // 4. 提取 assemblyNumber 并去重
+            // 先加入 details 现有的 assemblyNumber
             Set<String> assemblySet = new HashSet<>();
-
-            // 先加入 details 现有的 assemblyNumber(确保不为 null 且不为空字符串)
             String existingAssembly = details.getAssemblyNumber();
             if (StringUtils.isNotBlank(existingAssembly)) {
                 Collections.addAll(assemblySet, existingAssembly.split(","));
             }
 
-            // 再加入从 BilletBasicInfo 查询到的 assemblyNumber
-            billetBasicInfoList.stream()
-                    .map(BilletBasicInfo::getAssemblyNumber)
+            // 直接从 Map 获取 assemblyNumber,避免重复查询数据库
+            billetNoSet.stream()
+                    .map(billetToAssemblyMap::get)
                     .filter(StringUtils::isNotBlank)
                     .forEach(assemblySet::add);
 
-            // 5. 拼接回 rollClubOneDetails 的 assemblyNumber
+            // 更新 assemblyNumber
             details.setAssemblyNumber(String.join(",", assemblySet));
         }
     }
 
 
+
     public void processRollClubTwoDetails(List<RollClubTwoDetails> rollClubTwoDetailsList) {
+        if (CollectionUtils.isEmpty(rollClubTwoDetailsList)) {
+            return;
+        }
+
+        // 1. 统一收集所有 billetNo,避免多次查询
+        Set<String> allBilletNos = rollClubTwoDetailsList.stream()
+                .map(RollClubTwoDetails::getBilletNo)
+                .filter(StringUtils::isNotBlank)
+                .flatMap(billetNo -> Arrays.stream(billetNo.split(",")))
+                .map(String::trim)
+                .filter(StringUtils::isNotBlank)
+                .collect(Collectors.toSet());
+
+        // 2. 一次性查询 BilletBasicInfo,避免重复查询数据库
+        Map<String, String> billetToAssemblyMap = new HashMap<>();
+        if (CollectionUtils.isNotEmpty(allBilletNos)) {
+            List<BilletBasicInfo> billetBasicInfoList = billetBasicInfoService.list(
+                    new LambdaQueryWrapper<BilletBasicInfo>().in(BilletBasicInfo::getBilletNo, allBilletNos));
+
+            // 构建 billetNo -> assemblyNumber 映射
+            billetToAssemblyMap = billetBasicInfoList.stream()
+                    .collect(Collectors.toMap(
+                            BilletBasicInfo::getBilletNo,
+                            BilletBasicInfo::getAssemblyNumber,
+                            (existing, replacement) -> existing // 遇到重复 billetNo,保留第一个
+                    ));
+        }
+
+        // 3. 遍历 details 并更新 assemblyNumber
         for (RollClubTwoDetails details : rollClubTwoDetailsList) {
-            // 1. 解析 billetNo 为 Set<String>,去重
+            // 解析 billetNo
             Set<String> billetNoSet = Optional.ofNullable(details.getBilletNo())
-                    .map(billetNo -> Arrays.stream(billetNo.split(",")) // 按逗号分割
-                            .map(String::trim) // 去除前后空格
-                            .filter(StringUtils::isNotBlank) // 过滤空值
+                    .map(billetNo -> Arrays.stream(billetNo.split(","))
+                            .map(String::trim)
+                            .filter(StringUtils::isNotBlank)
                             .collect(Collectors.toSet()))
                     .orElse(Collections.emptySet());
 
-            // 2. 如果 billetNoSet 为空,则无需查询,跳过
             if (billetNoSet.isEmpty()) {
                 continue;
             }
 
-            // 3. 查询 BilletBasicInfo 获取 assemblyNumber
-            List<BilletBasicInfo> billetBasicInfoList = billetBasicInfoService.list(
-                    new LambdaQueryWrapper<BilletBasicInfo>().in(BilletBasicInfo::getBilletNo, billetNoSet)
-            );
-
-            // 4. 提取 assemblyNumber 并去重
+            // 先加入 details 现有的 assemblyNumber
             Set<String> assemblySet = new HashSet<>();
-
-            // 先加入 details 现有的 assemblyNumber(确保不为 null 且不为空字符串)
             String existingAssembly = details.getAssemblyNumber();
             if (StringUtils.isNotBlank(existingAssembly)) {
                 Collections.addAll(assemblySet, existingAssembly.split(","));
             }
 
-            // 再加入从 BilletBasicInfo 查询到的 assemblyNumber
-            billetBasicInfoList.stream()
-                    .map(BilletBasicInfo::getAssemblyNumber)
+            // 直接从 Map 获取 assemblyNumber,避免重复查询数据库
+            billetNoSet.stream()
+                    .map(billetToAssemblyMap::get)
                     .filter(StringUtils::isNotBlank)
                     .forEach(assemblySet::add);
 
-            // 5. 拼接回 rollClubOneDetails 的 assemblyNumber
+            // 更新 assemblyNumber
             details.setAssemblyNumber(String.join(",", assemblySet));
         }
     }
@@ -4041,125 +4084,189 @@ public class StorageBillServiceImpl extends ServiceImpl<StorageBillMapper, Stora
 
 
     public void processRollClubThreeDetails(List<RollClubThreeDetails> rollClubThreeDetailsList) {
+        if (CollectionUtils.isEmpty(rollClubThreeDetailsList)) {
+            return;
+        }
+
+        // 1. 统一收集所有 billetNo,避免多次查询
+        Set<String> allBilletNos = rollClubThreeDetailsList.stream()
+                .map(RollClubThreeDetails::getBilletNo)
+                .filter(StringUtils::isNotBlank)
+                .flatMap(billetNo -> Arrays.stream(billetNo.split(",")))
+                .map(String::trim)
+                .filter(StringUtils::isNotBlank)
+                .collect(Collectors.toSet());
+
+        // 2. 一次性查询 BilletBasicInfo,避免重复查询数据库
+        Map<String, String> billetToAssemblyMap = new HashMap<>();
+        if (CollectionUtils.isNotEmpty(allBilletNos)) {
+            List<BilletBasicInfo> billetBasicInfoList = billetBasicInfoService.list(
+                    new LambdaQueryWrapper<BilletBasicInfo>().in(BilletBasicInfo::getBilletNo, allBilletNos));
+
+            // 构建 billetNo -> assemblyNumber 映射
+            billetToAssemblyMap = billetBasicInfoList.stream()
+                    .collect(Collectors.toMap(
+                            BilletBasicInfo::getBilletNo,
+                            BilletBasicInfo::getAssemblyNumber,
+                            (existing, replacement) -> existing // 遇到重复 billetNo,保留第一个
+                    ));
+        }
+
+        // 3. 遍历 details 并更新 assemblyNumber
         for (RollClubThreeDetails details : rollClubThreeDetailsList) {
-            // 1. 解析 billetNo 为 Set<String>,去重
+            // 解析 billetNo
             Set<String> billetNoSet = Optional.ofNullable(details.getBilletNo())
-                    .map(billetNo -> Arrays.stream(billetNo.split(",")) // 按逗号分割
-                            .map(String::trim) // 去除前后空格
-                            .filter(StringUtils::isNotBlank) // 过滤空值
+                    .map(billetNo -> Arrays.stream(billetNo.split(","))
+                            .map(String::trim)
+                            .filter(StringUtils::isNotBlank)
                             .collect(Collectors.toSet()))
                     .orElse(Collections.emptySet());
 
-            // 2. 如果 billetNoSet 为空,则无需查询,跳过
             if (billetNoSet.isEmpty()) {
                 continue;
             }
 
-            // 3. 查询 BilletBasicInfo 获取 assemblyNumber
-            List<BilletBasicInfo> billetBasicInfoList = billetBasicInfoService.list(
-                    new LambdaQueryWrapper<BilletBasicInfo>().in(BilletBasicInfo::getBilletNo, billetNoSet)
-            );
-
-            // 4. 提取 assemblyNumber 并去重
+            // 先加入 details 现有的 assemblyNumber
             Set<String> assemblySet = new HashSet<>();
-
-            // 先加入 details 现有的 assemblyNumber(确保不为 null 且不为空字符串)
             String existingAssembly = details.getAssemblyNumber();
             if (StringUtils.isNotBlank(existingAssembly)) {
                 Collections.addAll(assemblySet, existingAssembly.split(","));
             }
 
-            // 再加入从 BilletBasicInfo 查询到的 assemblyNumber
-            billetBasicInfoList.stream()
-                    .map(BilletBasicInfo::getAssemblyNumber)
+            // 直接从 Map 获取 assemblyNumber,避免重复查询数据库
+            billetNoSet.stream()
+                    .map(billetToAssemblyMap::get)
                     .filter(StringUtils::isNotBlank)
                     .forEach(assemblySet::add);
 
-            // 5. 拼接回 rollClubOneDetails 的 assemblyNumber
+            // 更新 assemblyNumber
             details.setAssemblyNumber(String.join(",", assemblySet));
         }
     }
 
+
     public void processRollOutShippDetails(List<RollOutShippDetails> rollOutShippDetailsList) {
+        if (CollectionUtils.isEmpty(rollOutShippDetailsList)) {
+            return;
+        }
+
+        // 1. 统一收集所有 billetNo,避免多次查询
+        Set<String> allBilletNos = rollOutShippDetailsList.stream()
+                .map(RollOutShippDetails::getBilletNo)
+                .filter(StringUtils::isNotBlank)
+                .flatMap(billetNo -> Arrays.stream(billetNo.split(",")))
+                .map(String::trim)
+                .filter(StringUtils::isNotBlank)
+                .collect(Collectors.toSet());
+
+        // 2. 一次性查询 BilletBasicInfo,避免重复查询数据库
+        Map<String, String> billetToAssemblyMap = new HashMap<>();
+        if (CollectionUtils.isNotEmpty(allBilletNos)) {
+            List<BilletBasicInfo> billetBasicInfoList = billetBasicInfoService.list(
+                    new LambdaQueryWrapper<BilletBasicInfo>().in(BilletBasicInfo::getBilletNo, allBilletNos));
+
+            // 构建 billetNo -> assemblyNumber 映射
+            billetToAssemblyMap = billetBasicInfoList.stream()
+                    .collect(Collectors.toMap(
+                            BilletBasicInfo::getBilletNo,
+                            BilletBasicInfo::getAssemblyNumber,
+                            (existing, replacement) -> existing // 遇到重复 billetNo,保留第一个
+                    ));
+        }
+
+        // 3. 遍历 details 并更新 assemblyNumber
         for (RollOutShippDetails details : rollOutShippDetailsList) {
-            // 1. 解析 billetNo 为 Set<String>,去重
+            // 解析 billetNo
             Set<String> billetNoSet = Optional.ofNullable(details.getBilletNo())
-                    .map(billetNo -> Arrays.stream(billetNo.split(",")) // 按逗号分割
-                            .map(String::trim) // 去除前后空格
-                            .filter(StringUtils::isNotBlank) // 过滤空值
+                    .map(billetNo -> Arrays.stream(billetNo.split(","))
+                            .map(String::trim)
+                            .filter(StringUtils::isNotBlank)
                             .collect(Collectors.toSet()))
                     .orElse(Collections.emptySet());
 
-            // 2. 如果 billetNoSet 为空,则无需查询,跳过
             if (billetNoSet.isEmpty()) {
                 continue;
             }
 
-            // 3. 查询 BilletBasicInfo 获取 assemblyNumber
-            List<BilletBasicInfo> billetBasicInfoList = billetBasicInfoService.list(
-                    new LambdaQueryWrapper<BilletBasicInfo>().in(BilletBasicInfo::getBilletNo, billetNoSet)
-            );
-
-            // 4. 提取 assemblyNumber 并去重
+            // 先加入 details 现有的 assemblyNumber
             Set<String> assemblySet = new HashSet<>();
-
-            // 先加入 details 现有的 assemblyNumber(确保不为 null 且不为空字符串)
             String existingAssembly = details.getAssemblyNumber();
             if (StringUtils.isNotBlank(existingAssembly)) {
                 Collections.addAll(assemblySet, existingAssembly.split(","));
             }
 
-            // 再加入从 BilletBasicInfo 查询到的 assemblyNumber
-            billetBasicInfoList.stream()
-                    .map(BilletBasicInfo::getAssemblyNumber)
+            // 直接从 Map 获取 assemblyNumber,避免重复查询数据库
+            billetNoSet.stream()
+                    .map(billetToAssemblyMap::get)
                     .filter(StringUtils::isNotBlank)
                     .forEach(assemblySet::add);
 
-            // 5. 拼接回 rollClubOneDetails 的 assemblyNumber
+            // 更新 assemblyNumber
             details.setAssemblyNumber(String.join(",", assemblySet));
         }
     }
 
 
+
     public void processRollHeightDetails(List<RollHeightDetails> rollHeightDetailsList) {
+        if (CollectionUtils.isEmpty(rollHeightDetailsList)) {
+            return;
+        }
+
+        // 1. 统一收集所有 billetNo,避免多次查询
+        Set<String> allBilletNos = rollHeightDetailsList.stream()
+                .map(RollHeightDetails::getBilletNo)
+                .filter(StringUtils::isNotBlank)
+                .flatMap(billetNo -> Arrays.stream(billetNo.split(",")))
+                .map(String::trim)
+                .filter(StringUtils::isNotBlank)
+                .collect(Collectors.toSet());
+
+        // 2. 一次性查询 BilletBasicInfo,避免重复查询数据库
+        Map<String, String> billetToAssemblyMap = new HashMap<>();
+        if (CollectionUtils.isNotEmpty(allBilletNos)) {
+            List<BilletBasicInfo> billetBasicInfoList = billetBasicInfoService.list(
+                    new LambdaQueryWrapper<BilletBasicInfo>().in(BilletBasicInfo::getBilletNo, allBilletNos));
+
+            // 构建 billetNo -> assemblyNumber 映射
+            billetToAssemblyMap = billetBasicInfoList.stream()
+                    .collect(Collectors.toMap(
+                            BilletBasicInfo::getBilletNo,
+                            BilletBasicInfo::getAssemblyNumber,
+                            (existing, replacement) -> existing // 遇到重复 billetNo,保留第一个
+                    ));
+        }
+
+        // 3. 遍历 details 并更新 assemblyNumber
         for (RollHeightDetails details : rollHeightDetailsList) {
-            // 1. 解析 billetNo 为 Set<String>,去重
+            // 解析 billetNo
             Set<String> billetNoSet = Optional.ofNullable(details.getBilletNo())
-                    .map(billetNo -> Arrays.stream(billetNo.split(",")) // 按逗号分割
-                            .map(String::trim) // 去除前后空格
-                            .filter(StringUtils::isNotBlank) // 过滤空值
+                    .map(billetNo -> Arrays.stream(billetNo.split(","))
+                            .map(String::trim)
+                            .filter(StringUtils::isNotBlank)
                             .collect(Collectors.toSet()))
                     .orElse(Collections.emptySet());
 
-            // 2. 如果 billetNoSet 为空,则无需查询,跳过
             if (billetNoSet.isEmpty()) {
                 continue;
             }
 
-            // 3. 查询 BilletBasicInfo 获取 assemblyNumber
-            List<BilletBasicInfo> billetBasicInfoList = billetBasicInfoService.list(
-                    new LambdaQueryWrapper<BilletBasicInfo>().in(BilletBasicInfo::getBilletNo, billetNoSet)
-            );
-
-            // 4. 提取 assemblyNumber 并去重
+            // 先加入 details 现有的 assemblyNumber
             Set<String> assemblySet = new HashSet<>();
-
-            // 先加入 details 现有的 assemblyNumber(确保不为 null 且不为空字符串)
             String existingAssembly = details.getAssemblyNumber();
             if (StringUtils.isNotBlank(existingAssembly)) {
                 Collections.addAll(assemblySet, existingAssembly.split(","));
             }
 
-            // 再加入从 BilletBasicInfo 查询到的 assemblyNumber
-            billetBasicInfoList.stream()
-                    .map(BilletBasicInfo::getAssemblyNumber)
+            // 直接从 Map 获取 assemblyNumber,避免重复查询数据库
+            billetNoSet.stream()
+                    .map(billetToAssemblyMap::get)
                     .filter(StringUtils::isNotBlank)
                     .forEach(assemblySet::add);
 
-            // 5. 拼接回 rollClubOneDetails 的 assemblyNumber
+            // 更新 assemblyNumber
             details.setAssemblyNumber(String.join(",", assemblySet));
         }
     }
 
-
 }