较为优雅的业务逻辑操作

DBC 1.5K 0

较为优雅的业务逻辑操作

1、需求:查询用户已有的优惠券信息

前提

用户优惠券信息表没有冗余够字段,我们还需要去优惠券表查询一些字段,而这些优惠券在本地缓存中又有了,我们怎么优雅的实现呢?

  • 第一步:我们去数据库中查询用户有的所有优惠券
  • 第二步:我们在缓存中提取出一个以优惠券id为Key,以优惠券实体为value的Map。
  • 第三步:优雅的通过用户有的优惠券id来过滤并获取我们需要的特殊字段
    • 总结:代码还是较为优雅
   @Override
    public List<UserCouponInfoDto> userCouponList(Integer userId) {
        List<UserCouponInfoDto> dtos = Lists.newArrayList();
        if(userId==null){
            return dtos;
        }
        List<TUserCoupon> userCoupon = getUserCoupon(userId);
        if(CollectionUtils.isEmpty(userCoupon)){
            return dtos;
        }
        Map<Integer,TCoupon> idCouponMap = getCouponMap(userCoupon);
        //封装coupon
        return wrapCoupon(userCoupon,idCouponMap);
    }

    private Map<Integer,TCoupon> getCouponMap(List<TUserCoupon> userCoupon){
        Set<Integer> couponIds = getCouponIds(userCoupon);
        List<TCoupon> coupons = getCouponListByIds(StringUtils.join(couponIds,","));
        Map<Integer,TCoupon> idCouponMap = couponList2Map(coupons);
        return idCouponMap;
    }
    private Map<Integer,TCoupon> couponList2Map(List<TCoupon> coupons){
        return coupons.stream().collect(Collectors.toMap(o -> o.getId(),o -> o));
    }

    private List<TUserCoupon> getUserCoupon(Integer userId){
        //查出用户未使用的券
        TUserCouponExample example = new TUserCouponExample();
        example.createCriteria().andUserIdEqualTo(userId).andStatusEqualTo(0);
        List<TUserCoupon> userCoupon = tUserCouponMapper.selectByExample(example);
        return userCoupon;
    }
    /**
     *获取couponIds
     */
    private Set<Integer> getCouponIds(List<TUserCoupon> userCoupons){
        Set<Integer> couponIds= userCoupons.stream().map(userCoupon -> userCoupon.getCouponId()).collect(Collectors.toSet());
        return couponIds;
    }

    private List<UserCouponInfoDto> wrapCoupon(List<TUserCoupon> userCoupons,Map<Integer,TCoupon> idCouponMap){

        List<UserCouponInfoDto> dtos = userCoupons.stream().map(userCoupon -> {
            UserCouponInfoDto dto = new UserCouponInfoDto();
            int couponId = userCoupon.getCouponId();
            TCoupon coupon = idCouponMap.get(couponId);
            dto.setAchieveAmount(coupon.getAchieveAmount());
            dto.setReduceAmount(coupon.getReduceAmount());
            BeanUtils.copyProperties(userCoupon,dto);
            return dto;
        }).collect(Collectors.toList());
        return dtos;
    }

StringUtils.join()方法

 List<String> list = new ArrayList<>();
        list.add("Mxy");
        list.add("StringUtils");
        list.add("join");
        String join = StringUtils.join(list,"-");//传入String类型的List集合,使用"-"号拼接
        System.out.println(join);
        
        String[] s = new String[]{"Yuan","Mxy"};//传入String类型的数组,使用"-"号拼接
        String join2 = StringUtils.join(s,"-");
        System.out.println(join2);

结果如下:

Mxy-StringUtils-join
 
Yuan-Mxy

2、使用Redis的SortedSet来实现用户动态领取优惠券

温馨提示

通过时间来进行排行,然后后面加入的就删除掉最前面的数据。

    /**
     * 查询coupon公告栏,前10条数据
     */
    public List<String> queryCouponList(){
        //分数从高到低进行排序
        Set<String> couponSet = redisTemplate.opsForZSet().reverseRange("couponSet",0,-1);
        //获取set里面 前N条数据
        return couponSet.stream().limit(10).collect(Collectors.toList());
    }


    /**
     * 接收coupon优惠券核销mq的时候被调用,以时间窗口展示前N条数据,userCouponStr代表userId_couponId
     */
    public void updateCoupon(String userCouponStr){
        redisTemplate.opsForZSet().add(COUPON,userCouponStr,System.currentTimeMillis());
        Set<String> couponSet = redisTemplate.opsForZSet().range(COUPON,0,-1);
        if(couponSet.size()>COUPON_NUM){
            String remUserCouponStr = couponSet.stream().findFirst().get();
            redisTemplate.opsForZSet().remove(COUPON,remUserCouponStr);
        }
    }

测试一下

    @Test
    public void contextLoads() {
        couponService.updateCoupon("1");
        couponService.updateCoupon("2");
        couponService.updateCoupon("3");
        couponService.updateCoupon("4");
        couponService.updateCoupon("5");
        couponService.updateCoupon("6");
        System.err.println("hello world");

    }

    @Test
    public void contextLoads1() {
        System.err.println(JSON.toJSONString(couponService.queryCouponList()));
    }

测试效果

较为优雅的业务逻辑操作插图

发表评论 取消回复
表情 图片 链接 代码

分享