PostServiceImpl.java 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package space.anyi.serve.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  4. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5. import org.springframework.stereotype.Service;
  6. import org.springframework.transaction.annotation.Transactional;
  7. import space.anyi.serve.entity.order.OrderTip;
  8. import space.anyi.serve.entity.post.Post;
  9. import space.anyi.serve.entity.post.PostVo;
  10. import space.anyi.serve.entity.user.User;
  11. import space.anyi.serve.mapper.OrderTipMapper;
  12. import space.anyi.serve.mapper.PostMapper;
  13. import space.anyi.serve.mapper.PostViewRecordMapper;
  14. import space.anyi.serve.entity.post.PostViewRecord;
  15. import space.anyi.serve.service.PostService;
  16. import space.anyi.serve.service.UserService;
  17. import java.time.LocalDateTime;
  18. import java.util.List;
  19. import java.util.stream.Collectors;
  20. @Service
  21. public class PostServiceImpl extends ServiceImpl<PostMapper, Post> implements PostService {
  22. private final PostViewRecordMapper postViewRecordMapper;
  23. private final OrderTipMapper orderTipMapper;
  24. private final UserService userService;
  25. public PostServiceImpl(PostViewRecordMapper postViewRecordMapper,
  26. OrderTipMapper orderTipMapper,
  27. UserService userService) {
  28. this.postViewRecordMapper = postViewRecordMapper;
  29. this.orderTipMapper = orderTipMapper;
  30. this.userService = userService;
  31. }
  32. @Override
  33. public Page<PostVo> listPosts(String keyword, String status, int pageNum, int pageSize, Long currentUserId) {
  34. Page<Post> page = new Page<>(pageNum, pageSize);
  35. LambdaQueryWrapper<Post> wrapper = new LambdaQueryWrapper<Post>()
  36. .eq(Post::getDeleteFlag, 0);
  37. if (keyword != null && !keyword.isEmpty()) {
  38. wrapper.like(Post::getTitle, keyword);
  39. }
  40. LocalDateTime now = LocalDateTime.now();
  41. if ("on_sale".equals(status)) {
  42. wrapper.gt(Post::getExpireTime, now);
  43. } else if ("public".equals(status)) {
  44. wrapper.le(Post::getExpireTime, now);
  45. }
  46. wrapper.orderByDesc(Post::getPublishTime);
  47. Page<Post> postPage = page(page, wrapper);
  48. List<PostVo> vos = postPage.getRecords().stream().map(post -> {
  49. PostVo vo = PostVo.from(post);
  50. User expert = userService.queryById(post.getExpertId());
  51. if (expert != null) {
  52. vo.setExpertName(expert.getUsername());
  53. vo.setExpertAvatar(expert.getAvatar());
  54. }
  55. if (currentUserId != null) {
  56. vo.setIsPaid(hasUserPaid(post.getId(), currentUserId));
  57. }
  58. return vo;
  59. }).collect(Collectors.toList());
  60. Page<PostVo> result = new Page<>(postPage.getCurrent(), postPage.getSize(), postPage.getTotal());
  61. result.setRecords(vos);
  62. if (currentUserId != null) {
  63. recordView(currentUserId, postPage.getRecords());
  64. }
  65. return result;
  66. }
  67. @Override
  68. public PostVo getPostDetail(Long id, Long currentUserId) {
  69. Post post = getById(id);
  70. if (post == null || post.getDeleteFlag() == 1) return null;
  71. PostVo vo = PostVo.from(post);
  72. User expert = userService.queryById(post.getExpertId());
  73. if (expert != null) {
  74. vo.setExpertName(expert.getUsername());
  75. vo.setExpertAvatar(expert.getAvatar());
  76. }
  77. boolean isExpired = LocalDateTime.now().isAfter(post.getExpireTime());
  78. boolean isPaid = currentUserId != null && hasUserPaid(id, currentUserId);
  79. if (!isExpired && !isPaid) {
  80. vo.setContentPaid(null);
  81. }
  82. vo.setIsPaid(isPaid || isExpired);
  83. return vo;
  84. }
  85. @Override
  86. @Transactional
  87. public Long createPost(Post post) {
  88. post.setPublishTime(LocalDateTime.now());
  89. post.setCreatedAt(LocalDateTime.now());
  90. post.setUpdatedAt(LocalDateTime.now());
  91. save(post);
  92. return post.getId();
  93. }
  94. @Override
  95. @Transactional
  96. public void updateHitStatus(Long id, String hitStatus) {
  97. Post post = getById(id);
  98. if (post == null) throw new IllegalArgumentException("帖子不存在");
  99. post.setHitStatus(hitStatus);
  100. post.setUpdatedAt(LocalDateTime.now());
  101. updateById(post);
  102. }
  103. @Override
  104. @Transactional
  105. public void updateViewCount(Long id, Integer viewCount) {
  106. Post post = getById(id);
  107. if (post == null) throw new IllegalArgumentException("帖子不存在");
  108. post.setViewCount(viewCount);
  109. post.setUpdatedAt(LocalDateTime.now());
  110. updateById(post);
  111. }
  112. @Override
  113. public boolean hasUserPaid(Long postId, Long userId) {
  114. if (userId == null) return false;
  115. Long count = orderTipMapper.selectCount(
  116. new LambdaQueryWrapper<OrderTip>()
  117. .eq(OrderTip::getPostId, postId)
  118. .eq(OrderTip::getUserId, userId)
  119. );
  120. return count > 0;
  121. }
  122. @Override
  123. public Page<Post> listExpertPreviousPosts(Long expertId, int pageNum, int pageSize) {
  124. Page<Post> page = new Page<>(pageNum, pageSize);
  125. LambdaQueryWrapper<Post> wrapper = new LambdaQueryWrapper<Post>()
  126. .eq(Post::getExpertId, expertId)
  127. .le(Post::getExpireTime, LocalDateTime.now())
  128. .eq(Post::getDeleteFlag, 0)
  129. .orderByDesc(Post::getPublishTime);
  130. return page(page, wrapper);
  131. }
  132. private void recordView(Long userId, List<Post> posts) {
  133. for (Post post : posts) {
  134. Long count = postViewRecordMapper.selectCount(
  135. new LambdaQueryWrapper<PostViewRecord>()
  136. .eq(PostViewRecord::getPostId, post.getId())
  137. .eq(PostViewRecord::getUserId, userId)
  138. );
  139. if (count == 0) {
  140. PostViewRecord record = new PostViewRecord();
  141. record.setPostId(post.getId());
  142. record.setUserId(userId);
  143. record.setViewTime(LocalDateTime.now());
  144. record.setCreatedAt(LocalDateTime.now());
  145. record.setUpdatedAt(LocalDateTime.now());
  146. postViewRecordMapper.insert(record);
  147. post.setViewCount(post.getViewCount() + 1);
  148. updateById(post);
  149. }
  150. }
  151. }
  152. }