ThemeService.java 13.7 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.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
刘基明's avatar
刘基明 committed
5
import com.tanpu.common.exception.BizException;
张辰's avatar
张辰 committed
6
import com.tanpu.common.redis.RedisHelper;
刘基明's avatar
刘基明 committed
7
import com.tanpu.common.uuid.UuidGenHelper;
刘基明's avatar
刘基明 committed
8
import com.tanpu.community.api.enums.DeleteTagEnum;
9
import com.tanpu.community.api.enums.ReportStatusEnum;
刘基明's avatar
刘基明 committed
10
import com.tanpu.community.dao.entity.community.ThemeEntity;
刘基明's avatar
刘基明 committed
11
import com.tanpu.community.dao.mapper.community.ThemeMapper;
刘基明's avatar
刘基明 committed
12
import com.tanpu.community.util.TimeUtils;
刘基明's avatar
刘基明 committed
13
import org.apache.commons.collections4.CollectionUtils;
刘基明's avatar
刘基明 committed
14
import org.apache.commons.lang3.StringUtils;
刘基明's avatar
刘基明 committed
15
import org.springframework.beans.factory.annotation.Autowired;
刘基明's avatar
刘基明 committed
16
import org.springframework.stereotype.Service;
刘基明's avatar
刘基明 committed
17
import org.springframework.transaction.annotation.Transactional;
刘基明's avatar
刘基明 committed
18

刘基明's avatar
刘基明 committed
19
import javax.annotation.Resource;
刘基明's avatar
刘基明 committed
20
import java.time.LocalDateTime;
刘基明's avatar
刘基明 committed
21
import java.util.Collections;
刘基明's avatar
刘基明 committed
22
import java.util.List;
刘基明's avatar
刘基明 committed
23 24
import java.util.Set;
import java.util.stream.Collectors;
刘基明's avatar
刘基明 committed
25

刘基明's avatar
刘基明 committed
26 27 28
@Service
public class ThemeService {

刘基明's avatar
刘基明 committed
29
    @Resource
刘基明's avatar
刘基明 committed
30
    private ThemeMapper themeMapper;
刘基明's avatar
刘基明 committed
31

刘基明's avatar
刘基明 committed
32 33 34
    @Autowired
    private UuidGenHelper uuidGenHelper;

张辰's avatar
张辰 committed
35 36 37
    @Autowired
    private RedisHelper redisHelper;

刘基明's avatar
刘基明 committed
38
    @Transactional
刘基明's avatar
刘基明 committed
39
    public void insertTheme(ThemeEntity themeEntity) {
刘基明's avatar
刘基明 committed
40
        themeEntity.setThemeId(uuidGenHelper.getUuidStr());
刘基明's avatar
刘基明 committed
41 42 43
        themeMapper.insert(themeEntity);
    }

刘基明's avatar
刘基明 committed
44
    @Transactional
刘基明's avatar
刘基明 committed
45 46
    public void update(ThemeEntity themeEntity, String themeId) {
        themeMapper.update(themeEntity, new LambdaUpdateWrapper<ThemeEntity>().eq(ThemeEntity::getThemeId, themeId));
刘基明's avatar
刘基明 committed
47 48
    }

49 50
    //n天内所有主题
    public List<ThemeEntity> queryRecentdays(Integer days) {
刘基明's avatar
刘基明 committed
51
        LambdaQueryWrapper<ThemeEntity> queryWrapper = new LambdaQueryWrapper<ThemeEntity>()
刘基明's avatar
刘基明 committed
52
                .eq(ThemeEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED.getCode())
53 54 55 56 57 58 59 60 61 62 63 64
                .gt(ThemeEntity::getCreateTime, TimeUtils.getDaysBefore(days))
                .orderByDesc(ThemeEntity::getId);

        return themeMapper.selectList(queryWrapper);
    }

