Commit fddf6786 by shenjunjie

Merge branch 'feature' into 'dev'

Feature

See merge request !22
parents 80d39e08 4e60b856
......@@ -31,7 +31,7 @@ public class RedisKeyPrefix {
* 自定义事件相关缓存
*/
public static final String CUSTOM_EVENT_LIST = "BRANDKBS:CUSTOM_EVENT:LIST:";
public static final String CUSTOM_EVENT_ANALYZE_SHARE = "BRANDKBS:CUSTOM_EVENT:SHARE";
public static final String CUSTOM_EVENT_ANALYZE_SHARE = "BRANDKBS:CUSTOM_EVENT:SHARE:";
public static final String CUSTOM_EVENT_ANALYZE = "BRANDKBS:CUSTOM_EVENT:ANALYZE:";
/**
......@@ -60,10 +60,24 @@ public class RedisKeyPrefix {
*/
private static final String EVENT_ANALYZE_PROGRESS = "BRANDKBS:EVENT:ANALYZE:PROGRESS:";
/**
* 竞品库-获取竞品对比舆情解读数据(PC
*/
public static final String INDEX_COMPARE_SUMMARY_PC = "BRANDKBS:CONTEND:COMPARESUMMARY:PC:";
/**
* 竞品库-获取竞品对比传播分析数据
*/
public static final String INDEX_COMPARE_ANALYZE = "BRANDKBS:CONTEND:COMPAREANALYZE:";
public static String eventAnalysisProgress(String eventId, String projectId) {
return RedisKeyPrefix.generateRedisKey(RedisKeyPrefix.EVENT_ANALYZE_PROGRESS, projectId, eventId);
}
public static String eventAnalysisProgress(String eventId) {
return RedisKeyPrefix.generateRedisKey(RedisKeyPrefix.EVENT_ANALYZE_PROGRESS, UserThreadLocal.getProjectId(), eventId);
}
public static String yuqingProgressKey(String linkedGroupId) {
return yuqingProgressKey(UserThreadLocal.getProjectId(), linkedGroupId);
}
......
......@@ -51,4 +51,9 @@ public class Constant {
return -1L;
}
/**
* 主品牌默认竞品ID
*/
public static final String PRIMARY_CONTENDID = "0";
}
......@@ -84,9 +84,9 @@ public class TaskPoolConfig {
log.info("start taskServiceExecutor");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 配置核心线程数
executor.setCorePoolSize(8);
executor.setCorePoolSize(16);
// 配置最大线程数
executor.setMaxPoolSize(16);
executor.setMaxPoolSize(32);
// 配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("taskServiceExecutor-");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
......
package com.zhiwei.brandkbs2.controller.app;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.dto.MarkSearchDTO;
import com.zhiwei.brandkbs2.service.MarkDataService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.io.IOException;
import java.text.ParseException;
import java.util.List;
/**
* @ClassName AppContendController
* @Description 提供前台竞品库相关信息展示
* @author cjz
* @date 2022-08-09 10:22
*/
@RestController
@RequestMapping("/app/contend")
@Api(tags = "前台竞品库展示接口",description = "提供前台竞品库相关信息展示")
@Auth(role = RoleEnum.CUSTOMER)
public class AppContendController extends BaseController {
@Resource(name = "markDataServiceImpl")
MarkDataService markDataService;
@ApiOperation("竞品库-竞品舆情-搜索条件")
@GetMapping("/searchCriteria")
public ResponseResult getContendSearchCriteria(@RequestParam(required = false) String linkedGroupId) {
return ResponseResult.success(markDataService.getContendSearchCriteria(linkedGroupId));
}
@ApiOperation("竞品库-竞品舆情-搜索结果列表")
@GetMapping("/list")
public ResponseResult getContendSearchList(@RequestBody MarkSearchDTO markSearchDTO) throws IOException {
return ResponseResult.success(markDataService.getContendSearchList(markSearchDTO));
}
@ApiOperation("竞品库-竞品分析-舆情总结页面")
@GetMapping("/summary")
public ResponseResult getSummary(@RequestBody MarkSearchDTO markSearchDTO) throws IOException {
return ResponseResult.success(markDataService.getContendSummary(markSearchDTO, true));
}
@ApiOperation("竞品库-竞品对比-传播分析页面")
@GetMapping("/spread/analyze")
public ResponseResult getSpreadAnalyze(@RequestBody MarkSearchDTO markSearchDTO) throws IOException {
return ResponseResult.success(markDataService.getContendSpreadAnalyze(markSearchDTO, 5, true));
}
}
......@@ -26,8 +26,6 @@ import org.springframework.web.client.RestTemplate;
@Api(tags = "前台危机展示接口",description = "提供前台危机相关信息展示")
@Auth(role = RoleEnum.CUSTOMER)
public class AppCrisisController extends BaseController {
@Value("${crisis.search.url}")
private String crisisSearchUrl;
@Value("${crisis.searchTags.url}")
private String crisisTagsUrl;
......@@ -47,16 +45,6 @@ public class AppCrisisController extends BaseController {
@Autowired
private RestTemplate restTemplate;
@ApiOperation("危机库-查危机")
@GetMapping("/crisisSearch")
public ResponseResult crisisSearch(@RequestParam(value = "page",defaultValue = "1") Integer page,
@RequestParam(value = "pageSize",defaultValue = "3") Integer pageSize,
@RequestParam("keyword") String keyword){
ResponseEntity<String> responseEntity = restTemplate.getForEntity(crisisSearchUrl, String.class, page, pageSize, keyword);
Object data = JSON.parseObject(responseEntity.getBody()).get("data");
return ResponseResult.success(data);
}
@ApiOperation("危机库-通过标签查危机")
@GetMapping("/crisisTags")
public ResponseResult crisisTags(@RequestParam(value = "page",defaultValue = "1") Integer page,
......
......@@ -57,14 +57,14 @@ public class AppEventController extends BaseController {
@ApiOperation("前台事件库-品牌事件库")
@GetMapping("/list")
public ResponseResult getEventList(@RequestParam(value = "brandLinkedGroupId", required = false) String linkedGroupId,
public ResponseResult getEventList(@RequestParam(value = "contendId", defaultValue = "0") String contendId,
@RequestParam(value = "emotion", defaultValue = "全部") String emotion,
@RequestParam(value = "startTime", required = false) Long startTime,
@RequestParam(value = "endTime", required = false) Long endTime,
@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "pageSize", defaultValue = "50") int pageSize,
@RequestParam(value = "sorter", required = false) String sorter) {
return ResponseResult.success(eventService.getEventList(linkedGroupId, emotion, startTime, endTime, page, pageSize, sorter));
return ResponseResult.success(eventService.getEventList(contendId, emotion, startTime, endTime, page, pageSize, sorter));
}
@ApiOperation("前台事件库-事件详情-基础信息")
......@@ -101,7 +101,7 @@ public class AppEventController extends BaseController {
@ApiOperation("前台事件库-全网事件库-搜索")
@GetMapping("/getWholeNetworkEvents")
public ResponseResult getWholeNetworkEvents(@RequestParam("keyword") String keyword,
@RequestParam(value = "page",defaultValue = "1") Integer page){
@RequestParam(value = "page", defaultValue = "1") Integer page) {
String name = keyword.trim();
ResponseEntity<String> responseEntity = restTemplate.getForEntity(getEfSearchUrl, String.class, name, page);
JSONObject jsonObject = JSON.parseObject(responseEntity.getBody());
......@@ -110,7 +110,7 @@ public class AppEventController extends BaseController {
@ApiOperation("前台事件库-全网事件库-搜索条件")
@GetMapping("/getWholeNetworkSearchCriteria")
public ResponseResult getWholeNetworkSearchCriteria(){
public ResponseResult getWholeNetworkSearchCriteria() {
ResponseEntity<String> responseEntity = restTemplate.getForEntity(getEfSearchCriteriaUrl, String.class);
JSONObject jsonObject = JSON.parseObject(responseEntity.getBody());
return ResponseResult.success(jsonObject);
......@@ -121,7 +121,7 @@ public class AppEventController extends BaseController {
public ResponseResult getWholeNetworkEventsList(@RequestParam(value = "firstType", required = false, defaultValue = "") String firstType,
@RequestParam(value = "start", required = false, defaultValue = "0") long start,
@RequestParam(value = "end", required = false, defaultValue = "0") long end,
@RequestParam(value = "page", required = false, defaultValue = "1") int page){
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
ResponseEntity<String> responseEntity = restTemplate.getForEntity(getFilterNewUrl, String.class, firstType, start, end, page);
JSONObject jsonObject = JSON.parseObject(responseEntity.getBody());
return ResponseResult.success(jsonObject);
......@@ -129,7 +129,7 @@ public class AppEventController extends BaseController {
@ApiOperation("前台事件库-全网事件库-得到验证码")
@GetMapping("/getWholeNetworkCaptcha")
public ResponseResult getWholeNetworkCaptcha(){
public ResponseResult getWholeNetworkCaptcha() {
ResponseEntity<String> responseEntity = restTemplate.getForEntity(efCaptchaUrl, String.class);
JSONObject jsonObject = JSON.parseObject(responseEntity.getBody());
return ResponseResult.success(jsonObject);
......@@ -138,7 +138,7 @@ public class AppEventController extends BaseController {
@ApiOperation("前台事件库-全网事件库-校验验证码")
@GetMapping("/checkWholeNetworkCaptcha")
public ResponseResult checkWholeNetworkCaptcha(@RequestParam(value = "id", required = false, defaultValue = "") String id,
@RequestParam(value = "captcha", required = false, defaultValue = "") String captcha){
@RequestParam(value = "captcha", required = false, defaultValue = "") String captcha) {
ResponseEntity<String> responseEntity = restTemplate.getForEntity(efCheckCaptchaUrl, String.class, id, captcha);
JSONObject jsonObject = JSON.parseObject(responseEntity.getBody());
return ResponseResult.success(jsonObject);
......
......@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.common.RedisKeyPrefix;
import com.zhiwei.brandkbs2.config.Constant;
import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
......@@ -48,9 +49,6 @@ public class AppHotController extends BaseController {
@Value("${trends.longTimeInListSearchByInner.url}")
private String trendsListUrl;
@Value("${trends.findHotSearchESDataInTimeByInner.url}")
private String trendsSearchUrl;
@Value("${trends.longTimeInListSearch.url}")
private String longTimeInListSearchUrl;
......@@ -74,7 +72,7 @@ public class AppHotController extends BaseController {
* douyin 抖音
* bilibili-ranking B站
*/
@ApiOperation("热点库")
@ApiOperation("热点库-列表")
@GetMapping("/getHotList")
public ResponseResult getHotList(@RequestParam(value = "sortType",defaultValue = "realTime") String sortType,
@RequestParam(value = "type",defaultValue = "weibo") String type){
......@@ -96,21 +94,6 @@ public class AppHotController extends BaseController {
}
}
@ApiOperation("热点库-查热点")
@GetMapping("/searchHotList")
public ResponseResult searchHotList(@RequestParam(value = "pageSize",defaultValue ="10") Integer limit,
@RequestParam(value = "page",defaultValue ="1") Integer page,
@RequestParam(value = "type",defaultValue = "weibo") String type,
@RequestParam(value = "word") String word){
ResponseEntity<JSONObject> jsonObjectResponseEntity = restTemplate.getForEntity(trendsSearchUrl, JSONObject.class, limit, page, type, word);
JSONObject body = jsonObjectResponseEntity.getBody();
if(Objects.nonNull(body)){
return ResponseResult.success(body);
}else{
return ResponseResult.failure("响应超时");
}
}
@ApiOperation("热点库-热点榜单")
@GetMapping("/hot")
public ResponseResult hot(){
......@@ -142,14 +125,14 @@ public class AppHotController extends BaseController {
Date startDate = DateUtils.addHours(endDate, -24);
List<Map.Entry<String, Integer>> markTopTitleList =
markDataService.getMarkTopTitle(startDate.getTime(), endDate.getTime(), null, projectId, linkedGroupId,"0", size);
markDataService.getMarkTopTitle(startDate.getTime(), endDate.getTime(), null, projectId, linkedGroupId, Constant.PRIMARY_CONTENDID, size);
List<JSONObject> resultList = markTopTitleList.stream().map(map -> {
JSONObject resultJsonObject = new JSONObject();
resultJsonObject.put("title", map.getKey());
resultJsonObject.put("num", map.getValue());
try {
BaseMap firstArticle = markDataService.getFirstArticle(startDate.getTime(), endDate.getTime(), map.getKey(), projectId, linkedGroupId);
BaseMap firstArticle = markDataService.getFirstArticle(startDate.getTime(), endDate.getTime(), map.getKey(), projectId, linkedGroupId, Constant.PRIMARY_CONTENDID);
resultJsonObject.put("content", firstArticle.getContent());
resultJsonObject.put("url", firstArticle.getUrl());
resultJsonObject.put("realSource", firstArticle.getRealSource());
......
package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.Objects;
/**
* @ClassName AppSearchController
* @Description 提供前台搜索相关功能
* @author cjz
* @date 2022-08-15 16:17
*/
@RestController
@RequestMapping("/app/search")
@Api(tags = "前台搜索相关接口",description = "提供搜索相关功能")
@Auth(role = RoleEnum.CUSTOMER)
public class AppSearchController {
@Autowired
private RestTemplate restTemplate;
@Value("${trends.findHotSearchESDataInTimeByInner.url}")
private String trendsSearchUrl;
@Value("${crisis.search.url}")
private String crisisSearchUrl;
@Value("${ef.search.url}")
private String getEfSearchUrl;
@ApiOperation("搜索-查热点")
@GetMapping("/hot/list")
public ResponseResult searchHotList(@RequestParam(value = "pageSize",defaultValue ="10") Integer limit,
@RequestParam(value = "page",defaultValue ="1") Integer page,
@RequestParam(value = "type",defaultValue = "weibo") String type,
@RequestParam(value = "word") String word){
ResponseEntity<JSONObject> jsonObjectResponseEntity = restTemplate.getForEntity(trendsSearchUrl, JSONObject.class, limit, page, type, word);
JSONObject body = jsonObjectResponseEntity.getBody();
if(Objects.nonNull(body)){
return ResponseResult.success(body);
}else{
return ResponseResult.failure("响应超时");
}
}
@ApiOperation("搜索-查危机")
@GetMapping("/crisisSearch")
public ResponseResult crisisSearch(@RequestParam(value = "page",defaultValue = "1") Integer page,
@RequestParam(value = "pageSize",defaultValue = "3") Integer pageSize,
@RequestParam("keyword") String keyword){
ResponseEntity<String> responseEntity = restTemplate.getForEntity(crisisSearchUrl, String.class, page, pageSize, keyword);
Object data = JSON.parseObject(responseEntity.getBody()).get("data");
return ResponseResult.success(data);
}
@ApiOperation("搜索-全网事件库-查事件")
@GetMapping("/getWholeNetworkEvents")
public ResponseResult getWholeNetworkEvents(@RequestParam("keyword") String keyword,
@RequestParam(value = "page",defaultValue = "1") Integer page){
String name = keyword.trim();
ResponseEntity<String> responseEntity = restTemplate.getForEntity(getEfSearchUrl, String.class, name, page);
JSONObject jsonObject = JSON.parseObject(responseEntity.getBody());
return ResponseResult.success(jsonObject);
}
}
......@@ -155,4 +155,10 @@ public interface BaseMongoDao<T extends AbstractBaseMongo> {
criteria.and("channelFid").is(channelIndex.getFid());
return criteria;
}
@FunctionalInterface
interface VoidSetFunction {
<T> void set(T t);
}
}
......@@ -6,6 +6,7 @@ import com.zhiwei.brandkbs2.pojo.EventData;
import java.util.Date;
import java.util.List;
import java.util.concurrent.CompletableFuture;
/**
* @ClassName: EventDataDao
......@@ -23,6 +24,13 @@ public interface EventDataDao extends BaseMongoDao<EventData>, ShardingMongo {
EventData findFirstData(String eventId, String collectionName);
/**
* 异步获取首发稿件并设置相关操作
*
* @return EventData
*/
CompletableFuture<EventData> findFirstDataAsync(String eventId, String collectionName);
/**
* 获取传播量
*
* @param event 事件
......
......@@ -10,6 +10,7 @@ import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import javax.annotation.Resource;
import java.lang.reflect.ParameterizedType;
......@@ -33,6 +34,9 @@ public class BaseMongoDaoImpl<T extends AbstractBaseMongo> implements BaseMongoD
@Resource(name = "primaryMongoTemplate")
protected MongoTemplate mongoTemplate;
@Resource(name = "mongoQueryExecutor")
protected ThreadPoolTaskExecutor taskExecutor;
public BaseMongoDaoImpl(String collectionName) {
this.collectionName = collectionName;
this.clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
......
......@@ -76,7 +76,8 @@ public class EventDaoImpl extends BaseMongoDaoImpl<Event> implements EventDao {
String aliasName = "events";
Criteria lookUpCriteria = Criteria.where(aliasName + ".emotion").in(eventEmotions);
List<AggregationOperation> operations = Arrays.asList(Aggregation.match(criteria),
Aggregation.lookup(COLLECTION_NAME, "eventId", "_id", aliasName), Aggregation.match(lookUpCriteria),
Aggregation.lookup(COLLECTION_NAME, "eventId", "_id", aliasName),
Aggregation.match(lookUpCriteria),
Aggregation.project("events._id"));
Aggregation aggregation = Aggregation.newAggregation(operations);
AggregationResults<JSONObject> aggregate = mongoTemplate.aggregate(aggregation, primaryCollection, JSONObject.class);
......
......@@ -11,6 +11,7 @@ import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.concurrent.CompletableFuture;
/**
* @ClassName: EventDataDaoImpl
......@@ -48,6 +49,11 @@ public class EventDataDaoImpl extends BaseMongoDaoImpl<EventData> implements Eve
}
@Override
public CompletableFuture<EventData> findFirstDataAsync(String eventId, String collectionName) {
return CompletableFuture.supplyAsync(() -> findFirstData(eventId, collectionName), taskExecutor);
}
@Override
public long getEventArticleCount(Event event) {
return count(Query.query(Criteria.where("eventId").is(event.getId())), event.getCollectionName());
}
......
......@@ -89,9 +89,7 @@ public class EventListInfoVO {
this.totalDisseminationVolume = event.getTotalDisseminationVolume();
this.totalChannelVolume = event.getTotalChannelVolume();
this.emotion = event.getEmotion();
this.eventTag = event.getEventTag().entrySet().stream()
.map(entry-> String.valueOf(entry.getValue()))
.collect(Collectors.joining("|"));
this.eventTag = event.getEventTag().values().stream().map(String::valueOf).collect(Collectors.joining("|"));
this.negativeArticleVolume = event.getNegativeArticleVolume();
this.articleEmotionProportions = event.getArticleEmotionProportions();
this.articlePlatformProportions = event.getArticlePlatformProportions();
......
......@@ -222,7 +222,7 @@ public interface EventService {
/**
* 获取品牌事件列表信息
* @param linkedGroupId
* @param contendId
* @param emotion
* @param startTime
* @param endTime
......@@ -231,7 +231,7 @@ public interface EventService {
* @param sorter
* @return
*/
PageVO<EventListInfoVO> getEventList(String linkedGroupId, String emotion, Long startTime, Long endTime, int page, int pageSize, String sorter);
PageVO<EventListInfoVO> getEventList(String contendId, String emotion, Long startTime, Long endTime, int page, int pageSize, String sorter);
/**
* 事件详情-基础静态信息
......
......@@ -8,8 +8,10 @@ import com.zhiwei.brandkbs2.pojo.dto.ExportAppYuqingDTO;
import com.zhiwei.brandkbs2.pojo.dto.MarkSearchDTO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.web.bind.annotation.RequestParam;
import java.io.IOException;
import java.text.ParseException;
import java.util.List;
import java.util.Map;
......@@ -141,7 +143,7 @@ public interface MarkDataService {
* @param linkedGroupId 关联组id
* @return 首发稿件
*/
BaseMap getFirstArticle(Long startTime, Long endTime, String aggTitle, String projectId, String linkedGroupId) throws IOException;
BaseMap getFirstArticle(Long startTime, Long endTime, String aggTitle, String projectId, String linkedGroupId, String contendId) throws IOException;
/**
* 搜索标注数据通过事件
......@@ -163,4 +165,36 @@ public interface MarkDataService {
*/
List<JSONObject> searchMarkDataByTime(String projectId, String linkedGroupId, String contendId, Long startTime, Long endTime, String... fetchSource);
/**
* 竞品库-获取搜索条件
* @param linkedGroupId 关联组Id
* @return 搜索条件
*/
JSONObject getContendSearchCriteria(String linkedGroupId);
/**
* 竞品库-获取搜索结果列表
* @param markSearchDTO 标注数据搜索传输类
* @return 搜索结果列表
*/
PageVO<MarkFlowEntity> getContendSearchList(MarkSearchDTO markSearchDTO) throws IOException;
/**
* 竞品库-获取竞品对比舆情解读数据
*
* @param markSearchDTO 标注数据搜索传输类
* @param cache 是否启用缓存
* @return 竞品对比舆情解读数据
*/
JSONObject getContendSummary(MarkSearchDTO markSearchDTO, boolean cache) throws IOException;
/**
* 竞品库-获取竞品对比传播分析数据
* @param markSearchDTO 标注数据搜索传输类
* @param hotArticleSize 热门稿件数量
* @param cache 是否启用缓存
* @return
*/
JSONObject getContendSpreadAnalyze(MarkSearchDTO markSearchDTO, int hotArticleSize, boolean cache) throws IOException;
}
......@@ -17,9 +17,10 @@ public interface MarkFlowService {
* @param json
* @param projectId
* @param linkedGroupId
* @param contendId
* @return
*/
JSONObject createMarkFlowInfo(JSONObject json, String projectId, String linkedGroupId);
JSONObject createMarkFlowInfo(JSONObject json, String projectId,String linkedGroupId, String contendId);
/**
* 快照页信息组装
......
......@@ -808,6 +808,7 @@ public class ChannelServiceImpl implements ChannelService {
}
channel.setEmotionIndex(index);
channel.setEmotion(emotion);
channel.setEventCount(eventDao.getEventCount(new ChannelIndex(channel)).size());
}
/**
......
......@@ -99,7 +99,7 @@ public class CustomEventServiceImpl implements CustomEventService {
JSONObject result = new JSONObject();
String aggTitle = map.getKey();
try {
BaseMap firstArticle = markDataService.getFirstArticle(startTime, endTime, aggTitle, projectId, linkedGroupId);
BaseMap firstArticle = markDataService.getFirstArticle(startTime, endTime, aggTitle, projectId, linkedGroupId, Constant.PRIMARY_CONTENDID);
result.put("title", firstArticle.getTitle());
result.put("time", firstArticle.getTime());
result.put("url", firstArticle.getUrl());
......@@ -142,7 +142,7 @@ public class CustomEventServiceImpl implements CustomEventService {
set("endTime", customEventDTO.getEndTime()).set("keywords", customEventDTO.getKeywords());
customEventDao.updateOneByIdWithField(customEvent.getId(), update);
customEventDataDao.deleteOneByQuery(Query.query(Criteria.where("customEventId").is(customEventDTO.getId())));
// this.saveCustomEvent(customEventDTO);
analyzeCustomEventDataByCustomEventDTO(customEvent, customEventDTO);
}
@Override
......@@ -278,6 +278,13 @@ public class CustomEventServiceImpl implements CustomEventService {
return result;
}
private void analyzeCustomEventDataByCustomEventDTO(CustomEvent customEvent, CustomEventDTO customEventDTO) {
customEvent.setStartTime(customEventDTO.getStartTime());
customEvent.setEndTime(customEventDTO.getEndTime());
customEvent.setKeywords(customEventDTO.getKeywords());
analyzeCustomEventData(customEvent);
}
/**
* 自定义事件更新
*
......@@ -285,10 +292,10 @@ public class CustomEventServiceImpl implements CustomEventService {
*/
private void analyzeCustomEventData(CustomEvent customEvent) {
String eventId = customEvent.getId();
log.info("自定义事件:{} 更新开始", eventId);
customEventDao.updateOneByIdWithField(eventId, Update.update("status", false));
ApplicationProjectListener.getThreadPool().execute(() -> {
try {
log.info("自定义事件:{} 更新开始", eventId);
customEventDao.updateOneByIdWithField(eventId, Update.update("status", false));
//查询符合该事件时间段的所有稿件信息
List<JSONObject> articles = markDataService.searchMarkDataByTime(customEvent.getProjectId(), customEvent.getLinkedGroupId(), "0",
customEvent.getStartTime(), customEvent.getEndTime());
......
......@@ -513,7 +513,7 @@ public class EventServiceImpl implements EventService {
String projectId = UserThreadLocal.getProjectId();
JSONObject result = new JSONObject();
// 品牌
result.put("brands", getBrands(projectId));
result.put("brands", projectService.getBrands(projectId, true));
// 事件调性
result.put("emotions", getEventEmotions());
// 事件类型 todo 后续用筛选器配置,和品牌关联
......@@ -525,42 +525,39 @@ public class EventServiceImpl implements EventService {
}
@Override
public PageVO<EventListInfoVO> getEventList(String linkedGroupId, String emotion, Long startTime, Long endTime, int page, int pageSize, String sorter) {
public PageVO<EventListInfoVO> getEventList(String contendId, String emotion, Long startTime, Long endTime, int page, int pageSize, String sorter) {
String projectId = UserThreadLocal.getProjectId();
// 查询条件
Query query = Query.query(Criteria.where("projectId").is(projectId).and("linkedGroupId").is(linkedGroupId));
Query query = Query.query(Criteria.where("projectId").is(projectId).and("contendId").is(contendId));
if (Objects.nonNull(emotion) && !"全部".equals(emotion)) {
query.addCriteria(Criteria.where("emotion").is(emotion));
}
if (Objects.nonNull(startTime) && Objects.nonNull(endTime)) {
query.addCriteria(Criteria.where("startTime").gte(new Date(startTime)).lt(new Date(endTime)));
query.addCriteria(Criteria.where("startTime").gte(startTime).lt(endTime));
}
// 排序
JSONObject sortJson = JSONObject.parseObject(sorter);
sortJson.entrySet().forEach(sortEntry -> {
String sort = String.valueOf(sortEntry.getValue()).replace("end", "");
String sortField = sortEntry.getKey();
if (Sort.Direction.ASC.name().equalsIgnoreCase(sort)) {
query.with(Sort.by(Sort.Direction.ASC, sortField));
} else {
query.with(Sort.by(Sort.Direction.DESC, sortField));
}
});
// 总数
long total = eventDao.count(query);
int start = pageSize * (page - 1);
query.limit(pageSize).skip(start);
// 排序
eventDao.addSort(query, sorter);
mongoUtil.start(page, pageSize, query);
// 数据
List<Event> eventList = eventDao.findList(query);
// vo封装
List<EventListInfoVO> eventListInfoVOList = eventList.stream().map(event -> {
EventListInfoVO vo = new EventListInfoVO(event);
// List<EventListInfoVO> eventListInfoVOList = eventList.stream().map(event -> {
// EventListInfoVO vo = new EventListInfoVO(event);
// // 放入首发稿件
// vo.setFirstEventData(eventDataDao.findFirstData(event.getId(), event.getCollectionName()));
// return vo;
// }).collect(Collectors.toList());
// 未保证排序
Map<String, EventListInfoVO> sortMap = eventList.stream().collect(Collectors.toConcurrentMap(Event::getId, EventListInfoVO::new));
CompletableFuture.allOf(eventList.stream().map(event -> eventDataDao.findFirstDataAsync(event.getId(), event.getCollectionName()).thenApply((r) -> {
// 放入首发稿件
vo.setFirstEventData(eventDataDao.findFirstData(event.getId(), event.getCollectionName()));
return vo;
}).collect(Collectors.toList());
PageVO<EventListInfoVO> pageVo = PageVO.createPageVo(total, page, pageSize, eventListInfoVOList);
return pageVo;
EventListInfoVO vo = new EventListInfoVO(event);
sortMap.get(event.getId()).setFirstEventData(r);
return null;
})).toArray(CompletableFuture[]::new)).join();
return PageVO.createPageVo(total, page, pageSize, eventList.stream().map(event -> sortMap.get(event.getId())).collect(Collectors.toList()));
}
@Override
......@@ -683,6 +680,7 @@ public class EventServiceImpl implements EventService {
* @param projectId
* @return
*/
@Deprecated
private List<JSONObject> getBrands(String projectId) {
ProjectVO projectVO = projectService.getProjectVOById(projectId);
JSONObject priBrandResult = new JSONObject();
......
......@@ -11,8 +11,6 @@ import com.zhiwei.brandkbs2.dao.ChannelTagDao;
import com.zhiwei.brandkbs2.enmus.ChannelEmotion;
import com.zhiwei.brandkbs2.exception.ExceptionCast;
import com.zhiwei.brandkbs2.model.CommonCodeEnum;
import com.zhiwei.brandkbs2.pojo.Channel;
import com.zhiwei.brandkbs2.pojo.ChannelIndex;
import com.zhiwei.brandkbs2.pojo.MarkFlowEntity;
import com.zhiwei.brandkbs2.service.MarkFlowService;
import com.zhiwei.brandkbs2.util.RedisUtil;
......@@ -22,9 +20,6 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* @ClassName: MarkFlowServiceImpl
......@@ -45,9 +40,9 @@ public class MarkFlowServiceImpl implements MarkFlowService {
RedisUtil redisUtil;
@Override
public JSONObject createMarkFlowInfo(JSONObject json, String projectId, String contendId) {
public JSONObject createMarkFlowInfo(JSONObject json, String projectId, String linkedGroupId, String contendId) {
JSONObject resultInfo = createInfoWithEmotion(json);
resultInfo.put("sourceDetails", getSourceDetails(json, projectId, contendId));
resultInfo.put("sourceDetails", getSourceDetails(json, projectId, linkedGroupId, contendId));
return resultInfo;
}
......@@ -106,7 +101,7 @@ public class MarkFlowServiceImpl implements MarkFlowService {
return info;
}
private JSONObject getSourceDetails(JSONObject tJson, String projectId, String contendId) {
private JSONObject getSourceDetails(JSONObject tJson, String projectId, String linkedGroupId, String contendId) {
JSONObject sourceDetails = new JSONObject();
String source = tJson.getString(GenericAttribute.ES_SOURCE);
// 是否原创
......@@ -123,20 +118,28 @@ public class MarkFlowServiceImpl implements MarkFlowService {
sourceDetails.put("followersNum", followersNum);
}
// 渠道标签
sourceDetails.put("channelTag", channelTagDao.getTagByChannelName(source));
// 渠道倾向及id
Channel channel = channelDao.queryUnique(ChannelIndex.createChannelIndex(tJson, projectId, contendId));
if (null != channel) {
sourceDetails.put("channelId", channel.getId());
sourceDetails.put("channelEmotion", ChannelEmotion.getNameFromState(channel.getEmotion()));
} else {
List<Map<String, Object>> cacheMaps = (List<Map<String, Object>>) tJson.get(GenericAttribute.ES_BRANDKBS_CACHE_MAPS);
if (null != cacheMaps) {
Map<String, Object> hitMap =
cacheMaps.stream().filter(map -> projectId.equals(map.get("project_id")) && contendId.equals(map.get("contend_id"))).findAny().orElse(Collections.emptyMap());
sourceDetails.put("channelId", hitMap.get("channel_id"));
sourceDetails.put("channelEmotion", ChannelEmotion.getNameFromState(hitMap.get("channel_emotion")));
}
String channelTag = tJson.getString("channel_tag");
if (null != channelTag) {
sourceDetails.put("channelTag", channelTag.replaceAll(",", "|"));
}
// 渠道倾向及id(调整为快照属性)
// Channel channel = channelDao.queryUnique(ChannelIndex.createChannelIndex(tJson, projectId, contendId));
// if (null != channel) {
// sourceDetails.put("channelId", channel.getId());
// sourceDetails.put("channelEmotion", ChannelEmotion.getNameFromState(channel.getEmotion()));
// } else {
// List<Map<String, Object>> cacheMaps = (List<Map<String, Object>>) tJson.get(GenericAttribute.ES_BRANDKBS_CACHE_MAPS);
// if (null != cacheMaps) {
// Map<String, Object> hitMap =
// cacheMaps.stream().filter(map -> projectId.equals(map.get("project_id")) && contendId.equals(map.get("contend_id"))).findAny().orElse(Collections.emptyMap());
// sourceDetails.put("channelId", hitMap.get("channel_id"));
// sourceDetails.put("channelEmotion", ChannelEmotion.getNameFromState(hitMap.get("channel_emotion")));
// }
// }
JSONObject brandkbsHitJson = Tools.getBrandkbsHitMap(tJson, Tools.concat(projectId, linkedGroupId, contendId));
if (null != brandkbsHitJson.get("channel_emotion")) {
sourceDetails.put("channelEmotion", ChannelEmotion.getNameFromState(brandkbsHitJson.getIntValue("channel_emotion")));
}
double channelValue = tJson.getDoubleValue(GenericAttribute.ES_CHANNEL_INDEX);
if (channelValue > 0) {
......
......@@ -93,7 +93,7 @@ public class TaskServiceImpl implements TaskService {
insertList.addAll(batchHandle(batchList, newRecordMap));
batchList = new ArrayList<>();
}
if (handleSize % 100 == 0) {
if (handleSize % 10000 == 0) {
log.info("渠道统计-渠道总计-查询更新已完成{}/{}", handleSize, channelIndexRecordMap.size());
}
}
......
......@@ -779,14 +779,14 @@ public class Tools {
return contains;
}
public static Map<String, Object> getBrandkbsHitMap(Map<String, Object> esMap, String hitKey) {
public static JSONObject getBrandkbsHitMap(Map<String, Object> esMap, String hitKey) {
List<Map<String, Object>> cacheMaps = (List<Map<String, Object>>) esMap.get("brandkbs_cache_maps");
for (Map<String, Object> cacheMap : cacheMaps) {
if (hitKey.equals(cacheMap.get("key"))) {
return cacheMap;
return new JSONObject(cacheMap);
}
}
return Collections.emptyMap();
return new JSONObject();
}
public static <T> Map<Long, T> sortTimeKeyMap(Map<Long, T> map, boolean isDesc) {
......
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