diff --git a/admin/src/main/java/com/jinrui/reference/admin/controller/NewsController.java b/admin/src/main/java/com/jinrui/reference/admin/controller/NewsController.java index ab81d55..d3d968b 100644 --- a/admin/src/main/java/com/jinrui/reference/admin/controller/NewsController.java +++ b/admin/src/main/java/com/jinrui/reference/admin/controller/NewsController.java @@ -20,6 +20,7 @@ import com.jinrui.reference.core.model.dto.news.SaveNewsDTO; import com.jinrui.reference.core.model.vo.PageObject; import com.jinrui.reference.core.model.vo.ResultObject; import com.jinrui.reference.core.model.vo.news.NewsDetailVO; +import com.jinrui.reference.core.model.vo.news.NewsScoreVO; import com.jinrui.reference.core.model.vo.news.NewsVO; import com.jinrui.reference.core.service.NewsService; @@ -192,14 +193,15 @@ public class NewsController { @GetMapping public PageObject queryNews(@RequestHeader("auth-token") String token, @RequestParam(value = "keyword", required = false) String keyword, + @RequestParam(value = "minScore", required = false) Double minScore, + @RequestParam(value = "maxScore", required = false) Double maxScore, @RequestParam(value = "column", required = false) String columnList, @RequestParam(value = "status", required = false) Integer status, @RequestParam(value = "page", required = false, defaultValue = "1") int page, @RequestParam(value = "size", required = false, defaultValue = "10") int size, @RequestParam(value = "last", required = false) Integer last, @RequestParam(value = "current", required = false) Integer current, - @RequestParam(value = "orderBy", required = false, defaultValue = "id") String orderBy, - @RequestParam(value = "direction", required = false, defaultValue = "asc") String direction + @RequestParam(value = "orderBy", required = false, defaultValue = "id$asc") String orderBy ) { if (!StringUtils.hasText(token)) { return PageObject.failedPage("登陆Token为空!"); @@ -218,13 +220,40 @@ public class NewsController { } log.info("path: /news, method: GET, request user id: {}, keyword: {}, column: {}, status: {}, " + - "page: {}, size: {}, last: {}, current: {}, orderBy: {}, direction: {}", - adminUser.getId(), keyword, columnList, status, page, size, last, current, orderBy, direction); + "page: {}, size: {}, last: {}, current: {}, orderBy: {}", + adminUser.getId(), keyword, columnList, status, page, size, last, current, orderBy); } catch (Exception e) { log.error("解析登陆Token出错!", e); return PageObject.failedPage(500, "服务端错误,请联系系统管理员!"); } + return newsService.queryNews(keyword, columnList, status, page, size, last, current, orderBy, minScore, maxScore); + } + + @GetMapping("/score") + public ResultObject getScore(@RequestHeader("auth-token") String token, + @RequestParam("id") Long id) { + if (!StringUtils.hasText(token)) { + return ResultObject.failed("登陆Token为空!"); + } - return newsService.queryNews(keyword, columnList, status, page, size, last, current, orderBy, direction); + try { + AdminUser adminUser = AdminJwtService.parseToken(token); + if (adminUser == null) { + log.warn("解析token {}拿不到AdminUser对象!", token); + return ResultObject.failed("登陆Token有误,请联系系统管理员!"); + } + + Long adminUserId = adminUser.getId(); + if (!adminUser.isActive()) { + log.warn("当前用户已被封禁! id = {}", adminUserId); + return ResultObject.failed("当前用户已被封禁!请联系系统管理员!"); + } + + log.info("path: /news/score, method: GET, request user id: {}, news id: {}", adminUserId, id); + return newsService.getScore(id); + } catch (Exception e) { + log.error("解析登陆Tokn出错!", e); + return ResultObject.failed(500, "服务端错误,请联系系统管理员!"); + } } } diff --git a/admin/src/main/java/com/jinrui/reference/admin/controller/NewsInfoController.java b/admin/src/main/java/com/jinrui/reference/admin/controller/NewsInfoController.java index e53b8b3..459a089 100644 --- a/admin/src/main/java/com/jinrui/reference/admin/controller/NewsInfoController.java +++ b/admin/src/main/java/com/jinrui/reference/admin/controller/NewsInfoController.java @@ -193,7 +193,6 @@ public class NewsInfoController { log.error("解析登陆Token出错!", e); return PageObject.failedPage(500, "服务端错误,请联系系统管理员!"); } - return newsInfoService.queryNewsInfo(title, content, stockcode, sourcename, page, size, last, current, orderBy, direction); } diff --git a/admin/src/main/resources/application.yml b/admin/src/main/resources/application.yml index f6e8ac3..83ec634 100644 --- a/admin/src/main/resources/application.yml +++ b/admin/src/main/resources/application.yml @@ -38,4 +38,6 @@ elasticsearch: port: 9200 enable: true username: elastic - password: ZxE,3VM@Thk0 \ No newline at end of file + password: ZxE,3VM@Thk0 +mybatis: + type-handlers-package:com.jinrui.reference.core.typehandler \ No newline at end of file diff --git a/core/src/main/java/com/jinrui/reference/core/mapper/NewsMapper.java b/core/src/main/java/com/jinrui/reference/core/mapper/NewsMapper.java index 87f60e2..40ec89b 100644 --- a/core/src/main/java/com/jinrui/reference/core/mapper/NewsMapper.java +++ b/core/src/main/java/com/jinrui/reference/core/mapper/NewsMapper.java @@ -92,11 +92,14 @@ public interface NewsMapper { "news.status as status," + "news.create_time as createTime," + "news.publish_time as publishTime," + - "news.update_time as updateTime " + + "news.update_time as updateTime, " + + "news.newsinfo_id as newsinfoId, " + + "news_tags.news_score as score " + "from news " + "" + "inner join news_column_rel on news.id = news_column_rel.news_id " + "" + + " left join news_tags on news.newsinfo_id = news_tags.newsinfo_id " + "" + "" + "news.title like concat('%', #{keyword}, '%') " + @@ -104,6 +107,12 @@ public interface NewsMapper { "" + "and news_column_rel.column_id in (${column}) " + "" + + "" + + "and news_tags.news_score >= #{minScore} " + + "" + + "" + + "and news_tags.news_score <= #{maxScore} " + + "" + "" + "and news.status = #{status} " + "" + @@ -111,18 +120,18 @@ public interface NewsMapper { "and news.id > #{last}" + "" + "" + - "order by news.${orderBy} " + - "" + - "desc" + + "" + + "order by ${orderBy} " + "" + "limit ${limit} offset ${offset}" + "") List queryNews(@Param("keyword") String keyword, + @Param("minScore") Double minScore, + @Param("maxScore") Double maxScore, @Param("column") String columnList, @Param("status") Integer status, @Param("last") Integer last, @Param("orderBy") String orderBy, - @Param("direction") String direction, @Param("limit") int limit, @Param("offset") int offset); @@ -131,6 +140,9 @@ public interface NewsMapper { "" + "inner join news_column_rel on news.id = news_column_rel.news_id " + "" + + "" + + "left join news_tags on news.newsinfo_id = news_tags.newsinfo_id " + + "" + "" + "" + "news.title like concat('%', #{keyword}, '%') " + @@ -138,12 +150,27 @@ public interface NewsMapper { "" + "and news_column_rel.column_id in (${column}) " + "" + + "" + + "and news_tags.news_score >= ${minScore} " + + "" + + "" + + "and news_tags.news_score <= ${maxScore} " + + "" + "" + "and news.status = #{status} " + "" + ") tmp" + "") int queryTotal(@Param("keyword") String keyword, + @Param("minScore") Double minScore, + @Param("maxScore") Double maxScore, @Param("column") String columnParam, @Param("status") Integer status); + + @Select("select id, title, summary, picture, content, status, " + + "create_time as createTime, " + + "publish_time as publishTime, " + + "update_time as updateTime " + + "from news where newsinfo_id = #{newsinfoId}") + News getNewsDetailByNewsInfoId(@Param("newsinfoId") String newsinfoId); } diff --git a/core/src/main/java/com/jinrui/reference/core/mapper/NewsTagsMapper.java b/core/src/main/java/com/jinrui/reference/core/mapper/NewsTagsMapper.java new file mode 100644 index 0000000..c213516 --- /dev/null +++ b/core/src/main/java/com/jinrui/reference/core/mapper/NewsTagsMapper.java @@ -0,0 +1,35 @@ +package com.jinrui.reference.core.mapper; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; + +import com.jinrui.reference.core.model.entity.NewsTags; +import com.jinrui.reference.core.typehandler.JsonArrayTypeHandler; + +public interface NewsTagsMapper { + @Results({ + @Result(column = "id", property = "id", id = true), + @Result(column = "abstract", property = "summary"), + @Result(column = "title", property = "title"), + @Result(column = "rewrite_content", property = "rewriteContent"), + @Result(column = "industry_label", property = "industryLabel", typeHandler = JsonArrayTypeHandler.class), + @Result(column = "industry_confidence", property = "industryConfidence", typeHandler = JsonArrayTypeHandler.class), + @Result(column = "industry_score", property = "industryScore", typeHandler = JsonArrayTypeHandler.class), + @Result(column = "concept_label", property = "conceptLabel", typeHandler = JsonArrayTypeHandler.class), + @Result(column = "concept_confidence", property = "conceptConfidence", typeHandler = JsonArrayTypeHandler.class), + @Result(column = "concept_score", property = "conceptScore", typeHandler = JsonArrayTypeHandler.class), + @Result(column = "source", property = "source"), + @Result(column = "source_impact", property = "sourceImpact"), + @Result(column = "China_factor", property = "chinaFactor"), + @Result(column = "public_opinion_score", property = "publicOpinionScore"), + @Result(column = "news_score", property = "newsScore"), + @Result(column = "news_id", property = "newsId"), + @Result(column = "deleted", property = "deleted"), + @Result(column = "create_time", property = "createTime"), + @Result(column = "update_time", property = "updateTime"), + }) + @Select("select * from news_tags where newsinfo_id = #{newsId}") + NewsTags getNewsTagsByNewsId(@Param("newsId") String newsId); +} diff --git a/core/src/main/java/com/jinrui/reference/core/model/entity/News.java b/core/src/main/java/com/jinrui/reference/core/model/entity/News.java index 0c3a291..db424f8 100644 --- a/core/src/main/java/com/jinrui/reference/core/model/entity/News.java +++ b/core/src/main/java/com/jinrui/reference/core/model/entity/News.java @@ -75,6 +75,8 @@ public class News { * 关联的全量资讯es文档ID */ private String newsinfoId; + + private Double score; public News() {} @@ -204,4 +206,12 @@ public class News { public void setNewsinfoId(String newsinfoId) { this.newsinfoId = newsinfoId; } + + public Double getScore() { + return score; + } + + public void setScore(Double score) { + this.score = score; + } } diff --git a/core/src/main/java/com/jinrui/reference/core/model/entity/NewsTags.java b/core/src/main/java/com/jinrui/reference/core/model/entity/NewsTags.java new file mode 100644 index 0000000..631b65c --- /dev/null +++ b/core/src/main/java/com/jinrui/reference/core/model/entity/NewsTags.java @@ -0,0 +1,196 @@ +package com.jinrui.reference.core.model.entity; + +import java.util.Date; +import java.util.List; + +public class NewsTags { + private Long id; + + private String summary; + + private String title; + + private String rewriteContent; + + private List industryLabel; + + private List industryConfidence; + + private List industryScore; + + private List conceptLabel; + + private List conceptConfidence; + + private List conceptScore; + + private String source; + + private Integer sourceImpact; + + private Double chinaFactor; + + private Integer publicOpinionScore; + + private Double newsScore; + + private Long newsId; + + private Boolean deleted; + + private Date createTime; + + private Date updateTime; + + public List getIndustryScore() { + return industryScore; + } + + public void setIndustryScore(List industryScore) { + this.industryScore = industryScore; + } + + public List getConceptLabel() { + return conceptLabel; + } + + public void setConceptLabel(List conceptLabel) { + this.conceptLabel = conceptLabel; + } + + public List getConceptConfidence() { + return conceptConfidence; + } + + public void setConceptConfidence(List conceptConfidence) { + this.conceptConfidence = conceptConfidence; + } + + public List getConceptScore() { + return conceptScore; + } + + public void setConceptScore(List conceptScore) { + this.conceptScore = conceptScore; + } + + public Integer getSourceImpact() { + return sourceImpact; + } + + public void setSourceImpact(Integer sourceImpact) { + this.sourceImpact = sourceImpact; + } + + public Double getChinaFactor() { + return chinaFactor; + } + + public void setChinaFactor(Double chinaFactor) { + this.chinaFactor = chinaFactor; + } + + public Integer getPublicOpinionScore() { + return publicOpinionScore; + } + + public void setPublicOpinionScore(Integer publicOpinionScore) { + this.publicOpinionScore = publicOpinionScore; + } + + public Double getNewsScore() { + return newsScore; + } + + public void setNewsScore(Double newsScore) { + this.newsScore = newsScore; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public List getIndustryLabel() { + return industryLabel; + } + + public void setIndustryLabel(List industryLabel) { + this.industryLabel = industryLabel; + } + + public List getIndustryConfidence() { + return industryConfidence; + } + + public void setIndustryConfidence(List industryConfidence) { + this.industryConfidence = industryConfidence; + } + + public String getSummary() { + return summary; + } + + public void setSummary(String summary) { + this.summary = summary; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getRewriteContent() { + return rewriteContent; + } + + public void setRewriteContent(String rewriteContent) { + this.rewriteContent = rewriteContent; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public Long getNewsId() { + return newsId; + } + + public void setNewsId(Long newsId) { + this.newsId = newsId; + } + + public Boolean getDeleted() { + return deleted; + } + + public void setDeleted(Boolean deleted) { + this.deleted = deleted; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } +} diff --git a/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsScoreVO.java b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsScoreVO.java new file mode 100644 index 0000000..51fc7b5 --- /dev/null +++ b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsScoreVO.java @@ -0,0 +1,134 @@ +package com.jinrui.reference.core.model.vo.news; + +import java.util.List; + +import com.jinrui.reference.core.model.entity.NewsTags; + +public class NewsScoreVO { + private Long id; + + private List industryLabel; + + private List industryConfidence; + + private List industryScore; + + private List conceptLabel; + + private List conceptConfidence; + + private List conceptScore; + + private Integer sourceImpact; + + private Double chinaFactor; + + private Integer publicOpinionScore; + + private Double newsScore; + + public NewsScoreVO() { + } + + public NewsScoreVO(NewsTags newsTags) { + this.id = newsTags.getId(); + this.industryLabel = newsTags.getIndustryLabel(); + this.industryConfidence = newsTags.getIndustryConfidence(); + this.industryScore = newsTags.getIndustryScore(); + this.conceptLabel = newsTags.getConceptLabel(); + this.conceptConfidence = newsTags.getConceptConfidence(); + this.conceptScore = newsTags.getConceptScore(); + this.sourceImpact = newsTags.getSourceImpact(); + this.chinaFactor = newsTags.getChinaFactor(); + this.publicOpinionScore = newsTags.getPublicOpinionScore(); + this.newsScore = newsTags.getNewsScore(); + } + + public List getIndustryScore() { + return industryScore; + } + + public void setIndustryScore(List industryScore) { + this.industryScore = industryScore; + } + + public List getConceptLabel() { + return conceptLabel; + } + + public void setConceptLabel(List conceptLabel) { + this.conceptLabel = conceptLabel; + } + + public List getConceptConfidence() { + return conceptConfidence; + } + + public void setConceptConfidence(List conceptConfidence) { + this.conceptConfidence = conceptConfidence; + } + + public List getConceptScore() { + return conceptScore; + } + + public void setConceptScore(List conceptScore) { + this.conceptScore = conceptScore; + } + + public Integer getSourceImpact() { + return sourceImpact; + } + + public void setSourceImpact(Integer sourceImpact) { + this.sourceImpact = sourceImpact; + } + + public Double getChinaFactor() { + return chinaFactor; + } + + public void setChinaFactor(Double chinaFactor) { + this.chinaFactor = chinaFactor; + } + + public Integer getPublicOpinionScore() { + return publicOpinionScore; + } + + public void setPublicOpinionScore(Integer publicOpinionScore) { + this.publicOpinionScore = publicOpinionScore; + } + + public Double getNewsScore() { + return newsScore; + } + + public void setNewsScore(Double newsScore) { + this.newsScore = newsScore; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public List getIndustryLabel() { + return industryLabel; + } + + public void setIndustryLabel(List industryLabel) { + this.industryLabel = industryLabel; + } + + public List getIndustryConfidence() { + return industryConfidence; + } + + public void setIndustryConfidence(List industryConfidence) { + this.industryConfidence = industryConfidence; + } +} diff --git a/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsVO.java b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsVO.java index 97b64ff..c037dd7 100644 --- a/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsVO.java +++ b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsVO.java @@ -51,7 +51,9 @@ public class NewsVO { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date updateTime; - + + private Double score; + public NewsVO(News news) { this.id = news.getId(); this.title = news.getTitle(); @@ -59,6 +61,7 @@ public class NewsVO { this.createTime = news.getCreateTime(); this.publishTime = news.getPublishTime(); this.updateTime = news.getUpdateTime(); + this.score = news.getScore(); } public Long getId() { @@ -112,4 +115,12 @@ public class NewsVO { public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } + + public Double getScore() { + return score; + } + + public void setScore(Double score) { + this.score = score; + } } diff --git a/core/src/main/java/com/jinrui/reference/core/service/NewsInfoService.java b/core/src/main/java/com/jinrui/reference/core/service/NewsInfoService.java index 0020490..f9b0a5e 100644 --- a/core/src/main/java/com/jinrui/reference/core/service/NewsInfoService.java +++ b/core/src/main/java/com/jinrui/reference/core/service/NewsInfoService.java @@ -77,7 +77,7 @@ public class NewsInfoService { public ResultObject publish(String id, long editorId) { try { - GetResponse newsInfoResp = elasticsearchClient.get(g -> g.index(NewsInfo.INDEX_NAME).id(String.valueOf(id)), NewsInfo.class); + GetResponse newsInfoResp = elasticsearchClient.get(g -> g.index(NewsInfo.INDEX_NAME).id(id), NewsInfo.class); if (!newsInfoResp.found()) { return ResultObject.success(); } @@ -90,15 +90,14 @@ public class NewsInfoService { newsInfo.setStatus(1); } - News relateNews = newsMapper.getNewsDetail(newsInfo.getNewsId()); + News relateNews = newsMapper.getNewsDetailByNewsInfoId(id); - if (relateNews == null||!Objects.equals(relateNews.getTitle(), newsInfo.getTitle())) { - // 插入数据到News表中 + if (relateNews == null) { + // 插入数据到News表中,默认是未发布 News relNews = newsInfo.toNews(); + relNews.setStatus(1); relNews.setEditorId(editorId); newsMapper.saveNews(relNews); - newsInfo.setNewsId(relNews.getId()); - String industry = newsInfo.getIndustry(); if (!ObjectUtils.isEmpty(industry)) { @@ -119,19 +118,12 @@ public class NewsInfoService { } } } - } else { - if (newsInfo.getStatus().intValue() == 2) { - newsMapper.simplePublish(newsInfo.getNewsId(), editorId); - } else { - newsMapper.simpleUnpublish(newsInfo.getNewsId()); - } } NewsInfo publishedNewsInfo = new NewsInfo(); publishedNewsInfo.setStatus(newsInfo.getStatus()); - publishedNewsInfo.setNewsId(newsInfo.getNewsId()); - elasticsearchClient.update(e -> e.index(NewsInfo.INDEX_NAME).refresh(Refresh.True).id(String.valueOf(id)).doc(publishedNewsInfo), NewsInfo.class); + elasticsearchClient.update(e -> e.index(NewsInfo.INDEX_NAME).refresh(Refresh.True).id(id).doc(publishedNewsInfo), NewsInfo.class); } catch(IOException e) { log.error("全量资讯发布失败!", e); @@ -243,21 +235,20 @@ public class NewsInfoService { String id = saveNewsInfoDTO.getId(); try { - GetResponse getResp = elasticsearchClient.get(e -> e.index(NewsInfo.INDEX_NAME).id(String.valueOf(id)), NewsInfo.class); + GetResponse getResp = elasticsearchClient.get(e -> e.index(NewsInfo.INDEX_NAME).id(id), NewsInfo.class); if (getResp.found()) { NewsInfo newsInfo = getResp.source(); newsInfo.setId(id); - Long newsId = newsInfo.getNewsId(); - News relateNews = newsMapper.getNewsDetail(newsId); + News relateNews = newsMapper.getNewsDetailByNewsInfoId(id); - if (relateNews == null ||!Objects.equals(newsInfo.getTitle(), relateNews.getTitle())) { - News news = createRelateNews(saveNewsInfoDTO); - newsId = news.getId(); + if (relateNews == null) { + relateNews = createRelateNews(saveNewsInfoDTO); + NewsInfo updatedNewsInfo = toNewsInfo(relateNews.getId(), saveNewsInfoDTO); + elasticsearchClient.update(e -> e.index(NewsInfo.INDEX_NAME).id(updatedNewsInfo.getId()).doc(updatedNewsInfo).refresh(Refresh.True), NewsInfo.class); } else { - updateRelateNews(newsId, saveNewsInfoDTO); + saveNewsInfoDTO.setStatus(relateNews.getStatus()); + updateRelateNews(relateNews.getId(), saveNewsInfoDTO); } - NewsInfo updatedNewsInfo = toNewsInfo(newsId, saveNewsInfoDTO); - elasticsearchClient.update(e -> e.index(NewsInfo.INDEX_NAME).id(updatedNewsInfo.getId()).doc(updatedNewsInfo).refresh(Refresh.True), NewsInfo.class); } } catch(IOException e) { log.error("全量资讯更新异常!", e); @@ -364,6 +355,7 @@ public class NewsInfoService { private News createRelateNews(SaveNewsInfoDTO saveNewsInfoDTO) { News news = saveNewsInfoDTO.toNews(); + news.setStatus(1); newsMapper.saveNews(news); // 保存标签关系 diff --git a/core/src/main/java/com/jinrui/reference/core/service/NewsService.java b/core/src/main/java/com/jinrui/reference/core/service/NewsService.java index 3f3bd33..f1fdf6b 100644 --- a/core/src/main/java/com/jinrui/reference/core/service/NewsService.java +++ b/core/src/main/java/com/jinrui/reference/core/service/NewsService.java @@ -1,6 +1,8 @@ package com.jinrui.reference.core.service; import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -10,6 +12,7 @@ import java.util.Map; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,6 +26,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.jinrui.reference.core.mapper.ColumnMapper; import com.jinrui.reference.core.mapper.IndustryMapper; import com.jinrui.reference.core.mapper.NewsMapper; +import com.jinrui.reference.core.mapper.NewsTagsMapper; import com.jinrui.reference.core.mapper.TagMapper; import com.jinrui.reference.core.model.dto.news.SaveDraftColumn; import com.jinrui.reference.core.model.dto.news.SaveDraftColumnItem; @@ -40,6 +44,7 @@ import com.jinrui.reference.core.model.entity.NewsDraft; import com.jinrui.reference.core.model.entity.NewsIndustryRel; import com.jinrui.reference.core.model.entity.NewsInfo; import com.jinrui.reference.core.model.entity.NewsTagRel; +import com.jinrui.reference.core.model.entity.NewsTags; import com.jinrui.reference.core.model.entity.Tag; import com.jinrui.reference.core.model.vo.PageObject; import com.jinrui.reference.core.model.vo.ResultObject; @@ -50,6 +55,7 @@ import com.jinrui.reference.core.model.vo.news.NewsDetailIndustry; import com.jinrui.reference.core.model.vo.news.NewsDetailTag; import com.jinrui.reference.core.model.vo.news.NewsDetailTagItem; import com.jinrui.reference.core.model.vo.news.NewsDetailVO; +import com.jinrui.reference.core.model.vo.news.NewsScoreVO; import com.jinrui.reference.core.model.vo.news.NewsVO; import co.elastic.clients.elasticsearch.ElasticsearchClient; @@ -66,19 +72,22 @@ public class NewsService { private final TagMapper tagMapper; private final IndustryMapper industryMapper; private final ElasticsearchClient elasticsearchClient; + private final NewsTagsMapper newsTagsMapper; public NewsService(NewsMapper newsMapper, ColumnMapper columnMapper, ObjectMapper objectMapper, TagMapper tagMapper, IndustryMapper industryMapper, - ElasticsearchClient elasticsearchClient) { + ElasticsearchClient elasticsearchClient, + NewsTagsMapper newsTagsMapper) { this.newsMapper = newsMapper; this.columnMapper = columnMapper; this.objectMapper = objectMapper; this.tagMapper = tagMapper; this.industryMapper = industryMapper; this.elasticsearchClient = elasticsearchClient; + this.newsTagsMapper = newsTagsMapper; } public ResultObject publish(long id, long editorId) { @@ -90,14 +99,12 @@ public class NewsService { Integer status = news.getStatus(); if (status == 2) { newsMapper.simpleUnpublish(id); - syncStatusToNewsInfo(news.getNewsinfoId(), 1); return ResultObject.success(); } Long draftId = news.getDraftId(); if (draftId == null) { newsMapper.simplePublish(id, editorId); - syncStatusToNewsInfo(news.getNewsinfoId(), 2); return ResultObject.success(); } @@ -111,16 +118,6 @@ public class NewsService { return createPublish(editorId, saveNewsDTO); } - private void syncStatusToNewsInfo(String newsInfoId, Integer status) { - NewsInfo publishedNewsInfo = new NewsInfo(); - publishedNewsInfo.setStatus(status); - try { - elasticsearchClient.update(e -> e.index(NewsInfo.INDEX_NAME).refresh(Refresh.True).id(newsInfoId).doc(publishedNewsInfo), NewsInfo.class); - } catch(IOException e) { - log.error("资讯精选状态同步至全量资讯出错!", e); - } - } - public ResultObject detail(Long id) { News news = newsMapper.getById(id); if (news == null) { @@ -460,7 +457,8 @@ public class NewsService { } NewsInfo newsInfo = saveNewsDTO.toNewsInfo(); - newsInfo.setStatus(2); + // 状态不同步 +// newsInfo.setStatus(2); SaveDraftTag saveDraftTag = saveNewsDTO.getTag(); if (saveDraftTag != null && saveDraftTag.getSource() != null) { Tag sourceTag = tagMapper.queryById(saveDraftTag.getSource()); @@ -785,21 +783,24 @@ public class NewsService { } public PageObject queryNews(String keyword, String columnParam, Integer status, int page, int size, - Integer last, Integer current, String orderBy, String direction) { - if (StringUtils.hasText(orderBy)) { - switch (orderBy) { - case "publishTime": { - orderBy = "publish_time"; - break; - } - case "updateTime": { - orderBy = "update_time"; - break; - } - case "createTime": { - orderBy = "create_time"; - break; - } + Integer last, Integer current, String orderBy, Double minScore, Double maxScore) { + String orderByClause = null; + if (StringUtils.hasText(orderBy)) { + String orderByStr = orderBy; + try { + orderByStr = URLDecoder.decode(orderByStr, "UTF-8"); + } catch(UnsupportedEncodingException e) { + return PageObject.failedPage(400, "排序参数异常! orderBy = " + orderBy); + } + orderByStr = orderByStr.replace("publishTime", "publish_time").replace("updateTime", "update_time").replace("createTime", "create_time"); + orderByClause = Stream.of(orderByStr.split(";")).map(e -> { + String[] params = e.split("\\$"); + return "news." + params[0] + " " + params[1]; + }).collect(Collectors.joining(",")); + // 处理空值排在最后面的情况 + if (orderByStr.contains("score")) { + orderByClause = orderByClause.replace("news.score", "news_tags.news_score"); + orderByClause = " IF(ISNULL(news_tags.news_score), 1, 0) asc, " + orderByClause; } } int offset = 0; @@ -821,7 +822,7 @@ public class NewsService { List newsList; try { - newsList = newsMapper.queryNews(keyword, columnParam, status, last, orderBy, direction, size, offset); + newsList = newsMapper.queryNews(keyword, minScore, maxScore, columnParam, status, last, orderByClause, size, offset); } catch (Exception e) { log.error("搜索新闻异常!", e); return PageObject.failedPage(500, "服务器错误,请联系系统管理员!"); @@ -830,7 +831,7 @@ public class NewsService { PageObject pageObject = new PageObject<>(); if (page == 1) { try { - int total = newsMapper.queryTotal(keyword, columnParam, status); + int total = newsMapper.queryTotal(keyword,minScore, maxScore, columnParam, status); pageObject.setTotal(total); } catch (Exception e) { log.error("获取新闻总数异常!", e); @@ -898,4 +899,15 @@ public class NewsService { } return pageObject; } + + public ResultObject getScore(Long id) { + News news = newsMapper.getById(id); + String newsinfoId = news.getNewsinfoId(); + NewsTags newsTags = newsTagsMapper.getNewsTagsByNewsId(newsinfoId); + if (newsTags == null) { + return ResultObject.success(); + } + NewsScoreVO newsScoreVO = new NewsScoreVO(newsTags); + return ResultObject.success(newsScoreVO); + } } diff --git a/core/src/main/java/com/jinrui/reference/core/typehandler/JsonArrayTypeHandler.java b/core/src/main/java/com/jinrui/reference/core/typehandler/JsonArrayTypeHandler.java new file mode 100644 index 0000000..827d679 --- /dev/null +++ b/core/src/main/java/com/jinrui/reference/core/typehandler/JsonArrayTypeHandler.java @@ -0,0 +1,72 @@ +package com.jinrui.reference.core.typehandler; + +import java.io.IOException; +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Collections; +import java.util.List; + +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.springframework.util.ObjectUtils; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JsonArrayTypeHandler extends BaseTypeHandler> { + protected final ObjectMapper objectMapper = new ObjectMapper(); + protected final JavaType listType; + + public JsonArrayTypeHandler(Class clazz) { + listType = objectMapper.getTypeFactory().constructCollectionType(List.class, clazz); + } + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException { + try { + ps.setString(i, objectMapper.writeValueAsString(parameter)); + } catch (JsonProcessingException | SQLException e) { + e.printStackTrace(); + } + } + + @Override + public List getNullableResult(ResultSet rs, String columnName) throws SQLException { + final String json = rs.getString(columnName); + if (ObjectUtils.isEmpty(json)) { + return Collections.emptyList(); + } + // json.replaceAll("\"", "'") + return parseJson(json); + } + + private List parseJson(String json) { + try { + return objectMapper.readValue(json, new TypeReference>() {}); + } catch (IOException e) { + throw new RuntimeException("JSON 解析失败", e); + } + } + + @Override + public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + final String json = rs.getString(columnIndex); + if (ObjectUtils.isEmpty(json)) { + return Collections.emptyList(); + } + return parseJson(json); + } + + @Override + public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + final String json = cs.getString(columnIndex); + if (ObjectUtils.isEmpty(json)) { + return Collections.emptyList(); + } + return parseJson(json); + } +} \ No newline at end of file