refactor(商城): 优化首页商品查询方式

master
waynaqua 4 years ago
parent bf2af7577d
commit b1aa263099

@ -6,8 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.wayn.common.base.entity.ShopBaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.*;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
@ -22,7 +21,11 @@ import java.math.BigDecimal;
* @author wayn
* @since 2020-07-06
*/
@Data
@Builder
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@TableName(value = "shop_goods", autoResultMap = true)
public class Goods extends ShopBaseEntity implements Serializable {

@ -27,4 +27,6 @@ public interface GoodsMapper extends BaseMapper<Goods> {
IPage<Goods> selectColumnBindGoodsListPage(Page<Goods> page, Goods goods, List<Long> columnGoodsIds);
IPage<Goods> selectColumnUnBindGoodsListPage(Page<Goods> page, Goods goods, List<Long> columnGoodsIds);
List<Goods> selectHomeIndex(Goods goods);
}

@ -31,6 +31,14 @@ public interface IGoodsService extends IService<Goods> {
*/
IPage<Goods> listPage(Page<Goods> page, Goods goods);
/**
*
*
* @param goods
* @return
*/
List<Goods> selectHomeIndexGoods(Goods goods);
IPage<Goods> listColumnBindGoodsPage(Page<Goods> page, Goods goods, List<Long> columnGoodsIds);
IPage<Goods> listColumnUnBindGoodsPage(Page<Goods> page, Goods goods, List<Long> columnGoodsIds);

@ -55,6 +55,13 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
return goodsMapper.selectGoodsListPage(page, goods);
}
@Override
public List<Goods> selectHomeIndexGoods(Goods goods) {
return goodsMapper.selectHomeIndex(goods);
}
@Override
public IPage<Goods> listColumnBindGoodsPage(Page<Goods> page, Goods goods, List<Long> columnGoodsIds) {
return goodsMapper.selectColumnBindGoodsListPage(page, goods, columnGoodsIds);

@ -38,6 +38,14 @@
from shop_goods
</sql>
<sql id="selectHomeIndex">
select id,
goods_sn, name, category_id, brand_id, keywords, brief, is_on_sale, sort, pic_url,
share_url, is_new, is_hot, unit, counter_price, retail_price, actual_sales, virtual_sales,
create_time, update_time, del_flag
from shop_goods
</sql>
<select id="selectGoodsListPage" resultMap="ShopGoodsResult">
<include refid="selectGoodsVo"/>
<where>
@ -137,4 +145,19 @@
</if>
</where>
</select>
<select id="selectHomeIndex" resultType="com.wayn.common.core.domain.shop.Goods">
<include refid="selectHomeIndex"/>
<where>
del_flag = 0
and is_on_sale = 1
<if test="isNew == true">
and is_new = #{isNew}
</if>
<if test="isHot == true">
and is_hot = #{isHot}
</if>
order by create_time desc limit 10
</where>
</select>
</mapper>

@ -1,7 +1,7 @@
package com.wayn.mobile.api.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wayn.common.core.domain.shop.Banner;
import com.wayn.common.core.domain.shop.Diamond;
@ -15,28 +15,28 @@ import com.wayn.data.redis.manager.RedisCache;
import com.wayn.mobile.api.service.IHomeService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
@Slf4j
@Service
@AllArgsConstructor
public class IHomeServiceImpl implements IHomeService {
private static final String SHOP_INDEX_BANNER_LIST = "shop_index_banner_list";
private static final String SHOP_INDEX_CATEGORY_LIST = "shop_index_category_list";
private static final String SHOP_INDEX_GOODS_NEW_LIST = "shop_index_goods_new_list";
private static final String SHOP_INDEX_GOODS_HOT_LIST = "shop_index_goods_hot_list";
private static final String SHOP_HOME_INDEX_HASH = "shop_home_index_hash";
private IBannerService iBannerService;
private ICategoryService iCategoryService;
private IGoodsService iGoodsService;
private RedisCache redisCache;
private RedisTemplate<String, Object> redisTemplate;
private IDiamondService iDiamondService;
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@ -44,39 +44,40 @@ public class IHomeServiceImpl implements IHomeService {
@Override
public R getHomeIndexDataCompletableFuture() {
R success = R.success();
Map<String, Object> shopHomeIndexHash = redisCache.getCacheMap("shop_home_index_hash");
if (MapUtils.isNotEmpty(shopHomeIndexHash)) {
shopHomeIndexHash.forEach(success::add);
return success;
}
List<CompletableFuture<Void>> list = new ArrayList<>(4);
CompletableFuture<Void> f1 = CompletableFuture.supplyAsync(() -> iBannerService.list(new QueryWrapper<Banner>()
.eq("status", 0)
.orderByAsc("sort")), threadPoolTaskExecutor)
CompletableFuture<Void> f1 = CompletableFuture.supplyAsync(
() -> iBannerService.list(Wrappers.lambdaQuery(Banner.class).eq(Banner::getStatus, 0).orderByAsc(Banner::getSort)), threadPoolTaskExecutor)
.thenAccept(data -> {
redisCache.setCacheObject(SHOP_INDEX_BANNER_LIST, data, 3600, TimeUnit.MINUTES);
success.add("bannerList", data);
String key = "bannerList";
redisCache.setCacheMapValue(SHOP_HOME_INDEX_HASH, key, data);
success.add(key, data);
});
CompletableFuture<Void> f2 = CompletableFuture.supplyAsync(() -> iDiamondService.list(new QueryWrapper<Diamond>()
.orderByAsc("sort")
.last("limit 10")), threadPoolTaskExecutor)
CompletableFuture<Void> f2 = CompletableFuture.supplyAsync(
() -> iDiamondService.list(Wrappers.lambdaQuery(Diamond.class).orderByAsc(Diamond::getSort).last("limit 10")), threadPoolTaskExecutor)
.thenAccept(data -> {
redisCache.setCacheObject(SHOP_INDEX_CATEGORY_LIST, data, 3600, TimeUnit.MINUTES);
success.add("categoryList", data);
String key = "categoryList";
redisCache.setCacheMapValue(SHOP_HOME_INDEX_HASH, key, data);
success.add(key, data);
});
CompletableFuture<Void> f3 = CompletableFuture.supplyAsync(() -> iGoodsService.list(new QueryWrapper<Goods>()
.eq("is_new", true)
.eq("is_on_sale", true)
.orderByAsc("create_time")
.last("limit 6")), threadPoolTaskExecutor)
CompletableFuture<Void> f3 = CompletableFuture.supplyAsync(
() -> iGoodsService.selectHomeIndexGoods(Goods.builder().isNew(true).build()))
.thenAccept(data -> {
redisCache.setCacheObject(SHOP_INDEX_GOODS_NEW_LIST, data, 3600, TimeUnit.MINUTES);
success.add("newGoodsList", data);
String key = "newGoodsList";
redisCache.setCacheMapValue(SHOP_HOME_INDEX_HASH, key, data);
success.add(key, data);
});
CompletableFuture<Void> f4 = CompletableFuture.supplyAsync(() -> iGoodsService.list(new QueryWrapper<Goods>()
.eq("is_hot", true)
.eq("is_on_sale", true)
.orderByAsc("create_time")
.last("limit 6")), threadPoolTaskExecutor)
CompletableFuture<Void> f4 = CompletableFuture.supplyAsync(
() -> iGoodsService.selectHomeIndexGoods(Goods.builder().isHot(true).build()))
.thenAccept(data -> {
redisCache.setCacheObject(SHOP_INDEX_GOODS_HOT_LIST, data, 3600, TimeUnit.MINUTES);
success.add("hotGoodsList", data);
String key = "hotGoodsList";
redisCache.setCacheMapValue(SHOP_HOME_INDEX_HASH, key, data);
success.add(key, data);
});
list.add(f1);
list.add(f2);

Loading…
Cancel
Save