Commit 315712d2 by 田超

Merge branch 'feature/1004334' into 'master'

feat: [1004334] 在编辑端应用工具,优先展示书刊高频应用

See merge request rays/pcloud-book!1208
parents 2a3e411b b677322f
...@@ -157,6 +157,11 @@ public class BookConstant { ...@@ -157,6 +157,11 @@ public class BookConstant {
public static final Integer zero = 0; public static final Integer zero = 0;
/** /**
* 热门应用信息
*/
public static final String BOOK_HOT_APP = "BOOK_CHANNEL:HOT_APP_TOP_5_KEY:";
/**
* 微信群默认头像 * 微信群默认头像
*/ */
public static final List<String> DEFAULT_HEADURL =Arrays.asList( public static final List<String> DEFAULT_HEADURL =Arrays.asList(
......
...@@ -21,6 +21,7 @@ import org.springframework.context.annotation.Bean; ...@@ -21,6 +21,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource; import org.springframework.context.annotation.PropertySource;
import org.springframework.scheduling.annotation.EnableScheduling;
import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.builders.RequestHandlerSelectors;
...@@ -41,6 +42,7 @@ import java.util.Map; ...@@ -41,6 +42,7 @@ import java.util.Map;
@PropertySource({"classpath:properties/book.properties", "classpath:public_system.properties"}) @PropertySource({"classpath:properties/book.properties", "classpath:public_system.properties"})
@Configuration @Configuration
@EnableSwagger2 @EnableSwagger2
@EnableScheduling
@MapperScan(basePackages = {"com.pcloud.book.*.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory") @MapperScan(basePackages = {"com.pcloud.book.*.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory")
public class BookApplication { public class BookApplication {
......
...@@ -20,6 +20,7 @@ import com.pcloud.channelcenter.wechat.dto.ListIsInBookParam; ...@@ -20,6 +20,7 @@ import com.pcloud.channelcenter.wechat.dto.ListIsInBookParam;
import com.pcloud.channelcenter.wechat.service.AccountSettingService; import com.pcloud.channelcenter.wechat.service.AccountSettingService;
import com.pcloud.channelcenter.wechat.service.MessageService; import com.pcloud.channelcenter.wechat.service.MessageService;
import com.pcloud.channelcenter.wechat.vo.BookServeVO; import com.pcloud.channelcenter.wechat.vo.BookServeVO;
import com.pcloud.channelcenter.qrcode.dto.AppTypeUseCount;
import com.pcloud.common.core.aspect.ParamLog; import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.core.constant.SystemCode; import com.pcloud.common.core.constant.SystemCode;
import com.pcloud.common.dto.ResponseDto; import com.pcloud.common.dto.ResponseDto;
...@@ -467,4 +468,15 @@ public class QrcodeSceneConsr { ...@@ -467,4 +468,15 @@ public class QrcodeSceneConsr {
} }
return list; return list;
} }
@ParamLog("获取公众号码热门应用")
public List<AppTypeUseCount> listAppTypeCount(){
List<AppTypeUseCount> list = new ArrayList<>();
try{
list = ResponseHandleUtil.parseList(qrcodeSceneService.listAppTypeCount(), AppTypeUseCount.class);
}catch (Exception e){
LOGGER.error("【获取公众号码热门应用】 请求失败,<ERROR>.[listAppTypeCount]:{}", e.getMessage(), e);
}
return list;
}
} }
...@@ -27,6 +27,7 @@ import com.pcloud.book.group.dto.GroupCipherDTO; ...@@ -27,6 +27,7 @@ import com.pcloud.book.group.dto.GroupCipherDTO;
import com.pcloud.book.group.dto.GroupQrcodeDTO; import com.pcloud.book.group.dto.GroupQrcodeDTO;
import com.pcloud.book.group.dto.GroupStoreMyPayDto; import com.pcloud.book.group.dto.GroupStoreMyPayDto;
import com.pcloud.book.group.dto.GroupUseDTO; import com.pcloud.book.group.dto.GroupUseDTO;
import com.pcloud.book.group.dto.HotAppDTO;
import com.pcloud.book.group.dto.JoinGroupCipherDTO; import com.pcloud.book.group.dto.JoinGroupCipherDTO;
import com.pcloud.book.group.dto.LabelUserCountDTO; import com.pcloud.book.group.dto.LabelUserCountDTO;
import com.pcloud.book.group.dto.LargeTempletDTO; import com.pcloud.book.group.dto.LargeTempletDTO;
...@@ -1040,4 +1041,6 @@ public interface BookGroupBiz { ...@@ -1040,4 +1041,6 @@ public interface BookGroupBiz {
BookAppletSceneDTO getOneBookAppletBySceneIds(List<Long> sceneIds); BookAppletSceneDTO getOneBookAppletBySceneIds(List<Long> sceneIds);
Long getRightsSettingId4Book(Long adviserId, Long channelId, Long bookId); Long getRightsSettingId4Book(Long adviserId, Long channelId, Long bookId);
List<HotAppDTO> listHotApp();
} }
package com.pcloud.book.group.biz.impl; package com.pcloud.book.group.biz.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
...@@ -9,6 +10,7 @@ import com.google.common.collect.Maps; ...@@ -9,6 +10,7 @@ import com.google.common.collect.Maps;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.pcloud.analysisengine.browse.dto.GroupBrowseStatisticVO; import com.pcloud.analysisengine.browse.dto.GroupBrowseStatisticVO;
import com.pcloud.appcenter.app.dto.AppDto; import com.pcloud.appcenter.app.dto.AppDto;
import com.pcloud.appcenter.app.dto.AppTypeDto;
import com.pcloud.appcenter.assist.dto.AssistTempletDTO; import com.pcloud.appcenter.assist.dto.AssistTempletDTO;
import com.pcloud.appcenter.base.dto.AppPriceCacheDTO; import com.pcloud.appcenter.base.dto.AppPriceCacheDTO;
import com.pcloud.appcenter.cache.service.AppPriceCacheService; import com.pcloud.appcenter.cache.service.AppPriceCacheService;
...@@ -73,6 +75,7 @@ import com.pcloud.book.group.dao.CopyCipherRecordDao; ...@@ -73,6 +75,7 @@ import com.pcloud.book.group.dao.CopyCipherRecordDao;
import com.pcloud.book.group.dao.GroupQrcodeDao; import com.pcloud.book.group.dao.GroupQrcodeDao;
import com.pcloud.book.group.dao.GroupQrcodeStyleDao; import com.pcloud.book.group.dao.GroupQrcodeStyleDao;
import com.pcloud.book.group.dao.JoinGroupCipherDao; import com.pcloud.book.group.dao.JoinGroupCipherDao;
import com.pcloud.book.group.dto.HotAppDTO;
import com.pcloud.book.group.mapper.MpServiceMappingMapper; import com.pcloud.book.group.mapper.MpServiceMappingMapper;
import com.pcloud.book.group.dao.PushBookGroupUpdateDao; import com.pcloud.book.group.dao.PushBookGroupUpdateDao;
import com.pcloud.book.group.dao.TempletRelevanceDao; import com.pcloud.book.group.dao.TempletRelevanceDao;
...@@ -201,6 +204,7 @@ import com.pcloud.channelcenter.base.constants.ChannelConstants; ...@@ -201,6 +204,7 @@ import com.pcloud.channelcenter.base.constants.ChannelConstants;
import com.pcloud.channelcenter.base.constants.ChannelEnum; import com.pcloud.channelcenter.base.constants.ChannelEnum;
import com.pcloud.channelcenter.base.constants.MessageFromTypeEnum; import com.pcloud.channelcenter.base.constants.MessageFromTypeEnum;
import com.pcloud.channelcenter.base.exceptions.ChannelBizException; import com.pcloud.channelcenter.base.exceptions.ChannelBizException;
import com.pcloud.channelcenter.qrcode.dto.AppTypeUseCount;
import com.pcloud.channelcenter.qrcode.dto.GroupQrcodeVO; import com.pcloud.channelcenter.qrcode.dto.GroupQrcodeVO;
import com.pcloud.channelcenter.qrcode.dto.QrcodeSceneDto; import com.pcloud.channelcenter.qrcode.dto.QrcodeSceneDto;
import com.pcloud.channelcenter.wechat.dto.AccountSettingDto; import com.pcloud.channelcenter.wechat.dto.AccountSettingDto;
...@@ -307,12 +311,14 @@ import java.util.Optional; ...@@ -307,12 +311,14 @@ import java.util.Optional;
import java.util.Random; import java.util.Random;
import java.util.Set; import java.util.Set;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; import java.util.concurrent.FutureTask;
import java.util.Set; import java.util.Set;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
...@@ -6511,4 +6517,98 @@ public class BookGroupBizImpl implements BookGroupBiz { ...@@ -6511,4 +6517,98 @@ public class BookGroupBizImpl implements BookGroupBiz {
return Optional.ofNullable(rightsSettingDto).map(RightsSettingDto::getId).orElse(bookBiz.getDefaultRightsSettingId()); return Optional.ofNullable(rightsSettingDto).map(RightsSettingDto::getId).orElse(bookBiz.getDefaultRightsSettingId());
} }
@Override
public List<HotAppDTO> listHotApp() {
String cacheKey = BookConstant.BOOK_HOT_APP + DateUtil.format(new Date(), DatePattern.NORM_DATE_FORMAT);
if (JedisClusterUtils.exists(cacheKey)) {
String json = JedisClusterUtils.get(cacheKey);
if (StrUtil.isNotBlank(json)){
List<HotAppDTO> list = new ArrayList<>();
try{
list = JSONObject.parseArray(json,HotAppDTO.class);
}catch (Exception e){
LOGGER.warn("[listHotApp]json转换失败 json:{}", json, e);
}
if (CollUtil.isNotEmpty(list)) return list.stream().sorted(Comparator.comparing(HotAppDTO::getCount).reversed()).limit(5).collect(Collectors.toList());;
}
}
String cacheKeyOld = BookConstant.BOOK_HOT_APP + DateUtil.format(DateUtil.yesterday(), DatePattern.NORM_DATE_FORMAT);
// 存在旧数据 计算应用热度值作为增长数据
boolean hasOldData = JedisClusterUtils.exists(cacheKeyOld);
Map<String, Integer> oldMap = new HashMap<>();
if (hasOldData) {
String oldJson = JedisClusterUtils.get(cacheKeyOld);
if (StrUtil.isNotBlank(oldJson)){
List<HotAppDTO> dtoList = new ArrayList<>();
try{
dtoList = JSONObject.parseArray(oldJson,HotAppDTO.class);
}catch (Exception e){
hasOldData = false;
LOGGER.warn("[listHotApp]json转换失败 oldJson:{}", oldJson, e);
}
oldMap = Optional.ofNullable(dtoList.stream().filter(x -> Objects.nonNull(x) && Objects.nonNull(x.getTypeCode()))
.collect(Collectors.toMap(HotAppDTO::getTypeCode, HotAppDTO::getCount))).orElse(new HashMap<>());
}
}
// 不存在旧数据则 直接查询旧数据
CompletableFuture<Map<String, AppTypeUseCount>> channel = CompletableFuture.supplyAsync(() -> {
List<AppTypeUseCount> counts = qrcodeSceneConsr.listAppTypeCount();
return counts.stream().filter(x -> Objects.nonNull(x) && Objects.nonNull(x.getTypeCode()))
.collect(Collectors.toMap(AppTypeUseCount::getTypeCode, t -> t));
});
CompletableFuture<Map<String, Integer>> bookCount = CompletableFuture.supplyAsync(() -> {
List<HotAppDTO> hotAppDTOS = Optional.ofNullable(bookGroupDao.listHotApp()).orElse(new ArrayList<>());
return hotAppDTOS.stream().filter(x -> Objects.nonNull(x) && Objects.nonNull(x.getTypeCode()))
.collect(Collectors.toMap(HotAppDTO::getTypeCode, HotAppDTO::getCount));
});
CompletableFuture<Map<String, Integer>> bookIncrement = CompletableFuture.supplyAsync(() -> {
List<HotAppDTO> hotAppDTOS = Optional.ofNullable(bookGroupDao.listHotAppIncrement()).orElse(new ArrayList<>());
return hotAppDTOS.stream().filter(x -> Objects.nonNull(x) && Objects.nonNull(x.getTypeCode()))
.collect(Collectors.toMap(HotAppDTO::getTypeCode, HotAppDTO::getIncrement));
});
CompletableFuture<Map<String, AppTypeDto>> appInfo = CompletableFuture.supplyAsync(() -> appConsr.listAllCode());
// 聚合
CompletableFuture<Void> completableFuture = CompletableFuture.allOf(channel, bookCount, bookIncrement, appInfo);
try {
completableFuture.get();
Map<String, AppTypeUseCount> channelMap = Optional.ofNullable(channel.get()).orElse(new HashMap<>());
Map<String, Integer> bookCountMap = Optional.ofNullable(bookCount.get()).orElse(new HashMap<>());
Map<String, Integer> bookIncrementMap = Optional.ofNullable(bookIncrement.get()).orElse(new HashMap<>());
Map<String, AppTypeDto> appInfoMap = Optional.ofNullable(appInfo.get()).orElse(new HashMap<>());
List<HotAppDTO> hotAppDTOS = new ArrayList<>();
if (appInfoMap.isEmpty()) return hotAppDTOS;
for (String key : appInfoMap.keySet()) {
if (Objects.isNull(key)) continue;
HotAppDTO hotAppDTO = new HotAppDTO();
hotAppDTO.setTypeName(Optional.ofNullable(appInfoMap.get(key)).map(AppTypeDto::getTypeName).orElse(""));
hotAppDTO.setTypeCode(key);
hotAppDTO.setCount(
Optional.ofNullable(channelMap.get(key)).map(AppTypeUseCount::getCount).orElse(0) +
Optional.ofNullable(bookCountMap.get(key)).orElse(0)
);
if (hasOldData){
hotAppDTO.setIncrement(hotAppDTO.getCount() - Optional.ofNullable(oldMap.get(key)).orElse(0));
}else {
hotAppDTO.setIncrement(
Optional.ofNullable(channelMap.get(key)).map(AppTypeUseCount::getIncrement).orElse(0) +
Optional.ofNullable(bookIncrementMap.get(key)).orElse(0)
);
}
hotAppDTOS.add(hotAppDTO);
}
JedisClusterUtils.set(cacheKey, JSONObject.toJSONString(hotAppDTOS), 48 * 60 * 60);
return hotAppDTOS.stream().sorted(Comparator.comparing(HotAppDTO::getCount).reversed()).limit(5).collect(Collectors.toList());
} catch (InterruptedException | ExecutionException e) {
LOGGER.warn("listHotApp 查询热门APP信息失败");
}
return new ArrayList<>();
}
} }
...@@ -3,6 +3,7 @@ package com.pcloud.book.group.dao; ...@@ -3,6 +3,7 @@ package com.pcloud.book.group.dao;
import com.pcloud.book.group.dto.AgentStatisticsInfoDTO; import com.pcloud.book.group.dto.AgentStatisticsInfoDTO;
import com.pcloud.book.group.dto.BookGroupDTO; import com.pcloud.book.group.dto.BookGroupDTO;
import com.pcloud.book.group.dto.BookGroupStatistic4AgentDTO; import com.pcloud.book.group.dto.BookGroupStatistic4AgentDTO;
import com.pcloud.book.group.dto.HotAppDTO;
import com.pcloud.book.group.dto.PersonalQrcodeDTO; import com.pcloud.book.group.dto.PersonalQrcodeDTO;
import com.pcloud.book.group.dto.QrcodeNameAndProIdDTO; import com.pcloud.book.group.dto.QrcodeNameAndProIdDTO;
import com.pcloud.book.group.dto.TopAgentBookGroupDTO; import com.pcloud.book.group.dto.TopAgentBookGroupDTO;
...@@ -377,4 +378,8 @@ public interface BookGroupDao extends BaseDao<BookGroup> { ...@@ -377,4 +378,8 @@ public interface BookGroupDao extends BaseDao<BookGroup> {
List<String> getWxUserInAgents(List<Long> agentIds); List<String> getWxUserInAgents(List<Long> agentIds);
List<Long> getBookGroupIdInAgents(List<Long> agentIds); List<Long> getBookGroupIdInAgents(List<Long> agentIds);
List<HotAppDTO> listHotApp();
List<HotAppDTO> listHotAppIncrement();
} }
...@@ -4,6 +4,7 @@ import com.pcloud.book.group.dao.BookGroupDao; ...@@ -4,6 +4,7 @@ import com.pcloud.book.group.dao.BookGroupDao;
import com.pcloud.book.group.dto.AgentStatisticsInfoDTO; import com.pcloud.book.group.dto.AgentStatisticsInfoDTO;
import com.pcloud.book.group.dto.BookGroupDTO; import com.pcloud.book.group.dto.BookGroupDTO;
import com.pcloud.book.group.dto.BookGroupStatistic4AgentDTO; import com.pcloud.book.group.dto.BookGroupStatistic4AgentDTO;
import com.pcloud.book.group.dto.HotAppDTO;
import com.pcloud.book.group.dto.PersonalQrcodeDTO; import com.pcloud.book.group.dto.PersonalQrcodeDTO;
import com.pcloud.book.group.dto.QrcodeNameAndProIdDTO; import com.pcloud.book.group.dto.QrcodeNameAndProIdDTO;
import com.pcloud.book.group.dto.TopAgentBookGroupDTO; import com.pcloud.book.group.dto.TopAgentBookGroupDTO;
...@@ -494,4 +495,14 @@ public class BookGroupDaoImpl extends BaseDaoImpl<BookGroup> implements BookGrou ...@@ -494,4 +495,14 @@ public class BookGroupDaoImpl extends BaseDaoImpl<BookGroup> implements BookGrou
paramMap.put("agentIds", agentIds); paramMap.put("agentIds", agentIds);
return super.getSqlSession().selectList(getStatement("getBookGroupIdInAgents"), paramMap); return super.getSqlSession().selectList(getStatement("getBookGroupIdInAgents"), paramMap);
} }
@Override
public List<HotAppDTO> listHotApp() {
return getSqlSession().selectList(getStatement("listHotApp"));
}
@Override
public List<HotAppDTO> listHotAppIncrement() {
return getSqlSession().selectList(getStatement("listHotAppIncrement"));
}
} }
package com.pcloud.book.group.dto;
import lombok.Data;
@Data
public class HotAppDTO {
private String typeName;
private String typeCode;
private Integer count;
private Integer increment;
}
...@@ -5,6 +5,7 @@ import com.pcloud.book.group.dto.BookAppletSceneDTO; ...@@ -5,6 +5,7 @@ import com.pcloud.book.group.dto.BookAppletSceneDTO;
import com.pcloud.book.group.dto.BookGroupCreateDTO; import com.pcloud.book.group.dto.BookGroupCreateDTO;
import com.pcloud.book.group.dto.BookGroupDTO; import com.pcloud.book.group.dto.BookGroupDTO;
import com.pcloud.book.group.dto.ChangeQrCodeTypeDto; import com.pcloud.book.group.dto.ChangeQrCodeTypeDto;
import com.pcloud.book.group.dto.HotAppDTO;
import com.pcloud.book.group.dto.SelfBookGroupStParamDTO; import com.pcloud.book.group.dto.SelfBookGroupStParamDTO;
import com.pcloud.book.group.dto.UserSelectParamDTO; import com.pcloud.book.group.dto.UserSelectParamDTO;
import com.pcloud.book.group.entity.BookGroup; import com.pcloud.book.group.entity.BookGroup;
...@@ -818,4 +819,9 @@ public interface BookGroupFacade { ...@@ -818,4 +819,9 @@ public interface BookGroupFacade {
@ApiOperation("书刊创建RAYS码-支持1对多") @ApiOperation("书刊创建RAYS码-支持1对多")
@PostMapping("createBookGroup") @PostMapping("createBookGroup")
ResponseDto<?> createBookGroup(@RequestHeader("token") String token, @RequestBody @Validated BookGroupCreateDTO bookGroupCreateDTO); ResponseDto<?> createBookGroup(@RequestHeader("token") String token, @RequestBody @Validated BookGroupCreateDTO bookGroupCreateDTO);
@ApiOperation("获取热门应用")
@GetMapping("/listHotApp")
ResponseDto<List<HotAppDTO>> listHotApp();
} }
package com.pcloud.book.group.facade.impl; package com.pcloud.book.group.facade.impl;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import com.pcloud.book.base.exception.BookBizException; import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.book.constant.BookConstant;
import com.pcloud.book.book.dto.MapResourceTotalCountDTO; import com.pcloud.book.book.dto.MapResourceTotalCountDTO;
import com.pcloud.book.group.biz.BookGroupBiz; import com.pcloud.book.group.biz.BookGroupBiz;
import com.pcloud.book.group.biz.BookGroupClassifyBiz; import com.pcloud.book.group.biz.BookGroupClassifyBiz;
...@@ -12,6 +15,7 @@ import com.pcloud.book.group.dto.BookGroupCreateDTO; ...@@ -12,6 +15,7 @@ import com.pcloud.book.group.dto.BookGroupCreateDTO;
import com.pcloud.book.group.dto.BookGroupDTO; import com.pcloud.book.group.dto.BookGroupDTO;
import com.pcloud.book.group.dto.ChangeQrCodeTypeDto; import com.pcloud.book.group.dto.ChangeQrCodeTypeDto;
import com.pcloud.book.group.dto.GroupStoreMyPayDto; import com.pcloud.book.group.dto.GroupStoreMyPayDto;
import com.pcloud.book.group.dto.HotAppDTO;
import com.pcloud.book.group.dto.SelfBookGroupStParamDTO; import com.pcloud.book.group.dto.SelfBookGroupStParamDTO;
import com.pcloud.book.group.dto.UserSelectParamDTO; import com.pcloud.book.group.dto.UserSelectParamDTO;
import com.pcloud.book.group.entity.BookGroup; import com.pcloud.book.group.entity.BookGroup;
...@@ -45,6 +49,7 @@ import com.pcloud.common.page.PageBeanNew; ...@@ -45,6 +49,7 @@ import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.page.PageParam; import com.pcloud.common.page.PageParam;
import com.pcloud.common.permission.PermissionException; import com.pcloud.common.permission.PermissionException;
import com.pcloud.common.utils.SessionUtil; import com.pcloud.common.utils.SessionUtil;
import com.pcloud.common.utils.cache.redis.JedisClusterUtils;
import com.pcloud.common.utils.cookie.Cookie; import com.pcloud.common.utils.cookie.Cookie;
import com.pcloud.common.utils.nginx.NginxUtils; import com.pcloud.common.utils.nginx.NginxUtils;
import com.pcloud.common.utils.string.StringUtil; import com.pcloud.common.utils.string.StringUtil;
...@@ -71,6 +76,7 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -71,6 +76,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -1364,4 +1370,18 @@ public class BookGroupFacadeImpl implements BookGroupFacade { ...@@ -1364,4 +1370,18 @@ public class BookGroupFacadeImpl implements BookGroupFacade {
bookGroupCreateDTO.setAdviserId(adviserId); bookGroupCreateDTO.setAdviserId(adviserId);
return new ResponseDto<>(bookGroupBiz.createBookGroup(bookGroupCreateDTO)); return new ResponseDto<>(bookGroupBiz.createBookGroup(bookGroupCreateDTO));
} }
@Override
@GetMapping("/listHotApp")
public ResponseDto<List<HotAppDTO>> listHotApp() {
return new ResponseDto<>(bookGroupBiz.listHotApp());
}
@GetMapping("/testListHotApp")
public void testListHotApp(){
if (JedisClusterUtils.exists(BookConstant.BOOK_HOT_APP + DateUtil.format(DateUtil.yesterday(), DatePattern.NORM_DATE_FORMAT))) return;
JedisClusterUtils.set(BookConstant.BOOK_HOT_APP + DateUtil.format(DateUtil.yesterday(), DatePattern.NORM_DATE_FORMAT),
"[{\"count\":32,\"increment\":0,\"typeCode\":\"MATCH_LISTEN\",\"typeName\":\"配套听力\"},{\"count\":209,\"increment\":0,\"typeCode\":\"VIDEO\",\"typeName\":\"视频\"},{\"count\":16,\"increment\":0,\"typeCode\":\"COURSE_WARE\",\"typeName\":\"课件\"},{\"count\":13,\"increment\":0,\"typeCode\":\"WORD_DICTATION\",\"typeName\":\"生词听写\"},{\"count\":81,\"increment\":0,\"typeCode\":\"AUDIO\",\"typeName\":\"音频\"},{\"count\":19,\"increment\":0,\"typeCode\":\"SPECIAL\",\"typeName\":\"专题拓展\"},{\"count\":9,\"increment\":0,\"typeCode\":\"STROKE_ORDER\",\"typeName\":\"笔顺动图\"},{\"count\":17,\"increment\":0,\"typeCode\":\"WISH\",\"typeName\":\"愿望单\"},{\"count\":13,\"increment\":0,\"typeCode\":\"QA\",\"typeName\":\"专家咨询\"},{\"count\":20,\"increment\":0,\"typeCode\":\"IMAGE\",\"typeName\":\"高清大图\"},{\"count\":3,\"increment\":0,\"typeCode\":\"INTERACT\",\"typeName\":\"签到互动墙\"},{\"count\":12,\"increment\":0,\"typeCode\":\"SUBJECTNOTE\",\"typeName\":\"错题本\"},{\"count\":0,\"increment\":0,\"typeCode\":\"ENROLL\",\"typeName\":\"编创赛报名\"},{\"count\":4,\"increment\":0,\"typeCode\":\"LISTEN\",\"typeName\":\"听力音频\"},{\"count\":18,\"increment\":0,\"typeCode\":\"ZSCORE\",\"typeName\":\"查弱项\"},{\"count\":12,\"increment\":0,\"typeCode\":\"AUDIO_MAGIC\",\"typeName\":\"伴读魔法箱\"},{\"count\":10,\"increment\":0,\"typeCode\":\"EF\",\"typeName\":\"专题问答\"},{\"count\":85,\"increment\":0,\"typeCode\":\"TEST\",\"typeName\":\"趣味测试\"},{\"count\":49,\"increment\":6,\"typeCode\":\"CLOCK\",\"typeName\":\"打卡\"},{\"count\":2,\"increment\":0,\"typeCode\":\"NAIRE\",\"typeName\":\"读者反馈\"},{\"count\":44,\"increment\":0,\"typeCode\":\"LIVE_TIMETABLE\",\"typeName\":\"直播课\"},{\"count\":17,\"increment\":0,\"typeCode\":\"ARTICLE_READING\",\"typeName\":\"课文诵读\"},{\"count\":15,\"increment\":0,\"typeCode\":\"VOTE\",\"typeName\":\"投票\"},{\"count\":11,\"increment\":0,\"typeCode\":\"EBOOK\",\"typeName\":\"热门电子书\"},{\"count\":12,\"increment\":0,\"typeCode\":\"TEST_PAPER\",\"typeName\":\"试卷\"},{\"count\":27,\"increment\":0,\"typeCode\":\"RECITE_WORD\",\"typeName\":\"背单词\"},{\"count\":9,\"increment\":0,\"typeCode\":\"BM\",\"typeName\":\"活动报名\"},{\"count\":55,\"increment\":1,\"typeCode\":\"FLAG\",\"typeName\":\"立Flag\"},{\"count\":15,\"increment\":0,\"typeCode\":\"MEMBER\",\"typeName\":\"开通会员\"},{\"count\":7,\"increment\":0,\"typeCode\":\"BOOKCARD\",\"typeName\":\"读书卡片\"},{\"count\":5,\"increment\":0,\"typeCode\":\"TUTOR\",\"typeName\":\"名师辅导\"},{\"count\":21,\"increment\":0,\"typeCode\":\"GROUP\",\"typeName\":\"读者交流圈\"},{\"count\":33,\"increment\":1,\"typeCode\":\"PDF\",\"typeName\":\"图文\"},{\"count\":35,\"increment\":1,\"typeCode\":\"TEACH_RESOURCE\",\"typeName\":\"教辅资料包\"},{\"count\":8,\"increment\":0,\"typeCode\":\"VOICE_MSG\",\"typeName\":\"作者留言\"},{\"count\":39,\"increment\":1,\"typeCode\":\"ITEM_BANK\",\"typeName\":\"在线题库\"},{\"count\":4,\"increment\":0,\"typeCode\":\"KK\",\"typeName\":\"扫扫看\"},{\"count\":100,\"increment\":1,\"typeCode\":\"ANSWER\",\"typeName\":\"答案\"},{\"count\":20,\"increment\":0,\"typeCode\":\"DRAW\",\"typeName\":\"抽奖\"},{\"count\":11,\"increment\":0,\"typeCode\":\"PBSTORY\",\"typeName\":\"绘本伴读\"},{\"count\":3,\"increment\":2,\"typeCode\":\"FOREIGN_READ\",\"typeName\":\"外刊阅读\"},{\"count\":56,\"increment\":0,\"typeCode\":\"ARTICLE\",\"typeName\":\"精品文章\"},{\"count\":27,\"increment\":0,\"typeCode\":\"COLD_KNOWLEDGE\",\"typeName\":\"冷知识\"},{\"count\":14,\"increment\":0,\"typeCode\":\"BOOK\",\"typeName\":\"资源合集\"},{\"count\":19,\"increment\":1,\"typeCode\":\"TICKET\",\"typeName\":\"准考证\"},{\"count\":17,\"increment\":0,\"typeCode\":\"ENGLISH_WALKMAN\",\"typeName\":\"英语随声听\"},{\"count\":18,\"increment\":0,\"typeCode\":\"ORAL_EVALUATION\",\"typeName\":\"口语评测\"},{\"count\":1,\"increment\":0,\"typeCode\":\"ACTIVITY\",\"typeName\":\"分享互动\"},{\"count\":12,\"increment\":0,\"typeCode\":\"BOOK_CLICK\",\"typeName\":\"点读书\"}]");
JedisClusterUtils.del(BookConstant.BOOK_HOT_APP + DateUtil.format(new Date(), DatePattern.NORM_DATE_FORMAT));
}
} }
package com.pcloud.book.group.scheduled;
import com.alibaba.fastjson.JSONObject;
import com.pcloud.book.group.biz.BookGroupBiz;
import com.pcloud.book.group.dto.HotAppDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.List;
@Slf4j
@Component
public class HotAppScheduled {
@Autowired
private BookGroupBiz bookGroupBiz;
/**
* 每天凌晨1点更新热门应用数据
*/
@Scheduled(cron = "0 0 1 * * ?")
public void intiHotApp() {
List<HotAppDTO> hotAppDTOS = bookGroupBiz.listHotApp();
log.info("每天凌晨1点更新热门应用数据 hotAppDTOS:{}", JSONObject.toJSONString(hotAppDTOS));
}
}
...@@ -1214,4 +1214,44 @@ ...@@ -1214,4 +1214,44 @@
#{item} #{item}
</foreach> </foreach>
</select> </select>
<select id="listHotApp" resultType="com.pcloud.book.group.dto.HotAppDTO">
SELECT
type_code typeCode,
count( 0 ) count
FROM
`book_group_serve` a
RIGHT JOIN book_group b ON a.book_group_id = b.id
WHERE
b.is_delete = 0
AND serve_type = 'APP'
AND ISNULL( type_code )= 0
AND LENGTH(
TRIM( type_code ))> 0
AND b.create_time BETWEEN DATE_SUB(DATE_FORMAT(CURDATE(),'%Y-%m-%d %H:%i:%s'),INTERVAL 3 MONTH) AND DATE_FORMAT(CURDATE(),'%Y-%m-%d %H:%i:%s')
GROUP BY
type_code
ORDER BY
count DESC
</select>
<select id="listHotAppIncrement" resultType="com.pcloud.book.group.dto.HotAppDTO">
SELECT
type_code typeCode,
count( 0 ) increment
FROM
`book_group_serve` a
RIGHT JOIN book_group b ON a.book_group_id = b.id
WHERE
b.is_delete = 0
AND serve_type = 'APP'
AND ISNULL( type_code )= 0
AND LENGTH(
TRIM( type_code ))> 0
AND b.create_time BETWEEN DATE_SUB(DATE_FORMAT(CURDATE(),'%Y-%m-%d %H:%i:%s'),INTERVAL 1 DAY) AND DATE_FORMAT(CURDATE(),'%Y-%m-%d %H:%i:%s')
GROUP BY
type_code
ORDER BY
increment DESC
</select>
</mapper> </mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment