Commit 2d47d1c1 by shenjunjie

Merge branch 'feature' into 'release'

无事件数据时异常修复

See merge request !65
parents 6eed68c5 09c99449
package com.zhiwei.brandkbs2.controller;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.service.ProjectService;
import com.zhiwei.brandkbs2.service.ProjectWarnService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @ClassName: InterfaceController
* @Description 外部接口
* @author: sjj
* @date: 2022-10-24 16:04
*/
@RestController
@RequestMapping("/interface")
@Api(tags = "外部接口")
public class InterfaceController {
@Resource(name = "projectServiceImpl")
private ProjectService projectService;
@Resource(name = "projectWarnServiceImpl")
private ProjectWarnService projectWarnService;
@ApiOperation("获取项目预警详细信息")
@GetMapping("/getProjectWarnCriteria")
public ResponseResult getProjectWarnCriteria(String projectId, String type) {
return projectWarnService.getProjectWarnCriteria(projectId, type);
}
@ApiOperation("根据userId获取拥有权限项目")
@GetMapping("/getUserAllProjectsByUserId")
public ResponseResult getUserAllProjectsByUserId(String userId) {
return ResponseResult.success(projectService.getUserAllProjectsPrimary(userId));
}
}
...@@ -79,6 +79,8 @@ public interface ProjectService { ...@@ -79,6 +79,8 @@ public interface ProjectService {
*/ */
List<JSONObject> getUserAllProjects(); List<JSONObject> getUserAllProjects();
List<JSONObject> getUserAllProjectsPrimary(String userId);
/** /**
* 获取当前用户拥有的所有项目(包括已过期) * 获取当前用户拥有的所有项目(包括已过期)
* *
......
package com.zhiwei.brandkbs2.service;
import com.zhiwei.brandkbs2.model.ResponseResult;
public interface ProjectWarnService {
/**
* 获取项目预警条件
* @param projectId 项目ID
* @param type 类型
* @return
*/
ResponseResult getProjectWarnCriteria(String projectId, String type);
}
...@@ -91,22 +91,27 @@ public class EventDataServiceImpl implements EventDataService { ...@@ -91,22 +91,27 @@ public class EventDataServiceImpl implements EventDataService {
} }
private void updateEventData(Event event, List<EventData> eventDataList) { private void updateEventData(Event event, List<EventData> eventDataList) {
// 根据配置筛选目标数据
eventDataList = filterEventData(event, eventDataList);
// 删除历史数据 // 删除历史数据
deleteEventRelated(event); deleteEventRelated(event);
// 数据入库
Lists.partition(eventDataList, 1000).forEach(list -> eventDataDao.insertMany(list, event.getCollectionName()));
// 设置快照属性值 // 设置快照属性值
setEventStaticState(event, eventDataList); setEventStaticState(event, eventDataList);
List<EventData> insertList = new ArrayList<>(); log.info("analysisEvent-eventId:{},更新事件数据完毕,实际更新:{}条", event.getId(), eventDataList.size());
}
private List<EventData> filterEventData(Event event, List<EventData> eventDataList) {
List<EventData> hitList = new ArrayList<>();
String keyword = event.getKeyword(); String keyword = event.getKeyword();
for (EventData data : eventDataList) { for (EventData data : eventDataList) {
// 关键词筛选 // 关键词筛选
if (Tools.isContains(Arrays.asList(keyword.split(keyword.contains(",") ? "," : "\\|")), (data.getTitle() + data.getContent()))) { if (Tools.isContains(Arrays.asList(keyword.split(keyword.contains(",") ? "," : "\\|")), (data.getTitle() + data.getContent()))) {
insertList.add(data); hitList.add(data);
} }
} }
Lists.partition(insertList, 1000).forEach(list -> { return hitList;
eventDataDao.insertMany(list, event.getCollectionName());
});
log.info("analysisEvent-eventId:{},更新事件数据完毕,实际更新:{}条", event.getId(), insertList.size());
} }
private void deleteEventRelated(Event event) { private void deleteEventRelated(Event event) {
...@@ -117,6 +122,9 @@ public class EventDataServiceImpl implements EventDataService { ...@@ -117,6 +122,9 @@ public class EventDataServiceImpl implements EventDataService {
} }
private void setEventStaticState(Event event, List<EventData> eventDataList) { private void setEventStaticState(Event event, List<EventData> eventDataList) {
if (eventDataList.isEmpty()) {
return;
}
long totalDisseminationVolume = eventDataList.size(); long totalDisseminationVolume = eventDataList.size();
Set<String> totalChannelVolumes = new HashSet<>(); Set<String> totalChannelVolumes = new HashSet<>();
Map<String, AtomicLong> platformIdCounts = new HashMap<>(); Map<String, AtomicLong> platformIdCounts = new HashMap<>();
......
...@@ -466,7 +466,7 @@ public class EventServiceImpl implements EventService { ...@@ -466,7 +466,7 @@ public class EventServiceImpl implements EventService {
eventDataService.analysisEvent(event); eventDataService.analysisEvent(event);
redisUtil.set(redisKey, "100"); redisUtil.set(redisKey, "100");
} catch (Exception e) { } catch (Exception e) {
log.error("事件id:{}更新失败", eventId, e); log.error("eventId:{}更新失败", eventId, e);
redisUtil.set(redisKey, "-1"); redisUtil.set(redisKey, "-1");
} }
})); }));
......
...@@ -72,7 +72,7 @@ public class ProjectServiceImpl implements ProjectService { ...@@ -72,7 +72,7 @@ public class ProjectServiceImpl implements ProjectService {
@Override @Override
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();
projectDao.addKeywordFuzz(query,keyword,"projectName"); projectDao.addKeywordFuzz(query, keyword, "projectName");
long count = projectDao.count(query); long count = projectDao.count(query);
mongoUtil.start(page, size, query); mongoUtil.start(page, size, query);
List<Project> projectList = projectDao.findList(query); List<Project> projectList = projectDao.findList(query);
...@@ -177,6 +177,25 @@ public class ProjectServiceImpl implements ProjectService { ...@@ -177,6 +177,25 @@ public class ProjectServiceImpl implements ProjectService {
} }
@Override @Override
public List<JSONObject> getUserAllProjectsPrimary(String userId) {
User user = userDao.findOneById(userId);
if (user.isSuperAdmin()) {
return projectDao.findList(null).stream().map(project -> {
JSONObject json = new JSONObject();
json.put("name", project.getProjectName());
json.put("id", project.getId());
return json;
}).collect(Collectors.toList());
}
return user.getRoles().stream().map(userRole -> {
JSONObject json = new JSONObject();
json.put("name", projectDao.findOne("_id", userRole.getProjectId()).getProjectName());
json.put("id", userRole.getProjectId());
return json;
}).collect(Collectors.toList());
}
@Override
public List<JSONObject> getLoginUserAllProjects() { public List<JSONObject> getLoginUserAllProjects() {
User user = userDao.findOneById(UserThreadLocal.getUserId()); User user = userDao.findOneById(UserThreadLocal.getUserId());
if (null == user) { if (null == user) {
......
package com.zhiwei.brandkbs2.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.service.ProjectService;
import com.zhiwei.brandkbs2.service.ProjectWarnService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* @ClassName: ProjectWarnServiceImpl
* @Description ProjectWarnServiceImpl
* @author: sjj
* @date: 2022-10-24 16:07
*/
@Service("projectWarnServiceImpl")
public class ProjectWarnServiceImpl implements ProjectWarnService {
private static final Long ONE_MINUTE = 60 * 1000L;
@Resource(name = "projectServiceImpl")
ProjectService projectService;
@Override
public ResponseResult getProjectWarnCriteria(String projectId, String type) {
Map<String, Object> res = new HashMap<>();
switch (type) {
case "舆情动态":
warnCriteriaAddSimple(res, "channelTypes", Arrays.asList("央级", "门户", "财经", "科技", "其他"));
warnCriteriaAdd(res, "primary", Arrays.asList("原创", "转发"), Arrays.asList(false, true), "说明:仅对微博平台数据生效");
warnCriteriaAddSimple(res, "markerTags", Arrays.asList("正面", "中性", "负面"));
List<JSONObject> brands = projectService.getBrands(projectId, false);
List<String> nameList = brands.stream().map(json -> json.getString("brandName")).collect(Collectors.toList());
List<String> idList = brands.stream().map(json -> json.getString("contendId")).collect(Collectors.toList());
warnCriteriaAdd(res, "contends", nameList, idList);
warnCriteriaAdd(res, "keyword", null);
warnCriteriaAdd(res, "duplicate", Arrays.asList("去重", "不去重"), Arrays.asList(true, false));
warnCriteriaAdd(res, "pushInterval", Arrays.asList("10", "30min", "60min"), Arrays.asList(10 * ONE_MINUTE, 30 * ONE_MINUTE, 60 * ONE_MINUTE));
break;
case "渠道参与":
warnCriteriaAdd(res, "friendlyChannel", Arrays.asList("友好渠道", "敏感渠道", "自定义渠道"), Arrays.asList(true, false, null));
List<Map<String, Object>> thresholdValue = new ArrayList<>();
for (String name : Arrays.asList("友好渠道 友好指数", "敏感渠道 敏感指数")) {
Map<String, Object> map = new HashMap<>();
map.put("name", name);
map.put("defaultValue", 80);
thresholdValue.add(map);
}
res.put("threshold", thresholdValue);
warnCriteriaAdd(res, "channel", null);
warnCriteriaAdd(res, "primary", Arrays.asList("原创", "转发"), Arrays.asList(false, true), "说明:仅对微博平台数据生效");
warnCriteriaAddSimple(res, "markerTags", Arrays.asList("正面", "中性", "负面"));
warnCriteriaAdd(res, "duplicate", Arrays.asList("去重", "不去重"), Arrays.asList(true, false));
warnCriteriaAdd(res, "pushInterval", Arrays.asList("实时", "30min", "60min", "180min"), Arrays.asList(null, 30 * ONE_MINUTE, 60 * ONE_MINUTE, 180 * ONE_MINUTE));
break;
case "热点事件":
warnCriteriaAddSimple(res, "wonEvent", Arrays.asList("正面", "中性", "负面"));
List<JSONObject> brands2 = projectService.getBrands(projectId, false);
List<String> nameList2 = brands2.stream().map(json -> json.getString("brandName")).collect(Collectors.toList());
List<String> idList2 = brands2.stream().map(json -> json.getString("contendId")).collect(Collectors.toList());
warnCriteriaAdd(res, "contendsEvent", nameList2, idList2);
warnCriteriaAddSimple(res, "zhiWeiEvent", Arrays.asList("社会", "互联网", "政务", "财经", "企业", "娱乐", "灾难", "违法犯罪", "国际", "体育", "谣言"), "说明:知微事见支持选择事件的领域");
warnCriteriaAdd(res, "eventTop", Arrays.asList("TOP5", "TOP10"), Arrays.asList(5, 10), "说明:按影响力选取;若事件数不足,以实际为准");
warnCriteriaAdd(res, "timeCycles", Arrays.asList("周一", "周二", "周三", "周四", "周五", "周六", "周日"), Arrays.asList(1, 2, 3, 4, 5, 6, 7), "说明:系统推送时间为08:00");
break;
case "上榜热搜":
warnCriteriaAddSimple(res, "warnKeyword", null);
warnCriteriaAddSimple(res, "filterKeyword", null);
warnCriteriaAddSimple(res, "listType", Arrays.asList("微博热搜", "微博话题", "微博预热", "头条热搜", "抖音热搜", "知乎热搜", "B站热搜", "快手热榜"));
List<Map<String, Object>> topList = new ArrayList<>();
for (int i : Arrays.asList(3, 5, 10, 20, 50)) {
Map<String, Object> map = new HashMap<>();
map.put("name", "前" + i);
map.put("id", i);
topList.add(map);
}
warnCriteriaAddSimple(res, "warnType", Arrays.asList("首次上榜", "排名新高", "掉榜和再次上榜", "导语(仅支持微博平台)"));
res.put("topList", topList);
warnCriteriaAdd(res, "pushInterval", Collections.singletonList("5min"), Collections.singletonList(5 * ONE_MINUTE));
break;
case "案例上新":
return ResponseResult.success();
default:
return ResponseResult.failure("类型错误");
}
return ResponseResult.success(res);
}
private <T> void warnCriteriaAdd(Map<String, Object> res, String key, List<String> listValueName, List<T> listValueId) {
warnCriteriaAdd(res, key, listValueName, listValueId, null);
}
private <T> void warnCriteriaAdd(Map<String, Object> res, String key, List<String> listValueName, List<T> listValueId, String annotation) {
if (listValueName.size() != listValueId.size()) {
throw new IllegalArgumentException("listValueName-size与listValueId-size不符!");
}
List<Map<String, Object>> value = new ArrayList<>();
for (int i = 0; i < listValueName.size(); i++) {
Map<String, Object> map = new HashMap<>();
String name = listValueName.get(i);
if (name.contains("key:")) {
map.put(name.substring(4), listValueId.get(i));
} else {
map.put("name", name);
map.put("id", listValueId.get(i));
}
value.add(map);
}
warnCriteriaAdd(res, key, value, null);
}
private void warnCriteriaAddSimple(Map<String, Object> res, String key, List<String> listValue) {
warnCriteriaAddSimple(res, key, listValue, null);
}
private void warnCriteriaAddSimple(Map<String, Object> res, String key, List<String> listValue, String annotation) {
List<Map<String, Object>> value = null;
if (null != listValue) {
value = new ArrayList<>();
for (String str : listValue) {
Map<String, Object> map = new HashMap<>();
map.put("name", str);
map.put("id", str);
value.add(map);
}
}
warnCriteriaAdd(res, key, value, annotation);
}
private void warnCriteriaAdd(Map<String, Object> res, String key, List<Map<String, Object>> value) {
warnCriteriaAdd(res, key, value, null);
}
private void warnCriteriaAdd(Map<String, Object> res, String key, List<Map<String, Object>> value, String annotation) {
// Map<String, Object> element = new HashMap<>();
// element.put(key, value);
// if (null != annotation) {
// element.put("annotation", annotation);
// }
res.put(key, value);
}
}
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