ArticleInfoService.java 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package com.example.mos.service;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  4. import com.example.mos.common.model.dto.ArticleInfoDTO;
  5. import com.example.mos.common.model.vo.ArticleDataVO;
  6. import com.example.mos.common.utils.DBUtil;
  7. import com.example.mos.domain.ArticleInfo;
  8. import com.example.mos.mapper.ArticleInfoMapper;
  9. import lombok.RequiredArgsConstructor;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.springframework.beans.BeanUtils;
  12. import org.springframework.stereotype.Service;
  13. import java.sql.Connection;
  14. import java.sql.Date;
  15. import java.sql.PreparedStatement;
  16. import java.sql.ResultSet;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19. import java.util.stream.Collectors;
  20. /**
  21. * @Author xiexiang
  22. * @Date 2024/6/4
  23. */
  24. @Slf4j
  25. @Service
  26. @RequiredArgsConstructor
  27. public class ArticleInfoService extends ServiceImpl<ArticleInfoMapper, ArticleInfo> {
  28. public List<Integer> addArticles(List<ArticleInfoDTO> articleInfoDTOS) {
  29. List<Integer> ids = new ArrayList<>();
  30. if (articleInfoDTOS != null && !articleInfoDTOS.isEmpty()) {
  31. List<String> titles = articleInfoDTOS.stream()
  32. .map(ArticleInfoDTO::getTitle)
  33. .collect(Collectors.toList());
  34. List<ArticleInfo> existingArticles = getExistingArticles(titles);
  35. List<ArticleInfo> articleInfos = articleInfoDTOS.stream()
  36. .filter(dto -> !isArticleExists(existingArticles, dto.getTitle()))
  37. .map(articleInfoDTO -> {
  38. ArticleInfo articleInfo = new ArticleInfo();
  39. BeanUtils.copyProperties(articleInfoDTO, articleInfo);
  40. return articleInfo;
  41. })
  42. .collect(Collectors.toList());
  43. if (!articleInfos.isEmpty()) {
  44. this.saveBatch(articleInfos);
  45. ids = articleInfos.stream().map(ArticleInfo::getId).collect(Collectors.toList());
  46. }
  47. }
  48. return ids;
  49. }
  50. // public List<Integer> addArticles(List<ArticleInfoDTO> articleInfoDTOS) {
  51. // // 构建要保存的 ArticleInfo 列表
  52. // List<ArticleInfo> articleInfos = articleInfoDTOS.stream()
  53. // .filter(articleInfoDTO -> !isArticleExists(articleInfoDTO.getTitle()))
  54. // .map(articleInfoDTO -> {
  55. // ArticleInfo articleInfo = new ArticleInfo();
  56. // BeanUtils.copyProperties(articleInfoDTO, articleInfo);
  57. // return articleInfo;
  58. // })
  59. // .collect(Collectors.toList());
  60. //
  61. // if (!articleInfos.isEmpty()) {
  62. // this.saveBatch(articleInfos); // 批量保存 ArticleInfo 实体
  63. // }
  64. //
  65. // return articleInfos.stream().map(ArticleInfo::getId).collect(Collectors.toList());
  66. // }
  67. // private boolean isArticleExists(String title) {
  68. // // 添加查询数据库检查是否已存在相同数据的逻辑,返回 true 表示已存在,false 表示不存在
  69. // // 这里假设是 ArticleService 中的一个方法来检查文章是否已经存在
  70. // if (title == null || title.isEmpty()) {
  71. // // 可以抛出异常或者返回 false,视情况而定
  72. // return false;
  73. // }
  74. // try {
  75. // LambdaQueryWrapper<ArticleInfo> queryWrapper = new LambdaQueryWrapper<>();
  76. // queryWrapper.eq(ArticleInfo::getTitle, title);
  77. // // 使用 selectOne 进行查询,只关心是否存在记录
  78. // ArticleInfo article = this.getOne(queryWrapper, false);
  79. // return article != null;
  80. // } catch (Exception e) {
  81. // // 日志记录或其他处理方式
  82. // e.printStackTrace();
  83. // return false;
  84. // }
  85. // }
  86. private List<ArticleInfo> getExistingArticles(List<String> titles) {
  87. // 批量查询数据库中是否已存在对应标题的文章,并返回列表
  88. LambdaQueryWrapper<ArticleInfo> queryWrapper = new LambdaQueryWrapper<>();
  89. queryWrapper.in(ArticleInfo::getTitle, titles);
  90. return this.list(queryWrapper);
  91. }
  92. private boolean isArticleExists(List<ArticleInfo> existingArticles, String title) {
  93. // 判断标题是否在已有文章列表中存在
  94. return existingArticles.stream().anyMatch(article -> article.getTitle().equals(title));
  95. }
  96. public List<ArticleDataVO> getArticles() {
  97. List<ArticleDataVO> articleDataVOS = new ArrayList<>();
  98. String sql = "SELECT ai.id, ai.title, ai.link, ai.source, ai.fake_id, ai.publish_time, ai.create_time, ai.abs, ai.classify, CONCAT(IFNULL(a.account_name, ''), IFNULL(b.web_name, '')) AS fakeName FROM article_info ai LEFT JOIN wechat_account_info a ON ai.fake_id = a.fake_id LEFT JOIN web_info b ON ai.fake_id = b.id";
  99. Connection conn = null;
  100. PreparedStatement ps = null;
  101. try {
  102. conn = DBUtil.getConn();
  103. ps = conn.prepareStatement(sql);
  104. ResultSet resultSet = ps.executeQuery();
  105. while (resultSet.next()) {
  106. ArticleDataVO articleDataVO = new ArticleDataVO();
  107. articleDataVO.setId(resultSet.getInt("id"));
  108. articleDataVO.setTitle(resultSet.getString("title"));
  109. articleDataVO.setLink(resultSet.getString("link"));
  110. articleDataVO.setSource(resultSet.getInt("source"));
  111. articleDataVO.setCameFrom(resultSet.getString("fakeName"));
  112. articleDataVO.setTime(resultSet.getDate("publish_time"));
  113. articleDataVO.setCreateTime(resultSet.getDate("create_time"));
  114. articleDataVO.setAbs(resultSet.getString("abs"));
  115. articleDataVO.setClassify(resultSet.getInt("classify"));
  116. articleDataVOS.add(articleDataVO);
  117. }
  118. } catch (Exception e) {
  119. e.printStackTrace();
  120. } finally {
  121. DBUtil.closeConn(conn);
  122. DBUtil.closePs(ps);
  123. }
  124. return articleDataVOS;
  125. }
  126. //更新
  127. public void updateInfo(ArticleDataVO articleDataVO) {
  128. Connection conn = null;
  129. PreparedStatement ps = null;
  130. try {
  131. conn = DBUtil.getConn();
  132. // 更新 article_info 表中对应 ID 的文章信息
  133. String sql = "UPDATE article_info SET abs=? , classify=? WHERE id=?";
  134. ps = conn.prepareStatement(sql);
  135. // 设置要更新的字段值
  136. ps.setString(1, articleDataVO.getAbs());
  137. ps.setInt(2, articleDataVO.getClassify());
  138. ps.setInt(3, articleDataVO.getId());
  139. // 执行更新
  140. ps.executeUpdate();
  141. } catch (Exception e) {
  142. e.printStackTrace();
  143. } finally {
  144. DBUtil.closeConn(conn);
  145. DBUtil.closePs(ps);
  146. }
  147. }
  148. }