Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
B
brandkbs2
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
shenjunjie
brandkbs2
Commits
38564d67
Commit
38564d67
authored
Nov 14, 2022
by
shenjunjie
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'feature' into 'dev'
2022/11/14 18:12 See merge request
!81
parents
ae71fabd
33a5d9dc
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
290 additions
and
304 deletions
+290
-304
src/main/java/com/zhiwei/brandkbs2/common/RedisKeyPrefix.java
+2
-1
src/main/java/com/zhiwei/brandkbs2/pojo/external/BrandkbsNewCaseWarn.java
+22
-0
src/main/java/com/zhiwei/brandkbs2/pojo/vo/CrisisCaseWarnVO.java
+7
-1
src/main/java/com/zhiwei/brandkbs2/service/impl/MarkFlowServiceImpl.java
+1
-0
src/main/java/com/zhiwei/brandkbs2/service/impl/ProjectWarnServiceImpl.java
+242
-300
src/main/java/com/zhiwei/brandkbs2/util/RedisUtil.java
+10
-2
src/main/java/com/zhiwei/brandkbs2/util/Tools.java
+3
-0
src/main/resources/application-dev.properties
+1
-0
src/main/resources/application-local.properties
+1
-0
src/main/resources/application-prod.properties
+1
-0
No files found.
src/main/java/com/zhiwei/brandkbs2/common/RedisKeyPrefix.java
View file @
38564d67
...
@@ -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
,
"*"
));
...
...
src/main/java/com/zhiwei/brandkbs2/pojo/external/BrandkbsNewCaseWarn.java
View file @
38564d67
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
;
}
}
}
}
}
src/main/java/com/zhiwei/brandkbs2/pojo/vo/CrisisCaseWarnVO.java
View file @
38564d67
...
@@ -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
;
}
}
src/main/java/com/zhiwei/brandkbs2/service/impl/MarkFlowServiceImpl.java
View file @
38564d67
...
@@ -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
;
...
...
src/main/java/com/zhiwei/brandkbs2/service/impl/ProjectWarnServiceImpl.java
View file @
38564d67
...
@@ -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
{
...
...
src/main/java/com/zhiwei/brandkbs2/util/RedisUtil.java
View file @
38564d67
...
@@ -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
)
{
...
...
src/main/java/com/zhiwei/brandkbs2/util/Tools.java
View file @
38564d67
...
@@ -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
);
}
}
...
...
src/main/resources/application-dev.properties
View file @
38564d67
...
@@ -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}
...
...
src/main/resources/application-local.properties
View file @
38564d67
...
@@ -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}
...
...
src/main/resources/application-prod.properties
View file @
38564d67
...
@@ -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}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment