Răsfoiți Sursa

提交物流运单多条件查询修改

chenxiaofei 6 zile în urmă
părinte
comite
70010cc77b

+ 66 - 13
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -4328,14 +4328,20 @@ public class KwtWaybillOrderV1Service {
     private Set<Long> getBillOrderIds(WaybillOrderReq req) {
         Set<Long> billOrderIds = Sets.newHashSet();
         KwtWaybillOrder order = getKwtWaybillOrder(req);
+        Set<Long> loadConditionBillOrderIds = Sets.newHashSet();
+        Set<Long> unloadConditionBillOrderIds = Sets.newHashSet();
+        boolean hasMergedBillOrderCondition = false;
         boolean b = Stream.of(req.getWaybillNo(), req.getTruckNo(), req.getDriverName(), req.getPhone()).anyMatch(StringUtils::isNotBlank);
         if (b){
+            Set<Long> conditionBillOrderIds = Sets.newHashSet();
             List<KwtWaybillOrder> waybillOrders = kwtWaybillOrderRepository.queryByCondition(order);
             if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(waybillOrders)){
-                billOrderIds.addAll(waybillOrders.stream()
+                conditionBillOrderIds.addAll(waybillOrders.stream()
                         .map(KwtWaybillOrder::getId)
                         .collect(Collectors.toSet()));
             }
+            billOrderIds = mergeConditionBillOrderIds(billOrderIds, conditionBillOrderIds, hasMergedBillOrderCondition);
+            hasMergedBillOrderCondition = true;
         }
         if (org.apache.commons.lang3.StringUtils.isNoneBlank(req.getLoadStartTime(),req.getLoadEndTime())){
             Date loadStartTime = DateUtils.formatDate(req.getLoadStartTime());
@@ -4343,7 +4349,7 @@ public class KwtWaybillOrderV1Service {
             List<KwtWaybillOrderTicket> tickets = kwtWaybillOrderTicketRepository.queryByOperateTime(loadStartTime,
                     loadEndTime,1);
             if (org.apache.commons.collections4.CollectionUtils.isNotEmpty( tickets)){
-                billOrderIds.addAll(tickets.stream()
+                loadConditionBillOrderIds.addAll(tickets.stream()
                         .map(KwtWaybillOrderTicket::getWOrderId)
                         .collect(Collectors.toSet()));
             }
@@ -4355,7 +4361,7 @@ public class KwtWaybillOrderV1Service {
             List<KwtWaybillOrderTicket> tickets = kwtWaybillOrderTicketRepository.queryByOperateTime(unloadStartTime,
                     unloadEndTime,2);
             if (org.apache.commons.collections4.CollectionUtils.isNotEmpty( tickets)){
-                billOrderIds.addAll(tickets.stream()
+                unloadConditionBillOrderIds.addAll(tickets.stream()
                         .map(KwtWaybillOrderTicket::getWOrderId)
                         .collect(Collectors.toSet()));
             }
@@ -4366,13 +4372,12 @@ public class KwtWaybillOrderV1Service {
             Date startDate = getStartDate(req.getUnloadStartTime());
             Date endDate = getEndDate(req.getUnloadEndTime());
             List<KwtWaybillOrderNode> nodes = kwtWaybillOrderNodeRepository.queryByOperateTime(startDate, endDate,CarWaybillV1Enum.COMPLETION_LOADING.getCode());
-            Set<Long> billOrderIds2 = Optional.ofNullable(nodes)
+            unloadConditionBillOrderIds.addAll(Optional.ofNullable(nodes)
                     .orElse(List.of()).stream()
                     .map(KwtWaybillOrderNode::getWOrderId)
-                    .collect(Collectors.toSet());
-            if (org.apache.commons.collections4.CollectionUtils.isNotEmpty( billOrderIds2)){
-                billOrderIds.addAll(billOrderIds2);
-            }
+                    .collect(Collectors.toSet()));
+            billOrderIds = mergeConditionBillOrderIds(billOrderIds, unloadConditionBillOrderIds, hasMergedBillOrderCondition);
+            hasMergedBillOrderCondition = true;
         }
 
         if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getLoadStartTime()) &&
@@ -4381,13 +4386,12 @@ public class KwtWaybillOrderV1Service {
             Date startDate = getStartDate(req.getLoadStartTime());
             Date endDate = getEndDate(req.getLoadEndTime());
             List<KwtWaybillOrderNode> nodes = kwtWaybillOrderNodeRepository.queryByOperateTime(startDate, endDate,CarWaybillV1Enum.EXIT_COMPLETED.getCode());
-            Set<Long> billOrderIds2 = Optional.ofNullable(nodes)
+            loadConditionBillOrderIds.addAll(Optional.ofNullable(nodes)
                     .orElse(List.of()).stream()
                     .map(KwtWaybillOrderNode::getWOrderId)
-                    .collect(Collectors.toSet());
-            if (org.apache.commons.collections4.CollectionUtils.isNotEmpty( billOrderIds2)){
-                billOrderIds.addAll(billOrderIds2);
-            }
+                    .collect(Collectors.toSet()));
+            billOrderIds = mergeConditionBillOrderIds(billOrderIds, loadConditionBillOrderIds, hasMergedBillOrderCondition);
+            hasMergedBillOrderCondition = true;
         }
         boolean hasBillOrderRestrictedCondition = Stream.of(
                 req.getWaybillNo(), req.getTruckNo(), req.getDriverName(), req.getPhone(),
@@ -4396,6 +4400,55 @@ public class KwtWaybillOrderV1Service {
         return applyKeywordFilterToBillOrderIds(req, billOrderIds, hasBillOrderRestrictedCondition);
     }
 
+
+    /**
+     * 合并单个已生效查询条件的运单ID集合。
+     * <p>
+     * 业务逻辑说明:
+     * 1. 多个筛选条件(如运单号、车牌、司机、时间等)之间为 AND 关系,即取交集。
+     * 2. 如果当前条件未匹配到任何数据(conditionOrderIds为空),则整体结果必为空,直接返回空集合,避免无效查询。
+     * 3. 如果是第一个生效的条件(!hasMergedCondition),则直接返回当前条件的结果集作为初始集合。
+     * 4. 如果之前已有生效条件(hasMergedCondition=true),则将当前条件结果与已有结果取交集。
+     * 5. 如果已有结果集为空,说明之前的条件已过滤掉所有数据,直接返回空集合。
+     * </p>
+     *
+     * @param billOrderIds       已合并条件命中的运单ID集合(前序条件的交集结果)
+     * @param conditionOrderIds  当前单一条件命中的运单ID集合
+     * @param hasMergedCondition 标记是否已经合并过其他有效条件
+     * @return 多个条件之间取交集后的运单ID集合
+     */
+    static Set<Long> mergeConditionBillOrderIds(Set<Long> billOrderIds,
+                                                Set<Long> conditionOrderIds,
+                                                boolean hasMergedCondition) {
+        // 1. 校验当前条件结果:若当前条件无命中数据,则整体查询结果应为空,防止后续逻辑误判或全量扫描。
+        if (CollectionUtils.isEmpty(conditionOrderIds)) {
+            log.debug("当前查询条件未匹配到任何运单ID,返回空集合");
+            return Sets.newHashSet();
+        }
+
+        // 2. 处理首个有效条件:若此前未合并过任何条件,则当前条件结果即为初始结果集。
+        if (!hasMergedCondition) {
+            log.debug("首次合并有效条件,直接采用当前条件结果,ID数量: {}", conditionOrderIds.size());
+            return Sets.newHashSet(conditionOrderIds);
+        }
+
+        // 3. 校验前序结果:若前序条件已导致结果为空,则无需再进行交集运算,直接返回空。
+        if (CollectionUtils.isEmpty(billOrderIds)) {
+            log.debug("前序条件已过滤为空,无需继续合并,返回空集合");
+            return Sets.newHashSet();
+        }
+
+        // 4. 执行交集运算:保留既在前序结果中,又满足当前条件的运单ID。
+        Set<Long> result = Sets.newHashSet(billOrderIds);
+        result.retainAll(conditionOrderIds);
+        
+        // 5. 记录日志:监控交集运算后的数据量变化,便于排查数据过滤逻辑。
+        log.debug("运单多条件交集合并完成,当前条件ID数量: {}, 前序ID数量: {}, 合并后剩余ID数量: {}", 
+                conditionOrderIds.size(), billOrderIds.size(), result.size());
+        
+        return result;
+    }
+
     private static Date getStartDate(String date) {
         Date startDate;
         if (org.apache.commons.lang3.StringUtils.isBlank(date)) {

+ 36 - 0
sckw-modules/sckw-transport/src/test/java/com/sckw/transport/service/KwtWaybillOrderV1ServiceTest.java

@@ -120,4 +120,40 @@ public class KwtWaybillOrderV1ServiceTest {
 
         Assert.assertTrue(result.isEmpty());
     }
+
+    /**
+     * 多个运单查询条件同时生效时,应按条件结果取交集。
+     */
+    @Test
+    public void mergeConditionBillOrderIdsWhenMultipleConditions() {
+        Set<Long> firstConditionResult = KwtWaybillOrderV1Service.mergeConditionBillOrderIds(
+                Set.of(), Set.of(1001L, 1002L, 1003L), false);
+
+        Set<Long> result = KwtWaybillOrderV1Service.mergeConditionBillOrderIds(
+                firstConditionResult, Set.of(1002L, 1003L, 1004L), true);
+
+        Assert.assertEquals(Set.of(1002L, 1003L), result);
+    }
+
+    /**
+     * 任一已填写条件无命中时,整体运单ID范围应为空。
+     */
+    @Test
+    public void mergeConditionBillOrderIdsWhenConditionNotMatched() {
+        Set<Long> result = KwtWaybillOrderV1Service.mergeConditionBillOrderIds(
+                Set.of(1001L, 1002L), Set.of(), true);
+
+        Assert.assertTrue(result.isEmpty());
+    }
+
+    /**
+     * 前置条件已无命中时,后续条件命中也不能重新放大结果集。
+     */
+    @Test
+    public void mergeConditionBillOrderIdsWhenPreviousConditionEmpty() {
+        Set<Long> result = KwtWaybillOrderV1Service.mergeConditionBillOrderIds(
+                Set.of(), Set.of(1001L, 1002L), true);
+
+        Assert.assertTrue(result.isEmpty());
+    }
 }