...
|
...
|
@@ -67,7 +67,23 @@ public class GoodProductListService implements IGoodProductsService { |
|
|
private FunctionScoreSearchHelper functionScoreSearchHelper;
|
|
|
@Autowired
|
|
|
private ProductIndexBaseService productIndexBaseService;
|
|
|
|
|
|
|
|
|
private static final String product_skn = "product_skn";
|
|
|
private static final String cart_product_skn = "cart_product_skn";
|
|
|
private static final String collect_product_skn = "collect_product_skn";
|
|
|
|
|
|
private List<String> stringToList(String source,String split){
|
|
|
List<String> result = new ArrayList<String>();
|
|
|
if(StringUtils.isBlank(source)){
|
|
|
return result;
|
|
|
}
|
|
|
for (String part : source.split(",")) {
|
|
|
result.add(part);
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
|
|
|
@Override
|
|
|
public SearchApiResult goodProductList(Map<String, String> paramMap) {
|
|
|
boolean openLog = "13420925".equals(paramMap.getOrDefault("uid", "0"));
|
...
|
...
|
@@ -80,11 +96,21 @@ public class GoodProductListService implements IGoodProductsService { |
|
|
if (page < 1 || pageSize < 0) {
|
|
|
return new SearchApiResult().setCode(400).setMessage("分页参数不合法");
|
|
|
}
|
|
|
|
|
|
// 1.1 SKN参数获取
|
|
|
List<String> product_skns = stringToList(paramMap.getOrDefault(product_skn, ""),",");
|
|
|
List<String> cart_productskns = stringToList(paramMap.getOrDefault(cart_product_skn, ""),",");
|
|
|
List<String> collect_product_skns = stringToList(paramMap.getOrDefault(collect_product_skn, ""),",");
|
|
|
|
|
|
// 2、先获取用户浏览的SKN对应的品类列表
|
|
|
JSONObject sortAndBrandInfo = this.querySknSortAndBrand(paramMap.getOrDefault("product_skn", ""));
|
|
|
List<String> allProductSkn = new ArrayList<String>();
|
|
|
allProductSkn.addAll(product_skns);
|
|
|
allProductSkn.addAll(cart_productskns);
|
|
|
|
|
|
JSONObject sortAndBrandInfo = this.querySknSortAndBrand(allProductSkn);
|
|
|
|
|
|
// 3、再根据品类和品牌推荐SKN
|
|
|
List<String> recommondSkns = this.recommondSknsBySortAndBrandInfo(sortAndBrandInfo, paramMap);
|
|
|
List<String> recommondSkns = this.recommondSknsBySortAndBrandInfo(sortAndBrandInfo, paramMap,product_skns,cart_productskns,collect_product_skns);
|
|
|
|
|
|
if (paramMap.getOrDefault("uid", "0").equals("13420925")) {
|
|
|
logger.warn("goodProductList recommondSkns is : [{}]", recommondSkns);
|
...
|
...
|
@@ -141,15 +167,11 @@ public class GoodProductListService implements IGoodProductsService { |
|
|
* @param productSkns
|
|
|
* @return
|
|
|
*/
|
|
|
private JSONObject querySknSortAndBrand(String productSkns) {
|
|
|
if (StringUtils.isBlank(productSkns)) {
|
|
|
return new JSONObject();
|
|
|
}
|
|
|
String[] productSknArray = productSkns.split(",");
|
|
|
private JSONObject querySknSortAndBrand(List<String> productSkns) {
|
|
|
SearchParam searchParam = new SearchParam();
|
|
|
// 1、设置过滤条件
|
|
|
BoolQueryBuilder boolFilter = QueryBuilders.boolQuery();
|
|
|
boolFilter.must(QueryBuilders.termsQuery("productSkn", productSknArray));
|
|
|
boolFilter.must(QueryBuilders.termsQuery("productSkn", productSkns));
|
|
|
searchParam.setFiter(boolFilter);
|
|
|
// 2、设置聚合条件,获取所有的品类和品牌
|
|
|
TermsBuilder smallSortIdAgg = AggregationBuilders.terms("smallSortAgg").field("smallSortId").size(100);
|
...
|
...
|
@@ -209,7 +231,7 @@ public class GoodProductListService implements IGoodProductsService { |
|
|
*
|
|
|
* @return
|
|
|
*/
|
|
|
private List<String> recommondSknsBySortAndBrandInfo(JSONObject sortAndBrandInfo, Map<String, String> paramMap) {
|
|
|
private List<String> recommondSknsBySortAndBrandInfo(JSONObject sortAndBrandInfo, Map<String, String> paramMap,List<String> product_skns,List<String> cart_productskns,List<String> collect_product_skns) {
|
|
|
// 1、获取品牌id和品类id
|
|
|
if (sortAndBrandInfo == null || sortAndBrandInfo.isEmpty()) {
|
|
|
return new ArrayList<String>();
|
...
|
...
|
@@ -308,16 +330,25 @@ public class GoodProductListService implements IGoodProductsService { |
|
|
recommendedSknJSONArray = new JSONArray();
|
|
|
// 9.1、获取推荐出来的商品
|
|
|
recommendedSknJSONArray.addAll(this.getProductSkns(goodProductLists));
|
|
|
// 9.2、再加入用户看过的商品前面
|
|
|
for (String skn : paramMap.getOrDefault("product_skn", "").split(",")) {
|
|
|
if (!recommendedSknJSONArray.contains(skn)) {
|
|
|
recommendedSknJSONArray.add(skn);
|
|
|
}
|
|
|
// 9.2、再加入用户购物车和收藏夹中的商品
|
|
|
this.addListToJsonArray(recommendedSknJSONArray, cart_productskns);
|
|
|
this.addListToJsonArray(recommendedSknJSONArray, collect_product_skns);
|
|
|
if(cart_productskns.isEmpty() && collect_product_skns.isEmpty()){
|
|
|
this.addListToJsonArray(recommendedSknJSONArray, product_skns);
|
|
|
}
|
|
|
searchCacheService.addJSONArrayToCache(indexName, searchParam, recommendedSknJSONArray);
|
|
|
return this.jsonArrayToList(recommendedSknJSONArray, String.class);
|
|
|
}
|
|
|
|
|
|
private void addListToJsonArray(JSONArray recommendedSknJSONArray,List<String> list){
|
|
|
for (String skn :list) {
|
|
|
if (!recommendedSknJSONArray.contains(skn)) {
|
|
|
recommendedSknJSONArray.add(skn);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
private List<String> getProductSkns(List<GoodProductBO> goodProductLists) {
|
|
|
if (goodProductLists == null || goodProductLists.isEmpty()) {
|
|
|
return new ArrayList<String>();
|
...
|
...
|
|