TopicService.java 13.6 KB
Newer Older
刘基明's avatar
刘基明 committed
1 2
package com.tanpu.community.service;

刘基明's avatar
刘基明 committed
3
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
刘基明's avatar
刘基明 committed
4
import com.tanpu.biz.common.enums.RelTypeEnum;
刘基明's avatar
刘基明 committed
5
import com.tanpu.common.enums.fund.ProductTypeEnum;
刘基明's avatar
刘基明 committed
6
import com.tanpu.community.api.beans.qo.ThemeQo;
刘基明's avatar
刘基明 committed
7 8
import com.tanpu.community.api.beans.qo.TopicAttachment;
import com.tanpu.community.api.beans.qo.TopicAttachmentDetail;
刘基明's avatar
刘基明 committed
9
import com.tanpu.community.api.beans.qo.TopicFollowQo;
刘基明's avatar
刘基明 committed
10
import com.tanpu.community.api.beans.qo.TopicPageDetailQo;
刘基明's avatar
刘基明 committed
11
import com.tanpu.community.api.beans.qo.TopicRankQo;
刘基明's avatar
刘基明 committed
12
import com.tanpu.community.api.beans.req.topic.TopicDiscussionReq;
刘基明's avatar
刘基明 committed
13 14 15
import com.tanpu.community.api.beans.resp.CoursePackageSimpleResp;
import com.tanpu.community.api.beans.vo.feign.activity.OfflineActivitySimpleResp;
import com.tanpu.community.api.beans.vo.feign.fatools.UserInfoResp;
刘基明's avatar
刘基明 committed
16
import com.tanpu.community.api.beans.vo.feign.product.FundCompanyVO;
刘基明's avatar
刘基明 committed
17
import com.tanpu.community.api.beans.vo.feign.product.ProductInfoVO;
刘基明's avatar
刘基明 committed
18
import com.tanpu.community.api.enums.DeleteTagEnum;
刘基明's avatar
刘基明 committed
19
import com.tanpu.community.api.enums.StatusEnum;
刘基明's avatar
刘基明 committed
20
import com.tanpu.community.api.enums.TopicSpecialPermissionEnum;
刘基明's avatar
刘基明 committed
21
import com.tanpu.community.dao.entity.community.TopicEntity;
刘基明's avatar
刘基明 committed
22
import com.tanpu.community.dao.entity.community.TopicFollowRelEntity;
刘基明's avatar
刘基明 committed
23 24
import com.tanpu.community.dao.entity.community.TopicManagerEntity;
import com.tanpu.community.dao.entity.community.TopicSubjectEntity;
刘基明's avatar
刘基明 committed
25
import com.tanpu.community.dao.mapper.community.TopicFollowRelMapper;
刘基明's avatar
刘基明 committed
26
import com.tanpu.community.dao.mapper.community.TopicManagerMapper;
刘基明's avatar
刘基明 committed
27
import com.tanpu.community.dao.mapper.community.TopicMapper;
刘基明's avatar
刘基明 committed
28
import com.tanpu.community.dao.mapper.community.TopicSubjectMapper;
刘基明's avatar
刘基明 committed
29
import com.tanpu.community.util.ConvertUtil;
刘基明's avatar
刘基明 committed
30
import org.apache.commons.collections4.CollectionUtils;
刘基明's avatar
刘基明 committed
31
import org.apache.commons.lang3.StringUtils;
刘基明's avatar
刘基明 committed
32 33 34 35
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
刘基明's avatar
刘基明 committed
36
import java.time.LocalDateTime;
张辰's avatar
张辰 committed
37
import java.util.ArrayList;
刘基明's avatar
刘基明 committed
38
import java.util.Arrays;
刘基明's avatar
刘基明 committed
39
import java.util.Collections;
刘基明's avatar
刘基明 committed
40
import java.util.HashSet;
刘基明's avatar
刘基明 committed
41
import java.util.List;
刘基明's avatar
刘基明 committed
42
import java.util.Set;
刘基明's avatar
刘基明 committed
43
import java.util.stream.Collectors;
刘基明's avatar
刘基明 committed
44 45 46 47 48 49 50


@Service
@EnableCaching
public class TopicService {

