Authored by mali

收藏优化

... ... @@ -11,6 +11,7 @@ import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.*;
/**
... ... @@ -2240,4 +2241,9 @@ public class DateUtil {
return (int) (cal.getTimeInMillis() / 1000);
}
public static long getEpochSecond() {
LocalDateTime now=LocalDateTime.now();
return now.toEpochSecond(ZoneOffset.of("+8"));
}
}
... ...
package com.yohoufo.dal.user;
import com.yohoufo.dal.user.model.UserFavorite;
import com.yohoufo.dal.user.model.UserFavoriteSku;
import org.apache.ibatis.annotations.Param;
... ... @@ -11,7 +12,8 @@ public interface IUserFavoriteSkuDao {
List<UserFavoriteSku> selectValidFavoriteByUid(@Param("tableIndex") String tableIndex, @Param("uid") int uid);
void insertBatch(@Param("tableIndex") String tableIndex, @Param("userFavoriteList") UserFavoriteSku userFavorite);
void insertBatch(@Param("tableIndex") String tableIndex, @Param("userFavoriteList") List<UserFavoriteSku> userFavoriteList);
int updateFavoriteInvalid(@Param("tableIndex") String tableIndex, @Param("uid") int uid, @Param("storageId") int storageId, @Param("updateTime") long updateTime);
int updateFavoriteInvalid(@Param("tableIndex") String tableIndex, @Param("uid") int uid, @Param("productId") int productId, @Param("updateTime") long updateTime);
}
... ...
package com.yohoufo.dal.user.model;
import lombok.Data;
import lombok.ToString;
import lombok.*;
import java.math.BigDecimal;
... ... @@ -13,6 +12,9 @@ import java.math.BigDecimal;
*/
@Data
@ToString
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserFavoriteSku {
//主键
private Integer id;
... ...
... ... @@ -43,8 +43,8 @@
</insert>
<update id="updateFavoriteInvalid">
update favorite_sku_${tableIndex} set valid_status=0, update_time=#{updateTime}
where uid = ${uid} and valid_status=1 and product_id=${productId}
update favorite_sku_${tableIndex} set valid_status = 0, update_time = #{updateTime}
where uid = ${uid} and valid_status = 1 and storage_id = ${storageId}
</update>
</mapper>
\ No newline at end of file
... ...
package com.yohoufo.user.controller.favorite;
import com.yoho.error.exception.ServiceException;
import com.yoho.tools.common.beans.ApiResponse;
import com.yohobuy.ufo.model.user.req.FavoriteSkuRequestVO;
import com.yohoufo.common.caller.UfoServiceCaller;
import com.yohoufo.user.requestVO.FavoriteRequestVO;
import com.yohoufo.user.service.IFavoriteService;
import com.yohoufo.user.service.impl.FavoriteSkuService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
... ... @@ -22,5 +27,37 @@ public class FavoriteSkuController {
@Autowired
private UfoServiceCaller serviceCaller;
/**
* 增加用户收藏
* @param vo
* @return
* @throws ServiceException
*/
@RequestMapping(params = "method=ufo.user.favoriteSkuAdd")
public ApiResponse addFavorite(FavoriteSkuRequestVO vo) throws ServiceException {
logger.info("Begin call ufo.user.favoriteSkuAdd with param is {}", vo);
validateRequest(vo, true);
favoriteSkuService.addFavorite(vo);
return new ApiResponse.ApiResponseBuilder().message("收藏成功").build();
}
private void validateRequest(FavoriteSkuRequestVO vo, boolean checkProduct) {
if (null == vo) {
logger.warn("validateRequest params is null");
throw new ServiceException(413, "request vo can't be null");
}
if(checkProduct){
if (null == vo.getUid()) {
throw new ServiceException(500001009, "userID can't be null");
}
if (null == vo.getStorageId()) {
throw new ServiceException(500001001, "product sku can't be null");
}
}
}
}
... ...
package com.yohoufo.user.service.impl;
import com.google.common.collect.Lists;
import com.yohobuy.ufo.model.user.req.FavoriteSkuRequestVO;
import com.yohoufo.common.utils.DateUtil;
import com.yohoufo.dal.user.IUserFavoriteSkuDao;
import com.yohoufo.dal.user.model.UserFavorite;
import com.yohoufo.dal.user.model.UserFavoriteSku;
... ... @@ -40,37 +42,32 @@ public class FavoriteSkuService {
}
if(!cacheService.isExistUserProductFavoriteByProductId(vo.getUid(), vo.getProductId(), false)){
//收藏
LocalDateTime now=LocalDateTime.now();
long ts=now.toEpochSecond(ZoneOffset.of("+8"));
UserFavorite userFavorite=new UserFavorite();
userFavorite.setUid(vo.getUid());
userFavorite.setProductId(vo.getProductId());
userFavorite.setValidStatus(1);
userFavorite.setCreateTime(ts);
userFavorite.setUpdateTime(ts);
logger.info("RealNameAuthorizeServiceImpl addFavorite userFavorite {}",userFavorite);
userFavoriteSkuDao.insert(getTableIndex(vo.getUid()), userFavorite);
//放到缓存
long ts = DateUtil.getEpochSecond();
UserFavoriteSku userFavoriteSku = UserFavoriteSku.builder()
.uid(vo.getUid()).productId(vo.getProductId())
.storageId(vo.getStorageId()).validStatus(1)
.createTime(ts).updateTime(ts)
.build();
logger.info("FavoriteSkuService addFavorite userFavoriteSku {}", userFavoriteSku);
userFavoriteSkuDao.insertBatch(getTableIndex(vo.getUid()), Lists.newArrayList(userFavoriteSku));
cacheService.addFavoriteProductKey(vo.getUid(), vo.getProductId(), ts);
}
}
public void cancelFavorite(FavoriteRequestVO vo){
LocalDateTime now=LocalDateTime.now();
long ts=now.toEpochSecond(ZoneOffset.of("+8"));
//删除用户的缓存
public void cancelFavorite(FavoriteSkuRequestVO vo){
cacheService.removeUserFavoriteProduct(vo.getUid(),vo.getProductId());
//删除数据库,逻辑删除
userFavoriteDao.updateFavoriteInvalid(getTableIndex(vo.getUid()),vo.getUid(), vo.getProductId(),ts);
userFavoriteSkuDao.updateFavoriteInvalid(getTableIndex(vo.getUid()), vo.getUid(), vo.getStorageId(), DateUtil.getEpochSecond()); //删除数据库,逻辑删除
}
public List<String> listFavorite(FavoriteRequestVO vo){
List<String> favoriteProducts = new ArrayList<>();
int uid = vo.getUid();
int startIndex=vo.getLimit()*(vo.getPage()-1);
int endIndex=vo.getLimit()*vo.getPage();
int startIndex = vo.getLimit() * (vo.getPage()-1);
int endIndex = vo.getLimit() * vo.getPage();
// 查询缓存
Set<String> favoriteProductIds = cacheService.queryAllProductFavoriteByUid(uid, startIndex, endIndex-1);
if(CollectionUtils.isNotEmpty(favoriteProductIds)){
... ... @@ -79,11 +76,11 @@ public class FavoriteSkuService {
return favoriteProducts;
}
List<UserFavorite> favoriteList = userFavoriteDao.selectValidFavoriteByUid(getTableIndex(uid), uid);
cacheService.batchSetFavoriteProduct(uid, favoriteList);
int count=0;
for (UserFavorite favorite : favoriteList) {
if(count>=startIndex && count<endIndex){
List<UserFavoriteSku> favoriteList = userFavoriteSkuDao.selectValidFavoriteByUid(getTableIndex(uid), uid);
cacheService.batchSetFavoriteSku(uid, favoriteList);
int count = 0;
for (UserFavoriteSku favorite : favoriteList) {
if(count >= startIndex && count < endIndex){
favoriteProducts.add(String.valueOf(favorite.getProductId()));
}
}
... ... @@ -99,13 +96,13 @@ public class FavoriteSkuService {
return false;
}
try {
boolean existFlag = cacheService.isExistUserProductFavoriteByProductId(vo.getUid(), vo.getProductId(),false);
boolean existFlag = cacheService.isExistUserProductFavoriteByProductId(vo.getUid(), vo.getProductId(), false);
if (existFlag) {
return true;
} else {
if (!cacheService.hasUserFavoriteProductKey(vo.getUid(),false)) {
List<UserFavorite> favoriteList = userFavoriteDao.selectValidFavoriteByUid(getTableIndex(vo.getUid()), vo.getUid());
cacheService.batchSetFavoriteProduct(vo.getUid(), favoriteList);
List<UserFavoriteSku> favoriteList = userFavoriteSkuDao.selectValidFavoriteByUid(getTableIndex(vo.getUid()), vo.getUid());
cacheService.batchSetFavoriteSku(vo.getUid(), favoriteList);
return containsProductSku(favoriteList, vo.getProductId());
}
return false;
... ... @@ -117,6 +114,10 @@ public class FavoriteSkuService {
}
}
private boolean containsProductSku(List<UserFavoriteSku> favoriteList, Integer productId) {
return false;
}
private String getTableIndex(Integer uid) {
return String.valueOf(uid % 10);
... ...