Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
仟微科技
Link Wechat
提交
4b334d27
Link Wechat
项目概览
仟微科技
/
Link Wechat
通知
48
Star
3
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
1
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Link Wechat
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
1
合并请求
1
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
4b334d27
编写于
1月 05, 2021
作者:
L
leejoker
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
提交敏感词相关代码:
1. 增加敏感词命中查询和保存 2. 修改sql文件 3. 在插入信息到es时使用异步方法
上级
a26b88da
变更
12
隐藏空白更改
内联
并排
Showing
12 changed file
with
304 addition
and
36 deletion
+304
-36
linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeSensitiveController.java
...inkwechat/web/controller/wecom/WeSensitiveController.java
+11
-2
linkwe-common/src/main/java/com/linkwechat/common/constant/WeConstans.java
.../main/java/com/linkwechat/common/constant/WeConstans.java
+11
-3
linkwe-common/src/main/java/com/linkwechat/common/core/elasticsearch/ElasticSearch.java
...m/linkwechat/common/core/elasticsearch/ElasticSearch.java
+43
-9
linkwe-common/src/main/java/com/tencent/wework/FinanceUtils.java
...common/src/main/java/com/tencent/wework/FinanceUtils.java
+5
-10
linkwe-quartz/src/main/java/com/linkwechat/quartz/task/RyTask.java
...artz/src/main/java/com/linkwechat/quartz/task/RyTask.java
+9
-3
linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeSensitive.java
...rc/main/java/com/linkwechat/wecom/domain/WeSensitive.java
+2
-3
linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeSensitiveAuditScope.java
...va/com/linkwechat/wecom/domain/WeSensitiveAuditScope.java
+1
-1
linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/query/WeSensitiveHitQuery.java
...om/linkwechat/wecom/domain/query/WeSensitiveHitQuery.java
+33
-0
linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeSensitiveService.java
...ava/com/linkwechat/wecom/service/IWeSensitiveService.java
+12
-0
linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeSensitiveServiceImpl.java
...linkwechat/wecom/service/impl/WeSensitiveServiceImpl.java
+138
-0
linkwe-wecom/src/main/resources/mapper/wecom/WeSensitiveMapper.xml
...com/src/main/resources/mapper/wecom/WeSensitiveMapper.xml
+7
-5
sql/link-wechat.sql
sql/link-wechat.sql
+32
-0
未找到文件。
linkwe-admin/src/main/java/com/linkwechat/web/controller/wecom/WeSensitiveController.java
浏览文件 @
4b334d27
...
...
@@ -7,10 +7,10 @@ import com.linkwechat.common.core.domain.AjaxResult;
import
com.linkwechat.common.core.page.TableDataInfo
;
import
com.linkwechat.common.enums.BusinessType
;
import
com.linkwechat.wecom.domain.WeSensitive
;
import
com.linkwechat.wecom.domain.query.WeSensitiveHitQuery
;
import
com.linkwechat.wecom.service.IWeSensitiveService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
import
javax.validation.Valid
;
...
...
@@ -19,7 +19,7 @@ import java.util.List;
import
java.util.stream.Collectors
;
/**
* 敏感词
设置
Controller
* 敏感词Controller
*
* @author ruoyi
* @date 2020-12-29
...
...
@@ -87,4 +87,13 @@ public class WeSensitiveController extends BaseController {
Arrays
.
stream
(
id
).
map
(
Long:
:
parseLong
).
collect
(
Collectors
.
toList
()).
toArray
(
idArray
);
return
toAjax
(
weSensitiveService
.
destroyWeSensitiveByIds
(
idArray
));
}
/**
* 敏感词命中查询
*/
@PreAuthorize
(
"@ss.hasPermi('wecom:sensitivehit:list')"
)
@GetMapping
(
"/hit/list"
)
public
TableDataInfo
hitList
(
WeSensitiveHitQuery
query
)
{
return
getDataTable
(
weSensitiveService
.
getHitSensitiveList
(
query
));
}
}
linkwe-common/src/main/java/com/linkwechat/common/constant/WeConstans.java
浏览文件 @
4b334d27
package
com.linkwechat.common.constant
;
import
java.io.IOException
;
import
java.util.HashMap
;
import
java.util.Map
;
...
...
@@ -149,7 +148,7 @@ public class WeConstans {
/**
* 批量生成的单人码 活动场景
*/
public
static
final
String
ONE_PERSON_CODE_GENERATED_BATCH
=
"批量生成的单人码"
;
public
static
final
String
ONE_PERSON_CODE_GENERATED_BATCH
=
"批量生成的单人码"
;
/**
* 微信接口相应端错误字段
...
...
@@ -221,6 +220,11 @@ public class WeConstans {
public
static
final
Integer
ID_TYPE_EX
=
1
;
public
static
final
Integer
ID_TYPE_MACHINE
=
2
;
/**
* 一次拉取的消息条数,最大值1000条,超过1000条会返回错误
*/
public
static
final
long
LIMIT
=
1_000L
;
/**
* 企微回调事件类型路由
*/
...
...
@@ -285,6 +289,10 @@ public class WeConstans {
public
static
final
String
WECOM_FINANCE_INDEX
=
"finance"
;
/** 开启会话存档成员列表 **/
public
static
final
String
WECOM_SENSITIVE_HIT_INDEX
=
"sensitive"
;
/**
* 开启会话存档成员列表
**/
public
static
final
String
weMsgAuditKey
=
"wecom_msg_audit:user:ids"
;
}
linkwe-common/src/main/java/com/linkwechat/common/core/elasticsearch/ElasticSearch.java
浏览文件 @
4b334d27
...
...
@@ -2,10 +2,11 @@ package com.linkwechat.common.core.elasticsearch;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.github.pagehelper.PageHelper
;
import
com.github.pagehelper.PageInfo
;
import
com.linkwechat.common.core.domain.elastic.ElasticSearchEntity
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.exception.ExceptionUtils
;
import
org.elasticsearch.action.ActionListener
;
import
org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest
;
import
org.elasticsearch.action.bulk.BulkRequest
;
import
org.elasticsearch.action.delete.DeleteRequest
;
...
...
@@ -29,13 +30,14 @@ import org.elasticsearch.search.SearchHit;
import
org.elasticsearch.search.builder.SearchSourceBuilder
;
import
org.elasticsearch.search.fetch.subphase.highlight.HighlightField
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Page
;
import
org.springframework.data.domain.PageImpl
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.stereotype.Component
;
import
java.io.IOException
;
import
java.util.*
;
import
java.util.ArrayList
;
import
java.util.Collection
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.function.Consumer
;
/**
* @author sxw
...
...
@@ -205,6 +207,24 @@ public class ElasticSearch {
}
}
/**
* 异步批量插入,并执行回调方法
*
* @param idxName
* @param list
* @param consumers
*/
public
void
insertBatchAsync
(
String
idxName
,
List
<
JSONObject
>
list
,
List
<
Consumer
<
List
<
JSONObject
>>>
consumers
)
{
BulkRequest
request
=
new
BulkRequest
();
list
.
forEach
(
item
->
request
.
add
(
new
IndexRequest
(
idxName
,
"_doc"
).
id
(
item
.
getString
(
"msgid"
))
.
source
(
item
,
XContentType
.
JSON
)));
try
{
restHighLevelClient
.
bulkAsync
(
request
,
RequestOptions
.
DEFAULT
,
getActionListener
(
list
,
consumers
));
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
e
);
}
}
/**
* 批量删除
*
...
...
@@ -260,7 +280,7 @@ public class ElasticSearch {
request
.
source
(
builder
);
try
{
SearchResponse
response
=
restHighLevelClient
.
search
(
request
,
RequestOptions
.
DEFAULT
);
int
totalHits
=(
int
)
response
.
getHits
().
getTotalHits
().
value
;
int
totalHits
=
(
int
)
response
.
getHits
().
getTotalHits
().
value
;
SearchHit
[]
hits
=
response
.
getHits
().
getHits
();
List
<
T
>
res
=
new
ArrayList
<>(
hits
.
length
);
for
(
SearchHit
hit
:
hits
)
{
...
...
@@ -269,7 +289,7 @@ public class ElasticSearch {
Map
<
String
,
HighlightField
>
highlightFields
=
hit
.
getHighlightFields
();
HighlightField
hghlightContent
=
highlightFields
.
get
(
"text.content"
);
String
newName
=
""
;
if
(
hghlightContent
!=
null
){
if
(
hghlightContent
!=
null
)
{
//获取该高亮字段的高亮信息
Text
[]
fragments
=
hghlightContent
.
getFragments
();
//将前缀、关键词、后缀进行拼接
...
...
@@ -278,7 +298,7 @@ public class ElasticSearch {
}
}
Map
<
String
,
Object
>
sourceAsMap
=
hit
.
getSourceAsMap
();
sourceAsMap
.
put
(
"content"
,
newName
);
sourceAsMap
.
put
(
"content"
,
newName
);
res
.
add
(
JSON
.
parseObject
(
JSONObject
.
toJSONString
(
sourceAsMap
),
c
));
}
// 封装分页
...
...
@@ -342,6 +362,20 @@ public class ElasticSearch {
}
}
public
ActionListener
getActionListener
(
List
<
JSONObject
>
list
,
List
<
Consumer
<
List
<
JSONObject
>>>
consumers
)
{
return
new
ActionListener
()
{
@Override
public
void
onResponse
(
Object
o
)
{
consumers
.
forEach
(
consumer
->
consumer
.
accept
(
list
));
}
@Override
public
void
onFailure
(
Exception
e
)
{
log
.
warn
(
"work with es failed, exception={}"
,
ExceptionUtils
.
getStackTrace
(
e
));
}
};
}
public
XContentBuilder
getFinanceMapping
()
throws
IOException
{
// 创建 会话文本Mapping
XContentBuilder
xContentBuilder
=
XContentFactory
.
jsonBuilder
()
...
...
@@ -372,4 +406,4 @@ public class ElasticSearch {
.
endObject
();
return
xContentBuilder
;
}
}
}
\ No newline at end of file
linkwe-common/src/main/java/com/tencent/wework/FinanceUtils.java
浏览文件 @
4b334d27
...
...
@@ -35,10 +35,6 @@ public class FinanceUtils {
* 超时时间,单位秒
*/
private
final
static
long
timeout
=
5
*
60
;
/**
* 一次拉取的消息条数,最大值1000条,超过1000条会返回错误
*/
private
final
static
long
LIMIT
=
1000
;
private
static
String
downloadWeWorkPath
=
RuoYiConfig
.
getDownloadWeWorkPath
();
...
...
@@ -67,7 +63,7 @@ public class FinanceUtils {
public
static
List
<
JSONObject
>
getChatData
(
long
seq
,
String
proxy
,
String
passwd
,
RedisCache
redisCache
)
{
List
<
JSONObject
>
resList
=
new
ArrayList
<>();
long
slice
=
Finance
.
NewSlice
();
int
ret
=
Finance
.
GetChatData
(
sdk
,
seq
,
LIMIT
,
proxy
,
passwd
,
timeout
,
slice
);
int
ret
=
Finance
.
GetChatData
(
sdk
,
seq
,
WeConstans
.
LIMIT
,
proxy
,
passwd
,
timeout
,
slice
);
if
(
ret
!=
0
)
{
log
.
info
(
"getChatData ret "
+
ret
);
return
null
;
...
...
@@ -82,8 +78,8 @@ public class FinanceUtils {
LocalSEQ
.
set
(
data
.
getLong
(
"seq"
));
JSONObject
jsonObject
=
decryptChatRecord
(
sdk
,
data
.
getString
(
"encrypt_random_key"
),
data
.
getString
(
"encrypt_chat_msg"
),
privateKey
);
if
(
jsonObject
==
null
)
{
return
;
if
(
jsonObject
==
null
)
{
return
;
}
jsonObject
.
put
(
"seq"
,
LocalSEQ
.
get
());
resList
.
add
(
jsonObject
);
...
...
@@ -94,7 +90,7 @@ public class FinanceUtils {
log
.
info
(
"数据解析完成:------------"
);
}
Finance
.
FreeSlice
(
slice
);
redisCache
.
setCacheObject
(
WeConstans
.
CONTACT_SEQ_KEY
,
LocalSEQ
.
get
());
redisCache
.
setCacheObject
(
WeConstans
.
CONTACT_SEQ_KEY
,
LocalSEQ
.
get
());
return
resList
;
}
...
...
@@ -123,7 +119,7 @@ public class FinanceUtils {
if
(
StringUtils
.
isNotEmpty
(
msgType
))
{
getSwitchType
(
realJsonData
,
msgType
);
}
log
.
info
(
"数据解析:------------"
+
realJsonData
.
toJSONString
());
log
.
info
(
"数据解析:------------"
+
realJsonData
.
toJSONString
());
return
realJsonData
;
}
catch
(
Exception
e
)
{
log
.
error
(
"解析密文失败"
);
...
...
@@ -278,5 +274,4 @@ public class FinanceUtils {
}
}
}
}
linkwe-quartz/src/main/java/com/linkwechat/quartz/task/RyTask.java
浏览文件 @
4b334d27
...
...
@@ -2,12 +2,14 @@ package com.linkwechat.quartz.task;
import
cn.hutool.core.collection.CollectionUtil
;
import
com.alibaba.fastjson.JSONObject
;
import
com.google.common.collect.Lists
;
import
com.linkwechat.common.constant.WeConstans
;
import
com.linkwechat.common.core.domain.elastic.ElasticSearchEntity
;
import
com.linkwechat.common.core.elasticsearch.ElasticSearch
;
import
com.linkwechat.common.core.redis.RedisCache
;
import
com.linkwechat.common.utils.StringUtils
;
import
com.linkwechat.wecom.service.IWeChatContactMappingService
;
import
com.linkwechat.wecom.service.IWeSensitiveService
;
import
com.tencent.wework.FinanceUtils
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.poi.ss.formula.functions.T
;
...
...
@@ -38,6 +40,8 @@ public class RyTask {
private
RedisCache
redisCache
;
@Autowired
private
IWeChatContactMappingService
weChatContactMappingService
;
@Autowired
private
IWeSensitiveService
weSensitiveService
;
public
void
ryMultipleParams
(
String
s
,
Boolean
b
,
Long
l
,
Double
d
,
Integer
i
)
{
System
.
out
.
println
(
StringUtils
.
format
(
"执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}"
,
s
,
b
,
l
,
d
,
i
));
...
...
@@ -72,8 +76,10 @@ public class RyTask {
""
,
redisCache
);
if
(
CollectionUtil
.
isNotEmpty
(
chatDataList
)){
try
{
List
<
ElasticSearchEntity
>
elasticSearchEntities
=
weChatContactMappingService
.
saveWeChatContactMapping
(
chatDataList
);
elasticSearch
.
insertBatch
(
WeConstans
.
WECOM_FINANCE_INDEX
,
elasticSearchEntities
);
List
<
Consumer
<
List
<
JSONObject
>>>
consumerList
=
Lists
.
newArrayList
();
consumerList
.
add
(
weChatContactMappingService:
:
saveWeChatContactMapping
);
consumerList
.
add
(
weSensitiveService:
:
hitSensitive
);
elasticSearch
.
insertBatchAsync
(
WeConstans
.
WECOM_FINANCE_INDEX
,
chatDataList
,
consumerList
);
}
catch
(
Exception
e
)
{
log
.
error
(
"消息处理异常:ex:{}"
,
e
);
e
.
printStackTrace
();
...
...
@@ -88,7 +94,7 @@ public class RyTask {
searchSourceBuilder
.
size
(
1
);
List
<
JSONObject
>
searchResultList
=
elasticSearch
.
search
(
WeConstans
.
WECOM_FINANCE_INDEX
,
searchSourceBuilder
,
JSONObject
.
class
);
searchResultList
.
stream
().
findFirst
().
ifPresent
(
result
->{
index
.
set
(
result
.
getLong
(
WeConstans
.
CONTACT_SEQ_KEY
));
index
.
set
(
result
.
getLong
(
WeConstans
.
CONTACT_SEQ_KEY
)
+
1
);
});
redisCache
.
setCacheObject
(
WeConstans
.
CONTACT_SEQ_KEY
,
index
);
}
...
...
linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeSensitive.java
浏览文件 @
4b334d27
...
...
@@ -14,7 +14,6 @@ import org.apache.commons.lang3.builder.ToStringStyle;
import
javax.validation.constraints.NotBlank
;
import
javax.validation.constraints.NotEmpty
;
import
javax.validation.constraints.NotNull
;
import
java.util.List
;
/**
...
...
@@ -66,8 +65,8 @@ public class WeSensitive extends BaseEntity {
*/
@TableField
(
value
=
"audit_user_id"
)
@ApiModelProperty
(
value
=
"审计人id"
)
@Not
Null
(
message
=
"审计人id不能为空"
)
private
Lo
ng
auditUserId
;
@Not
Blank
(
message
=
"审计人id不能为空"
)
private
Stri
ng
auditUserId
;
/**
* 审计人姓名
...
...
linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/WeSensitiveAuditScope.java
浏览文件 @
4b334d27
...
...
@@ -42,7 +42,7 @@ public class WeSensitiveAuditScope implements Serializable {
*/
@TableField
(
value
=
"audit_scope_id"
)
@ApiModelProperty
(
value
=
"审计对象id"
)
private
Lo
ng
auditScopeId
;
private
Stri
ng
auditScopeId
;
/**
* 审计对象名称
...
...
linkwe-wecom/src/main/java/com/linkwechat/wecom/domain/query/WeSensitiveHitQuery.java
0 → 100644
浏览文件 @
4b334d27
package
com.linkwechat.wecom.domain.query
;
import
com.linkwechat.common.core.domain.BaseEntity
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
/**
* @author leejoker <1056650571@qq.com>
* @version 1.0
* @date 2021/1/4 21:56
*/
@EqualsAndHashCode
(
callSuper
=
true
)
@Data
public
class
WeSensitiveHitQuery
extends
BaseEntity
{
/**
* 1:组织机构id,2:成员id
*/
@ApiModelProperty
(
value
=
"审计范围类型, 1 组织机构 2 成员"
)
private
Integer
scopeType
;
/**
* 审计对象id
*/
@ApiModelProperty
(
value
=
"审计范围id"
)
private
String
auditScopeId
;
/**
* 关键词
*/
@ApiModelProperty
(
value
=
"关键词"
)
private
String
keyword
;
}
linkwe-wecom/src/main/java/com/linkwechat/wecom/service/IWeSensitiveService.java
浏览文件 @
4b334d27
package
com.linkwechat.wecom.service
;
import
com.alibaba.fastjson.JSONObject
;
import
com.github.pagehelper.PageInfo
;
import
com.linkwechat.wecom.domain.WeSensitive
;
import
com.linkwechat.wecom.domain.query.WeSensitiveHitQuery
;
import
java.util.List
;
...
...
@@ -58,4 +61,13 @@ public interface IWeSensitiveService {
* @return 结果
*/
public
int
destroyWeSensitiveByIds
(
Long
[]
ids
);
/**
* 敏感词命中
*
* @param entityList
*/
public
void
hitSensitive
(
List
<
JSONObject
>
entityList
);
public
PageInfo
<
JSONObject
>
getHitSensitiveList
(
WeSensitiveHitQuery
weSensitiveHitQuery
);
}
linkwe-wecom/src/main/java/com/linkwechat/wecom/service/impl/WeSensitiveServiceImpl.java
浏览文件 @
4b334d27
package
com.linkwechat.wecom.service.impl
;
import
com.alibaba.fastjson.JSONObject
;
import
com.github.pagehelper.PageInfo
;
import
com.google.common.collect.Lists
;
import
com.linkwechat.common.constant.WeConstans
;
import
com.linkwechat.common.core.domain.elastic.ElasticSearchEntity
;
import
com.linkwechat.common.core.elasticsearch.ElasticSearch
;
import
com.linkwechat.common.core.page.PageDomain
;
import
com.linkwechat.common.core.page.TableSupport
;
import
com.linkwechat.common.utils.DateUtils
;
import
com.linkwechat.common.utils.SecurityUtils
;
import
com.linkwechat.common.utils.StringUtils
;
import
com.linkwechat.wecom.domain.WeSensitive
;
import
com.linkwechat.wecom.domain.WeSensitiveAuditScope
;
import
com.linkwechat.wecom.domain.WeUser
;
import
com.linkwechat.wecom.domain.query.WeSensitiveHitQuery
;
import
com.linkwechat.wecom.mapper.WeSensitiveMapper
;
import
com.linkwechat.wecom.service.IWeSensitiveAuditScopeService
;
import
com.linkwechat.wecom.service.IWeSensitiveService
;
import
com.linkwechat.wecom.service.IWeUserService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.exception.ExceptionUtils
;
import
org.elasticsearch.index.query.BoolQueryBuilder
;
import
org.elasticsearch.index.query.QueryBuilders
;
import
org.elasticsearch.search.builder.SearchSourceBuilder
;
import
org.elasticsearch.search.sort.SortOrder
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.io.IOException
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.stream.Collectors
;
/**
* 敏感词设置Service业务层处理
...
...
@@ -20,6 +43,7 @@ import java.util.List;
* @date 2020-12-29
*/
@Service
@Slf4j
public
class
WeSensitiveServiceImpl
implements
IWeSensitiveService
{
@Autowired
private
WeSensitiveMapper
weSensitiveMapper
;
...
...
@@ -27,6 +51,12 @@ public class WeSensitiveServiceImpl implements IWeSensitiveService {
@Autowired
private
IWeSensitiveAuditScopeService
sensitiveAuditScopeService
;
@Autowired
private
ElasticSearch
elasticSearch
;
@Autowired
private
IWeUserService
weUserService
;
/**
* 查询敏感词设置
*
...
...
@@ -132,4 +162,112 @@ public class WeSensitiveServiceImpl implements IWeSensitiveService {
}
return
deleteResult
;
}
@Override
public
void
hitSensitive
(
List
<
JSONObject
>
entityList
)
{
//获取所有的敏感词规则
List
<
WeSensitive
>
allSensitiveRules
=
weSensitiveMapper
.
selectWeSensitiveList
(
new
WeSensitive
());
//根据规则过滤命中
if
(
CollectionUtils
.
isNotEmpty
(
allSensitiveRules
))
{
allSensitiveRules
.
parallelStream
().
forEach
(
weSensitive
->
{
List
<
JSONObject
>
jsonList
=
Lists
.
newArrayList
();
List
<
String
>
patternWords
=
Arrays
.
asList
(
weSensitive
.
getPatternWords
().
split
(
","
));
List
<
String
>
users
=
getScopeUsers
(
weSensitive
.
getAuditUserScope
());
jsonList
.
addAll
(
hitSensitiveInES
(
patternWords
,
users
));
//将命中结果插入es
try
{
addHitSensitiveList
(
jsonList
,
weSensitive
);
}
catch
(
IOException
e
)
{
log
.
warn
(
"添加敏感词命中信息失败, jsonList={}, auditUserId={}, exception={}"
,
jsonList
,
weSensitive
.
getAuditUserId
(),
ExceptionUtils
.
getStackTrace
(
e
));
}
});
}
}
@Override
public
PageInfo
<
JSONObject
>
getHitSensitiveList
(
WeSensitiveHitQuery
weSensitiveHitQuery
)
{
List
<
String
>
userIds
=
Lists
.
newArrayList
();
if
(
weSensitiveHitQuery
.
getScopeType
().
equals
(
WeConstans
.
USE_SCOP_BUSINESSID_TYPE_USER
))
{
userIds
.
add
(
weSensitiveHitQuery
.
getAuditScopeId
());
}
else
{
List
<
String
>
userIdList
=
weUserService
.
selectWeUserList
(
WeUser
.
builder
().
department
(
new
String
[]{
weSensitiveHitQuery
.
getAuditScopeId
()}).
build
())
.
stream
().
filter
(
Objects:
:
nonNull
).
map
(
WeUser:
:
getUserId
).
collect
(
Collectors
.
toList
());
userIds
.
addAll
(
userIdList
);
}
PageDomain
pageDomain
=
TableSupport
.
buildPageRequest
();
Integer
pageNum
=
pageDomain
.
getPageNum
()
==
null
?
1
:
pageDomain
.
getPageNum
();
Integer
pageSize
=
pageDomain
.
getPageSize
()
==
null
?
10
:
pageDomain
.
getPageSize
();
SearchSourceBuilder
builder
=
new
SearchSourceBuilder
();
int
from
=
(
pageNum
-
1
)
*
pageSize
;
builder
.
size
(
pageSize
);
builder
.
from
(
from
);
builder
.
sort
(
"msgtime"
,
SortOrder
.
DESC
);
BoolQueryBuilder
boolQueryBuilder
=
QueryBuilders
.
boolQuery
();
BoolQueryBuilder
userBuilder
=
QueryBuilders
.
boolQuery
();
userIds
.
forEach
(
user
->
{
userBuilder
.
should
(
QueryBuilders
.
termQuery
(
"from.keyword"
,
user
));
});
userBuilder
.
minimumShouldMatch
(
1
);
boolQueryBuilder
.
must
(
userBuilder
);
if
(
StringUtils
.
isNotBlank
(
weSensitiveHitQuery
.
getKeyword
()))
{
BoolQueryBuilder
keywordBuilder
=
QueryBuilders
.
boolQuery
().
should
(
QueryBuilders
.
matchPhraseQuery
(
"text.content"
,
weSensitiveHitQuery
.
getKeyword
()));
boolQueryBuilder
.
must
(
keywordBuilder
);
}
builder
.
query
(
boolQueryBuilder
);
return
elasticSearch
.
searchPage
(
WeConstans
.
WECOM_SENSITIVE_HIT_INDEX
,
builder
,
pageNum
,
pageSize
,
JSONObject
.
class
);
}
private
void
addHitSensitiveList
(
List
<
JSONObject
>
json
,
WeSensitive
weSensitive
)
throws
IOException
{
//创建索引
elasticSearch
.
createIndex2
(
WeConstans
.
WECOM_SENSITIVE_HIT_INDEX
,
elasticSearch
.
getFinanceMapping
());
if
(
weSensitive
.
getAlertFlag
().
equals
(
1
))
{
//针对每一条命中信息发送消息通知给相应的审计人 TODO
}
//批量提交插入记录
if
(
CollectionUtils
.
isNotEmpty
(
json
))
{
List
<
ElasticSearchEntity
>
list
=
json
.
stream
().
filter
(
Objects:
:
nonNull
).
map
(
j
->
{
ElasticSearchEntity
ese
=
new
ElasticSearchEntity
();
ese
.
setData
(
j
);
ese
.
setId
(
j
.
getString
(
"msgid"
));
return
ese
;
}).
collect
(
Collectors
.
toList
());
elasticSearch
.
insertBatch
(
WeConstans
.
WECOM_SENSITIVE_HIT_INDEX
,
list
);
}
}
private
List
<
String
>
getScopeUsers
(
List
<
WeSensitiveAuditScope
>
scopeList
)
{
List
<
String
>
users
=
Lists
.
newArrayList
();
scopeList
.
forEach
(
scope
->
{
if
(
scope
.
getScopeType
().
equals
(
WeConstans
.
USE_SCOP_BUSINESSID_TYPE_USER
))
{
users
.
add
(
scope
.
getAuditScopeId
());
}
else
{
List
<
String
>
userIdList
=
weUserService
.
selectWeUserList
(
WeUser
.
builder
().
department
(
new
String
[]{
scope
.
getAuditScopeId
()}).
build
())
.
stream
().
filter
(
Objects:
:
nonNull
).
map
(
WeUser:
:
getUserId
).
collect
(
Collectors
.
toList
());
users
.
addAll
(
userIdList
);
}
});
return
users
;
}
private
List
<
JSONObject
>
hitSensitiveInES
(
List
<
String
>
patternWords
,
List
<
String
>
users
)
{
//TODO user过大时进行分组处理
SearchSourceBuilder
builder
=
new
SearchSourceBuilder
();
builder
.
sort
(
"msgtime"
,
SortOrder
.
DESC
);
BoolQueryBuilder
patterWordsBuilder
=
QueryBuilders
.
boolQuery
();
patternWords
.
forEach
(
word
->
{
patterWordsBuilder
.
should
(
QueryBuilders
.
matchPhraseQuery
(
"text.content"
,
word
));
});
patterWordsBuilder
.
minimumShouldMatch
(
1
);
BoolQueryBuilder
userBuilder
=
QueryBuilders
.
boolQuery
();
users
.
forEach
(
user
->
{
userBuilder
.
should
(
QueryBuilders
.
termQuery
(
"from.keyword"
,
user
));
});
userBuilder
.
minimumShouldMatch
(
1
);
BoolQueryBuilder
searchBuilder
=
QueryBuilders
.
boolQuery
().
must
(
patterWordsBuilder
).
must
(
userBuilder
);
builder
.
query
(
searchBuilder
);
return
elasticSearch
.
search
(
WeConstans
.
WECOM_FINANCE_INDEX
,
builder
,
JSONObject
.
class
);
}
}
linkwe-wecom/src/main/resources/mapper/wecom/WeSensitiveMapper.xml
浏览文件 @
4b334d27
...
...
@@ -42,11 +42,12 @@
<if
test=
"patternWords != null and patternWords != ''"
>
and a.pattern_words like concat('%',
#{patternWords}, '%')
</if>
<if
test=
"auditUserId != null "
>
and a.audit_user_id = #{auditUserId}
</if>
<if
test=
"auditUserId != null
and auditUserId != ''
"
>
and a.audit_user_id = #{auditUserId}
</if>
<if
test=
"auditUserName != null and auditUserName != ''"
>
and a.audit_user_name like concat('%',
#{auditUserName}, '%')
</if>
</where>
order by a.update_time desc, a.create_time desc
</select>
<select
id=
"selectWeSensitiveById"
parameterType=
"Long"
resultMap=
"WeSensitiveResult"
>
...
...
@@ -60,6 +61,7 @@
<foreach
item=
"id"
collection=
"array"
open=
"("
separator=
","
close=
")"
>
#{id}
</foreach>
order by a.update_time desc, a.create_time desc
</select>
<insert
id=
"insertWeSensitive"
parameterType=
"WeSensitive"
useGeneratedKeys=
"true"
keyProperty=
"id"
>
...
...
@@ -67,7 +69,7 @@
<trim
prefix=
"("
suffix=
")"
suffixOverrides=
","
>
<if
test=
"strategyName != null and strategyName != ''"
>
strategy_name,
</if>
<if
test=
"patternWords != null and patternWords != ''"
>
pattern_words,
</if>
<if
test=
"auditUserId != null"
>
audit_user_id,
</if>
<if
test=
"auditUserId != null
and auditUserId != ''
"
>
audit_user_id,
</if>
<if
test=
"auditUserName != null and auditUserName != ''"
>
audit_user_name,
</if>
<if
test=
"alertFlag != null"
>
alert_flag,
</if>
<if
test=
"delFlag != null"
>
del_flag,
</if>
...
...
@@ -79,7 +81,7 @@
<trim
prefix=
"values ("
suffix=
")"
suffixOverrides=
","
>
<if
test=
"strategyName != null and strategyName != ''"
>
#{strategyName},
</if>
<if
test=
"patternWords != null and patternWords != ''"
>
#{patternWords},
</if>
<if
test=
"auditUserId != null"
>
#{auditUserId},
</if>
<if
test=
"auditUserId != null
and auditUserId != ''
"
>
#{auditUserId},
</if>
<if
test=
"auditUserName != null and auditUserName != ''"
>
#{auditUserName},
</if>
<if
test=
"alertFlag != null"
>
#{alertFlag},
</if>
<if
test=
"delFlag != null"
>
#{delFlag},
</if>
...
...
@@ -95,7 +97,7 @@
<trim
prefix=
"SET"
suffixOverrides=
","
>
<if
test=
"strategyName != null and strategyName != ''"
>
strategy_name = #{strategyName},
</if>
<if
test=
"patternWords != null and patternWords != ''"
>
pattern_words = #{patternWords},
</if>
<if
test=
"auditUserId != null"
>
audit_user_id = #{auditUserId},
</if>
<if
test=
"auditUserId != null
and auditUserId != ''
"
>
audit_user_id = #{auditUserId},
</if>
<if
test=
"auditUserName != null"
>
audit_user_name = #{auditUserName},
</if>
<if
test=
"alertFlag != null"
>
alert_flag = #{alertFlag},
</if>
<if
test=
"delFlag != null"
>
del_flag = #{delFlag},
</if>
...
...
@@ -126,7 +128,7 @@
</trim>
<trim
prefix=
"audit_user_id = case"
suffix=
"end,"
>
<foreach
collection=
"list"
item=
"item"
index=
"index"
>
<if
test=
"item.auditUserId != null"
>
<if
test=
"item.auditUserId != null
and auditUserId != ''
"
>
when id = #{item.id} then #{item.auditUserId}
</if>
</foreach>
...
...
sql/link-wechat.sql
浏览文件 @
4b334d27
...
...
@@ -6311,3 +6311,35 @@ CREATE TABLE `we_user` (
-- ----------------------------
-- Records of we_user
-- ----------------------------
-- ----------------------------
-- Table structure for we_sensitive
-- ----------------------------
DROP TABLE IF EXISTS `we_sensitive`;
CREATE TABLE `we_sensitive` (
id BIGINT auto_increment NOT NULL COMMENT '主键',
strategy_name varchar(100) NOT NULL COMMENT '策略名称',
pattern_words TEXT NOT NULL COMMENT '匹配词',
audit_user_id varchar(64) NOT NULL COMMENT '审计人id',
audit_user_name varchar(30) NOT NULL COMMENT '审计人',
alert_flag TINYINT DEFAULT 1 NOT NULL COMMENT '消息通知,1 开启 0 关闭',
del_flag TINYINT DEFAULT 0 NOT NULL COMMENT '删除标识,1 已删除 0 未删除',
create_by varchar(64) NULL COMMENT '创建人',
create_time DATETIME NULL COMMENT '创建时间',
update_by varchar(64) NULL COMMENT '更新人',
update_time DATETIME NULL COMMENT '更新时间',
CONSTRAINT we_sensitive_pk PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='敏感词设置表';
-- ----------------------------
-- Table structure for we_sensitive_audit_scope
-- ----------------------------
DROP TABLE IF EXISTS `we_sensitive_audit_scope`;
CREATE TABLE `we_sensitive_audit_scope` (
id BIGINT auto_increment NOT NULL COMMENT '主键',
sensitive_id BIGINT NOT NULL COMMENT '敏感词表主键',
scope_type TINYINT NOT NULL COMMENT '审计范围类型, 1 组织机构 2 成员',
audit_scope_id varchar(64) NOT NULL COMMENT '审计对象id',
audit_scope_name varchar(64) NOT NULL COMMENT '审计对象名称',
CONSTRAINT we_sensitive_audit_scope_pk PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='敏感词审计范围';
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录