    @Resource
刘基明's avatar
刘基明 committed
51
    TopicFollowRelMapper topicFollowRelMapper;
刘基明's avatar
刘基明 committed
52

刘基明's avatar
刘基明 committed
53 54 55 56
    @Resource
    TopicMapper topicMapper;

    @Resource
刘基明's avatar
刘基明 committed
57
    private TopicManagerMapper topicManagerMapper;
刘基明's avatar
刘基明 committed
58
    @Resource
刘基明's avatar
刘基明 committed
59
    private FeignService feignService;
刘基明's avatar
刘基明 committed
60
    @Resource
刘基明's avatar
刘基明 committed
61
    private TopicSubjectMapper topicSubjectMapper;
刘基明's avatar
刘基明 committed
62

刘基明's avatar
刘基明 committed
63

刘基明's avatar
刘基明 committed
64
    public List<TopicEntity> queryAll() {
张辰's avatar
张辰 committed
65 66 67 68 69 70 71 72 73 74 75 76
        List<TopicEntity> retList = new ArrayList<>();

        Long lastId = 0L;
        while (true) {
            List<TopicEntity> tmpList = topicMapper.selectGtIdPageable(lastId, 100);
            if (tmpList.isEmpty()) {
                break;
            }
            retList.addAll(tmpList);
            lastId = tmpList.stream().map(TopicEntity::getId).max(Long::compareTo).get();
        }
        return retList;
刘基明's avatar
刘基明 committed
77 78
    }

刘基明's avatar
刘基明 committed
79

刘基明's avatar
刘基明 committed
80
    public TopicEntity queryOnlineTopicById(String topicId) {
81 82 83 84
        return topicMapper.selectOne(new LambdaQueryWrapper<TopicEntity>()
                .eq(TopicEntity::getTopicId, topicId)
                .eq(TopicEntity::getIsConceal, StatusEnum.FALSE)
                .eq(TopicEntity::getDeleteTag, StatusEnum.FALSE));
刘基明's avatar
刘基明 committed
85
    }
刘基明's avatar
刘基明 committed
86

87
    // 根据话题id查询title,(包括已删除)
88
    public String queryTitleById(String topicId) {
89
        TopicEntity topicEntity = topicMapper.selectOne(new LambdaQueryWrapper<TopicEntity>()
90
                .eq(TopicEntity::getTopicId, topicId));
刘基明's avatar
刘基明 committed
91
        return topicEntity != null ? topicEntity.getTopicTitle() : null;
92 93
    }

94
    public List<TopicEntity> queryByIds(List<String> topicIds) {
刘基明's avatar
刘基明 committed
95
        if (CollectionUtils.isEmpty(topicIds)) {
刘基明's avatar
刘基明 committed
96 97
            return Collections.emptyList();
        }
刘基明's avatar
刘基明 committed
98
        return topicMapper.selectList(new LambdaQueryWrapper<TopicEntity>().in(TopicEntity::getTopicId, topicIds));
99 100
    }

刘基明's avatar
刘基明 committed
101
    public List<TopicFollowQo> queryFollowTopic(String keyword, String userId) {
刘基明's avatar
刘基明 committed
102 103
        // 用户的关注列表(包括专属)
        List<String> followTopicIds = topicFollowRelMapper.selectTopicIdByUserId(userId);
刘基明's avatar
刘基明 committed
104
        if (CollectionUtils.isEmpty(followTopicIds)) {
刘基明's avatar
刘基明 committed
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
            return Collections.emptyList();
        }

        List<TopicEntity> topicEntities = topicMapper.selectAllByTopicIdIn(followTopicIds);
        List<TopicFollowQo> topicFollowQos = ConvertUtil.topicEntityToFollowQos(topicEntities);
        return topicFollowQos;

    }


    public boolean addFollowTopic(String topicId, String userId) {
        TopicFollowRelEntity searchResult = topicFollowRelMapper.queryOneByTopicIdAndUserId(topicId, userId);
        if (searchResult == null) {
            TopicFollowRelEntity entity = TopicFollowRelEntity.builder()
                    .topicId(topicId)
                    .userId(userId)
                    .followTime(LocalDateTime.now())
                    .build();

            topicFollowRelMapper.insert(entity);
            return true;
        } else {
            searchResult.setFollowTime(LocalDateTime.now());
            searchResult.setDeleteTag(DeleteTagEnum.NOT_DELETED.getCode());
            topicFollowRelMapper.updateById(searchResult);
            return false;
        }
    }

