Authored by 胡古飞

有好货购物车/收藏夹/浏览的SKN参数 分开

... ... @@ -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>();
... ...