Commit 8408fc8b by shenjunjie

Merge branch 'feature' into 'dev'

Feature

See merge request !72
parents 563923c7 61c2e442
......@@ -16,11 +16,13 @@ public class Constant {
public static final Long ONE_DAY = 24 * 60 * 60 * 1000L;
public static final Long ONE_MONTH = 30 * 24 * 60 * 60 * 1000L;
public static final String SPEC_MINUTE_PATTERN = "yyyy.MM.dd HH:mm";
public static final String HOUR_PATTERN = "yyyy-MM-dd HH";
public static final String DAY_PATTERN = "yyyy-MM-dd";
public static final String MONTH_PATTERN = "yyyy-MM";
public static final String YEAR_PATTERN = "yyyy";
public static final FastDateFormat SPEC_MINUTE_FORMAT = FastDateFormat.getInstance(SPEC_MINUTE_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 SPEC_DAY_FORMAT = FastDateFormat.getInstance("yyyy/MM/dd");
......
package com.zhiwei.brandkbs2.controller;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.external.BrandkbsChannelConfig;
import com.zhiwei.brandkbs2.pojo.external.BrandkbsHotEventConfig;
import com.zhiwei.brandkbs2.pojo.external.BrandkbsHotTopConfig;
import com.zhiwei.brandkbs2.pojo.external.BrandkbsYuQingConfig;
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 org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
......@@ -34,10 +37,55 @@ public class InterfaceController {
return projectWarnService.getProjectWarnCriteria(projectId, type);
}
@ApiOperation("获取项目预警详细信息默认值")
@GetMapping("/getProjectWarnCriteria/default")
public ResponseResult getProjectWarnCriteriaDefault(String projectId, String type) {
return projectWarnService.getProjectWarnCriteriaDefault(projectId, type);
}
@ApiOperation("根据userId获取拥有权限项目")
@GetMapping("/getUserAllProjectsByUserId")
public ResponseResult getUserAllProjectsByUserId(String userId) {
return ResponseResult.success(projectService.getUserAllProjectsPrimary(userId));
}
@ApiOperation("获取舆情动态-预警结果")
@PostMapping("/warn/yuqing")
public ResponseResult getYuqingWaring(@RequestBody JSONObject json) {
String projectId = json.getString("projectId");
BrandkbsYuQingConfig config = json.getObject("config", BrandkbsYuQingConfig.class);
return projectWarnService.getYuqingWaring(projectId, config);
}
@ApiOperation("获取渠道参与-预警结果")
@PostMapping("/warn/channel")
public ResponseResult getChannelWaring(@RequestBody JSONObject json) {
String projectId = json.getString("projectId");
BrandkbsChannelConfig config = json.getObject("config", BrandkbsChannelConfig.class);
return projectWarnService.getChannelWaring(projectId, config);
}
@ApiOperation("获取热点事件-预警结果")
@PostMapping("/warn/hotEvent")
public ResponseResult getHotEventWaring(@RequestBody JSONObject json) {
String projectId = json.getString("projectId");
BrandkbsHotEventConfig config = json.getObject("config", BrandkbsHotEventConfig.class);
return projectWarnService.getHotEventWaring(projectId, config);
}
@ApiOperation("获取热点事件-预警结果")
@PostMapping("/warn/hotTop")
public ResponseResult getHotTopWaring(@RequestBody JSONObject json) {
String projectId = json.getString("projectId");
BrandkbsHotTopConfig config = json.getObject("config", BrandkbsHotTopConfig.class);
return projectWarnService.getHotTopWaring(projectId, config);
}
@ApiOperation("获取热点事件-预警结果")
@PostMapping("/warn/newCase")
public ResponseResult getNewCaseWaring(@RequestBody JSONObject json) {
String projectId = json.getString("projectId");
return projectWarnService.getNewCaseWaring(projectId);
}
}
package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.service.ProjectService;
import com.zhiwei.brandkbs2.service.ProjectWarnService;
import com.zhiwei.brandkbs2.service.UserService;
import com.zhiwei.middleware.auth.util.JwtUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.net.URLEncoder;
import java.util.Map;
/**
* @ClassName: WarnController
* @Description 情报预警
* @author: cjz
* @date: 2022-10-28 10:27
*/
@RestController
@Api(tags = "情报预警接口", description = "情报预警")
@RequestMapping("/app/warn")
public class AppWarnController extends BaseController {
private static final Logger log = LogManager.getLogger(AppWarnController.class);
private static final String taskType = "brandkbs";
@Value("${jwt.key}")
private String jwtKey;
@Autowired
private RestTemplate restTemplate;
@Resource(name = "projectWarnServiceImpl")
private ProjectWarnService projectWarnService;
@Resource(name = "projectServiceImpl")
private ProjectService projectService;
@Resource(name = "userServiceImpl")
private UserService userService;
@Value("${warn.pushTask.token}")
private String token;
@Value("${warn.project.url}")
private String warnProjectUrl;
@Value("${warn.ticket.url}")
private String warnTicketUrl;
@Value("${warn.pushRecipientsList.url}")
private String warnPushRecipientsUrl;
@Value("${warn.deletePushRecipients.url}")
private String deletePushRecipientsUrl;
@Value("${warn.channel.url}")
private String warnChannelUrl;
@Value("${warn.hotEvent.url}")
private String warnHotEventUrl;
@Value("${warn.hotTop.url}")
private String warnHotTopUrl;
@Value("${warn.yuQing.url}")
private String warnYuQingUrl;
@Value("${warn.taskSwitch.url}")
private String warnTaskSwitchUrl;
@ApiOperation("情报预警-推送任务获取/新增")
@GetMapping("/project")
public ResponseResult getPushTaskId() {
try {
String projectId = UserThreadLocal.getProjectId();
String projectName = projectService.getProjectById(projectId).getProjectName();
String userId = JwtUtil.unsign(request.getHeader(jwtKey), Map.class).get(GenericAttribute.USER_ID).toString();
// header不支持中文 故对userName进行encode操作
String userName = URLEncoder.encode(userService.queryUserInfo(userId, projectId).getNickname(), "UTF-8");
// 请求头参数设置
HttpHeaders headers = new HttpHeaders();
headers.add("token", token);
headers.add("userId", userId);
headers.add("userName", userName);
HttpEntity<Object> request = new HttpEntity<>(headers);
JSONObject data = restTemplate.exchange(warnProjectUrl, HttpMethod.GET, request, JSONObject.class, projectId, projectName).getBody().getJSONObject("data");
return ResponseResult.success(data);
}catch (Exception e){
log.error("情报预警-推送任务获取/新增失败", e);
return ResponseResult.failure("情报预警-推送任务获取/新增失败");
}
}
@ApiOperation("情报预警-获取项目预警更新条件")
@GetMapping("/warnCriteria")
public ResponseResult getProjectWarnCriteria(@RequestParam(value = "type") String type){
return ResponseResult.success(projectWarnService.getProjectWarnCriteria(UserThreadLocal.getProjectId(), type));
}
@ApiOperation("情报预警-二维码ticket获取")
@GetMapping("/getTicket")
public ResponseResult getTicket(@RequestParam(value = "pushTaskId") String pushTaskId) {
// 请求头
HttpHeaders headers = new HttpHeaders();
headers.add("token", token);
HttpEntity<Object> request = new HttpEntity<>(headers);
JSONObject data = restTemplate.exchange(warnTicketUrl, HttpMethod.GET, request, JSONObject.class, pushTaskId, taskType).getBody().getJSONObject("data");
return ResponseResult.success(data);
}
@ApiOperation("情报预警-已扫码推送名单获取")
@GetMapping("/pushRecipientsList")
public ResponseResult pushRecipientList(@RequestParam(value = "pushTaskId") String pushTaskId){
// 请求头
HttpHeaders headers = new HttpHeaders();
headers.add("token", token);
HttpEntity<Object> request = new HttpEntity<>(headers);
JSONArray data = restTemplate.exchange(warnPushRecipientsUrl, HttpMethod.GET, request, JSONObject.class, pushTaskId, taskType).getBody().getJSONArray("data");
return ResponseResult.success(data);
}
@ApiOperation("情报预警-删除推送人")
@GetMapping("/deletePushRecipients")
public ResponseResult deletePushRecipients(@RequestParam(value = "recipientsId") String recipientsId,
@RequestParam(value = "pushTaskId") String pushTaskId){
// 请求头
HttpHeaders headers = new HttpHeaders();
headers.add("token", token);
HttpEntity<Object> request = new HttpEntity<>(headers);
JSONObject data = restTemplate.exchange(deletePushRecipientsUrl, HttpMethod.GET, request, JSONObject.class, pushTaskId, recipientsId, taskType).getBody().getJSONObject("data");
return ResponseResult.success(data);
}
@ApiOperation("情报预警-渠道参与配置")
@PutMapping("/channel/{pushTaskId}")
public ResponseResult channel(@ApiParam(name = "channelConfig", value = "情报预警-渠道参与配置-json:{\"channel\": \"string\", \"configName\": \"string\", \"duplicate\": true, \"friendlyChannel\": true, \"markerTags\": [\"string\"], \"primary\": [true], \"pushInterval\": 0, \"threshold\": 0, \"used\": true}", required = true)
@RequestBody JSONObject channelConfig,
@PathVariable(value = "pushTaskId") String pushTaskId){
try {
String userId = JwtUtil.unsign(request.getHeader(jwtKey), Map.class).get(GenericAttribute.USER_ID).toString();
String userName = URLEncoder.encode(userService.queryUserInfo(userId, UserThreadLocal.getProjectId()).getNickname(), "UTF-8");
// 请求头参数设置
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("token", token);
headers.add("userId", userId);
headers.add("userName", userName);
HttpEntity<String> request = new HttpEntity<>(channelConfig.toJSONString(), headers);
JSONObject data = restTemplate.exchange(warnChannelUrl, HttpMethod.PUT, request, JSONObject.class, pushTaskId).getBody().getJSONObject("data");
return ResponseResult.success(data);
}catch (Exception e){
log.error("情报预警-渠道参与配置失败", e);
return ResponseResult.failure("情报预警-渠道参与配置失败");
}
}
@ApiOperation("情报预警-热点榜单配置")
@PutMapping("/hotTop/{pushTaskId}")
public ResponseResult hotTop(@ApiParam(name = "hotTopConfig", value = "情报预警-热点榜单配置-json:{\"configName\": \"string\", \"filterKeyword\": \"string\", \"firstTop\": true, \"introduction\": true,\"listType\": [\"string\"], \"newHeight\": true, \"pushInterval\": 0, \"topNewHeight\": 0, \"topOnceAgain\": true, \"used\": true, \"warnKeyword\": \"string\"}", required = true)
@RequestBody JSONObject hotTopConfig,
@PathVariable(value = "pushTaskId") String pushTaskId){
try {
String userId = JwtUtil.unsign(request.getHeader(jwtKey), Map.class).get(GenericAttribute.USER_ID).toString();
String userName = URLEncoder.encode(userService.queryUserInfo(userId, UserThreadLocal.getProjectId()).getNickname(), "UTF-8");
// 请求头参数设置
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("token", token);
headers.add("userId", userId);
headers.add("userName", userName);
HttpEntity<String> request = new HttpEntity<>(hotTopConfig.toJSONString(), headers);
JSONObject data = restTemplate.exchange(warnHotTopUrl, HttpMethod.PUT, request, JSONObject.class, pushTaskId).getBody().getJSONObject("data");
return ResponseResult.success(data);
}catch (Exception e){
log.error("情报预警-热点榜单配置失败", e);
return ResponseResult.failure("情报预警-热点榜单配置失败");
}
}
@ApiOperation("情报预警-热点事件配置")
@PutMapping("/hotEvent/{pushTaskId}")
public ResponseResult hotEvent(@ApiParam(name = "hotEventConfig", value = "情报预警-热点事件配置-json:{\"configName\": \"string\", \"contendsEvent\": [\"string\"], \"eventTop\": 0, \"ownEvent\": [\"string\"], \"timeCycles\": 0,\"used\": true, \"zhiWeiEvent\": [\"string\"]}", required = true)
@RequestBody JSONObject hotEventConfig,
@PathVariable(value = "pushTaskId") String pushTaskId){
try {
String userId = JwtUtil.unsign(request.getHeader(jwtKey), Map.class).get(GenericAttribute.USER_ID).toString();
String userName = URLEncoder.encode(userService.queryUserInfo(userId, UserThreadLocal.getProjectId()).getNickname(), "UTF-8");
// 请求头参数设置
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("token", token);
headers.add("userId", userId);
headers.add("userName", userName);
HttpEntity<String> request = new HttpEntity<>(hotEventConfig.toJSONString(), headers);
JSONObject data = restTemplate.exchange(warnHotEventUrl, HttpMethod.PUT, request, JSONObject.class, pushTaskId).getBody().getJSONObject("data");
return ResponseResult.success(data);
}catch (Exception e){
log.error("情报预警-热点事件配置失败- ", e);
return ResponseResult.failure("情报预警-热点事件配置失败");
}
}
@ApiOperation("情报预警-舆情动态配置")
@PutMapping("/yuQing/{pushTaskId}")
public ResponseResult yuQing(@ApiParam(name = "yuQingConfig", value = "情报预警-舆情动态配置-json:{\"channelTypes\": [\"string\"], \"configName\": \"string\", \"contends\": [\"string\"], \"duplicate\": true, \"keyword\": \"string\", \"markerTags\": [\"string\"], \"primary\": [true], \"pushInterval\": 0, \"used\": true}", required = true)
@RequestBody JSONObject yuQingConfig,
@PathVariable(value = "pushTaskId") String pushTaskId){
try {
String userId = JwtUtil.unsign(request.getHeader(jwtKey), Map.class).get(GenericAttribute.USER_ID).toString();
String userName = URLEncoder.encode(userService.queryUserInfo(userId, UserThreadLocal.getProjectId()).getNickname(), "UTF-8");
// 请求头参数设置
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("token", token);
headers.add("userId", userId);
headers.add("userName", userName);
HttpEntity<String> request = new HttpEntity<>(yuQingConfig.toJSONString(), headers);
JSONObject data = restTemplate.exchange(warnYuQingUrl, HttpMethod.PUT, request, JSONObject.class, pushTaskId).getBody().getJSONObject("data");
return ResponseResult.success(data);
}catch (Exception e){
log.error("情报预警-舆情动态配置失败", e);
return ResponseResult.failure("情报预警-舆情动态配置失败");
}
}
@ApiOperation("情报预警-任务开关")
@PutMapping("/taskSwitch")
public ResponseResult taskSwitch(@ApiParam(name = "info", value = "推送任务-开关-json:{id:, used:true|false, configType:HOT_EVENT}", required = true)
@RequestBody JSONObject info){
try {
String userId = JwtUtil.unsign(request.getHeader(jwtKey), Map.class).get(GenericAttribute.USER_ID).toString();
String userName = URLEncoder.encode(userService.queryUserInfo(userId, UserThreadLocal.getProjectId()).getNickname(), "UTF-8");
// 请求头参数设置
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("token", token);
headers.add("userId", userId);
headers.add("userName", userName);
HttpEntity<String> request = new HttpEntity<>(info.toJSONString(), headers);
JSONObject data = restTemplate.exchange(warnTaskSwitchUrl, HttpMethod.PUT, request, JSONObject.class).getBody().getJSONObject("data");
return ResponseResult.success(data);
}catch (Exception e){
log.error("情报预警-任务开关失败", e);
return ResponseResult.failure("情报预警-任务开关失败");
}
}
}
......@@ -94,6 +94,18 @@ public interface EventDao extends BaseMongoDao<Event> {
*/
List<Event> getEventsByProjectIdAndContendId(Long startTime, Long endTime, String emotion, String projectId, String contendId, int limit);
/**
* 根据特征值获取事件
*
* @param startTime
* @param endTime
* @param emotions
* @param projectId
* @param contendId
* @return
*/
List<Event> getEventsByProjectIdAndContendId(Long startTime, Long endTime, List<String> emotions, String projectId, String contendId, int limit);
List<Event> getEventsByTotalChannelVolumeTop(Long startTime, Long endTime, String emotion, String projectId, String contendId, int limit);
......
......@@ -7,6 +7,7 @@ import com.zhiwei.brandkbs2.enmus.EmotionEnum;
import com.zhiwei.brandkbs2.pojo.ChannelIndex;
import com.zhiwei.brandkbs2.pojo.Event;
import com.zhiwei.brandkbs2.util.Tools;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
......@@ -106,6 +107,17 @@ public class EventDaoImpl extends BaseMongoDaoImpl<Event> implements EventDao {
}
@Override
public List<Event> getEventsByProjectIdAndContendId(Long startTime, Long endTime, List<String> emotions, String projectId, String contendId, int limit) {
Query query = new Query();
Criteria criteria = eventCountCriteria(startTime, endTime, emotions, projectId, contendId);
query.addCriteria(criteria);
query.limit(limit);
// 按影响力排序
addSort(query, "{\"influence\":\"descend\"}");
return mongoTemplate.find(query, clazz, COLLECTION_NAME);
}
@Override
public List<Event> getEventsByTotalChannelVolumeTop(Long startTime, Long endTime, String emotion, String projectId, String contendId, int limit) {
Query query = new Query();
Criteria criteria = eventCountCriteria(startTime, endTime, emotion, projectId, contendId);
......@@ -132,6 +144,28 @@ public class EventDaoImpl extends BaseMongoDaoImpl<Event> implements EventDao {
return criteria;
}
private Criteria eventCountCriteria(Long startTime, Long endTime, List<String> emotions, String projectId, String contendId) {
Criteria criteria = Criteria.where("projectId").is(projectId);
criteria.and("contendId").is(contendId);
Criteria startTimeCriteria = criteria.and("startTime");
if (null != startTime) {
startTimeCriteria.gte(startTime);
}
if (null != endTime) {
startTimeCriteria.lt(endTime);
}
List<Criteria> criteriaList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(emotions) && !emotions.contains(EmotionEnum.ALL.getName())) {
for (String emotion : emotions) {
criteriaList.add(Criteria.where("emotion").is(emotion));
}
}
if (!criteriaList.isEmpty()) {
criteria.orOperator(criteriaList.toArray(new Criteria[0]));
}
return criteria;
}
/**
* mongo版本不支持toString/toObjectId 表达式
* 已被getEventCount 代替
......
......@@ -110,6 +110,21 @@ public class EsQueryTools {
return nestedBoolQueryBuilder;
}
public static BoolQueryBuilder assembleCacheMapsQueryWithProject(String projectId, List<String> mediaTypes) {
BoolQueryBuilder nestedBoolQueryBuilder = QueryBuilders.boolQuery();
// must key
nestedBoolQueryBuilder.must(cacheMapsNestedQuery(QueryBuilders.termQuery("brandkbs_cache_maps.project_id.keyword", projectId)));
// mediaType
if (CollectionUtils.isNotEmpty(mediaTypes)) {
BoolQueryBuilder mediaTypeQueryBuilder = QueryBuilders.boolQuery();
mediaTypes.forEach(e -> {
mediaTypeQueryBuilder.should(cacheMapsNestedQuery(QueryBuilders.termQuery("brandkbs_cache_maps.channel_type.keyword", e)));
});
nestedBoolQueryBuilder.must(mediaTypeQueryBuilder);
}
return nestedBoolQueryBuilder;
}
public static BoolQueryBuilder assembleCacheMapsQueryExcludePrimaryId(String projectId){
BoolQueryBuilder query = QueryBuilders.boolQuery();
query.must(cacheMapsNestedQuery(QueryBuilders.termQuery("brandkbs_cache_maps.project_id.keyword", projectId)));
......@@ -176,7 +191,7 @@ public class EsQueryTools {
BoolQueryBuilder contendQuery = QueryBuilders.boolQuery();
// 主品牌一定参与
// contendQuery.should(QueryBuilders.termQuery("contend_id.keyword", "0"));
if (null == contends) {
if (CollectionUtils.isEmpty(contends)) {
return;
}
for (String contendId : contends) {
......@@ -210,6 +225,20 @@ public class EsQueryTools {
}
/**
* 针对微博平台转发 查询语句
*
* @param isForward
* @return
*/
public static BoolQueryBuilder assembleForwardQuery(boolean isForward) {
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
BoolQueryBuilder notWeiboCondition = QueryBuilders.boolQuery();
queryBuilder.should(notWeiboCondition.mustNot(QueryBuilders.termQuery("platform_id", "5d02236e6395002a7c380b79")));
queryBuilder.should(QueryBuilders.termQuery("is_forward", isForward));
return queryBuilder;
}
/**
* 字段不拆封,多字段 同关键词
*
* @param @param boolQueryBuilder
......
......@@ -70,6 +70,10 @@ public class BaseMap {
private JSONObject sourceJson;
private String brandName;
private Double channelEmotionIndex;
/**
* 当标题为空时用文本截取前20个字代替
*
......
package com.zhiwei.brandkbs2.pojo.external;
import com.zhiwei.base.category.ClassB;
import com.zhiwei.brandkbs2.common.GlobalPojo;
import com.zhiwei.brandkbs2.pojo.BaseMap;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: BaseMapCompound
* @Description BaseMapCompound
* @author: sjj
* @date: 2022-11-02 16:21
*/
@Data
@AllArgsConstructor
public class BaseMapCompound {
/**
* 基础字段
*/
private BaseMap baseMap;
/**
* 标签列表
*/
private List<String> tags;
public static BaseMapCompound createFromBaseMap(BaseMap baseMap, String projectId) {
List<String> tagList = new ArrayList<>();
// 情感倾向
tagList.add(baseMap.getEmotion());
// 媒体类型
String mediaType = GlobalPojo.getMediaType(projectId, baseMap.getPlatform(), baseMap.getSource());
if (null != mediaType) {
tagList.add(mediaType);
}
// 仅针对微博平台的 原创/转发 标签
if (ClassB.TypeB.INCOMPLETE.equals(baseMap.getTypeB())) {
tagList.add(baseMap.isForward() ? "转发" : "原创");
}
// 竞品品牌标签
if (null != baseMap.getBrandName()) {
tagList.add(baseMap.getBrandName());
}
return new BaseMapCompound(baseMap, tagList);
}
}
\ No newline at end of file
package com.zhiwei.brandkbs2.pojo.external;
import lombok.Data;
import java.util.List;
@Data
public class BrandkbsChannelConfig {
private String configName;
/**
* 友好渠道
*/
private Boolean friendlyChannel;
/**
* 阈值
*/
private int threshold;
/**
* 自定义渠道
*/
private String channel;
/**
* 是否转发
*/
private List<Boolean> primary;
/**
* 舆情标签
*/
private List<String> markerTags;
/**
* 是否去重
*/
private Boolean duplicate;
/**
* pushInterval 推送间隔
*/
private Long pushInterval;
private boolean used;
public BrandkbsChannelConfig() {
this.used = false;
this.pushInterval = 10 * 60 * 1000L;
}
}
package com.zhiwei.brandkbs2.pojo.external;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
* @ClassName: BrandkbsChannelWarn
* @Description BrandkbsChannelWarn
* @author: sjj
* @date: 2022-11-02 16:45
*/
@Data
@AllArgsConstructor
public class BrandkbsChannelWarn {
/**
* 基础数据
*/
private List<BaseMapCompound> list;
/**
* 预警理由
*/
private String channelWarnReason;
}
package com.zhiwei.brandkbs2.pojo.external;
import lombok.Data;
import java.util.List;
@Data
public class BrandkbsHotEventConfig {
private String configName;
/**
* 本品事件
*/
private List<String> ownEvent;
/**
* 竞品事件
*/
private List<String> contendsEvent;
/**
* zhiwei事件
*/
private List<String> zhiWeiEvent;
/**
* 事件top
*/
private int eventTop;
/**
* 时间周期
*/
private int timeCycles;
private boolean used;
public BrandkbsHotEventConfig() {
this.used = false;
this.timeCycles = 2;
}
}
package com.zhiwei.brandkbs2.pojo.external;
import com.zhiwei.brandkbs2.pojo.Event;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName: BrandkbsHotEventWarn
* @Description BrandkbsHotEventWarn
* @author: sjj
* @date: 2022-11-02 16:49
*/
@Data
@AllArgsConstructor
public class BrandkbsHotEventWarn {
private List<HotEvent> hotEventList;
@Data
public static class HotEvent {
/**
* 类别名称
*/
private String type;
/**
* 事件标题
*/
private String title;
/**
* 事件情感倾向
*/
private String emotion;
/**
* 总传播量
*/
private Long totalDisseminationVolume;
/**
* 参与渠道数
*/
private Long totalChannelVolume;
/**
* 开始时间
*/
private Long startTime;
/**
* 影响力
*/
private double influence;
/**
* 标签列表
*/
private List<String> tagList;
public static HotEvent createFromEvent(String type, Event event) {
HotEvent hotEvent = new HotEvent();
hotEvent.setType(type);
hotEvent.setTitle(event.getTitle());
hotEvent.setEmotion(event.getEmotion());
hotEvent.setTotalChannelVolume(event.getTotalChannelVolume());
hotEvent.setTotalDisseminationVolume(event.getTotalDisseminationVolume());
hotEvent.setStartTime(event.getStartTime());
hotEvent.setInfluence(event.getInfluence());
List<String> tagList =
event.getEventTag().entrySet().stream().filter(entry -> !"情感倾向".equals(entry.getKey())).map(entry -> String.valueOf(entry.getValue())).collect(Collectors.toList());
hotEvent.setTagList(tagList);
return hotEvent;
}
}
}
package com.zhiwei.brandkbs2.pojo.external;
import lombok.Data;
import java.util.List;
@Data
public class BrandkbsHotTopConfig {
private String configName;
/**
* 预警关键字
*/
private String warnKeyword;
/**
* 过滤词
*/
private String filterKeyword;
/**
* 榜单类型
*/
private List<String> listType;
/**
* 预警类型 首次上榜
*/
private Boolean firstTop;
/**
*
*/
private Boolean newHeight;
/**
* 新高
*/
private int topNewHeight;
/**
* 再一次上榜
*/
private Boolean topOnceAgain;
private Boolean introduction;
/**
* pushInterval 推送间隔
*/
private Long pushInterval;
private boolean used;
public BrandkbsHotTopConfig() {
this.used = false;
this.pushInterval = 5 * 60 * 1000L;
}
}
package com.zhiwei.brandkbs2.pojo.external;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
* @ClassName: BrandkbsHotTopWarn
* @Description BrandkbsHotTopWarn
* @author: sjj
* @date: 2022-11-03 17:00
*/
@Data
@AllArgsConstructor
public class BrandkbsHotTopWarn {
private String warnKeyword;
private String filterKeyword;
private List<HotTop> list;
@Data
public static class HotTop {
/**
* 热搜标题
*/
private String title;
/**
* 上榜理由
*/
private String topReason;
/**
* 上榜排名
*/
private String rank;
/**
* 热度
*/
private String hot;
/**
* 榜单名称
*/
private String topName;
/**
* 上榜时间
*/
private Long time;
}
}
package com.zhiwei.brandkbs2.pojo.external;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
* @ClassName: BrandkbsNewCaseWarn
* @Description BrandkbsNewCaseWarn
* @author: sjj
* @date: 2022-11-03 17:11
*/
@Data
@AllArgsConstructor
public class BrandkbsNewCaseWarn {
private List<NewCase> list;
@Data
public static class NewCase {
/**
* 标题
*/
private String title;
/**
* 标签列表
*/
private List<String> tagList;
/**
* 正文本
*/
private String content;
/**
* 公关传播效果指数
*/
private Double spreadIndex;
/**
* 案例类别
*/
private String caseType;
}
}
package com.zhiwei.brandkbs2.pojo.external;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* @ClassName: BrandkbsWarnTemplate
* @Description BrandkbsWarnTemplate
* @author: sjj
* @date: 2022-11-03 13:48
*/
@Data
@AllArgsConstructor
public class BrandkbsWarnTemplate {
private String id;
private String detailsUrl;
private int firstCount;
private String keyword1;
private String keyword2;
private String keyword3;
private String keyword4;
private BrandkbsYuQingWarn warn1;
private BrandkbsChannelWarn warn2;
private BrandkbsHotEventWarn warn3;
private BrandkbsHotTopWarn warn4;
private BrandkbsNewCaseWarn warn5;
private String warnType;
private Long pushTime;
public BrandkbsWarnTemplate(int firstCount, String keyword1, String keyword2, String keyword3, String keyword4, BrandkbsYuQingWarn warn1) {
this.firstCount = firstCount;
this.keyword1 = keyword1;
this.keyword2 = keyword2;
this.keyword3 = keyword3;
this.keyword4 = keyword4;
this.warn1 = warn1;
}
public BrandkbsWarnTemplate(int firstCount, String keyword1, String keyword2, String keyword3, String keyword4, BrandkbsChannelWarn warn2) {
this.firstCount = firstCount;
this.keyword1 = keyword1;
this.keyword2 = keyword2;
this.keyword3 = keyword3;
this.keyword4 = keyword4;
this.warn2 = warn2;
}
public BrandkbsWarnTemplate(int firstCount, String keyword1, String keyword2, String keyword3, String keyword4, BrandkbsHotEventWarn warn3) {
this.firstCount = firstCount;
this.keyword1 = keyword1;
this.keyword2 = keyword2;
this.keyword3 = keyword3;
this.keyword4 = keyword4;
this.warn3 = warn3;
}
public BrandkbsWarnTemplate(int firstCount, String keyword1, String keyword2, String keyword3, String keyword4, BrandkbsHotTopWarn warn4) {
this.firstCount = firstCount;
this.keyword1 = keyword1;
this.keyword2 = keyword2;
this.keyword3 = keyword3;
this.keyword4 = keyword4;
this.warn4 = warn4;
}
public BrandkbsWarnTemplate(int firstCount, String keyword1, String keyword2, String keyword3, String keyword4, BrandkbsNewCaseWarn warn5) {
this.firstCount = firstCount;
this.keyword1 = keyword1;
this.keyword2 = keyword2;
this.keyword3 = keyword3;
this.keyword4 = keyword4;
this.warn5 = warn5;
}
}
package com.zhiwei.brandkbs2.pojo.external;
import lombok.Data;
import java.util.List;
@Data
public class BrandkbsYuQingConfig {
private String configName;
/**
* 发声渠道
*/
private List<String> channelTypes;
/**
* 文章类型
*/
private List<Boolean> primary;
/**
* 本品舆情
*/
private List<String> markerTags;
/**
* 竞品舆情
*/
private List<String> contends;
/**
* 是否去重
*/
private Boolean duplicate;
/**
* 关键字命中
*/
private String keyword;
/**
* pushInterval 推送间隔
*/
private Long pushInterval;
private boolean used;
public BrandkbsYuQingConfig() {
this.used = false;
this.pushInterval = 60 * 60 * 1000L;
}
}
package com.zhiwei.brandkbs2.pojo.external;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
* @ClassName: BrandkbsYuQingWarn
* @Description BrandkbsYuQingWarn
* @author: sjj
* @date: 2022-11-02 16:10
*/
@Data
@AllArgsConstructor
public class BrandkbsYuQingWarn {
/**
* 基础数据
*/
private List<BaseMapCompound> list;
}
package com.zhiwei.brandkbs2.service;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.external.BrandkbsChannelConfig;
import com.zhiwei.brandkbs2.pojo.external.BrandkbsHotEventConfig;
import com.zhiwei.brandkbs2.pojo.external.BrandkbsHotTopConfig;
import com.zhiwei.brandkbs2.pojo.external.BrandkbsYuQingConfig;
public interface ProjectWarnService {
......@@ -12,4 +16,16 @@ public interface ProjectWarnService {
*/
ResponseResult getProjectWarnCriteria(String projectId, String type);
ResponseResult getProjectWarnCriteriaDefault(String projectId, String type);
ResponseResult getYuqingWaring(String projectId, BrandkbsYuQingConfig brandkbsYuQingConfig);
ResponseResult getChannelWaring(String projectId, BrandkbsChannelConfig brandkbsChannelConfig);
ResponseResult getHotEventWaring(String projectId, BrandkbsHotEventConfig brandkbsHotEventConfig);
ResponseResult getHotTopWaring(String projectId, BrandkbsHotTopConfig config);
ResponseResult getNewCaseWaring(String projectId);
}
......@@ -876,7 +876,11 @@ public class MarkDataServiceImpl implements MarkDataService {
@Override
public List<JSONObject> searchMarkDataByEvent(Event event) {
String linkedGroupId = projectService.getProjectByContendId(event.getProjectId(), event.getContendId()).getBrandLinkedGroupId();
return searchMarkDataByTime(event.getProjectId(), linkedGroupId, event.getContendId(), event.getStartTime(), event.getEndTime(), EVENT_FETCH_SOURCE);
Long endTime = null;
if (event.isEndStatus()) {
endTime = event.getEndTime();
}
return searchMarkDataByTime(event.getProjectId(), linkedGroupId, event.getContendId(), event.getStartTime(), endTime, EVENT_FETCH_SOURCE);
}
@Override
......
package com.zhiwei.brandkbs2.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.config.Constant;
import com.zhiwei.brandkbs2.dao.ChannelDao;
import com.zhiwei.brandkbs2.dao.EventDao;
import com.zhiwei.brandkbs2.enmus.EmotionEnum;
import com.zhiwei.brandkbs2.es.EsClientDao;
import com.zhiwei.brandkbs2.es.EsQueryTools;
import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.*;
import com.zhiwei.brandkbs2.pojo.external.*;
import com.zhiwei.brandkbs2.service.ProjectService;
import com.zhiwei.brandkbs2.service.ProjectWarnService;
import com.zhiwei.brandkbs2.util.Tools;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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;
......@@ -18,30 +41,48 @@ import java.util.stream.Collectors;
*/
@Service("projectWarnServiceImpl")
public class ProjectWarnServiceImpl implements ProjectWarnService {
private static final Logger log = LogManager.getLogger(ProjectWarnServiceImpl.class);
private static final Long ONE_MINUTE = 60 * 1000L;
@Value("${ef.external.filterNew.url}")
private String getExternalFilterNewUrl;
@Autowired
private RestTemplate restTemplate;
@Resource(name = "projectServiceImpl")
ProjectService projectService;
@Resource(name = "esClientDao")
EsClientDao esClientDao;
@Resource(name = "channelDao")
ChannelDao channelDao;
@Resource(name = "eventDao")
EventDao eventDao;
@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("正面", "中性", "负面"));
CriteriaHelper.warnCriteriaAddSimple(res, "channelTypes", Arrays.asList("央级", "门户", "财经", "科技", "其他"), Collections.singletonList("央级"));
CriteriaHelper.warnCriteriaAdd(res, "primary", Arrays.asList("原创", "转发"), Arrays.asList(false, true), Collections.singletonList("原创"));
CriteriaHelper.warnCriteriaAddSimple(res, "markerTags", Arrays.asList("正面", "中性", "负面"), Collections.singletonList("负面"));
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("10min", "30min", "60min"), Arrays.asList(10 * ONE_MINUTE, 30 * ONE_MINUTE, 60 * ONE_MINUTE));
CriteriaHelper.warnCriteriaAdd(res, "contends", nameList, idList);
CriteriaHelper.warnCriteriaAdd(res, "keyword", null);
CriteriaHelper.warnCriteriaAdd(res, "duplicate", Arrays.asList("去重", "不去重"), Arrays.asList(true, false), Collections.singletonList("不去重"));
CriteriaHelper.warnCriteriaAdd(res, "pushInterval", Arrays.asList("10min", "30min", "60min"), Arrays.asList(10 * ONE_MINUTE, 30 * ONE_MINUTE,
60 * ONE_MINUTE), Collections.singletonList("10min"));
break;
case "渠道参与":
warnCriteriaAdd(res, "friendlyChannel", Arrays.asList("友好渠道", "敏感渠道", "自定义渠道"), Arrays.asList(true, false, null));
CriteriaHelper.warnCriteriaAdd(res, "friendlyChannel", Arrays.asList("友好渠道", "敏感渠道", "自定义渠道"), Arrays.asList(true, false, null),
Collections.singletonList("自定义渠道"));
List<Map<String, Object>> thresholdValue = new ArrayList<>();
for (String name : Arrays.asList("友好渠道 友好指数", "敏感渠道 敏感指数")) {
Map<String, Object> map = new HashMap<>();
......@@ -50,26 +91,30 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
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("10min", "30min", "60min"), Arrays.asList(10 * ONE_MINUTE, 30 * ONE_MINUTE, 60 * ONE_MINUTE));
CriteriaHelper.warnCriteriaAdd(res, "channel", null);
CriteriaHelper.warnCriteriaAdd(res, "primary", Arrays.asList("原创", "转发"), Arrays.asList(false, true), Collections.singletonList("原创"));
CriteriaHelper.warnCriteriaAddSimple(res, "markerTags", Arrays.asList("正面", "中性", "负面"), Collections.singletonList("负面"));
CriteriaHelper.warnCriteriaAdd(res, "duplicate", Arrays.asList("去重", "不去重"), Arrays.asList(true, false), Collections.singletonList("去重"));
CriteriaHelper.warnCriteriaAdd(res, "pushInterval", Arrays.asList("10min", "30min", "60min"), Arrays.asList(10 * ONE_MINUTE, 30 * ONE_MINUTE,
60 * ONE_MINUTE), Collections.singletonList("10min"));
break;
case "热点事件":
warnCriteriaAddSimple(res, "ownEvent", Arrays.asList("正面", "中性", "负面"));
CriteriaHelper.warnCriteriaAddSimple(res, "ownEvent", Arrays.asList("正面", "中性", "负面"), 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(2, 3, 4, 5, 6, 7, 1), "说明:系统推送时间为08" + ":00");
CriteriaHelper.warnCriteriaAdd(res, "contendsEvent", nameList2, idList2, nameList2);
List<String> zhiWeiEventList = Arrays.asList("社会", "互联网", "政务", "财经", "企业", "娱乐", "灾难", "违法犯罪", "国际", "体育", "谣言");
CriteriaHelper.warnCriteriaAddSimple(res, "zhiWeiEvent", zhiWeiEventList, zhiWeiEventList);
CriteriaHelper.warnCriteriaAdd(res, "eventTop", Arrays.asList("TOP5", "TOP10"), Arrays.asList(5, 10), Collections.singletonList("TOP10"));
CriteriaHelper.warnCriteriaAdd(res, "timeCycles", Arrays.asList("周一", "周二", "周三", "周四", "周五", "周六", "周日"),
Arrays.asList(2, 3, 4, 5, 6, 7, 1), Collections.singletonList("周一"));
break;
case "上榜热搜":
warnCriteriaAddSimple(res, "warnKeyword", null);
warnCriteriaAddSimple(res, "filterKeyword", null);
warnCriteriaAddSimple(res, "listType", Arrays.asList("微博热搜", "微博话题", "微博预热", "头条热搜", "抖音热搜", "知乎热搜", "B站热搜", "快手热榜"));
CriteriaHelper.warnCriteriaAddSimple(res, "warnKeyword", null);
CriteriaHelper.warnCriteriaAddSimple(res, "filterKeyword", null);
CriteriaHelper.warnCriteriaAddSimple(res, "listType", Arrays.asList("微博热搜", "微博话题", "微博预热", "头条热搜", "抖音热搜", "知乎热搜", "B站热搜", "快手热榜"),
Collections.singletonList("微博热搜"));
List<Map<String, Object>> topNewHeight = new ArrayList<>();
for (int i : Arrays.asList(3, 5, 10, 20, 50)) {
Map<String, Object> map = new HashMap<>();
......@@ -78,8 +123,10 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
topNewHeight.add(map);
}
res.put("topNewHeight", topNewHeight);
warnCriteriaAdd(res, "warnType", Arrays.asList("首次上榜", "排名新高", "掉榜和再次上榜", "导语(仅支持微博平台)"), Arrays.asList("firstTop", "newHeight", "topOnceAgain", "introduction"));
warnCriteriaAdd(res, "pushInterval", Collections.singletonList("5min"), Collections.singletonList(5 * ONE_MINUTE));
List<String> warnTypeList = Arrays.asList("首次上榜", "排名新高", "掉榜和再次上榜", "导语(仅支持微博平台)");
CriteriaHelper.warnCriteriaAdd(res, "warnType", warnTypeList, Arrays.asList("firstTop", "newHeight", "topOnceAgain", "introduction"), warnTypeList);
CriteriaHelper.warnCriteriaAdd(res, "pushInterval", Collections.singletonList("5min"), Collections.singletonList(5 * ONE_MINUTE),
Collections.singletonList("5min"));
break;
case "案例上新":
return ResponseResult.success();
......@@ -89,58 +136,529 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
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);
@Override
public ResponseResult getProjectWarnCriteriaDefault(String projectId, String type) {
switch (type) {
case "舆情动态":
BrandkbsYuQingConfig config = new BrandkbsYuQingConfig();
config.setChannelTypes(Collections.singletonList("央级"));
config.setPrimary(Collections.singletonList(Boolean.TRUE));
config.setMarkerTags(Collections.singletonList("负面"));
config.setDuplicate(Boolean.FALSE);
config.setPushInterval(10 * ONE_MINUTE);
return ResponseResult.success(config);
case "渠道参与":
BrandkbsChannelConfig config2 = new BrandkbsChannelConfig();
config2.setFriendlyChannel(null);
config2.setPrimary(Collections.singletonList(Boolean.TRUE));
config2.setMarkerTags(Collections.singletonList("负面"));
config2.setDuplicate(Boolean.TRUE);
config2.setPushInterval(10 * ONE_MINUTE);
return ResponseResult.success(config2);
case "热点事件":
BrandkbsHotEventConfig config3 = new BrandkbsHotEventConfig();
config3.setOwnEvent(Arrays.asList("正面", "中性", "负面"));
List<JSONObject> brands = projectService.getBrands(projectId, false);
List<String> idList = brands.stream().map(json -> json.getString("contendId")).collect(Collectors.toList());
config3.setContendsEvent(idList);
List<String> zhiWeiEventList = Arrays.asList("社会", "互联网", "政务", "财经", "企业", "娱乐", "灾难", "违法犯罪", "国际", "体育", "谣言");
config3.setZhiWeiEvent(zhiWeiEventList);
config3.setEventTop(10);
// 对应周一
config3.setTimeCycles(2);
return ResponseResult.success(config3);
case "上榜热搜":
BrandkbsHotTopConfig config4 = new BrandkbsHotTopConfig();
config4.setListType(Collections.singletonList("微博热搜"));
config4.setFirstTop(true);
config4.setNewHeight(true);
config4.setTopNewHeight(5);
config4.setTopOnceAgain(true);
config4.setIntroduction(true);
config4.setPushInterval(5 * ONE_MINUTE);
return ResponseResult.success(config4);
case "案例上新":
}
return ResponseResult.success();
}
private ResponseResult yuqingWaringReal(String projectId, BrandkbsYuQingConfig config) {
Project project = null;
long end = System.currentTimeMillis();
long start = end - config.getPushInterval();
try {
project = projectService.getProjectById(projectId);
log.info("获取舆情动态预警开始,project:{}", project.getProjectName());
EsClientDao.SearchHelper helper = EsClientDao.createSearchHelper();
// 发声渠道
BoolQueryBuilder postFilter = EsQueryTools.assembleCacheMapsQueryWithProject(projectId, config.getChannelTypes());
// 时间(标注时间)
postFilter.must(QueryBuilders.rangeQuery("mtime").gte(start).lt(end));
// 文章类型
if (CollectionUtils.isNotEmpty(config.getPrimary()) && config.getPrimary().size() == 1) {
postFilter.must(EsQueryTools.assembleForwardQuery(config.getPrimary().get(0)));
}
// 本品舆情+竞品舆情
BoolQueryBuilder sourceBuilder = QueryBuilders.boolQuery();
if (CollectionUtils.isNotEmpty(config.getMarkerTags())) {
sourceBuilder.should(QueryBuilders.termQuery("brandkbs_mark_cache_maps.name.keyword", config.getMarkerTags()));
}
if (CollectionUtils.isNotEmpty(config.getContends())) {
EsQueryTools.assembleContendsQuery(sourceBuilder, config.getContends());
}
postFilter.must(sourceBuilder);
// 关键词命中
postFilter.must(EsQueryTools.assembleNormalKeywordQuery(config.getKeyword(), new String[]{GenericAttribute.ES_IND_FULL_TEXT}));
SearchHits searchHits = esClientDao.searchHits(helper);
List<BaseMap> datas = Arrays.stream(searchHits.getHits()).map(hit -> {
Map<String, Object> sourceMap = hit.getSourceAsMap();
BaseMap baseMap = Tools.getBaseFromEsMap(sourceMap);
JSONObject hitMap = Tools.getBrandkbsHitMapWithProjectId(sourceMap, projectId);
if (!hitMap.isEmpty() && !Constant.PRIMARY_CONTEND_ID.equals(hitMap.getString("contend_id"))) {
baseMap.setBrandName(projectService.getProjectByContendId(projectId, hitMap.getString("contend_id")).getBrandName());
}
return baseMap;
}).collect(Collectors.toList());
// 开启去重
if (Boolean.TRUE.equals(config.getDuplicate())) {
datas = duplicateBaseMapList(datas);
}
log.info("获取舆情动态预警结束,project:{}", project.getProjectName());
// 封装返回值
return ResponseResult.success(brandkbsWarnTemplate4Yuqing(config, datas, start, end, project));
} catch (Exception e) {
log.info("获取舆情动态预警失败,project:{}", project.getProjectName(), e);
}
return ResponseResult.failure("获取舆情动态预警失败");
}
private BrandkbsWarnTemplate brandkbsWarnTemplate4Yuqing(BrandkbsYuQingConfig config, List<BaseMap> datas, long start, long end, AbstractProject project) {
if (datas.isEmpty()) {
return null;
}
int firstCount = datas.size();
// key1
String key1 = "【品见】舆情动态" + project.getProjectName();
// key2
String key2Header = "全部";
StringBuilder mediaChannel = new StringBuilder();
config.getChannelTypes().forEach(channelType -> mediaChannel.append(channelType).append("、"));
if (0 != mediaChannel.length()) {
key2Header = mediaChannel.deleteCharAt(mediaChannel.length() - 1).toString();
}
key2Header += "媒体,";
StringBuilder dataType = new StringBuilder();
config.getMarkerTags().forEach(emotion -> dataType.append(emotion).append(" "));
dataType.append("(本品)");
// 如果有竞品
if (CollectionUtils.isNotEmpty(config.getContends())) {
dataType.append(",");
config.getContends().forEach(contend -> dataType.append(contend).append(" "));
dataType.append("(竞品)");
}
String key2 = key2Header + dataType;
// key3
String key3 = Constant.SPEC_MINUTE_FORMAT.format(start) + " ~ " + Constant.SPEC_MINUTE_FORMAT.format(end);
// key4
String key4;
StringBuilder keyBuilder4 = new StringBuilder();
for (int i = 0; i < 2; i++) {
BaseMap baseMap = datas.get(i);
String platform = baseMap.getPlatform();
String source = baseMap.getSource();
String title = baseMap.getTitle();
keyBuilder4.append(platform).append("-").append(source).append("/r/n");
keyBuilder4.append(i + 1).append("、").append(title).append("/r/n");
}
if (datas.size() > 2) {
key4 = keyBuilder4.append("...").toString();
} else {
key4 = keyBuilder4.substring(0, keyBuilder4.length() - 4);
}
List<BaseMapCompound> collect = datas.stream().map(baseMap -> BaseMapCompound.createFromBaseMap(baseMap, project.getId())).collect(Collectors.toList());
return new BrandkbsWarnTemplate(firstCount, key1, key2, key3, key4, new BrandkbsYuQingWarn(collect));
}
private ResponseResult channelWarnReal(String projectId, BrandkbsChannelConfig config) {
Project project = null;
long end = System.currentTimeMillis();
long start = end - config.getPushInterval();
try {
project = projectService.getProjectById(projectId);
log.info("获取渠道参与预警开始,project:{}", project.getProjectName());
EsClientDao.SearchHelper helper = EsClientDao.createSearchHelper();
BoolQueryBuilder postFilter = EsQueryTools.assembleCacheMapsQuery(project.getId(), project.getBrandLinkedGroupId(), "0");
// 时间(标注时间)
postFilter.must(QueryBuilders.rangeQuery("mtime").gte(start).lt(end));
// 自定义渠道
if (null != config.getChannel()) {
postFilter.must(QueryBuilders.termsQuery("source", Arrays.asList(config.getChannel().split("\\|"))));
}
// 文章类型
if (CollectionUtils.isNotEmpty(config.getPrimary()) && config.getPrimary().size() == 1) {
postFilter.must(EsQueryTools.assembleForwardQuery(config.getPrimary().get(0)));
}
// 本品舆情
BoolQueryBuilder sourceBuilder = QueryBuilders.boolQuery();
if (CollectionUtils.isNotEmpty(config.getMarkerTags())) {
sourceBuilder.should(QueryBuilders.termQuery("brandkbs_mark_cache_maps.name.keyword", config.getMarkerTags()));
}
postFilter.must(sourceBuilder);
// 搜索结果
SearchHits searchHits = esClientDao.searchHits(helper);
List<BaseMap> datas = Arrays.stream(searchHits.getHits()).map(hit -> Tools.getBaseFromEsMap(hit.getSourceAsMap())).collect(Collectors.toList());
// 开启去重
if (Boolean.TRUE.equals(config.getDuplicate())) {
datas = duplicateBaseMapList(datas);
}
// 渠道指数筛选
if (null != config.getFriendlyChannel()) {
Map<String, BaseMap> collect = datas.stream().collect(Collectors.toMap(baseMap ->
Tools.getFid(projectId, "0", baseMap.getPlatform(), baseMap.getRealSource(), baseMap.getSource()), map -> map));
// 通过筛选的fid列表
Map<String, Channel> fidChannel = channelDao.queryUniqueAsync(collect.keySet()).entrySet().stream().map(entry -> {
Channel channel = entry.getValue();
if (config.getFriendlyChannel()) {
// 需要友好渠道
if (EmotionEnum.POSITIVE.getState() != channel.getEmotion()) {
return null;
}
} else {
// 需要敏感渠道
if (EmotionEnum.NEGATIVE.getState() != channel.getEmotion()) {
return null;
}
}
// 需要达到额定阈值
if (channel.getEmotionIndex() < config.getThreshold()) {
return null;
}
return entry;
}).filter(Objects::nonNull).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
// setChannelEmotionIndex
datas = collect.entrySet().stream().filter(entry -> fidChannel.containsKey(entry.getKey())).map(entry -> {
Channel channel = fidChannel.get(entry.getKey());
entry.getValue().setChannelEmotionIndex(channel.getEmotionIndex());
return entry.getValue();
}).collect(Collectors.toList());
}
log.info("获取渠道参与预警结束,project:{}", project.getProjectName());
// 封装返回值
return ResponseResult.success(brandkbsWarnTemplate4Channel(config, datas, start, end, project));
} catch (Exception e) {
log.info("获取渠道参与预警失败,project:{}", project.getProjectName(), e);
}
return ResponseResult.failure("获取渠道参与预警失败");
}
private BrandkbsWarnTemplate brandkbsWarnTemplate4Channel(BrandkbsChannelConfig config, List<BaseMap> datas, long start, long end, AbstractProject project) {
if (datas.isEmpty()) {
return null;
}
int firstCount = datas.size();
// key1
String key1 = "【品见】渠道参与" + project.getProjectName();
// key2
String key2 = "自定义渠道";
if (Boolean.TRUE.equals(config.getFriendlyChannel())) {
key2 = "友好渠道";
} else if (Boolean.FALSE.equals(config.getFriendlyChannel())) {
key2 = "敏感渠道";
}
// key3
String key3 = Constant.SPEC_MINUTE_FORMAT.format(start) + " ~ " + Constant.SPEC_MINUTE_FORMAT.format(end);
// key4
String key4;
StringBuilder keyBuilder4 = new StringBuilder();
for (int i = 0; i < 2; i++) {
BaseMap baseMap = datas.get(i);
String platform = baseMap.getPlatform();
String source = baseMap.getSource();
String title = baseMap.getTitle();
keyBuilder4.append(platform).append("-").append(source).append("/r/n");
keyBuilder4.append(i + 1).append("、").append(title).append("/r/n");
}
if (datas.size() > 2) {
key4 = keyBuilder4.append("...").toString();
} else {
key4 = keyBuilder4.substring(0, keyBuilder4.length() - 4);
}
List<BaseMapCompound> collect = datas.stream().map(baseMap -> BaseMapCompound.createFromBaseMap(baseMap, project.getId())).collect(Collectors.toList());
return new BrandkbsWarnTemplate(firstCount, key1, key2, key3, key4, new BrandkbsYuQingWarn(collect));
}
private ResponseResult hotEventWaring(String projectId, BrandkbsHotEventConfig config) {
Project project = projectService.getProjectById(projectId);
long end = System.currentTimeMillis();
long start = end - Constant.ONE_DAY * 7;
try {
log.info("获取热点事件预警开始,project:{}", project.getProjectName());
Map<String, List<Event>> eventMap = new LinkedHashMap<>();
if (CollectionUtils.isNotEmpty(config.getOwnEvent())) {
List<Event> ownEvents = eventDao.getEventsByProjectIdAndContendId(start, end, config.getOwnEvent(), projectId, "0", config.getEventTop());
eventMap.put("品牌动态", ownEvents);
}
if (CollectionUtils.isNotEmpty(config.getContendsEvent())) {
List<Event> contentEvents = new ArrayList<>();
for (String contendId : config.getContendsEvent()) {
contentEvents.addAll(eventDao.getEventsByProjectIdAndContendId(start, end, config.getOwnEvent(), projectId, contendId, config.getEventTop()));
}
eventMap.put("友商动态", contentEvents);
}
if (CollectionUtils.isNotEmpty(config.getZhiWeiEvent())) {
List<Event> externalEvents = new ArrayList<>();
ResponseEntity<String> forEntity = restTemplate.getForEntity(getExternalFilterNewUrl, String.class, config.getZhiWeiEvent().toArray(), start, end);
JSONObject jsonObject = JSON.parseObject(forEntity.getBody());
JSONArray jsonArray = jsonObject.getJSONObject("data").getJSONArray("events");
for (int i = 0; i < config.getEventTop(); i++) {
JSONObject zhiweiEvent = jsonArray.getJSONObject(i);
Event event = new Event();
event.setTitle(zhiweiEvent.getString("eventname"));
JSONObject eventTag = new JSONObject();
// TODO 存疑
eventTag.put("事件类型", zhiweiEvent.getString("type"));
event.setEventTag(eventTag);
event.setTotalDisseminationVolume(zhiweiEvent.getLong("total"));
event.setStartTime(zhiweiEvent.getLong("startTime"));
event.setInfluence(zhiweiEvent.getDouble("index"));
externalEvents.add(event);
}
eventMap.put("行业动态", externalEvents);
}
log.info("获取热点事件预警结束,project:{}", project.getProjectName());
return ResponseResult.success(brandkbsWarnTemplate4HotEvent(config, eventMap, start, end, project));
} catch (Exception e) {
log.info("获取热点事件预警失败,project:{}", project.getProjectName(), e);
}
return ResponseResult.failure("获取热点事件预警失败");
}
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不符!");
private BrandkbsWarnTemplate brandkbsWarnTemplate4HotEvent(BrandkbsHotEventConfig config, Map<String, List<Event>> eventMap, long start, long end,
AbstractProject project) {
int firstCount = eventMap.values().stream().mapToInt(List::size).sum();
if (firstCount == 0) {
return null;
}
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));
String key1 = "【品见】热点事件" + project.getProjectName();
// key2
String key2 = null;
// key3
String key3 = Constant.SPEC_MINUTE_FORMAT.format(start) + " ~ " + Constant.SPEC_MINUTE_FORMAT.format(end);
// key4
String key4;
StringBuilder keyBuilder4 = new StringBuilder();
int limit = 2;
out:
for (List<Event> value : eventMap.values()) {
for (Event event : value) {
keyBuilder4.append(event.getTitle()).append("/r/n");
if (--limit == 0) {
break out;
}
}
}
if (firstCount > 2) {
key4 = keyBuilder4.append("...").toString();
} else {
key4 = keyBuilder4.substring(0, keyBuilder4.length() - 4);
}
List<BrandkbsHotEventWarn.HotEvent> collect = eventMap.entrySet().stream().map(entry -> entry.getValue().stream().map(event -> BrandkbsHotEventWarn.HotEvent.createFromEvent(entry.getKey(), event)).collect(Collectors.toList())).collect(Collectors.toList()).stream().flatMap(List::stream).collect(Collectors.toList());
return new BrandkbsWarnTemplate(firstCount, key1, key2, key3, key4, new BrandkbsHotEventWarn(collect));
}
private List<BaseMap> duplicateBaseMapList(List<BaseMap> datas) {
Map<String, BaseMap> duplicateMap = new LinkedHashMap<>();
for (BaseMap data : datas) {
String key = data.getTitleNullOptionalContent();
BaseMap newValue;
if (duplicateMap.containsKey(key)) {
BaseMap oldValue = duplicateMap.get(key);
// 取最早时间的数据
newValue = data.getTime() < oldValue.getTime() ? data : oldValue;
} else {
map.put("name", name);
map.put("id", listValueId.get(i));
newValue = data;
}
value.add(map);
duplicateMap.put(key, newValue);
}
warnCriteriaAdd(res, key, value, null);
return new ArrayList<>(duplicateMap.values());
}
private BrandkbsWarnTemplate getWarnTemplate(BrandkbsYuQingWarn warn1) {
int firstCount = 1;
String keyword1 = "【品见】舆情动态-阿里";
String keyword2 = "央级、门户媒体,负面(本品)";
String keyword3 = "2022.02.03 08:00 ~ 2022.02.03 08:10";
String keyword4 = "网媒-人民网\r\n1、顺丰快递全球发售1.31亿股,引入阿里巴巴等\r\n平媒-人民日报\r\n2、顺丰快递全球发售1.31亿股,引入阿里巴巴等\r\n...";
return new BrandkbsWarnTemplate(firstCount, keyword1, keyword2, keyword3, keyword4, warn1);
}
private BrandkbsWarnTemplate getWarnTemplate(BrandkbsChannelWarn warn2) {
int firstCount = 1;
String keyword1 = "【品见】舆情动态-阿里";
String keyword2 = "央级、门户媒体,负面(本品)";
String keyword3 = "2022.02.03 08:00 ~ 2022.02.03 08:10";
String keyword4 = "网媒-人民网\r\n1、顺丰快递全球发售1.31亿股,引入阿里巴巴等\r\n平媒-人民日报\r\n2、顺丰快递全球发售1.31亿股,引入阿里巴巴等\r\n...";
return new BrandkbsWarnTemplate(firstCount, keyword1, keyword2, keyword3, keyword4, warn2);
}
private BrandkbsWarnTemplate getWarnTemplate(BrandkbsHotEventWarn warn3) {
int firstCount = 1;
String keyword1 = "【品见】舆情动态-阿里";
String keyword2 = "央级、门户媒体,负面(本品)";
String keyword3 = "2022.02.03 08:00 ~ 2022.02.03 08:10";
String keyword4 = "网媒-人民网\r\n1、顺丰快递全球发售1.31亿股,引入阿里巴巴等\r\n平媒-人民日报\r\n2、顺丰快递全球发售1.31亿股,引入阿里巴巴等\r\n...";
return new BrandkbsWarnTemplate(firstCount, keyword1, keyword2, keyword3, keyword4, warn3);
}
private BrandkbsWarnTemplate getWarnTemplate(BrandkbsHotTopWarn warn4) {
int firstCount = 1;
String keyword1 = "【品见】舆情动态-阿里";
String keyword2 = "央级、门户媒体,负面(本品)";
String keyword3 = "2022.02.03 08:00 ~ 2022.02.03 08:10";
String keyword4 = "网媒-人民网\r\n1、顺丰快递全球发售1.31亿股,引入阿里巴巴等\r\n平媒-人民日报\r\n2、顺丰快递全球发售1.31亿股,引入阿里巴巴等\r\n...";
return new BrandkbsWarnTemplate(firstCount, keyword1, keyword2, keyword3, keyword4, warn4);
}
private void warnCriteriaAddSimple(Map<String, Object> res, String key, List<String> listValue) {
warnCriteriaAddSimple(res, key, listValue, null);
private BrandkbsWarnTemplate getWarnTemplate(BrandkbsNewCaseWarn warn5) {
int firstCount = 1;
String keyword1 = "【品见】舆情动态-阿里";
String keyword2 = "央级、门户媒体,负面(本品)";
String keyword3 = "2022.02.03 08:00 ~ 2022.02.03 08:10";
String keyword4 = "网媒-人民网\r\n1、顺丰快递全球发售1.31亿股,引入阿里巴巴等\r\n平媒-人民日报\r\n2、顺丰快递全球发售1.31亿股,引入阿里巴巴等\r\n...";
return new BrandkbsWarnTemplate(firstCount, keyword1, keyword2, keyword3, keyword4, warn5);
}
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) {
private BaseMapCompound getBaseMapCompoundTemplate() {
BaseMap baseMap = new BaseMap();
baseMap.setTitle("和府捞面新故事难讲");
baseMap.setContent("和府捞面新故事难讲2022-11-0114:32新消费和府捞面来源:燃次元(ID:chaintruth)作者:张琳编辑:曹杨作为消费界的跨界流量担当,这次盯上咖啡的是面馆。作为昔日网红中式面馆的和府捞面,其旗下新品牌“PickMEの咖啡&热食”门店已经在上海外滩SOHO落地。和府捞面官方小程序显示,PickME目前售卖的品类涵盖拌饭、拌面、烘焙小食和咖啡。咖啡共有6款,包括PickMe美式、拿铁、大白梨特调生椰拿铁、桑葚特调拿铁等,售价在12-20元之间。图/“PickMEの咖啡&热食”门店示意图,来源/和府捞面官网2013年8月,和府捞面的第一家门店在江苏如皋大润发正式开业。凭借“书房里的养生面”这一独特定位,很快便从一众同质化的传统面馆中脱颖而出,不但吸引了大量食客前去打卡,还成功抬高了面馆的身价,将一碗中式面条卖到了40-50元的价格。新颖的概念也让和府捞面成了资本眼中的“香饽饽”。企查查显示,和府捞面至今共获得6次融资,金额分别为3000万元、5000万元、1亿元、2.15亿元、4.5亿元以及8亿元。其最近一次融资是在2021年7月,由CMC资本领投,众为资本,龙湖资本,腾讯投资等机构跟投,投后估值金额约70亿元人民币。对于本轮融资,和府表示,将主要用于深入布局全产业链体系、新品牌打造、渠道建设及数字化能力构建等方面。很显然,“PickMEの咖啡&热食”就是和府捞面要打造的新品牌,也成为了和府捞面众多“副业大军”中的一员。实际上,和府捞面在产业链的尝试从未止步,先试水火锅,开出“和府火锅和她的面”,而后趁着“餐饮+小酒馆”的热潮,推出子品牌“和府小面小酒”,再之后是主打聚会场景的“财神小排档”。今年5月,和府捞面又杀入兰州拉面赛道,开出首家“阿兰家兰州牛肉面”。对此,艾媒咨询CEO兼首席分析师张毅对燃次元表示,和府捞面在其“捞面”主营业务上已经打通了连锁经营的模式,将这一模式复制到其它子品牌上,可以增加整体营收规模,这也是和府捞面多次尝试发展子品牌的主要原因。不过,从和府捞面其它业务的经营上来看,似乎单纯的复制“捞面”模式并不奏效。比如,试水不足一年时间,和府捞面的火锅业务就“折戟”了,其北京、上海、济南等地的门店已将店名从“和府火锅和她的面”变更为“和府捞面”。除此之外,其它副业也并未在消费者中激起太多“水花”。零售电商行业专家、百联咨询创始人庄帅对燃次元表示,企业发展多业态大都是为了更好地盈利,但成功的却极少,“原因在于每种业态的组织管理、选址、经营模式、供应链体系、客户服务、消费习惯和竞争都很不一样,目前全球范围能做好三个以上规模化业态的零售企业非常少。”事实上,在竞争愈发激烈且同质化严重的新中式面馆赛道里,“书房里的捞面”对消费者的吸引力正在削弱。行至资本市场大门前,是继续讲好捞面的故事还是找到“第二增长曲线”,对和府捞面来说,都极具挑战。");
baseMap.setPlatform("网媒");
baseMap.setSource("i黑马");
baseMap.setEmotion("正面");
baseMap.setUrl("http://www.iheima.com/article-346459.html");
List<String> tags = new ArrayList<>();
tags.add("央级");
tags.add("原创");
tags.add("腾讯");
return new BaseMapCompound(baseMap, tags);
}
private BrandkbsHotEventWarn.HotEvent getHotEventTemplate() {
BrandkbsHotEventWarn.HotEvent hotEvent = new BrandkbsHotEventWarn.HotEvent();
hotEvent.setType("品牌动态");
hotEvent.setTitle("中国电动汽车百人讨论会");
hotEvent.setEmotion("正面");
hotEvent.setTotalDisseminationVolume(533L);
hotEvent.setTotalChannelVolume(429L);
hotEvent.setStartTime(1664553600000L);
hotEvent.setInfluence(83.2);
return hotEvent;
}
private BrandkbsHotTopWarn.HotTop getHotTopTemplate() {
BrandkbsHotTopWarn.HotTop hotTop = new BrandkbsHotTopWarn.HotTop();
hotTop.setTitle("阿里疫情防控");
hotTop.setTopReason("排名新高");
hotTop.setRank("18名");
hotTop.setHot("44.5W");
hotTop.setTopName("微博热搜");
hotTop.setTime(System.currentTimeMillis());
return hotTop;
}
private BrandkbsNewCaseWarn.NewCase getNewCaseWarn() {
BrandkbsNewCaseWarn.NewCase newCase = new BrandkbsNewCaseWarn.NewCase();
newCase.setTitle("椰树集团直播带货风格引争议");
newCase.setTagList(Arrays.asList("椰树集团", "价值观问题"));
newCase.setContent("2022年10月8日,据媒体报道...");
newCase.setSpreadIndex(85.5);
newCase.setCaseType("营销风险");
return newCase;
}
@Override
public ResponseResult getYuqingWaring(String projectId, BrandkbsYuQingConfig config) {
return ResponseResult.success(getWarnTemplate(new BrandkbsYuQingWarn(Arrays.asList(getBaseMapCompoundTemplate(), getBaseMapCompoundTemplate(),
getBaseMapCompoundTemplate(), getBaseMapCompoundTemplate(), getBaseMapCompoundTemplate()))));
}
@Override
public ResponseResult getChannelWaring(String projectId, BrandkbsChannelConfig brandkbsChannelConfig) {
return ResponseResult.success(getWarnTemplate(new BrandkbsChannelWarn(Arrays.asList(getBaseMapCompoundTemplate(), getBaseMapCompoundTemplate(),
getBaseMapCompoundTemplate(), getBaseMapCompoundTemplate(), getBaseMapCompoundTemplate()), "敏感渠道(敏感指数>70)")));
}
@Override
public ResponseResult getHotEventWaring(String projectId, BrandkbsHotEventConfig brandkbsHotEventConfig) {
return ResponseResult.success(getWarnTemplate(new BrandkbsHotEventWarn(Arrays.asList(getHotEventTemplate(), getHotEventTemplate(),
getHotEventTemplate(), getHotEventTemplate(), getHotEventTemplate()))));
}
@Override
public ResponseResult getHotTopWaring(String projectId, BrandkbsHotTopConfig config) {
return ResponseResult.success(getWarnTemplate(new BrandkbsHotTopWarn("阿里", "腾讯", Arrays.asList(getHotTopTemplate(), getHotTopTemplate(),
getHotTopTemplate(), getHotTopTemplate(), getHotTopTemplate()))));
}
@Override
public ResponseResult getNewCaseWaring(String projectId) {
return ResponseResult.success(getWarnTemplate(new BrandkbsNewCaseWarn(Arrays.asList(getNewCaseWarn(), getNewCaseWarn(), getNewCaseWarn(),
getNewCaseWarn(), getNewCaseWarn()))));
}
public static class CriteriaHelper {
public static <T> void warnCriteriaAdd(Map<String, Object> res, String key, List<String> listValueName, List<T> listValueId, List<String> defaultValue) {
if (null == listValueName) {
warnCriteriaAdd(res, key, null);
return;
}
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<>();
map.put("name", str);
map.put("id", str);
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);
}
// 设置默认值
// if (null != defaultValue) {
// Map<String, Object> defaultMap = new HashMap<>();
// defaultMap.put("defaultValue", defaultValue);
// value.add(defaultMap);
// }
warnCriteriaAdd(res, key, value);
}
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);
public static <T> void warnCriteriaAdd(Map<String, Object> res, String key, List<String> listValueName, List<T> listValueId) {
warnCriteriaAdd(res, key, listValueName, listValueId, null);
}
public static void warnCriteriaAddSimple(Map<String, Object> res, String key, List<String> listValue, List<String> defaultValue) {
List<String> listValueId = null;
if (null != listValue) {
listValueId = new ArrayList<>(listValue);
}
warnCriteriaAdd(res, key, listValue, listValueId, defaultValue);
}
public static void warnCriteriaAddSimple(Map<String, Object> res, String key, List<String> listValue) {
warnCriteriaAddSimple(res, key, listValue, null);
}
public static void warnCriteriaAdd(Map<String, Object> res, String key, List<Map<String, Object>> value) {
res.put(key, value);
}
}
}
......@@ -894,6 +894,16 @@ public class Tools {
return new JSONObject();
}
public static JSONObject getBrandkbsHitMapWithProjectId(Map<String, Object> esMap, String projectId) {
List<Map<String, Object>> cacheMaps = (List<Map<String, Object>>) esMap.get(GenericAttribute.ES_BRANDKBS_CACHE_MAPS);
for (Map<String, Object> cacheMap : cacheMaps) {
if (projectId.equals(cacheMap.get("project_id"))) {
return new JSONObject(cacheMap);
}
}
return new JSONObject();
}
public static <T> Map<String, T> sortTimeKeyMap(Map<String, T> map, FastDateFormat timePattern, boolean isDesc) {
Map<String, T> res = new LinkedHashMap<>();
List<Map.Entry<String, T>> sortKey = map.entrySet().stream().sorted((x, y) -> {
......
......@@ -79,4 +79,17 @@ istarshine.addIStarShineKSData.url=https://istarshine-service.zhiweidata.com/ist
istarshine.getIStarShineKSInfoData.url=https://istarshine-service.zhiweidata.com/istarshine/ks/getIStarShineKSInfoData?taskId={1}&appId=6183571e0d710000f6003a12
whole.search.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/middleware/search/yuqing
whole.searchCriteria.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/middleware/search/pt
whole.extraParam.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/middleware/search/extra/param
\ No newline at end of file
whole.extraParam.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/middleware/search/extra/param
#\u60C5\u62A5\u9884\u8B66\u5916\u90E8\u63A5\u53E3
warn.pushTask.token=AoJ0ooy3H2BpHmuaviYObTKw/Xfw/oA5aKccNYhYnoJFJQ/BgeW/
warn.project.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/brandkbs/project?projectId={1}&projectName={2}
warn.ticket.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/code?pushId={1}&taskType={2}
warn.pushRecipientsList.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/pushRecipients/{1}?taskType={2}
warn.deletePushRecipients.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/pushRecipients/?pushId={1}&recipientsId={2}&taskType={3}
warn.channel.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/brandkbs/config/channel/{1}
warn.hotEvent.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/brandkbs/config/hotEvent/{1}
warn.hotTop.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/brandkbs/config/hotTop/{1}
warn.yuQing.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/brandkbs/config/yuQing/{1}
warn.taskSwitch.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/brandkbs/enable/used
#\u9884\u8B66\u5916\u90E8\u63A5\u53E3
ef.external.filterNew.url=https://ef.zhiweidata.com/external/filterNew.do?firstTypes={1}&start={2}&end={3}
\ No newline at end of file
......@@ -39,8 +39,8 @@ es.password=3vh65l$i6qQA
es.index.test = true
#channel-index
channel.index.registry=zookeeper://192.168.0.11:2182?backup=192.168.0.30:2182,192.168.0.35:2182&timeout=60000
channel.index.consumer.group=channel-index-nb
channel.index.registry=zookeeper://192.168.0.11:2181?backup=192.168.0.30:2181,192.168.0.35:2181
channel.index.consumer.group=channel-index-local
channel.index.application.name=brandkbs2
#\u5916\u90E8\u63A5\u53E3
#qbjc.project.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/aplan/project
......@@ -81,4 +81,17 @@ istarshine.addIStarShineKSData.url=https://istarshine-service.zhiweidata.com/ist
istarshine.getIStarShineKSInfoData.url=https://istarshine-service.zhiweidata.com/istarshine/ks/getIStarShineKSInfoData?taskId={1}&appId=6183571e0d710000f6003a12
whole.search.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/middleware/search/yuqing
whole.searchCriteria.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/middleware/search/pt
whole.extraParam.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/middleware/search/extra/param
\ No newline at end of file
whole.extraParam.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/middleware/search/extra/param
#\u60C5\u62A5\u9884\u8B66\u5916\u90E8\u63A5\u53E3
warn.pushTask.token=AoJ0ooy3H2BpHmuaviYObTKw/Xfw/oA5aKccNYhYnoJFJQ/BgeW/
warn.project.url=http://192.168.0.225:11003/qbjc/pushTask/interface/brandkbs/project?projectId={1}&projectName={2}
warn.ticket.url=http://192.168.0.225:11003/qbjc/pushTask/interface/code?pushId={1}&taskType={2}
warn.pushRecipientsList.url=http://192.168.0.225:11003/qbjc/pushTask/interface/pushRecipients/{1}?taskType={2}
warn.deletePushRecipients.url=http://192.168.0.225:11003/qbjc/pushTask/interface/pushRecipients/?pushId={1}&recipientsId={2}&taskType={3}
warn.channel.url=http://192.168.0.225:11003/qbjc/pushTask/interface/brandkbs/config/channel/{1}
warn.hotEvent.url=http://192.168.0.225:11003/qbjc/pushTask/interface/brandkbs/config/hotEvent/{1}
warn.hotTop.url=http://192.168.0.225:11003/qbjc/pushTask/interface/brandkbs/config/hotTop/{1}
warn.yuQing.url=http://192.168.0.225:11003/qbjc/pushTask/interface/brandkbs/config/yuQing/{1}
warn.taskSwitch.url=http://192.168.0.225:11003/qbjc/pushTask/interface/brandkbs/enable/used
#\u9884\u8B66\u5916\u90E8\u63A5\u53E3
ef.external.filterNew.url=https://ef.zhiweidata.com/external/filterNew.do?firstTypes={1}&start={2}&end={3}
\ No newline at end of file
......@@ -79,4 +79,17 @@ istarshine.addIStarShineKSData.url=https://istarshine-service.zhiweidata.com/ist
istarshine.getIStarShineKSInfoData.url=https://istarshine-service.zhiweidata.com/istarshine/ks/getIStarShineKSInfoData?taskId={1}&appId=6183571e0d710000f6003a12
whole.search.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/middleware/search/yuqing
whole.searchCriteria.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/middleware/search/pt
whole.extraParam.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/middleware/search/extra/param
\ No newline at end of file
whole.extraParam.url=https://yuqing.zhiweidata.com/qbjcbackPhoenix/interface/middleware/search/extra/param
#\u60C5\u62A5\u9884\u8B66\u5916\u90E8\u63A5\u53E3
warn.pushTask.token=AoJ0ooy3H2BpHmuaviYObTKw/Xfw/oA5aKccNYhYnoJFJQ/BgeW/
warn.project.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/brandkbs/project?projectId={1}&projectName={2}
warn.ticket.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/code?pushId={1}&taskType={2}
warn.pushRecipientsList.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/pushRecipients/{1}?taskType={2}
warn.deletePushRecipients.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/pushRecipients/?pushId={1}&recipientsId={2}&taskType={3}
warn.channel.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/brandkbs/config/channel/{1}
warn.hotEvent.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/brandkbs/config/hotEvent/{1}
warn.hotTop.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/brandkbs/config/hotTop/{1}
warn.yuQing.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/brandkbs/config/yuQing/{1}
warn.taskSwitch.url=https://auto-push.zhiweidata.com/qbjc/pushTask/interface/brandkbs/enable/used
#\u9884\u8B66\u5916\u90E8\u63A5\u53E3
ef.external.filterNew.url=https://ef.zhiweidata.com/external/filterNew.do?firstTypes={1}&start={2}&end={3}
\ No newline at end of file
package com.zhiwei.brandkbs2;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class BrandkbsIndexCreateTest {
private static final Logger log = LogManager.getLogger(BrandkbsIndexCreateTest.class);
@Resource(name = "esClient")
RestHighLevelClient esClient;
@Test
public void test1() throws IOException {
String channelIndex = "brandkbs2_channel_record_2023";
// String brandkbsIndex = "brandkbs2_2022";
// putChannelIndex(channelIndex);
// putBrandkbsIndex("brandkbs2_2018","brandkbs2_2019","brandkbs2_2020","brandkbs2_2021");
putBrandkbsIndex("brandkbs2_2017");
}
public void putChannelIndex(String... indexes) throws IOException {
for (String index : indexes) {
CreateIndexRequest createIndexRequest = new CreateIndexRequest(index);
// 设置分片和副本
createIndexRequest.settings(Settings.builder().put("number_of_shards", "7").put("number_of_replicas", "1"));
Map<String, Object> properties = new HashMap<>();
builder(properties, "long", "article_count", false);
builder(properties, "text", "channel_fid", true);
builder(properties, "text", "channel_id", true);
builder(properties, "text", "contend_id", true);
builder(properties, "integer", "emotion", false);
builder(properties, "float", "emotion_index", false);
builder(properties, "text", "key", true);
builder(properties, "text", "linked_group_id", true);
builder(properties, "keyword", "platform_id", false);
builder(properties, "text", "project_id", true);
builder(properties, "long", "range_end_time", false);
builder(properties, "long", "range_start_time", false);
builder(properties, "keyword", "real_source", false);
builder(properties, "integer", "shards", false);
builder(properties, "keyword", "source", false);
recordCache(properties);
Map<String, Object> mapping = new HashMap<>();
mapping.put("properties", properties);
createIndexRequest.mapping(mapping);
//设置超时时间 分钟
createIndexRequest.setTimeout(TimeValue.timeValueMinutes(1));
//设置主节点超时时间
createIndexRequest.setMasterTimeout(TimeValue.timeValueMinutes(1));
esClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
log.info("索引:{}已创建", index);
}
}
public void putBrandkbsIndex(String... indexes) throws IOException {
for (String index : indexes) {
CreateIndexRequest createIndexRequest = new CreateIndexRequest(index);
// 设置分片和副本
createIndexRequest.settings(Settings.builder().put("number_of_shards", "7").put("number_of_replicas", "1"));
Map<String, Object> properties = new HashMap<>();
builder(properties, "text", "agg_title", true);
builder(properties, "text", "answer_avatar_url", true);
builder(properties, "long", "answer_comment_num", false);
builder(properties, "text", "answer_ip_location", true);
builder(properties, "long", "answer_like_num", false);
builder(properties, "long", "answer_read_num", false);
builder(properties, "long", "answer_time", false);
builder(properties, "text", "answer_uid", true);
builder(properties, "text", "answer_url", true);
builder(properties, "text", "answer_user_url", true);
builder(properties, "text", "answer_username", true);
builder(properties, "text", "app_name", true);
builder(properties, "text", "avatar_url", true);
brandkbsMapCache(properties);
brandkbsMarkCache(properties);
markMapCache(properties);
builder(properties, "integer", "c1", false);
builder(properties, "integer", "c2", false);
builder(properties, "integer", "c3", false);
builder(properties, "integer", "c4", false);
builder(properties, "integer", "c5", false);
builder(properties, "text", "ccid", true);
builder(properties, "text", "channel", true);
builder(properties, "long", "channel_followers_num", false);
builder(properties, "float", "channel_influence", false);
builder(properties, "text", "channel_tag", true);
builder(properties, "long", "cid", false);
builder(properties, "text", "cname", true);
builder(properties, "text", "columns", true);
builder(properties, "long", "comment_num", false);
builder(properties, "text", "company", true);
builder(properties, "long", "created_at", false);
builder(properties, "long", "ctime", false);
builder(properties, "text", "description", true);
builder(properties, "text", "editor", true);
builder(properties, "long", "favourites_num", false);
builder(properties, "long", "followers_num", false);
builder(properties, "integer", "foreign", false);
builder(properties, "long", "forward_num", false);
builder(properties, "long", "friends_num", false);
builder(properties, "text", "gender", true);
builder(properties, "long", "gid", false);
builder(properties, "text", "host", true);
builder(properties, "text", "id", true);
builder(properties, "text", "ind_content", true);
builder(properties, "text", "ind_full_text", true);
builder(properties, "text", "ind_title", true);
builder(properties, "text", "ip_location", true);
builder(properties, "boolean", "is_forward", false);
builder(properties, "text", "length", true);
builder(properties, "long", "like_num", false);
builder(properties, "text", "location", true);
builder(properties, "long", "mgid", false);
builder(properties, "text", "mgroup", true);
builder(properties, "text", "mid", true);
builder(properties, "text", "mperson", true);
builder(properties, "text", "mtag", true);
builder(properties, "long", "mtime", false);
builder(properties, "text", "mupdate", true);
builder(properties, "text", "mupdate_two", true);
builder(properties, "text", "origin", true);
builder(properties, "text", "pic_urls", true);
builder(properties, "keyword", "platform_id", false);
builder(properties, "long", "play_num", false);
builder(properties, "text", "position", true);
builder(properties, "long", "post_num", false);
builder(properties, "long", "question_answer_num", false);
builder(properties, "text", "question_avatar_url", true);
builder(properties, "long", "question_comment_num", false);
builder(properties, "long", "question_followers_num", false);
builder(properties, "text", "question_id", true);
builder(properties, "text", "question_ip_location", true);
builder(properties, "long", "question_like_num", false);
builder(properties, "long", "question_read_num", false);
builder(properties, "long", "question_time", false);
builder(properties, "text", "question_uid", true);
builder(properties, "text", "question_url", true);
builder(properties, "text", "question_username", true);
builder(properties, "long", "read_num", false);
builder(properties, "text", "real_name", true);
builder(properties, "keyword", "real_source", false);
builder(properties, "long", "reply_num", false);
builder(properties, "text", "reporter", true);
builder(properties, "text", "root_app_name", true);
builder(properties, "text", "root_avatar_url", true);
builder(properties, "long", "root_comment_num", false);
builder(properties, "long", "root_created_at", false);
builder(properties, "text", "root_description", true);
builder(properties, "long", "root_favourites_num", false);
builder(properties, "long", "root_followers_num", false);
builder(properties, "long", "root_forward_num", false);
builder(properties, "long", "root_friends_num", false);
builder(properties, "text", "root_gender", true);
builder(properties, "text", "root_ip_location", true);
builder(properties, "long", "root_like_num", false);
builder(properties, "text", "root_location", true);
builder(properties, "text", "root_mid", true);
builder(properties, "text", "root_pic_urls", true);
builder(properties, "long", "root_post_num", false);
builder(properties, "long", "root_read_num", false);
builder(properties, "long", "root_reply_num", false);
builder(properties, "text", "root_screen_name", true);
builder(properties, "text", "root_source", true);
builder(properties, "long", "root_time", false);
builder(properties, "text", "root_uid", true);
builder(properties, "text", "root_url", true);
builder(properties, "boolean", "root_verified", false);
builder(properties, "text", "root_verified_reason", true);
builder(properties, "text", "root_vtype", true);
builder(properties, "text", "screen_name", true);
builder(properties, "long", "share_num", false);
builder(properties, "keyword", "source", false);
builder(properties, "long", "stime", false);
builder(properties, "long", "time", false);
builder(properties, "text", "top_domain", true);
builder(properties, "text", "uid", true);
builder(properties, "text", "user_id", true);
builder(properties, "boolean", "verified", false);
builder(properties, "text", "video_urls", true);
builder(properties, "text", "verified_reason", true);
builder(properties, "long", "vtype", false);
Map<String, Object> mapping = new HashMap<>();
mapping.put("properties", properties);
createIndexRequest.mapping(mapping);
//设置超时时间 分钟
createIndexRequest.setTimeout(TimeValue.timeValueMinutes(1));
//设置主节点超时时间
createIndexRequest.setMasterTimeout(TimeValue.timeValueMinutes(1));
esClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
log.info("索引:{}已创建", index);
}
}
public static void recordCache(Map<String, Object> properties) {
Map<String, Object> message = new HashMap<>();
Map<String, Object> obj2 = new HashMap<>();
builder(obj2, "integer", "emotion", false);
builder(obj2, "text", "id", true);
builder(obj2, "long", "mtime", false);
builder(obj2, "long", "time", false);
builder(obj2, "long", "last_time", false);
message.put("properties", obj2);
properties.put("mark_cache_maps", message);
}
public static void markMapCache(Map<String, Object> properties) {
Map<String, Object> message = new HashMap<>();
Map<String, Object> obj2 = new HashMap<>();
builder(obj2, "long", "group_id", false);
builder(obj2, "long", "id", false);
builder(obj2, "text", "group_name", true);
builder(obj2, "text", "mgroup", true);
builder(obj2, "text", "name", true);
builder(obj2, "text", "unique_id", true);
message.put("properties", obj2);
properties.put("mark_cache_maps", message);
}
public static void brandkbsMarkCache(Map<String, Object> properties) {
Map<String, Object> message = new HashMap<>();
Map<String, Object> obj2 = new HashMap<>();
builder(obj2, "long", "group_id", false);
builder(obj2, "text", "group_name", true);
builder(obj2, "long", "id", false);
builder(obj2, "text", "mgroup", true);
builder(obj2, "text", "name", true);
builder(obj2, "text", "unique_id", true);
message.put("properties", obj2);
properties.put("brandkbs_mark_cache_maps", message);
}
public static void brandkbsMapCache(Map<String, Object> properties) {
Map<String, Object> message = new HashMap<>();
Map<String, Object> obj2 = new HashMap<>();
builder(obj2, "integer", "channel_emotion", false);
builder(obj2, "text", "channel_id", true);
builder(obj2, "text", "channel_type", true);
builder(obj2, "text", "contend_id", true);
builder(obj2, "text", "key", true);
builder(obj2, "text", "linked_group_id", true);
builder(obj2, "text", "project_id", true);
message.put("properties", obj2);
// 设置为nested类型,支持文档独立索引
message.put("type", "nested");
properties.put("brandkbs_cache_maps", message);
}
public static void builder(Map<String, Object> properties, String type, String key, boolean fields) {
if (fields && !"text".equals(type)) {
throw new RuntimeException("mapping-builder错误");
}
Map<String, Object> message = new HashMap<>();
message.put("type", type);
if (fields) {
message.put("fields", fields());
}
properties.put(key, message);
}
public static Map<String, Object> fields() {
Map<String, Object> res = new HashMap<>();
Map<String, Object> keyword = new HashMap<>();
keyword.put("type", "keyword");
keyword.put("ignore_above", 256);
res.put("keyword", keyword);
return res;
}
}
package com.zhiwei.brandkbs2;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.pojo.UserInfo;
import com.zhiwei.brandkbs2.pojo.vo.ChannelListVO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.service.ChannelService;
import org.junit.Test;
import org.junit.runner.RunWith;
......@@ -12,7 +9,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.security.PublicKey;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
......@@ -25,7 +21,7 @@ public class ChannelServiceTest {
@Test
public void getActiveChannelListTest(){
List<ChannelListVO> activeChannelList =
channelService.getActiveChannelList("0", null, null, null, null, 50);
channelService.getActiveChannelList("0", null, null, null, null, 50,true);
for (ChannelListVO channelListVO : activeChannelList) {
System.out.println(channelListVO);
}
......@@ -34,7 +30,7 @@ public class ChannelServiceTest {
@Test
public void getPositiveListTest(){
List<ChannelListVO> positiveList =
channelService.getPositiveList("0", null, null, "{\"index\":\"descend\"}", null, null, 50);
channelService.getPositiveList("0", null, null, "{\"index\":\"descend\"}", null, null, 50,true);
for (ChannelListVO channelListVO : positiveList) {
System.out.println(channelListVO);
}
......@@ -43,7 +39,7 @@ public class ChannelServiceTest {
@Test
public void getNegativeListTest(){
List<ChannelListVO> negativeList =
channelService.getNegativeList("0", null, null, "{\"index\":\"descend\"}", null, null, 50);
channelService.getNegativeList("0", null, null, "{\"index\":\"descend\"}", null, null, 50,true);
for (ChannelListVO channelListVO : negativeList) {
System.out.println(channelListVO);
}
......
package com.zhiwei.brandkbs2;
import com.alibaba.fastjson.JSONObject;
import com.sun.media.sound.SoftTuning;
import com.zhiwei.brandkbs2.enmus.EmotionEnum;
import com.zhiwei.brandkbs2.pojo.BaseMap;
import com.zhiwei.brandkbs2.pojo.Event;
import com.zhiwei.brandkbs2.pojo.MarkFlowEntity;
......@@ -9,7 +9,6 @@ import com.zhiwei.brandkbs2.pojo.dto.MarkSearchDTO;
import com.zhiwei.brandkbs2.pojo.dto.SearchFilterDTO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.service.MarkDataService;
import org.checkerframework.checker.units.qual.K;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -204,9 +203,15 @@ public class MarkDataServiceTest {
@Test
public void getEsTopSourceTest() throws IOException {
List<Map<String, Object>> esTopSource = markDataService.getEsTopSource(1658073600000L, 1661727700000L, "62beadd1bbf8eb20f96d2f2e", "136", "0", null, 5);
List<Map<String, Object>> esTopSource = markDataService.getEsTopSource(1663516800000L, 1666108800000L, "62beadd1bbf8eb20f96d2f1a", "25", "0",
EmotionEnum.POSITIVE.getName(), 3);
for (Map<String, Object> stringObjectMap : esTopSource) {
System.out.println(stringObjectMap.entrySet());
}
List<Map<String, Object>> esTopSource2 = markDataService.getEsTopSource(1663516800000L, 1666108800000L, "62beadd1bbf8eb20f96d2f1a", "25", "0",
EmotionEnum.NEGATIVE.getName(), 3);
for (Map<String, Object> stringObjectMap : esTopSource2) {
System.out.println(stringObjectMap.entrySet());
}
}
}
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