Commit 6dd6609f by shenjunjie

Merge branch 'release' into 'master'

Release

See merge request !493
parents 0853972c 43d5875c
...@@ -20,12 +20,14 @@ public class Constant { ...@@ -20,12 +20,14 @@ public class Constant {
public static final Long ONE_YEAR = ONE_MONTH * 12; public static final Long ONE_YEAR = ONE_MONTH * 12;
public static final String SPEC_MINUTE_PATTERN = "yyyy.MM.dd HH:mm"; public static final String SPEC_MINUTE_PATTERN = "yyyy.MM.dd HH:mm";
public static final String SPEC_DAY_PATTERN = "yyyy.MM.dd";
public static final String HOUR_PATTERN = "yyyy-MM-dd HH"; public static final String HOUR_PATTERN = "yyyy-MM-dd HH";
public static final String DAY_PATTERN = "yyyy-MM-dd"; public static final String DAY_PATTERN = "yyyy-MM-dd";
public static final String MONTH_PATTERN = "yyyy-MM"; public static final String MONTH_PATTERN = "yyyy-MM";
public static final String YEAR_PATTERN = "yyyy"; public static final String YEAR_PATTERN = "yyyy";
public static final FastDateFormat SPEC_MINUTE_FORMAT = FastDateFormat.getInstance(SPEC_MINUTE_PATTERN); public static final FastDateFormat SPEC_MINUTE_FORMAT = FastDateFormat.getInstance(SPEC_MINUTE_PATTERN);
public static final FastDateFormat SPEC_DAY_POINT_FORMAT = FastDateFormat.getInstance(SPEC_DAY_PATTERN);
public static final FastDateFormat HOUR_FORMAT = FastDateFormat.getInstance(HOUR_PATTERN); public static final FastDateFormat HOUR_FORMAT = FastDateFormat.getInstance(HOUR_PATTERN);
public static final FastDateFormat DAY_FORMAT = FastDateFormat.getInstance(DAY_PATTERN); public static final FastDateFormat DAY_FORMAT = FastDateFormat.getInstance(DAY_PATTERN);
public static final FastDateFormat SPEC_DAY_FORMAT = FastDateFormat.getInstance("yyyy/MM/dd"); public static final FastDateFormat SPEC_DAY_FORMAT = FastDateFormat.getInstance("yyyy/MM/dd");
......
...@@ -481,7 +481,7 @@ public class AppArticleController extends BaseController { ...@@ -481,7 +481,7 @@ public class AppArticleController extends BaseController {
@ApiOperation("新-舆情分析-活跃渠道") @ApiOperation("新-舆情分析-活跃渠道")
@PostMapping("/analyze/active-channel") @PostMapping("/analyze/active-channel")
public ResponseResult getActiveChannels(@RequestBody MarkSearchDTO markSearchDTO) { public ResponseResult getActiveChannels(@RequestBody MarkSearchDTO markSearchDTO) {
return ResponseResult.success(markDataService.getActiveChannels(markSearchDTO)); return ResponseResult.success(markDataService.getActiveChannels(markSearchDTO, 20));
} }
@ApiOperation("新-舆情分析-ip分布") @ApiOperation("新-舆情分析-ip分布")
...@@ -538,6 +538,20 @@ public class AppArticleController extends BaseController { ...@@ -538,6 +538,20 @@ public class AppArticleController extends BaseController {
return ResponseResult.success(markDataService.getSearchAnalyzeHighWord(markSearchDTO)); return ResponseResult.success(markDataService.getSearchAnalyzeHighWord(markSearchDTO));
} }
@ApiOperation("舆情简报-每日一报列表")
@GetMapping("/daily-report/list")
public ResponseResult getDailyReportList(@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "pageSize", defaultValue = "10")Integer pageSize) {
return ResponseResult.success(markDataService.getDailyReportList(page, pageSize));
}
@ApiOperation("舆情简报-每日一报详情")
@GetMapping("/daily-report/detail/{id}")
@Auth(role = RoleEnum.NO_AUTHORISE)
public ResponseResult getDailyReportDetail(@PathVariable String id) {
return ResponseResult.success(markDataService.getDailyReportDetail(id));
}
private boolean checkMTagIllegal(StringBuilder mtag) { private boolean checkMTagIllegal(StringBuilder mtag) {
List<MarkerTag> hitTags = projectService.getProjectById(UserThreadLocal.getProjectId()).getHitTags(); List<MarkerTag> hitTags = projectService.getProjectById(UserThreadLocal.getProjectId()).getHitTags();
if (!Tools.isEmpty(hitTags)) { if (!Tools.isEmpty(hitTags)) {
......
...@@ -174,6 +174,7 @@ public class AppHotController extends BaseController { ...@@ -174,6 +174,7 @@ public class AppHotController extends BaseController {
@ApiOperation("热点库-品牌热点-关键词调整") @ApiOperation("热点库-品牌热点-关键词调整")
@PutMapping("/keyword/update") @PutMapping("/keyword/update")
@LogRecord(description = "热点库-关键词调整", values = "list", entity = true, arguments = true)
public ResponseResult updateKeyword(@ApiParam(name = "json:{list:关键词数组,contendId:竞品id}") @RequestBody JSONObject json) { public ResponseResult updateKeyword(@ApiParam(name = "json:{list:关键词数组,contendId:竞品id}") @RequestBody JSONObject json) {
JSONArray list = json.getJSONArray("list"); JSONArray list = json.getJSONArray("list");
String contendId = json.getString("contendId"); String contendId = json.getString("contendId");
...@@ -183,6 +184,7 @@ public class AppHotController extends BaseController { ...@@ -183,6 +184,7 @@ public class AppHotController extends BaseController {
@ApiOperation("热点库-品牌热点-噪音词调整") @ApiOperation("热点库-品牌热点-噪音词调整")
@PutMapping("/filter-word/update") @PutMapping("/filter-word/update")
@LogRecord(description = "热点库-噪音词调整", values = "list", entity = true, arguments = true)
public ResponseResult updateFilterWord(@ApiParam(name = "json:{list:噪音词数组,contendId:竞品id}") @RequestBody JSONObject json) { public ResponseResult updateFilterWord(@ApiParam(name = "json:{list:噪音词数组,contendId:竞品id}") @RequestBody JSONObject json) {
JSONArray list = json.getJSONArray("list"); JSONArray list = json.getJSONArray("list");
String contendId = json.getString("contendId"); String contendId = json.getString("contendId");
......
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.DailyReport;
/**
* @ClassName: DailyReportDao
* @Description DailyReportDao
* @author: cjz
* @date: 2024-04-22 11:46
*/
public interface DailyReportDao extends BaseMongoDao<DailyReport>{
}
package com.zhiwei.brandkbs2.dao.impl;
import com.zhiwei.brandkbs2.dao.DailyReportDao;
import com.zhiwei.brandkbs2.pojo.DailyReport;
import org.springframework.stereotype.Component;
/**
* @ClassName: DailyReportDaoImpl
* @Description DailyReportDaoImpl
* @author: cjz
* @date: 2024-04-22 11:46
*/
@Component("dailyReportDao")
public class DailyReportDaoImpl extends BaseMongoDaoImpl<DailyReport> implements DailyReportDao {
private static final String COLLECTION_NAME = "brandkbs_daily_report";
public DailyReportDaoImpl() {
super(COLLECTION_NAME);
}
}
package com.zhiwei.brandkbs2.pojo;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* @author cjz
* @version 1.0
* @description 每日简报实体类
* @date 2024年4月22日10:06:46
*/
@Getter
@Setter
@AllArgsConstructor
public class DailyReport extends AbstractBaseMongo{
private String name;
/**
* 舆情概览
*/
private JSONObject summary;
/**
* 舆情总量
*/
private JSONObject yuqingAmount;
/**
* 情感分布
*/
private JSONObject yuqingEmotion;
/**
* 重点平台
*/
private JSONObject platformPercentage;
/**
* 高频标题
*/
private List<JSONObject> topTitle;
/**
* 发文渠道
*/
private List<JSONObject> topSource;
/**
* 项目id
*/
private String projectId;
/**
* 项目
*/
private String project;
/**
* 时间周期-开始时间
*/
private Long startTime;
/**
* 时间周期-结束时间
*/
private Long endTime;
/**
* 创建时间
*/
private Long cTime;
}
...@@ -3,6 +3,7 @@ package com.zhiwei.brandkbs2.service; ...@@ -3,6 +3,7 @@ package com.zhiwei.brandkbs2.service;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.model.ResponseResult; import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.BaseMap; import com.zhiwei.brandkbs2.pojo.BaseMap;
import com.zhiwei.brandkbs2.pojo.DailyReport;
import com.zhiwei.brandkbs2.pojo.Event; import com.zhiwei.brandkbs2.pojo.Event;
import com.zhiwei.brandkbs2.pojo.MarkFlowEntity; import com.zhiwei.brandkbs2.pojo.MarkFlowEntity;
import com.zhiwei.brandkbs2.pojo.dto.*; import com.zhiwei.brandkbs2.pojo.dto.*;
...@@ -581,7 +582,7 @@ public interface MarkDataService { ...@@ -581,7 +582,7 @@ public interface MarkDataService {
* @param dto 标注数据搜索传输类 * @param dto 标注数据搜索传输类
* @return * @return
*/ */
List<JSONObject> getActiveChannels(MarkSearchDTO dto); List<JSONObject> getActiveChannels(MarkSearchDTO dto, int size);
/** /**
* 新-舆情分析-ip分布 * 新-舆情分析-ip分布
...@@ -673,4 +674,24 @@ public interface MarkDataService { ...@@ -673,4 +674,24 @@ public interface MarkDataService {
PageVO<JSONObject> getArticleList(String aggTitle, Long startTime, Long endTime, String planId, String platform, int page, int pageSize); PageVO<JSONObject> getArticleList(String aggTitle, Long startTime, Long endTime, String planId, String platform, int page, int pageSize);
PageVO<JSONObject> getArticleList(MarkSearchDTO dto); PageVO<JSONObject> getArticleList(MarkSearchDTO dto);
/**
* 生成每日一报
*/
void generateDailyReport(Long startTime, Long endTime);
/**
* 每日一报列表
* @param page
* @param pageSize
* @return
*/
PageVO<JSONObject> getDailyReportList(int page, int pageSize);
/**
* 获取每日一报详情
* @param id id
* @return
*/
DailyReport getDailyReportDetail(String id);
} }
...@@ -57,4 +57,9 @@ public interface TaskService{ ...@@ -57,4 +57,9 @@ public interface TaskService{
* 生成舆情分析词云缓存 * 生成舆情分析词云缓存
*/ */
void yuqingAnalyzeHighWordCache(); void yuqingAnalyzeHighWordCache();
/**
* 生成每日一报
*/
void generateDailyReport();
} }
...@@ -174,6 +174,9 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -174,6 +174,9 @@ public class MarkDataServiceImpl implements MarkDataService {
@Resource(name = "markSearchAnalyzeTaskDao") @Resource(name = "markSearchAnalyzeTaskDao")
MarkSearchAnalyzeTaskDao markSearchAnalyzeTaskDao; MarkSearchAnalyzeTaskDao markSearchAnalyzeTaskDao;
@Resource(name = "dailyReportDao")
DailyReportDao dailyReportDao;
@Resource(name = "toolsetServiceImpl") @Resource(name = "toolsetServiceImpl")
private ToolsetService toolsetService; private ToolsetService toolsetService;
...@@ -1002,18 +1005,18 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -1002,18 +1005,18 @@ public class MarkDataServiceImpl implements MarkDataService {
return Tools.getBaseFromEsMap(hits.getAt(0).getSourceAsMap()); return Tools.getBaseFromEsMap(hits.getAt(0).getSourceAsMap());
} }
private BaseMap getAnalyzeFirstArticle(MarkSearchDTO dto) throws IOException{ private BaseMap getAnalyzeFirstArticle(MarkSearchDTO dto, String aggTitle) throws IOException{
return getArticleSort(dto, "{\"time\" : \"asc\"}"); return getArticleSort(dto, "{\"time\" : \"asc\"}", aggTitle);
} }
private BaseMap getAnalyzeLastArticle(MarkSearchDTO dto) throws IOException { private BaseMap getAnalyzeLastArticle(MarkSearchDTO dto, String aggTitle) throws IOException {
return getArticleSort(dto, "{\"time\" : \"desc\"}"); return getArticleSort(dto, "{\"time\" : \"desc\"}", aggTitle);
} }
private BaseMap getArticleSort(MarkSearchDTO dto, String sorter) throws IOException { private BaseMap getArticleSort(MarkSearchDTO dto, String sorter, String aggTitle) throws IOException {
// 索引 // 索引
String[] indexes = esClientDao.getIndexes(); String[] indexes = esClientDao.getIndexes();
BoolQueryBuilder query = yuqingAnalyzeQuery(dto); BoolQueryBuilder query = yuqingAnalyzeQuery(dto, aggTitle);
//sort //sort
FieldSortBuilder sort = new FieldSortBuilder("time").order(SortOrder.ASC); FieldSortBuilder sort = new FieldSortBuilder("time").order(SortOrder.ASC);
JSONObject sortJson = JSONObject.parseObject(sorter); JSONObject sortJson = JSONObject.parseObject(sorter);
...@@ -2525,7 +2528,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -2525,7 +2528,7 @@ public class MarkDataServiceImpl implements MarkDataService {
platformResult.put("count", bucket.getDocCount()); platformResult.put("count", bucket.getDocCount());
list.add(platformResult); list.add(platformResult);
}); });
res.put("platformCount", list.stream().sorted(Comparator.comparingLong((JSONObject json) -> json.getLongValue("count")).reversed())); res.put("platformCount", list);
JSONObject overview = new JSONObject(); JSONObject overview = new JSONObject();
// 总量 // 总量
overview.put("total", total); overview.put("total", total);
...@@ -2533,11 +2536,11 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -2533,11 +2536,11 @@ public class MarkDataServiceImpl implements MarkDataService {
int days = new Period(dto.getStartTime(), dto.getEndTime(), PeriodType.days()).getDays(); int days = new Period(dto.getStartTime(), dto.getEndTime(), PeriodType.days()).getDays();
days = 0 == days ? 1 : days; days = 0 == days ? 1 : days;
double avg = total == 0 ? 0d : total / (double) days; double avg = total == 0 ? 0d : total / (double) days;
overview.put("avg", avg);
// 项目均值 // 项目均值
String key = RedisUtil.getYuqingAnalyzePlatformAvgCountKey(projectId, Constant.PRIMARY_CONTEND_ID, dto.getPlanId()); String key = RedisUtil.getYuqingAnalyzePlatformAvgCountKey(projectId, Constant.PRIMARY_CONTEND_ID, dto.getPlanId());
double projectAvg = Objects.isNull(redisUtil.get(key)) ? 0d : Double.parseDouble(redisUtil.get(key)); double projectAvg = Objects.isNull(redisUtil.get(key)) ? 0d : Double.parseDouble(redisUtil.get(key));
overview.put("compare", compare(avg, projectAvg)); overview.put("compare", compare(avg, projectAvg));
overview.put("avg", projectAvg);
res.put("overview", overview); res.put("overview", overview);
return res; return res;
}catch (Exception e){ }catch (Exception e){
...@@ -2640,11 +2643,9 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -2640,11 +2643,9 @@ public class MarkDataServiceImpl implements MarkDataService {
BaseMap totalBaseMaps = null; BaseMap totalBaseMaps = null;
BaseMap negativeBaseMaps = null; BaseMap negativeBaseMaps = null;
if (Objects.nonNull(negativeSpreadTendency.getLeft()) || Objects.nonNull(spreadTendency.getLeft())) { if (Objects.nonNull(negativeSpreadTendency.getLeft()) || Objects.nonNull(spreadTendency.getLeft())) {
CompletableFuture.allOf(Stream.of(spreadTendency.getLeft(), negativeSpreadTendency.getLeft()).filter(Objects::nonNull).map(aggTitle -> CompletableFuture.allOf(Stream.of(spreadTendency.getLeft(), negativeSpreadTendency.getLeft()).filter(Objects::nonNull).map(aggTitle -> CompletableFuture.runAsync(() -> {
CompletableFuture.runAsync(() -> {
try { try {
dto.setAggTitle(aggTitle); baseMaps.put(aggTitle, getAnalyzeFirstArticle(dto, aggTitle));
baseMaps.put(aggTitle, getAnalyzeFirstArticle(dto));
} catch (IOException ignored) { } catch (IOException ignored) {
} }
}, executor)).toArray(CompletableFuture[]::new)).join(); }, executor)).toArray(CompletableFuture[]::new)).join();
...@@ -2730,7 +2731,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -2730,7 +2731,7 @@ public class MarkDataServiceImpl implements MarkDataService {
} }
@Override @Override
public List<JSONObject> getActiveChannels(MarkSearchDTO dto) { public List<JSONObject> getActiveChannels(MarkSearchDTO dto, int size) {
List<JSONObject> list = new ArrayList<>(); List<JSONObject> list = new ArrayList<>();
try { try {
dto.setProjectId(UserThreadLocal.getProjectId()); dto.setProjectId(UserThreadLocal.getProjectId());
...@@ -2739,7 +2740,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -2739,7 +2740,7 @@ public class MarkDataServiceImpl implements MarkDataService {
// query // query
BoolQueryBuilder query = yuqingAnalyzeQuery(dto); BoolQueryBuilder query = yuqingAnalyzeQuery(dto);
// 渠道聚合,取前20 // 渠道聚合,取前20
TermsAggregationBuilder sourceAggregationBuilder = AggregationBuilders.terms("source_count").field("source").order(BucketOrder.count(false)).size(20 + Tools.FILTER_SOURCE.size()); TermsAggregationBuilder sourceAggregationBuilder = AggregationBuilders.terms("source_count").field("source").order(BucketOrder.count(false)).size(size + Tools.FILTER_SOURCE.size());
// 情感倾向子聚合 // 情感倾向子聚合
TermsAggregationBuilder emotionAggregationBuilder = AggregationBuilders.terms("emotion_count").field("brandkbs_mark_cache_maps.name.keyword"); TermsAggregationBuilder emotionAggregationBuilder = AggregationBuilders.terms("emotion_count").field("brandkbs_mark_cache_maps.name.keyword");
SearchResponse searchResponse = esClientDao.searchResponse(indexes, null, query, SearchResponse searchResponse = esClientDao.searchResponse(indexes, null, query,
...@@ -2773,7 +2774,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -2773,7 +2774,7 @@ public class MarkDataServiceImpl implements MarkDataService {
}catch (Exception e){ }catch (Exception e){
ExceptionCast.cast(CommonCodeEnum.FAIL, "新舆情分析getActiveChannels异常-", e); ExceptionCast.cast(CommonCodeEnum.FAIL, "新舆情分析getActiveChannels异常-", e);
} }
return list.stream().limit(20).collect(Collectors.toList()); return list.stream().limit(size).collect(Collectors.toList());
} }
@Override @Override
...@@ -2909,7 +2910,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -2909,7 +2910,7 @@ public class MarkDataServiceImpl implements MarkDataService {
List<JSONObject> markTopTitleList = getMarkTopTitle(dto, size); List<JSONObject> markTopTitleList = getMarkTopTitle(dto, size);
CompletableFuture.allOf(markTopTitleList.stream().map(json -> CompletableFuture.supplyAsync(() -> { CompletableFuture.allOf(markTopTitleList.stream().map(json -> CompletableFuture.supplyAsync(() -> {
try { try {
BaseMap firstArticle = getAnalyzeFirstArticle(dto); BaseMap firstArticle = getAnalyzeFirstArticle(dto, json.getString("title"));
json.put("content", firstArticle.getContent()); json.put("content", firstArticle.getContent());
json.put("url", firstArticle.getUrl()); json.put("url", firstArticle.getUrl());
json.put("realSource", firstArticle.getRealSource()); json.put("realSource", firstArticle.getRealSource());
...@@ -2941,7 +2942,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -2941,7 +2942,7 @@ public class MarkDataServiceImpl implements MarkDataService {
CompletableFuture<JSONObject> firstArticleFuture = CompletableFuture.supplyAsync(() -> { CompletableFuture<JSONObject> firstArticleFuture = CompletableFuture.supplyAsync(() -> {
try { try {
// 最早发布 // 最早发布
BaseMap firstArticle = getAnalyzeFirstArticle(dto); BaseMap firstArticle = getAnalyzeFirstArticle(dto, null);
// 匹配重要渠道 // 匹配重要渠道
JSONObject firstSensitiveChannel = channelService.matchYuQingSensitiveChannel(linkedGroupId, firstArticle.getSource()); JSONObject firstSensitiveChannel = channelService.matchYuQingSensitiveChannel(linkedGroupId, firstArticle.getSource());
JSONObject firstArticleJson = JSONObject.parseObject(JSONObject.toJSONString(firstArticle)); JSONObject firstArticleJson = JSONObject.parseObject(JSONObject.toJSONString(firstArticle));
...@@ -2954,7 +2955,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -2954,7 +2955,7 @@ public class MarkDataServiceImpl implements MarkDataService {
CompletableFuture<JSONObject> lastArticleFuture = CompletableFuture.supplyAsync(() -> { CompletableFuture<JSONObject> lastArticleFuture = CompletableFuture.supplyAsync(() -> {
try { try {
// 最新发布 // 最新发布
BaseMap lastArticle = getAnalyzeLastArticle(dto); BaseMap lastArticle = getAnalyzeLastArticle(dto, null);
// 匹配重要渠道 // 匹配重要渠道
JSONObject lastSensitiveChannel = channelService.matchYuQingSensitiveChannel(linkedGroupId, lastArticle.getSource()); JSONObject lastSensitiveChannel = channelService.matchYuQingSensitiveChannel(linkedGroupId, lastArticle.getSource());
JSONObject lastArticleJson = JSONObject.parseObject(JSONObject.toJSONString(lastArticle)); JSONObject lastArticleJson = JSONObject.parseObject(JSONObject.toJSONString(lastArticle));
...@@ -3098,6 +3099,79 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -3098,6 +3099,79 @@ public class MarkDataServiceImpl implements MarkDataService {
return PageVO.createPageVo(0, page, pageSize, Collections.emptyList()); return PageVO.createPageVo(0, page, pageSize, Collections.emptyList());
} }
@Override
public void generateDailyReport(Long startTime, Long endTime) {
MarkSearchDTO dto = convertedToMarkSearch(null, startTime, endTime, null);
// 舆情总量
JSONObject yuqingAmount = getYuqingAmount(dto);
// 情感分布
JSONObject yuqingEmotion = getYuqingEmotionDistribution(dto);
// 重点平台
JSONObject platformPercentage = getImportantPlatformPercentage(dto);
// 舆情概览
JSONObject summary = getDailyReportSummary(yuqingAmount, yuqingEmotion, platformPercentage);
// 高频标题
List<JSONObject> topTitle = getLastNews(dto, 10);
// 发文渠道
List<JSONObject> topSource = getActiveChannels(dto, 10);
String projectId = UserThreadLocal.getProjectId();
String projectName = projectService.getProjectById(projectId).getProjectName();
String name = "每日一报 " + Constant.SPEC_DAY_POINT_FORMAT.format(endTime);
DailyReport dailyReport = new DailyReport(name, summary, yuqingAmount, yuqingEmotion, platformPercentage, topTitle, topSource,
projectId, projectName, startTime, endTime, System.currentTimeMillis());
dailyReportDao.insertOne(dailyReport);
}
@Override
public PageVO<JSONObject> getDailyReportList(int page, int pageSize) {
Query query = new Query();
query.addCriteria(Criteria.where("projectId").is(UserThreadLocal.getProjectId()));
long total = dailyReportDao.count(query);
query.limit(pageSize);
query.skip((long) (page - 1) * pageSize);
dailyReportDao.addSort(query, "{\"endTime\":\"descend\"}");
List<DailyReport> list = dailyReportDao.findList(query);
List<JSONObject> res = new ArrayList<>();
for (DailyReport report : list) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", report.getId());
jsonObject.put("name", report.getName());
res.add(jsonObject);
}
return PageVO.createPageVo(total, page, pageSize, res);
}
@Override
public DailyReport getDailyReportDetail(String id) {
return dailyReportDao.findOneById(id);
}
private JSONObject getDailyReportSummary(JSONObject yuqingAmount, JSONObject yuqingEmotion, JSONObject platformPercentage){
JSONObject res = new JSONObject();
long total = yuqingAmount.getLongValue("total");
res.put("total", total);
res.put("positivePercent", yuqingEmotion.getJSONObject("positive").getDoubleValue("positivePercent"));
res.put("negativePercent", yuqingEmotion.getJSONObject("negative").getDoubleValue("negativePercent"));
res.put("neutralPercent", yuqingEmotion.getJSONObject("neutral").getDoubleValue("neutralPercent"));
List<String> importantPlatforms = Arrays.asList("微博", "微信", "抖音", "小红书", "今日头条", "网媒");
List<JSONObject> platformCount = platformPercentage.getJSONArray("platformCount").toJavaList(JSONObject.class);
List<String> platform = platformCount.stream().map(jsonObject -> jsonObject.getString("platform")).collect(Collectors.toList());
for (String importantPlatform : importantPlatforms) {
if (!platform.contains(importantPlatform)){
JSONObject jsonObject = new JSONObject();
jsonObject.put("platform", importantPlatform);
jsonObject.put("count", 0L);
platformCount.add(jsonObject);
}
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("platform", "其他");
jsonObject.put("count", total - platformCount.stream().mapToLong(p -> p.getLongValue("count")).sum());
platformCount.add(jsonObject);
res.put("platformCount", platformCount);
return res;
}
private MarkSearchDTO convertedToMarkSearch(String aggTitle, Long startTime, Long endTime, String planId){ private MarkSearchDTO convertedToMarkSearch(String aggTitle, Long startTime, Long endTime, String planId){
MarkSearchDTO dto = new MarkSearchDTO(); MarkSearchDTO dto = new MarkSearchDTO();
dto.setAggTitle(aggTitle); dto.setAggTitle(aggTitle);
...@@ -3173,7 +3247,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -3173,7 +3247,7 @@ public class MarkDataServiceImpl implements MarkDataService {
TermsAggregationBuilder titleAggregationBuilder = AggregationBuilders.terms("titleAgg").field("agg_title.keyword").order(BucketOrder.count(false)); TermsAggregationBuilder titleAggregationBuilder = AggregationBuilders.terms("titleAgg").field("agg_title.keyword").order(BucketOrder.count(false));
dto.setPlatforms(null); dto.setPlatforms(null);
// query // query
BoolQueryBuilder query = yuqingAnalyzeQuery(dto, emotion); BoolQueryBuilder query = yuqingAnalyzeQuery(dto, emotion, null);
// response // response
SearchResponse searchResponse = esClientDao.searchResponse(indexes, null, query, SearchResponse searchResponse = esClientDao.searchResponse(indexes, null, query,
daysAggregationBuilder.subAggregation(titleAggregationBuilder), null, null, 0, 0, null); daysAggregationBuilder.subAggregation(titleAggregationBuilder), null, null, 0, 0, null);
...@@ -3200,24 +3274,21 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -3200,24 +3274,21 @@ public class MarkDataServiceImpl implements MarkDataService {
} }
private Long getYuqingAnalyzeCount(MarkSearchDTO dto) throws IOException { private Long getYuqingAnalyzeCount(MarkSearchDTO dto) throws IOException {
BoolQueryBuilder query = yuqingAnalyzeQuery(dto, null); BoolQueryBuilder query = yuqingAnalyzeQuery(dto, null, null);
return esClientDao.count(query); return esClientDao.count(query);
} }
private Long getYuqingAnalyzeCount(MarkSearchDTO dto, String emotion) throws IOException { private Long getYuqingAnalyzeCount(MarkSearchDTO dto, String emotion) throws IOException {
BoolQueryBuilder query = yuqingAnalyzeQuery(dto, emotion); BoolQueryBuilder query = yuqingAnalyzeQuery(dto, emotion, null);
return esClientDao.count(query); return esClientDao.count(query);
} }
private Long getYuqingAnalyzeCount(Long startTime, Long endTime, String projectId, String planId, String emotion, List<String> platforms) throws IOException { private Long getYuqingAnalyzeCount(Long startTime, Long endTime, String projectId, String planId, String emotion, List<String> platforms) throws IOException {
BoolQueryBuilder query = yuqingAnalyzeQuery(startTime, endTime, projectId, planId, emotion, platforms, null); BoolQueryBuilder query = yuqingAnalyzeQuery(startTime, endTime, projectId, planId, emotion, platforms);
return esClientDao.count(query); return esClientDao.count(query);
} }
private BoolQueryBuilder yuqingAnalyzeQuery(Long startTime, Long endTime, String projectId, String planId, String emotion, List<String> platforms, String aggTitle){ private BoolQueryBuilder yuqingAnalyzeQuery(Long startTime, Long endTime, String projectId, String planId, String emotion, List<String> platforms){
if (Objects.isNull(projectId)) {
projectId = UserThreadLocal.getProjectId();
}
// project plan query // project plan query
BoolQueryBuilder query = EsQueryTools.assembleCacheMapsPlanQuery(projectId, planId); BoolQueryBuilder query = EsQueryTools.assembleCacheMapsPlanQuery(projectId, planId);
if (Objects.isNull(planId)){ if (Objects.isNull(planId)){
...@@ -3244,17 +3315,18 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -3244,17 +3315,18 @@ public class MarkDataServiceImpl implements MarkDataService {
if (Objects.nonNull(endTime)) { if (Objects.nonNull(endTime)) {
query.must(QueryBuilders.rangeQuery("time").lt(endTime)); query.must(QueryBuilders.rangeQuery("time").lt(endTime));
} }
// aggTitle
if (Objects.nonNull(aggTitle)){
query.must(QueryBuilders.termQuery("agg_title.keyword", aggTitle));
}
return query; return query;
} }
private BoolQueryBuilder yuqingAnalyzeQuery(MarkSearchDTO dto){ private BoolQueryBuilder yuqingAnalyzeQuery(MarkSearchDTO dto){
return yuqingAnalyzeQuery(dto, null); return yuqingAnalyzeQuery(dto, null, null);
}
private BoolQueryBuilder yuqingAnalyzeQuery(MarkSearchDTO dto, String aggTitle){
return yuqingAnalyzeQuery(dto, null, aggTitle);
} }
private BoolQueryBuilder yuqingAnalyzeQuery(MarkSearchDTO dto, String emotion){ private BoolQueryBuilder yuqingAnalyzeQuery(MarkSearchDTO dto, String emotion, String aggTitle){
// projectId、contendId // projectId、contendId
String projectId = dto.getProjectId(); String projectId = dto.getProjectId();
String contendId = dto.getContendId(); String contendId = dto.getContendId();
...@@ -3310,8 +3382,8 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -3310,8 +3382,8 @@ public class MarkDataServiceImpl implements MarkDataService {
postFilter.must(QueryBuilders.rangeQuery(GenericAttribute.ES_MGID).lt(dto.getPageGid())); postFilter.must(QueryBuilders.rangeQuery(GenericAttribute.ES_MGID).lt(dto.getPageGid()));
} }
// 聚合标题 // 聚合标题
if (Objects.nonNull(dto.getAggTitle())){ if (Objects.nonNull(aggTitle)){
postFilter.must(QueryBuilders.termQuery("agg_title.keyword", dto.getAggTitle())); postFilter.must(QueryBuilders.termQuery("agg_title.keyword", aggTitle));
} }
return postFilter; return postFilter;
} }
......
...@@ -399,6 +399,25 @@ public class TaskServiceImpl implements TaskService { ...@@ -399,6 +399,25 @@ public class TaskServiceImpl implements TaskService {
CompletableFuture.allOf(projectFutures.toArray(new CompletableFuture[0])).join(); CompletableFuture.allOf(projectFutures.toArray(new CompletableFuture[0])).join();
} }
@Override
public void generateDailyReport() {
// 时间范围:当天早上八点-前一天早上八点
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
long endTime = calendar.getTimeInMillis();
long startTime = endTime - Constant.ONE_DAY;
AtomicInteger total = new AtomicInteger();
CompletableFuture.allOf(GlobalPojo.PROJECT_MAP.values().stream().map(project -> CompletableFuture.supplyAsync(() -> {
UserThreadLocal.set(new UserInfo().setProjectId(project.getId()));
markDataService.generateDailyReport(startTime, endTime);
log.info("项目:{}-{}-每日一报生成已完成:{}个", project.getProjectName(), project.getId(), total.incrementAndGet());
return null;
}, cacheServiceExecutor)).toArray(CompletableFuture[]::new)).join();
}
private boolean reportSendByProject(Project project) { private boolean reportSendByProject(Project project) {
boolean flag = false; boolean flag = false;
// 扫描setting信息并生成对应报告 // 扫描setting信息并生成对应报告
......
...@@ -105,4 +105,17 @@ public class ControlCenter { ...@@ -105,4 +105,17 @@ public class ControlCenter {
log.info("定时按周计算项目均值-结束"); log.info("定时按周计算项目均值-结束");
} }
} }
@Async("scheduledExecutor")
@Scheduled(cron = "0 0 8 * * ?")
public void generateDailyReport() {
log.info("定时生成每日一报-启动");
try {
taskService.generateDailyReport();
} catch (Exception e) {
log.error("定时生成每日一报-出错", e);
} finally {
log.info("定时生成每日一报-结束");
}
}
} }
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