Commit b9dbcd89 by 田超

Merge branch 'feature/1006818' into 'master'

feat: [1006818] 斗罗

See merge request rays/pcloud-book!1527
parents a896a5bc cd2ade1e
...@@ -257,7 +257,14 @@ ...@@ -257,7 +257,14 @@
<dependency> <dependency>
<groupId>ru.yandex.clickhouse</groupId> <groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId> <artifactId>clickhouse-jdbc</artifactId>
<version>0.2.1</version> <version>0.3.2</version>
</dependency>
<!-- 判断斗罗书 -->
<dependency>
<groupId>com.pcloud.facade</groupId>
<artifactId>pcloud-facade-function</artifactId>
<version>${pcloud-facade3.version}</version>
</dependency> </dependency>
</dependencies> </dependencies>
......
package com.pcloud.book.consumer.function;
import com.pcloud.common.utils.ResponseHandleUtil;
import com.pcloud.function.douluo.dto.AppTaskDTO;
import com.pcloud.function.douluo.service.DlAppTaskService;
import com.pcloud.function.douluo.service.DlBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Slf4j
@Component
public class FunctionConsr {
@Autowired
private DlBookService dlBookService;
@Autowired
private DlAppTaskService dlAppTaskService;
/**
根据bookId判断是否斗罗书
*/
public Boolean checkIsDlBook(Long bookId){
Boolean isDlBook = false;
if (null == bookId) {
return isDlBook;
}
try {
isDlBook = ResponseHandleUtil.parseResponse(dlBookService.checkIsDlBook(bookId), Boolean.class);
} catch (Exception e) {
log.error("function.dlBookService.checkIsDlBook远程调用失败");
}
return isDlBook;
}
public List<AppTaskDTO> getAppTaskList() {
List<AppTaskDTO> appTaskList = new ArrayList<>();
try {
appTaskList = ResponseHandleUtil.parseListResponse(dlAppTaskService.getAppTaskList(), AppTaskDTO.class);
} catch (Exception e) {
log.error("function.dlAppTaskService.getAppTaskList()远程调用失败");
}
return appTaskList;
}
}
...@@ -564,4 +564,12 @@ public interface ResourcePageBiz { ...@@ -564,4 +564,12 @@ public interface ResourcePageBiz {
Map<Long, Boolean> mapWxworkStateBySceneIds(List<Long> sceneIds); Map<Long, Boolean> mapWxworkStateBySceneIds(List<Long> sceneIds);
List<BookGroupServe> getResourcePageList4Erp(List<Long> sceneIds); List<BookGroupServe> getResourcePageList4Erp(List<Long> sceneIds);
/**
* 客户端-斗罗大陆获取配置资源
* @param wechatUserId
* @param sceneId
* @return
*/
List<ResourcePageItemVO> getServerList4Wechat(Long wechatUserId, Long sceneId);
} }
...@@ -42,6 +42,7 @@ import com.pcloud.book.consumer.channel.QrcodeSceneConsr; ...@@ -42,6 +42,7 @@ import com.pcloud.book.consumer.channel.QrcodeSceneConsr;
import com.pcloud.book.consumer.common.ExportConsr; import com.pcloud.book.consumer.common.ExportConsr;
import com.pcloud.book.consumer.content.ResourceConsr; import com.pcloud.book.consumer.content.ResourceConsr;
import com.pcloud.book.consumer.exercisebook.ExerciseBookConsr; import com.pcloud.book.consumer.exercisebook.ExerciseBookConsr;
import com.pcloud.book.consumer.function.FunctionConsr;
import com.pcloud.book.consumer.message.MessageConsr; import com.pcloud.book.consumer.message.MessageConsr;
import com.pcloud.book.consumer.raystask.AdviserTaskConsr; import com.pcloud.book.consumer.raystask.AdviserTaskConsr;
import com.pcloud.book.consumer.raystask.MainLineConsr; import com.pcloud.book.consumer.raystask.MainLineConsr;
...@@ -273,6 +274,7 @@ import com.pcloud.resourcecenter.product.dto.UpdateAppProductParamDTO; ...@@ -273,6 +274,7 @@ import com.pcloud.resourcecenter.product.dto.UpdateAppProductParamDTO;
import com.pcloud.resourcecenter.product.entity.Product; import com.pcloud.resourcecenter.product.entity.Product;
import com.pcloud.resourcecenter.product.service.ProductService; import com.pcloud.resourcecenter.product.service.ProductService;
import com.pcloud.resourcecenter.store.constants.StoreCons; import com.pcloud.resourcecenter.store.constants.StoreCons;
import com.pcloud.settlementcenter.record.dto.AgentBookIncomeDTO;
import com.pcloud.settlementcenter.record.dto.GetGroupClassifyIncomeDTO; import com.pcloud.settlementcenter.record.dto.GetGroupClassifyIncomeDTO;
import com.pcloud.settlementcenter.record.dto.GetGroupQrcodeIncomeDTO; import com.pcloud.settlementcenter.record.dto.GetGroupQrcodeIncomeDTO;
import com.pcloud.settlementcenter.record.dto.GroupRescourceIncomeParamDTO; import com.pcloud.settlementcenter.record.dto.GroupRescourceIncomeParamDTO;
...@@ -506,6 +508,8 @@ public class BookGroupBizImpl implements BookGroupBiz { ...@@ -506,6 +508,8 @@ public class BookGroupBizImpl implements BookGroupBiz {
private UpdateSuperSearchProducer searchProducer; private UpdateSuperSearchProducer searchProducer;
@Autowired @Autowired
private AdviserTaskConsr adviserTaskConsr; private AdviserTaskConsr adviserTaskConsr;
@Autowired
private FunctionConsr functionConsr;
private static final ThreadPoolExecutor PLATFORM_STATISTICS_EXPORT_THREAD = new ThreadPoolExecutor(2, 2, private static final ThreadPoolExecutor PLATFORM_STATISTICS_EXPORT_THREAD = new ThreadPoolExecutor(2, 2,
0, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>(),
...@@ -5636,70 +5640,99 @@ public class BookGroupBizImpl implements BookGroupBiz { ...@@ -5636,70 +5640,99 @@ public class BookGroupBizImpl implements BookGroupBiz {
public Map<String, Object> getBookBaseInfo4Applet( Long adviserId, Long channelId, Long bookId ) { public Map<String, Object> getBookBaseInfo4Applet( Long adviserId, Long channelId, Long bookId ) {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
//是否开启小睿 //是否开启小睿
map.put("openRays", resourcePageBiz.isOpenRaysBook(bookId, channelId, adviserId)); CompletableFuture<Void> openRaysFuture = CompletableFuture.runAsync(() -> {
//书刊分类对应的小睿分类 map.put("openRays", resourcePageBiz.isOpenRaysBook(bookId, channelId, adviserId));
BookAdviserDto adviserDto = bookAdviserDao.getBase(bookId, channelId, adviserId); }, ThreadPoolUtils.BOOK_BASE_INFO_POOL);
map.put("isK12", Boolean.FALSE);
if (null != adviserDto) {
// 新增判断是否K12分类
if (Objects.nonNull(adviserDto.getTempletId())) {
if (CollUtil.toList(RightsSettingConstant.K12_TEMPLET_ID_NEW).contains(adviserDto.getTempletId())) {
map.put("isK12", Boolean.TRUE);
}
List<Long>idList = new ArrayList<>();
if(adviserDto.getTempletId()!=null) {
idList.add(adviserDto.getTempletId());
}
if(adviserDto.getSecondTempletId()!=null) {
idList.add(adviserDto.getSecondTempletId());
}
if(adviserDto.getThirdTempletId()!=null) {
idList.add(adviserDto.getThirdTempletId());
}
Map<Long, String> longAssistTempletDTOMap = assistTempletConsr.mapNameByIds(idList);
if(adviserDto.getTempletId()!=null) { //书刊分类对应的小睿分类
String first = longAssistTempletDTOMap.get(adviserDto.getTempletId()); CompletableFuture<Void> TempletFuture = CompletableFuture.runAsync(() -> {
if(first!=null ){ BookAdviserDto adviserDto = bookAdviserDao.getBase(bookId, channelId, adviserId);
map.put("templetId", adviserDto.getTempletId()); map.put("isK12", Boolean.FALSE);
map.put("templateName", first); if (null != adviserDto) {
} // 新增判断是否K12分类
} if (Objects.nonNull(adviserDto.getTempletId())) {
if(adviserDto.getSecondTempletId()!=null) { if (CollUtil.toList(RightsSettingConstant.K12_TEMPLET_ID_NEW).contains(adviserDto.getTempletId())) {
String second = longAssistTempletDTOMap.get(adviserDto.getSecondTempletId()); map.put("isK12", Boolean.TRUE);
if(second!=null){
map.put("secondTempletId", adviserDto.getSecondTempletId());
map.put("secondTempletName", second);
} }
// 设置模板名称
setTempletName(map, adviserDto);
} }
if(adviserDto.getThirdTempletId()!=null) { Long raysClassifyId = bookRaysClassifyDao.getClassifyIdByBookTemplateId(adviserDto.getTempletId());
String third = longAssistTempletDTOMap.get(adviserDto.getThirdTempletId()); if (null != raysClassifyId) {
if(third!=null){ map.put("raysClassifyId", raysClassifyId);
map.put("thirdTempletId", adviserDto.getThirdTempletId());
map.put("thirdTempletName", third);
}
} }
}
}, ThreadPoolUtils.BOOK_BASE_INFO_POOL);
//获取书名
CompletableFuture<Void> bookNameFuture = CompletableFuture.runAsync(() -> {
BookDto bookDto = bookBiz.getBaseById(bookId);
if (null != bookDto) {
map.put("bookName", bookDto.getBookName());
map.put("coverImg", bookDto.getCoverImg());
map.put("publish", bookDto.getPublish());
} }
Long raysClassifyId = bookRaysClassifyDao.getClassifyIdByBookTemplateId(adviserDto.getTempletId()); }, ThreadPoolUtils.BOOK_BASE_INFO_POOL);
if (null != raysClassifyId) {
map.put("raysClassifyId", raysClassifyId); //获取是否馆配书、阅读人数、是否斗罗书
CompletableFuture<Void> douluoFuture = CompletableFuture.runAsync(() -> {
map.put("isLibraryBook", bookBiz.checkIsLibraryBook(adviserId, bookId) ? 1 : 0);
//获取本书阅读人数
setReaderCount(adviserId, channelId, bookId, map);
//设置斗罗书
setDouLuoBOOK(map, bookId);
}, ThreadPoolUtils.BOOK_BASE_INFO_POOL);
try {
CompletableFuture.allOf(openRaysFuture, TempletFuture, bookNameFuture, douluoFuture).get();
} catch (InterruptedException | ExecutionException e) {
LOGGER.warn("获取书刊信息失败 [BookGroupBizImpl.getBookBaseInfo4Applet] ERR:{}", e.getMessage(), e);
}
return map;
}
private void setDouLuoBOOK(Map<String, Object> map, Long bookId) {
Boolean isDlBook = functionConsr.checkIsDlBook(bookId);
map.put("isDouluo", null == isDlBook ? false : isDlBook);
}
private void setTempletName(Map<String, Object> map, BookAdviserDto adviserDto) {
List<Long>idList = new ArrayList<>();
if(adviserDto.getTempletId()!=null) {
idList.add(adviserDto.getTempletId());
}
if(adviserDto.getSecondTempletId()!=null) {
idList.add(adviserDto.getSecondTempletId());
}
if(adviserDto.getThirdTempletId()!=null) {
idList.add(adviserDto.getThirdTempletId());
}
Map<Long, String> longAssistTempletDTOMap = assistTempletConsr.mapNameByIds(idList);
if(adviserDto.getTempletId()!=null) {
String first = longAssistTempletDTOMap.get(adviserDto.getTempletId());
if(first!=null ){
map.put("templetId", adviserDto.getTempletId());
map.put("templateName", first);
} }
} }
//获取书名 if(adviserDto.getSecondTempletId()!=null) {
BookDto bookDto = bookBiz.getBaseById(bookId); String second = longAssistTempletDTOMap.get(adviserDto.getSecondTempletId());
if (null != bookDto) { if(second!=null ){
map.put("bookName", bookDto.getBookName()); map.put("secondTempletId", adviserDto.getSecondTempletId());
map.put("coverImg", bookDto.getCoverImg()); map.put("secondTempletName", second);
map.put("publish", bookDto.getPublish()); }
} }
map.put("isLibraryBook", bookBiz.checkIsLibraryBook(adviserId, bookId) ? 1 : 0); if(adviserDto.getThirdTempletId()!=null) {
//资源数量 String third = longAssistTempletDTOMap.get(adviserDto.getThirdTempletId());
/* List<BookServeDTO> serveDTOList = this.getBookAndBookGroupServeIds(adviserId, bookId, channelId); if(third!=null ){
this.removeCanNotBuy(serveDTOList); map.put("thirdTempletId", adviserDto.getThirdTempletId());
map.put("resourceCount", ListUtils.isEmpty(serveDTOList) ? 0 : serveDTOList.size());*/ map.put("thirdTempletName", third);
//获取本书阅读人数 }
}
}
private void setReaderCount(Long adviserId, Long channelId, Long bookId, Map<String, Object> map) {
String redisKey4Random = "BOOK:READER_COUNT:" + bookId + ":" + channelId + ":" + adviserId; String redisKey4Random = "BOOK:READER_COUNT:" + bookId + ":" + channelId + ":" + adviserId;
String redisKey4Set = "BOOK:READER_SET:" + bookId + ":" + channelId + ":" + adviserId; String redisKey4Set = "BOOK:READER_SET:" + bookId + ":" + channelId + ":" + adviserId;
String readerCountStr = JedisClusterUtils.get(redisKey4Random); String readerCountStr = JedisClusterUtils.get(redisKey4Random);
...@@ -5717,7 +5750,6 @@ public class BookGroupBizImpl implements BookGroupBiz { ...@@ -5717,7 +5750,6 @@ public class BookGroupBizImpl implements BookGroupBiz {
readerCount4Set = 0; readerCount4Set = 0;
} }
map.put("readerCount", readerCount4Random + readerCount4Set); map.put("readerCount", readerCount4Random + readerCount4Set);
return map;
} }
@Override @Override
......
...@@ -34,6 +34,7 @@ import com.pcloud.book.consumer.app.AppConsr; ...@@ -34,6 +34,7 @@ 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.combinedmarketing.MemberActivityConsr; import com.pcloud.book.consumer.combinedmarketing.MemberActivityConsr;
import com.pcloud.book.consumer.erp.ErpConsr; import com.pcloud.book.consumer.erp.ErpConsr;
import com.pcloud.book.consumer.function.FunctionConsr;
import com.pcloud.book.consumer.raystask.AdviserTaskConsr; import com.pcloud.book.consumer.raystask.AdviserTaskConsr;
import com.pcloud.book.consumer.reader.ReaderConsr; import com.pcloud.book.consumer.reader.ReaderConsr;
import com.pcloud.book.consumer.resource.ProductConsr; import com.pcloud.book.consumer.resource.ProductConsr;
...@@ -144,6 +145,7 @@ import com.pcloud.common.utils.json.JSONUtils; ...@@ -144,6 +145,7 @@ import com.pcloud.common.utils.json.JSONUtils;
import com.pcloud.common.utils.string.StringUtil; import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.facade.shareimage.dto.HtmlDto; import com.pcloud.facade.shareimage.dto.HtmlDto;
import com.pcloud.facade.wxwork.contact.vo.WxContactWayVO; import com.pcloud.facade.wxwork.contact.vo.WxContactWayVO;
import com.pcloud.function.douluo.dto.AppTaskDTO;
import com.pcloud.message.common.enums.YesNoEnums; import com.pcloud.message.common.enums.YesNoEnums;
import com.pcloud.readercenter.common.enums.YesOrNoNumEnum; import com.pcloud.readercenter.common.enums.YesOrNoNumEnum;
import com.pcloud.readercenter.userlabel.dto.UserGradeLabelIdDTO; import com.pcloud.readercenter.userlabel.dto.UserGradeLabelIdDTO;
...@@ -182,6 +184,7 @@ import java.util.concurrent.TimeUnit; ...@@ -182,6 +184,7 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
...@@ -288,6 +291,8 @@ public class ResourcePageBizImpl implements ResourcePageBiz { ...@@ -288,6 +291,8 @@ public class ResourcePageBizImpl implements ResourcePageBiz {
private ErpConsr erpConsr; private ErpConsr erpConsr;
@Autowired @Autowired
private ResourcePageShareMapper shareMapper; private ResourcePageShareMapper shareMapper;
@Autowired
private FunctionConsr functionConsr;
@Value("${book.share.defaultTitle}") @Value("${book.share.defaultTitle}")
...@@ -1887,6 +1892,8 @@ public class ResourcePageBizImpl implements ResourcePageBiz { ...@@ -1887,6 +1892,8 @@ public class ResourcePageBizImpl implements ResourcePageBiz {
} }
} }
}); });
//删除缓存
JedisClusterUtils.del("FUNCTION:DOULUO_APP");
return resourcePageId; return resourcePageId;
} }
...@@ -3933,4 +3940,59 @@ public class ResourcePageBizImpl implements ResourcePageBiz { ...@@ -3933,4 +3940,59 @@ public class ResourcePageBizImpl implements ResourcePageBiz {
List<BookGroupServe> resourcePageList4Erp = resourcePageItemDao.getResourcePageList4Erp(sceneIds); List<BookGroupServe> resourcePageList4Erp = resourcePageItemDao.getResourcePageList4Erp(sceneIds);
return CollUtil.defaultIfEmpty(resourcePageList4Erp, CollUtil.toList()); return CollUtil.defaultIfEmpty(resourcePageList4Erp, CollUtil.toList());
} }
@Override
public List<ResourcePageItemVO> getServerList4Wechat(Long wechatUserId, Long sceneId) {
ResourcePage bySceneId = resourcePageDao.getBySceneId(sceneId);
if (null == bySceneId) {
return new ArrayList<>();
}
List<ResourcePageItemVO> itemVOList = resourcePageItemDao.getResourcePageItemByPageId(bySceneId.getId(), true);
if(CollUtil.isEmpty(itemVOList)) {
return new ArrayList<>();
}
if (CollUtil.isNotEmpty(itemVOList)) {
//二维码类型
fillQrcodeType(bySceneId.getId(), itemVOList);
Map<String, List<ResourcePageItemVO>> listMap = itemVOList.stream().collect(Collectors.groupingBy(ResourcePageItemVO::getServeType));
itemVOList = new ArrayList<>();
//应用和作品提出来一起查
List<ResourcePageItemVO> itemAppAndProductVOList = new ArrayList<>();
//过滤一些资源,重新排序
for (Map.Entry<String, List<ResourcePageItemVO>> entry : listMap.entrySet()) {
if (ResourcePageConstants.ServeTypeEnum.APP.getValue().equals(entry.getKey()) || ServeTypeEnum.PRODUCT.getValue().equals(entry.getKey())) {
itemAppAndProductVOList.addAll(entry.getValue());
continue;
}
this.fillResourceByType(entry.getValue(), wechatUserId, entry.getKey());
itemVOList.addAll(entry.getValue());
}
if (CollUtil.isNotEmpty(itemAppAndProductVOList)) {
fillAppProductServe(itemAppAndProductVOList, wechatUserId);
//暂不返回 直接根据typecode进行判断
//fillTaskType(itemAppAndProductVOList);
itemVOList.addAll(itemAppAndProductVOList);
}
itemVOList.sort(Comparator.comparing(ResourcePageItemVO::getId));
}
return itemVOList;
}
private void fillTaskType(List<ResourcePageItemVO> itemAppAndProductVOList) {
if (CollUtil.isEmpty(itemAppAndProductVOList)) {
return;
}
//填充斗罗任务类型
List<AppTaskDTO> appTaskDTOs = functionConsr.getAppTaskList();
if (CollUtil.isEmpty(appTaskDTOs)) {
return;
}
Map<Long, Integer> appTaskMap = appTaskDTOs.stream().collect(Collectors.toMap(AppTaskDTO::getAppId, AppTaskDTO::getTaskType, (k1, k2) -> k1));
itemAppAndProductVOList.stream().forEach(item -> {
if (CollUtil.isNotEmpty(appTaskMap) && null != appTaskMap.get(item.getServeId())) {
item.setTaskType(appTaskMap.get(item.getServeId()));
}
});
}
} }
...@@ -467,4 +467,14 @@ public class ResourcePageFacade { ...@@ -467,4 +467,14 @@ public class ResourcePageFacade {
public ResponseDto<List<BookGroupServe>> getResourcePageList4Erp(@RequestBody List<Long> sceneIds) throws PermissionException { public ResponseDto<List<BookGroupServe>> getResourcePageList4Erp(@RequestBody List<Long> sceneIds) throws PermissionException {
return new ResponseDto<>(resourcePageBiz.getResourcePageList4Erp(sceneIds)); return new ResponseDto<>(resourcePageBiz.getResourcePageList4Erp(sceneIds));
} }
@ApiOperation("客户端-斗罗大陆获取配置资源")
@GetMapping("getServerList4Wechat")
public ResponseDto<?> getServerList4Wechat(@CookieValue("userInfo") String userInfo,
@RequestParam(value = "sceneId") Long sceneId){
Long wechatUserId = Cookie.getId(userInfo,Cookie._WECHAT_USER_ID);
return new ResponseDto<>(resourcePageBiz.getServerList4Wechat(wechatUserId, sceneId));
}
} }
...@@ -138,4 +138,7 @@ public class ResourcePageItemVO extends BaseDto{ ...@@ -138,4 +138,7 @@ public class ResourcePageItemVO extends BaseDto{
@ApiModelProperty("自定义标题") @ApiModelProperty("自定义标题")
private String selfServeName; private String selfServeName;
@ApiModelProperty("任务类型")
private Integer taskType;
} }
...@@ -116,6 +116,12 @@ public class ThreadPoolUtils { ...@@ -116,6 +116,12 @@ public class ThreadPoolUtils {
public static final ThreadPoolExecutor BOOK_RECORD_POOL = new ThreadPoolExecutor(8, 8, 0, TimeUnit.SECONDS, public static final ThreadPoolExecutor BOOK_RECORD_POOL = new ThreadPoolExecutor(8, 8, 0, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(), new ThreadFactoryBuilder().setNameFormat("book_record-pool-%d").build(), new ThreadPoolExecutor.CallerRunsPolicy()); new LinkedBlockingQueue<>(), new ThreadFactoryBuilder().setNameFormat("book_record-pool-%d").build(), new ThreadPoolExecutor.CallerRunsPolicy());
/**
* bookBaseInfo线程池
*/
public static final ExecutorService BOOK_BASE_INFO_POOL = new ThreadPoolExecutor(16, 128, 0L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(), new ThreadFactoryBuilder().setNameFormat("book-base-info-pool-%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