Commit e04a0340 by 田超

Merge branch 'feature/1004243' into 'master'

feat: [1004243] 本书服务阅读人数

See merge request rays/pcloud-book!1184
parents efbf6613 aa62c7ab
...@@ -5,6 +5,7 @@ import com.google.common.collect.Maps; ...@@ -5,6 +5,7 @@ import com.google.common.collect.Maps;
import com.pcloud.common.constant.CacheConstant; import com.pcloud.common.constant.CacheConstant;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
...@@ -405,4 +406,33 @@ public class BookConstant { ...@@ -405,4 +406,33 @@ public class BookConstant {
public static final String JOB_NAME_BANNER_PUT_OFF = "BannerAutoPutOff"; public static final String JOB_NAME_BANNER_PUT_OFF = "BannerAutoPutOff";
public static final Map<Integer, List<Integer>> READER_COUNT_MAP = new HashMap<Integer, List<Integer>>(){
{
put(1, Lists.newArrayList(20, 137));
put(2, Lists.newArrayList(20, 137));
put(3, Lists.newArrayList(20, 137));
put(4, Lists.newArrayList(20, 137));
put(5, Lists.newArrayList(20, 137));
put(6, Lists.newArrayList(335, 970));
put(7, Lists.newArrayList(480, 2280));
put(8, Lists.newArrayList(664, 5091));
put(9, Lists.newArrayList(1095, 10859));
put(10, Lists.newArrayList(992, 15224));
put(11, Lists.newArrayList(772, 11455));
put(12, Lists.newArrayList(1162, 12907));
put(13, Lists.newArrayList(687, 11108));
put(14, Lists.newArrayList(795, 10891));
put(15, Lists.newArrayList(1100, 12153));
put(16, Lists.newArrayList(890, 11433));
put(17, Lists.newArrayList(1336, 9118));
put(18, Lists.newArrayList(2448, 11952));
put(19, Lists.newArrayList(3106, 14088));
put(20, Lists.newArrayList(3179, 14980));
put(21, Lists.newArrayList(2249, 12156));
put(22, Lists.newArrayList(1050, 7955));
put(23, Lists.newArrayList(628, 3280));
put(0, Lists.newArrayList(890, 2250));
}
};
} }
...@@ -2,6 +2,7 @@ package com.pcloud.book.applet.biz; ...@@ -2,6 +2,7 @@ package com.pcloud.book.applet.biz;
import com.pcloud.book.applet.dto.AppletAppOrProductDTO; import com.pcloud.book.applet.dto.AppletAppOrProductDTO;
import com.pcloud.book.applet.dto.AppletRecordDTO; import com.pcloud.book.applet.dto.AppletRecordDTO;
import com.pcloud.book.applet.dto.ReadBookRecordDTO;
import com.pcloud.book.applet.entity.AppletRecord; import com.pcloud.book.applet.entity.AppletRecord;
import com.pcloud.common.page.PageBeanNew; import com.pcloud.common.page.PageBeanNew;
...@@ -93,4 +94,10 @@ public interface AppletRecordBiz { ...@@ -93,4 +94,10 @@ public interface AppletRecordBiz {
* 手动处理应用作品和资讯的typeCode * 手动处理应用作品和资讯的typeCode
*/ */
void HandleTypeCode(); void HandleTypeCode();
/**
* 新增用户阅读记录
* @param readBookRecordDTO
*/
void addReadBookRecord(ReadBookRecordDTO readBookRecordDTO);
} }
...@@ -6,6 +6,7 @@ import cn.hutool.core.date.DatePattern; ...@@ -6,6 +6,7 @@ import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.RandomUtil;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.pcloud.appcenter.app.dto.AppDto; import com.pcloud.appcenter.app.dto.AppDto;
import com.pcloud.book.applet.biz.AppletBooklistBiz; import com.pcloud.book.applet.biz.AppletBooklistBiz;
...@@ -22,11 +23,13 @@ import com.pcloud.book.applet.dto.AppletOuterBooklistDTO; ...@@ -22,11 +23,13 @@ import com.pcloud.book.applet.dto.AppletOuterBooklistDTO;
import com.pcloud.book.applet.dto.AppletRecordDTO; import com.pcloud.book.applet.dto.AppletRecordDTO;
import com.pcloud.book.applet.dto.AppletUserBookcaseDTO; import com.pcloud.book.applet.dto.AppletUserBookcaseDTO;
import com.pcloud.book.applet.dto.BookDTO4Booklist; import com.pcloud.book.applet.dto.BookDTO4Booklist;
import com.pcloud.book.applet.dto.ReadBookRecordDTO;
import com.pcloud.book.applet.entity.AppletRecord; import com.pcloud.book.applet.entity.AppletRecord;
import com.pcloud.book.applet.entity.AppletRecordDayServe; import com.pcloud.book.applet.entity.AppletRecordDayServe;
import com.pcloud.book.applet.entity.AppletRecordServe; import com.pcloud.book.applet.entity.AppletRecordServe;
import com.pcloud.book.applet.enums.AppletRecordTypeEnum; import com.pcloud.book.applet.enums.AppletRecordTypeEnum;
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.consumer.app.AppConsr; import com.pcloud.book.consumer.app.AppConsr;
import com.pcloud.book.consumer.channel.QrcodeSceneConsr; import com.pcloud.book.consumer.channel.QrcodeSceneConsr;
import com.pcloud.book.consumer.resource.ProductConsr; import com.pcloud.book.consumer.resource.ProductConsr;
...@@ -37,9 +40,11 @@ import com.pcloud.book.group.tools.SendWeixinRequestTools; ...@@ -37,9 +40,11 @@ import com.pcloud.book.group.tools.SendWeixinRequestTools;
import com.pcloud.book.rightsSetting.biz.RightsSettingBiz; import com.pcloud.book.rightsSetting.biz.RightsSettingBiz;
import com.pcloud.book.skill.biz.PcloudGroupActivityBiz; import com.pcloud.book.skill.biz.PcloudGroupActivityBiz;
import com.pcloud.book.applet.dto.GroupActivity4AppletDTO; import com.pcloud.book.applet.dto.GroupActivity4AppletDTO;
import com.pcloud.book.skill.remind.RedisTool;
import com.pcloud.book.util.common.ThreadPoolUtils; import com.pcloud.book.util.common.ThreadPoolUtils;
import com.pcloud.channelcenter.wechat.dto.AccountSettingDto; import com.pcloud.channelcenter.wechat.dto.AccountSettingDto;
import com.pcloud.common.core.aspect.ParamLog; import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.core.mybatis.cache.redis.RedisCache;
import com.pcloud.common.exceptions.BizException; import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.page.PageBeanNew; import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.page.PageParam; import com.pcloud.common.page.PageParam;
...@@ -47,6 +52,7 @@ import com.pcloud.common.utils.BeanUtils; ...@@ -47,6 +52,7 @@ import com.pcloud.common.utils.BeanUtils;
import com.pcloud.common.utils.ListUtils; import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.NumberUtil; import com.pcloud.common.utils.NumberUtil;
import com.pcloud.common.utils.cache.redis.JedisClusterUtils; import com.pcloud.common.utils.cache.redis.JedisClusterUtils;
import com.pcloud.common.utils.cache.redis.RedisSessionUtils;
import com.pcloud.common.utils.string.StringUtil; import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.readercenter.common.enums.YesOrNoNumEnum; import com.pcloud.readercenter.common.enums.YesOrNoNumEnum;
import com.pcloud.resourcecenter.product.dto.ProductDto; import com.pcloud.resourcecenter.product.dto.ProductDto;
...@@ -68,6 +74,8 @@ import java.util.concurrent.ExecutionException; ...@@ -68,6 +74,8 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.pcloud.book.book.constant.BookConstant.READER_COUNT_MAP;
/** /**
* (AppletRecord)表服务实现类 * (AppletRecord)表服务实现类
* *
...@@ -338,6 +346,33 @@ public class AppletRecordBizImpl implements AppletRecordBiz { ...@@ -338,6 +346,33 @@ public class AppletRecordBizImpl implements AppletRecordBiz {
} }
} }
@Override
@ParamLog("新增用户阅读本书服务记录")
public void addReadBookRecord(ReadBookRecordDTO readBookRecordDTO) {
ThreadPoolUtils.BOOK_READ_RECORD.execute(() -> {
Long bookId = readBookRecordDTO.getBookId();
Long channelId = readBookRecordDTO.getChannelId();
Long adviserId = readBookRecordDTO.getAdviserId();
String redisKey4Random = "BOOK:READER_COUNT:" + bookId + ":" + channelId + ":" + adviserId;
String redisKey4Set = "BOOK:READER_SET:" + bookId + ":" + channelId + ":" + adviserId;
Integer readerCount = null;
if (JedisClusterUtils.exists(redisKey4Random)) {
JedisClusterUtils.expire(redisKey4Random, BookConstant.BOOK_CACHE_SECOUND);
} else {
List<Integer> readerCountList = READER_COUNT_MAP.get(DateUtil.hour(new Date(), Boolean.TRUE));
readerCount = RandomUtil.randomInt(readerCountList.get(0), readerCountList.get(1));
JedisClusterUtils.set(redisKey4Random, readerCount.toString(), BookConstant.BOOK_CACHE_SECOUND);
}
if ( Objects.equals(YesOrNoNumEnum.YES.getValue(), readBookRecordDTO.getRecordType())) {
JedisClusterUtils.sadd(redisKey4Set, readBookRecordDTO.getWechatUserId().toString());
JedisClusterUtils.expire(redisKey4Set, BookConstant.BOOK_CACHE_SECOUND);
} else if (Objects.equals(YesOrNoNumEnum.NO.getValue(), readBookRecordDTO.getRecordType())) {
JedisClusterUtils.srem(redisKey4Set, readBookRecordDTO.getWechatUserId().toString());
JedisClusterUtils.expire(redisKey4Set, BookConstant.BOOK_CACHE_SECOUND);
}
});
}
private void HandleTypeCode4ListDay(List<AppletRecordDTO> recordList) { private void HandleTypeCode4ListDay(List<AppletRecordDTO> recordList) {
fillTypeCode(recordList); fillTypeCode(recordList);
appletRecordDayServeDao.batchUpdate(recordList); appletRecordDayServeDao.batchUpdate(recordList);
......
package com.pcloud.book.applet.dto;
import lombok.Data;
@Data
public class ReadBookRecordDTO {
/**
* 书刊id
*/
private Long bookId;
/**
* 渠道id
*/
private Long channelId;
/**
* 编辑id
*/
private Long adviserId;
/**
* 记录类型 1进入 0 离开
*/
private Integer recordType;
/**
* 用户id
*/
private Long wechatUserId;
}
...@@ -2,6 +2,7 @@ package com.pcloud.book.applet.facade; ...@@ -2,6 +2,7 @@ package com.pcloud.book.applet.facade;
import com.pcloud.book.applet.biz.AppletRecordBiz; import com.pcloud.book.applet.biz.AppletRecordBiz;
import com.pcloud.book.applet.dto.AppletRecordDTO; import com.pcloud.book.applet.dto.AppletRecordDTO;
import com.pcloud.book.applet.dto.ReadBookRecordDTO;
import com.pcloud.book.applet.entity.AppletRecord; import com.pcloud.book.applet.entity.AppletRecord;
import com.pcloud.book.applet.vo.AppletRecordQueryVO; import com.pcloud.book.applet.vo.AppletRecordQueryVO;
import com.pcloud.book.base.exception.BookBizException; import com.pcloud.book.base.exception.BookBizException;
...@@ -117,5 +118,15 @@ public class AppletRecordFacade { ...@@ -117,5 +118,15 @@ public class AppletRecordFacade {
return new ResponseDto<>(); return new ResponseDto<>();
} }
@ApiOperation("本书服务页阅读记录")
@RequestMapping(value = "addReadBookRecord", method = RequestMethod.POST)
public ResponseDto<?> addReadBookRecord(@CookieValue("userInfo") String userInfo,
@RequestBody ReadBookRecordDTO readBookRecordDTO){
Long wechatUserId = Cookie.getId(userInfo,Cookie._WECHAT_USER_ID);
readBookRecordDTO.setWechatUserId(wechatUserId);
appletRecordBiz.addReadBookRecord(readBookRecordDTO);
return new ResponseDto<>();
}
} }
\ No newline at end of file
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.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;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
...@@ -223,6 +224,7 @@ import com.pcloud.common.page.PageParam; ...@@ -223,6 +224,7 @@ import com.pcloud.common.page.PageParam;
import com.pcloud.common.utils.BeanUtils; import com.pcloud.common.utils.BeanUtils;
import com.pcloud.common.utils.DateUtils; import com.pcloud.common.utils.DateUtils;
import com.pcloud.common.utils.ListUtils; import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.NumberUtil;
import com.pcloud.common.utils.QrcodeUtils; import com.pcloud.common.utils.QrcodeUtils;
import com.pcloud.common.utils.ResponseHandleUtil; import com.pcloud.common.utils.ResponseHandleUtil;
import com.pcloud.common.utils.UUIDUitl; import com.pcloud.common.utils.UUIDUitl;
...@@ -316,6 +318,8 @@ import cn.hutool.core.util.StrUtil; ...@@ -316,6 +318,8 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.ZipUtil; import cn.hutool.core.util.ZipUtil;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import static com.pcloud.book.book.constant.BookConstant.READER_COUNT_MAP;
/** /**
* Description 社群书群二维码业务逻辑层接口实现类 Created by PENG on 2019/4/17. * Description 社群书群二维码业务逻辑层接口实现类 Created by PENG on 2019/4/17.
*/ */
...@@ -5531,6 +5535,24 @@ public class BookGroupBizImpl implements BookGroupBiz { ...@@ -5531,6 +5535,24 @@ public class BookGroupBizImpl implements BookGroupBiz {
/* List<BookServeDTO> serveDTOList = this.getBookAndBookGroupServeIds(adviserId, bookId, channelId); /* List<BookServeDTO> serveDTOList = this.getBookAndBookGroupServeIds(adviserId, bookId, channelId);
this.removeCanNotBuy(serveDTOList); this.removeCanNotBuy(serveDTOList);
map.put("resourceCount", ListUtils.isEmpty(serveDTOList) ? 0 : serveDTOList.size());*/ map.put("resourceCount", ListUtils.isEmpty(serveDTOList) ? 0 : serveDTOList.size());*/
//获取本书阅读人数
String redisKey4Random = "BOOK:READER_COUNT:" + bookId + ":" + channelId + ":" + adviserId;
String redisKey4Set = "BOOK:READER_SET:" + bookId + ":" + channelId + ":" + adviserId;
String readerCountStr = JedisClusterUtils.get(redisKey4Random);
Integer readerCount4Random = null;
Integer readerCount4Set = null;
if (null != readerCountStr && NumberUtil.isNumber(readerCountStr)) {
readerCount4Random = Integer.valueOf(readerCountStr);
} else {
List<Integer> readerCountList = READER_COUNT_MAP.get(DateUtil.hour(new Date(), Boolean.TRUE));
readerCount4Random = RandomUtil.randomInt(readerCountList.get(0), readerCountList.get(1));
}
if (JedisClusterUtils.exists(redisKey4Set)) {
readerCount4Set = JedisClusterUtils.scard(redisKey4Set).intValue();
} else {
readerCount4Set = 0;
}
map.put("readerCount", readerCount4Random + readerCount4Set);
return map; return map;
} }
......
...@@ -68,4 +68,8 @@ public class ThreadPoolUtils { ...@@ -68,4 +68,8 @@ public class ThreadPoolUtils {
public static final ExecutorService APPLET_RECORD = new ThreadPoolExecutor(8,8,0L, TimeUnit.SECONDS, public static final ExecutorService APPLET_RECORD = new ThreadPoolExecutor(8,8,0L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(), new ThreadFactoryBuilder().setNameFormat("applet_record-%d").build(), new ThreadPoolExecutor.CallerRunsPolicy()); new LinkedBlockingQueue<>(), new ThreadFactoryBuilder().setNameFormat("applet_record-%d").build(), new ThreadPoolExecutor.CallerRunsPolicy());
public static final ExecutorService BOOK_READ_RECORD = new ThreadPoolExecutor(8,8,0L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(), new ThreadFactoryBuilder().setNameFormat("book_read_record-%d").build(), new ThreadPoolExecutor.CallerRunsPolicy());
} }
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