Authored by LUOXC

Merge branch 'test6.9.21' of http://git.yoho.cn/ufo/yohoufo-fore into test6.9.21

... ... @@ -49,6 +49,7 @@ public class CouponCenterController {
.businessClient(businessClient)
.page(Math.max(1, page))
.limit(Math.max(20, limit))
.businessClient(businessClient)
.build();
logger.info("in ufo.couponsOfPrdDetail.list, req:{}", req);
CouponListBo listBo = collectiveCouponService.queryCouponListOfPrdDetail(req);
... ... @@ -77,6 +78,7 @@ public class CouponCenterController {
.businessClient(businessClient)
.page(Math.max(1, page))
.limit(Math.max(2, limit))
.businessClient(businessClient)
.build();
logger.info("in couponTopListOfPrdDetail, req:{}", req);
List<CouponSimpleBo> resp = collectiveCouponService.getCouponTopListOfPrdDetail(req);
... ...
... ... @@ -17,6 +17,7 @@ import java.text.MessageFormat;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class CouponConvert {
//3天的秒数
... ... @@ -167,7 +168,7 @@ public class CouponConvert {
}
public static CouponSimpleBo do2CouponSimpleBo(Coupon coupon, Map<Integer, UserCoupon> couponIdUserCouponMap){
public static CouponSimpleBo do2CouponSimpleBo(Coupon coupon, UserCoupon userCoupon){
CouponSimpleBo couponSimpleBo = new CouponSimpleBo();
couponSimpleBo.setCouponId(coupon.getId());
couponSimpleBo.setCouponName(coupon.getCouponName());
... ... @@ -180,7 +181,7 @@ public class CouponConvert {
couponSimpleBo.setStartTime(DateUtil.formatDate(coupon.getStartTime(), DateUtil.YYYY_MM_DD_DOT));
couponSimpleBo.setEndTime(DateUtil.formatDate(coupon.getEndTime(), DateUtil.YYYY_MM_DD_DOT));
//
if (couponIdUserCouponMap.containsKey(coupon.getId())){
if (Objects.nonNull(userCoupon)){
couponSimpleBo.setReceive("Y");
}else{
couponSimpleBo.setReceive("N");
... ...
... ... @@ -2,8 +2,8 @@ package com.yohoufo.promotion.service.cache;
public class CacheKeyBuilder {
public enum PatternKeyTemplate{
COUPON_TOP_LIST_IN_PRD_DETAIL("ufo:coupon:prdDetail:topList:prdId:%s"),
COUPON_LIST_IN_PRD_DETAIL("ufo:coupon:prdDetail:list:prdId:%s");
COUPON_TOP_LIST_IN_PRD_DETAIL("ufo:coupon:businessClient:%s:prdDetail:topList:prdId:%s"),
COUPON_LIST_IN_PRD_DETAIL("ufo:coupon:businessClient:%s:prdDetail:list:prdId:%s:page:%s:pageSize:%s");
private final String keyPattern;
PatternKeyTemplate(String keyPattern) {
... ... @@ -16,12 +16,13 @@ public class CacheKeyBuilder {
}
public static String couponTopListOfPrdDetail(Integer prdId){
public static String couponTopListOfPrdDetail(String businessClient,Integer prdId){
return PatternKeyTemplate.COUPON_TOP_LIST_IN_PRD_DETAIL.getKey(String.valueOf(prdId));
}
public static String couponListOfPrdDetail(Integer prdId){
return PatternKeyTemplate.COUPON_LIST_IN_PRD_DETAIL.getKey(String.valueOf(prdId));
public static String couponListOfPrdDetail(String businessClient,Integer prdId,int page,int pageSize){
String[] params = {businessClient, String.valueOf(prdId), String.valueOf(page), String.valueOf(pageSize)};
return PatternKeyTemplate.COUPON_LIST_IN_PRD_DETAIL.getKey(params);
}
}
... ...
... ... @@ -22,15 +22,15 @@ public class CollectiveCouponCacheService {
private CacheClient cacheClient;
public void setCouponListOfPrdDetail(Integer prdId,CouponListBo couponListBo){
String key = CacheKeyBuilder.couponListOfPrdDetail(prdId);
public void setCouponListOfPrdDetail(String businessClient, Integer prdId,int page,int pageSize,CouponListBo couponListBo){
String key = CacheKeyBuilder.couponListOfPrdDetail(businessClient, prdId, page, pageSize);
String val = JSONObject.toJSONString(couponListBo);
logger.info("ready set CouponListOfPrdDetail into cache, key {} value {}", key, val);
cacheClient.set(key,300, val);
}
public CouponListBo queryCouponListOfPrdDetail(Integer prdId){
String key = CacheKeyBuilder.couponListOfPrdDetail(prdId);
public CouponListBo queryCouponListOfPrdDetail(String businessClient, Integer prdId,int page,int pageSize){
String key = CacheKeyBuilder.couponListOfPrdDetail(businessClient, prdId, page, pageSize);
String val = cacheClient.get(key, String.class);
logger.info("in queryCouponListOfPrdDetail from cache, key {} value {}", key, val);
if (Objects.isNull(val)){
... ... @@ -40,15 +40,15 @@ public class CollectiveCouponCacheService {
return couponListBo;
}
public void setCouponTopListOfPrdDetail(Integer prdId, List<CouponSimpleBo> datas){
String key = CacheKeyBuilder.couponTopListOfPrdDetail(prdId);
public void setCouponTopListOfPrdDetail(String businessClient, Integer prdId, List<CouponSimpleBo> datas){
String key = CacheKeyBuilder.couponTopListOfPrdDetail(businessClient,prdId);
String val = JSONObject.toJSONString(datas);
logger.info("ready set CouponTopListOfPrdDetail into cache, key {} value {}", key, val);
cacheClient.set(key,300, val);
}
public List<CouponSimpleBo> queryCouponTopListOfPrdDetail(Integer prdId){
String key = CacheKeyBuilder.couponTopListOfPrdDetail(prdId);
public List<CouponSimpleBo> queryCouponTopListOfPrdDetail(String businessClient,Integer prdId){
String key = CacheKeyBuilder.couponTopListOfPrdDetail(businessClient,prdId);
String val = cacheClient.get(key, String.class);
logger.info("in query CouponTopListOfPrdDetail from cache, key {} value {}", key, val);
if (Objects.isNull(val)){
... ...
... ... @@ -16,12 +16,14 @@ import com.yohoufo.dal.promotion.model.UserCoupon;
import com.yohoufo.promotion.convert.CouponConvert;
import com.yohoufo.promotion.service.cache.CollectiveCouponCacheService;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.function.Supplier;
import java.util.stream.Collectors;
/**
... ... @@ -57,6 +59,13 @@ public class CollectiveCouponService {
logger.warn("queryCouponListOfPrdDetail prdId illegal, {}",req);
return couponInfoListBuilder.build();
}
CouponListBo couponListBo = collectiveCouponCacheService.queryCouponListOfPrdDetail(req.getBusinessClient(),
prdId, pageNum, limit);
if (Objects.nonNull(couponListBo)){
resetDynamic(req, couponListBo.getCoupons());
return couponListBo;
}
final int currentDT = DateUtil.getCurrentTimeSecond();
final int positionType = PositionType.PRD_DETAIL.getCode();
... ... @@ -69,26 +78,60 @@ public class CollectiveCouponService {
final int offset = PageHelper.getOffsetOfMysql(pageNum, limit);
List<Coupon> datas= couponViewMapper.selectByAssociatedPrd(prdId, positionType,currentDT,offset,limit);
//when user login, show user coupon
final Map<Integer, UserCoupon> couponIdUserCouponMap = new HashMap<>(datas.size());
Integer uid;
if (req.isShowReceive() && Objects.nonNull(uid=req.getUid())){
final Integer uid = req.getUid();
boolean showUserReceive = req.isShowReceive() && Objects.nonNull(uid);
Supplier<Map<Integer, UserCoupon>> couponMapSupplier = ()-> {
Set<Integer> couponIds = datas.stream().map(Coupon::getId).collect(Collectors.toSet());
List<UserCoupon> userCoupons = userCouponMapper.selectUserCouponListByCouponIds(uid, couponIds);
Set<Integer> couponIdOfUser = null;
if (CollectionUtils.isNotEmpty(userCoupons)){
userCoupons.forEach(uc-> couponIdUserCouponMap.put(uc.getCouponId(), uc));
couponIdOfUser = couponIdUserCouponMap.keySet();
}
logger.info("queryCouponListOfPrdDetail selectUserCouponListByCouponIds find couponIdOfUser {} uid {} couponIds {}",
couponIdOfUser, uid,couponIds);
}
List<CouponSimpleBo> couponInfoListBo = datas.stream().map(coupon -> CouponConvert.do2CouponSimpleBo(coupon, couponIdUserCouponMap))
.collect(Collectors.toList());
return buildCouponIdUserCouponMap(uid, couponIds);
};
final Map<Integer, UserCoupon> couponIdUserCouponMap = showUserReceive ? couponMapSupplier.get()
: Collections.EMPTY_MAP;
return couponInfoListBuilder.total(total)
List<CouponSimpleBo> couponInfoListBo = datas.stream().map(coupon -> convert(coupon, couponIdUserCouponMap))
.collect(Collectors.toList());
couponListBo = couponInfoListBuilder.total(total)
.totalPage(totalPage).coupons(couponInfoListBo)
.build();
//set into cache
collectiveCouponCacheService.setCouponListOfPrdDetail(req.getBusinessClient(), prdId, pageNum, limit, couponListBo);
return couponListBo;
}
Map<Integer, UserCoupon> buildCouponIdUserCouponMap(Integer uid, Set<Integer> couponIds){
final Map<Integer, UserCoupon> couponIdUserCouponMap = new HashMap<>(couponIds.size());
List<UserCoupon> userCoupons = userCouponMapper.selectUserCouponListByCouponIds(uid, couponIds);
Set<Integer> couponIdOfUser = null;
if (CollectionUtils.isNotEmpty(userCoupons)){
userCoupons.forEach(uc-> couponIdUserCouponMap.put(uc.getCouponId(), uc));
couponIdOfUser = couponIdUserCouponMap.keySet();
}
logger.info("buildCouponIdUserCouponMap selectUserCouponListByCouponIds find couponIdOfUser {} uid {} couponIds {}",
couponIdOfUser, uid,couponIds);
return couponIdUserCouponMap;
}
void resetDynamic(CouponListReq req, List<CouponSimpleBo> couponInfoListBo){
final Integer uid = req.getUid();
boolean showUserReceive = req.isShowReceive() && Objects.nonNull(uid);
if(!showUserReceive){
return;
}
Set<Integer> couponIds = couponInfoListBo.stream().map(CouponSimpleBo::getCouponId).collect(Collectors.toSet());
Map<Integer, UserCoupon> couponIdUserCouponMap = buildCouponIdUserCouponMap(uid, couponIds);
if (MapUtils.isEmpty(couponIdUserCouponMap)){
return;
}
couponInfoListBo.forEach(bo->{
if (Objects.nonNull(couponIdUserCouponMap.get(bo.getCouponId()))){
bo.setReceive("Y");
}
});
}
CouponSimpleBo convert(Coupon coupon,Map<Integer, UserCoupon> couponIdUserCouponMap){
UserCoupon userCoupon = couponIdUserCouponMap.get(coupon.getId());
return CouponConvert.do2CouponSimpleBo(coupon, userCoupon);
}
private boolean check(CouponListReq req){
... ... @@ -101,7 +144,7 @@ public class CollectiveCouponService {
return result;
}
/**
* TODO use cache
* use cache
* @param req
* @return
*/
... ... @@ -110,7 +153,7 @@ public class CollectiveCouponService {
if(!check(req)){
return null;
}
List<CouponSimpleBo> list = collectiveCouponCacheService.queryCouponTopListOfPrdDetail(req.getProductId());
List<CouponSimpleBo> list = collectiveCouponCacheService.queryCouponTopListOfPrdDetail(req.getBusinessClient(),req.getProductId());
if(Objects.nonNull(list)){
return list;
}
... ... @@ -123,7 +166,7 @@ public class CollectiveCouponService {
list = pcList.stream().limit(req.getLimit()).map(coupon -> CouponConvert.do2CouponSimpleBo(coupon))
.collect(Collectors.toList());
//
collectiveCouponCacheService.setCouponTopListOfPrdDetail(req.getProductId(), list);
collectiveCouponCacheService.setCouponTopListOfPrdDetail(req.getBusinessClient(), req.getProductId(), list);
return list;
}
... ...