# FilterRateUtil.java

    package cloud.wconnect.rateshop.util.rateshop;

    import cloud.wconnect.rateshop.pojo.dto.rateshop.RateConfigDTO;
    import cloud.wconnect.rateshop.pojo.dto.rateshop.filterrate.RateQuery;
    import cloud.wconnect.rateshop.pojo.dto.rateshop.filterrate.RateValue;
    import org.apache.commons.collections.CollectionUtils;

    import java.util.Collections;
    import java.util.List;
    import java.util.Map;
    import java.util.Objects;
    import java.util.stream.Collectors;

    /**
     * 过滤房价的工具类
     *
     * @author lichen
     * @date 2024/7/2
     */
    public class FilterRateUtil {

        /**
         * 根据查询条件判断房价是否匹配
         *
         * @param rateValue      房价数据
         * @param rateQuery      查询条件
         * @param rateConfigDTOS 配置的房价类型，数据源，平台规则
         * @param rateType       房价类型
         * @return boolean true 匹配 false 不匹配
         * @author lichen
         * @date 2024/7/2
         */
        public static boolean isMatchByQueryCondition(RateValue rateValue, RateQuery rateQuery, List<RateConfigDTO> rateConfigDTOS, int rateType) {
            List<RateConfigDTO> rateConfigDTOSByFilter = rateConfigDTOS.stream().filter(item -> item.getRateType() == rateType).toList();
            if(CollectionUtils.isEmpty(rateConfigDTOSByFilter)) return false;

            //数据源和平台ID对应关系
            Map<Integer, List<Integer>> datasourceId2PlatformIds = rateConfigDTOSByFilter.stream()
                    .collect(Collectors.toMap(RateConfigDTO::getDatasourceId, RateConfigDTO::getPlatformIds));

            //查询条件
            Integer datasourceIdByQuery = rateQuery.getDatasourceId();
            Integer platformIdByQuery = rateQuery.getPlatformId();
            List<Integer> roomIdsByQuery = rateQuery.getRoomIds();

            //房价数据
            Integer datasourceId = rateValue.getDatasourceId();
            Integer platformId = rateValue.getPlatformId();
            Integer roomId = rateValue.getRoomId();

            /**
             * 数据源、平台、房型查询条件是级联条件，必须先选择数据源、再选择平台、再选项房型
             * 数据源为空时, 平台和房型一定为空
             * 平台为空时，房型一定为空
             *
             * 过滤说明：
             * 1. 数据源为空：满足任意一组数据源+平台的关系即可
             * 2. 数据源非空，平台为空：满足指定数据源+平台（指定数据源下的平台）的关系即可
             * 3. 数据源非空，平台非空，房型为空：满足指定数据源+指定平台的关系即可
             * 4. 数据源非空，平台非空，房型非空：三者都满足
             */
            //数据源为空：满足任意一组数据源+平台的关系即可
            if (Objects.isNull(datasourceIdByQuery)) {
                boolean isMatch = false;//是否匹配

                for (Map.Entry<Integer, List<Integer>> entry : datasourceId2PlatformIds.entrySet()) {
                    Integer datasourceIdByConfig = entry.getKey();
                    List<Integer> platformIdsByConfig = entry.getValue();
                    if (datasourceIdByConfig.equals(datasourceId) && platformIdsByConfig.contains(platformId)) {
                        isMatch = true;
                        break;
                    }
                }

                return isMatch;
            }

            //数据源非空，平台为空：满足指定数据源+平台（指定数据源下的平台）的关系即可
            if (Objects.isNull(platformIdByQuery)) {
                //指定数据源下配置的平台ID集合
                List<Integer> platformIdsByConfig = datasourceId2PlatformIds.getOrDefault(datasourceIdByQuery, Collections.emptyList());
                return datasourceIdByQuery.equals(datasourceId) && platformIdsByConfig.contains(platformId);
            }

            //数据源非空，平台非空，房型为空：满足指定数据源+指定平台的关系即可
            if (CollectionUtils.isEmpty(roomIdsByQuery)) {
                return datasourceIdByQuery.equals(datasourceId) && platformIdByQuery.equals(platformId);
            }else{
                //数据源非空，平台非空，房型非空：三者都满足
                return datasourceIdByQuery.equals(datasourceId) && platformIdByQuery.equals(platformId) && roomIdsByQuery.contains(roomId);
            }
        }

    }