Commit c4f8d36e by 陈健智

竞品库传播分析接口修改

parent 887f609e
package com.zhiwei.brandkbs2.pojo.vo;
import lombok.Data;
import lombok.ToString;
import java.util.Date;
/**
* @author lxj
* @version 1.0
* @description 传播趋势图展示类
* @date 2019/9/17 9:09
*/
@Data
@ToString
public class LineVO {
/**
* 个数
*/
private Long count;
/**
* 时间
*/
private Long date;
}
......@@ -25,6 +25,7 @@ import com.zhiwei.brandkbs2.pojo.dto.ExportAppYuqingDTO;
import com.zhiwei.brandkbs2.pojo.dto.MarkSearchDTO;
import com.zhiwei.brandkbs2.pojo.dto.SearchFilterDTO;
import com.zhiwei.brandkbs2.pojo.vo.CustomTagVo;
import com.zhiwei.brandkbs2.pojo.vo.LineVO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.pojo.vo.ProjectVO;
import com.zhiwei.brandkbs2.service.*;
......@@ -1085,6 +1086,7 @@ public class MarkDataServiceImpl implements MarkDataService {
return JSON.parseObject(result);
}
}
List<Map<String, Long>> dayList = Tools.parseToDays(dto.getStartTime(), dto.getEndTime());
List<JSONObject> resList = new ArrayList<>(2);
JSONObject result = new JSONObject();
// 开始时间
......@@ -1096,8 +1098,7 @@ public class MarkDataServiceImpl implements MarkDataService {
JSONObject primaryLine = new JSONObject();
primaryLine.put("id", Constant.PRIMARY_CONTEND_ID);
primaryLine.put("brand", project.getBrandName());
List<JSONObject> primarySpread =
getDayMarkArticleCount(dto.getStartTime(), dto.getEndTime(), dto.getProjectId(), dto.getLinkedGroupId(), Constant.PRIMARY_CONTEND_ID);
List<LineVO> primarySpread = getArticleSpread(dto.getProjectId(), dto.getLinkedGroupId(), Constant.PRIMARY_CONTEND_ID, dayList);
primaryLine.put("spread", primarySpread);
resList.add(primaryLine);
result.put("days", primarySpread.size());
......@@ -1106,8 +1107,7 @@ public class MarkDataServiceImpl implements MarkDataService {
JSONObject contendLine = new JSONObject();
contendLine.put("id", dto.getContendId());
contendLine.put("brand", brandName);
List<JSONObject> contendSpread =
getDayMarkArticleCount(dto.getStartTime(), dto.getEndTime(), dto.getProjectId(), contendLinkedGroupId, dto.getContendId());
List<LineVO> contendSpread = getArticleSpread(dto.getProjectId(), contendLinkedGroupId, dto.getContendId(), dayList);
contendLine.put("spread", contendSpread);
resList.add(contendLine);
result.put("spread", resList);
......@@ -1115,17 +1115,17 @@ public class MarkDataServiceImpl implements MarkDataService {
// 封装主品牌信息结果
result.put("priName", project.getBrandName());
// 获取主品牌稿件传播平均值
double avgPrimaryNormalCount = primarySpread.stream().mapToLong(line -> line.getLongValue("count")).average().orElse(0);
double avgPrimaryNormalCount = primarySpread.stream().mapToLong(LineVO::getCount).average().orElse(0);
result.put("priAvg", (int) avgPrimaryNormalCount);
// 获取主品牌大于平均值的稿件天数
long priGreaterThanAvg = primarySpread.stream().filter(line -> line.getLongValue("count") > avgPrimaryNormalCount).count();
long priGreaterThanAvg = primarySpread.stream().filter(line -> line.getCount() > avgPrimaryNormalCount).count();
result.put("priGtAvg", priGreaterThanAvg);
// 获取主品牌传播峰值时信息
JSONObject primaryMax = primarySpread.stream().max(Comparator.comparing(line -> line.getLongValue("count"))).get();
result.put("priMaxTime", sdf.format(Long.parseLong(primaryMax.getString("date"))));
result.put("priMaxCount", primaryMax.getLongValue("count"));
long priMaxDayStartTime = Long.parseLong(primaryMax.getString("date"));
long priMaxDayEndTime = DateUtils.addDays(new Date(Long.parseLong(primaryMax.getString("date"))), 1).getTime();
LineVO primaryMax = primarySpread.stream().max(Comparator.comparing(LineVO::getCount)).orElse(new LineVO());
result.put("priMaxTime", sdf.format(primaryMax.getDate()));
result.put("priMaxCount", primaryMax.getCount());
long priMaxDayStartTime = primaryMax.getDate();
long priMaxDayEndTime = DateUtils.addDays(new Date(primaryMax.getDate()), 1).getTime();
// 获取时间段某情感数据最多的标题
List<Map.Entry<String, Integer>> priTopTitle =
getMarkTopTitle(priMaxDayStartTime, priMaxDayEndTime, EmotionEnum.ALL.getName(), dto.getProjectId(), dto.getLinkedGroupId(), Constant.PRIMARY_CONTEND_ID, 1);
......@@ -1162,17 +1162,17 @@ public class MarkDataServiceImpl implements MarkDataService {
// 竞品名
result.put("conName", brandName);
// 获取竞品稿件传播平均值
double avgContendSpreadNormalCount = contendSpread.stream().mapToLong(line -> line.getLongValue("count")).average().orElse(0);
double avgContendSpreadNormalCount = contendSpread.stream().mapToLong(LineVO::getCount).average().orElse(0);
result.put("conAvg", (int) avgContendSpreadNormalCount);
// 获取竞品大于平均值的稿件天数
long conGreaterThanAvg = contendSpread.stream().filter(line -> line.getLongValue("count") > avgContendSpreadNormalCount).count();
long conGreaterThanAvg = contendSpread.stream().filter(line -> line.getCount() > avgContendSpreadNormalCount).count();
result.put("conGtAvg", conGreaterThanAvg);
//获取竞品传播峰值信息
JSONObject contendMax = contendSpread.stream().max(Comparator.comparing(line -> line.getLongValue("count"))).get();
result.put("conMaxTime", sdf.format(Long.parseLong(primaryMax.getString("date"))));
result.put("conMaxCount", contendMax.getLongValue("count"));
long conMaxDayStartTime = Long.parseLong(primaryMax.getString("date"));
long conMaxDayEndTime = DateUtils.addDays(new Date(Long.parseLong(primaryMax.getString("date"))), 1).getTime();
LineVO contendMax = contendSpread.stream().max(Comparator.comparing(LineVO::getCount)).orElse(new LineVO());
result.put("conMaxTime", sdf.format(contendMax.getDate()));
result.put("conMaxCount", contendMax.getCount());
long conMaxDayStartTime = contendMax.getDate();
long conMaxDayEndTime = DateUtils.addDays(new Date(contendMax.getDate()), 1).getTime();
List<Map.Entry<String, Integer>> conTopTitle =
getMarkTopTitle(conMaxDayStartTime, conMaxDayEndTime, EmotionEnum.ALL.getName(), dto.getProjectId(), contendLinkedGroupId, dto.getContendId(), 1);
if (CollectionUtils.isNotEmpty(conTopTitle)) {
......@@ -1182,7 +1182,6 @@ public class MarkDataServiceImpl implements MarkDataService {
result.put("conTopTitle", conFirstArticle.getTitle());
result.put("conTopTitleUrl", conFirstArticle.getUrl());
}
// 获取竞品热门媒体方向
List<Map.Entry<String, Integer>> conHotTitles =
getMarkTopTitle(conMaxDayStartTime, conMaxDayEndTime, EmotionEnum.ALL.getName(), dto.getProjectId(), contendLinkedGroupId, dto.getContendId(), hotArticleSize);
......@@ -1444,7 +1443,34 @@ public class MarkDataServiceImpl implements MarkDataService {
}
/**
* 获取每日稿件数量
* 获取传播图谱
* @param projectId 项目ID
* @param linkedGroupId 关联组Id
* @param contendId 竞品ID
* @param dayList 以天为最小单位分割的时间
* @return
*/
private List<LineVO> getArticleSpread(String projectId, String linkedGroupId, String contendId, List<Map<String, Long>> dayList){
List<LineVO> lineList = new ArrayList<>(dayList.size());
dayList.forEach(day -> {
LineVO lineVO = new LineVO();
Long startTime = day.get("startTime");
Long endTime = day.get("endTime");
Long articleCount = null;
try {
articleCount = getMarkArticleCount(startTime, endTime, projectId, linkedGroupId, contendId);
} catch (IOException e) {
throw new RuntimeException(e);
}
lineVO.setCount(articleCount);
lineVO.setDate(startTime);
lineList.add(lineVO);
});
return lineList;
}
/**
* 获取稿件数量
*
* @param startTime 开始时间
* @param endTime 结束时间
......@@ -1453,28 +1479,15 @@ public class MarkDataServiceImpl implements MarkDataService {
* @param contendId 竞品ID
* @return 每日稿件数量
*/
private List<JSONObject> getDayMarkArticleCount(Long startTime, Long endTime, String projectId, String linkedGroupId, String contendId) throws IOException {
List<JSONObject> resultList = new ArrayList<>();
private Long getMarkArticleCount(Long startTime, Long endTime, String projectId, String linkedGroupId, String contendId) throws IOException {
// index
String[] indexes = esClientDao.getIndexes();
// dayAgg
DateHistogramAggregationBuilder daysAggregation = AggregationBuilders.dateHistogram("dayAgg").field("time").calendarInterval(DateHistogramInterval.DAY);
BoolQueryBuilder query = projectLinkedGroupContendIdQuery(projectId, linkedGroupId, contendId);
BoolQueryBuilder postFilter = projectLinkedGroupContendIdQuery(projectId, linkedGroupId, contendId);
// time range
query.must(QueryBuilders.rangeQuery("time").gte(startTime).lt(endTime));
// response
SearchResponse response = esClientDao.searchResponse(indexes, null, query, daysAggregation, null, null, 0, 0, null);
Map<String, Aggregation> aggMap = response.getAggregations().asMap();
ParsedDateHistogram dayAggTeam = (ParsedDateHistogram) aggMap.get("dayAgg");
List<? extends Histogram.Bucket> buckets = dayAggTeam.getBuckets();
buckets.forEach(bucket -> {
JSONObject result = new JSONObject();
result.put("date", bucket.getKeyAsString());
result.put("count", bucket.getDocCount());
resultList.add(result);
});
return resultList;
postFilter.must(QueryBuilders.rangeQuery("time").gte(startTime).lt(endTime));
//hits
return esClientDao.count(postFilter);
}
/**
......
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