    //最新的n条主题
    public List<ThemeEntity> queryLatestThemes(Integer n) {
        LambdaQueryWrapper<ThemeEntity> queryWrapper = new LambdaQueryWrapper<ThemeEntity>()
                .eq(ThemeEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED.getCode())
                .last("limit " + n)
                .orderByDesc(ThemeEntity::getId);
刘基明's avatar
刘基明 committed
65 66 67 68

        return themeMapper.selectList(queryWrapper);
    }

刘基明's avatar
刘基明 committed
69
    //根据id返回主题详情(未删)
刘基明's avatar
刘基明 committed
70
    public ThemeEntity queryByThemeId(String themeId) {
刘基明's avatar
刘基明 committed
71
        return themeMapper.selectOne(new LambdaQueryWrapper<ThemeEntity>()
刘基明's avatar
刘基明 committed
72 73
                .eq(ThemeEntity::getThemeId, themeId)
                .eq(ThemeEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED.getCode()));
刘基明's avatar
刘基明 committed
74 75
    }

刘基明's avatar
刘基明 committed
76
    public List<ThemeEntity> queryThemesByUserId(String userId) {
刘基明's avatar
刘基明 committed
77
        return themeMapper.selectList(new LambdaQueryWrapper<ThemeEntity>()
刘基明's avatar
刘基明 committed
78 79
                .eq(ThemeEntity::getAuthorId, userId)
                .eq(ThemeEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED.getCode())
刘基明's avatar
刘基明 committed
80 81 82
                .orderByDesc(ThemeEntity::getId));
    }

83
    //根据用户id查询主题list
刘基明's avatar
刘基明 committed
84
    public List<ThemeEntity> queryThemesByUserId(String userId, String lastId, Integer pageSize) {
刘基明's avatar
刘基明 committed
85 86 87 88 89 90
        LambdaQueryWrapper<ThemeEntity> queryWrapper = new LambdaQueryWrapper<ThemeEntity>()
                .eq(ThemeEntity::getAuthorId, userId)
                .eq(ThemeEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED.getCode())
                .orderByDesc(ThemeEntity::getId);
        if (StringUtils.isNotEmpty(lastId)) {
            ThemeEntity lastEntity = queryByThemeId(lastId);
刘基明's avatar
刘基明 committed
91
            if (lastEntity == null) throw new BizException("主题未找到,id:" + lastId);
刘基明's avatar
刘基明 committed
92 93
            queryWrapper.lt(ThemeEntity::getUpdateTime, lastEntity.getCreateTime());
        }
刘基明's avatar
刘基明 committed
94 95
        if (pageSize != null) {
            queryWrapper.last("limit " + pageSize);
刘基明's avatar
刘基明 committed
96 97 98 99
        }
        return themeMapper.selectList(queryWrapper);
    }

刘基明's avatar
刘基明 committed
100
    //根据ids返回主题详情,带分页
刘基明's avatar
刘基明 committed
101
    public List<ThemeEntity> queryByThemeIds(List<String> themeIds, String lastId, Integer pageSize) {
102
        if (CollectionUtils.isEmpty(themeIds)) {
刘基明's avatar
刘基明 committed
103 104
            return Collections.emptyList();
        }
刘基明's avatar
刘基明 committed
105 106 107 108 109
        LambdaQueryWrapper<ThemeEntity> queryWrapper = new LambdaQueryWrapper<ThemeEntity>()
                .in(ThemeEntity::getThemeId, themeIds)
                .eq(ThemeEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED.getCode());
        if (StringUtils.isNotEmpty(lastId)) {
            ThemeEntity lastEntity = queryByThemeId(lastId);
刘基明's avatar
刘基明 committed
110
            if (lastEntity == null) throw new BizException("主题未找到,id:" + lastId);
刘基明's avatar
刘基明 committed
111 112
            queryWrapper.lt(ThemeEntity::getUpdateTime, lastEntity.getCreateTime());
        }
刘基明's avatar
刘基明 committed
113 114
        if (pageSize != null) {
            queryWrapper.last("limit " + pageSize);
刘基明's avatar
刘基明 committed
115 116
        }
        return themeMapper.selectList(queryWrapper);
刘基明's avatar
刘基明 committed
117 118
    }

刘基明's avatar
刘基明 committed
119 120
    /**
     * 根据主题Id查询列表
121
     *
刘基明's avatar
刘基明 committed
122 123 124
     * @param themeIds
     * @return
     */
刘基明's avatar
刘基明 committed
125
    public List<ThemeEntity> queryByThemeIds(List<String> themeIds) {
126
        if (CollectionUtils.isEmpty(themeIds)) {
刘基明's avatar
刘基明 committed
127 128
            return Collections.emptyList();
        }
刘基明's avatar
刘基明 committed
129 130 131 132 133
        LambdaQueryWrapper<ThemeEntity> queryWrapper = new LambdaQueryWrapper<ThemeEntity>()
                .in(ThemeEntity::getThemeId, themeIds)
                .eq(ThemeEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED.getCode());

        return themeMapper.selectList(queryWrapper);
刘基明's avatar
刘基明 committed
134 135
    }

刘基明's avatar
刘基明 committed
136

刘基明's avatar
刘基明 committed
137
    /**
刘基明's avatar
刘基明 committed
138
     * 查询非传入作者的主题(可分页)
139
     *
刘基明's avatar
刘基明 committed
140 141 142 143 144
     * @param lastId
     * @param pageSize
     * @param userId
     * @return
     */
145
    public List<ThemeEntity> selectExcludeUser(String userId, String lastId, Integer pageSize) {
刘基明's avatar
刘基明 committed
146
        LambdaQueryWrapper<ThemeEntity> queryWrapper = new LambdaQueryWrapper<>();
147 148
        if (!StringUtils.isEmpty(userId)) {
            queryWrapper.ne(ThemeEntity::getAuthorId, userId);
刘基明's avatar
刘基明 committed
149
        }
刘基明's avatar
刘基明 committed
150

刘基明's avatar
刘基明 committed
151 152
        if (StringUtils.isNotEmpty(lastId)) {
            ThemeEntity lastEntity = queryByThemeId(lastId);
刘基明's avatar
刘基明 committed
153
            if (lastEntity == null) throw new BizException("主题未找到,id:" + lastId);
刘基明's avatar
刘基明 committed
154
            queryWrapper.lt(ThemeEntity::getUpdateTime, lastEntity.getCreateTime());
刘基明's avatar
刘基明 committed
155
        }
156
        if (pageSize != null) {
刘基明's avatar
刘基明 committed
157 158 159 160 161 162 163 164 165 166 167
            queryWrapper.last("limit " + pageSize);
        }

        queryWrapper.orderByDesc(ThemeEntity::getId);
        queryWrapper.orderByDesc(ThemeEntity::getCreateTime);
        queryWrapper.eq(ThemeEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED.getCode());
        return themeMapper.selectList(queryWrapper);
    }

