Commit 4a6ee037 by shenjunjie

Merge branch 'feature' into 'dev'

Feature

See merge request !594
parents 3a21a0ba 395e9e67
...@@ -26,10 +26,14 @@ public class Constant { ...@@ -26,10 +26,14 @@ public class Constant {
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 String SECOND_PATTERN = "yyyy-MM-dd HH:mm:ss";
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 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 EXCEL_TIME_FORMAT = FastDateFormat.getInstance(SECOND_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");
public static final FastDateFormat ONLY_MONTH_FORMAT = FastDateFormat.getInstance("M月"); public static final FastDateFormat ONLY_MONTH_FORMAT = FastDateFormat.getInstance("M月");
public static final FastDateFormat DF_yyyyMMdd = FastDateFormat.getInstance("yyyyMMdd"); public static final FastDateFormat DF_yyyyMMdd = FastDateFormat.getInstance("yyyyMMdd");
......
...@@ -70,7 +70,7 @@ public class BehaviorController extends BaseController { ...@@ -70,7 +70,7 @@ public class BehaviorController extends BaseController {
@RequestParam(value = "behavior", defaultValue = "true") boolean behavior) { @RequestParam(value = "behavior", defaultValue = "true") boolean behavior) {
List<ExportBehaviorDTO> downloadList = behaviorService.download(startTime, endTime, behavior); List<ExportBehaviorDTO> downloadList = behaviorService.download(startTime, endTime, behavior);
String behaviorName = behavior ? "后台" : "前台"; String behaviorName = behavior ? "后台" : "前台";
String sheetName = ProjectService.getProjectVOById(UserThreadLocal.getProjectId()).getProjectName() + "_" + behaviorName; String sheetName = ProjectService.getProjectVOById(UserThreadLocal.getProjectId()).getExtraProjectName() + "_" + behaviorName;
EasyExcelUtil.download(sheetName + "用户行为", sheetName, ExportBehaviorDTO.class, downloadList, response); EasyExcelUtil.download(sheetName + "用户行为", sheetName, ExportBehaviorDTO.class, downloadList, response);
return ResponseResult.success(); return ResponseResult.success();
} }
...@@ -111,7 +111,7 @@ public class BehaviorController extends BaseController { ...@@ -111,7 +111,7 @@ public class BehaviorController extends BaseController {
public ResponseResult downloadLogRecordList(@RequestParam("startTime") long startTime, public ResponseResult downloadLogRecordList(@RequestParam("startTime") long startTime,
@RequestParam("endTime") long endTime) { @RequestParam("endTime") long endTime) {
List<ExportUserLogRecordDTO> list = behaviorService.downloadUserLogRecord(startTime, endTime); List<ExportUserLogRecordDTO> list = behaviorService.downloadUserLogRecord(startTime, endTime);
String sheetName = ProjectService.getProjectVOById(UserThreadLocal.getProjectId()).getProjectName() + "_操作记录"; String sheetName = ProjectService.getProjectVOById(UserThreadLocal.getProjectId()).getExtraProjectName() + "_操作记录";
EasyExcelUtil.download(sheetName, sheetName, ExportUserLogRecordDTO.class, list, response); EasyExcelUtil.download(sheetName, sheetName, ExportUserLogRecordDTO.class, list, response);
return ResponseResult.success(); return ResponseResult.success();
} }
......
...@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.admin; ...@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.admin;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal; import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController; import com.zhiwei.brandkbs2.controller.BaseController;
...@@ -89,6 +90,7 @@ public class ProjectController extends BaseController { ...@@ -89,6 +90,7 @@ public class ProjectController extends BaseController {
@ApiOperation("修改项目") @ApiOperation("修改项目")
@PutMapping("/update") @PutMapping("/update")
@LogRecord(values = "extraProjectName", description = "修改项目-修改别名", arguments = true, entity = true)
public ResponseResult updateProject(@RequestBody ProjectVO projectVO) { public ResponseResult updateProject(@RequestBody ProjectVO projectVO) {
return ProjectService.updateProject(projectVO); return ProjectService.updateProject(projectVO);
} }
......
...@@ -67,6 +67,9 @@ public class AppDownloadController extends BaseController { ...@@ -67,6 +67,9 @@ public class AppDownloadController extends BaseController {
@Resource(name = "markDataServiceImpl") @Resource(name = "markDataServiceImpl")
MarkDataService markDataService; MarkDataService markDataService;
@Resource(name = "searchWholeServiceImpl")
SearchWholeService searchWholeService;
@Resource(name = "toolsetServiceImpl") @Resource(name = "toolsetServiceImpl")
private ToolsetService toolsetService; private ToolsetService toolsetService;
...@@ -94,7 +97,7 @@ public class AppDownloadController extends BaseController { ...@@ -94,7 +97,7 @@ public class AppDownloadController extends BaseController {
HttpEntity<org.springframework.core.io.Resource> entity = restTemplate.exchange(yuqingInterface + "/upload/template/form?projectId=" + project.getBrandLinkedGroupId(), HttpMethod.GET, HttpEntity<org.springframework.core.io.Resource> entity = restTemplate.exchange(yuqingInterface + "/upload/template/form?projectId=" + project.getBrandLinkedGroupId(), HttpMethod.GET,
requestEntity, org.springframework.core.io.Resource.class); requestEntity, org.springframework.core.io.Resource.class);
// excel写入至指定路径 // excel写入至指定路径
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, project.getProjectName(), UserThreadLocal.getNickname(), project.getBrandName() + "_稿件模板"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, project.getBrandName(), UserThreadLocal.getNickname(), project.getBrandName() + "_稿件模板");
if (null != entity.getBody()) { if (null != entity.getBody()) {
EasyExcelUtil.write(filePath, entity.getBody().getInputStream()); EasyExcelUtil.write(filePath, entity.getBody().getInputStream());
} }
...@@ -118,7 +121,7 @@ public class AppDownloadController extends BaseController { ...@@ -118,7 +121,7 @@ public class AppDownloadController extends BaseController {
HttpEntity<JSONObject> requestEntity = new HttpEntity<>(getHeaders()); HttpEntity<JSONObject> requestEntity = new HttpEntity<>(getHeaders());
HttpEntity<org.springframework.core.io.Resource> entity = restTemplate.exchange(yuqingInterface + "/upload/list/download/file/" + id + "?formType=" + formType, HttpMethod.GET, requestEntity, org.springframework.core.io.Resource.class); HttpEntity<org.springframework.core.io.Resource> entity = restTemplate.exchange(yuqingInterface + "/upload/list/download/file/" + id + "?formType=" + formType, HttpMethod.GET, requestEntity, org.springframework.core.io.Resource.class);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectVOById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectVOById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), id + "_" + formType); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), id + "_" + formType);
if (null != entity.getBody()) { if (null != entity.getBody()) {
EasyExcelUtil.write(filePath, entity.getBody().getInputStream()); EasyExcelUtil.write(filePath, entity.getBody().getInputStream());
...@@ -139,7 +142,7 @@ public class AppDownloadController extends BaseController { ...@@ -139,7 +142,7 @@ public class AppDownloadController extends BaseController {
List<ExportWordDTO> list = highWordService.downloadWord(projectId); List<ExportWordDTO> list = highWordService.downloadWord(projectId);
ProjectVO projectVO = projectService.getProjectVOById(projectId); ProjectVO projectVO = projectService.getProjectVOById(projectId);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectVO.getProjectName(); String projectName = projectVO.getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), projectVO.getBrandName() + "_高频关键词"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), projectVO.getBrandName() + "_高频关键词");
EasyExcelUtil.write(filePath, "sheet1", ExportWordDTO.class, list); EasyExcelUtil.write(filePath, "sheet1", ExportWordDTO.class, list);
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
...@@ -154,7 +157,7 @@ public class AppDownloadController extends BaseController { ...@@ -154,7 +157,7 @@ public class AppDownloadController extends BaseController {
List<ExportWordDTO> list = highlightWordService.downloadWord(projectId); List<ExportWordDTO> list = highlightWordService.downloadWord(projectId);
ProjectVO projectVO = projectService.getProjectVOById(projectId); ProjectVO projectVO = projectService.getProjectVOById(projectId);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectVO.getProjectName(); String projectName = projectVO.getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), projectVO.getBrandName() + "_舆情列表高亮关键词"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), projectVO.getBrandName() + "_舆情列表高亮关键词");
EasyExcelUtil.write(filePath, "sheet1", ExportWordDTO.class, list); EasyExcelUtil.write(filePath, "sheet1", ExportWordDTO.class, list);
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
...@@ -175,7 +178,7 @@ public class AppDownloadController extends BaseController { ...@@ -175,7 +178,7 @@ public class AppDownloadController extends BaseController {
List<ExportBehaviorDTO> downloadList = behaviorService.download(startTime, endTime, behavior); List<ExportBehaviorDTO> downloadList = behaviorService.download(startTime, endTime, behavior);
String behaviorName = behavior ? "后台" : "前台"; String behaviorName = behavior ? "后台" : "前台";
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), behaviorName + "_用户行为"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), behaviorName + "_用户行为");
EasyExcelUtil.write(filePath, "sheet1", ExportBehaviorDTO.class, downloadList); EasyExcelUtil.write(filePath, "sheet1", ExportBehaviorDTO.class, downloadList);
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
...@@ -193,7 +196,7 @@ public class AppDownloadController extends BaseController { ...@@ -193,7 +196,7 @@ public class AppDownloadController extends BaseController {
@RequestParam("endTime") long endTime) { @RequestParam("endTime") long endTime) {
List<ExportUserLogRecordDTO> list = behaviorService.downloadUserLogRecord(startTime, endTime); List<ExportUserLogRecordDTO> list = behaviorService.downloadUserLogRecord(startTime, endTime);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "操作记录"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "操作记录");
EasyExcelUtil.write(filePath, "sheet1", ExportUserLogRecordDTO.class, list); EasyExcelUtil.write(filePath, "sheet1", ExportUserLogRecordDTO.class, list);
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
...@@ -217,7 +220,7 @@ public class AppDownloadController extends BaseController { ...@@ -217,7 +220,7 @@ public class AppDownloadController extends BaseController {
@RequestParam(value = "keyword", defaultValue = "") String keyword) { @RequestParam(value = "keyword", defaultValue = "") String keyword) {
List<ExportChannelDTO> downloadChannelList = channelService.findDownloadChannelList(contendId, emotion, platform, show, keyword); List<ExportChannelDTO> downloadChannelList = channelService.findDownloadChannelList(contendId, emotion, platform, show, keyword);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "渠道列表数据"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "渠道列表数据");
EasyExcelUtil.write(filePath, "sheet1", ExportChannelDTO.class, downloadChannelList); EasyExcelUtil.write(filePath, "sheet1", ExportChannelDTO.class, downloadChannelList);
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
...@@ -231,7 +234,7 @@ public class AppDownloadController extends BaseController { ...@@ -231,7 +234,7 @@ public class AppDownloadController extends BaseController {
public ResponseResult downloadArticleList(@RequestParam(value = "channelId") String channelId) { public ResponseResult downloadArticleList(@RequestParam(value = "channelId") String channelId) {
List<ExportAdminChannelArticleDTO> downloadChannelArticleList = channelService.findDownloadChannelArticleList(channelId); List<ExportAdminChannelArticleDTO> downloadChannelArticleList = channelService.findDownloadChannelArticleList(channelId);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), channelId + "_渠道稿件列表数据"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), channelId + "_渠道稿件列表数据");
EasyExcelUtil.write(filePath, channelId, ExportAdminChannelArticleDTO.class, downloadChannelArticleList); EasyExcelUtil.write(filePath, channelId, ExportAdminChannelArticleDTO.class, downloadChannelArticleList);
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
...@@ -245,7 +248,7 @@ public class AppDownloadController extends BaseController { ...@@ -245,7 +248,7 @@ public class AppDownloadController extends BaseController {
public ResponseResult downloadEventList(@RequestParam(value = "channelId") String channelId) { public ResponseResult downloadEventList(@RequestParam(value = "channelId") String channelId) {
List<ExportAdminChannelEventDTO> downloadChannelEventList = channelService.findDownloadChannelEventList(channelId); List<ExportAdminChannelEventDTO> downloadChannelEventList = channelService.findDownloadChannelEventList(channelId);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), channelId + "_渠道事件列表数据"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), channelId + "_渠道事件列表数据");
EasyExcelUtil.write(filePath, channelId, ExportAdminChannelEventDTO.class, downloadChannelEventList); EasyExcelUtil.write(filePath, channelId, ExportAdminChannelEventDTO.class, downloadChannelEventList);
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
...@@ -262,7 +265,7 @@ public class AppDownloadController extends BaseController { ...@@ -262,7 +265,7 @@ public class AppDownloadController extends BaseController {
boolean day = json.getBooleanValue("day"); boolean day = json.getBooleanValue("day");
List<JSONObject> collect = extraService.outputUsedList(personal, startTime, endTime, day); List<JSONObject> collect = extraService.outputUsedList(personal, startTime, endTime, day);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "全网搜使用记录"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "全网搜使用记录");
if (personal) { if (personal) {
List<ExportWholeSearchRecordDTO> list = collect.stream().map(ExportWholeSearchRecordDTO::createFromJSONObject).collect(Collectors.toList()); List<ExportWholeSearchRecordDTO> list = collect.stream().map(ExportWholeSearchRecordDTO::createFromJSONObject).collect(Collectors.toList());
...@@ -286,7 +289,7 @@ public class AppDownloadController extends BaseController { ...@@ -286,7 +289,7 @@ public class AppDownloadController extends BaseController {
boolean day = json.getBooleanValue("day"); boolean day = json.getBooleanValue("day");
List<JSONObject> collect = extraService.outputInteractionUsedList(personal, startTime, endTime, day); List<JSONObject> collect = extraService.outputInteractionUsedList(personal, startTime, endTime, day);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "互动量更新使用记录"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "互动量更新使用记录");
if (personal) { if (personal) {
List<ExportInteractionUpdateRecordDTO> list = collect.stream().map(ExportInteractionUpdateRecordDTO::createFromJSONObject).collect(Collectors.toList()); List<ExportInteractionUpdateRecordDTO> list = collect.stream().map(ExportInteractionUpdateRecordDTO::createFromJSONObject).collect(Collectors.toList());
...@@ -306,7 +309,7 @@ public class AppDownloadController extends BaseController { ...@@ -306,7 +309,7 @@ public class AppDownloadController extends BaseController {
public ResponseResult downloadArticles(@PathVariable("pid") String pid) { public ResponseResult downloadArticles(@PathVariable("pid") String pid) {
ProjectVO project = projectService.getProjectVOById(pid); ProjectVO project = projectService.getProjectVOById(pid);
// excel写入至指定路径 // excel写入至指定路径
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, project.getProjectName(), UserThreadLocal.getNickname(), project.getBrandName() + "_命中关键词"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, project.getExtraProjectName(), UserThreadLocal.getNickname(), project.getBrandName() + "_命中关键词");
EasyExcelUtil.write(filePath, "sheet1", UploadKeywordDTO.class, UploadKeywordDTO.change2This(project.getHitKeywords())); EasyExcelUtil.write(filePath, "sheet1", UploadKeywordDTO.class, UploadKeywordDTO.change2This(project.getHitKeywords()));
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
} }
...@@ -318,7 +321,7 @@ public class AppDownloadController extends BaseController { ...@@ -318,7 +321,7 @@ public class AppDownloadController extends BaseController {
public ResponseResult exportOriginList(@RequestBody MarkSearchDTO markSearchDTO) { public ResponseResult exportOriginList(@RequestBody MarkSearchDTO markSearchDTO) {
Pair<String, List<ExportAppYuqingDTO>> stringListPair = markDataService.downloadYuqingMarkList(markSearchDTO); Pair<String, List<ExportAppYuqingDTO>> stringListPair = markDataService.downloadYuqingMarkList(markSearchDTO);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), stringListPair.getLeft() + "_原始数据列表数据"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), stringListPair.getLeft() + "_原始数据列表数据");
EasyExcelUtil.write(filePath, "sheet1", ExportAppYuqingDTO.class, stringListPair.getRight()); EasyExcelUtil.write(filePath, "sheet1", ExportAppYuqingDTO.class, stringListPair.getRight());
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
...@@ -329,11 +332,11 @@ public class AppDownloadController extends BaseController { ...@@ -329,11 +332,11 @@ public class AppDownloadController extends BaseController {
@LogRecord(description = "舆情库-有效舆情导出", values = {"startTime", "endTime", "customTags", "field", "keyword", "politicsLevel", "mainBodyType", "platforms", "region", "tags"}, entity = true, arguments = true) @LogRecord(description = "舆情库-有效舆情导出", values = {"startTime", "endTime", "customTags", "field", "keyword", "politicsLevel", "mainBodyType", "platforms", "region", "tags"}, entity = true, arguments = true)
@DownloadTask(taskName = "舆情库有效舆情数据下载", description = "舆情库有效舆情数据") @DownloadTask(taskName = "舆情库有效舆情数据下载", description = "舆情库有效舆情数据")
public ResponseResult exportYuqingMarkList(@RequestBody MarkSearchDTO markSearchDTO) { public ResponseResult exportYuqingMarkList(@RequestBody MarkSearchDTO markSearchDTO) {
Pair<String, List<ExportAppYuqingDTO>> stringListPair = markDataService.downloadYuqingMarkList(markSearchDTO); Pair<String, Pair<List<List<String>>, List<List<Object>>>> stringPairPair = markDataService.downloadMarkListDynamicHead(markSearchDTO);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), stringListPair.getLeft() + "_舆情列表数据"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), stringPairPair.getLeft() + "_舆情列表数据");
EasyExcelUtil.write(filePath, "sheet1", ExportAppYuqingDTO.class, stringListPair.getRight()); EasyExcelUtil.dynamicHeadWrite(filePath, "sheet1", stringPairPair.getRight().getLeft(), stringPairPair.getRight().getRight());
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
} }
...@@ -344,7 +347,7 @@ public class AppDownloadController extends BaseController { ...@@ -344,7 +347,7 @@ public class AppDownloadController extends BaseController {
public ResponseResult downloadNonManualMarkList(@RequestBody MarkSearchDTO markSearchDTO) { public ResponseResult downloadNonManualMarkList(@RequestBody MarkSearchDTO markSearchDTO) {
Pair<String, List<ExportAppYuqingDTO>> stringListPair = markDataService.downloadNonManualMarkList(markSearchDTO); Pair<String, List<ExportAppYuqingDTO>> stringListPair = markDataService.downloadNonManualMarkList(markSearchDTO);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), stringListPair.getLeft() + "_舆情列表数据"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), stringListPair.getLeft() + "_舆情列表数据");
EasyExcelUtil.write(filePath, "sheet1", ExportAppYuqingDTO.class, stringListPair.getRight()); EasyExcelUtil.write(filePath, "sheet1", ExportAppYuqingDTO.class, stringListPair.getRight());
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
...@@ -365,7 +368,7 @@ public class AppDownloadController extends BaseController { ...@@ -365,7 +368,7 @@ public class AppDownloadController extends BaseController {
@RequestParam(value = "contendId", defaultValue = "0") String contendId) { @RequestParam(value = "contendId", defaultValue = "0") String contendId) {
List<ExportAppChannelArticleDTO> exportAppChannelArticleDTOS = channelService.downloadArticlesByTime(startTime, endTime, channelId, contendId); List<ExportAppChannelArticleDTO> exportAppChannelArticleDTOS = channelService.downloadArticlesByTime(startTime, endTime, channelId, contendId);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), channelId + "稿件列表数据"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), channelId + "稿件列表数据");
EasyExcelUtil.write(filePath, "sheet1", ExportAppChannelArticleDTO.class, exportAppChannelArticleDTOS); EasyExcelUtil.write(filePath, "sheet1", ExportAppChannelArticleDTO.class, exportAppChannelArticleDTOS);
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
...@@ -386,7 +389,7 @@ public class AppDownloadController extends BaseController { ...@@ -386,7 +389,7 @@ public class AppDownloadController extends BaseController {
@RequestParam(value = "contendId", defaultValue = "0") String contendId) { @RequestParam(value = "contendId", defaultValue = "0") String contendId) {
List<ExportAppChannelEventDTO> exportAppChannelEventDTOS = channelService.downloadEventsByTime(startTime, endTime, channelId, contendId); List<ExportAppChannelEventDTO> exportAppChannelEventDTOS = channelService.downloadEventsByTime(startTime, endTime, channelId, contendId);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), channelId + "事件列表数据"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), channelId + "事件列表数据");
EasyExcelUtil.write(filePath, "sheet1", ExportAppChannelEventDTO.class, exportAppChannelEventDTOS); EasyExcelUtil.write(filePath, "sheet1", ExportAppChannelEventDTO.class, exportAppChannelEventDTOS);
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
...@@ -401,7 +404,7 @@ public class AppDownloadController extends BaseController { ...@@ -401,7 +404,7 @@ public class AppDownloadController extends BaseController {
// } // }
Pair<String, List<ExportAppYuqingDTO>> stringListPair = markDataService.downloadContendMarkList(markSearchDTO); Pair<String, List<ExportAppYuqingDTO>> stringListPair = markDataService.downloadContendMarkList(markSearchDTO);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "舆情列表数据"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "舆情列表数据");
EasyExcelUtil.write(filePath, "sheet1", ExportAppYuqingDTO.class, stringListPair.getRight()); EasyExcelUtil.write(filePath, "sheet1", ExportAppYuqingDTO.class, stringListPair.getRight());
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
...@@ -431,9 +434,9 @@ public class AppDownloadController extends BaseController { ...@@ -431,9 +434,9 @@ public class AppDownloadController extends BaseController {
return ResponseResult.failure("实时采集余额不足"); return ResponseResult.failure("实时采集余额不足");
} }
} }
List<ExportSearchWholeDTO> exportList = markDataService.exportSearchWhole(dto); List<ExportSearchWholeDTO> exportList = searchWholeService.exportSearchWhole(dto);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "全网搜舆情列表数据"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "全网搜舆情列表数据");
EasyExcelUtil.write(filePath, "sheet1", ExportSearchWholeDTO.class, exportList); EasyExcelUtil.write(filePath, "sheet1", ExportSearchWholeDTO.class, exportList);
if (dto.isExternalDataSource()) { if (dto.isExternalDataSource()) {
...@@ -451,7 +454,7 @@ public class AppDownloadController extends BaseController { ...@@ -451,7 +454,7 @@ public class AppDownloadController extends BaseController {
head.add(Collections.singletonList("链接")); head.add(Collections.singletonList("链接"));
head.add(Collections.singletonList("文章内容")); head.add(Collections.singletonList("文章内容"));
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "摘要提取批量模板"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "摘要提取批量模板");
EasyExcelUtil.dynamicHeadWrite(filePath, "模板", head, Collections.emptyList()); EasyExcelUtil.dynamicHeadWrite(filePath, "模板", head, Collections.emptyList());
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
...@@ -465,7 +468,7 @@ public class AppDownloadController extends BaseController { ...@@ -465,7 +468,7 @@ public class AppDownloadController extends BaseController {
head.add(Collections.singletonList("序号")); head.add(Collections.singletonList("序号"));
head.add(Collections.singletonList("链接")); head.add(Collections.singletonList("链接"));
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "链接互动量更新模板"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "链接互动量更新模板");
EasyExcelUtil.dynamicHeadWrite(filePath, "模板", head, Collections.emptyList()); EasyExcelUtil.dynamicHeadWrite(filePath, "模板", head, Collections.emptyList());
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
...@@ -486,7 +489,7 @@ public class AppDownloadController extends BaseController { ...@@ -486,7 +489,7 @@ public class AppDownloadController extends BaseController {
head.add(Collections.singletonList("链接")); head.add(Collections.singletonList("链接"));
} }
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), type + "词云提取模板"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), type + "词云提取模板");
EasyExcelUtil.dynamicHeadWrite(filePath, "模板", head, Collections.emptyList()); EasyExcelUtil.dynamicHeadWrite(filePath, "模板", head, Collections.emptyList());
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
...@@ -515,7 +518,7 @@ public class AppDownloadController extends BaseController { ...@@ -515,7 +518,7 @@ public class AppDownloadController extends BaseController {
exportList.add(dto); exportList.add(dto);
} }
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "词云词组"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "词云词组");
EasyExcelUtil.write(filePath, "sheet1", UploadHighWordKeywordDTO.class, exportList); EasyExcelUtil.write(filePath, "sheet1", UploadHighWordKeywordDTO.class, exportList);
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
...@@ -543,7 +546,7 @@ public class AppDownloadController extends BaseController { ...@@ -543,7 +546,7 @@ public class AppDownloadController extends BaseController {
head.add(Collections.singletonList("评论")); head.add(Collections.singletonList("评论"));
head.add(Collections.singletonList("转发")); head.add(Collections.singletonList("转发"));
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "事件更新模板"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "事件更新模板");
EasyExcelUtil.dynamicHeadWrite(filePath, "模板", head, Collections.emptyList()); EasyExcelUtil.dynamicHeadWrite(filePath, "模板", head, Collections.emptyList());
return ResponseResult.success(filePath); return ResponseResult.success(filePath);
......
...@@ -392,6 +392,7 @@ public class AppHotController extends BaseController { ...@@ -392,6 +392,7 @@ public class AppHotController extends BaseController {
CompletableFuture.allOf(resultList.stream().map(json -> CompletableFuture.supplyAsync(() -> { CompletableFuture.allOf(resultList.stream().map(json -> CompletableFuture.supplyAsync(() -> {
try { try {
BaseMap firstArticle = markDataService.getFirstArticle(startDate.getTime(), endDate.getTime(), json.getString("title"), projectId, Constant.PRIMARY_CONTEND_ID, include); BaseMap firstArticle = markDataService.getFirstArticle(startDate.getTime(), endDate.getTime(), json.getString("title"), projectId, Constant.PRIMARY_CONTEND_ID, include);
json.put("title", firstArticle.getTitleNullOptionalContent());
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());
......
...@@ -91,11 +91,14 @@ public class AppSearchController extends BaseController { ...@@ -91,11 +91,14 @@ public class AppSearchController extends BaseController {
@Resource(name = "extraServiceImpl") @Resource(name = "extraServiceImpl")
ExtraService extraService; ExtraService extraService;
@Resource(name = "searchWholeServiceImpl")
SearchWholeService searchWholeService;
@Resource(name = "redisUtil") @Resource(name = "redisUtil")
RedisUtil redisUtil; RedisUtil redisUtil;
@ApiOperation("搜索-查热点") @ApiOperation("搜索-查热点")
@LogRecord(values = "keyword", description = "查热点", arguments = true, entity = false) @LogRecord(values = {"keyword", "startTime", "endTime"}, description = "查热点", arguments = true, entity = false)
@GetMapping("/hot/list") @GetMapping("/hot/list")
public ResponseResult searchHotList(@RequestParam(value = "pageSize", defaultValue = "10") Integer limit, public ResponseResult searchHotList(@RequestParam(value = "pageSize", defaultValue = "10") Integer limit,
@RequestParam(value = "page", defaultValue = "1") Integer page, @RequestParam(value = "page", defaultValue = "1") Integer page,
...@@ -115,7 +118,7 @@ public class AppSearchController extends BaseController { ...@@ -115,7 +118,7 @@ public class AppSearchController extends BaseController {
} }
@ApiOperation("搜索-查危机") @ApiOperation("搜索-查危机")
@LogRecord(values = "keyword", description = "查危机", arguments = true, entity = false) @LogRecord(values = {"keyword", "startTime", "endTime"}, description = "查危机", arguments = true, entity = false)
@GetMapping("/crisisSearch") @GetMapping("/crisisSearch")
public ResponseResult crisisSearch(@RequestParam(value = "page", defaultValue = "1") Integer page, public ResponseResult crisisSearch(@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "pageSize", defaultValue = "3") Integer pageSize, @RequestParam(value = "pageSize", defaultValue = "3") Integer pageSize,
...@@ -153,12 +156,12 @@ public class AppSearchController extends BaseController { ...@@ -153,12 +156,12 @@ public class AppSearchController extends BaseController {
@ApiOperation("搜索-全网搜条件") @ApiOperation("搜索-全网搜条件")
@GetMapping("/getWholeSearchCriteria") @GetMapping("/getWholeSearchCriteria")
public ResponseResult getWholeSearchCriteria(@RequestParam(value = "externalDataSource", defaultValue = "false") boolean externalDataSource) { public ResponseResult getWholeSearchCriteria(@RequestParam(value = "externalDataSource", defaultValue = "false") boolean externalDataSource) {
JSONObject wholeSearchCriteria = markDataService.getWholeNetworkSearchCriteria(externalDataSource); JSONObject wholeSearchCriteria = searchWholeService.getWholeNetworkSearchCriteria(externalDataSource);
return ResponseResult.success(wholeSearchCriteria); return ResponseResult.success(wholeSearchCriteria);
} }
@ApiOperation("搜索-全网搜") @ApiOperation("搜索-全网搜")
@LogRecord(values = {"fans", "sensitiveChannels:father,son", "keyword", "search"}, description = "全网搜", arguments = true, entity = true) @LogRecord(values = {"keyword", "search", "fans", "sensitiveChannels:father,son", "startTime", "endTime"}, description = "全网搜", arguments = true, entity = true)
@PostMapping("/searchWhole") @PostMapping("/searchWhole")
public ResponseResult searchWholeNetwork(@RequestBody SearchFilterDTO dto) { public ResponseResult searchWholeNetwork(@RequestBody SearchFilterDTO dto) {
// if (StringUtils.isNotEmpty(dto.getKeyword()) && Tools.checkUniteString(dto.getKeyword())){ // if (StringUtils.isNotEmpty(dto.getKeyword()) && Tools.checkUniteString(dto.getKeyword())){
...@@ -181,7 +184,7 @@ public class AppSearchController extends BaseController { ...@@ -181,7 +184,7 @@ public class AppSearchController extends BaseController {
return ResponseResult.failure("实时采集余额不足"); return ResponseResult.failure("实时采集余额不足");
} }
} }
Pair<JSONObject, Integer> pair = markDataService.searchWholeNetworkWithBalance(dto); Pair<JSONObject, Integer> pair = searchWholeService.searchWholeNetworkWithBalance(dto);
if(dto.isSentiment()){ if(dto.isSentiment()){
List<JSONObject> list = pair.getLeft().getJSONArray("list").toJavaList(JSONObject.class); List<JSONObject> list = pair.getLeft().getJSONArray("list").toJavaList(JSONObject.class);
commonService.sentimentAnalysis(list); commonService.sentimentAnalysis(list);
...@@ -198,7 +201,7 @@ public class AppSearchController extends BaseController { ...@@ -198,7 +201,7 @@ public class AppSearchController extends BaseController {
@ApiOperation("搜索-全网搜-舆情导出") @ApiOperation("搜索-全网搜-舆情导出")
@PostMapping("/exportSearchWhole") @PostMapping("/exportSearchWhole")
@LogRecord(description = "全网搜-舆情导出", values = {"startTime", "endTime", "fans", "filterType", "filterWords", "search", "keyword", "platforms", "sensitiveChannels", "sourceKeyword"}, entity = true, arguments = true) @LogRecord(description = "全网搜-舆情导出", values = {"search", "keyword", "startTime", "endTime", "fans", "filterType", "filterWords", "platforms", "sensitiveChannels", "sourceKeyword"}, entity = true, arguments = true)
public ResponseResult exportSearchWhole(@RequestBody SearchFilterDTO dto) { public ResponseResult exportSearchWhole(@RequestBody SearchFilterDTO dto) {
// if (StringUtils.isNotEmpty(dto.getKeyword()) && Tools.checkUniteString(dto.getKeyword())){ // if (StringUtils.isNotEmpty(dto.getKeyword()) && Tools.checkUniteString(dto.getKeyword())){
// return ResponseResult.failure("不支持特殊符号字段查询"); // return ResponseResult.failure("不支持特殊符号字段查询");
...@@ -219,7 +222,7 @@ public class AppSearchController extends BaseController { ...@@ -219,7 +222,7 @@ public class AppSearchController extends BaseController {
return ResponseResult.failure("实时采集余额不足"); return ResponseResult.failure("实时采集余额不足");
} }
} }
List<ExportSearchWholeDTO> exportList = markDataService.exportSearchWhole(dto); List<ExportSearchWholeDTO> exportList = searchWholeService.exportSearchWhole(dto);
EasyExcelUtil.download("全网搜舆情列表数据", "sheet1", ExportSearchWholeDTO.class, exportList, response); EasyExcelUtil.download("全网搜舆情列表数据", "sheet1", ExportSearchWholeDTO.class, exportList, response);
if (dto.isExternalDataSource()) { if (dto.isExternalDataSource()) {
extraService.decreaseRecord(dto.getKeyword(), WholeSearchRecord.UsedType.output, exportList.size()); extraService.decreaseRecord(dto.getKeyword(), WholeSearchRecord.UsedType.output, exportList.size());
...@@ -228,7 +231,7 @@ public class AppSearchController extends BaseController { ...@@ -228,7 +231,7 @@ public class AppSearchController extends BaseController {
} }
@ApiOperation("舆情列表") @ApiOperation("舆情列表")
@LogRecord(values = {"searchType", "keyword"}, description = "查舆情", arguments = true, entity = true) @LogRecord(values = {"searchType", "keyword", "startTime", "endTime"}, description = "查舆情", arguments = true, entity = true)
@PostMapping("/mark/list") @PostMapping("/mark/list")
public ResponseResult getYuqingMarkList(@RequestBody MarkSearchDTO markSearchDTO) { public ResponseResult getYuqingMarkList(@RequestBody MarkSearchDTO markSearchDTO) {
// if (StringUtils.isNotEmpty(markSearchDTO.getKeyword()) && Tools.checkUniteString(markSearchDTO.getKeyword())){ // if (StringUtils.isNotEmpty(markSearchDTO.getKeyword()) && Tools.checkUniteString(markSearchDTO.getKeyword())){
...@@ -289,7 +292,7 @@ public class AppSearchController extends BaseController { ...@@ -289,7 +292,7 @@ public class AppSearchController extends BaseController {
@ApiOperation("搜索-渠道列表") @ApiOperation("搜索-渠道列表")
@LogRecord(values = "keyword", description = "查渠道", arguments = true, entity = true) @LogRecord(values = {"keyword", "startTime", "endTime"}, description = "查渠道", arguments = true, entity = true)
@PostMapping(value = "/channel/channelList") @PostMapping(value = "/channel/channelList")
public ResponseResult getChannelList(@RequestBody ChannelSearchDTO channelSearchDTO) { public ResponseResult getChannelList(@RequestBody ChannelSearchDTO channelSearchDTO) {
cacheSearchKeyword(channelSearchDTO.getKeyword(), "channel"); cacheSearchKeyword(channelSearchDTO.getKeyword(), "channel");
...@@ -328,7 +331,7 @@ public class AppSearchController extends BaseController { ...@@ -328,7 +331,7 @@ public class AppSearchController extends BaseController {
} }
@ApiOperation("搜索-前台事件库-品牌事件库-新") @ApiOperation("搜索-前台事件库-品牌事件库-新")
@LogRecord(values = "keyword", description = "查事件", arguments = true, entity = true) @LogRecord(values = {"keyword", "startTime", "endTime"}, description = "查事件", arguments = true, entity = true)
@PostMapping("/event/newList") @PostMapping("/event/newList")
public ResponseResult getEventListMiddleware(@RequestBody BrandkbsEventSearchDTO dto){ public ResponseResult getEventListMiddleware(@RequestBody BrandkbsEventSearchDTO dto){
cacheSearchKeyword(dto.getKeyword(), "event"); cacheSearchKeyword(dto.getKeyword(), "event");
...@@ -336,7 +339,7 @@ public class AppSearchController extends BaseController { ...@@ -336,7 +339,7 @@ public class AppSearchController extends BaseController {
} }
@ApiOperation("搜索-查竞品") @ApiOperation("搜索-查竞品")
@LogRecord(values = "keyword", description = "查竞品",arguments = true, entity = true) @LogRecord(values = {"keyword", "startTime", "endTime"}, description = "查竞品",arguments = true, entity = true)
@PostMapping("/contend/list") @PostMapping("/contend/list")
public ResponseResult getContendSearchList(@RequestBody MarkSearchDTO markSearchDTO) { public ResponseResult getContendSearchList(@RequestBody MarkSearchDTO markSearchDTO) {
// if (StringUtils.isNotEmpty(markSearchDTO.getKeyword()) && Tools.checkUniteString(markSearchDTO.getKeyword())){ // if (StringUtils.isNotEmpty(markSearchDTO.getKeyword()) && Tools.checkUniteString(markSearchDTO.getKeyword())){
...@@ -380,6 +383,79 @@ public class AppSearchController extends BaseController { ...@@ -380,6 +383,79 @@ public class AppSearchController extends BaseController {
return ResponseResult.success(markDataService.getAIReferenceQuestionCache(true)); return ResponseResult.success(markDataService.getAIReferenceQuestionCache(true));
} }
@ApiOperation("新-舆情分析-舆情总量")
@PostMapping("/analyze/amount")
@LogRecord(description = "舆情库-舆情分析")
public ResponseResult getYuqingAmount(@RequestBody SearchFilterDTO searchFilterDTO) {
if (searchFilterDTO.isExternalDataSource()){
return ResponseResult.failure("多元接口不支持数据分析");
}
return ResponseResult.success(searchWholeService.getSearchWholeYuqingAmount(searchFilterDTO));
}
@ApiOperation("新-舆情分析-重点平台")
@PostMapping("/analyze/important-platform")
public ResponseResult getImportantPlatformPercentage(@RequestBody SearchFilterDTO searchFilterDTO) {
if (searchFilterDTO.isExternalDataSource()){
return ResponseResult.failure("多元接口不支持数据分析");
}
return ResponseResult.success(searchWholeService.getSearchWholeImportantPlatformPercentage(searchFilterDTO));
}
@ApiOperation("新-舆情分析-平台占比")
@PostMapping("/analyze/platform-percent")
public ResponseResult getPlatformPercentage(@RequestBody SearchFilterDTO searchFilterDTO) {
if (searchFilterDTO.isExternalDataSource()){
return ResponseResult.failure("多元接口不支持数据分析");
}
return ResponseResult.success(searchWholeService.getSearchWholeAnalyzePlatformPercentage(searchFilterDTO));
}
@ApiOperation("新-舆情分析-舆情走势图")
@PostMapping("/analyze/tendency")
public ResponseResult getSpreadTendency(@RequestBody SearchFilterDTO searchFilterDTO) {
if (searchFilterDTO.isExternalDataSource()){
return ResponseResult.failure("多元接口不支持数据分析");
}
return ResponseResult.success(searchWholeService.getSearchWholeSpreadTendency(searchFilterDTO));
}
@ApiOperation("新-舆情分析-活跃渠道")
@PostMapping("/analyze/active-channel")
public ResponseResult getActiveChannels(@RequestBody SearchFilterDTO searchFilterDTO) {
if (searchFilterDTO.isExternalDataSource()){
return ResponseResult.failure("多元接口不支持数据分析");
}
return ResponseResult.success(searchWholeService.getSearchWholeActiveChannels(searchFilterDTO));
}
@ApiOperation("新-舆情分析-ip分布")
@PostMapping("/analyze/ip-located")
public ResponseResult getArticleIpLocated(@RequestBody SearchFilterDTO searchFilterDTO) {
if (searchFilterDTO.isExternalDataSource()){
return ResponseResult.failure("多元接口不支持数据分析");
}
return ResponseResult.success(searchWholeService.getSearchWholeArticleIpLocated(searchFilterDTO));
}
@ApiOperation("新-舆情分析-词云")
@PostMapping("/analyze/high-word")
public ResponseResult getHighWord(@RequestBody SearchFilterDTO searchFilterDTO) {
if (searchFilterDTO.isExternalDataSource()){
return ResponseResult.failure("多元接口不支持数据分析");
}
return ResponseResult.success(searchWholeService.getSearchWholeAnalyzeHighWord(searchFilterDTO));
}
@ApiOperation("新-舆情分析-活跃渠道、ip分布、词云详情页面,社媒平台发文")
@PostMapping("/analyze/data")
public ResponseResult getYuqingAnalyzeDetail(@RequestBody SearchFilterDTO searchFilterDTO) {
if (searchFilterDTO.isExternalDataSource()){
return ResponseResult.failure("多元接口不支持数据分析");
}
return ResponseResult.success(searchWholeService.getSearchWholeAnalyzeDetail(searchFilterDTO));
}
@ApiOperation("搜索-搜索关键词历史记录") @ApiOperation("搜索-搜索关键词历史记录")
@GetMapping("/keyword/cache") @GetMapping("/keyword/cache")
public ResponseResult getSearchKeywordCache(@ApiParam(name = "searchType", public ResponseResult getSearchKeywordCache(@ApiParam(name = "searchType",
......
...@@ -48,7 +48,7 @@ public class MobileReportController { ...@@ -48,7 +48,7 @@ public class MobileReportController {
dto.setPage(page); dto.setPage(page);
dto.setPageSize(size); dto.setPageSize(size);
dto.setType("月报"); dto.setType("月报");
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
PageVO<JSONObject> reportList = reportService.findReportList(dto); PageVO<JSONObject> reportList = reportService.findReportList(dto);
reportList.getList().forEach(json -> { reportList.getList().forEach(json -> {
Long startTime = json.getLong("endTime"); Long startTime = json.getLong("endTime");
......
...@@ -4,4 +4,6 @@ package com.zhiwei.brandkbs2.dao; ...@@ -4,4 +4,6 @@ package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.MarkSearchAnalyzeTask; import com.zhiwei.brandkbs2.pojo.MarkSearchAnalyzeTask;
public interface MarkSearchAnalyzeTaskDao extends BaseMongoDao<MarkSearchAnalyzeTask>{ public interface MarkSearchAnalyzeTaskDao extends BaseMongoDao<MarkSearchAnalyzeTask>{
long deleteExpire(long expireTime);
} }
package com.zhiwei.brandkbs2.dao.impl; package com.zhiwei.brandkbs2.dao.impl;
import com.mongodb.client.result.DeleteResult;
import com.zhiwei.brandkbs2.dao.MarkSearchAnalyzeTaskDao; import com.zhiwei.brandkbs2.dao.MarkSearchAnalyzeTaskDao;
import com.zhiwei.brandkbs2.pojo.MarkSearchAnalyzeTask; import com.zhiwei.brandkbs2.pojo.MarkSearchAnalyzeTask;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component("markSearchAnalyzeTaskDao") @Component("markSearchAnalyzeTaskDao")
...@@ -11,4 +14,11 @@ public class MarkSearchAnalyzeTaskDaoImpl extends BaseMongoDaoImpl<MarkSearchAna ...@@ -11,4 +14,11 @@ public class MarkSearchAnalyzeTaskDaoImpl extends BaseMongoDaoImpl<MarkSearchAna
public MarkSearchAnalyzeTaskDaoImpl() { public MarkSearchAnalyzeTaskDaoImpl() {
super(COLLECTION_NAME); super(COLLECTION_NAME);
} }
@Override
public long deleteExpire(long expireTime) {
Query query = Query.query(Criteria.where("cTime").lt(expireTime));
DeleteResult remove = mongoTemplate.remove(query, COLLECTION_NAME);
return remove.getDeletedCount();
}
} }
...@@ -9,6 +9,7 @@ import com.alibaba.excel.write.metadata.WriteSheet; ...@@ -9,6 +9,7 @@ import com.alibaba.excel.write.metadata.WriteSheet;
import com.zhiwei.brandkbs2.easyexcel.config.ReadExcelDTO; import com.zhiwei.brandkbs2.easyexcel.config.ReadExcelDTO;
import com.zhiwei.brandkbs2.easyexcel.config.WriteExcelDTO; import com.zhiwei.brandkbs2.easyexcel.config.WriteExcelDTO;
import com.zhiwei.brandkbs2.util.Tools; import com.zhiwei.brandkbs2.util.Tools;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
...@@ -26,6 +27,7 @@ import java.nio.channels.ReadableByteChannel; ...@@ -26,6 +27,7 @@ import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel; import java.nio.channels.WritableByteChannel;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
/** /**
* @author sjj * @author sjj
...@@ -112,7 +114,7 @@ public class EasyExcelUtil { ...@@ -112,7 +114,7 @@ public class EasyExcelUtil {
*/ */
public static <T> void write(String filePath, String sheetName, Class<T> clazz, List<T> datas) { public static <T> void write(String filePath, String sheetName, Class<T> clazz, List<T> datas) {
try { try {
formatExcelExports(clazz, datas); formatExcelExports(clazz, datas, null);
EasyExcel.write(filePath, clazz).sheet(sheetName).doWrite(datas); EasyExcel.write(filePath, clazz).sheet(sheetName).doWrite(datas);
} catch (Exception e) { } catch (Exception e) {
log.error("file:{},write error:", filePath, e); log.error("file:{},write error:", filePath, e);
...@@ -172,6 +174,7 @@ public class EasyExcelUtil { ...@@ -172,6 +174,7 @@ public class EasyExcelUtil {
*/ */
public static void dynamicHeadWrite(String filePath, String sheetName, List<List<String>> head, List<List<Object>> datas) { public static void dynamicHeadWrite(String filePath, String sheetName, List<List<String>> head, List<List<Object>> datas) {
try { try {
formatExcelExports(null, null, datas);
EasyExcel.write(filePath).head(head).sheet(sheetName).doWrite(datas); EasyExcel.write(filePath).head(head).sheet(sheetName).doWrite(datas);
} catch (Exception e) { } catch (Exception e) {
log.error("file:{},write error:", filePath, e); log.error("file:{},write error:", filePath, e);
...@@ -190,7 +193,7 @@ public class EasyExcelUtil { ...@@ -190,7 +193,7 @@ public class EasyExcelUtil {
*/ */
public static <T> void download(String fileName, String sheetName, Class<T> clazz, List<T> datas, HttpServletResponse response) { public static <T> void download(String fileName, String sheetName, Class<T> clazz, List<T> datas, HttpServletResponse response) {
try { try {
formatExcelExports(clazz, datas); formatExcelExports(clazz, datas, null);
response.setContentType("application/vnd.ms-excel"); response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 // 这里URLEncoder.encode可以防止中文乱码
...@@ -238,11 +241,12 @@ public class EasyExcelUtil { ...@@ -238,11 +241,12 @@ public class EasyExcelUtil {
return filePath + Tools.concat(projectName, nickName, System.currentTimeMillis(), fileName) + ".xlsx"; return filePath + Tools.concat(projectName, nickName, System.currentTimeMillis(), fileName) + ".xlsx";
} }
private static <T> void formatExcelExports(Class<T> clazz, List<T> datas){ private static <T> void formatExcelExports(Class<T> clazz, List<T> datas, List<List<Object>> dynamicDatas){
if (Objects.nonNull(clazz)) {
List<Field> stringFields = new ArrayList<>(); List<Field> stringFields = new ArrayList<>();
// 记录需要设置的部分 // 记录需要设置的部分
for (Field field : clazz.getDeclaredFields()) { for (Field field : clazz.getDeclaredFields()) {
// String格式截取前32767 // String格式截取前5000
if (field.getGenericType().toString().equals(String.class.toString())) { if (field.getGenericType().toString().equals(String.class.toString())) {
field.setAccessible(true); field.setAccessible(true);
stringFields.add(field); stringFields.add(field);
...@@ -252,12 +256,22 @@ public class EasyExcelUtil { ...@@ -252,12 +256,22 @@ public class EasyExcelUtil {
for (Field field : stringFields) { for (Field field : stringFields) {
try { try {
// 截取为excel单元格允许的最大长度 // 截取为excel单元格允许的最大长度
field.set(data, StringUtils.substring((String) (field.get(data)), 0, 32767)); field.set(data, StringUtils.substring((String) (field.get(data)), 0, 5000));
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
log.error(e); log.error(e);
} }
} }
}); });
} }
if (CollectionUtils.isNotEmpty(dynamicDatas)){
for (List<Object> dynamicData : dynamicDatas) {
dynamicData.replaceAll(obj -> {
if (Objects.nonNull(obj)) {
obj = StringUtils.substring(String.valueOf(obj), 0, 5000);
}
return obj;
});
}
}
}
} }
...@@ -37,7 +37,6 @@ public class ExportWholeSearchRecordDTO { ...@@ -37,7 +37,6 @@ public class ExportWholeSearchRecordDTO {
dto.setKeyword(json.getString("keyword")); dto.setKeyword(json.getString("keyword"));
dto.setUsedType(json.getString("usedType")); dto.setUsedType(json.getString("usedType"));
dto.setUsedCount(json.getInteger("usedCount")); dto.setUsedCount(json.getInteger("usedCount"));
;
dto.setCTime(new Date(json.getLong("cTime"))); dto.setCTime(new Date(json.getLong("cTime")));
dto.setSubmitter(json.getString("submitter")); dto.setSubmitter(json.getString("submitter"));
return dto; return dto;
......
package com.zhiwei.brandkbs2.enmus;
import com.zhiwei.brandkbs2.util.Tools;
import java.util.*;
/**
* @ClassName: SensitiveChannels
* @Description: 重要渠道
* @author: YaoGuoDong
* @create: 2022-06-10 14:50
**/
public enum SensitiveChannelsEnum {
YANG_MEI("央媒", "央媒", Arrays.asList("中国新闻网","中国网","人民日报", "新华社", "求是", "解放军报", "光明日报", "经济日报", "中国日报", "中央人民广播电台", "央视网", "国际在线", "科技日报", "中国纪检监察报", "工人日报", "中国青年报", "农民日报", "法制日报", "中新社")),
ZHU_LIU_CAI_CAI_JING("主流财经", "主流财经", Arrays.asList("证券时报", "国际金融报", "中国经济周刊", "经济参考报", "中国证券报", "上海证券报", "财经国家周刊", "中新经纬", "经济日报", "证券日报", "中国企业家", "中国经济信息社", "中国财经报", "中国商报", "中国企业报", "国际商报", "中国经济导报", "中国经济时报", "金融时报", "中国经营报", "财新周刊", "《财经》杂志", "证券市场红周刊", "界面新闻", "财联社", "蓝鲸财经", "摩尔金融", "第一财经日报", "第一财经周刊", "21世纪经济报道", "21世纪商业评论", "大众证券报", "深圳商报", "新财富", "香港商报", "成都商报", "每日经济新闻", "金融投资报", "长江商报", "支点财经", "经济观察报", "华商报", "东亚经贸新闻", "时代财经", "资本邦", "投资界", "投中网", "创业邦", "财经天下周刊", "FT中文网", "财富", "福布斯", "彭博商业周刊", "哈佛商业评论", "金融界", "金投网", "中研网", "FX168财经网", "中金在线 ", "中商情报网", "财界网", "东方财富网", "南方财富网", "同花顺财经", "云掌财经", "华尔街见闻", "智通财经", "深蓝财经", "乐居财经", "格隆汇", "棱镜", "凤凰WEEKLY财经 ", "野马财经", "燃财经", "晚点LatePost ", "LateNews by 小晚(微信公众号)", "秦朔朋友圈", "吴晓波频道", "兽楼处", "叶檀财经", "牛弹琴", "占豪", "新财迷", "智谷趋势", "智东西", "三言财经", "华商韬略", "正商参阅", "水木然专栏", "春暖花开", "饭统戴老板", "石述思", "刘军洛财经", "郎咸平", "花荣", "水皮", "光远看经济", "正和岛", "功夫财经", "李大霄", "肖锋", "宋清辉", "何加盐", "财经十一人", "但斌", "启阳路4号", "棱镜", "经鉴新闻", "蓝鲸浑水")),
ZHU_LIU_KE_JI("主流科技", "主流科技", Arrays.asList("科技日报", "计算机世界", "中国计算机报", "赛迪网", "中国电子报", "通信世界", "通信产业报", "虎嗅", "36氪", "36kr", "钛媒体", "动点科技", "雷锋网", "驱动之家", "快科技", "砍柴网", "驱动中国", "科技资讯网", "TechCrunch", "Business Insider", "新智元", "量子位", "机器之心", "TechWeb", "IT168", "IT之家", "天极网", "比特网", "中关村在线", "PCHOME", "电脑之家", "CSDN", "51CTO", "硅谷动力", "至顶网", "IT时代周刊", "C114通信网", "飞象网", "DoNews", "cnBeta", "亿欧网", "鞭牛士", "PingWest品玩", "镁客网", "极客公园", "猎云网", "泡泡网", "爱范儿", "速途网", "太平洋电脑网", "i黑马", "手机中国", "科技美学", "量子位", "少数派", "酷玩实验室", "笔吧评测室", "安兔兔", "差评", "科技每日推送", "全是黑科技", "机器之心", "小白测评", "AppSo ", "爱范儿", "大米评测", "最黑科技", "DeepTech深科技", "好机友", "果粉之家", "刘旷", "金错刀", "雷科技", "新智元", "爱否科技", "InfoQ", "小道消息", "人人都是产品经理", "花果科技", "智东西", "阑夕", "雷帝触网", "丁道师", "黑马公社", "周兴斌", "科技狐", "躺倒鸭", "春公子", "郝闻郝看", "全天候科技", "闫跃龙", "小声比比", "乌鸦校尉", "江湖老刘", "科技兽", "郭静的互联网圈", "电手", "超先声", "猿大侠", "IT三剑客", "果壳", "哎咆科技")),
BEI_JING("区域", "北京", Arrays.asList("北京时间", "北京广播电视台", "北京青年报", "北京青年网", "北青网", "北京青年周刊", "北京日报", "京报网", "北京商报", "北京现代商报", "北京商报网", "首都建设报", "北京社区报", "北京头条", "北京晚报", "北晚新视觉", "北晚在线", "北京晨报", "新京报", "千龙网")),
SHANG_HAI("区域", "上海", Arrays.asList("东方卫视", "解放日报", "上观新闻", "看看新闻", "SMG", "上海日报", "上海日报SHINE", "文汇报", "新民邻声", "新民晚报", "新民网", "新民周刊", "文汇网", "新闻晨报", "周到上海", "界面新闻", "财联社", "蓝鲸财经", "科创板日报", "澎湃新闻", "上海法治报", "上海证券报", "第一财经", "第一财经日报", "第一财经周刊", "一财网", "劳动报", "东方网", "观察者网")),
GUANG_ZHOU("区域", "广州", Arrays.asList("南方日报", "南方网", "南方+", "南方Plus", "南方都市报", "奥一网", "南方周末", "南都周刊", "南方人物周刊", "信息时报", "时代周报", "时代财经", "新周刊", "消费者报道", "大洋网", "21世纪经济报道", "21世纪商业评论", "广州日报", "新花城", "南风窗", "羊城晚报", "金羊网", "羊城派", "新快报", "广东卫视", "广东南方卫视", "触电新闻", "广东广播电视台", "触电新闻", "广东经视", "珠江频道")),
SHEN_ZHEN("区域", "深圳", Arrays.asList("深圳商报", "读创", "深圳特区报", "读特", "深圳卫视", "晶报", "壹深圳", "深圳热线", "深圳新闻网", "深圳晚报", "Shenzhen Daily")),
ZHE_JIANG("区域", "浙江", Arrays.asList("钱江晚报", "浙江日报", "浙江新闻", "天目新闻", "浙江法制报", "都市快报", "每日商报", "青年时报", "杭州日报", "浙江在线", "科技金融时报", "浙江之声", "浙江卫视", "中国蓝TV", "中国蓝新闻", "新蓝网", "杭州网", "1818黄金眼", "小强热线", "钱江视频", "浙样红TV", "FM93浙江交通之声", "FM93交通之声", "杭州日报", "杭州网", "网经社", "宁波日报", "甬派", "宁波晚报", "中国宁波网")),
CHUAN_YU("区域", "川渝", Arrays.asList("成都日报", "成都商报", "红星新闻", "每日经济新闻", "微成都", "成都晚报", "封面新闻", "华西都市报", "四川在线", "四川新闻网", "川报观察", "四川日报", "重庆日报", "上游新闻", "重庆晚报", "重庆晨报", "都市热报", "华龙网", "四川卫视", "四川观察", "就成都", "四川广播电视台", "重庆电视台"));
private final String group;
private final String name;
private final List<String> channels;
private static final List<String> GROUPS = Arrays.asList("全部", "央媒", "主流财经", "主流科技", "区域");
private static final List<String> FILTER_GROUPS = Arrays.asList("全部", "央媒", "主流财经", "主流科技");
public String getGroup() {
return group;
}
public String getName() {
return name;
}
public List<String> getChannels() {
return channels;
}
SensitiveChannelsEnum(String group, String name, List<String> channels) {
this.group = group;
this.name = name;
this.channels = channels;
}
public static List<String> getSensitiveChannelsByGroupAndName(String group, String name) {
for (SensitiveChannelsEnum channels : values()) {
// 条件一:group无子级、name传参为空、枚举存在group
boolean conditionOne = FILTER_GROUPS.contains(group) && Tools.isEmpty(name) && channels.getGroup().equals(group);
// 条件二:group有子级、枚举存在name、枚举存在group
boolean conditionTwo = channels.getGroup().equals(group) && channels.getName().equals(name);
if (conditionOne || conditionTwo) {
return channels.getChannels();
}
}
return new ArrayList<>();
}
public static List<String> getSensitiveChannelsNameByGroup(String group) {
List<String> list = new ArrayList<>();
for (SensitiveChannelsEnum channels : values()) {
if (channels.getGroup().equals(group)) {
list.add(channels.getName());
}
}
return list;
}
/**
* 获取重要渠道传参
* @return
*/
public static List<Map<String, Object>> getExtraParam() {
List<Map<String, Object>> list = new ArrayList<>();
for (int i = 0; i < SensitiveChannelsEnum.GROUPS.size(); i++) {
Map<String, Object> map = new HashMap<>();
map.put("name", SensitiveChannelsEnum.GROUPS.get(i));
if (FILTER_GROUPS.contains(GROUPS.get(i))) {
map.put("value", new ArrayList<>());
} else {
map.put("value", SensitiveChannelsEnum.getSensitiveChannelsNameByGroup(SensitiveChannelsEnum.GROUPS.get(i)));
}
list.add(map);
}
return list;
}
}
...@@ -80,6 +80,58 @@ public class EsQueryTools { ...@@ -80,6 +80,58 @@ public class EsQueryTools {
} }
/** /**
* keyword类型字段匹配 | 作分割
*
* @Title: assembleSeniorTermQuery
* @Description: keyword类型字段匹配
* @param @param source
* @param @param fieldlist
* @param @return 设定文件
* @return BoolQueryBuilder 返回类型
*/
public static BoolQueryBuilder assembleSeniorTermOrQuery(String source, String[] fieldlist) {
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
if (!Tools.isEmpty(source)) {
String[] sourcewords = source.split("\\|");
for (int i = 0; i < sourcewords.length; i++) {
String sourceword = sourcewords[i];
boolQuery.should(termQueryField(QueryBuilders.boolQuery(), "should", sourceword, fieldlist));
}
}
return boolQuery;
}
/**
* termQuery 多字段,单一匹配值
*
* @Title: termQueryField
* @Description: termQuery 多字段,单一匹配值
* @param @param boolQueryBuilder
* @param @param esQuery
* @param @param word
* @param @param fields
* @param @return 设定文件
* @return BoolQueryBuilder 返回类型
*/
public static <T> BoolQueryBuilder termQueryField(BoolQueryBuilder boolQueryBuilder, String esQuery, T word,
String[] fields) {
if (ES_QUERY_AND.equals(esQuery)) {
for (String field : fields) {
boolQueryBuilder.must(QueryBuilders.matchPhraseQuery(field, word));
}
} else if (ES_QUERY_OR.equals(esQuery)) {
for (String field : fields) {
boolQueryBuilder.should(QueryBuilders.matchPhraseQuery(field, word));
}
} else if (ES_QUERY_NOT.equals(esQuery)) {
for (String field : fields) {
boolQueryBuilder.mustNot(QueryBuilders.matchPhraseQuery(field, word));
}
}
return boolQueryBuilder;
}
/**
* 标签请求匹配 * 标签请求匹配
* *
* @param tagIds * @param tagIds
...@@ -91,7 +143,7 @@ public class EsQueryTools { ...@@ -91,7 +143,7 @@ public class EsQueryTools {
BoolQueryBuilder tagBoolQuery = QueryBuilders.boolQuery(); BoolQueryBuilder tagBoolQuery = QueryBuilders.boolQuery();
groupTagIds.forEach((group, list) -> { groupTagIds.forEach((group, list) -> {
BoolQueryBuilder tagQuery = QueryBuilders.boolQuery(); BoolQueryBuilder tagQuery = QueryBuilders.boolQuery();
list.forEach(e -> tagQuery.should(QueryBuilders.termQuery("brandkbs_mark_cache_maps.unique_id.keyword", e))); list.forEach(e -> tagQuery.must(QueryBuilders.termQuery("brandkbs_mark_cache_maps.unique_id.keyword", e)));
tagBoolQuery.must(tagQuery); tagBoolQuery.must(tagQuery);
}); });
return tagBoolQuery; return tagBoolQuery;
......
...@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.pojo; ...@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.pojo;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.pojo.dto.MarkSearchDTO; import com.zhiwei.brandkbs2.pojo.dto.MarkSearchDTO;
import com.zhiwei.brandkbs2.pojo.dto.SearchFilterDTO;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
...@@ -23,6 +24,10 @@ public class MarkSearchAnalyzeTask extends AbstractBaseMongo { ...@@ -23,6 +24,10 @@ public class MarkSearchAnalyzeTask extends AbstractBaseMongo {
*/ */
private MarkSearchDTO markSearchDTO; private MarkSearchDTO markSearchDTO;
/** /**
* 全网搜搜索条件
*/
private SearchFilterDTO searchFilterDTO;
/**
* 数据分析结果-词云 * 数据分析结果-词云
*/ */
List<JSONObject> highWord; List<JSONObject> highWord;
...@@ -34,4 +39,6 @@ public class MarkSearchAnalyzeTask extends AbstractBaseMongo { ...@@ -34,4 +39,6 @@ public class MarkSearchAnalyzeTask extends AbstractBaseMongo {
* 创建时间 * 创建时间
*/ */
private Long cTime; private Long cTime;
private Long uTime;
} }
...@@ -17,6 +17,10 @@ import java.util.*; ...@@ -17,6 +17,10 @@ import java.util.*;
@Setter @Setter
@Document(collection = "brandkbs_project") @Document(collection = "brandkbs_project")
public class Project extends AbstractProject { public class Project extends AbstractProject {
/**
* 项目别名
*/
private String extraProjectName;
/** /**
* 数据起始时间(能够绑定关联关系的时间点) * 数据起始时间(能够绑定关联关系的时间点)
...@@ -124,6 +128,7 @@ public class Project extends AbstractProject { ...@@ -124,6 +128,7 @@ public class Project extends AbstractProject {
projectVO.setId(this.getId()); projectVO.setId(this.getId());
// 主品牌 // 主品牌
projectVO.setProjectName(this.getProjectName()); projectVO.setProjectName(this.getProjectName());
projectVO.setExtraProjectName(this.getExtraProjectName());
projectVO.setImportTime(new Date(this.getImportTime())); projectVO.setImportTime(new Date(this.getImportTime()));
projectVO.setBrandName(this.getBrandName()); projectVO.setBrandName(this.getBrandName());
projectVO.setBrandLinkedGroup(this.getBrandLinkedGroup()); projectVO.setBrandLinkedGroup(this.getBrandLinkedGroup());
......
...@@ -7,6 +7,7 @@ import org.apache.lucene.search.join.ScoreMode; ...@@ -7,6 +7,7 @@ import org.apache.lucene.search.join.ScoreMode;
import org.elasticsearch.index.query.*; import org.elasticsearch.index.query.*;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* @ClassName: FieldMap * @ClassName: FieldMap
...@@ -94,65 +95,26 @@ public class FieldMapping { ...@@ -94,65 +95,26 @@ public class FieldMapping {
} }
} }
public static FieldMapping createFromNameAndValue(String name, Object value, String question) { public static FieldMapping createFromNameAndValue(String name, Object value, String brandStr) {
FieldMap fieldMap = null; FieldMap fieldMap = null;
// String projectId = UserThreadLocal.getProjectId();
// TODO 字段转换待完善,引入数据库
for (FieldMap f : FieldMap.values()) { for (FieldMap f : FieldMap.values()) {
if (name.equals(f.getName())) { if (name.equals(f.getName())) {
// // 项目名需要转成id
// if (FieldMap.PROJECT == f) {
// Map<String, Project> projectMap = GlobalPojo.PROJECT_MAP.values().stream().collect(Collectors.toMap(AbstractProject::getProjectName, o -> o));
// if (projectMap.containsKey(String.valueOf(value))) {
// value = projectMap.get(String.valueOf(value)).getId();
// }else {
// value = projectId;
// }
// }
// 品牌需要转换
// if (FieldMap.BRAND == f) {
// Project project = GlobalPojo.PROJECT_MAP.get(projectId);
// if (CollectionUtils.isNotEmpty(project.getContendList())){
// List<String> contends = new ArrayList<>();
// List<String> contendNames = project.getContendList().stream().map(AbstractProject::getBrandName).collect(Collectors.toList());
// for (String contendName : contendNames) {
// if (question.contains(contendName)) {
// contends.add(contendName);
// }
// }
// if (CollectionUtils.isNotEmpty(contends)){
// value = String.join("|", contends);
// }else {
// value = Constant.PRIMARY_CONTEND_ID;
// }
// }else {
// value = Constant.PRIMARY_CONTEND_ID;
// }
// if ("主品牌".equals(value)) {
// value = Constant.PRIMARY_CONTEND_ID;
// } else {
// // 寻找对应的竞品id
// Optional<FieldMapping> project = fieldMappings.stream().filter(field -> Objects.equals(FieldMap.PROJECT, field.getFieldMap())).findFirst();
// if (project.isPresent()){
// List<Contend> contendList = GlobalPojo.PROJECT_MAP.get(String.valueOf(project.get().getValue())).getContendList();
// Object finalValue = value;
// Optional<Contend> contendOptional = contendList.stream().filter(contend -> Objects.equals(contend.getBrandName(), finalValue)).findFirst();
// if (contendOptional.isPresent()){
// value = contendOptional.get().getId();
// }else {
// value = Constant.PRIMARY_CONTEND_ID;
// }
// }else {
// value = Constant.PRIMARY_CONTEND_ID;
// }
// }
// }
// 标签只包含正负中 // 标签只包含正负中
if (FieldMap.MTAG == f) { if (FieldMap.MTAG == f) {
if (!Arrays.asList("正面", "中性", "负面").contains(String.valueOf(value))) { if (!Arrays.asList("正面", "中性", "负面").contains(String.valueOf(value))) {
return null; return null;
} }
} }
// 去除关键词中的项目、品牌名干扰
if (FieldMap.IND_FULL_TEXT == f){
String keyword = String.valueOf(value);
List<String> brands = Arrays.stream(brandStr.split("、")).collect(Collectors.toList());
for (String brand : brands) {
if (String.valueOf(value).contains(brand)){
value = keyword.replace(brand, "").trim();
}
}
}
fieldMap = f; fieldMap = f;
break; break;
} }
......
...@@ -136,6 +136,12 @@ public class SearchFilterDTO { ...@@ -136,6 +136,12 @@ public class SearchFilterDTO {
@ApiModelProperty(value = "导出数据量") @ApiModelProperty(value = "导出数据量")
private int outputCount; private int outputCount;
/**
* ip地址
*/
@ApiModelProperty(value = "ip地址")
private String ip;
// /** // /**
// * 这部分字段无需前端传参 // * 这部分字段无需前端传参
// */ // */
...@@ -162,7 +168,7 @@ public class SearchFilterDTO { ...@@ -162,7 +168,7 @@ public class SearchFilterDTO {
public Map<String, Object> toMap() { public Map<String, Object> toMap() {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("timeType", "time"); map.put("timeType", "time");
map.put("pt", getPlatforms()); map.put("pt", getDefaultPlatforms());
map.put("dataType", searchType); map.put("dataType", searchType);
map.put("matchType", matchType); map.put("matchType", matchType);
map.put("search", keyword); map.put("search", keyword);
...@@ -171,13 +177,13 @@ public class SearchFilterDTO { ...@@ -171,13 +177,13 @@ public class SearchFilterDTO {
map.put("source", sourceKeyword); map.put("source", sourceKeyword);
map.put("url", hostKeyword); map.put("url", hostKeyword);
if (null == sorter || sorter.isEmpty()) { if (null == sorter || sorter.isEmpty()) {
map.put("sort", "DESC"); map.put("sort", "desc");
} else { } else {
for (Map.Entry<String, Object> entry : sorter.entrySet()) { for (Map.Entry<String, Object> entry : sorter.entrySet()) {
if (entry.getValue().toString().contains("desc")) { if (entry.getValue().toString().contains("desc")) {
map.put("sort", "DESC"); map.put("sort", "desc");
} else { } else {
map.put("sort", "ASC"); map.put("sort", "asc");
} }
} }
} }
...@@ -190,7 +196,7 @@ public class SearchFilterDTO { ...@@ -190,7 +196,7 @@ public class SearchFilterDTO {
return map; return map;
} }
public List<String> getPlatforms() { public List<String> getDefaultPlatforms() {
if (Objects.equals("视频", this.searchType)){ if (Objects.equals("视频", this.searchType)){
return CollectionUtils.isNotEmpty(this.videoPlatforms) ? this.videoPlatforms : new ArrayList<>(GenericAttribute.VIDEO_PLATFORM); return CollectionUtils.isNotEmpty(this.videoPlatforms) ? this.videoPlatforms : new ArrayList<>(GenericAttribute.VIDEO_PLATFORM);
} }
......
...@@ -36,6 +36,12 @@ public class ProjectVO { ...@@ -36,6 +36,12 @@ public class ProjectVO {
private String projectName; private String projectName;
/** /**
* 项目别名
*/
@ApiModelProperty("项目别名")
private String extraProjectName;
/**
* 数据起始时间 * 数据起始时间
*/ */
@ApiModelProperty("数据起始时间") @ApiModelProperty("数据起始时间")
...@@ -135,6 +141,7 @@ public class ProjectVO { ...@@ -135,6 +141,7 @@ public class ProjectVO {
Project project = new Project(); Project project = new Project();
project.setId(this.getId()); project.setId(this.getId());
project.setProjectName(this.getProjectName()); project.setProjectName(this.getProjectName());
project.setExtraProjectName(this.getExtraProjectName());
project.setBrandName(this.getBrandName()); project.setBrandName(this.getBrandName());
project.setBrandLinkedGroup(this.getBrandLinkedGroup()); project.setBrandLinkedGroup(this.getBrandLinkedGroup());
project.setBrandLinkedGroupId(this.getBrandLinkedGroupId()); project.setBrandLinkedGroupId(this.getBrandLinkedGroupId());
...@@ -190,6 +197,7 @@ public class ProjectVO { ...@@ -190,6 +197,7 @@ public class ProjectVO {
Project project = new Project(); Project project = new Project();
project.setId(vo.getId()); project.setId(vo.getId());
project.setProjectName(vo.getProjectName()); project.setProjectName(vo.getProjectName());
project.setExtraProjectName(vo.getExtraProjectName());
project.setBrandName(vo.getBrandName()); project.setBrandName(vo.getBrandName());
project.setBrandLinkedGroup(vo.getBrandLinkedGroup()); project.setBrandLinkedGroup(vo.getBrandLinkedGroup());
project.setBrandLinkedGroupId(vo.getBrandLinkedGroupId()); project.setBrandLinkedGroupId(vo.getBrandLinkedGroupId());
......
...@@ -79,6 +79,12 @@ public interface MarkDataService { ...@@ -79,6 +79,12 @@ public interface MarkDataService {
Pair<String, List<ExportAppYuqingDTO>> downloadYuqingMarkList(MarkSearchDTO markSearchDTO); Pair<String, List<ExportAppYuqingDTO>> downloadYuqingMarkList(MarkSearchDTO markSearchDTO);
/** /**
* @param markSearchDTO 标注数据搜索传输类
* @return 返回结果
*/
Pair<String, Pair<List<List<String>>, List<List<Object>>>> downloadMarkListDynamicHead(MarkSearchDTO markSearchDTO);
/**
* 生成聚合列表并返回id * 生成聚合列表并返回id
* *
* @return 聚合id * @return 聚合id
......
package com.zhiwei.brandkbs2.service;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.pojo.dto.ExportSearchWholeDTO;
import com.zhiwei.brandkbs2.pojo.dto.SearchFilterDTO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import org.apache.commons.lang3.tuple.Pair;
import java.io.IOException;
import java.util.List;
/**
* @ClassName: SearchWholeService
* @Description 全网搜服务
* @author: cjz
* @date: 2024-08-29 9:43
*/
public interface SearchWholeService {
/**
* 搜索-全网搜
*
* @param dto 全网搜搜索传输类
* @return JSONObject
*/
Pair<JSONObject, Integer> searchWholeNetworkWithBalance(SearchFilterDTO dto);
/**
* 搜索-全网搜条件
* @return JSONObject
*/
JSONObject getWholeNetworkSearchCriteria(boolean externalDataSource);
/**
* 搜索-全网搜-舆情导出
* @param dto 全网搜搜索传输类
* @return List<ExportSearchWholeDTO>
*/
List<ExportSearchWholeDTO> exportSearchWhole(SearchFilterDTO dto);
/**
* 全网搜舆情分析-舆情总量
* @param dto 全网搜数据传输类
* @return
* @throws IOException
*/
JSONObject getSearchWholeYuqingAmount(SearchFilterDTO dto);
/**
* 全网搜舆情分析-重点平台
* @param dto 全网搜数据传输类
* @return
*/
JSONObject getSearchWholeImportantPlatformPercentage(SearchFilterDTO dto);
/**
* 全网搜舆情分析-平台分布
* @param dto 全网搜数据传输类
* @return
*/
List<JSONObject> getSearchWholeAnalyzePlatformPercentage(SearchFilterDTO dto);
/**
* 全网搜舆情分析-舆情走势图
* @param dto 全网搜数据传输类
* @return
*/
JSONObject getSearchWholeSpreadTendency(SearchFilterDTO dto);
/**
* 全网搜舆情分析-活跃渠道
* @param dto 全网搜数据传输类
* @return
*/
List<JSONObject> getSearchWholeActiveChannels(SearchFilterDTO dto);
/**
* 全网搜舆情分析-ip分布
* @param dto 全网搜数据传输类
* @return
*/
List<JSONObject> getSearchWholeArticleIpLocated(SearchFilterDTO dto);
/**
* 全网搜舆情分析-词云
* @param dto 全网搜数据传输类
* @return
*/
List<JSONObject> getSearchWholeAnalyzeHighWord(SearchFilterDTO dto);
/**
* 全网搜舆情分析-活跃渠道、ip分布、词云详情页面、社媒平台发文
* @param dto 标注数据搜索传输类
* @return
*/
PageVO<JSONObject> getSearchWholeAnalyzeDetail(SearchFilterDTO dto);
}
...@@ -44,6 +44,11 @@ public interface TaskService{ ...@@ -44,6 +44,11 @@ public interface TaskService{
void cleanAggreeTask(); void cleanAggreeTask();
/** /**
* 清理过期数据分析任务
*/
void cleanSearchAnalyzeTask();
/**
* 事件相关更新 * 事件相关更新
*/ */
void eventUpdate(); void eventUpdate();
......
...@@ -15,10 +15,7 @@ import com.zhiwei.brandkbs2.config.Constant; ...@@ -15,10 +15,7 @@ import com.zhiwei.brandkbs2.config.Constant;
import com.zhiwei.brandkbs2.dao.*; import com.zhiwei.brandkbs2.dao.*;
import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil; import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportYuqingInteractionUpdateDTO; import com.zhiwei.brandkbs2.easyexcel.dto.ExportYuqingInteractionUpdateDTO;
import com.zhiwei.brandkbs2.enmus.ChannelEmotion; import com.zhiwei.brandkbs2.enmus.*;
import com.zhiwei.brandkbs2.enmus.EmotionEnum;
import com.zhiwei.brandkbs2.enmus.ImportantChannelEnum;
import com.zhiwei.brandkbs2.enmus.InteractionEnum;
import com.zhiwei.brandkbs2.es.EsClientDao; import com.zhiwei.brandkbs2.es.EsClientDao;
import com.zhiwei.brandkbs2.es.EsQueryTools; import com.zhiwei.brandkbs2.es.EsQueryTools;
import com.zhiwei.brandkbs2.exception.ExceptionCast; import com.zhiwei.brandkbs2.exception.ExceptionCast;
...@@ -90,6 +87,7 @@ import java.util.concurrent.CompletableFuture; ...@@ -90,6 +87,7 @@ import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
...@@ -114,8 +112,9 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -114,8 +112,9 @@ public class MarkDataServiceImpl implements MarkDataService {
"1.提及到年、月、日、天、礼拜的定义为时间要素,未提及到默认条件算近一周,条件给到具体的起始时间和结束时间(结束时间为当前时间则不用返回)的时间戳。\n" + "1.提及到年、月、日、天、礼拜的定义为时间要素,未提及到默认条件算近一周,条件给到具体的起始时间和结束时间(结束时间为当前时间则不用返回)的时间戳。\n" +
"2.提及到 XX 渠道的定义为渠道要素,条件给到该渠道名,注意:{0}不可作为渠道名。\n" + "2.提及到 XX 渠道的定义为渠道要素,条件给到该渠道名,注意:{0}不可作为渠道名。\n" +
"3.提及到正面、中性、负面的定义为标签要素,条件给到该标签名。\n" + "3.提及到正面、中性、负面的定义为标签要素,条件给到该标签名。\n" +
"4.提及到针对 XX ,针对 XX 相关或 XX 相关的定义为搜索条件要素(包含 针对/相关 字样)。未提及时按照文义在文段内容中提取的一个或多个词作为该文段的关键词,将其定义为搜索条件要素。多个关键词时每个关键词之间严格用” “(空格)作为分隔符进行分隔,单个关键词则无需分隔,关键词必须在给到的文段中出现,条件给到具体值\n" + "4.提及到针对 XX ,针对 XX 相关或 XX 相关的定义为搜索条件要素(包含 针对/相关 字样)。未提及时请对内容进行分析,提取出最具代表性和区分性的关键词,这些关键词在搜索过程中能够让搜索引擎精确地找到与该句子含义、所涉及的对象、事件、观点等方面完全契合的数据,尽可能减少无关信息的干扰。\n" +
"5.时间和关键词要素为必需要素,若不满足则返回“无法回答”。\n" + "要确保这些关键词能够作为精准的搜索线索,使得搜索结果紧密围绕句子所表达的核心信息,无论是实体信息、行为信息还是抽象概念信息,都能准确无误地被搜索出来。将这些关键词定义为搜索条件要素。多个关键词时每个关键词之间严格用” “(空格)作为分隔符进行分隔,单个关键词则无需分隔,关键词必须在给到的文段中出现,条件给到具体值\n" +
"5.时间要素为必需要素,若不满足则返回“无法回答”。\n" +
"\n" + "\n" +
"参考例子:\n" + "参考例子:\n" +
"示例 1:\n" + "示例 1:\n" +
...@@ -132,9 +131,9 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -132,9 +131,9 @@ public class MarkDataServiceImpl implements MarkDataService {
"1 按照指定输出格式输出。\n" + "1 按照指定输出格式输出。\n" +
"2 严格按照规则进行提炼。\n" + "2 严格按照规则进行提炼。\n" +
"###"; "###";
private static final String RESULT_PROMPT = "假如你是专业的分析报告人员,你将根据用户提供的内容(无关内容则无需引用),贴合问题给出自己的一点或多点详细分析和见解,每个观点需同时提炼出一个贴合自己的详细分析和见解的小标题(无需注明“小标题”三个字)。并在每点详细分析和见解后用数字表示注明1-{0" + private static final String RESULT_PROMPT = "假如你是专业的文章分析提炼人员,你将根据用户提供的一篇或多篇文章(无关内容则无需引用),给出自己对于这些文章的一点或多点详细分析和见解,每个观点需同时提炼出一个贴合自己的详细分析和见解的小标题(无需注明“小标题”三个字)。并在每点详细分析和见解后用数字表示注明1-{0" +
"}的参考文章,分析结果和参考文章之间严格用”|“作为分隔符进行分隔(小标题与分析结果无需分隔),并且多个参考文章之间也严格用”|“作为分隔符进行分隔,若没有对应的参考文章则无需返回,示例:分析结果。|1|2|3" + "}的参考文章,分析结果和参考文章之间严格用”|“作为分隔符进行分隔(小标题与分析结果无需分隔),并且多个参考文章之间也严格用”|“作为分隔符进行分隔,若没有对应的参考文章则无需返回,示例:分析结果。|1|2|3。同时注意:无论什么原因无法回答该问题请只需要返回”无法回答“,示例:无法回答" +
"请回答该问题:"; "文章如下:";
private static final String REFERENCE_QUESTION_PROMPT = "假如你是专业的问题提出人员,提出自己{0}个关于的{1}参考问题,每个问题无需给到对应的序号,问题必须包含 针对/相关 字样,每个问题之间严格用”|“作为分隔符进行分隔。" + private static final String REFERENCE_QUESTION_PROMPT = "假如你是专业的问题提出人员,提出自己{0}个关于的{1}参考问题,每个问题无需给到对应的序号,问题必须包含 针对/相关 字样,每个问题之间严格用”|“作为分隔符进行分隔。" +
"请提出:"; "请提出:";
...@@ -374,6 +373,11 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -374,6 +373,11 @@ public class MarkDataServiceImpl implements MarkDataService {
} }
@Override @Override
public Pair<String, Pair<List<List<String>>, List<List<Object>>>> downloadMarkListDynamicHead(MarkSearchDTO markSearchDTO) {
return downloadMarkListDynamicHead(markSearchDTO, esSearchService::searchMarkHitsAndCount);
}
@Override
public String generateYuqingMarkAggreeList(Long startTime, Long endTime) { public String generateYuqingMarkAggreeList(Long startTime, Long endTime) {
return generateAggreeList(UserThreadLocal.getProjectId(), startTime, endTime, esSearchService::searchMarkHitsAndCount); return generateAggreeList(UserThreadLocal.getProjectId(), startTime, endTime, esSearchService::searchMarkHitsAndCount);
} }
...@@ -1008,7 +1012,8 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -1008,7 +1012,8 @@ public class MarkDataServiceImpl implements MarkDataService {
map.merge(title, jsonObject, (v1, v2) -> { map.merge(title, jsonObject, (v1, v2) -> {
v1.put("num", v1.getLongValue("num") + v2.getLongValue("num")); v1.put("num", v1.getLongValue("num") + v2.getLongValue("num"));
v1.put("sourceCount", v1.getIntValue("sourceCount") + v2.getIntValue("sourceCount")); v1.put("sourceCount", v1.getIntValue("sourceCount") + v2.getIntValue("sourceCount"));
v1.put("sources", v1.getJSONArray("sources").addAll(v2.getJSONArray("sources"))); v1.getJSONArray("sources").addAll(v2.getJSONArray("sources"));
v1.put("sources", v1.getJSONArray("sources"));
return v1; return v1;
}); });
} }
...@@ -1094,7 +1099,13 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -1094,7 +1099,13 @@ public class MarkDataServiceImpl implements MarkDataService {
if (0 == hits.getTotalHits().value) { if (0 == hits.getTotalHits().value) {
return new BaseMap(); return new BaseMap();
} }
return Tools.getBaseFromEsMap(hits.getAt(0).getSourceAsMap()); JSONObject jsonObject = new JSONObject(hits.getAt(0).getSourceAsMap());
BaseMap baseMap = Tools.getBaseFromEsMap(jsonObject);
if (StringUtils.isBlank(baseMap.getContent()) && Objects.nonNull(jsonObject.getString("ocr_text")) && !jsonObject.getJSONArray("ocr_text").isEmpty()){
List<String> ocrText = jsonObject.getJSONArray("ocr_text").toJavaList(String.class);
baseMap.setContent(ocrText.get(0));
}
return baseMap;
} }
@Override @Override
...@@ -1389,6 +1400,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -1389,6 +1400,7 @@ public class MarkDataServiceImpl implements MarkDataService {
} }
@Override @Override
@Deprecated
public Pair<JSONObject, Integer> searchWholeNetworkWithBalance(SearchFilterDTO dto) { public Pair<JSONObject, Integer> searchWholeNetworkWithBalance(SearchFilterDTO dto) {
if (dto.isExternalDataSource()) { // 查商业数据库 if (dto.isExternalDataSource()) { // 查商业数据库
try { try {
...@@ -1442,6 +1454,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -1442,6 +1454,7 @@ public class MarkDataServiceImpl implements MarkDataService {
} }
@Override @Override
@Deprecated
public List<ExportSearchWholeDTO> exportSearchWhole(SearchFilterDTO dto) { public List<ExportSearchWholeDTO> exportSearchWhole(SearchFilterDTO dto) {
Integer exportAmount = userService.queryUserInfo(UserThreadLocal.getUserId(), UserThreadLocal.getProjectId()).getExportAmount(); Integer exportAmount = userService.queryUserInfo(UserThreadLocal.getUserId(), UserThreadLocal.getProjectId()).getExportAmount();
exportAmount = Objects.isNull(exportAmount) ? 10000 : exportAmount; exportAmount = Objects.isNull(exportAmount) ? 10000 : exportAmount;
...@@ -1871,7 +1884,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -1871,7 +1884,7 @@ public class MarkDataServiceImpl implements MarkDataService {
} }
List<ExportYuqingInteractionUpdateDTO> exportList = markInteractionUpdate(list); List<ExportYuqingInteractionUpdateDTO> exportList = markInteractionUpdate(list);
// excel输出到指定路径 // excel输出到指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "舆情库互动量更新结果"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "舆情库互动量更新结果");
EasyExcelUtil.write(filePath, "sheet1", ExportYuqingInteractionUpdateDTO.class, exportList); EasyExcelUtil.write(filePath, "sheet1", ExportYuqingInteractionUpdateDTO.class, exportList);
JSONObject res = new JSONObject(); JSONObject res = new JSONObject();
...@@ -1973,6 +1986,9 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -1973,6 +1986,9 @@ public class MarkDataServiceImpl implements MarkDataService {
if (nonManualProjectPlanDao.count(new Query(Criteria.where("projectId").is(projectId))) >= 5) { if (nonManualProjectPlanDao.count(new Query(Criteria.where("projectId").is(projectId))) >= 5) {
return ResponseResult.failure("超过方案数量上限5"); return ResponseResult.failure("超过方案数量上限5");
} }
if (!dto.getLasting() && Objects.isNull(dto.getEndTime())){
dto.setEndTime(System.currentTimeMillis() + Constant.ONE_YEAR);
}
NonManualProjectPlan plan = new NonManualProjectPlan(dto); NonManualProjectPlan plan = new NonManualProjectPlan(dto);
Project project = projectService.getProjectById(projectId); Project project = projectService.getProjectById(projectId);
if (project.getExternalDataSource()) { if (project.getExternalDataSource()) {
...@@ -2025,6 +2041,9 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -2025,6 +2041,9 @@ public class MarkDataServiceImpl implements MarkDataService {
@Override @Override
public ResponseResult updateNonManualProjectPlan(NonManualProjectPlanDTO dto) { public ResponseResult updateNonManualProjectPlan(NonManualProjectPlanDTO dto) {
if (!dto.getLasting() && Objects.isNull(dto.getEndTime())){
dto.setEndTime(System.currentTimeMillis() + Constant.ONE_YEAR);
}
NonManualProjectPlan existPlan = nonManualProjectPlanDao.findOneById(dto.getId()); NonManualProjectPlan existPlan = nonManualProjectPlanDao.findOneById(dto.getId());
NonManualProjectPlan plan = new NonManualProjectPlan(dto); NonManualProjectPlan plan = new NonManualProjectPlan(dto);
plan.setCTime(existPlan.getCTime()); plan.setCTime(existPlan.getCTime());
...@@ -2462,7 +2481,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -2462,7 +2481,7 @@ public class MarkDataServiceImpl implements MarkDataService {
} }
List<ExportYuqingInteractionUpdateDTO> exportList = markInteractionUpdate(list); List<ExportYuqingInteractionUpdateDTO> exportList = markInteractionUpdate(list);
// excel输出到指定路径 // excel输出到指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "舆情库互动量更新结果"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "舆情库互动量更新结果");
EasyExcelUtil.write(filePath, "sheet1", ExportYuqingInteractionUpdateDTO.class, exportList); EasyExcelUtil.write(filePath, "sheet1", ExportYuqingInteractionUpdateDTO.class, exportList);
JSONObject res = new JSONObject(); JSONObject res = new JSONObject();
...@@ -2625,7 +2644,10 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -2625,7 +2644,10 @@ public class MarkDataServiceImpl implements MarkDataService {
// 项目日均 // 项目日均
String projectYuqingCountAvgKey = RedisUtil.getYuqingAnalyzeProjectAvgCountKey(projectId, Constant.PRIMARY_CONTEND_ID, planId, null, false); String projectYuqingCountAvgKey = RedisUtil.getYuqingAnalyzeProjectAvgCountKey(projectId, Constant.PRIMARY_CONTEND_ID, planId, null, false);
if (Objects.isNull(redisUtil.get(projectYuqingCountAvgKey))) { if (Objects.isNull(redisUtil.get(projectYuqingCountAvgKey))) {
countYuqingAmountAvg(dto.getStartTime(), dto.getEndTime(), projectId, planId); Project project = projectService.getProjectById(projectId);
long endTime = System.currentTimeMillis();
long startTime = project.getCTime() > endTime - Constant.ONE_YEAR ? project.getCTime() : endTime - Constant.ONE_YEAR;
countYuqingAmountAvg(startTime, endTime, projectId, planId);
} }
double projectYuqingAvgCount = Objects.isNull(redisUtil.get(projectYuqingCountAvgKey)) ? 0d : Double.parseDouble(redisUtil.get(projectYuqingCountAvgKey)); double projectYuqingAvgCount = Objects.isNull(redisUtil.get(projectYuqingCountAvgKey)) ? 0d : Double.parseDouble(redisUtil.get(projectYuqingCountAvgKey));
jsonObject.put("projectAvg", projectYuqingAvgCount); jsonObject.put("projectAvg", projectYuqingAvgCount);
...@@ -2674,10 +2696,13 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -2674,10 +2696,13 @@ public class MarkDataServiceImpl implements MarkDataService {
String neutralKey = RedisUtil.getYuqingAnalyzeEmotionDistributionAvgKey(projectId, Constant.PRIMARY_CONTEND_ID, EmotionEnum.NEUTRAL.getName(), planId, customPlanId, isCustom); String neutralKey = RedisUtil.getYuqingAnalyzeEmotionDistributionAvgKey(projectId, Constant.PRIMARY_CONTEND_ID, EmotionEnum.NEUTRAL.getName(), planId, customPlanId, isCustom);
String negativeKey = RedisUtil.getYuqingAnalyzeEmotionDistributionAvgKey(projectId, Constant.PRIMARY_CONTEND_ID, EmotionEnum.NEGATIVE.getName(), planId, customPlanId, isCustom); String negativeKey = RedisUtil.getYuqingAnalyzeEmotionDistributionAvgKey(projectId, Constant.PRIMARY_CONTEND_ID, EmotionEnum.NEGATIVE.getName(), planId, customPlanId, isCustom);
if (Objects.isNull(redisUtil.get(positiveKey)) || Objects.isNull(redisUtil.get(neutralKey)) || Objects.isNull(redisUtil.get(negativeKey))){ if (Objects.isNull(redisUtil.get(positiveKey)) || Objects.isNull(redisUtil.get(neutralKey)) || Objects.isNull(redisUtil.get(negativeKey))){
Project project = projectService.getProjectById(projectId);
long endTime = System.currentTimeMillis();
long startTime = project.getCTime() > endTime - Constant.ONE_YEAR ? project.getCTime() : endTime - Constant.ONE_YEAR;
if (isCustom){ if (isCustom){
countCustomEmotionDistributionAvg(dto.getStartTime(), dto.getEndTime(), projectId, customPlanId); countCustomEmotionDistributionAvg(startTime, endTime, projectId, customPlanId);
}else { }else {
countEmotionDistributionAvg(dto.getStartTime(), dto.getEndTime(), projectId, planId); countEmotionDistributionAvg(startTime, endTime, projectId, planId);
} }
} }
double positiveAvg = Objects.isNull(redisUtil.get(positiveKey)) ? 0d : Double.parseDouble(redisUtil.get(positiveKey)); double positiveAvg = Objects.isNull(redisUtil.get(positiveKey)) ? 0d : Double.parseDouble(redisUtil.get(positiveKey));
...@@ -2734,7 +2759,10 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -2734,7 +2759,10 @@ public class MarkDataServiceImpl implements MarkDataService {
// 项目均值 // 项目均值
String key = RedisUtil.getYuqingAnalyzePlatformAvgCountKey(projectId, Constant.PRIMARY_CONTEND_ID, dto.getPlanId()); String key = RedisUtil.getYuqingAnalyzePlatformAvgCountKey(projectId, Constant.PRIMARY_CONTEND_ID, dto.getPlanId());
if (Objects.isNull(redisUtil.get(key))){ if (Objects.isNull(redisUtil.get(key))){
countImportantPlatformPercentageAvg(dto.getStartTime(), dto.getEndTime(), projectId, dto.getPlanId()); Project project = projectService.getProjectById(projectId);
long endTime = System.currentTimeMillis();
long startTime = project.getCTime() > endTime - Constant.ONE_YEAR ? project.getCTime() : endTime - Constant.ONE_YEAR;
countImportantPlatformPercentageAvg(startTime, endTime, projectId, 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));
...@@ -2914,7 +2942,10 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -2914,7 +2942,10 @@ public class MarkDataServiceImpl implements MarkDataService {
return null; return null;
} }
// 最高点的时间为开始时间 // 最高点的时间为开始时间
LineVO startLine = lines.stream().max(Comparator.comparingLong(LineVO::getCount)).get(); LineVO startLine = lines.stream().max(Comparator.comparingLong(LineVO::getCount)).orElse(null);
if (Objects.isNull(startLine)){
return null;
}
Long startTime = startLine.getDate(); Long startTime = startLine.getDate();
int startIndex = lines.indexOf(startLine); int startIndex = lines.indexOf(startLine);
// 最高点后一个点的时间为结束时间 // 最高点后一个点的时间为结束时间
...@@ -3091,7 +3122,13 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -3091,7 +3122,13 @@ public class MarkDataServiceImpl implements MarkDataService {
String resultStr; String resultStr;
// 返回缓存 // 返回缓存
if (cache && StringUtils.isNotEmpty(resultStr = redisUtil.get(redisKey))) { if (cache && StringUtils.isNotEmpty(resultStr = redisUtil.get(redisKey))) {
return JSONArray.parseArray(resultStr, JSONObject.class); List<JSONObject> res = JSONArray.parseArray(resultStr, JSONObject.class);
// 缓存为空,尝试重新生成
if (CollectionUtils.isEmpty(res)){
res = generateHighWord(dto);
redisUtil.setExpire(redisKey, JSONArray.toJSONString(res));
}
return res;
} }
List<JSONObject> res = generateHighWord(dto); List<JSONObject> res = generateHighWord(dto);
redisUtil.setExpire(redisKey, JSONArray.toJSONString(res)); redisUtil.setExpire(redisKey, JSONArray.toJSONString(res));
...@@ -3100,19 +3137,34 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -3100,19 +3137,34 @@ public class MarkDataServiceImpl implements MarkDataService {
@Override @Override
public List<JSONObject> getSearchAnalyzeHighWord(MarkSearchDTO dto) { public List<JSONObject> getSearchAnalyzeHighWord(MarkSearchDTO dto) {
try {
dto.setProjectId(UserThreadLocal.getProjectId()); dto.setProjectId(UserThreadLocal.getProjectId());
MarkSearchAnalyzeTask existTask = markSearchAnalyzeTaskDao.findOne("markSearchDTO", dto); MarkSearchAnalyzeTask existTask = markSearchAnalyzeTaskDao.findOne("markSearchDTO", dto);
if (Objects.nonNull(existTask)){ long sTime = System.currentTimeMillis();
if (Objects.nonNull(existTask)) {
while (!existTask.getFinish()) {
existTask = markSearchAnalyzeTaskDao.findOne("markSearchDTO", dto);
long eTime = System.currentTimeMillis();
if (Objects.isNull(existTask) || existTask.getFinish() || eTime - sTime >= 3 * 60 * 1000) {
break;
}
Thread.sleep(10000L);
}
return existTask.getHighWord(); return existTask.getHighWord();
} }
MarkSearchAnalyzeTask task = new MarkSearchAnalyzeTask(dto, null, false, System.currentTimeMillis()); MarkSearchAnalyzeTask task = new MarkSearchAnalyzeTask(dto, null, null, false, System.currentTimeMillis(), System.currentTimeMillis());
markSearchAnalyzeTaskDao.insertOne(task); markSearchAnalyzeTaskDao.insertOne(task);
List<JSONObject> highWord = generateHighWord(dto); List<JSONObject> highWord = generateHighWord(dto);
Update update = new Update(); Update update = new Update();
update.set("finish", true); update.set("finish", true);
update.set("highWord", highWord); update.set("highWord", highWord);
update.set("uTime", System.currentTimeMillis());
markSearchAnalyzeTaskDao.updateOneByIdWithField(task.getId(), update); markSearchAnalyzeTaskDao.updateOneByIdWithField(task.getId(), update);
return highWord; return highWord;
}catch (Exception e){
ExceptionCast.cast(CommonCodeEnum.FAIL, "查舆情-数据分析-生成词云getSearchAnalyzeHighWord异常-", e);
}
return Collections.emptyList();
} }
@Override @Override
...@@ -3413,7 +3465,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -3413,7 +3465,7 @@ public class MarkDataServiceImpl implements MarkDataService {
searchHelper.setPostFilter(postFilter); searchHelper.setPostFilter(postFilter);
searchHelper.setSize(1000); searchHelper.setSize(1000);
List<String> textList = new ArrayList<>(); List<String> textList = new ArrayList<>();
for (int i = 1; i <= 10; i++) { for (int i = 1; i <= 5; i++) {
searchHelper.setFrom((i - 1) * 1000); searchHelper.setFrom((i - 1) * 1000);
SearchResponse searchResponse = esClientDao.searchResponse(searchHelper); SearchResponse searchResponse = esClientDao.searchResponse(searchHelper);
for (SearchHit searchHit : searchResponse.getHits().getHits()) { for (SearchHit searchHit : searchResponse.getHits().getHits()) {
...@@ -3445,6 +3497,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -3445,6 +3497,7 @@ public class MarkDataServiceImpl implements MarkDataService {
CompletableFuture.allOf(markTopTitleList.stream().map(json -> CompletableFuture.supplyAsync(() -> { CompletableFuture.allOf(markTopTitleList.stream().map(json -> CompletableFuture.supplyAsync(() -> {
try { try {
BaseMap firstArticle = getAnalyzeFirstArticle(dto, json.getString("title")); BaseMap firstArticle = getAnalyzeFirstArticle(dto, json.getString("title"));
json.put("title", firstArticle.getTitleNullOptionalContent());
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());
...@@ -3816,8 +3869,26 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -3816,8 +3869,26 @@ public class MarkDataServiceImpl implements MarkDataService {
AggregationBuilders.dateHistogram("timeAgg").field("time").calendarInterval(DateHistogramInterval.DAY).offset("16h"); AggregationBuilders.dateHistogram("timeAgg").field("time").calendarInterval(DateHistogramInterval.DAY).offset("16h");
TermsAggregationBuilder sourceAggregationBuilder = AggregationBuilders.terms("sourceAgg").field("source").size(10000); TermsAggregationBuilder sourceAggregationBuilder = AggregationBuilders.terms("sourceAgg").field("source").size(10000);
// response // response
SearchResponse searchResponse = esClientDao.searchResponse(indexes, null, query, SearchResponse searchResponse;
try {
searchResponse = esClientDao.searchResponse(indexes, null, query,
daysAggregationBuilder.subAggregation(sourceAggregationBuilder), null, null, 0, 0, null); daysAggregationBuilder.subAggregation(sourceAggregationBuilder), null, null, 0, 0, null);
}catch (ElasticsearchStatusException e){
Long startTime = dto.getStartTime();
Long endTime = dto.getEndTime();
Long midTime = startTime + (endTime - startTime) / 2;
if (midTime - startTime < Constant.ONE_DAY || endTime - midTime < Constant.ONE_DAY){
log.info("{}-getWholeSearchArticlePoint分割时间至一天bucket仍超出上限", JSONObject.toJSONString(dto));
return jsonObjects;
}
dto.setStartTime(startTime);
dto.setEndTime(midTime);
jsonObjects.addAll(getWholeSearchArticlePoint(dto));
dto.setStartTime(midTime);
dto.setEndTime(endTime);
jsonObjects.addAll(getWholeSearchArticlePoint(dto));
return jsonObjects;
}
Map<String, Aggregation> aggMap = searchResponse.getAggregations().asMap(); Map<String, Aggregation> aggMap = searchResponse.getAggregations().asMap();
ParsedDateHistogram teamAgg = (ParsedDateHistogram) aggMap.get("timeAgg"); ParsedDateHistogram teamAgg = (ParsedDateHistogram) aggMap.get("timeAgg");
List<? extends Histogram.Bucket> buckets = teamAgg.getBuckets(); List<? extends Histogram.Bucket> buckets = teamAgg.getBuckets();
...@@ -3969,7 +4040,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -3969,7 +4040,7 @@ public class MarkDataServiceImpl implements MarkDataService {
// 选用的模型名称 // 选用的模型名称
AccessModel.Model model = AccessModel.Model.DOUBAO_PRO_32K; AccessModel.Model model = AccessModel.Model.DOUBAO_PRO_32K;
String modelName = model.getModelName(); String modelName = model.getModelName();
String projectName = GlobalPojo.PROJECT_MAP.get(projectId).getProjectName(); String projectName = GlobalPojo.PROJECT_MAP.get(projectId).getExtraProjectName();
Pair<String, long[]> pair = standardRequest(question, modelName, MessageFormat.format(REFERENCE_QUESTION_PROMPT, size, projectName)); Pair<String, long[]> pair = standardRequest(question, modelName, MessageFormat.format(REFERENCE_QUESTION_PROMPT, size, projectName));
if (Objects.isNull(pair)){ if (Objects.isNull(pair)){
return getAIReferenceQuestionTemplate(projectName); return getAIReferenceQuestionTemplate(projectName);
...@@ -3996,7 +4067,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -3996,7 +4067,7 @@ public class MarkDataServiceImpl implements MarkDataService {
return JSONObject.parseArray(resultStr).toJavaList(String.class); return JSONObject.parseArray(resultStr).toJavaList(String.class);
} }
List<String> questionList = aiSearchQuestionRecordDao.findDistinctQuestion(projectId); List<String> questionList = aiSearchQuestionRecordDao.findDistinctQuestion(projectId);
String projectName = GlobalPojo.PROJECT_MAP.get(projectId).getProjectName(); String projectName = GlobalPojo.PROJECT_MAP.get(projectId).getExtraProjectName();
if (CollectionUtils.isEmpty(questionList)){ if (CollectionUtils.isEmpty(questionList)){
return getAIReferenceQuestionTemplate(projectName); return getAIReferenceQuestionTemplate(projectName);
} }
...@@ -4016,9 +4087,19 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -4016,9 +4087,19 @@ public class MarkDataServiceImpl implements MarkDataService {
calculateCost(pair.getRight(), AccessModel.Model.DOUBAO_PRO_32K)), userLogRecordDao.generateCollectionName()); calculateCost(pair.getRight(), AccessModel.Model.DOUBAO_PRO_32K)), userLogRecordDao.generateCollectionName());
String resultContent = pair.getLeft(); String resultContent = pair.getLeft();
String[] splits = resultContent.split("\\|"); String[] splits = resultContent.split("\\|");
List<String> result = new ArrayList<>(Arrays.asList(splits)).stream().filter(StringUtils::isNoneBlank).map(String::trim).collect(Collectors.toList()); List<String> result = new ArrayList<>(Arrays.asList(splits)).stream().filter(StringUtils::isNoneBlank).map(String::trim)
redisUtil.setExpire(key, JSONObject.toJSONString(result)); .limit(5).collect(Collectors.toList());
return result; List<String> res = new ArrayList<>();
for (int i = 0; i < result.size(); i++) {
if (result.get(i).startsWith(i + 1 + "、") || result.get(i).startsWith(i + 1 + ".")){
String substring = result.get(i).substring(2);
res.add(substring);
}else {
res.add(result.get(i));
}
}
redisUtil.setExpire(key, JSONObject.toJSONString(res));
return res;
} }
private List<String> getAIReferenceQuestionTemplate(String projectName){ private List<String> getAIReferenceQuestionTemplate(String projectName){
...@@ -4042,17 +4123,17 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -4042,17 +4123,17 @@ public class MarkDataServiceImpl implements MarkDataService {
list = esClientDao.findSearch(question, keyword, startTime, endTime); list = esClientDao.findSearch(question, keyword, startTime, endTime);
}else { // 未填辅助信息,则根据AI生成条件 }else { // 未填辅助信息,则根据AI生成条件
Project project = GlobalPojo.PROJECT_MAP.get(UserThreadLocal.getProjectId()); Project project = GlobalPojo.PROJECT_MAP.get(UserThreadLocal.getProjectId());
StringBuilder brandStr = new StringBuilder(project.getProjectName()); StringBuilder brandStr = new StringBuilder(project.getExtraProjectName());
if (CollectionUtils.isNotEmpty(project.getContendList())){ if (CollectionUtils.isNotEmpty(project.getContendList())){
project.getContendList().forEach(contend -> brandStr.append("、").append(contend.getBrandName())); project.getContendList().forEach(contend -> brandStr.append("、").append(contend.getBrandName()));
} }
questionPair = standardRequest(question, modelName, MessageFormat.format(QUESTION_PROMPT, brandStr)); questionPair = standardRequest(question, modelName, MessageFormat.format(QUESTION_PROMPT, brandStr));
if (Objects.isNull(questionPair)) { if (Objects.isNull(questionPair) || Objects.equals("无法回答", questionPair.getLeft().trim())) {
return null; return null;
} }
JSONObject json = JSON.parseObject(questionPair.getLeft()); JSONObject json = JSON.parseObject(questionPair.getLeft());
// 数据条件 // 数据条件
List<FieldMapping> filedMapping = getFiledMapping(json, question); List<FieldMapping> filedMapping = getFiledMapping(json, brandStr.toString());
addDefaultFiledMapping(filedMapping, question); addDefaultFiledMapping(filedMapping, question);
list = esClientDao.findSearch(filedMapping); list = esClientDao.findSearch(filedMapping);
} }
...@@ -4073,12 +4154,16 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -4073,12 +4154,16 @@ public class MarkDataServiceImpl implements MarkDataService {
int count = 1; int count = 1;
for (BaseMap baseMap : articles) { for (BaseMap baseMap : articles) {
String text = baseMap.getContent(); String text = baseMap.getContent();
sb.append(count++).append("、").append(text).append(";"); sb.append("文章").append(count++).append(":").append(text).append("\n\n");
} }
String sbContent = sb.toString(); String sbContent = sb.toString();
Pair<String, long[]> answerPair = streamStandardRequest(sbContent, modelName, MessageFormat.format(RESULT_PROMPT, list.size()) + question); Pair<String, long[]> answerPair = streamStandardRequest(sbContent, modelName, MessageFormat.format(RESULT_PROMPT, list.size()) + question);
// 临时处理:接口时而返回只有两个字符的回答结果(分析/抱歉/以下/无法)
if (answerPair.getLeft().length() <= 2){
return null;
}
// 结果处理 // 结果处理
JSONObject res = aiResultDataProcess(answerPair, false); JSONObject res = aiResultDataProcess(answerPair, list.size(), false);
res.put("articles", articles); res.put("articles", articles);
res.put("searchCriteria", Objects.isNull(questionPair) ? Tools.concat(keyword, startTime, endTime) : questionPair.getLeft()); res.put("searchCriteria", Objects.isNull(questionPair) ? Tools.concat(keyword, startTime, endTime) : questionPair.getLeft());
// 记录返回成功的提问 // 记录返回成功的提问
...@@ -4095,7 +4180,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -4095,7 +4180,7 @@ public class MarkDataServiceImpl implements MarkDataService {
return null; return null;
} }
private JSONObject aiResultDataProcess(Pair<String, long[]> answerPair, boolean isOnline){ private JSONObject aiResultDataProcess(Pair<String, long[]> answerPair, int size, boolean isOnline){
JSONObject res = new JSONObject(); JSONObject res = new JSONObject();
// 结果处理 // 结果处理
String[] splits = answerPair.getLeft().split("\\r?\\n"); String[] splits = answerPair.getLeft().split("\\r?\\n");
...@@ -4107,13 +4192,23 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -4107,13 +4192,23 @@ public class MarkDataServiceImpl implements MarkDataService {
continue; continue;
} }
if (i == 0 || isOnline){ if (i == 0 || isOnline){
if (StringUtils.isNotBlank(splits[i])) {
answer.put("answer", splits[i].trim()); answer.put("answer", splits[i].trim());
answers.add(answer); answers.add(answer);
}
continue; continue;
} }
if (StringUtils.isNotBlank(sonSplit[0])) { if (StringUtils.isNotBlank(sonSplit[0])) {
answer.put("answer", sonSplit[0]); answer.put("answer", sonSplit[0]);
List<String> sonSplitList = new ArrayList<>(Arrays.asList(sonSplit)).stream().skip(1).collect(Collectors.toList()); List<String> sonSplitList = new ArrayList<>(Arrays.asList(sonSplit)).stream().skip(1)
.filter(str -> {
try {
return StringUtils.isNotBlank(str) && Integer.parseInt(str.trim()) <= size;
}catch (Exception e){
answer.put("answer", answer.getString("answer") + str);
return false;
}
}).collect(Collectors.toList());
answer.put("referenceArticles", sonSplitList); answer.put("referenceArticles", sonSplitList);
answers.add(answer); answers.add(answer);
} }
...@@ -4129,7 +4224,7 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -4129,7 +4224,7 @@ public class MarkDataServiceImpl implements MarkDataService {
// 需记录耗费 // 需记录耗费
userLogRecordDao.insertOne(UserLogRecord.userLogRecordCost("AI搜索-联网搜索-" + question, userLogRecordDao.insertOne(UserLogRecord.userLogRecordCost("AI搜索-联网搜索-" + question,
calculateCost(answerPair.getRight(), AccessModel.Model.DOUBAO_PRO_32K)), userLogRecordDao.generateCollectionName()); calculateCost(answerPair.getRight(), AccessModel.Model.DOUBAO_PRO_32K)), userLogRecordDao.generateCollectionName());
return aiResultDataProcess(answerPair, true); return aiResultDataProcess(answerPair, -1, true);
} }
private double calculateCost(long[] tokens, AccessModel.Model model){ private double calculateCost(long[] tokens, AccessModel.Model model){
...@@ -4199,19 +4294,19 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -4199,19 +4294,19 @@ public class MarkDataServiceImpl implements MarkDataService {
/** /**
* 获取 * 获取
* @param json * @param json
* @param content * @param brandStr
* @return * @return
*/ */
private static List<FieldMapping> getFiledMapping(JSONObject json, String content) { private static List<FieldMapping> getFiledMapping(JSONObject json, String brandStr) {
List<FieldMapping> res = new ArrayList<>(); List<FieldMapping> res = new ArrayList<>();
for (Map.Entry<String, Object> entry : json.entrySet()) { for (Map.Entry<String, Object> entry : json.entrySet()) {
if (entry.getValue() instanceof JSONObject) { if (entry.getValue() instanceof JSONObject) {
res.addAll(getFiledMapping((JSONObject) entry.getValue(), content)); res.addAll(getFiledMapping((JSONObject) entry.getValue(), brandStr));
} else { } else {
if (Objects.isNull(entry.getValue())){ if (Objects.isNull(entry.getValue())){
continue; continue;
} }
FieldMapping fieldMapping = FieldMapping.createFromNameAndValue(entry.getKey(), entry.getValue(), content); FieldMapping fieldMapping = FieldMapping.createFromNameAndValue(entry.getKey(), entry.getValue(), brandStr);
if (null != fieldMapping && Objects.nonNull(fieldMapping.getValue())) { if (null != fieldMapping && Objects.nonNull(fieldMapping.getValue())) {
res.add(fieldMapping); res.add(fieldMapping);
} }
...@@ -4224,8 +4319,9 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -4224,8 +4319,9 @@ public class MarkDataServiceImpl implements MarkDataService {
Project project = GlobalPojo.PROJECT_MAP.get(UserThreadLocal.getProjectId()); Project project = GlobalPojo.PROJECT_MAP.get(UserThreadLocal.getProjectId());
fieldMappings.add(new FieldMapping(FieldMapping.FieldMap.PROJECT, UserThreadLocal.getProjectId())); fieldMappings.add(new FieldMapping(FieldMapping.FieldMap.PROJECT, UserThreadLocal.getProjectId()));
List<String> projectBandNames = new ArrayList<>(); List<String> projectBandNames = new ArrayList<>();
projectBandNames.add(project.getProjectName()); projectBandNames.add(project.getExtraProjectName());
projectBandNames.add(project.getBrandName()); projectBandNames.add(project.getBrandName());
if (CollectionUtils.isNotEmpty(project.getContendList())){ if (CollectionUtils.isNotEmpty(project.getContendList())){
List<String> contends = new ArrayList<>(); List<String> contends = new ArrayList<>();
for (Contend contend : project.getContendList()) { for (Contend contend : project.getContendList()) {
...@@ -4275,7 +4371,12 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -4275,7 +4371,12 @@ public class MarkDataServiceImpl implements MarkDataService {
} }
query.must(keywordQuery); query.must(keywordQuery);
// platform // platform
BoolQueryBuilder platformQuery = EsQueryTools.assemblePlatformQuery(GlobalPojo.PLATFORMS); BoolQueryBuilder platformQuery;
if (CollectionUtils.isEmpty(dto.getPlatforms())) {
platformQuery = EsQueryTools.assemblePlatformQuery(GlobalPojo.PLATFORMS);
}else {
platformQuery = EsQueryTools.assemblePlatformQuery(Tools.getPlatformByIds(dto.getPlatforms()));
}
query.must(platformQuery); query.must(platformQuery);
return query; return query;
} }
...@@ -5067,4 +5168,88 @@ public class MarkDataServiceImpl implements MarkDataService { ...@@ -5067,4 +5168,88 @@ public class MarkDataServiceImpl implements MarkDataService {
} }
return null; return null;
} }
private Pair<String, Pair<List<List<String>>, List<List<Object>>>> downloadMarkListDynamicHead(MarkSearchDTO markSearchDTO, ArticleFunction.SearchHitsAndCount searchHitsAndCount) {
try {
List<TagFilterDTO> tagFilters = tagFilterService.getTagFilter();
List<List<String>> heads = getMarkDownloadHead(tagFilters);
List<List<Object>> datas = new ArrayList<>();
Project project = projectService.getProjectById(UserThreadLocal.getProjectId());
defaultMarkSearch(markSearchDTO);
markSearchDTO.setPageSize(null);
for (SearchHits searchHits : searchHitsAndCount.search(markSearchDTO, false).getLeft()) {
datas.addAll(createMarkDownloadData(searchHits, tagFilters, heads));
}
return Pair.of(project.getBrandName() + "_" + markSearchDTO.getStartTime() + "_" + markSearchDTO.getEndTime(), Pair.of(heads, datas));
} catch (IOException e) {
ExceptionCast.cast(CommonCodeEnum.FAIL, "es查询异常");
}
return null;
}
/**
* 组装excel下载舆情数据
* @param searchHits
* @param tagFilters
* @param heads
* @return
*/
private List<List<Object>> createMarkDownloadData(SearchHits searchHits, List<TagFilterDTO> tagFilters, List<List<String>> heads){
List<JSONObject> hits = Arrays.stream(searchHits.getHits()).map(SearchHit::getSourceAsMap).map(JSONObject::new).collect(Collectors.toList());
List<String> uniqueIds = new ArrayList<>();
// 自定义标签uniqueIds
tagFilters.forEach(tagFilter -> tagFilter.getTagList().forEach(tag -> uniqueIds.add(tag.getUniqueId())));
List<String> groupNames = tagFilters.stream().map(TagFilterDTO::getGroupName).collect(Collectors.toList());
List<List<Object>> res = new ArrayList<>();
for (JSONObject hit : hits) {
BaseMap baseMap = Tools.getBaseFromEsMap(hit);
List<Object> data = new ArrayList<>();
data.add(Constant.EXCEL_TIME_FORMAT.format(baseMap.getTime()));
data.add(baseMap.getPlatform());
data.add(baseMap.getSource());
data.add(baseMap.getTitle());
data.add(baseMap.getContent());
data.add(baseMap.getUrl());
data.add(baseMap.getEmotion());
List<JSONObject> markCacheMaps = hit.getJSONArray(GenericAttribute.ES_MARK_CACHE_MAPS).toJavaList(JSONObject.class);
if (CollectionUtils.isEmpty(markCacheMaps)){
res.add(data);
continue;
}
// 过滤非自定义标签
Map<String, JSONObject> map = markCacheMaps.stream()
.filter(json -> uniqueIds.contains(json.getString("unique_id")))
.collect(Collectors.toMap(json -> json.getString("group_name"), o -> o, (v1, v2) -> v1));
for (String name : groupNames) {
JSONObject jsonObject = map.get(name);
if (Objects.isNull(jsonObject)){
data.add(null);
continue;
}
data.add(jsonObject.getString("name"));
}
res.add(data);
}
return res;
}
/**
* 获取舆情数据下载表头
* @param tagFilter
* @return
*/
private List<List<String>> getMarkDownloadHead(List<TagFilterDTO> tagFilter){
List<List<String>> heads = new ArrayList<>();
heads.add(Collections.singletonList("时间"));
heads.add(Collections.singletonList("平台"));
heads.add(Collections.singletonList("渠道"));
heads.add(Collections.singletonList("标题"));
heads.add(Collections.singletonList("文本"));
heads.add(Collections.singletonList("地址"));
heads.add(Collections.singletonList("情感调性"));
for (TagFilterDTO tagFilterDTO : tagFilter) {
heads.add(Collections.singletonList(tagFilterDTO.getGroupName()));
}
return heads;
}
} }
\ No newline at end of file
...@@ -109,7 +109,7 @@ public class ProjectServiceImpl implements ProjectService { ...@@ -109,7 +109,7 @@ public class ProjectServiceImpl implements ProjectService {
//抛出非法参数异常 //抛出非法参数异常
ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM); ExceptionCast.cast(CommonCodeEnum.INVALID_PARAM);
} }
if (!Tools.isEmpty(projectVO.getHitKeywords()) && projectVO.getModuleShowList().contains(2)) { if (!Tools.isEmpty(projectVO.getHitKeywords()) && projectVO.getModuleShowList().contains("2")) {
return ResponseResult.failure("关键字和原始数据配置异常"); return ResponseResult.failure("关键字和原始数据配置异常");
} }
Project existsProject = projectDao.findOne("projectName", projectVO.getProjectName()); Project existsProject = projectDao.findOne("projectName", projectVO.getProjectName());
...@@ -145,7 +145,10 @@ public class ProjectServiceImpl implements ProjectService { ...@@ -145,7 +145,10 @@ public class ProjectServiceImpl implements ProjectService {
public PageVO<JSONObject> findProjectList(int page, int size, String keyword) { public PageVO<JSONObject> findProjectList(int page, int size, String keyword) {
Query query = new Query(); Query query = new Query();
query.addCriteria(Criteria.where("isManual").is(true)); query.addCriteria(Criteria.where("isManual").is(true));
projectDao.addKeywordFuzz(query, keyword, "projectName"); // projectDao.addKeywordFuzz(query, keyword, "extraProjectName", "projectName");
Criteria extraProjectName = Criteria.where("extraProjectName").regex(keyword, "i");
Criteria projectName = Criteria.where("projectName").regex(keyword, "i");
query.addCriteria(new Criteria().orOperator(extraProjectName, projectName));
long count = projectDao.count(query); long count = projectDao.count(query);
projectDao.addSort(query, "{\"cTime\":\"descend\"}"); projectDao.addSort(query, "{\"cTime\":\"descend\"}");
mongoUtil.start(page, size, query); mongoUtil.start(page, size, query);
...@@ -156,6 +159,7 @@ public class ProjectServiceImpl implements ProjectService { ...@@ -156,6 +159,7 @@ public class ProjectServiceImpl implements ProjectService {
result.put("importTime", project.getImportTime()); result.put("importTime", project.getImportTime());
result.put("cTime", project.getCTime()); result.put("cTime", project.getCTime());
result.put("projectName", project.getProjectName()); result.put("projectName", project.getProjectName());
result.put("extraProjectName", project.getExtraProjectName());
result.put("brandName", project.getBrandName()); result.put("brandName", project.getBrandName());
result.put("isStart", project.isStart()); result.put("isStart", project.isStart());
result.put("isShow", project.isShow()); result.put("isShow", project.isShow());
...@@ -335,13 +339,16 @@ public class ProjectServiceImpl implements ProjectService { ...@@ -335,13 +339,16 @@ public class ProjectServiceImpl implements ProjectService {
return projectDao.findList(null).stream().map(project -> { return projectDao.findList(null).stream().map(project -> {
JSONObject json = new JSONObject(); JSONObject json = new JSONObject();
json.put("name", project.getProjectName()); json.put("name", project.getProjectName());
json.put("extraProjectName", project.getExtraProjectName());
json.put("id", project.getId()); json.put("id", project.getId());
return json; return json;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }
return user.getRoles().stream().map(userRole -> { return user.getRoles().stream().map(userRole -> {
JSONObject json = new JSONObject(); JSONObject json = new JSONObject();
json.put("name", projectDao.findOne("_id", userRole.getProjectId()).getProjectName()); Project project = projectDao.findOne("_id", userRole.getProjectId());
json.put("name", project.getProjectName());
json.put("extraProjectName", project.getExtraProjectName());
json.put("id", userRole.getProjectId()); json.put("id", userRole.getProjectId());
return json; return json;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
...@@ -572,7 +579,10 @@ public class ProjectServiceImpl implements ProjectService { ...@@ -572,7 +579,10 @@ public class ProjectServiceImpl implements ProjectService {
public PageVO<JSONObject> findNonManualProjectList(int page, int size, String sorter, String keyword) { public PageVO<JSONObject> findNonManualProjectList(int page, int size, String sorter, String keyword) {
Query query = new Query(); Query query = new Query();
query.addCriteria(Criteria.where("isManual").is(false)); query.addCriteria(Criteria.where("isManual").is(false));
projectDao.addKeywordFuzz(query, keyword, "projectName"); // projectDao.addKeywordFuzz(query, keyword, "extraProjectName", "projectName");
Criteria extraProjectName = Criteria.where("extraProjectName").regex(keyword, "i");
Criteria projectName = Criteria.where("projectName").regex(keyword, "i");
query.addCriteria(new Criteria().orOperator(extraProjectName, projectName));
long count = projectDao.count(query); long count = projectDao.count(query);
if (Objects.isNull(sorter) || Objects.isNull(JSONObject.parseObject(sorter)) || JSONObject.parseObject(sorter).isEmpty()){ if (Objects.isNull(sorter) || Objects.isNull(JSONObject.parseObject(sorter)) || JSONObject.parseObject(sorter).isEmpty()){
projectDao.addSort(query, "{\"cTime\":\"descend\"}"); projectDao.addSort(query, "{\"cTime\":\"descend\"}");
...@@ -587,6 +597,7 @@ public class ProjectServiceImpl implements ProjectService { ...@@ -587,6 +597,7 @@ public class ProjectServiceImpl implements ProjectService {
result.put("importTime", project.getImportTime()); result.put("importTime", project.getImportTime());
result.put("cTime", project.getCTime()); result.put("cTime", project.getCTime());
result.put("projectName", project.getProjectName()); result.put("projectName", project.getProjectName());
result.put("extraProjectName", project.getExtraProjectName());
result.put("brandName", project.getBrandName()); result.put("brandName", project.getBrandName());
result.put("isStart", project.isStart()); result.put("isStart", project.isStart());
result.put("isShow", project.isShow()); result.put("isShow", project.isShow());
...@@ -648,6 +659,7 @@ public class ProjectServiceImpl implements ProjectService { ...@@ -648,6 +659,7 @@ public class ProjectServiceImpl implements ProjectService {
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
jsonObject.put("id", project.getId()); jsonObject.put("id", project.getId());
jsonObject.put("name", project.getProjectName()); jsonObject.put("name", project.getProjectName());
jsonObject.put("extraProjectName", project.getExtraProjectName());
return jsonObject; return jsonObject;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
return ResponseResult.success(res); return ResponseResult.success(res);
...@@ -659,7 +671,10 @@ public class ProjectServiceImpl implements ProjectService { ...@@ -659,7 +671,10 @@ public class ProjectServiceImpl implements ProjectService {
projectDao.addSort(query, "{\"_id\":\"asc\"}"); projectDao.addSort(query, "{\"_id\":\"asc\"}");
// 项目名关键词模糊 // 项目名关键词模糊
if (StringUtils.isNotBlank(keyword)){ if (StringUtils.isNotBlank(keyword)){
projectDao.addKeywordFuzz(query, keyword, "projectName"); // projectDao.addKeywordFuzz(query, keyword, "extraProjectName", "projectName");
Criteria extraProjectName = Criteria.where("extraProjectName").regex(keyword, "i");
Criteria projectName = Criteria.where("projectName").regex(keyword, "i");
query.addCriteria(new Criteria().orOperator(extraProjectName, projectName));
} }
// 用户拥有权限的项目 // 用户拥有权限的项目
if (StringUtils.isNotBlank(userId) && !userDao.findOneById(userId).isSuperAdmin()){ if (StringUtils.isNotBlank(userId) && !userDao.findOneById(userId).isSuperAdmin()){
...@@ -675,6 +690,7 @@ public class ProjectServiceImpl implements ProjectService { ...@@ -675,6 +690,7 @@ public class ProjectServiceImpl implements ProjectService {
JSONObject result = new JSONObject(); JSONObject result = new JSONObject();
result.put("id", project.getId()); result.put("id", project.getId());
result.put("projectName", project.getProjectName()); result.put("projectName", project.getProjectName());
result.put("extraProjectName", project.getExtraProjectName());
return result; return result;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
return ResponseResult.success(PageVO.createPageVo(total, page, pageSize, resList)); return ResponseResult.success(PageVO.createPageVo(total, page, pageSize, resList));
...@@ -765,6 +781,7 @@ public class ProjectServiceImpl implements ProjectService { ...@@ -765,6 +781,7 @@ public class ProjectServiceImpl implements ProjectService {
json.put("id", project.getId()); json.put("id", project.getId());
json.put("brands", getBrands(project.getId(), true)); json.put("brands", getBrands(project.getId(), true));
json.put("name", project.getProjectName()); json.put("name", project.getProjectName());
json.put("extraProjectName", project.getExtraProjectName());
json.put("group", project.getBrandLinkedGroup()); json.put("group", project.getBrandLinkedGroup());
json.put("avatarUrl", project.getAvatarUrl()); json.put("avatarUrl", project.getAvatarUrl());
json.put("permission", getPermissionList(project)); json.put("permission", getPermissionList(project));
......
...@@ -220,13 +220,13 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -220,13 +220,13 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
return ResponseResult.success(); return ResponseResult.success();
} }
private BrandkbsWarnTemplate brandkbsWarnTemplate4Yuqing(BrandkbsYuQingConfigNew config, List<BaseMap> datas, long start, long end, AbstractProject project) { private BrandkbsWarnTemplate brandkbsWarnTemplate4Yuqing(BrandkbsYuQingConfigNew config, List<BaseMap> datas, long start, long end, Project project) {
if (datas.isEmpty()) { if (datas.isEmpty()) {
return null; return null;
} }
int firstCount = datas.size(); int firstCount = datas.size();
// key1 // key1
String key1 = "【品见】舆情动态-" + project.getProjectName(); String key1 = "【品见】舆情动态-" + project.getExtraProjectName();
// key2 // key2
// String key2Header = "全部"; // String key2Header = "全部";
String key2Header = ""; String key2Header = "";
...@@ -292,13 +292,13 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -292,13 +292,13 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
return new BrandkbsWarnTemplate(firstCount, key1, key2, key3, key4, new BrandkbsYuQingWarn(collect)); return new BrandkbsWarnTemplate(firstCount, key1, key2, key3, key4, new BrandkbsYuQingWarn(collect));
} }
private BrandkbsWarnTemplate brandkbsWarnTemplate4Channel(BrandkbsChannelConfig config, List<BaseMap> datas, long start, long end, AbstractProject project) { private BrandkbsWarnTemplate brandkbsWarnTemplate4Channel(BrandkbsChannelConfig config, List<BaseMap> datas, long start, long end, Project project) {
if (datas.isEmpty()) { if (datas.isEmpty()) {
return null; return null;
} }
int firstCount = datas.size(); int firstCount = datas.size();
// key1 // key1
String key1 = "【品见】渠道参与-" + project.getProjectName(); String key1 = "【品见】渠道参与-" + project.getExtraProjectName();
// key2 // key2
String key2 = "自定义渠道"; String key2 = "自定义渠道";
if (Boolean.TRUE.equals(config.getFriendlyChannel())) { if (Boolean.TRUE.equals(config.getFriendlyChannel())) {
...@@ -333,12 +333,12 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -333,12 +333,12 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
return new BrandkbsWarnTemplate(firstCount, key1, key2, key3, key4, new BrandkbsYuQingWarn(collect)); return new BrandkbsWarnTemplate(firstCount, key1, key2, key3, key4, new BrandkbsYuQingWarn(collect));
} }
private BrandkbsWarnTemplate brandkbsWarnTemplate4HotEvent(BrandkbsHotEventConfig config, Map<String, List<com.zhiwei.middleware.event.pojo.entity.Event>> eventMap, long start, long end, AbstractProject project) { private BrandkbsWarnTemplate brandkbsWarnTemplate4HotEvent(BrandkbsHotEventConfig config, Map<String, List<com.zhiwei.middleware.event.pojo.entity.Event>> eventMap, long start, long end, Project project) {
int firstCount = eventMap.values().stream().mapToInt(List::size).sum(); int firstCount = eventMap.values().stream().mapToInt(List::size).sum();
if (firstCount == 0) { if (firstCount == 0) {
return null; return null;
} }
String key1 = "【品见】热点事件-" + project.getProjectName(); String key1 = "【品见】热点事件-" + project.getExtraProjectName();
// key2 // key2
String key2 = null; String key2 = null;
// key3 // key3
...@@ -377,11 +377,11 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -377,11 +377,11 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
} }
private BrandkbsWarnTemplate brandkbsWarnTemplate4HotTop(BrandkbsHotTopConfig config, List<BrandkbsHotTopWarn.HotTop> datas, long start, long end, private BrandkbsWarnTemplate brandkbsWarnTemplate4HotTop(BrandkbsHotTopConfig config, List<BrandkbsHotTopWarn.HotTop> datas, long start, long end,
AbstractProject project) { Project project) {
if (CollectionUtils.isEmpty(datas)) { if (CollectionUtils.isEmpty(datas)) {
return null; return null;
} }
String key1 = "【品见】上榜热搜-" + project.getProjectName(); String key1 = "【品见】上榜热搜-" + project.getExtraProjectName();
// key2 // key2
String key2 = ""; String key2 = "";
List<String> key2Element = new ArrayList<>(); List<String> key2Element = new ArrayList<>();
...@@ -437,7 +437,7 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -437,7 +437,7 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
return null; return null;
} }
int firstCount = datas.size(); int firstCount = datas.size();
String key1 = "【品见】案例上新-" + project.getProjectName(); String key1 = "【品见】案例上新-" + project.getExtraProjectName();
String key2 = null; String key2 = null;
String key3 = Constant.SPEC_MINUTE_FORMAT.format(time); String key3 = Constant.SPEC_MINUTE_FORMAT.format(time);
// key4 // key4
...@@ -464,7 +464,10 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -464,7 +464,10 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
private List<JSONObject> getRankListByType(String type) { private List<JSONObject> getRankListByType(String type) {
String search = TYPE_SEARCH.get(type); String search = TYPE_SEARCH.get(type);
if (null == search) { if (null == search) {
// 2024/8/19 微博话题榜采集下线,防止微博话题配置历史数据影响
if (!Objects.equals(type, "微博话题")) {
log.error("getRankListByType,search-null,type:{}", type); log.error("getRankListByType,search-null,type:{}", type);
}
return Collections.emptyList(); return Collections.emptyList();
} }
try { try {
...@@ -674,11 +677,10 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -674,11 +677,10 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
@Override @Override
public ResponseResult getChannelWaring(String projectId, BrandkbsChannelConfig config) { public ResponseResult getChannelWaring(String projectId, BrandkbsChannelConfig config) {
Project project = null;
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
long start = end - config.getPushInterval(); long start = end - config.getPushInterval();
Project project = projectService.getProjectById(projectId);
try { try {
project = projectService.getProjectById(projectId);
log.info("获取渠道参与预警开始,project:{}", project.getProjectName()); log.info("获取渠道参与预警开始,project:{}", project.getProjectName());
EsClientDao.SearchHelper helper = EsClientDao.createSearchHelper(); EsClientDao.SearchHelper helper = EsClientDao.createSearchHelper();
BoolQueryBuilder postFilter = EsQueryTools.assembleCacheMapsQuery(project.getId(), "0"); BoolQueryBuilder postFilter = EsQueryTools.assembleCacheMapsQuery(project.getId(), "0");
...@@ -757,7 +759,7 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -757,7 +759,7 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
long start = end - Constant.ONE_DAY * 7; long start = end - Constant.ONE_DAY * 7;
try { try {
log.info("获取热点事件预警开始,project:{}", project.getProjectName()); log.info("获取热点事件预警开始,project:{}", project.getExtraProjectName());
Map<String, List<com.zhiwei.middleware.event.pojo.entity.Event>> eventMap = new LinkedHashMap<>(); Map<String, List<com.zhiwei.middleware.event.pojo.entity.Event>> eventMap = new LinkedHashMap<>();
if (CollectionUtils.isNotEmpty(config.getOwnEvent())) { if (CollectionUtils.isNotEmpty(config.getOwnEvent())) {
// 调用事件中间件时,使用项目id作为主品牌id // 调用事件中间件时,使用项目id作为主品牌id
...@@ -798,10 +800,10 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -798,10 +800,10 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
} }
eventMap.put("行业动态", externalEvents); eventMap.put("行业动态", externalEvents);
} }
log.info("获取热点事件预警结束,project:{}", project.getProjectName()); log.info("获取热点事件预警结束,project:{}", project.getExtraProjectName());
return ResponseResult.success(brandkbsWarnTemplate4HotEvent(config, eventMap, start, end, project)); return ResponseResult.success(brandkbsWarnTemplate4HotEvent(config, eventMap, start, end, project));
} catch (Exception e) { } catch (Exception e) {
log.info("获取热点事件预警失败,project:{}", project.getProjectName(), e); log.info("获取热点事件预警失败,project:{}", project.getExtraProjectName(), e);
} }
return ResponseResult.failure("获取热点事件预警失败"); return ResponseResult.failure("获取热点事件预警失败");
} }
......
...@@ -435,7 +435,7 @@ public class ReportServiceImpl implements ReportService { ...@@ -435,7 +435,7 @@ public class ReportServiceImpl implements ReportService {
String startTimeStr = Constant.HOUR_FORMAT.format(report.getStartTime()); String startTimeStr = Constant.HOUR_FORMAT.format(report.getStartTime());
String lastStartTimeStr = Constant.HOUR_FORMAT.format(lastStartTime); String lastStartTimeStr = Constant.HOUR_FORMAT.format(lastStartTime);
JSONObject result = new JSONObject(); JSONObject result = new JSONObject();
result.put("brand", projectService.getProjectById(report.getProjectId()).getProjectName()); result.put("brand", projectService.getProjectById(report.getProjectId()).getExtraProjectName());
result.put("startTime", report.getStartTime()); result.put("startTime", report.getStartTime());
result.put("endTime", report.getEndTime()); result.put("endTime", report.getEndTime());
result.put("curMonth", Integer.parseInt(startTimeStr.substring(5, 7))); result.put("curMonth", Integer.parseInt(startTimeStr.substring(5, 7)));
......
package com.zhiwei.brandkbs2.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.base.category.ClassB;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.common.GlobalPojo;
import com.zhiwei.brandkbs2.config.Constant;
import com.zhiwei.brandkbs2.dao.MarkSearchAnalyzeTaskDao;
import com.zhiwei.brandkbs2.enmus.SensitiveChannelsEnum;
import com.zhiwei.brandkbs2.es.EsClientDao;
import com.zhiwei.brandkbs2.es.EsQueryTools;
import com.zhiwei.brandkbs2.exception.ExceptionCast;
import com.zhiwei.brandkbs2.model.CommonCodeEnum;
import com.zhiwei.brandkbs2.pojo.BaseMap;
import com.zhiwei.brandkbs2.pojo.MarkSearchAnalyzeTask;
import com.zhiwei.brandkbs2.pojo.Project;
import com.zhiwei.brandkbs2.pojo.dto.ExportSearchWholeDTO;
import com.zhiwei.brandkbs2.pojo.dto.SearchFilterDTO;
import com.zhiwei.brandkbs2.pojo.vo.LineVO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.service.*;
import com.zhiwei.brandkbs2.util.RedisUtil;
import com.zhiwei.brandkbs2.util.TextUtil;
import com.zhiwei.brandkbs2.util.Tools;
import com.zhiwei.qbjc.bean.pojo.common.MessagePlatform;
import com.zhiwei.qbjc.bean.tools.BeanTools;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.script.Script;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.BucketOrder;
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval;
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
import org.elasticsearch.search.aggregations.bucket.histogram.ParsedDateHistogram;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedStringTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.joda.time.Period;
import org.joda.time.PeriodType;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @ClassName: SearchWholeService
* @Description 全网搜服务
* @author: cjz
* @date: 2024-08-29 9:43
*/
@Service("searchWholeServiceImpl")
public class SearchWholeServiceImpl implements SearchWholeService {
private static final Logger log = LogManager.getLogger(SearchWholeServiceImpl.class);
@Resource(name = "esClientDao")
private EsClientDao esClientDao;
@Resource(name = "markSearchAnalyzeTaskDao")
MarkSearchAnalyzeTaskDao markSearchAnalyzeTaskDao;
@Resource(name = "redisUtil")
RedisUtil redisUtil;
@Resource(name = "textUtil")
TextUtil textUtil;
@Resource(name = "restTemplate")
private RestTemplate restTemplate;
@Resource(name = "markDataServiceImpl")
MarkDataService markDataService;
@Resource(name = "projectServiceImpl")
private ProjectService projectService;
@Resource(name = "userServiceImpl")
private UserService userService;
@Resource(name = "commonServiceImpl")
private CommonService commonService;
@Resource(name = "systemInfoServiceImpl")
SystemInfoService systemInfoService;
@Value("${istarshine.addIStarShineKSData.url}")
private String addIStarShineKSDataUrl;
@Value("${istarshine.getIStarShineKSInfoData.url}")
private String getIStarShineKSInfoDataUrl;
@Value("${whole.search.url}")
private String wholeSearchUrl;
@Override
public Pair<JSONObject, Integer> searchWholeNetworkWithBalance(SearchFilterDTO dto) {
if (dto.isExternalDataSource()) { // 查商业数据库
try {
JSONObject data = getSearchWholeOpinionJson(dto);
JSONObject json = packageExternalDataSourceResult(data);
// 仅当第一页时统计平台进量(声量)
if (1 == dto.getPage()) {
json.put("info", getExternalDataSourcePlatformCount(dto));
}
return Pair.of(json, json.getInteger("pageLimit"));
} catch (Exception e) {
log.error("error searchWholeNetwork - ", e);
return Pair.of(null, null);
}
} else { // 查舆情库
ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(wholeSearchUrl, dto.toMap(), JSONObject.class);
return Pair.of(searchWholeOpinion(responseEntity), null);
}
}
@Override
public JSONObject getWholeNetworkSearchCriteria(boolean externalDataSource) {
JSONObject result = new JSONObject();
// 搜索时间
result.put("times", Arrays.asList("今天", "24小时", "三天", "七天", "近30天"));
result.put("ninetyDays", DateUtils.addDays(Tools.truncDate(new Date(), Constant.DAY_PATTERN), -89).getTime());
// 外部数据源(实时采集)条件
if (externalDataSource) {
result.put("platformList", Arrays.asList("App", "博客", "平媒", "新闻", "微博", "微信", "论坛", "视频", "短视频"));
} else {
result.put("platformList", commonService.getQbjcPlatform("id", "name")
.stream().filter(s -> !s.get("name").equals("脉脉")).collect(Collectors.toList()));
result.putAll(systemInfoService.getExtraParam());
}
return result;
}
@Override
public List<ExportSearchWholeDTO> exportSearchWhole(SearchFilterDTO dto) {
Integer exportAmount = userService.queryUserInfo(UserThreadLocal.getUserId(), UserThreadLocal.getProjectId()).getExportAmount();
exportAmount = Objects.isNull(exportAmount) ? 10000 : exportAmount;
JSONArray jsonArray = new JSONArray();
dto.setPageSize(50);
dto.setPage(1);
while (true) {
if (dto.getPage() * dto.getPageSize() > exportAmount) {
break;
}
// 获取当页数据
JSONObject jsonObject = searchWholeNetworkWithBalance(dto).getLeft();
JSONArray array = jsonObject.getJSONArray("list");
if (Objects.isNull(array) || 0 == array.size()) {
break;
}
jsonArray.addAll(array);
dto.setPage(dto.getPage() + 1);
}
return jsonArray.stream().map(json -> ExportSearchWholeDTO.creatExportSearchWholeDTO((JSONObject) json)).collect(Collectors.toList());
}
/**
* 舆情库数据结果组装成标准分页返回格式
*
* @param responseEntity
* @return
*/
private JSONObject searchWholeOpinion(ResponseEntity<JSONObject> responseEntity) {
JSONObject res = new JSONObject();
JSONObject bodyData = Objects.requireNonNull(responseEntity.getBody()).getJSONObject("data");
JSONObject data = bodyData.getJSONObject("data");
JSONArray listArray = data.getJSONArray("list");
List<JSONObject> resultList = new ArrayList<>();
for (Object o : listArray) {
JSONObject jsonObject = (JSONObject) o;
JSONObject result = searchWholeDataProcess(jsonObject);
resultList.add(result);
}
// 仅第一页返回平台进量(声量)统计
if (1 == data.getInteger("page")) {
JSONObject count = bodyData.getJSONObject("count");
List<JSONObject> platformCounts = count.getJSONArray("count").toJavaList(JSONObject.class);
// 去除外媒和脉脉两个平台
List<JSONObject> list = platformCounts.stream().filter(json -> !Objects.equals(json.getString("name"), "脉脉") &&
!Objects.equals(json.getString("name"), "外媒")).collect(Collectors.toList());
// 重新计算总数
Long total = list.stream().map(json -> json.getLongValue("count")).reduce(Long::sum).orElse(0L);
JSONObject counts = new JSONObject();
counts.put("count", list);
counts.put("total", total);
res.put("info", counts);
}
res.put("list", resultList);
res.put("page", data.get("page"));
res.put("pageLimit", data.get("pageLimit"));
res.put("total", data.get("total"));
res.put("totalPage", data.get("totalPage"));
res.put("isBackUp", false);
return res;
}
/**
* 获取实时采集(外部数据源)平台进量(声量)
*
* @param dto
* @return
*/
private JSONObject getExternalDataSourcePlatformCount(SearchFilterDTO dto) {
JSONObject res = new JSONObject();
List<JSONObject> list = new ArrayList<>();
List<String> platforms = Arrays.asList("App", "博客", "平媒", "新闻", "微博", "微信", "论坛", "视频", "短视频");
for (String platform : platforms) {
// 重置平台条件
dto.setPlatforms(Collections.singletonList(platform));
JSONObject data = getSearchWholeOpinionJson(dto);
JSONObject task = data.getJSONObject("task");
JSONObject jsonObject = new JSONObject();
jsonObject.put("count", task.getLongValue("searchCount"));
jsonObject.put("name", platform);
list.add(jsonObject);
}
Long total = list.stream().map(jsonObject -> jsonObject.getLongValue("count")).reduce(Long::sum).orElse(0L);
res.put("count", list);
res.put("total", total);
return res;
}
/**
* 将外部数据源JSONObject组装成标准的返回结果
*
* @param data
* @return
*/
private JSONObject packageExternalDataSourceResult(JSONObject data) {
JSONObject jsonObject = new JSONObject();
List<JSONObject> resultList = new ArrayList<>();
JSONObject task = data.getJSONObject("task");
Integer receiveCount = task.getInteger("receiveCount");
Integer searchCount = task.getInteger("searchCount");
int totalPage;
if (0 == receiveCount || 0 == searchCount) {
totalPage = 0;
} else {
totalPage = searchCount % receiveCount == 0 ? searchCount / receiveCount : (searchCount / receiveCount + 1);
}
List<JSONObject> listArray = data.getJSONArray("data").toJavaList(JSONObject.class);
for (JSONObject json : listArray) {
JSONObject result = new JSONObject();
String platform = getPlatformExternal(json.getJSONObject("gather"));
result.put("platform", platform);
result.put("title", json.get("title"));
result.put("content", json.get("content"));
// 渠道获取分平台
result.put("source", getSourceExternal(json, getExternalType(json, platform)));
result.put("url", getUrl(json));
result.put("time", json.getString("ctime").length() == 10 ? json.getLong("ctime") * 1000L : json.getLong("ctime"));
resultList.add(result);
}
jsonObject.put("list", resultList);
//jsonObject.put("page",data1.get("page"));
jsonObject.put("pageLimit", receiveCount);
jsonObject.put("total", searchCount);
jsonObject.put("totalPage", totalPage);
jsonObject.put("balance", projectService.getProjectById(UserThreadLocal.getProjectId()).getWholeSearchBalance() - receiveCount);
jsonObject.put("isBackUp", true);
return jsonObject;
}
private ClassB.TypeB getExternalType(JSONObject tJson, String platform) {
int wtype = tJson.getIntValue("wtype");
if (platform.equals("微博") && 2 == wtype) {
return ClassB.TypeB.INCOMPLETE;
} else if (platform.equals("微博") && 1 == wtype) {
return ClassB.TypeB.INCOMPLETE;
} else if (platform.equals("视频") || platform.equals("短视频")) {
return ClassB.TypeB.VIDEO;
}
return ClassB.TypeB.COMPLETE;
}
private String getSourceExternal(JSONObject tJson, ClassB.TypeB typeB) {
String source = null;
switch (typeB) {
case COMPLETE:
case INCOMPLETE:
case VIDEO:
if (!StringUtils.isEmpty(tJson.getString("user"))) {
source = tJson.getJSONObject("user").getString("name");
} else {
source = tJson.getString("repostSource");
}
break;
default:
break;
}
return source;
}
/**
* 获取全网搜接口信息url
*
* @param json 数据
* @return url链接
*/
private static String getUrl(JSONObject json) {
String url = json.getString("url");
// 如果url为空,则查询QA类型url字段
if (null == url) {
url = json.getString("answer_url");
}
if (null == url) {
url = json.getString("question_url");
}
return url;
}
private String getPlatformExternal(JSONObject gather) {
String siteDomain = gather.getString("site_domain");
String infoFlag = JSON.toJSONString(gather.get("info_flag"));
if (Objects.isNull(siteDomain) && gather.getString("site_name").contains("今日头条")) {
return "今日头条";
}
if (Objects.nonNull(siteDomain) && siteDomain.equals("toutiao.com")) {
return "今日头条";
}
if (infoFlag.contains("06")) {
return "微信";
}
if (infoFlag.contains("04") || infoFlag.contains("08")) {
return "微博";
}
if (infoFlag.contains("02")) {
return "贴吧论坛";
}
if (infoFlag.contains("0105")) {
return "平媒";
}
if (infoFlag.contains("0109")) {
return "自媒体";
}
if (infoFlag.contains("07")) {
return "视频";
}
if (infoFlag.contains("11")) {
return "短视频";
}
// '01':新闻, '0105':平媒,0109':APP, '02':论坛, '03':博客, '04':微博,'0401':新浪微博, '06':微信, '07': 视频,
// '08':长微博,' '11': 小视频, '12':境外资讯,'1201': 境外,'1202':外文, '13': 境外社交媒体,'1301': Twitter',1302': Facebook, '99':搜索
return "网媒";
}
/**
* 获取外部数据源搜索结果json
*
* @param dto
* @return
*/
private JSONObject getSearchWholeOpinionJson(SearchFilterDTO dto) {
// 组装请求参数
JSONObject taskEntity = packageExternalDataSourceParams(dto);
ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(addIStarShineKSDataUrl, taskEntity, JSONObject.class);
JSONObject result = Objects.requireNonNull(responseEntity.getBody()).getJSONObject("data");
return searchWholeBackUp(result.get("id").toString());
}
/**
* 获取外部数据源搜索结果JSONObject
*
* @param taskId
* @return
*/
private JSONObject searchWholeBackUp(String taskId) {
JSONObject jsonObject = new JSONObject();
for (int i = 0; i < 30; i++) {
ResponseEntity<JSONObject> responseEntity = restTemplate.getForEntity(getIStarShineKSInfoDataUrl, JSONObject.class, taskId);
JSONObject data = Objects.requireNonNull(responseEntity.getBody()).getJSONObject("data");
JSONObject task = data.getJSONObject("task");
if (2 == task.getInteger("crawlerFinish")) {
throw new IllegalArgumentException(task.getString("searchResultMsg"));
}
if (1 == task.getInteger("crawlerFinish")) {
return data;
}
Tools.sleep(500L);
}
return jsonObject;
}
/**
* 外部数据源组装请求参数
*
* @param dto
* @return
*/
private JSONObject packageExternalDataSourceParams(SearchFilterDTO dto) {
JSONObject params = externalTransform(dto);
JSONObject taskEntity = new JSONObject();
taskEntity.put("appId", "6183571e0d710000f6003a12"); // 应用id, 由张志伟提供给使用者
taskEntity.put("taskType", null); // 可为null, 任务类型
taskEntity.put("taskDescription", null); // 可为null, 任务描述
taskEntity.put("taskName", UserThreadLocal.getProjectId() + "_" + UserThreadLocal.getUserId());
taskEntity.put("userName", "品见"); // 提交任务的人
taskEntity.put("searchParams", params); // 任务详情参数
return taskEntity;
}
/**
* 外部数据源字段转换
*
* @param dto
*/
private JSONObject externalTransform(SearchFilterDTO dto) {
JSONObject params = new JSONObject();
params.put("crawlerWord", dto.getKeyword());
params.put("startTime", dto.getStartTime());
params.put("endTime", dto.getEndTime());
String platforms;
// 平台为空时,传全部
if (Tools.isEmpty(dto.getPlatforms())) {
platforms = "App,博客,平媒,新闻,微博,微信,论坛,视频,短视频";
} else {
platforms = StringUtils.join(dto.getPlatforms(), ",");
}
params.put("platforms", platforms);
params.put("sortOf", "ctime+" + (dto.getSorter().toJSONString().contains("asc") ? "asc" : "desc"));
params.put("page", dto.getPage());
params.put("pageSize", dto.getPageSize());
params.put("crawlerTime", dto.getCrawlerTime());
params.put("filterWord", dto.getFilterWords());
// matchFields
if (dto.getMatchType().equals("标题")) {
params.put("matchFields", Collections.singletonList("title"));
}else if (dto.getMatchType().equals("全文")){
params.put("matchFields", Collections.singletonList("content"));
}
// sourceKeyword
if (StringUtils.isNotBlank(dto.getSourceKeyword())){
params.put("userList", Arrays.asList(dto.getSourceKeyword().trim().split("\\|")));
}
// // 历史部分
// if (Tools.isEmpty(dto.getPlatforms())) {
// dto.setPlatformsStr("App,博客,平媒,新闻,微博,微信,论坛,视频,短视频");
// }
return params;
}
@Override
public JSONObject getSearchWholeYuqingAmount(SearchFilterDTO dto) {
JSONObject jsonObject = new JSONObject();
try {
String projectId = UserThreadLocal.getProjectId();
String[] indexes = esClientDao.getAllIndexes(dto.getStartTime(), dto.getEndTime());
BoolQueryBuilder postFilter = searchWholeAnalyzeQuery(dto);
// 舆情总量
long total = esClientDao.count(indexes, null, postFilter);
jsonObject.put("total", total);
// 项目日均
String projectYuqingCountAvgKey = RedisUtil.getYuqingAnalyzeProjectAvgCountKey(projectId, Constant.PRIMARY_CONTEND_ID, null, null, false);
if (Objects.isNull(redisUtil.get(projectYuqingCountAvgKey))) {
Project project = GlobalPojo.PROJECT_MAP.get(projectId);
long endTime = System.currentTimeMillis();
long startTime = project.getCTime() > endTime - Constant.ONE_YEAR ? project.getCTime() : endTime - Constant.ONE_YEAR;
markDataService.countYuqingAmountAvg(startTime, endTime, projectId, null);
}
double projectYuqingAvgCount = Objects.isNull(redisUtil.get(projectYuqingCountAvgKey)) ? 0d : Double.parseDouble(redisUtil.get(projectYuqingCountAvgKey));
jsonObject.put("projectAvg", projectYuqingAvgCount);
// 本次日均
int days = new Period(dto.getStartTime(), dto.getEndTime(), PeriodType.days()).getDays();
days = 0 == days ? 1 : days;
double yuqingAvgCount = total == 0 ? 0d : total / (double) days;
jsonObject.put("compare", compare(yuqingAvgCount, projectYuqingAvgCount));
}catch (Exception e){
ExceptionCast.cast(CommonCodeEnum.FAIL, "全网搜舆情分析getSearchWholeYuqingAmount异常-", e);
}
return jsonObject;
}
@Override
public JSONObject getSearchWholeImportantPlatformPercentage(SearchFilterDTO dto) {
JSONObject res = new JSONObject();
try {
List<JSONObject> list = new ArrayList<>();
if (CollectionUtils.isEmpty(dto.getPlatforms())) {
dto.setPlatforms(Stream.of("微博", "微信", "抖音", "小红书", "今日头条", "网媒").map(GlobalPojo::getPlatformIdByName).collect(Collectors.toList()));
}
// indexes
String[] indexes = esClientDao.getAllIndexes(dto.getStartTime(), dto.getEndTime());
// query
BoolQueryBuilder postFilter = searchWholeAnalyzeQuery(dto);
long total = esClientDao.count(indexes, postFilter, null);
// 平台聚合
Script script = new Script("doc['c5'].value +'_' +doc['foreign'].value");
TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("agg").script(script).size(1000);
SearchResponse searchResponse = esClientDao.searchResponse(indexes, null, postFilter, aggregationBuilder, null, null, 0, 0, null);
// buckets
Map<String, Aggregation> aggregationMap = searchResponse.getAggregations().asMap();
ParsedStringTerms terms = (ParsedStringTerms) aggregationMap.get("agg");
List<? extends Terms.Bucket> buckets = terms.getBuckets();
Map<String, Long> platformCount = new HashMap<>();
for (Terms.Bucket bucket : buckets) {
String[] split = bucket.getKeyAsString().split("_");
String platform = BeanTools.filterPlatform(GlobalPojo.PLATFORMS, Integer.valueOf(split[0]), Integer.valueOf(split[1])).getName();
if (StringUtils.isBlank(platform)){
continue;
}
platformCount.compute(platform, (k, v) -> Objects.isNull(v) ? bucket.getDocCount() : v + bucket.getDocCount());
}
for (Map.Entry<String, Long> entry : platformCount.entrySet()) {
JSONObject platformResult = new JSONObject();
platformResult.put("platform", entry.getKey());
platformResult.put("count", entry.getValue());
list.add(platformResult);
}
res.put("platformCount", list.stream().sorted(Comparator.comparingLong((JSONObject json) -> json.getLongValue("count")).reversed()));
JSONObject overview = new JSONObject();
// 总量
overview.put("total", total);
// 日均
int days = new Period(dto.getStartTime(), dto.getEndTime(), PeriodType.days()).getDays();
days = 0 == days ? 1 : days;
double avg = total == 0 ? 0d : total / (double) days;
// 项目均值
String projectId = UserThreadLocal.getProjectId();
String key = RedisUtil.getYuqingAnalyzePlatformAvgCountKey(projectId, Constant.PRIMARY_CONTEND_ID, null);
if (Objects.isNull(redisUtil.get(key))){
Project project = GlobalPojo.PROJECT_MAP.get(projectId);
long endTime = System.currentTimeMillis();
long startTime = project.getCTime() > endTime - Constant.ONE_YEAR ? project.getCTime() : endTime - Constant.ONE_YEAR;
markDataService.countImportantPlatformPercentageAvg(startTime, endTime, projectId, null);
}
double projectAvg = Objects.isNull(redisUtil.get(key)) ? 0d : Double.parseDouble(redisUtil.get(key));
overview.put("compare", compare(avg, projectAvg));
overview.put("avg", projectAvg);
res.put("overview", overview);
return res;
}catch (Exception e){
ExceptionCast.cast(CommonCodeEnum.FAIL, "全网搜舆情分析getSearchWholeImportantPlatformPercentage异常-", e);
}
return res;
}
@Override
public List<JSONObject> getSearchWholeAnalyzePlatformPercentage(SearchFilterDTO dto) {
try {
if (CollectionUtils.isEmpty(dto.getPlatforms())) {
List<String> platforms = GlobalPojo.PLATFORMS.stream().map(MessagePlatform::getId).collect(Collectors.toList());
dto.setPlatforms(platforms);
}
List<JSONObject> list = new ArrayList<>();
// indexes
String[] indexes = esClientDao.getAllIndexes(dto.getStartTime(), dto.getEndTime());
// query
BoolQueryBuilder postFilter = searchWholeAnalyzeQuery(dto);
// total
long total = esClientDao.count(indexes, postFilter, null);
// 平台聚合
Script script = new Script("doc['c5'].value +'_' +doc['foreign'].value");
TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("agg").script(script).size(1000).order(BucketOrder.count(false));
SearchResponse searchResponse = esClientDao.searchResponse(indexes, null, postFilter, aggregationBuilder, null, null, 0, 0, null);
// buckets
Map<String, Aggregation> aggregationMap = searchResponse.getAggregations().asMap();
ParsedStringTerms terms = (ParsedStringTerms) aggregationMap.get("agg");
List<? extends Terms.Bucket> buckets = terms.getBuckets();
Map<String, Integer> platformCount = new HashMap<>();
for (Terms.Bucket bucket : buckets) {
String[] split = bucket.getKeyAsString().split("_");
String platform = BeanTools.filterPlatform(GlobalPojo.PLATFORMS, Integer.valueOf(split[0]), Integer.valueOf(split[1])).getName();
if (StringUtils.isBlank(platform)){
continue;
}
platformCount.compute(platform, (k, v) -> Objects.isNull(v) ? (int) bucket.getDocCount() : v + (int) bucket.getDocCount());
}
// 取前9
Map<String, Integer> sortMap = Tools.sortMap(platformCount, 9);
for (Map.Entry<String, Integer> entry : sortMap.entrySet()) {
JSONObject platformResult = new JSONObject();
platformResult.put("platform", entry.getKey());
platformResult.put("percent", 0 == total ? 0d : entry.getValue() / (double) total);
list.add(platformResult);
}
// 第10个算做其他平台
JSONObject other = new JSONObject();
other.put("platform", "其他");
other.put("percent", 1 - list.stream().mapToDouble(count -> count.getDoubleValue("percent")).sum());
list.add(other);
return list;
}catch (Exception e){
ExceptionCast.cast(CommonCodeEnum.FAIL, "全网搜舆情分析geAnalyzePlatformPercentage异常-", e);
}
return Collections.emptyList();
}
@Override
public JSONObject getSearchWholeSpreadTendency(SearchFilterDTO dto) {
JSONObject res = new JSONObject();
try {
List<LineVO> totalSpreadTendency = getTotalSpreadTendency(dto);
Map<String, List<LineVO>> platformSpreadTendency = getPlatformSpreadTendency(dto);
BaseMap firstArticle = getFirstArticle(dto, totalSpreadTendency);
JSONObject highestJson = new JSONObject();
if (Objects.nonNull(firstArticle)) {
String title = Objects.isNull(firstArticle.getTitle()) || Tools.filterUselessTitle(firstArticle.getTitle())
? firstArticle.getContent() : firstArticle.getTitle();
highestJson.put("title", StringUtils.substring(title, 0, 15));
highestJson.put("url", firstArticle.getUrl());
}
res.putAll(platformSpreadTendency);
res.put("总量", totalSpreadTendency);
res.put("highest", highestJson);
}catch (Exception e){
ExceptionCast.cast(CommonCodeEnum.FAIL, "全网搜舆情分析getSearchWholeSpreadTendency异常-", e);
}
return res;
}
@Override
public List<JSONObject> getSearchWholeActiveChannels(SearchFilterDTO dto) {
List<JSONObject> list = new ArrayList<>();
try {
// 索引
String[] indexes = esClientDao.getAllIndexes(dto.getStartTime(), dto.getEndTime());
// query
BoolQueryBuilder query = searchWholeAnalyzeQuery(dto);
// 渠道聚合,取前20
TermsAggregationBuilder sourceAggregationBuilder = AggregationBuilders.terms("source_count").field("source").order(BucketOrder.count(false)).size(20 + Tools.FILTER_SOURCE.size());
SearchResponse searchResponse = esClientDao.searchResponse(indexes, null, query,
sourceAggregationBuilder, null, null, 0, 0, null);
Map<String, Aggregation> aggMap = searchResponse.getAggregations().asMap();
ParsedStringTerms sourceCountTeam = (ParsedStringTerms) aggMap.get("source_count");
List<? extends Terms.Bucket> buckets = sourceCountTeam.getBuckets();
for (Terms.Bucket bucket : buckets) {
JSONObject jsonObject = new JSONObject();
String source = bucket.getKeyAsString();
// 过滤渠道名:”匿名“
if (Tools.filterUselessSource(source)){
continue;
}
jsonObject.put("source", source);
// 发文次数
jsonObject.put("count", bucket.getDocCount());
list.add(jsonObject);
}
}catch (Exception e){
ExceptionCast.cast(CommonCodeEnum.FAIL, "全网搜舆情分析getActiveChannels异常-", e);
}
return list.stream().limit(20).collect(Collectors.toList());
}
@Override
public List<JSONObject> getSearchWholeArticleIpLocated(SearchFilterDTO dto) {
List<JSONObject> list = new ArrayList<>();
try {
// 索引
String[] indexes = esClientDao.getAllIndexes(dto.getStartTime(), dto.getEndTime());
// query
BoolQueryBuilder query = searchWholeAnalyzeQuery(dto);
// 聚合请求
TermsAggregationBuilder ipAggregationBuilder = AggregationBuilders.terms("ip_count").field("ip_location").order(BucketOrder.count(false)).size(10);
SearchResponse searchResponse = esClientDao.searchResponse(indexes, null, query,
ipAggregationBuilder, null, null, 0, 0, null);
Map<String, Aggregation> aggMap = searchResponse.getAggregations().asMap();
ParsedStringTerms sourceCountTeam = (ParsedStringTerms) aggMap.get("ip_count");
List<? extends Terms.Bucket> buckets = sourceCountTeam.getBuckets();
buckets.forEach(bucket -> {
JSONObject jsonObject = new JSONObject();
jsonObject.put("ip", bucket.getKeyAsString());
jsonObject.put("count", bucket.getDocCount());
list.add(jsonObject);
});
}catch (Exception e){
ExceptionCast.cast(CommonCodeEnum.FAIL, "全网搜舆情分析getArticleIpLocated异常-", e);
}
return list;
}
@Override
public List<JSONObject> getSearchWholeAnalyzeHighWord(SearchFilterDTO dto) {
try {
MarkSearchAnalyzeTask existTask = markSearchAnalyzeTaskDao.findOne("searchFilterDTO", dto);
long sTime = System.currentTimeMillis();
if (Objects.nonNull(existTask)) {
while (!existTask.getFinish()) {
existTask = markSearchAnalyzeTaskDao.findOne("searchFilterDTO", dto);
long eTime = System.currentTimeMillis();
if (Objects.isNull(existTask) || existTask.getFinish() || eTime - sTime >= 3 * 60 * 1000) {
break;
}
Thread.sleep(10000L);
}
return existTask.getHighWord();
}
MarkSearchAnalyzeTask task = new MarkSearchAnalyzeTask(null, dto, null, false, System.currentTimeMillis(), System.currentTimeMillis());
markSearchAnalyzeTaskDao.insertOne(task);
List<JSONObject> highWord = generateHighWord(dto);
Update update = new Update();
update.set("finish", true);
update.set("highWord", highWord);
update.set("uTime", System.currentTimeMillis());
markSearchAnalyzeTaskDao.updateOneByIdWithField(task.getId(), update);
return highWord;
}catch (Exception e){
ExceptionCast.cast(CommonCodeEnum.FAIL, "全网搜舆情分析getSearchWholeAnalyzeHighWord异常-", e);
}
return Collections.emptyList();
}
@Override
public PageVO<JSONObject> getSearchWholeAnalyzeDetail(SearchFilterDTO dto) {
try {
// 索引
String[] indexes = esClientDao.getAllIndexes(dto.getStartTime(), dto.getEndTime());
// query
BoolQueryBuilder query = searchWholeAnalyzeQuery(dto);
long total = esClientDao.count(indexes, query, null);
// sort
FieldSortBuilder sort = null;
for (Map.Entry<String, Object> entry : dto.getSorter().entrySet()) {
String key = entry.getKey();
if (null == entry.getValue() || entry.getValue().toString().contains("desc")) {
sort = SortBuilders.fieldSort(key).order(SortOrder.DESC);
} else {
sort = SortBuilders.fieldSort(key).order(SortOrder.ASC);
}
}
int from = (dto.getPage() - 1) * dto.getPageSize();
int size = dto.getPageSize();
SearchHits searchHits = esClientDao.searchHits(indexes, query, null, null, sort, from, size, null);
List<JSONObject> resList = Arrays.stream(searchHits.getHits()).map(hit -> searchWholeDataProcess(new JSONObject(hit.getSourceAsMap()))).collect(Collectors.toList());
JSONObject jsonObject = new JSONObject();
// 高亮关键词
jsonObject.put("highlightWord", GlobalPojo.HIGHLIGHT_MAP.get(UserThreadLocal.getProjectId()));
return PageVO.createPageVo(total, dto.getPage(), dto.getPageSize(), resList).setInfo(jsonObject);
}catch (Exception e){
ExceptionCast.cast(CommonCodeEnum.FAIL, "全网搜舆情分析getSearchWholeAnalyzeDetail异常-", e);
}
return null;
}
private JSONObject searchWholeDataProcess(JSONObject jsonObject){
JSONObject result = new JSONObject();
String platform = BeanTools.filterPlatform(GlobalPojo.PLATFORMS, jsonObject.getIntValue(GenericAttribute.ES_C5), jsonObject.getIntValue(GenericAttribute.ES_FOREIGN)).getName();
platform = Objects.isNull(platform) ? jsonObject.getString("real_source") : platform;
result.put("platform", platform);
JSONArray contentArray = jsonObject.getJSONArray("ind_full_text");
result.put("title", contentArray.get(0));
result.put("content", contentArray.get(1));
if (3 == contentArray.size()) {
result.put("content", result.getString("content") + contentArray.get(2));
}
result.put("channel", jsonObject.getString("source"));
String url = jsonObject.getString("url");
// 如果url为空,则查询question_url字段
if (null == url) {
url = jsonObject.getString("question_url");
}
result.put("url", url);
result.put("time", jsonObject.getLongValue("time"));
result.put("avatarUrl", jsonObject.getString("avatar_url"));
result.put("source", jsonObject.getString("source"));
result.put("followersNum", jsonObject.getIntValue("followers_num"));
result.put("realSource", jsonObject.getString("real_source"));
result.put("ipLocation", jsonObject.getString("ip_location"));
result.put("picUrls", jsonObject.getString("pic_urls"));
result.put("videoUrls", jsonObject.getJSONArray("video_urls"));
// 视频时长处理
if (StringUtils.isNotBlank(jsonObject.getString("length"))){
result.put("length", Tools.formatVideoLength(jsonObject.getString("length")));
}
return result;
}
private List<JSONObject> generateHighWord(SearchFilterDTO dto){
List<JSONObject> res = new ArrayList<>();
try {
EsClientDao.SearchHelper searchHelper = EsClientDao.createSearchHelper();
// sort
searchHelper.setSort(SortBuilders.fieldSort(GenericAttribute.ES_TIME).order(SortOrder.DESC));
// fetchSource
searchHelper.setFetchSource(new String[]{GenericAttribute.ES_IND_TITLE, GenericAttribute.ES_IND_FULL_TEXT});
// postFilter
BoolQueryBuilder postFilter = searchWholeAnalyzeQuery(dto);
searchHelper.setPostFilter(postFilter);
searchHelper.setSize(1000);
searchHelper.setIndexes(esClientDao.getAllIndexes(dto.getStartTime(), dto.getEndTime()));
List<String> textList = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
searchHelper.setFrom((i - 1) * 1000);
SearchResponse searchResponse = esClientDao.searchResponse(searchHelper);
for (SearchHit searchHit : searchResponse.getHits().getHits()) {
Map<String, Object> source = searchHit.getSourceAsMap();
String title = (String) source.getOrDefault(GenericAttribute.ES_IND_TITLE, "");
String content = (String) source.getOrDefault(GenericAttribute.ES_IND_FULL_TEXT, "");
textList.add(title + content);
}
}
res = textUtil.getHighWordsJsonDifferentFieldName(textList, 20);
}catch (Exception e){
ExceptionCast.cast(CommonCodeEnum.FAIL, "全网搜舆情分析getHighWord异常-", e);
}
return res;
}
/**
* 时间段内最早发文
* @param dto
* @param totalSpreadTendency
* @return
* @throws IOException
*/
private BaseMap getFirstArticle(SearchFilterDTO dto, List<LineVO> totalSpreadTendency) throws IOException {
// 最高点的时间为开始时间
LineVO startLine = totalSpreadTendency.stream().max(Comparator.comparingLong(LineVO::getCount)).orElse(null);
if (Objects.isNull(startLine)){
return null;
}
Long startTime = startLine.getDate();
int startIndex = totalSpreadTendency.indexOf(startLine);
// 最高点后一个点的时间为结束时间
Long endTime = dto.getEndTime();
endTime = startIndex == totalSpreadTendency.size() - 1 ? endTime : totalSpreadTendency.get(startIndex + 1).getDate();
dto.setStartTime(startTime);
dto.setEndTime(endTime);
// indexes
String[] indexes = esClientDao.getAllIndexes(dto.getStartTime(), dto.getEndTime());
BoolQueryBuilder query = searchWholeAnalyzeQuery(dto);
// sort
FieldSortBuilder sort = new FieldSortBuilder("time").order(SortOrder.ASC);
SearchHits searchHits = esClientDao.searchHits(indexes, query, null, null, sort, 0, 1, null);
if (0 == searchHits.getTotalHits().value) {
return null;
}
return Tools.getBaseFromEsMap(searchHits.getAt(0).getSourceAsMap());
}
/**
* 舆情趋势图
* @param dto 标注数据搜索传输类
* @return
* @throws IOException
*/
private List<LineVO> getTotalSpreadTendency(SearchFilterDTO dto) throws IOException {
List<LineVO> res = new ArrayList<>();
String[] indexes = esClientDao.getAllIndexes(dto.getStartTime(), dto.getEndTime());
DateHistogramAggregationBuilder daysAggregationBuilder;
// 天级以小时为颗粒度,其他以天作为颗粒度
if (dto.getEndTime() - dto.getStartTime() <= Constant.ONE_DAY){
daysAggregationBuilder = AggregationBuilders.dateHistogram("timeAgg").field("time").calendarInterval(DateHistogramInterval.HOUR);
}else {
daysAggregationBuilder = AggregationBuilders.dateHistogram("timeAgg").field("time").calendarInterval(DateHistogramInterval.DAY);
}
// query
BoolQueryBuilder query = searchWholeAnalyzeQuery(dto);
// response
SearchResponse searchResponse = esClientDao.searchResponse(indexes, null, query,
daysAggregationBuilder, null, null, 0, 0, null);
Map<String, Aggregation> aggMap = searchResponse.getAggregations().asMap();
ParsedDateHistogram teamAgg = (ParsedDateHistogram) aggMap.get("timeAgg");
List<? extends Histogram.Bucket> buckets = teamAgg.getBuckets();
// 走势图
buckets.forEach(bucket -> {
long time = Long.parseLong(bucket.getKeyAsString());
long count = bucket.getDocCount();
res.add(new LineVO(count, time));
});
return res;
}
/**
* 微博、微信、抖音、小红书平台趋势图
* @param dto
* @return
* @throws IOException
*/
private Map<String, List<LineVO>> getPlatformSpreadTendency(SearchFilterDTO dto) throws IOException{
Map<String, List<LineVO>> res = new HashMap<>(4);
if (CollectionUtils.isEmpty(dto.getPlatforms())){
dto.setPlatforms(Stream.of("微博", "微信", "抖音", "小红书").map(GlobalPojo::getPlatformIdByName).collect(Collectors.toList()));
}
String[] indexes = esClientDao.getAllIndexes(dto.getStartTime(), dto.getEndTime());
// 平台聚合
Script script = new Script("doc['c5'].value +'_' +doc['foreign'].value");
TermsAggregationBuilder platformAggregationBuilder = AggregationBuilders.terms("platformAgg").script(script).order(BucketOrder.count(false));
DateHistogramAggregationBuilder daysAggregationBuilder;
// 天级以小时为颗粒度,其他以天作为颗粒度
if (dto.getEndTime() - dto.getStartTime() <= Constant.ONE_DAY){
daysAggregationBuilder = AggregationBuilders.dateHistogram("timeAgg").field("time").calendarInterval(DateHistogramInterval.HOUR);
}else {
daysAggregationBuilder = AggregationBuilders.dateHistogram("timeAgg").field("time").calendarInterval(DateHistogramInterval.DAY);
}
// query
BoolQueryBuilder query = searchWholeAnalyzeQuery(dto);
// response
SearchResponse searchResponse = esClientDao.searchResponse(indexes, null, query, platformAggregationBuilder.subAggregation(daysAggregationBuilder), null, null, 0, 0, null);
Map<String, Aggregation> map = searchResponse.getAggregations().asMap();
ParsedStringTerms countTeam = (ParsedStringTerms) map.get("platformAgg");
List<? extends Terms.Bucket> platformBuckets = countTeam.getBuckets();
Map<String, Map<String, Long>> platformLines = new HashMap<>();
platformBuckets.forEach(bucket -> {
String[] split = bucket.getKeyAsString().split("_");
String platform = BeanTools.filterPlatform(GlobalPojo.PLATFORMS, Integer.valueOf(split[0]), Integer.valueOf(split[1])).getName();
Map<String, Aggregation> aggMap = bucket.getAggregations().asMap();
ParsedDateHistogram teamAgg = (ParsedDateHistogram) aggMap.get("timeAgg");
List<? extends Histogram.Bucket> buckets = teamAgg.getBuckets();
// 合并平台相同时间节点稿件数
for (Histogram.Bucket timeBucket : buckets) {
platformLines.compute(platform, (k1, v1) -> {
if (Objects.isNull(v1)){
Map<String, Long> lineMap = new HashMap<>();
lineMap.put(timeBucket.getKeyAsString(), timeBucket.getDocCount());
platformLines.put(platform, lineMap);
return lineMap;
}else {
String timeStr = timeBucket.getKeyAsString();
long count = timeBucket.getDocCount();
Map<String, Long> lineMap = platformLines.get(platform);
lineMap.compute(timeStr, (k2, v2) -> Objects.isNull(v2) ? count : count + v2);
return lineMap;
}
});
}
});
platformLines.forEach((k1, v1) -> {
List<LineVO> line = new ArrayList<>();
v1.forEach((k2, v2) -> line.add(new LineVO(v2, Long.valueOf(k2))));
res.put(k1, line);
});
return res;
}
private String compare(double avg, double projectAvg){
// 本次查询日均数据 > 项目日均1.2倍为【本次偏高】,项目日均0.8倍<本次查询日均数据<项目日均1.2倍为【数据量正常】,本次查询日均数据 < 项目日均0.8倍为【本次偏低】
String compare = "normal";
double highSide = 1.2 * projectAvg;
double lowSize = 0.8 * projectAvg;
if (avg > highSide){
compare = "higher";
}
if (lowSize > avg){
compare = "lower";
}
return compare;
}
private BoolQueryBuilder searchWholeAnalyzeQuery(SearchFilterDTO dto){
BoolQueryBuilder postFilter = QueryBuilders.boolQuery();
// searchType 视频查询
if (Objects.nonNull(dto.getSearchType()) && Objects.equals("视频", dto.getSearchType())){
postFilter.must(QueryBuilders.existsQuery(GenericAttribute.ES_VIDEO_URLS));
}
// startTime endTime
if (Objects.nonNull(dto.getStartTime()) && Objects.nonNull(dto.getEndTime())) {
postFilter.must(QueryBuilders.rangeQuery("time").gte(dto.getStartTime()).lt(dto.getEndTime()));
}
// Query 查询条件
String[] fieldSearch = "标题".equals(dto.getMatchType()) ? new String[]{GenericAttribute.ES_IND_TITLE} : new String[]{GenericAttribute.ES_IND_FULL_TEXT};
// keyword
if (StringUtils.isNotEmpty(dto.getKeyword())) {
// Query
postFilter.must(EsQueryTools.assembleNormalKeywordQuery(dto.getKeyword(), fieldSearch));
}
// fans
if (StringUtils.isNotEmpty(dto.getFans())) {
if ("百万".equals(dto.getFans())) {
postFilter.must(QueryBuilders.rangeQuery("followers_num").gte(1000000).lt(10000000));
}
if ("千万".equals(dto.getFans())) {
postFilter.must(QueryBuilders.rangeQuery("followers_num").gte(10000000).lt(100000000));
}
}
// sensitiveChannels
if (!Tools.isEmpty(dto.getSensitiveChannels()) && !"全部".equals(dto.getSensitiveChannels().get("father"))) {
// 重要渠道提取
List<String> channels = SensitiveChannelsEnum.getSensitiveChannelsByGroupAndName(dto.getSensitiveChannels().get("father"), dto.getSensitiveChannels().get("son"));
String source = String.join("|", channels);
postFilter.must(EsQueryTools.assembleSeniorTermOrQuery(source, new String[]{GenericAttribute.ES_SOURCE}));
}
// platform
if (CollectionUtils.isNotEmpty(dto.getPlatforms())) {
postFilter.must(EsQueryTools.assemblePlatformQuery(Tools.getPlatformByIds(dto.getPlatforms())));
}
// videoPlatforms
if (Objects.nonNull(dto.getSearchType()) && Objects.equals("视频", dto.getSearchType()) && CollectionUtils.isNotEmpty(dto.getVideoPlatforms())){
postFilter.must(EsQueryTools.assembleVideoPlatformQuery(dto.getVideoPlatforms()));
}
// source
if (StringUtils.isNotEmpty(dto.getSourceKeyword())) {
postFilter.must(EsQueryTools.assembleSeniorTermOrQuery(dto.getSourceKeyword(), new String[]{GenericAttribute.ES_SOURCE}));
}
// FilterWords
if (StringUtils.isNotEmpty(dto.getFilterType()) && StringUtils.isNotBlank(dto.getFilterWords())) {
String[] fieldFilter = "标题".equals(dto.getFilterType()) ? new String[]{GenericAttribute.ES_IND_TITLE}
: new String[]{GenericAttribute.ES_IND_FULL_TEXT};
postFilter.mustNot(EsQueryTools.assembleNormalKeywordQuery(dto.getFilterWords(), fieldFilter));
}
// ip
if (StringUtils.isNotBlank(dto.getIp())){
postFilter.must(QueryBuilders.termQuery("ip_location", dto.getIp()));
}
return postFilter;
}
}
...@@ -92,6 +92,9 @@ public class TaskServiceImpl implements TaskService { ...@@ -92,6 +92,9 @@ public class TaskServiceImpl implements TaskService {
@Resource(name = "aiSearchQuestionRecordDao") @Resource(name = "aiSearchQuestionRecordDao")
private AISearchQuestionRecordDao aiSearchQuestionRecordDao; private AISearchQuestionRecordDao aiSearchQuestionRecordDao;
@Resource(name = "markSearchAnalyzeTaskDao")
MarkSearchAnalyzeTaskDao markSearchAnalyzeTaskDao;
@Resource(name = "brandkbsTaskServiceImpl") @Resource(name = "brandkbsTaskServiceImpl")
BrandkbsTaskService brandkbsTaskService; BrandkbsTaskService brandkbsTaskService;
...@@ -342,6 +345,12 @@ public class TaskServiceImpl implements TaskService { ...@@ -342,6 +345,12 @@ public class TaskServiceImpl implements TaskService {
} }
@Override @Override
public void cleanSearchAnalyzeTask() {
long deleteCount = markSearchAnalyzeTaskDao.deleteExpire(System.currentTimeMillis() - Constant.ONE_WEEK);
log.info("本次清理过期数据分析任务:{}条", deleteCount);
}
@Override
public void eventUpdate() { public void eventUpdate() {
for (Project project : projectService.getAllProjectsWithStart()) { for (Project project : projectService.getAllProjectsWithStart()) {
List<Event> events = eventService.findNotEndEventByProjectId(project.getId()); List<Event> events = eventService.findNotEndEventByProjectId(project.getId());
......
...@@ -215,7 +215,7 @@ public class ToolsetServiceImpl implements ToolsetService { ...@@ -215,7 +215,7 @@ public class ToolsetServiceImpl implements ToolsetService {
// 更新已用次数 // 更新已用次数
redisUtil.setExpire(redisKey, String.valueOf(ARTICLE_SUMMARY_LIMIT - remainingCount), Tools.getMillSecondNextDay(), TimeUnit.MILLISECONDS); redisUtil.setExpire(redisKey, String.valueOf(ARTICLE_SUMMARY_LIMIT - remainingCount), Tools.getMillSecondNextDay(), TimeUnit.MILLISECONDS);
// excel输出到指定路径 // excel输出到指定路径
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, project.getProjectName(), UserThreadLocal.getNickname(), "摘要提取结果"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, project.getExtraProjectName(), UserThreadLocal.getNickname(), "摘要提取结果");
EasyExcelUtil.write(filePath, "sheet1", ExportArticleSummaryDTO.class, datas); EasyExcelUtil.write(filePath, "sheet1", ExportArticleSummaryDTO.class, datas);
res.put("filePath", filePath); res.put("filePath", filePath);
res.put("remainingCount", remainingCount); res.put("remainingCount", remainingCount);
...@@ -255,7 +255,7 @@ public class ToolsetServiceImpl implements ToolsetService { ...@@ -255,7 +255,7 @@ public class ToolsetServiceImpl implements ToolsetService {
List<ExportInteractionUpdateDTO> exportList = List<ExportInteractionUpdateDTO> exportList =
urls.stream().map(url -> new ExportInteractionUpdateDTO(String.valueOf(id.incrementAndGet()), urlMap, url)).collect(Collectors.toList()); urls.stream().map(url -> new ExportInteractionUpdateDTO(String.valueOf(id.incrementAndGet()), urlMap, url)).collect(Collectors.toList());
// excel输出到指定路径 // excel输出到指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "链接互动量更新结果"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "链接互动量更新结果");
EasyExcelUtil.write(filePath, "sheet1", ExportInteractionUpdateDTO.class, exportList); EasyExcelUtil.write(filePath, "sheet1", ExportInteractionUpdateDTO.class, exportList);
JSONObject res = new JSONObject(); JSONObject res = new JSONObject();
...@@ -482,7 +482,7 @@ public class ToolsetServiceImpl implements ToolsetService { ...@@ -482,7 +482,7 @@ public class ToolsetServiceImpl implements ToolsetService {
return dto; return dto;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "事件计算结果"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "事件计算结果");
EasyExcelUtil.write(filePath, "sheet1", ExportBytedanceEventComputeResultDTO.class, list); EasyExcelUtil.write(filePath, "sheet1", ExportBytedanceEventComputeResultDTO.class, list);
return filePath; return filePath;
...@@ -493,7 +493,7 @@ public class ToolsetServiceImpl implements ToolsetService { ...@@ -493,7 +493,7 @@ public class ToolsetServiceImpl implements ToolsetService {
public String downloadPrimaryErrorData(String taskId) { public String downloadPrimaryErrorData(String taskId) {
BytedanceCustomEventUpdateTask task = bytedanceCustomEventUpdateTaskDao.findOneById(taskId); BytedanceCustomEventUpdateTask task = bytedanceCustomEventUpdateTaskDao.findOneById(taskId);
// excel写入至指定路径 // excel写入至指定路径
String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getProjectName(); String projectName = projectService.getProjectById(UserThreadLocal.getProjectId()).getExtraProjectName();
String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "报错数据"); String filePath = EasyExcelUtil.generateExcelFilePath(brandkbsFilePath, projectName, UserThreadLocal.getNickname(), "报错数据");
// List<UploadBytedanceEventDTO> collect = task.getErrorData().stream().map(errorData -> Tools.convertMap(errorData, UploadBytedanceEventDTO.class)).collect(Collectors.toList()); // List<UploadBytedanceEventDTO> collect = task.getErrorData().stream().map(errorData -> Tools.convertMap(errorData, UploadBytedanceEventDTO.class)).collect(Collectors.toList());
EasyExcelUtil.write(filePath, "sheet1", UploadBytedanceEventDTO.class, Collections.emptyList()); EasyExcelUtil.write(filePath, "sheet1", UploadBytedanceEventDTO.class, Collections.emptyList());
...@@ -561,7 +561,7 @@ public class ToolsetServiceImpl implements ToolsetService { ...@@ -561,7 +561,7 @@ public class ToolsetServiceImpl implements ToolsetService {
List<BytedanceCustomEventUpdateTaskData> data = entry.getValue(); List<BytedanceCustomEventUpdateTaskData> data = entry.getValue();
BytedanceCustomEventUpdateTask.EventInfo eventInfo = new BytedanceCustomEventUpdateTask.EventInfo(); BytedanceCustomEventUpdateTask.EventInfo eventInfo = new BytedanceCustomEventUpdateTask.EventInfo();
eventInfo.setName(eventName); eventInfo.setName(eventName);
eventInfo.setDataCount(data.size()); eventInfo.setDataCount(Math.max(data.size(), 1));
// 计算影响力指数 // 计算影响力指数
eventInfo.setInfluence(computeInf(data, levelInfoMap)); eventInfo.setInfluence(computeInf(data, levelInfoMap));
eventInfoMap.put(eventName, eventInfo); eventInfoMap.put(eventName, eventInfo);
...@@ -717,7 +717,7 @@ public class ToolsetServiceImpl implements ToolsetService { ...@@ -717,7 +717,7 @@ public class ToolsetServiceImpl implements ToolsetService {
private Double computeInf(List<BytedanceCustomEventUpdateTaskData> datas, Map<String, BytedanceCustomChannelLevelInfo> levelInfoMap){ private Double computeInf(List<BytedanceCustomEventUpdateTaskData> datas, Map<String, BytedanceCustomChannelLevelInfo> levelInfoMap){
Map<String, Double> levelSumH = new HashMap<>(5); Map<String, Double> levelSumH = new HashMap<>(5);
if (CollectionUtils.isEmpty(datas)){ if (CollectionUtils.isEmpty(datas)){
return 0d; return 1d;
} }
for (BytedanceCustomEventUpdateTaskData data : datas) { for (BytedanceCustomEventUpdateTaskData data : datas) {
// 匹配渠道影响力,微博、微信以外的平台一律按照”网媒“处理 // 匹配渠道影响力,微博、微信以外的平台一律按照”网媒“处理
...@@ -757,7 +757,8 @@ public class ToolsetServiceImpl implements ToolsetService { ...@@ -757,7 +757,8 @@ public class ToolsetServiceImpl implements ToolsetService {
// 3.各自乘以权重 结果相加 // 3.各自乘以权重 结果相加
result = INF.multiply(BigDecimal.valueOf(levelInfo.getWeight())).add(BigDecimal.valueOf(result)).doubleValue(); result = INF.multiply(BigDecimal.valueOf(levelInfo.getWeight())).add(BigDecimal.valueOf(result)).doubleValue();
} }
return BigDecimal.valueOf(result).setScale(1, RoundingMode.HALF_UP).doubleValue(); double resVal = BigDecimal.valueOf(result).setScale(1, RoundingMode.HALF_UP).doubleValue();
return resVal > 1 ? resVal : 1d;
} }
private double getMatchedDefaultChannelInf(String level){ private double getMatchedDefaultChannelInf(String level){
...@@ -781,6 +782,9 @@ public class ToolsetServiceImpl implements ToolsetService { ...@@ -781,6 +782,9 @@ public class ToolsetServiceImpl implements ToolsetService {
* @return * @return
*/ */
private Double computeRMI(List<BytedanceCustomEventUpdateTaskData> data){ private Double computeRMI(List<BytedanceCustomEventUpdateTaskData> data){
if (CollectionUtils.isEmpty(data)){
return 1d;
}
// 1、初始值 // 1、初始值
// 微信文章数 // 微信文章数
int wechatArticle = (int) data.stream().filter(article -> Objects.equals("微信", article.getPlatformType())).count(); int wechatArticle = (int) data.stream().filter(article -> Objects.equals("微信", article.getPlatformType())).count();
...@@ -875,7 +879,7 @@ public class ToolsetServiceImpl implements ToolsetService { ...@@ -875,7 +879,7 @@ public class ToolsetServiceImpl implements ToolsetService {
// 头条互动数:TI标= ln(TI+1)/ln(TI常+1)*100.0 // 头条互动数:TI标= ln(TI+1)/ln(TI常+1)*100.0
BigDecimal TI = BigDecimal.valueOf(Math.log(toutiaoInteraction + 1)).divide(BigDecimal.valueOf(Math.log(toutiaoInteractionWeight.getConstant() + 1)), 20, RoundingMode.HALF_UP).multiply(bigDecimal100); BigDecimal TI = BigDecimal.valueOf(Math.log(toutiaoInteraction + 1)).divide(BigDecimal.valueOf(Math.log(toutiaoInteractionWeight.getConstant() + 1)), 20, RoundingMode.HALF_UP).multiply(bigDecimal100);
// 标准值与权重计算取和得RMI // 标准值与权重计算取和得RMI
return NM.multiply(BigDecimal.valueOf(normalMediaArticleWeight.getWeight())) double resVal = NM.multiply(BigDecimal.valueOf(normalMediaArticleWeight.getWeight()))
.add(OM.multiply(BigDecimal.valueOf(otherPlatformArticleWeight.getWeight()))) .add(OM.multiply(BigDecimal.valueOf(otherPlatformArticleWeight.getWeight())))
.add(WC.multiply(BigDecimal.valueOf(wechatArticleWeight.getWeight()))) .add(WC.multiply(BigDecimal.valueOf(wechatArticleWeight.getWeight())))
.add(WCR.multiply(BigDecimal.valueOf(wechatReadWeight.getWeight()))) .add(WCR.multiply(BigDecimal.valueOf(wechatReadWeight.getWeight())))
...@@ -887,6 +891,7 @@ public class ToolsetServiceImpl implements ToolsetService { ...@@ -887,6 +891,7 @@ public class ToolsetServiceImpl implements ToolsetService {
.add(TI.multiply(BigDecimal.valueOf(toutiaoInteractionWeight.getWeight()))) .add(TI.multiply(BigDecimal.valueOf(toutiaoInteractionWeight.getWeight())))
.setScale(1, RoundingMode.HALF_UP) .setScale(1, RoundingMode.HALF_UP)
.doubleValue(); .doubleValue();
return resVal > 1 ? resVal : 1d;
} }
/** /**
......
...@@ -444,6 +444,7 @@ public class UserServiceImpl implements UserService { ...@@ -444,6 +444,7 @@ public class UserServiceImpl implements UserService {
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
jsonObject.put("projectId", projectId); jsonObject.put("projectId", projectId);
jsonObject.put("projectName", project.getProjectName()); jsonObject.put("projectName", project.getProjectName());
jsonObject.put("extraProjectName", project.getExtraProjectName());
jsonObject.put("id", user.getId()); jsonObject.put("id", user.getId());
jsonObject.put("nickname", user.getNickname()); jsonObject.put("nickname", user.getNickname());
jsonObject.put("username", user.getUsername()); jsonObject.put("username", user.getUsername());
...@@ -526,6 +527,7 @@ public class UserServiceImpl implements UserService { ...@@ -526,6 +527,7 @@ public class UserServiceImpl implements UserService {
return null; return null;
} }
json.put("projectName", project.getProjectName()); json.put("projectName", project.getProjectName());
json.put("extraProjectName", project.getExtraProjectName());
json.put("key", role.getKey()); json.put("key", role.getKey());
json.put("projectId", projectId); json.put("projectId", projectId);
json.put("roleId", role.getRoleId()); json.put("roleId", role.getRoleId());
......
...@@ -71,9 +71,10 @@ public class ControlCenter { ...@@ -71,9 +71,10 @@ public class ControlCenter {
@Async("scheduledExecutor") @Async("scheduledExecutor")
@Scheduled(cron = "0 0 * * * ? ") @Scheduled(cron = "0 0 * * * ? ")
public void cleanAggreeTask(){ public void cleanAggreeTask(){
log.info("每小时清理过期聚合任务-启动"); log.info("每小时清理过期任务-启动");
try { try {
taskService.cleanAggreeTask(); taskService.cleanAggreeTask();
taskService.cleanSearchAnalyzeTask();
} catch (Exception e) { } catch (Exception e) {
log.info("每小时清理过期聚合任务-出错", e); log.info("每小时清理过期聚合任务-出错", e);
} finally { } finally {
......
...@@ -80,7 +80,7 @@ public class Tools { ...@@ -80,7 +80,7 @@ public class Tools {
/** /**
* 须过滤的标题 * 须过滤的标题
*/ */
public static final List<String> FILTER_TITLE = Arrays.asList("Notitle", "分享一篇文章", "分享一篇文章。", "暂无标题"); public static final List<String> FILTER_TITLE = Arrays.asList("Notitle", "分享一篇文章", "分享一篇文章。", "暂无标题", "", "No title");
/** /**
* 须过滤的渠道 * 须过滤的渠道
......
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