HotRecommendService.java 9.99 KB
package com.tanpu.community.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.Lists;
import com.tanpu.common.api.CommonResp;
import com.tanpu.community.api.beans.qo.FollowQo;
import com.tanpu.community.api.beans.qo.feign.fatools.UserInfoCorpReq;
import com.tanpu.community.api.beans.req.page.Page;
import com.tanpu.community.api.beans.req.page.Pageable;
import com.tanpu.community.api.beans.resp.HomeSettingsResp;
import com.tanpu.community.api.beans.resp.HotRecommendResp;
import com.tanpu.community.api.beans.resp.SysConstantResp;
import com.tanpu.community.api.beans.vo.feign.fatools.UserInfoChiefInvAdvResp;
import com.tanpu.community.api.beans.vo.feign.fatools.UserInfoCorpResp;
import com.tanpu.community.api.beans.vo.feign.fatools.UserInfoResp;
import com.tanpu.community.api.enums.DeleteTagEnum;
import com.tanpu.community.dao.entity.community.HotRecommend;
import com.tanpu.community.dao.entity.community.HotRecommendUser;
import com.tanpu.community.dao.mapper.community.HotRecommendMapper;
import com.tanpu.community.dao.mapper.community.HotRecommendUserMapper;
import com.tanpu.community.feign.fatools.FeignClientForFatools;
import com.tanpu.community.util.ConvertUtil;
import com.tanpu.community.util.HttpServletHelper;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.validation.constraints.NotEmpty;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 首页推荐
 */
@Service
public class HotRecommendService {

    @Resource
    private HotRecommendMapper hotRecommendMapper;

    @Resource
    private HotRecommendUserMapper hotRecommendUserMapper;

    @Resource
    private FeignClientForFatools feignClientForFatools;
    @Resource
    private FollowRelService followRelService;

    @Resource
    private HttpServletHelper httpServletHelper;


    /**
     * 首页热门推荐列表
     *
     * @return
     */
    public List<HotRecommendResp> hotRecommendList() {
        LambdaQueryWrapper<HotRecommend> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(HotRecommend::getDeleteTag, DeleteTagEnum.NOT_DELETED)
                .eq(HotRecommend::getIsShow, 1)
                .orderByAsc(HotRecommend::getSort)
                .orderByDesc(HotRecommend::getCreateTime);
        List<HotRecommend> hotRecommends = hotRecommendMapper.selectList(queryWrapper);
        return hotRecommends.stream().map(item -> {
            List<FollowQo> list = Lists.newArrayList();
            if (item.getType() == 1) {
                list = this.getChiefInvAdv(UserInfoCorpReq.builder()
                        .hotRecommendId(item.getHotRecommendId())
                        .page(new Pageable(1, 4)).build()).getContent();
            } else if (item.getType() == 2) {
                list = this.getCorpInfo(UserInfoCorpReq.builder()
                        .hotRecommendId(item.getHotRecommendId())
                        .page(new Pageable(1, 4)).build()).getContent();
            } else if (item.getType() == 3) {
                list = this.getUserInfo(UserInfoCorpReq.builder()
                        .hotRecommendId(item.getHotRecommendId())
                        .page(new Pageable(1, 4)).build()).getContent();
            }
            return HotRecommendResp.builder()
                    .hotRecommendId(item.getHotRecommendId())
                    .name(item.getName())
                    .userInfo(list)
                    .build();
        }).collect(Collectors.toList());
    }

    public Page<FollowQo> hotRecommendDetailList(UserInfoCorpReq req) {
        LambdaQueryWrapper<HotRecommend> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(HotRecommend::getHotRecommendId, req.getHotRecommendId());
        HotRecommend hotRecommend = hotRecommendMapper.selectOne(queryWrapper);
        Page<FollowQo> page = null;
        if (hotRecommend.getType() == 1) {
            page = this.getChiefInvAdv(req);
        } else if (hotRecommend.getType() == 2) {
            page = this.getCorpInfo(req);
        } else if (hotRecommend.getType() == 3) {
            page = this.getUserInfo(req);
        }
        if (StringUtils.isNotEmpty(httpServletHelper.getCurrentUserId())) {
            page.setContent(judgeFollowed(page.getContent(), httpServletHelper.getCurrentUserId()));
        }
        return page;
    }

    //判断返回列表中的用户是否被当前用户关注
    public List<FollowQo> judgeFollowed(List<FollowQo> followQos, @NotEmpty String followerId) {
        Set<String> idolSet = new HashSet<>(followRelService.queryIdolsByFansId(followerId));
        return followQos.stream().map(o -> {
            if (idolSet.contains(o.getUserId())) {
                o.setFollowed(true);
            }
            return o;
        }).collect(Collectors.toList());
    }

