Commit b677322f by 桂前礼

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

parent 2a3e411b
......@@ -157,6 +157,11 @@ public class BookConstant {
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(
......
......@@ -21,6 +21,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.scheduling.annotation.EnableScheduling;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
......@@ -41,6 +42,7 @@ import java.util.Map;
@PropertySource({"classpath:properties/book.properties", "classpath:public_system.properties"})
@Configuration
@EnableSwagger2
@EnableScheduling
@MapperScan(basePackages = {"com.pcloud.book.*.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory")
public class BookApplication {
......
......@@ -20,6 +20,7 @@ import com.pcloud.channelcenter.wechat.dto.ListIsInBookParam;
import com.pcloud.channelcenter.wechat.service.AccountSettingService;
import com.pcloud.channelcenter.wechat.service.MessageService;
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.constant.SystemCode;
import com.pcloud.common.dto.ResponseDto;
......@@ -467,4 +468,15 @@ public class QrcodeSceneConsr {
}
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;
import com.pcloud.book.group.dto.GroupQrcodeDTO;
import com.pcloud.book.group.dto.GroupStoreMyPayDto;
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.LabelUserCountDTO;
import com.pcloud.book.group.dto.LargeTempletDTO;
......@@ -1040,4 +1041,6 @@ public interface BookGroupBiz {
BookAppletSceneDTO getOneBookAppletBySceneIds(List<Long> sceneIds);
Long getRightsSettingId4Book(Long adviserId, Long channelId, Long bookId);
List<HotAppDTO> listHotApp();
}
package com.pcloud.book.group.biz.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import com.google.common.collect.Lists;
......@@ -9,6 +10,7 @@ import com.google.common.collect.Maps;
import com.alibaba.fastjson.JSONObject;
import com.pcloud.analysisengine.browse.dto.GroupBrowseStatisticVO;
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.base.dto.AppPriceCacheDTO;
import com.pcloud.appcenter.cache.service.AppPriceCacheService;
......@@ -73,6 +75,7 @@ import com.pcloud.book.group.dao.CopyCipherRecordDao;
import com.pcloud.book.group.dao.GroupQrcodeDao;
import com.pcloud.book.group.dao.GroupQrcodeStyleDao;
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.dao.PushBookGroupUpdateDao;
import com.pcloud.book.group.dao.TempletRelevanceDao;
......@@ -201,6 +204,7 @@ import com.pcloud.channelcenter.base.constants.ChannelConstants;
import com.pcloud.channelcenter.base.constants.ChannelEnum;
import com.pcloud.channelcenter.base.constants.MessageFromTypeEnum;
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.QrcodeSceneDto;
import com.pcloud.channelcenter.wechat.dto.AccountSettingDto;
......@@ -307,12 +311,14 @@ import java.util.Optional;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.Set;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
import cn.hutool.core.util.StrUtil;
......@@ -6511,4 +6517,98 @@ public class BookGroupBizImpl implements BookGroupBiz {
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;
import com.pcloud.book.group.dto.AgentStatisticsInfoDTO;
import com.pcloud.book.group.dto.BookGroupDTO;
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.QrcodeNameAndProIdDTO;
import com.pcloud.book.group.dto.TopAgentBookGroupDTO;
......@@ -377,4 +378,8 @@ public interface BookGroupDao extends BaseDao<BookGroup> {
List<String> getWxUserInAgents(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;
import com.pcloud.book.group.dto.AgentStatisticsInfoDTO;
import com.pcloud.book.group.dto.BookGroupDTO;
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.QrcodeNameAndProIdDTO;
import com.pcloud.book.group.dto.TopAgentBookGroupDTO;
......@@ -494,4 +495,14 @@ public class BookGroupDaoImpl extends BaseDaoImpl<BookGroup> implements BookGrou
paramMap.put("agentIds", agentIds);
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;
import com.pcloud.book.group.dto.BookGroupCreateDTO;
import com.pcloud.book.group.dto.BookGroupDTO;
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.UserSelectParamDTO;
import com.pcloud.book.group.entity.BookGroup;
......@@ -818,4 +819,9 @@ public interface BookGroupFacade {
@ApiOperation("书刊创建RAYS码-支持1对多")
@PostMapping("createBookGroup")
ResponseDto<?> createBookGroup(@RequestHeader("token") String token, @RequestBody @Validated BookGroupCreateDTO bookGroupCreateDTO);
@ApiOperation("获取热门应用")
@GetMapping("/listHotApp")
ResponseDto<List<HotAppDTO>> listHotApp();
}
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 com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.book.constant.BookConstant;
import com.pcloud.book.book.dto.MapResourceTotalCountDTO;
import com.pcloud.book.group.biz.BookGroupBiz;
import com.pcloud.book.group.biz.BookGroupClassifyBiz;
......@@ -12,6 +15,7 @@ import com.pcloud.book.group.dto.BookGroupCreateDTO;
import com.pcloud.book.group.dto.BookGroupDTO;
import com.pcloud.book.group.dto.ChangeQrCodeTypeDto;
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.UserSelectParamDTO;
import com.pcloud.book.group.entity.BookGroup;
......@@ -45,6 +49,7 @@ import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.page.PageParam;
import com.pcloud.common.permission.PermissionException;
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.nginx.NginxUtils;
import com.pcloud.common.utils.string.StringUtil;
......@@ -71,6 +76,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -1364,4 +1370,18 @@ public class BookGroupFacadeImpl implements BookGroupFacade {
bookGroupCreateDTO.setAdviserId(adviserId);
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 @@
#{item}
</foreach>
</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>
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