    /**
     * 查询非传入作者的主题(可分页)
168
     *
刘基明's avatar
刘基明 committed
169 170 171 172 173
     * @param lastId
     * @param pageSize
     * @param userId
     * @return
     */
174 175
    public List<ThemeEntity> queryByThemeIdsExcludeUser(List<String> themeIds, String userId, String lastId, Integer pageSize) {
        if (CollectionUtils.isEmpty(themeIds)) {
刘基明's avatar
刘基明 committed
176 177 178 179
            return Collections.emptyList();
        }
        LambdaQueryWrapper<ThemeEntity> queryWrapper = new LambdaQueryWrapper<ThemeEntity>()
                .in(ThemeEntity::getThemeId, themeIds);
180 181
        if (!StringUtils.isEmpty(userId)) {
            queryWrapper.ne(ThemeEntity::getAuthorId, userId);
刘基明's avatar
刘基明 committed
182 183 184 185 186 187 188
        }

        if (StringUtils.isNotEmpty(lastId)) {
            ThemeEntity lastEntity = queryByThemeId(lastId);
            if (lastEntity == null) throw new BizException("主题未找到,id:" + lastId);
            queryWrapper.lt(ThemeEntity::getUpdateTime, lastEntity.getCreateTime());
        }
189
        if (pageSize != null) {
刘基明's avatar
刘基明 committed
190 191
            queryWrapper.last("limit " + pageSize);
        }
刘基明's avatar
刘基明 committed
192

刘基明's avatar
刘基明 committed
193
        queryWrapper.orderByDesc(ThemeEntity::getId);
刘基明's avatar
刘基明 committed
194
        queryWrapper.orderByDesc(ThemeEntity::getCreateTime);
刘基明's avatar
刘基明 committed
195
        queryWrapper.eq(ThemeEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED.getCode());
刘基明's avatar
刘基明 committed
196 197 198
        return themeMapper.selectList(queryWrapper);
    }

199 200 201



刘基明's avatar
刘基明 committed
202
    /**
刘基明's avatar
刘基明 committed
203
     * 根据话题查询最新主题(可分页)
刘基明's avatar
刘基明 committed
204 205 206
     *
     * @param topidId  话题Id
     * @param lastId   查询此主题Id之前的主题
刘基明's avatar
刘基明 committed
207 208 209
     * @param pageSize 查询数量
     * @return
     */
刘基明's avatar
刘基明 committed
210
    public List<ThemeEntity> queryByTopic(String topidId, String lastId, Integer pageSize) {
刘基明's avatar
刘基明 committed
211 212 213
        LambdaQueryWrapper<ThemeEntity> queryWrapper = new LambdaQueryWrapper<ThemeEntity>()
                .eq(ThemeEntity::getTopicId, topidId);
        if (StringUtils.isNotEmpty(lastId)) {
刘基明's avatar
刘基明 committed
214
            ThemeEntity lastEntity = queryByThemeId(lastId);
刘基明's avatar
刘基明 committed
215
            if (lastEntity == null) throw new BizException("主题未找到,id:" + lastId);
刘基明's avatar
刘基明 committed
216
            queryWrapper.lt(ThemeEntity::getUpdateTime, lastEntity.getCreateTime());
刘基明's avatar
刘基明 committed
217
        }
刘基明's avatar
刘基明 committed
218 219
        if (pageSize != null) {
            queryWrapper.last("limit " + pageSize);
刘基明's avatar
刘基明 committed
220
        }
刘基明's avatar
刘基明 committed
221
        queryWrapper.orderByDesc(ThemeEntity::getCreateTime);
刘基明's avatar
刘基明 committed
222
        queryWrapper.eq(ThemeEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED.getCode());
刘基明's avatar
刘基明 committed
223
        return themeMapper.selectList(queryWrapper);
刘基明's avatar
刘基明 committed
224
    }
刘基明's avatar
刘基明 committed
225

刘基明's avatar
刘基明 committed
226 227
    //根据话题查询所有的主题Id
    public List<String> queryThemeIdsByTopic(String topidId) {
刘基明's avatar
刘基明 committed
228
        if (StringUtils.isEmpty(topidId)) {
刘基明's avatar
刘基明 committed
229 230
            return Collections.emptyList();
        }
刘基明's avatar
刘基明 committed
231 232 233 234 235 236
        LambdaQueryWrapper<ThemeEntity> queryWrapper = new LambdaQueryWrapper<ThemeEntity>()
                .eq(ThemeEntity::getTopicId, topidId);
        queryWrapper.select(ThemeEntity::getThemeId);
        return themeMapper.selectList(queryWrapper).stream().map(ThemeEntity::getThemeId).collect(Collectors.toList());
    }

刘基明's avatar
刘基明 committed
237

刘基明's avatar
刘基明 committed
238 239
    /**
     * 根据作者查询主题列表(可分页)
240
     *
刘基明's avatar
刘基明 committed
241 242 243 244 245
     * @param userIds
     * @param lastId
     * @param pageSize
     * @return
     */
刘基明's avatar
刘基明 committed
246
    public List<ThemeEntity> queryByUserIds(List<String> userIds, String lastId, Integer pageSize) {
刘基明's avatar
刘基明 committed
247
        LambdaQueryWrapper<ThemeEntity> queryWrapper = new LambdaQueryWrapper<ThemeEntity>()
刘基明's avatar
刘基明 committed
248
                .in(ThemeEntity::getAuthorId, userIds);
刘基明's avatar
刘基明 committed
249
        if (StringUtils.isNotEmpty(lastId)) {
刘基明's avatar
刘基明 committed
250
            ThemeEntity lastEntity = queryByThemeId(lastId);
刘基明's avatar
刘基明 committed
251
            if (lastEntity == null) throw new BizException("主题未找到,id:" + lastId);
刘基明's avatar
刘基明 committed
252
            queryWrapper.lt(ThemeEntity::getUpdateTime, lastEntity.getCreateTime());
刘基明's avatar
刘基明 committed
253
        }
刘基明's avatar
刘基明 committed
254
        queryWrapper.last("limit " + pageSize);
刘基明's avatar
刘基明 committed
255
        queryWrapper.orderByDesc(ThemeEntity::getCreateTime);
刘基明's avatar
刘基明 committed
256
        queryWrapper.eq(ThemeEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED.getCode());
刘基明's avatar
刘基明 committed
257
        return themeMapper.selectList(queryWrapper);
刘基明's avatar
刘基明 committed
258 259 260

    }

刘基明's avatar
刘基明 committed
261 262
    /**
     * 根据关键字搜索
263
     *
刘基明's avatar
刘基明 committed
264 265 266 267 268 269
     * @param keyword
     * @param lastId
     * @param pageSize
     * @return
     */
    public List<ThemeEntity> search(String keyword, String lastId, Integer pageSize) {
270
        if (StringUtils.isEmpty(keyword)) {
刘基明's avatar
刘基明 committed
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
            return Collections.emptyList();
        }
        LambdaQueryWrapper<ThemeEntity> queryWrapper = new LambdaQueryWrapper<ThemeEntity>()
                .like(ThemeEntity::getTitle, keyword);
        if (StringUtils.isNotEmpty(lastId)) {
            ThemeEntity lastEntity = queryByThemeId(lastId);
            if (lastEntity == null) throw new BizException("主题未找到,id:" + lastId);
            queryWrapper.lt(ThemeEntity::getUpdateTime, lastEntity.getCreateTime());
        }
        queryWrapper.last("limit " + pageSize);
        queryWrapper.orderByDesc(ThemeEntity::getCreateTime);
        queryWrapper.eq(ThemeEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED.getCode());
        return themeMapper.selectList(queryWrapper);

    }

刘基明's avatar
刘基明 committed
287 288

    //查询对应话题的发表用户集合
刘基明's avatar
刘基明 committed
289
    public Set<String> getPostUserCount(List<String> themeIds) {
刘基明's avatar
刘基明 committed
290 291 292 293
        return themeMapper.selectBatchIds(themeIds).stream()
                .map(ThemeEntity::getAuthorId)
                .collect(Collectors.toSet());
    }
刘基明's avatar
刘基明 committed
294 295 296

    public Integer getForwardCountById(String themeId) {
        return themeMapper.selectCount(new LambdaQueryWrapper<ThemeEntity>()
刘基明's avatar
刘基明 committed
297
                .eq(ThemeEntity::getFormerThemeId, themeId)
刘基明's avatar
刘基明 committed
298 299
                .eq(ThemeEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED));
    }
刘基明's avatar
刘基明 committed
300

刘基明's avatar
刘基明 committed
301
    public Integer getForwardCountByUser(String themeId, String userId) {
刘基明's avatar
刘基明 committed
302 303 304 305 306
        return themeMapper.selectCount(new LambdaQueryWrapper<ThemeEntity>()
                .eq(ThemeEntity::getFormerThemeId, themeId)
                .eq(ThemeEntity::getAuthorId, userId)
                .eq(ThemeEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED));
    }
刘基明's avatar
刘基明 committed
307

刘基明's avatar
刘基明 committed
308
    @Transactional
刘基明's avatar
刘基明 committed
309
    public void deleteById(String themeId) {
刘基明's avatar
刘基明 committed
310 311
        ThemeEntity themeEntity = themeMapper.selectOne(new LambdaQueryWrapper<ThemeEntity>()
                .eq(ThemeEntity::getThemeId, themeId));
刘基明's avatar
刘基明 committed
312 313
        if (themeEntity == null) {
            throw new BizException("主题未找到,id:" + themeId);
刘基明's avatar
刘基明 committed
314 315 316 317
        }
        themeEntity.setDeleteTag(DeleteTagEnum.DELETED.getCode());
        themeMapper.updateById(themeEntity);
    }
刘基明's avatar
刘基明 committed
318

刘基明's avatar
刘基明 committed
319 320
    /**
     * 查询更新节点后的用户新建主题数
321 322
     *
     * @param userIds      用户ids
刘基明's avatar
刘基明 committed
323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
     * @param lastViewTime 更新时间节点
     * @return
     */
    public Integer queryCountFromLastTime(List<String> userIds, LocalDateTime lastViewTime) {
        if (CollectionUtils.isEmpty(userIds)) {
            return 0;
        }
        LambdaQueryWrapper<ThemeEntity> queryWrapper = new LambdaQueryWrapper<ThemeEntity>()
                .in(ThemeEntity::getAuthorId, userIds)
                .eq(ThemeEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED.getCode());
        if (lastViewTime != null) {
            queryWrapper.gt(ThemeEntity::getCreateTime, lastViewTime);
        }
        return themeMapper.selectCount(queryWrapper);
    }
刘基明's avatar
刘基明 committed
338 339


340 341 342 343 344 345 346 347
    public void updateReportStatus(String themeId) {
        ThemeEntity themeEntity = queryByThemeId(themeId);
        if (themeEntity == null) {
            throw new BizException("主题未找到,id:"+themeId);
        }
        themeEntity.setReportStatus(ReportStatusEnum.REPORTED.getCode());
        themeMapper.updateById(themeEntity);
    }
刘基明's avatar
刘基明 committed
348
}