吉安感知网项目-后端
linwei
2026-07-08 07c265109983db7dad5b9c28e9ad2a48fd0f6d6a
feat(flyer): 优化飞手搜索结果排序逻辑

- 修改排序算法从布尔匹配改为计数匹配,匹配数量多的排在前面
- 新增 countMatchedTaskTypes 方法计算任务类型匹配数量
- 支持多个任务类型逗号分隔搜索(如:road4,road5)
- 重构 containsTaskType 方法为 countMatchedTaskTypes 方法
- 更新注释说明新的排序规则和参数处理方式
- 优化参数校验和空值处理逻辑
1 files modified
41 ■■■■■ changed files
drone-service/drone-gd/src/main/java/org/sxkj/gd/flyer/service/impl/GdFlyerServiceImpl.java 41 ●●●●● patch | view | raw | blame | history
drone-service/drone-gd/src/main/java/org/sxkj/gd/flyer/service/impl/GdFlyerServiceImpl.java
@@ -63,14 +63,14 @@
            // 步骤3:获取查询的任务类型
            String searchTaskType = gdFlyer.getSkilledTaskType();
            // 步骤4:对结果进行排序,匹配的记录排在前面
            // 步骤4:对结果进行排序,匹配数量多的排在前面
            gdFlyerVOS.sort((vo1, vo2) -> {
                // 步骤5:检查记录1是否包含查询的任务类型
                boolean match1 = containsTaskType(vo1.getSkilledTaskType(), searchTaskType);
                // 步骤6:检查记录2是否包含查询的任务类型
                boolean match2 = containsTaskType(vo2.getSkilledTaskType(), searchTaskType);
                // 步骤7:匹配的记录排在前面(降序排列)
                return Boolean.compare(match2, match1);
                // 步骤5:计算记录1匹配的任务类型数量
                int matchCount1 = countMatchedTaskTypes(vo1.getSkilledTaskType(), searchTaskType);
                // 步骤6:计算记录2匹配的任务类型数量
                int matchCount2 = countMatchedTaskTypes(vo2.getSkilledTaskType(), searchTaskType);
                // 步骤7:匹配数量多的排在前面(降序排列)
                return Integer.compare(matchCount2, matchCount1);
            });
        }
@@ -78,19 +78,30 @@
    }
    /**
     * 检查任务类型列表中是否包含指定的任务类型
     * 计算任务类型列表中匹配的任务类型数量
     * @param skilledTaskTypes 擅长的任务类型列表(二维数组)
     * @param searchTaskType 要搜索的任务类型
     * @return 包含返回true,否则返回false
     * @param searchTaskType 要搜索的任务类型(多个用逗号分隔,如:road4,road5)
     * @return 匹配的任务类型数量
     */
    private boolean containsTaskType(List<List<String>> skilledTaskTypes, String searchTaskType) {
    private int countMatchedTaskTypes(List<List<String>> skilledTaskTypes, String searchTaskType) {
        // 步骤1:校验参数有效性
        if (skilledTaskTypes == null || StringUtil.isBlank(searchTaskType)) {
            return false;
            return 0;
        }
        // 步骤2:遍历二维数组,检查是否包含目标任务类型
        return skilledTaskTypes.stream()
            .anyMatch(innerList -> innerList != null && innerList.contains(searchTaskType));
        // 步骤2:拆分多个任务类型(支持逗号分隔)
        String[] taskTypes = searchTaskType.split(",");
        // 步骤3:计算匹配数量
        int matchCount = 0;
        for (String taskType : taskTypes) {
            String trimmedTaskType = taskType.trim();
            // 步骤4:检查二维数组中是否包含该任务类型
            boolean matched = skilledTaskTypes.stream()
                .anyMatch(innerList -> innerList != null && innerList.contains(trimmedTaskType));
            if (matched) {
                matchCount++;
            }
        }
        return matchCount;
    }