    private Page<FollowQo> getCorpInfo(UserInfoCorpReq req) {

        LambdaQueryWrapper<HotRecommendUser> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(HotRecommendUser::getHotRecommendId, req.getHotRecommendId()).eq(HotRecommendUser::getIsExclude, 1);
        List<HotRecommendUser> hotRecommendUsers = this.hotRecommendUserMapper.selectList(queryWrapper);

        CommonResp<Page<UserInfoCorpResp>> pageCommonResp = this.feignClientForFatools.queryCorpListWithExcludeId(UserInfoCorpReq.builder()
                .excludeIds(hotRecommendUsers.stream().map(HotRecommendUser::getRelId).collect(Collectors.toList()))
                .page(req.getPage())
                .build());
        List<String> userIds = pageCommonResp.getData().getContent().stream()
                .map(UserInfoCorpResp::getApplyUserId).collect(Collectors.toList());
        List<UserInfoResp> userInfoResps = this.feignClientForFatools.queryUserListNew(userIds);

        List<FollowQo> list = userInfoResps.stream().map(item -> {
            return ConvertUtil.userInfoNew2FollowQo(item);
        }).collect(Collectors.toList());
        Page page = new Page();
        page.setPageNum(pageCommonResp.getData().getPageNum());
        page.setPageSize(pageCommonResp.getData().getPageSize());
        page.setTotalSize(pageCommonResp.getData().getTotalSize());
        page.setTotalPages(pageCommonResp.getData().getTotalPages());
        page.setContent(list);
        return page;
    }

    private Page<FollowQo> getChiefInvAdv(UserInfoCorpReq req) {
        LambdaQueryWrapper<HotRecommendUser> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(HotRecommendUser::getHotRecommendId, req.getHotRecommendId()).eq(HotRecommendUser::getIsExclude, 1);
        List<HotRecommendUser> hotRecommendUsers = this.hotRecommendUserMapper.selectList(queryWrapper);

        CommonResp<Page<UserInfoChiefInvAdvResp>> pageCommonResp = this.feignClientForFatools.queryChiefInvAdvListWithExcludeId(UserInfoCorpReq.builder()
                .excludeIds(hotRecommendUsers.stream().map(HotRecommendUser::getRelId).collect(Collectors.toList()))
                .page(req.getPage())
                .build());
        List<UserInfoResp> userInfoResps = this.feignClientForFatools.queryUserListNew(pageCommonResp.getData().getContent().stream()
                .map(UserInfoChiefInvAdvResp::getUserId).collect(Collectors.toList()));
        List<FollowQo> list = userInfoResps.stream().map(item -> {
            return ConvertUtil.userInfoNew2FollowQo(item);
        }).collect(Collectors.toList());
        Page page = new Page();
        page.setPageNum(pageCommonResp.getData().getPageNum());
        page.setPageSize(pageCommonResp.getData().getPageSize());
        page.setTotalSize(pageCommonResp.getData().getTotalSize());
        page.setTotalPages(pageCommonResp.getData().getTotalPages());
        page.setContent(list);
        return page;
    }

    private Page<FollowQo> getUserInfo(UserInfoCorpReq req) {
        LambdaQueryWrapper<HotRecommendUser> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(HotRecommendUser::getHotRecommendId, req.getHotRecommendId()).eq(HotRecommendUser::getIsExclude, 0);

        com.github.pagehelper.Page<HotRecommendUser> page = PageHelper.startPage(req.getPage().getPageNumber(), req.getPage().getPageSize());
        PageInfo pageInfo = new PageInfo(this.hotRecommendUserMapper.selectList(queryWrapper));
        List<HotRecommendUser> hotRecommendUsers = pageInfo.getList();
        if (CollectionUtils.isEmpty(hotRecommendUsers)) {
            return new Page<>(page, Lists.newArrayList());
        }
        List<UserInfoResp> userInfoResps = this.feignClientForFatools.queryUserListNew(hotRecommendUsers.stream()
                .map(HotRecommendUser::getRelId).collect(Collectors.toList()));
        List<FollowQo> list = userInfoResps.stream().map(item -> {
            return ConvertUtil.userInfoNew2FollowQo(item);
        }).collect(Collectors.toList());
        return new Page<>(page, list);
    }

    /**
     * 获取首页配置
     *
     * @return
     */
    public CommonResp<HomeSettingsResp> getHomeSettings() {
        HomeSettingsResp resp = HomeSettingsResp.builder()
                .showHotRecommend(1)
                .showHotTopic(1)
                .build();
        // community_topic 圈子首页是否展示热门话题  community_home_recommend 圈子首页是否展示热门推荐模块
        CommonResp<List<SysConstantResp>> sysConstantResp = feignClientForFatools.queryLabels("community_module_settings");
        if (sysConstantResp.isSuccess()) {
            Map<String, String> collect = sysConstantResp.getData().stream().collect(Collectors.toMap(SysConstantResp::getConstantCode, SysConstantResp::getConstantValue));
            resp.setShowHotRecommend(Integer.parseInt(collect.getOrDefault("community_home_recommend", "1")));
            resp.setShowHotTopic(Integer.parseInt(collect.getOrDefault("community_topic", "1")));
        }
        return CommonResp.success(resp);
    }
}