    public void deleteFollowTopic(String topicId, String userId) {
        TopicFollowRelEntity searchResult = topicFollowRelMapper.queryOneByTopicIdAndUserId(topicId, userId);
刘基明's avatar
刘基明 committed
136
        if (searchResult != null) {
刘基明's avatar
刘基明 committed
137 138 139 140
            searchResult.setUnfollowTime(LocalDateTime.now());
            searchResult.setDeleteTag(DeleteTagEnum.DELETED.getCode());
            topicFollowRelMapper.updateById(searchResult);
        }
刘基明's avatar
刘基明 committed
141
    }
刘基明's avatar
刘基明 committed
142 143

    public void batchCheckPermission(List<TopicRankQo> content, String userId) {
刘基明's avatar
刘基明 committed
144 145 146 147 148 149 150 151 152
        Set<String> userPermitTopics = getUserPermitTopics(userId);
        content.forEach(o -> {
            if (userPermitTopics.contains(o.getTopicId())) {
                o.setHasPermission(true);
            } else {
                o.setHasPermission(false);
            }
        });

刘基明's avatar
刘基明 committed
153
    }
刘基明's avatar
刘基明 committed
154

刘基明's avatar
刘基明 committed
155 156 157 158 159 160 161 162 163 164 165 166

    /**
     * 判断用户是否拥有权限(1对1)
     *
     * @param topicId
     * @param userId
     */
    public boolean checkPermission(String topicId, String userId) {

        TopicEntity topicEntity = queryOnlineTopicById(topicId);
        if (TopicSpecialPermissionEnum.FALSE.getCode().equals(topicEntity.getSpecialPermission())) {
            return true;
刘基明's avatar
刘基明 committed
167
        }
刘基明's avatar
刘基明 committed
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
        TopicFollowRelEntity topicFollowRelEntity = topicFollowRelMapper.queryOneByTopicIdAndUserId(topicId, userId);
        if (topicFollowRelEntity != null) {
            return true;
        } else {
            return false;
        }
    }


    public String getPermissionToast(String topicId) {

        String permission = "专业版会员";

        return "暂无权限参与此话题~您可联系官方客服 021- 了解详情";
        // return "该话题仅限" + permission + "可参与哦~";
刘基明's avatar
刘基明 committed
183
    }
刘基明's avatar
刘基明 committed
184

刘基明's avatar
刘基明 committed
185 186 187 188 189 190 191 192 193 194 195 196 197 198
    public String queryManagerNames(String topicId) {

        List<TopicManagerEntity> topicManagerEntities = topicManagerMapper.selectList(new LambdaQueryWrapper<TopicManagerEntity>().eq(TopicManagerEntity::getTopicId, topicId));

        List<String> managerIds = topicManagerEntities.stream().map(TopicManagerEntity::getUserId).collect(Collectors.toList());

        List<UserInfoResp> userList = feignService.getUserList(managerIds);

        if (CollectionUtils.isEmpty(userList)) {
            return "";
        }
        List<String> userNames = userList.stream().map(UserInfoResp::getNickName).collect(Collectors.toList());

        return StringUtils.join(userNames, "、");
刘基明's avatar
刘基明 committed
199 200 201
    }

