Authored by wangnan9279

ufo 热销列表和发售日历列表

package com.yoho.search.restapi.ufo;
import com.yoho.search.common.utils.HttpServletRequestUtils;
import com.yoho.search.models.SearchApiResult;
import com.yoho.search.service.scene.ufo.UfoHotSaleListService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* @author wangnan
* @version 2018/12/18
*/
@Controller
public class UfoHotSaleListController {
@Autowired
private UfoHotSaleListService ufoHotSaleListService;
@RequestMapping(method = RequestMethod.GET, value = "/ufo/hotSaleProductList")
@ResponseBody
public SearchApiResult hotSaleProductList(HttpServletRequest request) {
Map<String, String> paramMap = HttpServletRequestUtils.transParamType(request);
return ufoHotSaleListService.hotSaleProductList(paramMap);
}
}
... ...
package com.yoho.search.restapi.ufo;
import com.yoho.search.common.utils.HttpServletRequestUtils;
import com.yoho.search.models.SearchApiResult;
import com.yoho.search.service.scene.ufo.UfoSaleCalendarService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* @author wangnan
* @version 2018/12/18
*/
@Controller
public class UfoSaleCalendarListController {
@Autowired
private UfoSaleCalendarService ufoSaleCalendarService;
@RequestMapping(method = RequestMethod.GET, value = "/ufo/saleCalendarProductList")
@ResponseBody
public SearchApiResult selectionList(HttpServletRequest request) {
Map<String, String> paramMap = HttpServletRequestUtils.transParamType(request);
return ufoSaleCalendarService.SaleCalendarProductList(paramMap);
}
}
... ...
... ... @@ -95,6 +95,28 @@ public class UfoSearchQueryHelper extends BaseService {
return boolFilter;
}
public BoolQueryBuilder constructSaleCalendarFilterBuilder(Map<String, String> paramMap, String filterParamName) throws Exception {
BoolQueryBuilder boolFilter = QueryBuilders.boolQuery();
//硬过滤
boolFilter.must(QueryBuilders.termQuery(UfoProductIndexEsField.delStatus, 0));
boolFilter.must(QueryBuilders.termQuery(UfoProductIndexEsField.shelveStatus, 1));
//发售列表
long monthBeginTime = DateUtil.getCurrentMonthStartTime();
long monthEndTime = DateUtil.getCurrentMonthEndTime();
boolFilter.must(QueryBuilders.rangeQuery(UfoProductIndexEsField.saleTime).gte(monthBeginTime));
boolFilter.must(QueryBuilders.rangeQuery(UfoProductIndexEsField.saleTime).lte(monthEndTime));
return boolFilter;
}
public BoolQueryBuilder constructHotSaleFilterBuilder(Map<String, String> paramMap, String filterParamName) throws Exception {
BoolQueryBuilder boolFilter = QueryBuilders.boolQuery();
//硬过滤
boolFilter.must(QueryBuilders.termQuery(UfoProductIndexEsField.delStatus, 0));
boolFilter.must(QueryBuilders.termQuery(UfoProductIndexEsField.shelveStatus, 1));
boolFilter.mustNot(QueryBuilders.termQuery(UfoProductIndexEsField.price, -1));
return boolFilter;
}
public BoolQueryBuilder constructFilterBuilderForPlatform(Map<String, String> paramMap, String filterParamName) throws Exception {
BoolQueryBuilder boolFilter = QueryBuilders.boolQuery();
this.addMustIntTermsQuery(boolFilter, paramMap, filterParamName, SearchRequestParams.UFOPRODUCTINDEX_PARAM_ID, UfoProductIndexEsField.id);
... ...
package com.yoho.search.service.index;
import com.yoho.search.base.utils.DateUtil;
import com.yoho.search.base.utils.UfoProductIndexEsField;
import org.apache.commons.collections.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
... ... @@ -19,11 +18,10 @@ import java.util.Map;
@Service
public class UfoProductIndexBaseService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
// 获取从source中返回的字段定义,用以节省带宽
private List<String> ufoProductIndexIncludeFields = new ArrayList<String>();
private List<String> ufoProductIndexIncludeFieldsPlatform = new ArrayList<String>();
private List<String> ufoSaleCalendarProductListIncludeFields = new ArrayList<String>();
@PostConstruct
... ... @@ -37,6 +35,12 @@ public class UfoProductIndexBaseService {
ufoProductIndexIncludeFieldsPlatform.add(UfoProductIndexEsField.productName);
ufoProductIndexIncludeFieldsPlatform.add(UfoProductIndexEsField.shelveStatus);
ufoProductIndexIncludeFieldsPlatform.add(UfoProductIndexEsField.delStatus);
ufoSaleCalendarProductListIncludeFields.add(UfoProductIndexEsField.id);
ufoSaleCalendarProductListIncludeFields.add(UfoProductIndexEsField.productName);
ufoSaleCalendarProductListIncludeFields.add(UfoProductIndexEsField.defaultImages);
ufoSaleCalendarProductListIncludeFields.add(UfoProductIndexEsField.price);
ufoSaleCalendarProductListIncludeFields.add(UfoProductIndexEsField.saleTime);
}
public List<String> getUfoProductIndexIncludeFields() {
... ... @@ -51,6 +55,12 @@ public class UfoProductIndexBaseService {
return results;
}
public List<String> getUfoSaleCalendarProductListIncludeFields() {
List<String> results = new ArrayList<String>();
results.addAll(ufoSaleCalendarProductListIncludeFields);
return results;
}
public List<Map<String, Object>> buildProductReturnInfoList(List<Map<String, Object>> productEsSourceList) {
List<Map<String, Object>> results = new ArrayList<Map<String, Object>>();
for (Map<String, Object> productEsSource : productEsSourceList) {
... ... @@ -67,6 +77,14 @@ public class UfoProductIndexBaseService {
return results;
}
public List<Map<String, Object>> buildSaleCalendarProductReturnInfoList(List<Map<String, Object>> productEsSourceList) {
List<Map<String, Object>> results = new ArrayList<Map<String, Object>>();
for (Map<String, Object> productEsSource : productEsSourceList) {
results.add(this.getProductMapFromEsSourceSaleCalendar(productEsSource));
}
return results;
}
public Map<String, Object> getProductMapFromEsSource(Map<String, Object> map) {
Map<String, Object> productMap = new HashMap<String, Object>();
productMap.put("id", MapUtils.getIntValue(map, UfoProductIndexEsField.id, 0));
... ... @@ -86,5 +104,20 @@ public class UfoProductIndexBaseService {
return productMap;
}
public Map<String, Object> getProductMapFromEsSourceSaleCalendar(Map<String, Object> map) {
Map<String, Object> productMap = new HashMap<String, Object>();
productMap.put("id", MapUtils.getIntValue(map, UfoProductIndexEsField.id, 0));
productMap.put("product_name", MapUtils.getString(map, UfoProductIndexEsField.productName, ""));
productMap.put("default_images", MapUtils.getString(map, UfoProductIndexEsField.defaultImages, ""));
Double price = MapUtils.getDouble(map, UfoProductIndexEsField.price);
productMap.put("price", price == null || price == -1d ? null : price);
Integer saleTime = MapUtils.getInteger(map, UfoProductIndexEsField.saleTime, 0);
String month = DateUtil.TimeStamp2DateWithFormat(Long.valueOf(saleTime), "MM");
String day = DateUtil.TimeStamp2DateWithFormat(Long.valueOf(saleTime), "dd");
productMap.put("sale_time_month", month);
productMap.put("sale_time_day", day);
return productMap;
}
}
... ...
package com.yoho.search.service.scene.ufo;
import com.alibaba.fastjson.JSONObject;
import com.yoho.search.aop.cache.SearchCacheAble;
import com.yoho.search.base.utils.ISearchConstants;
import com.yoho.search.base.utils.UfoProductIndexEsField;
import com.yoho.search.common.SearchCommonService;
import com.yoho.search.core.es.model.SearchParam;
import com.yoho.search.core.es.model.SearchResult;
import com.yoho.search.models.SearchApiResult;
import com.yoho.search.service.helper.UfoSearchQueryHelper;
import com.yoho.search.service.index.UfoProductIndexBaseService;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author wangnan
* @version 2018/12/18
*/
@Service
public class UfoHotSaleListService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private SearchCommonService searchCommonService;
@Autowired
private UfoProductIndexBaseService ufoProductIndexBaseService;
@Autowired
private UfoSearchQueryHelper ufoSearchQueryHelper;
private static final String RETURN_LIST_NAME = "product_list";
@SearchCacheAble(cacheName = "UFO_HOT_SALE_LIST", cacheInMinute = 10)
public SearchApiResult hotSaleProductList(Map<String, String> paramMap) {
try {
// 1、参数校验
int pageSize = StringUtils.isBlank(paramMap.get("viewNum")) ? 10 : Integer.parseInt(paramMap.get("viewNum"));
int page = StringUtils.isBlank(paramMap.get("page")) ? 1 : Integer.parseInt(paramMap.get("page"));
if (page < 1 || pageSize < 0 || page * pageSize > 1000000) {
return new SearchApiResult().setCode(400).setMessage("分页参数不合法");
}
if (pageSize > 100) {
paramMap.put("viewNum", "100");
}
// 2. 构建SearchParam
SearchParam searchParam = new SearchParam();
searchParam.setAggregationBuilders(null);
searchParam.setSize(pageSize);
searchParam.setOffset((page - 1) * pageSize);
BoolQueryBuilder boolFilter = ufoSearchQueryHelper.constructHotSaleFilterBuilder(paramMap, null);
searchParam.setFiter(boolFilter);
// 设置排序字段
List<SortBuilder<?>> sortBuilder = new ArrayList<SortBuilder<?>>();
sortBuilder.add(SortBuilders.fieldSort(UfoProductIndexEsField.salesNumThirtyDay).order(SortOrder.DESC));
searchParam.setSortBuilders(sortBuilder);
// 设置返回的结果
List<String> includeFields = ufoProductIndexBaseService.getUfoProductIndexIncludeFields();
searchParam.setIncludeFields(includeFields);
// 执行搜索
SearchResult searchResult = searchCommonService.doSearch(ISearchConstants.INDEX_NAME_UFO_PRODUCT_INDEX, searchParam);
// 构造返回结果
List<Map<String, Object>> returnInfoList = ufoProductIndexBaseService.buildProductReturnInfoList(searchResult.getResultList());
this.addNumberTag(returnInfoList, page, pageSize);
JSONObject dataMap = new JSONObject();
dataMap.put("total", searchResult.getTotal());
dataMap.put("page", searchResult.getPage());
dataMap.put("page_size", pageSize);
dataMap.put("page_total", searchResult.getTotalPage());
dataMap.put(RETURN_LIST_NAME, returnInfoList);
return new SearchApiResult().setData(dataMap);
} catch (Exception e) {
logger.error(e.getMessage(), e);
return new SearchApiResult().setData(null).setCode(500);
}
}
private void addNumberTag(List<Map<String, Object>> returnInfoList, int page, int pageSize) {
Integer start = (page - 1) * pageSize;
for (Map<String, Object> map : returnInfoList) {
start++;
map.put("serial_number", start.toString());
}
}
}
... ...
package com.yoho.search.service.scene.ufo;
import com.alibaba.fastjson.JSONObject;
import com.yoho.search.aop.cache.SearchCacheAble;
import com.yoho.search.base.utils.DateUtil;
import com.yoho.search.base.utils.ISearchConstants;
import com.yoho.search.base.utils.UfoProductIndexEsField;
import com.yoho.search.common.SearchCommonService;
import com.yoho.search.core.es.model.SearchParam;
import com.yoho.search.core.es.model.SearchResult;
import com.yoho.search.models.SearchApiResult;
import com.yoho.search.service.helper.UfoSearchQueryHelper;
import com.yoho.search.service.index.UfoProductIndexBaseService;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author wangnan
* @version 2018/12/18
*/
@Service
public class UfoSaleCalendarService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private SearchCommonService searchCommonService;
@Autowired
private UfoProductIndexBaseService ufoProductIndexBaseService;
@Autowired
private UfoSearchQueryHelper ufoSearchQueryHelper;
private static final String RETURN_LIST_NAME = "product_list";
@SearchCacheAble(cacheName = "UFO_SALE_CALENDAR_PRODUCT_LIST", cacheInMinute = 10)
public SearchApiResult SaleCalendarProductList(Map<String, String> paramMap) {
try {
// 参数校验
int pageSize = StringUtils.isBlank(paramMap.get("viewNum")) ? 10 : Integer.parseInt(paramMap.get("viewNum"));
int page = StringUtils.isBlank(paramMap.get("page")) ? 1 : Integer.parseInt(paramMap.get("page"));
if (page < 1 || pageSize < 0 || page * pageSize > 1000000) {
return new SearchApiResult().setCode(400).setMessage("分页参数不合法");
}
if (pageSize > 100) {
paramMap.put("viewNum", "100");
}
// 构建SearchParam
SearchParam searchParam = new SearchParam();
searchParam.setSize(pageSize);
searchParam.setOffset((page - 1) * pageSize);
searchParam.setAggregationBuilders(null);
// 过滤
searchParam.setFiter(ufoSearchQueryHelper.constructSaleCalendarFilterBuilder(paramMap, null));
// 设置排序字段
List<SortBuilder<?>> sortBuilder = new ArrayList<SortBuilder<?>>();
sortBuilder.add(SortBuilders.fieldSort(UfoProductIndexEsField.saleTime).order(SortOrder.ASC));
searchParam.setSortBuilders(sortBuilder);
// 设置返回的结果
searchParam.setIncludeFields(ufoProductIndexBaseService.getUfoSaleCalendarProductListIncludeFields());
// 执行搜索
SearchResult searchResult = searchCommonService.doSearch(ISearchConstants.INDEX_NAME_UFO_PRODUCT_INDEX, searchParam);
// 构造返回结果
List<Map<String, Object>> returnInfoList = ufoProductIndexBaseService.buildSaleCalendarProductReturnInfoList(searchResult.getResultList());
JSONObject dataMap = new JSONObject();
dataMap.put("month", getThisMonth());
dataMap.put("total", searchResult.getTotal());
dataMap.put("page", searchResult.getPage());
dataMap.put("page_size", pageSize);
dataMap.put("page_total", searchResult.getTotalPage());
dataMap.put(RETURN_LIST_NAME, returnInfoList);
return new SearchApiResult().setData(dataMap);
} catch (Exception e) {
logger.error(e.getMessage(), e);
return new SearchApiResult().setData(null).setCode(500);
}
}
private String getThisMonth() {
long monthBeginTime = DateUtil.getCurrentMonthStartTime();
String month = DateUtil.TimeStamp2DateWithFormat(monthBeginTime, "MM");
if (month.charAt(0) == '0') {
return month.charAt(1) + "";
}
return month;
}
}
... ...