use of com.wayn.common.util.R in project waynboot-mall by wayn111.
the class SearchController method result.
@GetMapping("result")
public R result(SearchVO searchVO) throws IOException {
Long memberId = MobileSecurityUtils.getUserId();
String keyword = searchVO.getKeyword();
Boolean filterNew = searchVO.getFilterNew();
Boolean filterHot = searchVO.getFilterHot();
Boolean isNew = searchVO.getIsNew();
Boolean isHot = searchVO.getIsHot();
Boolean isPrice = searchVO.getIsPrice();
Boolean isSales = searchVO.getIsSales();
String orderBy = searchVO.getOrderBy();
SearchHistory searchHistory = new SearchHistory();
if (memberId != null && StringUtils.isNotEmpty(keyword)) {
searchHistory.setCreateTime(LocalDateTime.now());
searchHistory.setUserId(memberId);
searchHistory.setKeyword(keyword);
}
Page<SearchVO> page = getPage();
// 查询包含关键字、已上架商品
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
MatchQueryBuilder matchFiler = QueryBuilders.matchQuery("isOnSale", true);
MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("name", keyword);
MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("keyword", keyword);
boolQueryBuilder.filter(matchFiler).should(matchQuery).should(matchPhraseQueryBuilder).minimumShouldMatch(1);
searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));
// 按是否新品排序
if (isNew) {
searchSourceBuilder.sort(new FieldSortBuilder("isNew").order(SortOrder.DESC));
}
// 按是否热品排序
if (isHot) {
searchSourceBuilder.sort(new FieldSortBuilder("isHot").order(SortOrder.DESC));
}
// 按价格高低排序
if (isPrice) {
searchSourceBuilder.sort(new FieldSortBuilder("retailPrice").order("asc".equals(orderBy) ? SortOrder.ASC : SortOrder.DESC));
}
// 按销量排序
if (isSales) {
searchSourceBuilder.sort(new FieldSortBuilder("sales").order(SortOrder.DESC));
}
// 筛选新品
if (filterNew) {
MatchQueryBuilder filterQuery = QueryBuilders.matchQuery("isNew", true);
boolQueryBuilder.filter(filterQuery);
}
// 筛选热品
if (filterHot) {
MatchQueryBuilder filterQuery = QueryBuilders.matchQuery("isHot", true);
boolQueryBuilder.filter(filterQuery);
}
searchSourceBuilder.query(boolQueryBuilder);
searchSourceBuilder.from((int) (page.getCurrent() - 1) * (int) page.getSize());
searchSourceBuilder.size((int) page.getSize());
List<JSONObject> list = elasticDocument.search("goods", searchSourceBuilder, JSONObject.class);
List<Integer> goodsIdList = list.stream().map(jsonObject -> (Integer) jsonObject.get("id")).collect(Collectors.toList());
if (goodsIdList.size() == 0) {
return R.success().add("goods", Collections.emptyList());
}
// 根据es中返回商品ID查询商品详情并保持es中的排序
List<Goods> goodsList = iGoodsService.searchResult(goodsIdList);
Map<Integer, Goods> goodsMap = goodsList.stream().collect(Collectors.toMap(goods -> Math.toIntExact(goods.getId()), o -> o));
List<Goods> returnGoodsList = new ArrayList<>(goodsList.size());
for (Integer goodsId : goodsIdList) {
returnGoodsList.add(goodsMap.get(goodsId));
}
if (CollectionUtils.isNotEmpty(goodsList)) {
AsyncManager.me().execute(new TimerTask() {
@Override
public void run() {
searchHistory.setHasGoods(true);
iSearchHistoryService.save(searchHistory);
}
});
}
return R.success().add("goods", returnGoodsList);
}
use of com.wayn.common.util.R in project waynboot-mall by wayn111.
the class CategoryController method secondCateGoods.
@GetMapping("secondCategoryGoods")
public R secondCateGoods(@RequestParam(defaultValue = "0") Long cateId) {
Page<Goods> page = getPage();
List<Long> cateList = List.of(cateId);
R success = iGoodsService.selectListPageByCateIds(page, cateList);
success.add("category", iCategoryService.getById(cateId));
return success;
}
use of com.wayn.common.util.R in project waynboot-mall by wayn111.
the class CartServiceImpl method list.
@Override
public R list(Page<Cart> page, Long userId) {
IPage<Cart> goodsIPage = cartMapper.selectCartPageList(page, userId);
List<Cart> cartList = goodsIPage.getRecords();
List<Long> goodsIdList = cartList.stream().map(Cart::getGoodsId).collect(Collectors.toList());
JSONArray array = new JSONArray();
if (CollectionUtils.isEmpty(goodsIdList)) {
return R.success().add("data", array);
}
Map<Long, Goods> goodsIdMap = iGoodsService.selectGoodsByIds(goodsIdList).stream().collect(Collectors.toMap(Goods::getId, goods -> goods));
for (Cart cart : cartList) {
JSONObject jsonObject = new JSONObject();
try {
MyBeanUtil.copyProperties2Map(cart, jsonObject);
Goods goods = goodsIdMap.get(cart.getGoodsId());
if (goods.getIsNew()) {
jsonObject.put("tag", "新品");
}
if (goods.getIsHot()) {
jsonObject.put("tag", "热品");
}
} catch (IntrospectionException | InvocationTargetException | IllegalAccessException e) {
log.error(e.getMessage(), e);
}
array.add(jsonObject);
}
return R.success().add("data", array);
}
use of com.wayn.common.util.R in project waynboot-mall by wayn111.
the class IHomeServiceImpl method getHomeIndexDataCompletableFuture.
@Override
public R getHomeIndexDataCompletableFuture() {
R success = R.success();
Map<String, Object> shopHomeIndexHash = redisCache.getCacheMap(SHOP_HOME_INDEX_HASH);
// 当缓存中存在数据,并且过期时间不为空而且小于等于过期时间则直接从缓存中取出数据
if (MapUtils.isNotEmpty(shopHomeIndexHash) && shopHomeIndexHash.containsKey(SHOP_HOME_INDEX_HASH_EXPIRETIME_FIELD)) {
long time = (long) shopHomeIndexHash.get(SHOP_HOME_INDEX_HASH_EXPIRETIME_FIELD);
if ((new Date().getTime() - time) <= SHOP_HOME_INDEX_HASH_EXPIRETIME) {
shopHomeIndexHash.forEach(success::add);
return success;
}
}
List<CompletableFuture<Void>> list = new ArrayList<>(4);
CompletableFuture<Void> f1 = CompletableFuture.supplyAsync(() -> iBannerService.list(Wrappers.lambdaQuery(Banner.class).eq(Banner::getStatus, 0).orderByAsc(Banner::getSort)), homeThreadPoolTaskExecutor).thenAccept(data -> {
String key = "bannerList";
redisCache.setCacheMapValue(SHOP_HOME_INDEX_HASH, key, data);
success.add(key, data);
});
CompletableFuture<Void> f2 = CompletableFuture.supplyAsync(() -> iDiamondService.list(Wrappers.lambdaQuery(Diamond.class).orderByAsc(Diamond::getSort).last("limit 10")), homeThreadPoolTaskExecutor).thenAccept(data -> {
String key = "categoryList";
redisCache.setCacheMapValue(SHOP_HOME_INDEX_HASH, key, data);
success.add(key, data);
});
CompletableFuture<Void> f3 = CompletableFuture.supplyAsync(() -> iGoodsService.selectHomeIndexGoods(Goods.builder().isNew(true).build()), homeThreadPoolTaskExecutor).thenAccept(data -> {
String key = "newGoodsList";
redisCache.setCacheMapValue(SHOP_HOME_INDEX_HASH, key, data);
success.add(key, data);
});
CompletableFuture<Void> f4 = CompletableFuture.supplyAsync(() -> iGoodsService.selectHomeIndexGoods(Goods.builder().isHot(true).build()), homeThreadPoolTaskExecutor).thenAccept(data -> {
String key = "hotGoodsList";
redisCache.setCacheMapValue(SHOP_HOME_INDEX_HASH, key, data);
success.add(key, data);
});
list.add(f1);
list.add(f2);
list.add(f3);
list.add(f4);
CompletableFuture.allOf(list.toArray(new CompletableFuture[0])).join();
// 通过hash的field设置过期时间,防止过期时间设置失败导致缓存无法删除
redisCache.setCacheMapValue(SHOP_HOME_INDEX_HASH, SHOP_HOME_INDEX_HASH_EXPIRETIME_FIELD, new Date().getTime());
return success;
}
use of com.wayn.common.util.R in project waynboot-mall by wayn111.
the class OrderServiceImpl method getOrderDetailByOrderSn.
@Override
public R getOrderDetailByOrderSn(String orderSn) {
R success = R.success();
LambdaQueryWrapper<Order> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(Order::getOrderSn, orderSn);
Order order = getOne(queryWrapper);
OrderDetailVO orderDetailVO = new OrderDetailVO();
MyBeanUtil.copyProperties(order, orderDetailVO);
orderDetailVO.setOrderStatusText(OrderUtil.orderStatusText(order));
orderDetailVO.setPayTypeText(OrderUtil.payTypeText(order));
LambdaQueryWrapper<OrderGoods> queryWrapper1 = Wrappers.lambdaQuery(OrderGoods.class);
queryWrapper1.eq(OrderGoods::getOrderId, order.getId());
List<OrderGoods> list = iOrderGoodsService.list(queryWrapper1);
List<OrderGoodsVO> orderGoodsVOS = BeanUtil.copyToList(list, OrderGoodsVO.class);
orderDetailVO.setOrderGoodsVOList(orderGoodsVOS);
return success.add("order", orderDetailVO);
}
Aggregations