Commit 38564d67 by shenjunjie

Merge branch 'feature' into 'dev'

2022/11/14 18:12

See merge request !81
parents ae71fabd 33a5d9dc
...@@ -88,7 +88,8 @@ public class RedisKeyPrefix { ...@@ -88,7 +88,8 @@ public class RedisKeyPrefix {
*/ */
public static final String PROJECT_WARN_HOT_TOP = "BRANDKBS:HOT_TOP:"; public static final String PROJECT_WARN_HOT_TOP = "BRANDKBS:HOT_TOP:";
public static final String PROJECT_WARN_NEW_CASE = "BRANDKBS:NEW_CASE:"; public static final String PROJECT_WARN_NEW_CASE_LIST = "BRANDKBS:NEW_CASE:LIST_";
public static final String PROJECT_WARN_NEW_CASE_CURSOR = "BRANDKBS:NEW_CASE:CURSOR:";
public static String projectWarnHotTopKeyAll(String projectId, String type) { public static String projectWarnHotTopKeyAll(String projectId, String type) {
return RedisKeyPrefix.generateRedisKey(RedisKeyPrefix.PROJECT_WARN_HOT_TOP, projectId, Tools.concat(type, "*")); return RedisKeyPrefix.generateRedisKey(RedisKeyPrefix.PROJECT_WARN_HOT_TOP, projectId, Tools.concat(type, "*"));
......
package com.zhiwei.brandkbs2.pojo.external; package com.zhiwei.brandkbs2.pojo.external;
import com.zhiwei.brandkbs2.pojo.vo.CrisisCaseWarnVO;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
...@@ -39,6 +41,26 @@ public class BrandkbsNewCaseWarn { ...@@ -39,6 +41,26 @@ public class BrandkbsNewCaseWarn {
* 案例类别 * 案例类别
*/ */
private String caseType; private String caseType;
/**
* 分享链接
*/
private String url;
public static NewCase createFromCrisisCaseWarnVO(CrisisCaseWarnVO vo, String url) {
NewCase newCase = new NewCase();
newCase.setTitle(vo.getEventName());
List<String> tagList = new ArrayList<>();
tagList.add(vo.getPriBrand());
tagList.addAll(vo.getPriCrisisTags());
newCase.setTagList(tagList);
newCase.setContent(vo.getIntroduction());
newCase.setSpreadIndex(vo.getInterveneScore());
newCase.setCaseType(vo.getCategory());
newCase.setUrl(url);
return newCase;
}
} }
} }
...@@ -14,7 +14,7 @@ public class CrisisCaseWarnVO { ...@@ -14,7 +14,7 @@ public class CrisisCaseWarnVO {
/** /**
* id * id
*/ */
private String id; private int id;
/** /**
* 事件名 * 事件名
...@@ -42,4 +42,10 @@ public class CrisisCaseWarnVO { ...@@ -42,4 +42,10 @@ public class CrisisCaseWarnVO {
* 公关传播效果指数 * 公关传播效果指数
*/ */
private Double interveneScore; private Double interveneScore;
/**
* 案例类别
*/
private String category;
} }
...@@ -142,6 +142,7 @@ public class MarkFlowServiceImpl implements MarkFlowService { ...@@ -142,6 +142,7 @@ public class MarkFlowServiceImpl implements MarkFlowService {
} }
double channelValue = tJson.getDoubleValue(GenericAttribute.ES_CHANNEL_INFLUENCE); double channelValue = tJson.getDoubleValue(GenericAttribute.ES_CHANNEL_INFLUENCE);
if (channelValue > 0) { if (channelValue > 0) {
// 保留两位小数
sourceDetails.put("channelInfluence", new BigDecimal(channelValue).setScale(2, RoundingMode.UP)); sourceDetails.put("channelInfluence", new BigDecimal(channelValue).setScale(2, RoundingMode.UP));
} }
return sourceDetails; return sourceDetails;
......
...@@ -55,6 +55,12 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -55,6 +55,12 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
@Value("${hot.search.url}") @Value("${hot.search.url}")
private String hotSearchUrl; private String hotSearchUrl;
@Value("${crisis.share.url}")
private String crisisEventShareUrl;
@Value("${crisis.event.url}")
private String crisisEventUrl;
@Autowired @Autowired
private RestTemplate restTemplate; private RestTemplate restTemplate;
...@@ -199,58 +205,6 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -199,58 +205,6 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
return ResponseResult.success(); 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}));
helper.setPostFilter(postFilter);
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) { private BrandkbsWarnTemplate brandkbsWarnTemplate4Yuqing(BrandkbsYuQingConfig config, List<BaseMap> datas, long start, long end, AbstractProject project) {
if (datas.isEmpty()) { if (datas.isEmpty()) {
return null; return null;
...@@ -298,78 +252,6 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -298,78 +252,6 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
return new BrandkbsWarnTemplate(firstCount, key1, key2, key3, key4, new BrandkbsYuQingWarn(collect)); return new BrandkbsWarnTemplate(firstCount, key1, key2, key3, key4, new BrandkbsYuQingWarn(collect));
} }
private 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);
helper.setPostFilter(postFilter);
// 搜索结果
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) { private BrandkbsWarnTemplate brandkbsWarnTemplate4Channel(BrandkbsChannelConfig config, List<BaseMap> datas, long start, long end, AbstractProject project) {
if (datas.isEmpty()) { if (datas.isEmpty()) {
return null; return null;
...@@ -406,51 +288,6 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -406,51 +288,6 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
return new BrandkbsWarnTemplate(firstCount, key1, key2, key3, key4, new BrandkbsYuQingWarn(collect)); return new BrandkbsWarnTemplate(firstCount, key1, key2, key3, key4, new BrandkbsYuQingWarn(collect));
} }
private 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();
eventTag.put("事件类型", zhiweiEvent.getString("type"));
event.setEventTag(eventTag);
event.setTotalDisseminationVolume(zhiweiEvent.getLong("allCount"));
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 BrandkbsWarnTemplate brandkbsWarnTemplate4HotEvent(BrandkbsHotEventConfig config, Map<String, List<Event>> eventMap, long start, long end, AbstractProject project) { 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(); int firstCount = eventMap.values().stream().mapToInt(List::size).sum();
if (firstCount == 0) { if (firstCount == 0) {
...@@ -483,26 +320,6 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -483,26 +320,6 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
return new BrandkbsWarnTemplate(firstCount, key1, key2, key3, key4, new BrandkbsHotEventWarn(collect)); return new BrandkbsWarnTemplate(firstCount, key1, key2, key3, key4, new BrandkbsHotEventWarn(collect));
} }
private ResponseResult hotTopWaring(String projectId, BrandkbsHotTopConfig config) {
Project project = projectService.getProjectById(projectId);
long end = System.currentTimeMillis();
long start = end - config.getPushInterval();
try {
log.info("获取上榜热搜预警开始,project:{}", project.getProjectName());
if (null == config.getListType()) {
return ResponseResult.success(null);
}
// 根据配置榜单类型
List<BrandkbsHotTopWarn.HotTop> resList = new ArrayList<>();
config.getListType().forEach(type -> resList.addAll(getHotTopList(config, projectId, getRankListByType(type), type)));
log.info("获取上榜热搜预警结束,project:{}", project.getProjectName());
return ResponseResult.success(brandkbsWarnTemplate4HotTop(config, resList, start, end, project));
} catch (Exception e) {
log.info("获取上榜热搜预警失败,project:{}", project.getProjectName(), e);
}
return ResponseResult.failure("获取上榜热搜预警失败");
}
private BrandkbsWarnTemplate brandkbsWarnTemplate4HotTop(BrandkbsHotTopConfig config, List<BrandkbsHotTopWarn.HotTop> datas, long start, long end, private BrandkbsWarnTemplate brandkbsWarnTemplate4HotTop(BrandkbsHotTopConfig config, List<BrandkbsHotTopWarn.HotTop> datas, long start, long end,
AbstractProject project) { AbstractProject project) {
if (CollectionUtils.isEmpty(datas)) { if (CollectionUtils.isEmpty(datas)) {
...@@ -553,6 +370,30 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -553,6 +370,30 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
return new BrandkbsWarnTemplate(datas.size(), key1, key2, key3, key4, new BrandkbsHotTopWarn(config.getWarnKeyword(), config.getFilterKeyword(), datas)); return new BrandkbsWarnTemplate(datas.size(), key1, key2, key3, key4, new BrandkbsHotTopWarn(config.getWarnKeyword(), config.getFilterKeyword(), datas));
} }
private BrandkbsWarnTemplate brandkbsWarnTemplate4NewCase(List<BrandkbsNewCaseWarn.NewCase> datas, Long time, Project project) {
if (CollectionUtils.isEmpty(datas)) {
return null;
}
int firstCount = datas.size();
String key1 = "【品见】案例上新-" + project.getProjectName();
String key2 = null;
String key3 = Constant.SPEC_MINUTE_FORMAT.format(time);
// key4
String key4;
StringBuilder keyBuilder4 = new StringBuilder();
for (int i = 0; i < 2; i++) {
BrandkbsNewCaseWarn.NewCase newCase = datas.get(i);
String title = newCase.getTitle();
keyBuilder4.append(title).append("/r/n");
}
if (datas.size() > 2) {
key4 = keyBuilder4.append("...").toString();
} else {
key4 = keyBuilder4.substring(0, keyBuilder4.length() - 4);
}
return new BrandkbsWarnTemplate(firstCount, key1, key2, key3, key4, new BrandkbsNewCaseWarn(datas));
}
private List<JSONObject> getRankListByType(String type) { private List<JSONObject> getRankListByType(String type) {
String search = TYPE_SEARCH.get(type); String search = TYPE_SEARCH.get(type);
if (null == search) { if (null == search) {
...@@ -702,140 +543,241 @@ public class ProjectWarnServiceImpl implements ProjectWarnService { ...@@ -702,140 +543,241 @@ public class ProjectWarnServiceImpl implements ProjectWarnService {
return new ArrayList<>(duplicateMap.values()); 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 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 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 @Override
public ResponseResult getYuqingWaring(String projectId, BrandkbsYuQingConfig config) { public ResponseResult getYuqingWaring(String projectId, BrandkbsYuQingConfig config) {
// return ResponseResult.success(getWarnTemplate(new BrandkbsYuQingWarn(Arrays.asList(getBaseMapCompoundTemplate(), getBaseMapCompoundTemplate(), Project project = null;
// getBaseMapCompoundTemplate(), getBaseMapCompoundTemplate(), getBaseMapCompoundTemplate())))); long end = System.currentTimeMillis();
return yuqingWaringReal(projectId, config); 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}));
helper.setPostFilter(postFilter);
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("获取舆情动态预警失败");
} }
@Override @Override
public ResponseResult getChannelWaring(String projectId, BrandkbsChannelConfig config) { public ResponseResult getChannelWaring(String projectId, BrandkbsChannelConfig config) {
// return ResponseResult.success(getWarnTemplate(new BrandkbsChannelWarn(Arrays.asList(getBaseMapCompoundTemplate(), getBaseMapCompoundTemplate(), Project project = null;
// getBaseMapCompoundTemplate(), getBaseMapCompoundTemplate(), getBaseMapCompoundTemplate()), "敏感渠道(敏感指数>70)"))); long end = System.currentTimeMillis();
return channelWarnReal(projectId, config); 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);
helper.setPostFilter(postFilter);
// 搜索结果
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("获取渠道参与预警失败");
} }
@Override @Override
public ResponseResult getHotEventWaring(String projectId, BrandkbsHotEventConfig config) { public ResponseResult getHotEventWaring(String projectId, BrandkbsHotEventConfig config) {
// return ResponseResult.success(getWarnTemplate(new BrandkbsHotEventWarn(Arrays.asList(getHotEventTemplate(), getHotEventTemplate(), Project project = projectService.getProjectById(projectId);
// getHotEventTemplate(), getHotEventTemplate(), getHotEventTemplate())))); long end = System.currentTimeMillis();
return hotEventWaring(projectId, config); 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();
eventTag.put("事件类型", zhiweiEvent.getString("type"));
event.setEventTag(eventTag);
event.setTotalDisseminationVolume(zhiweiEvent.getLong("allCount"));
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("获取热点事件预警失败");
} }
@Override @Override
public ResponseResult getHotTopWaring(String projectId, BrandkbsHotTopConfig config) { public ResponseResult getHotTopWaring(String projectId, BrandkbsHotTopConfig config) {
// return ResponseResult.success(getWarnTemplate(new BrandkbsHotTopWarn("阿里", "腾讯", Arrays.asList(getHotTopTemplate(), getHotTopTemplate(), Project project = projectService.getProjectById(projectId);
// getHotTopTemplate(), getHotTopTemplate(), getHotTopTemplate())))); long end = System.currentTimeMillis();
return hotTopWaring(projectId, config); long start = end - config.getPushInterval();
try {
log.info("获取上榜热搜预警开始,project:{}", project.getProjectName());
if (null == config.getListType()) {
return ResponseResult.success(null);
}
// 根据配置榜单类型
List<BrandkbsHotTopWarn.HotTop> resList = new ArrayList<>();
config.getListType().forEach(type -> resList.addAll(getHotTopList(config, projectId, getRankListByType(type), type)));
log.info("获取上榜热搜预警结束,project:{}", project.getProjectName());
return ResponseResult.success(brandkbsWarnTemplate4HotTop(config, resList, start, end, project));
} catch (Exception e) {
log.info("获取上榜热搜预警失败,project:{}", project.getProjectName(), e);
}
return ResponseResult.failure("获取上榜热搜预警失败");
} }
@Override @Override
public ResponseResult getNewCaseWaring(String projectId) { public ResponseResult getNewCaseWaring(String projectId) {
// return ResponseResult.success(getWarnTemplate(new BrandkbsNewCaseWarn(Arrays.asList(getNewCaseWarn(), getNewCaseWarn(), getNewCaseWarn(), Project project = projectService.getProjectById(projectId);
// getNewCaseWarn(), getNewCaseWarn())))); try {
// TODO long time = System.currentTimeMillis();
return ResponseResult.success(null); log.info("获取案例上新预警开始,project:{}", project.getProjectName());
String cursorKey = RedisUtil.getNewCrisisCaseCursor(projectId);
String cursor = redisUtil.get(cursorKey);
Set<String> keys = redisUtil.keys(RedisUtil.getNewCrisisCaseListAllKey());
int recordCursor = null == cursor ? 0 : Integer.parseInt(cursor);
List<BrandkbsNewCaseWarn.NewCase> resList = new ArrayList<>();
for (String key : keys) {
CrisisCaseWarnVO crisisCaseWarnVO = JSON.parseObject(redisUtil.get(key), CrisisCaseWarnVO.class);
// 符合条件并记录游标
if (recordCursor < crisisCaseWarnVO.getId()) {
recordCursor = crisisCaseWarnVO.getId();
resList.add(BrandkbsNewCaseWarn.NewCase.createFromCrisisCaseWarnVO(crisisCaseWarnVO,
getCrisisEventUrlByCrisisEventId(crisisCaseWarnVO.getId())));
}
}
BrandkbsWarnTemplate brandkbsWarnTemplate = brandkbsWarnTemplate4NewCase(resList, time, project);
redisUtil.set(cursorKey, String.valueOf(recordCursor));
log.info("获取案例上新预警结束,project:{}", project.getProjectName());
return ResponseResult.success(brandkbsWarnTemplate);
} catch (Exception e) {
log.info("获取案例上新预警异常,project:{}", project.getProjectName());
}
return ResponseResult.failure("获取案例上新预警失败");
} }
@Override @Override
public void newCrisisCaseWarn(CrisisCaseWarnVO caseWarnVO) { public void newCrisisCaseWarn(CrisisCaseWarnVO caseWarnVO) {
// 存入redis缓存 // 存入redis缓存
String listKey = RedisUtil.getNewCrisisCaseListKey(); String listKey = RedisUtil.getNewCrisisCaseListKey(String.valueOf(caseWarnVO.getId()));
redisUtil.setExpire(listKey, JSON.toJSONString(caseWarnVO), Constant.ONE_DAY * 7, TimeUnit.DAYS);
}
private String getCrisisEventUrlByCrisisEventId(int id) {
ResponseEntity<String> forEntity = restTemplate.getForEntity(crisisEventShareUrl, String.class, id);
JSONObject jsonObject = JSON.parseObject(forEntity.getBody());
String share = jsonObject.getJSONObject("data").getString("share");
return crisisEventUrl.replace("{1}", String.valueOf(id)).replace("{2}", share);
} }
public static class CriteriaHelper { public static class CriteriaHelper {
......
...@@ -57,8 +57,16 @@ public class RedisUtil { ...@@ -57,8 +57,16 @@ public class RedisUtil {
return RedisKeyPrefix.CHANNEL_RECORD_LIST + Tools.concat(projectId, startTime, endTime); return RedisKeyPrefix.CHANNEL_RECORD_LIST + Tools.concat(projectId, startTime, endTime);
} }
public static String getNewCrisisCaseListKey() { public static String getNewCrisisCaseListAllKey() {
return RedisKeyPrefix.PROJECT_WARN_NEW_CASE + "LIST"; return RedisKeyPrefix.PROJECT_WARN_NEW_CASE_LIST + "*";
}
public static String getNewCrisisCaseListKey(String id) {
return RedisKeyPrefix.PROJECT_WARN_NEW_CASE_LIST + id;
}
public static String getNewCrisisCaseCursor(String projectId) {
return RedisKeyPrefix.PROJECT_WARN_NEW_CASE_CURSOR + projectId;
} }
public void setExpire(String key, String value, long timeout, TimeUnit unit) { public void setExpire(String key, String value, long timeout, TimeUnit unit) {
......
...@@ -885,6 +885,9 @@ public class Tools { ...@@ -885,6 +885,9 @@ public class Tools {
} }
public static boolean isExclusive(String keyword, String content) { public static boolean isExclusive(String keyword, String content) {
if (null == keyword) {
return true;
}
return isExclusive(Arrays.asList(keyword.split("\\|")), content); return isExclusive(Arrays.asList(keyword.split("\\|")), content);
} }
......
...@@ -64,6 +64,7 @@ crisis.top3.url=https://crisis.zhiweidata.com/app/brandkbs/event/online-top3 ...@@ -64,6 +64,7 @@ crisis.top3.url=https://crisis.zhiweidata.com/app/brandkbs/event/online-top3
crisis.searchCriteria.url=https://crisis.zhiweidata.com/app/brandkbs/condition crisis.searchCriteria.url=https://crisis.zhiweidata.com/app/brandkbs/condition
crisis.list.url=https://crisis.zhiweidata.com/app/brandkbs/crisisList?page={1}&size={2}&startTime={3}&endTime={4}&category={5} crisis.list.url=https://crisis.zhiweidata.com/app/brandkbs/crisisList?page={1}&size={2}&startTime={3}&endTime={4}&category={5}
crisis.share.url=https://crisis.zhiweidata.com/app/brandkbs/share/{1} crisis.share.url=https://crisis.zhiweidata.com/app/brandkbs/share/{1}
crisis.event.url =https://crisis.zhiweidata.com/event/{1}/general?share={2}
#\u70ED\u70B9\u5E93\u5916\u90E8\u63A5\u53E3 #\u70ED\u70B9\u5E93\u5916\u90E8\u63A5\u53E3
trends.longTimeInListSearchByInner.url=https://trends.zhiweidata.com/hotSearchTrend/inner/longTimeInListSearchByInner?sortType={1}&type={2} trends.longTimeInListSearchByInner.url=https://trends.zhiweidata.com/hotSearchTrend/inner/longTimeInListSearchByInner?sortType={1}&type={2}
trends.findHotSearchESDataInTimeByInner.url=https://hotsearch-manage.zhiweidata.com/hotsearch/hotSearch/findHotSearchESDataInTimeByInner?limit={1}&page={2}&type={3}&word={4} trends.findHotSearchESDataInTimeByInner.url=https://hotsearch-manage.zhiweidata.com/hotsearch/hotSearch/findHotSearchESDataInTimeByInner?limit={1}&page={2}&type={3}&word={4}
......
...@@ -66,6 +66,7 @@ crisis.top3.url=https://crisis.zhiweidata.com/app/brandkbs/event/online-top3 ...@@ -66,6 +66,7 @@ crisis.top3.url=https://crisis.zhiweidata.com/app/brandkbs/event/online-top3
crisis.searchCriteria.url=https://crisis.zhiweidata.com/app/brandkbs/condition crisis.searchCriteria.url=https://crisis.zhiweidata.com/app/brandkbs/condition
crisis.list.url=https://crisis.zhiweidata.com/app/brandkbs/crisisList?page={1}&size={2}&startTime={3}&endTime={4}&category={5} crisis.list.url=https://crisis.zhiweidata.com/app/brandkbs/crisisList?page={1}&size={2}&startTime={3}&endTime={4}&category={5}
crisis.share.url=https://crisis.zhiweidata.com/app/brandkbs/share/{1} crisis.share.url=https://crisis.zhiweidata.com/app/brandkbs/share/{1}
crisis.event.url =https://crisis.zhiweidata.com/event/{1}/general?share={2}
#\u70ED\u70B9\u5E93\u5916\u90E8\u63A5\u53E3 #\u70ED\u70B9\u5E93\u5916\u90E8\u63A5\u53E3
trends.longTimeInListSearchByInner.url=https://trends.zhiweidata.com/hotSearchTrend/inner/longTimeInListSearchByInner?sortType={1}&type={2} trends.longTimeInListSearchByInner.url=https://trends.zhiweidata.com/hotSearchTrend/inner/longTimeInListSearchByInner?sortType={1}&type={2}
trends.findHotSearchESDataInTimeByInner.url=https://hotsearch-manage.zhiweidata.com/hotsearch/hotSearch/findHotSearchESDataInTimeByInner?limit={1}&page={2}&type={3}&word={4} trends.findHotSearchESDataInTimeByInner.url=https://hotsearch-manage.zhiweidata.com/hotsearch/hotSearch/findHotSearchESDataInTimeByInner?limit={1}&page={2}&type={3}&word={4}
......
...@@ -64,6 +64,7 @@ crisis.top3.url=https://crisis.zhiweidata.com/app/brandkbs/event/online-top3 ...@@ -64,6 +64,7 @@ crisis.top3.url=https://crisis.zhiweidata.com/app/brandkbs/event/online-top3
crisis.searchCriteria.url=https://crisis.zhiweidata.com/app/brandkbs/condition crisis.searchCriteria.url=https://crisis.zhiweidata.com/app/brandkbs/condition
crisis.list.url=https://crisis.zhiweidata.com/app/brandkbs/crisisList?page={1}&size={2}&startTime={3}&endTime={4}&category={5} crisis.list.url=https://crisis.zhiweidata.com/app/brandkbs/crisisList?page={1}&size={2}&startTime={3}&endTime={4}&category={5}
crisis.share.url=https://crisis.zhiweidata.com/app/brandkbs/share/{1} crisis.share.url=https://crisis.zhiweidata.com/app/brandkbs/share/{1}
crisis.event.url =https://crisis.zhiweidata.com/event/{1}/general?share={2}
#\u70ED\u70B9\u5E93\u5916\u90E8\u63A5\u53E3 #\u70ED\u70B9\u5E93\u5916\u90E8\u63A5\u53E3
trends.longTimeInListSearchByInner.url=https://trends.zhiweidata.com/hotSearchTrend/inner/longTimeInListSearchByInner?sortType={1}&type={2} trends.longTimeInListSearchByInner.url=https://trends.zhiweidata.com/hotSearchTrend/inner/longTimeInListSearchByInner?sortType={1}&type={2}
trends.findHotSearchESDataInTimeByInner.url=https://hotsearch-manage.zhiweidata.com/hotsearch/hotSearch/findHotSearchESDataInTimeByInner?limit={1}&page={2}&type={3}&word={4} trends.findHotSearchESDataInTimeByInner.url=https://hotsearch-manage.zhiweidata.com/hotsearch/hotSearch/findHotSearchESDataInTimeByInner?limit={1}&page={2}&type={3}&word={4}
......
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