From 8dc86e048217e2f2e7f894bf3605204a6714d276 Mon Sep 17 00:00:00 2001 From: Chopper Date: Mon, 25 Apr 2022 18:08:06 +0800 Subject: [PATCH] =?UTF-8?q?=E7=83=AD=E8=AF=8D=E5=8A=9F=E8=83=BD=E5=AE=8C?= =?UTF-8?q?=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DB/version4.2.4toMASTER.sql | 20 ++++--- .../java/cn/lili/common/utils/DateUtil.java | 4 +- .../search/entity/dos/HotWordsHistory.java | 23 +++++--- .../entity/dto/HotWordsSearchParams.java | 3 + .../search/mapper/HotWordsHistoryMapper.java | 2 +- .../search/service/HotWordsService.java | 9 +++ .../HotWordsHistoryServiceImpl.java | 56 ++++++------------- .../serviceimpl/HotWordsServiceImpl.java | 36 ++++++++++-- .../statistics/util/StatisticsDateUtil.java | 26 +++++++++ .../other/HotWordsManagerController.java | 10 +++- 10 files changed, 123 insertions(+), 66 deletions(-) diff --git a/DB/version4.2.4toMASTER.sql b/DB/version4.2.4toMASTER.sql index 7aad8be2..06e0fce2 100644 --- a/DB/version4.2.4toMASTER.sql +++ b/DB/version4.2.4toMASTER.sql @@ -4,13 +4,15 @@ ALTER TABLE li_member_sign DROP INDEX uk_member_day; ALTER TABLE li_member_sign add unique uk_member_day (member_id, day) COMMENT 'uk_member_day'; -/** 添加历史热词表 **/ + +-- ---------------------------- +-- Table structure for li_hot_words_history +-- ---------------------------- +DROP TABLE IF EXISTS `li_hot_words_history`; CREATE TABLE `li_hot_words_history` ( - `id` bigint NOT NULL COMMENT 'ID', - `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '创建者', - `create_time` datetime(6) DEFAULT NULL COMMENT '创建时间', - `delete_flag` bit(1) DEFAULT NULL COMMENT '是否删除', - `update_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '修改者', - `update_time` datetime(6) DEFAULT NULL COMMENT '修改时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; \ No newline at end of file + `id` bigint NOT NULL COMMENT 'ID', + `create_time` datetime(6) DEFAULT NULL COMMENT '创建时间', + `keywords` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '热词', + `score` int DEFAULT NULL COMMENT '热词分数', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin; diff --git a/framework/src/main/java/cn/lili/common/utils/DateUtil.java b/framework/src/main/java/cn/lili/common/utils/DateUtil.java index 11f31484..ec6c5ef4 100644 --- a/framework/src/main/java/cn/lili/common/utils/DateUtil.java +++ b/framework/src/main/java/cn/lili/common/utils/DateUtil.java @@ -29,9 +29,9 @@ public class DateUtil { return DateUtil.getDateline()/(60*24*60); } /** - * 当天的开始时间 + * 指定日的开始时间 * - * @return 今天开始时间 + * @return 指定日时间 */ public static Long getDayOfStart(Date date) { return date.getTime()/(60*24*60); diff --git a/framework/src/main/java/cn/lili/modules/search/entity/dos/HotWordsHistory.java b/framework/src/main/java/cn/lili/modules/search/entity/dos/HotWordsHistory.java index 2fee83e1..a012fc33 100644 --- a/framework/src/main/java/cn/lili/modules/search/entity/dos/HotWordsHistory.java +++ b/framework/src/main/java/cn/lili/modules/search/entity/dos/HotWordsHistory.java @@ -1,21 +1,15 @@ package cn.lili.modules.search.entity.dos; -import cn.lili.mybatis.BaseEntity; import cn.lili.mybatis.BaseIdEntity; -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.elasticsearch.annotations.DateFormat; -import org.springframework.data.elasticsearch.annotations.Field; -import org.springframework.data.elasticsearch.annotations.FieldType; import org.springframework.format.annotation.DateTimeFormat; +import java.io.Serializable; import java.util.Date; /** @@ -29,7 +23,7 @@ import java.util.Date; @AllArgsConstructor @NoArgsConstructor @TableName("li_hot_words_history") -public class HotWordsHistory extends BaseIdEntity { +public class HotWordsHistory extends BaseIdEntity implements Comparable, Serializable { /** * 词 @@ -41,7 +35,18 @@ public class HotWordsHistory extends BaseIdEntity { */ private Integer score; + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") - @DateTimeFormat(pattern = "yyyy-MM-dd") private Date createTime; + + public HotWordsHistory(String keywords, Integer score) { + this.keywords = keywords; + this.score = score; + } + + @Override + public int compareTo(HotWordsHistory hotWordsHistory) { + return hotWordsHistory.getScore() - this.score; + } } diff --git a/framework/src/main/java/cn/lili/modules/search/entity/dto/HotWordsSearchParams.java b/framework/src/main/java/cn/lili/modules/search/entity/dto/HotWordsSearchParams.java index 930b527b..61cd07c7 100644 --- a/framework/src/main/java/cn/lili/modules/search/entity/dto/HotWordsSearchParams.java +++ b/framework/src/main/java/cn/lili/modules/search/entity/dto/HotWordsSearchParams.java @@ -52,6 +52,9 @@ public class HotWordsSearchParams extends PageVO { private Date endTime; + //搜索热词数量 + private Integer top = 50; + public QueryWrapper queryWrapper() { //组织查询时间 QueryWrapper queryWrapper = new QueryWrapper<>(); diff --git a/framework/src/main/java/cn/lili/modules/search/mapper/HotWordsHistoryMapper.java b/framework/src/main/java/cn/lili/modules/search/mapper/HotWordsHistoryMapper.java index 31750ae8..97a1d90c 100644 --- a/framework/src/main/java/cn/lili/modules/search/mapper/HotWordsHistoryMapper.java +++ b/framework/src/main/java/cn/lili/modules/search/mapper/HotWordsHistoryMapper.java @@ -26,7 +26,7 @@ public interface HotWordsHistoryMapper extends BaseMapper { * @param queryWrapper 查询条件 * @return 订单统计列表 */ - @Select("SELECT score,keywords,DATE_FORMAT(create_time,'%Y-%m-%d') AS create_time FROM li_hot_words_history " +" ${ew.customSqlSegment}") + @Select("SELECT sum(score) as score,keywords FROM li_hot_words_history " +" ${ew.customSqlSegment}") List statistics(@Param(Constants.WRAPPER) Wrapper queryWrapper); } diff --git a/framework/src/main/java/cn/lili/modules/search/service/HotWordsService.java b/framework/src/main/java/cn/lili/modules/search/service/HotWordsService.java index d69c0f27..a13c9e7e 100644 --- a/framework/src/main/java/cn/lili/modules/search/service/HotWordsService.java +++ b/framework/src/main/java/cn/lili/modules/search/service/HotWordsService.java @@ -1,5 +1,6 @@ package cn.lili.modules.search.service; +import cn.lili.modules.search.entity.dos.HotWordsHistory; import cn.lili.modules.search.entity.dto.HotWordsDTO; import java.util.List; @@ -21,6 +22,14 @@ public interface HotWordsService { */ List getHotWords(Integer count); + /** + * 获取热门关键词 + * + * @param count 热词数量 + * @return 热词集合 + */ + List getHotWordsVO(Integer count); + /** * 设置热门关键词 * diff --git a/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsHistoryServiceImpl.java b/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsHistoryServiceImpl.java index e55aee93..c3091ef7 100644 --- a/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsHistoryServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsHistoryServiceImpl.java @@ -1,11 +1,16 @@ package cn.lili.modules.search.serviceimpl; +import cn.lili.common.utils.DateUtil; import cn.lili.modules.search.entity.dos.HotWordsHistory; import cn.lili.modules.search.entity.dto.HotWordsSearchParams; import cn.lili.modules.search.mapper.HotWordsHistoryMapper; import cn.lili.modules.search.service.HotWordsHistoryService; +import cn.lili.modules.search.service.HotWordsService; +import cn.lili.modules.statistics.entity.enums.SearchTypeEnum; +import cn.lili.modules.statistics.util.StatisticsDateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @@ -19,55 +24,30 @@ import java.util.*; @Service public class HotWordsHistoryServiceImpl extends ServiceImpl implements HotWordsHistoryService { + @Autowired + private HotWordsService hotWordsService; + @Override public List statistics(HotWordsSearchParams hotWordsSearchParams) { + if (hotWordsSearchParams.getSearchType().equals(SearchTypeEnum.TODAY.name())) { + return hotWordsService.getHotWordsVO(hotWordsSearchParams.getTop()); + } QueryWrapper queryWrapper = hotWordsSearchParams.queryWrapper(); + queryWrapper.groupBy("keywords"); + queryWrapper.orderByDesc("score"); + queryWrapper.last("limit " + hotWordsSearchParams.getTop()); List list = baseMapper.statistics(queryWrapper); - return initData(list, hotWordsSearchParams); + return list; } @Override public List queryByDay(Date queryTime) { QueryWrapper queryWrapper = new QueryWrapper(); - queryWrapper.eq("create_time", queryTime); + + Date[] dates = StatisticsDateUtil.getDateArray(queryTime); + queryWrapper.between("create_time", dates[0], dates[1]); return list(queryWrapper); } - /** - * 历史统计查询 - * - * @param source - * @return - */ - private List initData(List source, HotWordsSearchParams hotWordsSearchParams) { - - //结果集 - List onlineMemberVOS = new ArrayList<>(); - //时间初始化 - Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT-8:00")); - calendar.setTime(hotWordsSearchParams.getStartTIme()); - //判定是否超出时间 如果结束时间在循环时间之后,则跳出循环 - while (hotWordsSearchParams.getEndTime().after(calendar.getTime())) { - -// //筛选时间相等的查询结果 - Optional first = source.stream().filter(item -> item.getCreateTime().equals(calendar.getTime())).findFirst(); - if (first.isPresent()) { - onlineMemberVOS.add(first.get()); - } else { - onlineMemberVOS.add(new HotWordsHistory(hotWordsSearchParams.getKeywords(), 0, calendar.getTime())); - } -// for (HotWordsHistory hotWordsHistory : source) { -// System.out.println(hotWordsHistory.getCreateTime().getTime() + "-" + calendar.getTime().getTime()); -// if (hotWordsHistory.getCreateTime().equals(calendar.getTime())) { -// onlineMemberVOS.add(hotWordsHistory); -// } else { -// onlineMemberVOS.add(new HotWordsHistory(hotWordsSearchParams.getKeywords(), 0, calendar.getTime())); -// } -// } - - calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1); - } - return onlineMemberVOS; - } } diff --git a/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsServiceImpl.java b/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsServiceImpl.java index 26b29ebe..d036f96e 100644 --- a/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/search/serviceimpl/HotWordsServiceImpl.java @@ -2,20 +2,19 @@ package cn.lili.modules.search.serviceimpl; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; +import cn.lili.modules.search.entity.dos.HotWordsHistory; import cn.lili.modules.search.entity.dto.HotWordsDTO; import cn.lili.modules.search.mapper.HotWordsHistoryMapper; import cn.lili.modules.search.service.HotWordsService; import cn.lili.modules.system.entity.dos.Setting; import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.service.SettingService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.ZSetOperations; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Set; +import java.util.*; /** * HotWordsServiceImpl @@ -24,6 +23,7 @@ import java.util.Set; * @version v1.0 * 2022-04-14 09:35 */ +@Slf4j @Service public class HotWordsServiceImpl implements HotWordsService { @@ -32,6 +32,7 @@ public class HotWordsServiceImpl implements HotWordsService { */ @Autowired private Cache cache; + @Override public List getHotWords(Integer count) { if (count == null) { @@ -50,6 +51,33 @@ public class HotWordsServiceImpl implements HotWordsService { return hotWords; } + @Override + public List getHotWordsVO(Integer count) { + if (count == null) { + count = 50; + } + List hotWords = new ArrayList<>(); + // redis 排序中,下标从0开始,所以这里需要 -1 处理 + count = count - 1; + Set> set = cache.reverseRangeWithScores(CachePrefix.HOT_WORD.getPrefix(), count); + if (set == null || set.isEmpty()) { + return new ArrayList<>(); + } + for (ZSetOperations.TypedTuple defaultTypedTuple : set) { + try { + hotWords.add(new HotWordsHistory(defaultTypedTuple.getValue().toString(), + defaultTypedTuple.getScore().intValue())); + } catch (Exception e) { + log.error("读取热词错误", e); + } + + } + + + Collections.sort(hotWords); + return hotWords; + } + @Override public void setHotWords(HotWordsDTO hotWords) { cache.incrementScore(CachePrefix.HOT_WORD.getPrefix(), hotWords.getKeywords(), hotWords.getPoint()); diff --git a/framework/src/main/java/cn/lili/modules/statistics/util/StatisticsDateUtil.java b/framework/src/main/java/cn/lili/modules/statistics/util/StatisticsDateUtil.java index 8161765d..d97b1b82 100644 --- a/framework/src/main/java/cn/lili/modules/statistics/util/StatisticsDateUtil.java +++ b/framework/src/main/java/cn/lili/modules/statistics/util/StatisticsDateUtil.java @@ -121,4 +121,30 @@ public class StatisticsDateUtil { } } + + /** + * 根据一个日期,获取这一天的开始时间和结束时间 + * + * @param queryDate + * @return + */ + public static Date[] getDateArray(Date queryDate) { + + Date[] dateArray = new Date[2]; + Calendar calendar = Calendar.getInstance(); + calendar.setTime(queryDate); + //时间归到今天凌晨0点 + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + dateArray[0] = calendar.getTime(); + + calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 1); + calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 1); + + dateArray[1] = calendar.getTime(); + return dateArray; + } + } diff --git a/manager-api/src/main/java/cn/lili/controller/other/HotWordsManagerController.java b/manager-api/src/main/java/cn/lili/controller/other/HotWordsManagerController.java index 79240ea9..a8b5f01a 100644 --- a/manager-api/src/main/java/cn/lili/controller/other/HotWordsManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/other/HotWordsManagerController.java @@ -2,6 +2,7 @@ package cn.lili.controller.other; import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.search.entity.dos.HotWordsHistory; import cn.lili.modules.search.entity.dto.HotWordsDTO; import cn.lili.modules.search.entity.dto.HotWordsSearchParams; import cn.lili.modules.search.service.HotWordsHistoryService; @@ -15,7 +16,10 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.validation.constraints.NotNull; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; +import java.util.List; /** * 管理端,热词管理 @@ -58,7 +62,9 @@ public class HotWordsManagerController { @ApiOperation(value = "历史热词") @GetMapping("/history") public ResultMessage deleteWords(HistorySearchParams historySearchParams) { - return ResultUtil.data(hotWordsHistoryService.queryByDay(historySearchParams.getDate())); + List hotWordsHistoryList = hotWordsHistoryService.queryByDay(historySearchParams.getDate()); + Collections.sort(hotWordsHistoryList); + return ResultUtil.data(hotWordsHistoryList); } @ApiOperation(value = "热词统计") @@ -66,8 +72,6 @@ public class HotWordsManagerController { public ResultMessage deleteWords(HotWordsSearchParams hotWordsSearchParams) { return ResultUtil.data(hotWordsHistoryService.statistics(hotWordsSearchParams)); } - - } @Data