    public void queryAttachments(TopicPageDetailQo topic) {
刘基明's avatar
刘基明 committed
202 203 204 205
        List<TopicSubjectEntity> topicSubjectEntities = topicSubjectMapper.selectList(new LambdaQueryWrapper<TopicSubjectEntity>().eq(TopicSubjectEntity::getTopicId, topic.getTopicId()));
        if (CollectionUtils.isEmpty(topicSubjectEntities)) {
            topic.setAttachments(null);
        }
刘基明's avatar
刘基明 committed
206

刘基明's avatar
刘基明 committed
207 208 209 210
        ArrayList<TopicAttachment> attachements = new ArrayList<>();
        for (TopicSubjectEntity entity : topicSubjectEntities) {

            if (RelTypeEnum.FUND.type.equals(entity.getSubjectType().toString())) {
刘基明's avatar
刘基明 committed
211
                List<ProductInfoVO> fund = Collections.emptyList();
刘基明's avatar
刘基明 committed
212
                // 基金
刘基明's avatar
刘基明 committed
213 214 215 216 217 218 219
                if (entity.getSubjectSubType() == ProductTypeEnum.PRIVATE.type || entity.getSubjectSubType() == ProductTypeEnum.TAMP.type) {
                    fund = feignService.getProductInfoByIds(Collections.singletonList(entity.getSubjectId()));
                } else if (entity.getSubjectSubType() == ProductTypeEnum.PUBLIC.type) {
                    fund = feignService.getPublicFundList(Collections.singletonList(entity.getSubjectId()));
                } else {
                    fund = Arrays.asList(new ProductInfoVO());
                }
刘基明's avatar
刘基明 committed
220
                TopicAttachment attach = TopicAttachment.builder().type(RelTypeEnum.FUND.type)
刘基明's avatar
刘基明 committed
221 222
                        .subType(String.valueOf(entity.getSubjectSubType()))
                        .detail(TopicAttachmentDetail.builder().fund(fund.get(0)).build()).build();
刘基明's avatar
刘基明 committed
223
                attachements.add(attach);
刘基明's avatar
刘基明 committed
224
            } else if (RelTypeEnum.FUND_COMPANY.type.equals(entity.getSubjectType().toString())) {
刘基明's avatar
刘基明 committed
225
                // 资管人
刘基明's avatar
刘基明 committed
226
                List<FundCompanyVO> fundCompany = feignService.getFundCompany(Collections.singletonList(entity.getSubjectId()));
刘基明's avatar
刘基明 committed
227 228
                FundCompanyVO company = fundCompany.get(0);
                company.setType(String.valueOf(entity.getSubjectSubType())); // 公司类型
刘基明's avatar
刘基明 committed
229
                TopicAttachment attach = TopicAttachment.builder().type(RelTypeEnum.FUND_COMPANY.type)
刘基明's avatar
刘基明 committed
230
                        .detail(TopicAttachmentDetail.builder().fundCompany(company).build()).build();
刘基明's avatar
刘基明 committed
231
                attachements.add(attach);
刘基明's avatar
刘基明 committed
232 233

            } else if (RelTypeEnum.NEW_COURSE_WARE.type.equals(entity.getSubjectType().toString())) {
刘基明's avatar
刘基明 committed
234 235
                // 课程包
                List<CoursePackageSimpleResp> coursePackage = feignService.getCoursePackageList(Collections.singletonList(entity.getSubjectId()));
刘基明's avatar
刘基明 committed
236 237
                TopicAttachment attach = TopicAttachment.builder().type(RelTypeEnum.NEW_COURSE_WARE.type)
                        .detail(TopicAttachmentDetail.builder().coursePackage(coursePackage.get(0)).build()).build();
刘基明's avatar
刘基明 committed
238
                attachements.add(attach);
刘基明's avatar
刘基明 committed
239 240

            } else if (RelTypeEnum.OFFLINE_ACTIVITY.type.equals(entity.getSubjectType().toString())) {
刘基明's avatar
刘基明 committed
241 242 243 244 245 246 247
                // 线下活动
                List<OfflineActivitySimpleResp> activitySimpleList = feignService.getActivitySimpleList(Collections.singletonList(entity.getSubjectId()));
                TopicAttachmentDetail detailVo = TopicAttachmentDetail.builder().activity(activitySimpleList.get(0)).build();
                TopicAttachment attach = TopicAttachment.builder().type(RelTypeEnum.OFFLINE_ACTIVITY.type).detail(detailVo).build();
                attachements.add(attach);
            }
        }
刘基明's avatar
刘基明 committed
248

刘基明's avatar
刘基明 committed
249 250

        topic.setAttachments(attachements);
刘基明's avatar
刘基明 committed
251 252
    }

刘基明's avatar
刘基明 committed
253

刘基明's avatar
刘基明 committed
254 255 256 257 258 259 260
    public boolean checkFollow(String topicId, String userId) {
        if (StringUtils.isBlank(userId)) {
            return false;
        }
        TopicFollowRelEntity topicFollowRelEntity = topicFollowRelMapper.queryOneByTopicIdAndUserId(topicId, userId);
        return topicFollowRelEntity != null;
    }
刘基明's avatar
刘基明 committed
261 262 263


