public Page<ProductBean> listRoute(Map<String, Object> params) {
    if (isFreness(params)) {
      ArgCheckUtils.validataRequiredArgs("toDest", "page", params);
    } else {
      ArgCheckUtils.validataRequiredArgs("fromDest", "toDest", "page", params);
    }

    ClientRouteSearchVO searchVo = new ClientRouteSearchVO();
    searchVo.setChannel(Constant.CHANNEL.CLIENT.name());
    List<String> productTypes = new ArrayList<String>();
    productTypes.add(Constant.PRODUCT_TYPE.ROUTE.name());
    searchVo.setProductType(productTypes);

    if (params.get("pageSize") != null) {
      searchVo.setPageSize(Integer.parseInt(params.get("pageSize").toString()));
    }

    if (params.get("subject") != null) {
      searchVo.setSubject(params.get("subject").toString());
    }

    if (params.get("placeId") != null) {
      searchVo.setCityId(params.get("placeId").toString());
    }

    searchVo.setPage(Integer.valueOf(params.get("page").toString()));

    if (params.get("searchType") != null) {
      if (params.get("subProductType") != null && !"".equals(params.get("subProductType"))) {
        String searchType = params.get("searchType").toString();
        if (this.isNotOverSeaTravel(searchType)) {
          if (params.get("fromDest") != null) {
            String fromDest = params.get("fromDest").toString();
            if (fromDest.contains(",")) {
              fromDest = fromDest.substring(0, fromDest.lastIndexOf(","));
              params.put("fromDest", fromDest);
            }
          }
        }
      }
    }

    if (params.get("subProductType") != null) {
      if (this.isFreness(params)) {
        params.put("fromDest", null);
      }
      searchVo.setSubProductType(ClientUtils.convetToList(params.get("subProductType").toString()));
    } else {
      searchVo.setSubProductType(new ArrayList<String>());
    }

    if (params.get("fromDest") != null) {
      searchVo.setFromDest(params.get("fromDest").toString());
    }

    if (params.get("toDest") != null) {
      searchVo.setToDest(StringUtil.subStringStrNoSuffix(params.get("toDest").toString(), 60));
    }

    if (params.get("sort") != null) {
      searchVo.setSort(params.get("sort").toString());
    } else { // 添加默认seq排序
      searchVo.setSort("seq");
    }

    if (params.get("day") != null) {
      searchVo.setVisitDay(params.get("day").toString());
    }

    if (params.get("keyword") != null) {
      searchVo.setKeyword(StringUtil.subStringStrNoSuffix(params.get("keyword").toString(), 60));
    }

    Page<ProductBean> pageConfig = vstClientProductService.routeSearch(searchVo);
    return pageConfig;
  }
  public Map<String, Object> routeSearch(Map<String, Object> params) {
    if (isFreness(params)) {
      ArgCheckUtils.validataRequiredArgs("toDest", "page", params);
    } else {
      ArgCheckUtils.validataRequiredArgs("fromDest", "toDest", "page", params);
    }
    Map<String, Object> resultMap = new HashMap<String, Object>();

    ClientRouteSearchVO searchVo = new ClientRouteSearchVO();
    searchVo.setChannel(Constant.CHANNEL.CLIENT.name());
    List<String> productTypes = new ArrayList<String>();
    productTypes.add(Constant.PRODUCT_TYPE.ROUTE.name());
    searchVo.setProductType(productTypes);

    if (params.get("pageSize") != null) {
      searchVo.setPageSize(Integer.parseInt(params.get("pageSize").toString()));
    }

    if (params.get("subject") != null) {
      searchVo.setSubject(params.get("subject").toString());
    }

    if (params.get("palceId") != null) {
      searchVo.setPlaceId(params.get("palceId").toString());
    }

    searchVo.setPage(Integer.valueOf(params.get("page").toString()));

    if (params.get("searchType") != null) {
      if (params.get("subProductType") != null && !"".equals(params.get("subProductType"))) {
        String searchType = params.get("searchType").toString();
        if (this.isNotOverSeaTravel(searchType)) {
          if (params.get("fromDest") != null) {
            String fromDest = params.get("fromDest").toString();
            if (fromDest.contains(",")) {
              fromDest = fromDest.substring(0, fromDest.lastIndexOf(","));
              params.put("fromDest", fromDest);
            }
          }
        }
      }
    }

    if (params.get("subProductType") != null) {
      if (this.isFreness(params)) {
        params.put("fromDest", null);
      }
      searchVo.setSubProductType(ClientUtils.convetToList(params.get("subProductType").toString()));
    } else {
      searchVo.setSubProductType(new ArrayList<String>());
    }

    if (params.get("fromDest") != null) {
      searchVo.setFromDest(params.get("fromDest").toString());
    }

    if (params.get("toDest") != null) {
      searchVo.setToDest(StringUtil.subStringStrNoSuffix(params.get("toDest").toString(), 60));
    }

    if (params.get("sort") != null) {
      searchVo.setSort(params.get("sort").toString());
    }
    if (params.get("day") != null) {
      searchVo.setVisitDay(params.get("day").toString());
    }

    if (params.get("keyword") != null) {
      searchVo.setKeyword(StringUtil.subStringStrNoSuffix(params.get("keyword").toString(), 60));
    }

    Page<ProductBean> pageConfig = vstClientProductService.routeSearch(searchVo);
    List<MobileProductTitle> mpList = new ArrayList<MobileProductTitle>();
    Map<String, String> visitMap = new HashMap<String, String>();

    for (ProductBean productBean : pageConfig.getAllItems()) {
      if (!StringUtil.isEmptyString(productBean.getRouteTopic())) {
        String[] topics = productBean.getRouteTopic().split(",");
        for (String string : topics) {
          String str = StringUtils.trimAllWhitespace(string);
          visitMap.put(str, str);
        }
      }
    }

    List<Map<String, Object>> topicList = new ArrayList<Map<String, Object>>();
    Iterator<Entry<String, String>> it = visitMap.entrySet().iterator();

    // subjectList列表
    Map<String, Object> t_m = new HashMap<String, Object>();
    t_m.put("title", "全部主题");
    t_m.put("value", "");
    topicList.add(t_m);
    while (it.hasNext()) {
      Map<String, Object> m = new HashMap<String, Object>();
      Map.Entry<String, String> entry = (Map.Entry<String, String>) it.next();
      String key = entry.getKey();
      m.put("title", key);
      m.put("value", key);
      topicList.add(m);
    }

    for (ProductBean productBean : pageConfig.getItems()) {
      // 过滤掉超级自由行
      if ("true".equals(productBean.getSelfPack())) {
        continue;
      }
      MobileProductTitle mp = new MobileProductTitle();
      mp.setProductName(productBean.getProductName());
      mp.setMarketPriceYuan(productBean.getMarketPrice());
      mp.setSmallImage(productBean.getSmallImage());
      mp.setSellPriceYuan(productBean.getSellPrice());
      mp.setProductId(productBean.getProductId());
      mp.setClientOnly(Constant.CHANNEL.CLIENT.name().equals(productBean.getProductChannel()));
      // 返现金额 分
      mp.setMaxCashRefund(
          null == productBean.getCashRefund()
              ? 0l
              : PriceUtil.convertToFen(productBean.getCashRefund()));
      mp.setCmtNum(productBean.getCmtNum()); // 点评数
      mp.setSubProductType(productBean.getSubProductType()); // 主题类型
      mp.setVisitDay(productBean.getVisitDay() + ""); // 天数
      try {
        ProductSearchInfo psi =
            this.productSearchInfoService.queryProductSearchInfoByProductId(
                productBean.getProductId());
        mp.setHasBusinessCoupon(ClientUtils.hasBusinessCoupon(psi)); // 优惠
      } catch (Exception e) {
        e.printStackTrace();
      }

      mpList.add(mp);
    }

    resultMap.put("subjects", topicList);
    resultMap.put("datas", mpList);
    resultMap.put("isLastPage", isLastPage(pageConfig));
    return resultMap;
  }