    public void checkManager(String topicId, List<ThemeQo> themes) {
刘基明's avatar
刘基明 committed
264
        Set<String> managerId = getManagerId(topicId);
刘基明's avatar
刘基明 committed
265
        for (ThemeQo theme : themes) {
刘基明's avatar
刘基明 committed
266
            theme.setManager(managerId.contains(theme.getAuthorId()));
刘基明's avatar
刘基明 committed
267 268 269
        }
    }

刘基明's avatar
刘基明 committed
270
    public Set<String> getManagerId(String topicId) {
刘基明's avatar
刘基明 committed
271
        if (StringUtils.isBlank(topicId)) {
刘基明's avatar
刘基明 committed
272
            return new HashSet<>();
刘基明's avatar
刘基明 committed
273
        }
刘基明's avatar
刘基明 committed
274
        List<TopicManagerEntity> topicManagerEntities = topicManagerMapper.selectList(new LambdaQueryWrapper<TopicManagerEntity>().eq(TopicManagerEntity::getTopicId, topicId));
刘基明's avatar
刘基明 committed
275
        return topicManagerEntities.stream().map(TopicManagerEntity::getUserId).collect(Collectors.toSet());
刘基明's avatar
刘基明 committed
276
    }
刘基明's avatar
刘基明 committed
277 278 279

    /**
     * 查询资源关联的话题
刘基明's avatar
刘基明 committed
280
     *
刘基明's avatar
刘基明 committed
281 282 283 284 285 286 287 288 289
     * @param req
     * @return
     */
    public TopicEntity queryRelateTopic(TopicDiscussionReq req) {
        List<TopicSubjectEntity> topicSubjectEntities = topicSubjectMapper.selectList(new LambdaQueryWrapper<TopicSubjectEntity>()
                .eq(TopicSubjectEntity::getSubjectId, req.getSubjectId())
                .eq(TopicSubjectEntity::getSubjectType, req.getSubjectType())
                .orderByDesc(TopicSubjectEntity::getCreateTime));

刘基明's avatar
刘基明 committed
290
        if (CollectionUtils.isEmpty(topicSubjectEntities)) {
刘基明's avatar
刘基明 committed
291 292 293 294 295 296 297 298 299 300
            return null;
        }
        String topicId = topicSubjectEntities.get(0).getTopicId();
        return topicMapper.selectOne(new LambdaQueryWrapper<TopicEntity>()
                .eq(TopicEntity::getTopicId, topicId)
                .eq(TopicEntity::getIsConceal, StatusEnum.FALSE)
                .eq(TopicEntity::getDeleteTag, StatusEnum.FALSE));


    }
刘基明's avatar
刘基明 committed
301 302 303 304 305 306 307 308 309 310

    public Set<String> getUserPermitTopics(String userId) {
        // 公开权限的话题
        List<TopicEntity> openTopics = topicMapper.selectList(new LambdaQueryWrapper<TopicEntity>()
                .eq(TopicEntity::getSpecialPermission, StatusEnum.TRUE.getCode())
                .eq(TopicEntity::getDeleteTag, StatusEnum.FALSE.getCode())
                .eq(TopicEntity::getIsConceal, StatusEnum.FALSE.getCode()));

        Set<String> openTopicIds = openTopics.stream().map(TopicEntity::getTopicId).collect(Collectors.toSet());

刘基明's avatar
刘基明 committed
311 312
        openTopicIds.add("");

刘基明's avatar
刘基明 committed
313 314 315 316 317 318 319 320 321 322
        if (StringUtils.isBlank(userId)) {
            return openTopicIds;
        }

        // 拥有权限的话题
        List<String> followTopics = topicFollowRelMapper.selectTopicIdByUserId(userId);
        HashSet<String> res = new HashSet<>(followTopics);
        res.addAll(openTopicIds);
        return res;
    }
刘基明's avatar
刘基明 committed
323
}