Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
midjourney-proxy
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
徐少华
midjourney-proxy
Commits
ec064861
Commit
ec064861
authored
Sep 06, 2019
by
裴大威
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'hotfix-changegroup' into 'master'
feat 1、切群加锁 2、接受消息同步群人数 See merge request rays/pcloud-book!135
parents
24583fb5
d9792ac9
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
406 additions
and
268 deletions
+406
-268
pom.xml
pcloud-facade-book/pom.xml
+0
-1
GroupClassifyQrcodeDTO.java
...ava/com/pcloud/book/group/dto/GroupClassifyQrcodeDTO.java
+14
-0
pom.xml
pcloud-service-book/pom.xml
+24
-26
GroupQrcodeBiz.java
...c/main/java/com/pcloud/book/group/biz/GroupQrcodeBiz.java
+22
-0
GroupQrcodeBizImpl.java
...va/com/pcloud/book/group/biz/impl/GroupQrcodeBizImpl.java
+135
-88
GroupQrcodeDao.java
...c/main/java/com/pcloud/book/group/dao/GroupQrcodeDao.java
+4
-0
GroupQrcodeDaoImpl.java
...va/com/pcloud/book/group/dao/impl/GroupQrcodeDaoImpl.java
+18
-0
GroupQrcodeDTO.java
...c/main/java/com/pcloud/book/group/dto/GroupQrcodeDTO.java
+11
-76
SendWeixinRequestTools.java
...a/com/pcloud/book/group/tools/SendWeixinRequestTools.java
+4
-1
BookKeywordBiz.java
...ain/java/com/pcloud/book/keywords/biz/BookKeywordBiz.java
+21
-1
BookKeywordBizImpl.java
...com/pcloud/book/keywords/biz/impl/BookKeywordBizImpl.java
+98
-43
WxGroupSendTextListener.java
...ava/com/pcloud/book/mq/topic/WxGroupSendTextListener.java
+33
-5
BookGroupClassify.Mapper.xml
.../main/resources/mapper/group/BookGroupClassify.Mapper.xml
+2
-1
GroupQrcode.Mapper.xml
...ok/src/main/resources/mapper/group/GroupQrcode.Mapper.xml
+15
-0
pom.xml
pom.xml
+5
-26
No files found.
pcloud-facade-book/pom.xml
View file @
ec064861
...
...
@@ -9,7 +9,6 @@
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-book
</artifactId>
<version>
${pcloud-facade-book.version}
</version>
<packaging>
jar
</packaging>
<name>
pcloud-facade-book
</name>
...
...
pcloud-facade-book/src/main/java/com/pcloud/book/group/dto/GroupClassifyQrcodeDTO.java
View file @
ec064861
...
...
@@ -64,6 +64,11 @@ public class GroupClassifyQrcodeDTO implements Serializable {
*/
private
Integer
joinGroupType
;
/**
* 切群人数
*/
private
Integer
changeNumber
;
public
Long
getBookId
()
{
return
bookId
;
}
...
...
@@ -160,6 +165,14 @@ public class GroupClassifyQrcodeDTO implements Serializable {
this
.
joinGroupType
=
joinGroupType
;
}
public
Integer
getChangeNumber
()
{
return
changeNumber
;
}
public
void
setChangeNumber
(
Integer
changeNumber
)
{
this
.
changeNumber
=
changeNumber
;
}
@Override
public
String
toString
()
{
return
"GroupClassifyQrcodeDTO{"
+
...
...
@@ -175,6 +188,7 @@ public class GroupClassifyQrcodeDTO implements Serializable {
", groupName='"
+
groupName
+
'\''
+
", hasOpenLearningReport="
+
hasOpenLearningReport
+
", joinGroupType="
+
joinGroupType
+
", changeNumber="
+
changeNumber
+
'}'
;
}
}
pcloud-service-book/pom.xml
View file @
ec064861
...
...
@@ -9,8 +9,6 @@
<groupId>
com.pcloud.service
</groupId>
<artifactId>
pcloud-service-book
</artifactId>
<version>
${pcloud-service-book.version}
</version>
<packaging>
jar
</packaging>
<name>
pcloud-service-book
</name>
...
...
@@ -26,7 +24,7 @@
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-book
</artifactId>
<version>
${pcloud-facade
-book
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<!--内部调用依赖-->
...
...
@@ -51,140 +49,140 @@
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-usercenter
</artifactId>
<version>
${pcloud-facade
-usercenter
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-resourcecenter
</artifactId>
<version>
${pcloud-facade
-resourcecenter
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-channelcenter
</artifactId>
<version>
${pcloud-facade
-channelcenter
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-tradecenter
</artifactId>
<version>
${pcloud-facade
-tradecenter
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-comment
</artifactId>
<version>
${pcloud-facade
-comment
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-message
</artifactId>
<version>
${pcloud-facade
-message
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-quartz
</artifactId>
<version>
${pcloud-facade
-quartz
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-analysisengine
</artifactId>
<version>
${pcloud-facade
-analysisengine
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-commoncenter
</artifactId>
<version>
${pcloud-facade
-commoncenter
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-voicemessage
</artifactId>
<version>
${pcloud-facade
-voicemessage
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-settlementcenter
</artifactId>
<version>
${pcloud-facade
-settlement
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-appcenter
</artifactId>
<version>
${pcloud-facade
-appcenter
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-raystask
</artifactId>
<version>
${pcloud-facade
-raystask
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-contentcenter
</artifactId>
<version>
${pcloud-facade
-contentcenter
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-readercenter
</artifactId>
<version>
${pcloud-facade
-readercenter
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-labelcenter
</artifactId>
<version>
${pcloud-facade
-labelcenter
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-wechatgroup
</artifactId>
<version>
${pcloud-facade
-wechatgroup
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-promotion
</artifactId>
<version>
${pcloud-facade
-promotion
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-audioapp
</artifactId>
<version>
${pcloud-facade
-audioapp
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-videolesson
</artifactId>
<version>
${pcloud-facade
-videolesson
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-liveapp
</artifactId>
<version>
${pcloud-facade
-liveapp
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-shareimage
</artifactId>
<version>
${pcloud-facade
-shareimage
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
<groupId>
com.pcloud.facade
</groupId>
<artifactId>
pcloud-facade-convert
</artifactId>
<version>
${pcloud-facade
-convert
.version}
</version>
<version>
${pcloud-facade.version}
</version>
</dependency>
<dependency>
...
...
pcloud-service-book/src/main/java/com/pcloud/book/group/biz/GroupQrcodeBiz.java
View file @
ec064861
...
...
@@ -23,10 +23,17 @@ import java.util.Map;
public
interface
GroupQrcodeBiz
{
/**
* 更新群人数
*/
Integer
updateGroupCount
(
String
wxGroupId
,
Integer
num
);
/**
* 查询是否需要切群,若需要则返回新群,不需要则为空前端展示客服二维码
*/
String
getChangeGroupQrCode
(
Long
classifyId
);
/**
* 直接切群
*/
String
changeGroupQrCode
(
Long
classifyId
);
/**
...
...
@@ -119,6 +126,21 @@ public interface GroupQrcodeBiz {
* @return
*/
Map
<
String
,
GroupQrcodeInfo4Advertising
>
listGroupQrcodeInfo4Advertising
(
List
<
String
>
wxGroupIds
);
/**
* 将二维码改为已满群
* @param weixinQrcodeId
* @param groupQrcodeId
*/
void
changeToOverNumber
(
Long
weixinQrcodeId
,
Long
groupQrcodeId
);
/**
* 将二维码改为未满群
* @param weixinQrcodeId
* @param groupQrcodeId
*/
void
changeToNotOverNumber
(
Long
weixinQrcodeId
,
Long
groupQrcodeId
);
/**
* 按条件查微信群
* @param query
...
...
pcloud-service-book/src/main/java/com/pcloud/book/group/biz/impl/GroupQrcodeBizImpl.java
View file @
ec064861
...
...
@@ -45,6 +45,7 @@ import com.pcloud.book.push.dao.PushGroupDao;
import
com.pcloud.book.push.entity.PushGroup
;
import
com.pcloud.book.riddle.dto.GroupRiddleDTO
;
import
com.pcloud.book.util.common.ThreadPoolUtils
;
import
com.pcloud.common.constant.CacheConstant
;
import
com.pcloud.common.core.aspect.ParamLog
;
import
com.pcloud.common.page.PageBeanNew
;
import
com.pcloud.common.page.PageParam
;
...
...
@@ -73,6 +74,7 @@ import java.util.Objects;
import
java.util.Optional
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.atomic.AtomicBoolean
;
import
java.util.stream.Collectors
;
...
...
@@ -119,75 +121,80 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
/**
* 自动更新群人数线程是否开始执行
*/
private
static
final
AtomicBoolean
IS_START
=
new
AtomicBoolean
(
false
);
//
private static final AtomicBoolean IS_START = new AtomicBoolean(false);
/**
* 处理群人数线程池
*/
private
static
final
ExecutorService
SINGLE_THREAD_EXECUTOR
=
Executors
.
newSingleThreadExecutor
();
//
private static final ExecutorService SINGLE_THREAD_EXECUTOR = Executors.newSingleThreadExecutor();
@Override
public
Integer
updateGroupCount
(
String
wxGroupId
,
Integer
num
)
{
return
groupQrcodeDao
.
updateGroupCount
(
wxGroupId
,
num
);
}
/**
* 更新群人数线程
*/
private
void
updateGroupNum
()
{
// 若已开始则无需再启动
if
(
IS_START
.
get
())
{
return
;
}
// 若设置时已经为true则代表已经有线程执行成功
final
boolean
andSet
=
IS_START
.
getAndSet
(
true
);
if
(
andSet
)
{
return
;
}
SINGLE_THREAD_EXECUTOR
.
execute
(()
->
{
while
(
true
)
{
try
{
if
(
BookBusinessConstants
.
GROUP_NUM_DTO_MAP
.
size
()
<
1
)
{
try
{
Thread
.
sleep
(
10000
);
}
catch
(
InterruptedException
e
)
{
log
.
error
(
"[updateGroupNum] InterruptedException:{}"
,
e
);
}
continue
;
}
log
.
info
(
"[更新群人数] start GROUP_NUM_DTO_MAP:{}"
,
BookBusinessConstants
.
GROUP_NUM_DTO_MAP
);
for
(
Map
.
Entry
<
String
,
AutoUpdateGroupNumDTO
>
entry
:
BookBusinessConstants
.
GROUP_NUM_DTO_MAP
.
entrySet
())
{
final
AutoUpdateGroupNumDTO
value
=
entry
.
getValue
();
// 没到时间不执行(小于30s并且小于3个人不执行)
final
boolean
b
=
null
==
value
||
((
System
.
currentTimeMillis
()
+
10
)
<
value
.
getStartTime
().
getTime
()
&&
value
.
getNum
().
get
()
<
3
);
if
(
b
)
{
log
.
info
(
"[更新群人数] null == value:{}"
,
entry
);
continue
;
}
Integer
peopleCounts
=
WxGroupSDK
.
getPeopleCounts
(
value
.
getWxGroupId
(),
value
.
getRobotId
(),
value
.
getIp
());
if
(
null
==
peopleCounts
||
peopleCounts
<
1
)
{
log
.
info
(
"[更新群人数] null == peopleCounts || peopleCounts < 1 entry:{}; peopleCounts:{}"
,
entry
,
peopleCounts
);
// 若未获取到将其移除
BookBusinessConstants
.
GROUP_NUM_DTO_MAP
.
remove
(
entry
.
getKey
());
continue
;
}
log
.
info
(
"[更新群人数] entry:{}, peopleCounts:{}"
,
entry
,
peopleCounts
);
groupQrcodeDao
.
updateUserNumber
(
value
.
getWxGroupId
(),
peopleCounts
);
BookBusinessConstants
.
GROUP_NUM_DTO_MAP
.
remove
(
entry
.
getKey
());
try
{
Thread
.
sleep
(
1000
);
}
catch
(
InterruptedException
e
)
{
log
.
error
(
"[updateGroupNum] InterruptedException:{}"
,
e
);
}
}
}
catch
(
Exception
e
)
{
log
.
error
(
"[updateGroupNum] : Exception:{}"
,
e
);
}
try
{
Thread
.
sleep
(
10000
);
}
catch
(
InterruptedException
e
)
{
log
.
error
(
"[updateGroupNum] InterruptedException:{}"
,
e
);
}
}
});
}
//
private void updateGroupNum() {
//
// 若已开始则无需再启动
//
if(IS_START.get()) {
//
return;
//
}
//
// 若设置时已经为true则代表已经有线程执行成功
//
final boolean andSet = IS_START.getAndSet(true);
//
if (andSet) {
//
return;
//
}
//
SINGLE_THREAD_EXECUTOR.execute(() -> {
//
while (true) {
//
try{
//
if (BookBusinessConstants.GROUP_NUM_DTO_MAP.size() < 1) {
//
try {
//
Thread.sleep(10000);
//
} catch (InterruptedException e) {
//
log.error("[updateGroupNum] InterruptedException:{}", e);
//
}
//
continue;
//
}
//
log.info("[更新群人数] start GROUP_NUM_DTO_MAP:{}", BookBusinessConstants.GROUP_NUM_DTO_MAP);
//
for (Map.Entry<String, AutoUpdateGroupNumDTO> entry : BookBusinessConstants.GROUP_NUM_DTO_MAP.entrySet()) {
//
final AutoUpdateGroupNumDTO value = entry.getValue();
//
// 没到时间不执行(小于30s并且小于3个人不执行)
//
final boolean b = null == value || ((System.currentTimeMillis() + 10) < value.getStartTime().getTime() && value.getNum().get() < 3);
//
if(b) {
//
log.info("[更新群人数] null == value:{}", entry);
//
continue;
//
}
//
Integer peopleCounts = WxGroupSDK.getPeopleCounts(value.getWxGroupId(), value.getRobotId(), value.getIp());
//
if (null == peopleCounts || peopleCounts < 1) {
//
log.info("[更新群人数] null == peopleCounts || peopleCounts < 1 entry:{}; peopleCounts:{}", entry, peopleCounts);
//
// 若未获取到将其移除
//
BookBusinessConstants.GROUP_NUM_DTO_MAP.remove(entry.getKey());
//
continue;
//
}
//
log.info("[更新群人数] entry:{}, peopleCounts:{}", entry, peopleCounts);
//
groupQrcodeDao.updateUserNumber(value.getWxGroupId(), peopleCounts);
//
BookBusinessConstants.GROUP_NUM_DTO_MAP.remove(entry.getKey());
//
try {
//
Thread.sleep(1000);
//
} catch (InterruptedException e) {
//
log.error("[updateGroupNum] InterruptedException:{}", e);
//
}
//
}
//
} catch (Exception e) {
//
log.error("[updateGroupNum] : Exception:{}", e);
//
}
//
try {
//
Thread.sleep(10000);
//
} catch (InterruptedException e) {
//
log.error("[updateGroupNum] InterruptedException:{}", e);
//
}
//
}
//
});
//
}
@Override
public
String
getChangeGroupQrCode
(
Long
classifyId
)
{
...
...
@@ -202,7 +209,7 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
List
<
ClassifyQrcodeVO
>
qrcodeByClassify
=
groupQrcodeDao
.
getQrcodeByClassifyId
(
classifyId
);
if
(
CollectionUtils
.
isEmpty
(
qrcodeByClassify
))
{
// 如果没有群则新增一个
String
url
=
addWechatGroup
(
classifyId
,
null
);
String
url
=
changeGroupQrCode
(
classifyId
);
log
.
info
(
"[前端调用切群接口] getChangeGroupQrCode 分类异常没有群 重新分配群classifyId:{} url:{}"
,
classifyId
,
url
);
return
url
;
}
...
...
@@ -210,7 +217,7 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
List
<
ClassifyQrcodeVO
>
collect
=
qrcodeByClassify
.
stream
().
filter
(
p
->
QrcodeStatusEnum
.
ON_USE
.
value
.
equals
(
p
.
getQrcodeState
())).
collect
(
Collectors
.
toList
());
if
(
CollectionUtils
.
isEmpty
(
collect
))
{
// 如果没有使用中群则新增一个
String
url
=
addWechatGroup
(
classifyId
,
null
);
String
url
=
changeGroupQrCode
(
classifyId
);
log
.
info
(
"[前端调用切群接口] getChangeGroupQrCode 没有使用中的群 重新分配群classifyId:{} url:{}"
,
classifyId
,
url
);
return
url
;
}
...
...
@@ -222,7 +229,7 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
//将二维码修改为已满群状态
changeToOverNumber
(
qrcodeVO
.
getWeixinQrcodeId
(),
qrcodeVO
.
getId
());
// 如果没有群则新增一个
String
url
=
addWechatGroup
(
classifyId
,
null
);
String
url
=
changeGroupQrCode
(
classifyId
);
log
.
info
(
"[前端调用切群接口] getChangeGroupQrCode 群超出切群人数了,但是没有切群 重新分配群classifyId:{} url:{}"
,
classifyId
,
url
);
return
url
;
}
...
...
@@ -240,7 +247,7 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
}
if
(
Objects
.
isNull
(
url
))
{
// 如果没有群则新增一个
String
qrcodeUrl
=
addWechatGroup
(
classifyId
,
null
);
String
qrcodeUrl
=
changeGroupQrCode
(
classifyId
);
log
.
info
(
"[前端调用切群接口] getChangeGroupQrCode 没有可用群 重新分配群classifyId:{} url:{}"
,
classifyId
,
url
);
return
qrcodeUrl
;
}
...
...
@@ -249,9 +256,37 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
@Override
public
String
changeGroupQrCode
(
Long
classifyId
)
{
// 如果没有群则新增一个
String
url
=
addWechatGroup
(
classifyId
,
null
);
log
.
info
(
"[直接切群] changeGroupQrCode 直接切群classifyId:{} url:{}"
,
classifyId
,
url
);
return
changeGroup
(
classifyId
);
}
private
String
changeGroup
(
Long
classifyId
)
{
final
String
key
=
CacheConstant
.
BOOK
+
"changeGroup:"
+
classifyId
;
final
String
qrcodeKey
=
CacheConstant
.
BOOK
+
"changeGroupQrCode:"
+
classifyId
;
String
url
=
StringUtil
.
EMPTY
;
final
String
threadId
=
Thread
.
currentThread
().
getId
()
+
""
;
try
{
boolean
getLock
=
JedisClusterUtils
.
setnx
(
key
,
threadId
);
if
(
getLock
)
{
JedisClusterUtils
.
expire
(
key
,
3
);
// 双重校验避免前一个事务未提交
String
qrcode
=
JedisClusterUtils
.
get
(
qrcodeKey
);
if
(
StringUtil
.
isNotBlank
(
qrcode
))
{
return
qrcode
;
}
// 如果没有群则新增一个
url
=
addWechatGroup
(
classifyId
,
null
);
log
.
info
(
"[直接切群] changeGroupQrCode 直接切群classifyId:{} url:{}"
,
classifyId
,
url
);
// 切群之后将新切群放入缓存5分钟,5分钟内若需要切群则直接从缓存中获取,避免事务未提交,双重判断
JedisClusterUtils
.
setex
(
qrcodeKey
,
60
*
5
,
url
);
}
else
{
return
url
;
}
}
finally
{
String
s
=
JedisClusterUtils
.
get
(
key
);
if
(
StringUtil
.
isNotBlank
(
s
)
&&
s
.
contains
(
threadId
))
{
JedisClusterUtils
.
del
(
key
);
}
}
return
url
;
}
...
...
@@ -398,12 +433,12 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
log
.
info
(
"[新增一个用户] : robotId is null weixinGroupId:{},memberCount:{},nickName:{},robotId:{}"
,
weixinGroupId
,
memberCount
,
nickName
,
robotId
);
robotIdByGroupId
=
wechatGroupConsr
.
getRobotIdByGroupId
(
weixinGroupId
);
}
if
(
robotIdByGroupId
!=
null
){
Integer
peopleCounts
=
WxGroupSDK
.
getPeopleCounts
(
weixinGroupId
,
robotIdByGroupId
,
ip
);
if
(
peopleCounts
!=
null
)
{
memberCount
=
peopleCounts
;
}
}
//
if(robotIdByGroupId != null){
//
Integer peopleCounts = WxGroupSDK.getPeopleCounts(weixinGroupId, robotIdByGroupId, ip);
//
if (peopleCounts != null) {
//
memberCount = peopleCounts;
//
}
//
}
//获取群基本信息
GroupQrcodeDTO
groupQrcodeDTO
=
groupQrcodeDao
.
getGroupQrcodeInfo
(
weixinGroupId
);
log
.
info
(
"[新增一个用户] groupQrcodeDTO:{}"
,
groupQrcodeDTO
);
...
...
@@ -411,21 +446,24 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
return
;
}
//更新用户数(由于微信有延迟及时更新可能会数据对不上,所以调用方法延迟30s,统一处理)
AutoUpdateGroupNumDTO
numDTO
=
BookBusinessConstants
.
GROUP_NUM_DTO_MAP
.
get
(
weixinGroupId
);
if
(
null
==
numDTO
){
numDTO
=
new
AutoUpdateGroupNumDTO
(
weixinGroupId
,
robotId
,
ip
,
new
Date
());
}
else
{
numDTO
.
getNum
().
incrementAndGet
();
numDTO
.
setRobotId
(
robotId
);
numDTO
.
setIp
(
ip
);
numDTO
.
setWxGroupId
(
weixinGroupId
);
numDTO
.
setStartTime
(
new
Date
());
}
BookBusinessConstants
.
GROUP_NUM_DTO_MAP
.
put
(
weixinGroupId
,
numDTO
);
// 发消息时获取的群人数更准确memberCount 20190905
// AutoUpdateGroupNumDTO numDTO = BookBusinessConstants.GROUP_NUM_DTO_MAP.get(weixinGroupId);
// if (null == numDTO){
// numDTO = new AutoUpdateGroupNumDTO(weixinGroupId, robotId, ip, new Date());
// } else {
// numDTO.getNum().incrementAndGet();
// numDTO.setRobotId(robotId);
// numDTO.setIp(ip);
// numDTO.setWxGroupId(weixinGroupId);
// numDTO.setStartTime(new Date());
// }
// BookBusinessConstants.GROUP_NUM_DTO_MAP.put(weixinGroupId, numDTO);
// 启动更新群人数线程
if
(!
IS_START
.
get
())
{
this
.
updateGroupNum
();
}
// if (!IS_START.get()) {
// this.updateGroupNum();
// }
// 新用户进群时系统消息群人数不准,所以从系统中取然后+1,更新群人数操作会在群消息地方处理
memberCount
=
groupQrcodeDTO
.
getUserNumber
()
+
1
;
//如果人数超过限制,重新分配群
if
(
memberCount
>=
groupQrcodeDTO
.
getChangeNumber
()
&&
QrcodeStatusEnum
.
ON_USE
.
value
.
equals
(
groupQrcodeDTO
.
getQrcodeState
()))
{
//修改状态,重新分配一个群
...
...
@@ -651,11 +689,20 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
@ParamLog
(
"将二维码改为已满群"
)
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
changeToOverNumber
(
Long
weixinQrcodeId
,
Long
id
)
{
groupQrcodeDao
.
updateUseState
(
id
,
QrcodeStatusEnum
.
OVER_NUMBER
.
value
);
@Override
public
void
changeToOverNumber
(
Long
weixinQrcodeId
,
Long
groupQrcodeId
)
{
groupQrcodeDao
.
updateUseState
(
groupQrcodeId
,
QrcodeStatusEnum
.
OVER_NUMBER
.
value
);
weixinQrcodeBiz
.
updateUseState
(
weixinQrcodeId
,
QrcodeStatusEnum
.
OVER_NUMBER
.
value
);
}
@ParamLog
(
"将二维码改为未满群"
)
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Override
public
void
changeToNotOverNumber
(
Long
weixinQrcodeId
,
Long
groupQrcodeId
)
{
groupQrcodeDao
.
updateUseState
(
groupQrcodeId
,
QrcodeStatusEnum
.
ON_USE
.
value
);
weixinQrcodeBiz
.
updateUseState
(
weixinQrcodeId
,
QrcodeStatusEnum
.
ON_USE
.
value
);
}
@Override
public
List
<
Long
>
listQrcodeIdsByLabelQuery
(
String
query
,
Long
proLabelId
,
Long
depLabelId
,
Long
purLabelId
)
{
Map
<
String
,
Object
>
paramMap
=
new
HashMap
<>();
...
...
pcloud-service-book/src/main/java/com/pcloud/book/group/dao/GroupQrcodeDao.java
View file @
ec064861
...
...
@@ -18,6 +18,8 @@ import java.util.Map;
*/
public
interface
GroupQrcodeDao
extends
BaseDao
<
GroupQrcode
>
{
Integer
updateGroupCount
(
String
wxGroupId
,
Integer
num
);
void
updateGroupQrcode
(
Long
groupQrcodeId
,
String
qrcodeUrl
,
Long
userId
);
List
<
ListGroupQrcodeResponseVO
>
listAllGroupQrcode
(
String
groupName
);
...
...
@@ -91,6 +93,8 @@ public interface GroupQrcodeDao extends BaseDao<GroupQrcode> {
*/
Integer
changeQrcodeState
(
Long
id
,
Integer
qrcode_state
);
Integer
changeQrcodeStateForNotOver
(
Long
id
,
Integer
qrcode_state
);
/**
* @Author:lili
* @Desr:获取群二维码相关信息
...
...
pcloud-service-book/src/main/java/com/pcloud/book/group/dao/impl/GroupQrcodeDaoImpl.java
View file @
ec064861
...
...
@@ -24,6 +24,15 @@ import java.util.Map;
*/
@Component
(
"groupQrcodeDao"
)
public
class
GroupQrcodeDaoImpl
extends
BaseDaoImpl
<
GroupQrcode
>
implements
GroupQrcodeDao
{
@Override
public
Integer
updateGroupCount
(
String
wxGroupId
,
Integer
num
)
{
final
Map
<
String
,
Object
>
map
=
Maps
.
newHashMap
();
map
.
put
(
"weixinGroupId"
,
wxGroupId
);
map
.
put
(
"userNumber"
,
num
);
return
this
.
getSqlSession
().
update
(
this
.
getStatement
(
"updateGroupCount"
),
map
);
}
@Override
public
void
updateGroupQrcode
(
Long
groupQrcodeId
,
String
qrcodeUrl
,
Long
userId
)
{
final
Map
<
String
,
Object
>
map
=
Maps
.
newHashMap
();
...
...
@@ -106,6 +115,15 @@ public class GroupQrcodeDaoImpl extends BaseDaoImpl<GroupQrcode> implements Grou
return
this
.
getSqlSession
().
update
(
this
.
getStatement
(
"changeQrcodeState"
),
paramMap
);
}
@Override
public
Integer
changeQrcodeStateForNotOver
(
Long
id
,
Integer
qrcodeState
)
{
Map
<
String
,
Object
>
paramMap
=
new
HashMap
<>();
paramMap
.
put
(
"id"
,
id
);
paramMap
.
put
(
"qrcodeState"
,
qrcodeState
);
return
this
.
getSqlSession
().
update
(
this
.
getStatement
(
"changeQrcodeStateForNotOver"
),
paramMap
);
}
@Override
public
Map
<
Long
,
GroupQrcodeInfoDTO
>
listQrcodeInfoByIds
(
List
<
Long
>
groupQrcodeIds
)
{
return
this
.
getSqlSession
().
selectMap
(
this
.
getStatement
(
"listQrcodeInfoByIds"
),
groupQrcodeIds
,
"id"
);
...
...
pcloud-service-book/src/main/java/com/pcloud/book/group/dto/GroupQrcodeDTO.java
View file @
ec064861
...
...
@@ -2,10 +2,13 @@ package com.pcloud.book.group.dto;
import
java.io.Serializable
;
import
lombok.Data
;
/**
* @author lily
* @date 2019/4/28 15:02
*/
@Data
public
class
GroupQrcodeDTO
implements
Serializable
{
/**
...
...
@@ -34,6 +37,11 @@ public class GroupQrcodeDTO implements Serializable {
private
Integer
changeNumber
;
/**
* 当前群人数
*/
private
Integer
userNumber
;
/**
* 二维码状态
*/
private
Integer
qrcodeState
;
...
...
@@ -43,83 +51,10 @@ public class GroupQrcodeDTO implements Serializable {
*/
private
Integer
useState
;
/**
* 群名称
*/
private
String
groupName
;
public
Long
getId
()
{
return
id
;
}
public
void
setId
(
Long
id
)
{
this
.
id
=
id
;
}
public
Long
getWeixinQrcodeId
()
{
return
weixinQrcodeId
;
}
public
void
setWeixinQrcodeId
(
Long
weixinQrcodeId
)
{
this
.
weixinQrcodeId
=
weixinQrcodeId
;
}
public
Integer
getChangeNumber
()
{
return
changeNumber
;
}
public
void
setChangeNumber
(
Integer
changeNumber
)
{
this
.
changeNumber
=
changeNumber
;
}
public
Integer
getQrcodeState
()
{
return
qrcodeState
;
}
public
void
setQrcodeState
(
Integer
qrcodeState
)
{
this
.
qrcodeState
=
qrcodeState
;
}
public
Integer
getUseState
()
{
return
useState
;
}
public
void
setUseState
(
Integer
useState
)
{
this
.
useState
=
useState
;
}
public
String
getWeixinGroupId
()
{
return
weixinGroupId
;
}
public
void
setWeixinGroupId
(
String
weixinGroupId
)
{
this
.
weixinGroupId
=
weixinGroupId
;
}
public
Long
getClassifyId
()
{
return
classifyId
;
}
public
void
setClassifyId
(
Long
classifyId
)
{
this
.
classifyId
=
classifyId
;
}
public
String
getGroupName
()
{
return
groupName
;
}
public
void
setGroupName
(
String
groupName
)
{
this
.
groupName
=
groupName
;
}
@Override
public
String
toString
()
{
return
"GroupQrcodeDTO{"
+
"id="
+
id
+
", classifyId="
+
classifyId
+
", weixinQrcodeId="
+
weixinQrcodeId
+
", weixinGroupId="
+
weixinGroupId
+
", changeNumber="
+
changeNumber
+
", qrcodeState="
+
qrcodeState
+
", useState="
+
useState
+
", groupName='"
+
groupName
+
'\''
+
'}'
;
}
}
pcloud-service-book/src/main/java/com/pcloud/book/group/tools/SendWeixinRequestTools.java
View file @
ec064861
...
...
@@ -376,6 +376,9 @@ public class SendWeixinRequestTools {
}
private
static
StringBuilder
getGroupKeyword
(
KeywordStatusDTO
dto
,
StringBuilder
sb
)
{
if
(!
sb
.
toString
().
contains
(
"【"
)
&&
(
dto
.
getClockOpen
()
||
dto
.
getRiddleOpen
()
||
dto
.
getReportOpen
()))
{
sb
.
append
(
"\n\n在群内回复以下关键词:\n"
);
}
if
(
dto
.
getReportOpen
())
{
sb
.
append
(
"【学习报告】 "
);
}
...
...
@@ -385,7 +388,7 @@ public class SendWeixinRequestTools {
if
(
dto
.
getClockOpen
())
{
sb
.
append
(
"【"
).
append
(
dto
.
getClockKeyword
()).
append
(
"】 "
);
}
if
(
StringUtil
.
isNotBlank
(
sb
))
{
if
(
StringUtil
.
isNotBlank
(
sb
)
&&
sb
.
toString
().
contains
(
"【"
)
)
{
sb
.
append
(
",领取任务或资源"
);
}
return
sb
;
...
...
pcloud-service-book/src/main/java/com/pcloud/book/keywords/biz/BookKeywordBiz.java
View file @
ec064861
...
...
@@ -6,6 +6,7 @@ import com.pcloud.book.keywords.dto.ReplyKeywordDTO;
import
com.pcloud.book.keywords.dto.ServiceResourceDTO
;
import
com.pcloud.book.keywords.vo.*
;
import
com.pcloud.common.page.PageBeanNew
;
import
com.pcloud.wechatgroup.message.dto.SendTextDTO
;
import
com.sdk.wxgroup.SendMessageTypeEnum
;
import
java.util.List
;
...
...
@@ -71,7 +72,26 @@ public interface BookKeywordBiz {
* @Desr: 回复关键词消息
* @Date:2019/5/5 16:28
*/
void
sendKeywordMessage
(
String
content
,
String
weixinGroupId
,
String
userWxId
,
String
robotId
,
String
ip
,
Integer
code
);
void
sendKeywordMessage
(
SendTextDTO
sendTextDTO
);
/**
* 更新群人数
* @param wxGroupId 微信群id
* @param memberCount 群人数
* @param changeNumber 切群人数
* @param weixinQrcodeId weixin表主键
* @param groupQrcodeId groupQrcode表主键
*/
void
updateGroupPeopleCount
(
String
wxGroupId
,
Integer
memberCount
,
Integer
changeNumber
,
Long
weixinQrcodeId
,
Long
groupQrcodeId
);
/**
* 修改群名称
* @param weixinGroupId 微信群id
* @param groupName 群名称
* @param robotId 机器人id
* @param ip ip地址
*/
void
checkGroupName
(
String
weixinGroupId
,
String
groupName
,
String
robotId
,
String
ip
);
/**
* 关键词统计
...
...
pcloud-service-book/src/main/java/com/pcloud/book/keywords/biz/impl/BookKeywordBizImpl.java
View file @
ec064861
...
...
@@ -13,16 +13,17 @@ import com.pcloud.book.consumer.resource.ProductConsr;
import
com.pcloud.book.consumer.wechatgroup.WechatGroupConsr
;
import
com.pcloud.book.group.biz.BookGroupBiz
;
import
com.pcloud.book.group.biz.BookGroupClassifyBiz
;
import
com.pcloud.book.group.biz.GroupQrcodeBiz
;
import
com.pcloud.book.group.dao.AppTouchRecordDao
;
import
com.pcloud.book.group.dao.BookGroupClassifyDao
;
import
com.pcloud.book.group.dao.BookGroupDao
;
import
com.pcloud.book.group.dao.GroupQrcodeDao
;
import
com.pcloud.book.group.dto.BookGroupDTO
;
import
com.pcloud.book.group.dto.GroupClassifyQrcodeDTO
;
import
com.pcloud.book.group.dto.GroupQrcodeDTO
;
import
com.pcloud.book.group.dto.JoinGroupCipherDTO
;
import
com.pcloud.book.group.entity.AppTouchRecord
;
import
com.pcloud.book.group.entity.GroupQrcode
;
import
com.pcloud.book.group.enums.QrcodeStatusEnum
;
import
com.pcloud.book.group.enums.TouchTypeEnum
;
import
com.pcloud.book.group.tools.SendWeixinRequestTools
;
import
com.pcloud.book.group.vo.ClassifyNameVO
;
...
...
@@ -67,6 +68,7 @@ import com.pcloud.common.utils.string.StringUtil;
import
com.pcloud.resourcecenter.product.dto.ProductDto
;
import
com.pcloud.resourcecenter.product.dto.ProductTypeDto
;
import
com.pcloud.wechatgroup.group.dto.RobotReplyDTO
;
import
com.pcloud.wechatgroup.message.dto.SendTextDTO
;
import
com.sdk.wxgroup.ChangeNameVO
;
import
com.sdk.wxgroup.SendMessageTypeEnum
;
import
com.sdk.wxgroup.WxGroupSDK
;
...
...
@@ -131,12 +133,14 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
private
QrcodeSceneService
qrcodeSceneService
;
@Autowired
private
BookGroupBiz
bookGroupBiz
;
@Autowired
private
GroupQrcodeBiz
groupQrcodeBiz
;
@Override
@ParamLog
(
"新增关键词"
)
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
insertKeyword
(
SetKeywordVO
setKeywordVO
)
{
if
(
null
==
setKeywordVO
||
setKeywordVO
.
check
())
{
if
(
null
==
setKeywordVO
||
setKeywordVO
.
check
())
{
throw
new
BookBizException
(
BookBizException
.
PARAM_IS_NULL
,
"应用/作品信息为空"
);
}
if
(
setKeywordVO
.
getClassifyId
()
==
null
)
{
...
...
@@ -166,7 +170,7 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
productConsr
.
productAutoOnShelves
(
bookGroupDTO
.
getChannelId
(),
productIds
);
//新增关键词与分类或者图书的关系
//按群创建
if
(
setKeywordVO
.
getSetType
()
==
1
){
if
(
setKeywordVO
.
getSetType
()
==
1
)
{
BookKeyword
bookKeyword
=
new
BookKeyword
();
BeanUtils
.
copyProperties
(
setKeywordVO
,
bookKeyword
);
bookKeyword
.
setKeywordId
(
keyword
.
getId
());
...
...
@@ -182,10 +186,10 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
bookKeyword
.
setWarehouseId
(
warehouseId
);
bookKeyword
.
setIsWarehouse
(
1
);
}
if
(
null
==
bookKeyword
.
getIsWarehouse
())
{
if
(
null
==
bookKeyword
.
getIsWarehouse
())
{
bookKeyword
.
setIsWarehouse
(
0
);
}
if
(
null
==
bookKeyword
.
getWarehouseId
())
{
if
(
null
==
bookKeyword
.
getWarehouseId
())
{
bookKeyword
.
setWarehouseId
(
0L
);
}
bookKeyword
.
setIsEdit
(
1
);
...
...
@@ -227,8 +231,8 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
// 书入库一遍,同样的就不要入库了
// setKeywordVO.setChannelId(bookGroupDTO.getChannelId());
// final Long warehouseId = bookKeywordWarehouseBiz.addBookKeyword(setKeywordVO);
cKeyword
.
setWarehouseId
(
bookKeyword
.
getWarehouseId
());
cKeyword
.
setIsWarehouse
(
1
);
cKeyword
.
setWarehouseId
(
bookKeyword
.
getWarehouseId
());
cKeyword
.
setIsWarehouse
(
1
);
}
if
(
null
==
cKeyword
.
getIsWarehouse
())
{
cKeyword
.
setIsWarehouse
(
0
);
...
...
@@ -238,7 +242,7 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
}
if
(
0
==
cKeyword
.
getClassifyId
())
{
cKeyword
.
setIsEdit
(
1
);
}
else
{
}
else
{
cKeyword
.
setIsEdit
(
0
);
}
bookKeywords
.
add
(
cKeyword
);
...
...
@@ -252,7 +256,7 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
}
if
(
0
==
bookKeyword
.
getClassifyId
())
{
bookKeyword
.
setIsEdit
(
1
);
}
else
{
}
else
{
bookKeyword
.
setIsEdit
(
0
);
}
bookKeywords
.
add
(
bookKeyword
);
...
...
@@ -298,14 +302,14 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
BeanUtils
.
copyProperties
(
updateKeywordVO
,
v
);
if
(
ChannelEnum
.
APP
.
value
.
equals
(
updateKeywordVO
.
getServeType
()))
{
final
AppDto
baseById
=
appConsr
.
getBaseById
(
updateKeywordVO
.
getServeId
());
if
(
null
==
baseById
)
{
if
(
null
==
baseById
)
{
throw
new
BookBizException
(
BookBizException
.
ID_NOT_EXIST
,
"应用不存在"
);
}
v
.
setTypeCode
(
baseById
.
getTypeCode
());
}
if
(
ChannelEnum
.
PRODUCT
.
value
.
equals
(
updateKeywordVO
.
getServeType
()))
{
final
ProductDto
proBaseById
=
productConsr
.
getProBaseById
(
updateKeywordVO
.
getServeId
());
if
(
null
==
proBaseById
)
{
if
(
null
==
proBaseById
)
{
throw
new
BookBizException
(
BookBizException
.
ID_NOT_EXIST
,
"作品不存在"
);
}
v
.
setTypeCode
(
proBaseById
.
getProductTypeCode
());
...
...
@@ -332,17 +336,17 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
@Transactional
(
rollbackFor
=
Exception
.
class
)
@ParamLog
(
"删除关键词"
)
public
void
deleteKeyword
(
DeleteKeywordVO
deleteKeywordVO
,
Long
partyId
)
{
if
(
deleteKeywordVO
==
null
||
deleteKeywordVO
.
getIsEdit
()
==
null
||
deleteKeywordVO
.
getKeywordId
()
==
null
){
throw
new
BookBizException
(
BookBizException
.
ERROR
,
"缺少必要参数"
);
if
(
deleteKeywordVO
==
null
||
deleteKeywordVO
.
getIsEdit
()
==
null
||
deleteKeywordVO
.
getKeywordId
()
==
null
)
{
throw
new
BookBizException
(
BookBizException
.
ERROR
,
"缺少必要参数"
);
}
if
(
deleteKeywordVO
.
getClassifyId
()
==
null
){
if
(
deleteKeywordVO
.
getClassifyId
()
==
null
)
{
deleteKeywordVO
.
setClassifyId
(
0L
);
}
if
(
deleteKeywordVO
.
getIsEdit
()
==
1
){
if
(
deleteKeywordVO
.
getIsEdit
()
==
1
)
{
keywordDao
.
deleteById
(
deleteKeywordVO
.
getKeywordId
(),
partyId
);
bookKeywordDao
.
deleteById
(
deleteKeywordVO
.
getKeywordId
(),
partyId
);
}
else
{
bookKeywordDao
.
deleteKeywords
(
deleteKeywordVO
.
getKeywordId
(),
deleteKeywordVO
.
getBookGroupId
(),
deleteKeywordVO
.
getClassifyId
(),
partyId
);
}
else
{
bookKeywordDao
.
deleteKeywords
(
deleteKeywordVO
.
getKeywordId
(),
deleteKeywordVO
.
getBookGroupId
(),
deleteKeywordVO
.
getClassifyId
(),
partyId
);
}
}
...
...
@@ -378,16 +382,16 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
if
(
"PRODUCT"
.
equalsIgnoreCase
(
vo
.
getServeType
()))
{
productIds
.
add
(
vo
.
getServeId
());
}
if
(
vo
.
getIsEdit
()
==
null
){
if
(
vo
.
getIsEdit
()
==
null
)
{
vo
.
setIsEdit
(
1
);
}
}
Map
<
Long
,
AppDto
>
app
=
Maps
.
newHashMap
();
if
(!
CollectionUtils
.
isEmpty
(
appIds
))
{
if
(!
CollectionUtils
.
isEmpty
(
appIds
))
{
app
=
appConsr
.
mapBaseByIds
(
appIds
);
}
Map
<
Long
,
ProductDto
>
proBasesByIds
=
Maps
.
newHashMap
();
if
(!
CollectionUtils
.
isEmpty
(
productIds
))
{
if
(!
CollectionUtils
.
isEmpty
(
productIds
))
{
proBasesByIds
=
productConsr
.
getProBasesByIds
(
productIds
);
}
final
BookGroupDTO
dtoById
=
bookGroupDao
.
getDTOById
(
listKeywordParam
.
getBookGroupId
());
...
...
@@ -432,10 +436,18 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
@Override
@ParamLog
(
"关键词消息回复"
)
public
void
sendKeywordMessage
(
String
content
,
String
weixinGroupId
,
String
userWxId
,
String
robotId
,
String
ip
,
Integer
code
)
{
public
void
sendKeywordMessage
(
SendTextDTO
sendTextDTO
)
{
if
(
Objects
.
isNull
(
sendTextDTO
))
{
return
;
}
// 刘娜需求 1001282 群不推送关键词
if
(
SendMessageTypeEnum
.
GROUP
.
getCode
().
equals
(
code
))
{
this
.
sendKeywordMessageToGroup
(
content
,
weixinGroupId
,
userWxId
,
robotId
,
ip
,
code
);
final
String
content
=
sendTextDTO
.
getTextContent
().
trim
();
final
String
userWxId
=
sendTextDTO
.
getWechatUserId
();
final
String
ip
=
sendTextDTO
.
getIp
();
final
Integer
code
=
sendTextDTO
.
getCode
();
String
robotId
=
sendTextDTO
.
getWxId
();
if
(
SendMessageTypeEnum
.
GROUP
.
getCode
().
equals
(
sendTextDTO
.
getCode
()))
{
this
.
sendKeywordMessageToGroup
(
sendTextDTO
);
return
;
}
//个人机器人接收消息的时候,weixinGroupId就是userWxId,也就是用户的id,robotId是接收的机器人的id
...
...
@@ -456,8 +468,8 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
for
(
JoinGroupCipherDTO
dto
:
dtos
)
{
cIds
.
add
(
dto
.
getClassifyId
());
bIds
.
add
(
dto
.
getBookGroupId
());
classifyToBookGroupMap
.
put
(
dto
.
getClassifyId
(),
dto
.
getBookGroupId
());
classifyToQrcodeMap
.
put
(
dto
.
getClassifyId
(),
dto
.
getQrcodeId
());
classifyToBookGroupMap
.
put
(
dto
.
getClassifyId
(),
dto
.
getBookGroupId
());
classifyToQrcodeMap
.
put
(
dto
.
getClassifyId
(),
dto
.
getQrcodeId
());
}
final
List
<
Long
>
classifyIds
=
Lists
.
newArrayList
(
cIds
);
List
<
ReplyKeywordDTO
>
replyKeywordDTOs
=
new
ArrayList
<>();
...
...
@@ -492,7 +504,7 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
// 处理链接地址
Long
classifyId
=
keywordClassifyIdMap
.
get
(
replyKeywordDTO
.
getKeywordId
());
final
GroupClassifyQrcodeDTO
dto
=
classifyMap
.
get
(
classifyId
);
if
(
null
==
dto
)
{
if
(
null
==
dto
)
{
log
.
info
(
"[关键词消息回复] 分类信息为空 replyKeywordDTO:{}; classifyMap:{}"
,
replyKeywordDTO
,
classifyMap
);
continue
;
}
...
...
@@ -533,7 +545,7 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
for
(
ReplyKeywordDTO
dto
:
replyKeywordDTOs
)
{
if
(
ReplyTypeEnum
.
APP
.
value
.
equals
(
dto
.
getReplyType
())
||
ReplyTypeEnum
.
LINK
.
value
.
equals
(
dto
.
getReplyType
()))
{
sb
.
append
(
dto
.
getKeywords
()).
append
(
":"
).
append
(
dto
.
getShortLinkUrl
()).
append
(
"\n"
);
}
else
if
(
ReplyTypeEnum
.
TEXT
.
value
.
equals
(
dto
.
getReplyType
())){
}
else
if
(
ReplyTypeEnum
.
TEXT
.
value
.
equals
(
dto
.
getReplyType
()))
{
sb
.
append
(
dto
.
getKeywords
()).
append
(
":"
).
append
(
dto
.
getContent
()).
append
(
"\n"
);
}
else
if
(
ReplyTypeEnum
.
IMAGE
.
value
.
equals
(
dto
.
getReplyType
()))
{
SendWeixinRequestTools
.
sendKeywordMessage
(
dto
,
robotId
,
userWxId
,
ip
,
code
);
...
...
@@ -561,11 +573,16 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
* 原有的推送群关键词改为推送个人关键词
*/
@ParamLog
(
"群关键词消息回复"
)
private
void
sendKeywordMessageToGroup
(
String
content
,
String
weixinGroupId
,
String
userWxId
,
String
robotId
,
String
ip
,
Integer
code
)
{
//简单过滤非关键词的词
if
(
StringUtil
.
isEmpty
(
content
)
||
content
.
length
()
>
20
)
{
private
void
sendKeywordMessageToGroup
(
SendTextDTO
sendTextDTO
)
{
if
(
Objects
.
isNull
(
sendTextDTO
))
{
return
;
}
final
String
content
=
sendTextDTO
.
getTextContent
().
trim
();
final
String
weixinGroupId
=
sendTextDTO
.
getWechatGroupId
();
final
String
userWxId
=
sendTextDTO
.
getWechatUserId
();
final
String
ip
=
sendTextDTO
.
getIp
();
final
Integer
code
=
sendTextDTO
.
getCode
();
String
robotId
=
sendTextDTO
.
getWxId
();
// 若非之前的机器人则不回复普通关键词
final
Boolean
groupRobot
=
wechatGroupConsr
.
isGroupRobot
(
robotId
);
log
.
info
(
"[wechatGroupConsr.isGroupRobot] robotId:{} groupRobot:{}"
,
robotId
,
groupRobot
);
...
...
@@ -578,9 +595,13 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
log
.
info
(
"[关键词消息回复] classifyQrcodeInfo is null"
);
return
;
}
ReplyKeywordDTO
replyKeywordDTO
;
//简单过滤非关键词的词
if
(
StringUtil
.
isEmpty
(
content
)
||
content
.
length
()
>
20
)
{
return
;
}
ReplyKeywordDTO
replyKeywordDTO
;
final
boolean
equals
=
"群主,来个抽奖"
.
equals
(
content
);
if
(
equals
){
if
(
equals
)
{
replyKeywordDTO
=
keywordDao
.
getByKeyword
(
"群主,来个抽奖"
);
}
else
{
//获取匹配关键词
...
...
@@ -627,17 +648,51 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
robotReplyDTO
.
setWxGroupId
(
weixinGroupId
);
robotReplyDTO
.
setWxUserId
(
userWxId
);
wechatGroupConsr
.
addFirstRobotReplyRecord
(
robotReplyDTO
);
// 异步修改群名称
String
finalRobotId
=
robotId
;
ThreadPoolUtils
.
OTHER_THREAD_POOL
.
execute
(()
->
{
checkGroupName
(
weixinGroupId
,
classifyQrcodeInfo
.
getGroupName
(),
finalRobotId
,
ip
);
});
}
/**
* 更新群人数
*/
@Override
public
void
updateGroupPeopleCount
(
String
wxGroupId
,
Integer
memberCount
,
Integer
changeNumber
,
Long
weixinQrcodeId
,
Long
groupQrcodeId
)
{
log
.
info
(
"[更新群人数] updateGroupPeopleCount wxGroupId:{} memberCount:{} changeNumber:{} weixinQrcodeId:{} groupQrcodeId:{}"
,
wxGroupId
,
memberCount
,
changeNumber
,
weixinQrcodeId
,
groupQrcodeId
);
if
(
Objects
.
isNull
(
memberCount
)
||
StringUtil
.
isBlank
(
wxGroupId
))
{
return
;
}
String
key
=
CacheConstant
.
BOOK
+
"groupPeopleCount:"
;
String
groupPeopleCount
=
JedisClusterUtils
.
hget
(
key
,
wxGroupId
);
log
.
info
(
"[更新群人数] updateGroupPeopleCount groupPeopleCount:{}"
,
groupPeopleCount
);
// 如果没有缓存或者有缓存但是人数与缓存不一致,代表有更新,则更新数据库
final
boolean
update
=
StringUtil
.
isBlank
(
groupPeopleCount
)
||
(
StringUtil
.
isNotBlank
(
groupPeopleCount
)
&&
Integer
.
parseInt
(
groupPeopleCount
)
>
0
&&
!
groupPeopleCount
.
equals
(
memberCount
+
""
));
if
(
update
)
{
JedisClusterUtils
.
hset
(
key
,
wxGroupId
,
memberCount
+
""
);
// 将二维码改为已满群BookKeywordBizImpl
if
(
memberCount
>=
changeNumber
)
{
groupQrcodeDao
.
changeQrcodeState
(
groupQrcodeId
,
QrcodeStatusEnum
.
OVER_NUMBER
.
value
);
log
.
info
(
"[更新群人数] 触发更新大于等于状态 wxGroupId:{} memberCount:{} changeNumber:{} weixinQrcodeId:{} groupQrcodeId:{}"
,
wxGroupId
,
memberCount
,
changeNumber
,
weixinQrcodeId
,
groupQrcodeId
);
}
else
{
groupQrcodeDao
.
changeQrcodeStateForNotOver
(
groupQrcodeId
,
QrcodeStatusEnum
.
ON_USE
.
value
);
log
.
info
(
"[更新群人数] 触发更新小于状态 wxGroupId:{} memberCount:{} changeNumber:{} weixinQrcodeId:{} groupQrcodeId:{}"
,
wxGroupId
,
memberCount
,
changeNumber
,
weixinQrcodeId
,
groupQrcodeId
);
}
if
(
memberCount
>=
100
)
{
groupQrcodeBiz
.
changeToOverNumber
(
weixinQrcodeId
,
groupQrcodeId
);
log
.
info
(
"[更新群人数] 触发更新满群状态 wxGroupId:{} memberCount:{} changeNumber:{} weixinQrcodeId:{} groupQrcodeId:{}"
,
wxGroupId
,
memberCount
,
changeNumber
,
weixinQrcodeId
,
groupQrcodeId
);
groupQrcodeDao
.
changeQrcodeState
(
groupQrcodeId
,
QrcodeStatusEnum
.
OVER_NUMBER
.
value
);
}
else
{
groupQrcodeBiz
.
changeToNotOverNumber
(
weixinQrcodeId
,
groupQrcodeId
);
log
.
info
(
"[更新群人数] 触发更新未满群状态 wxGroupId:{} memberCount:{} changeNumber:{} weixinQrcodeId:{} groupQrcodeId:{}"
,
wxGroupId
,
memberCount
,
changeNumber
,
weixinQrcodeId
,
groupQrcodeId
);
}
groupQrcodeBiz
.
updateGroupCount
(
wxGroupId
,
memberCount
);
log
.
info
(
"[成功更新群人数] updateGroupPeopleCount wxGroupId:{} memberCount:{}"
,
wxGroupId
,
memberCount
);
}
}
/**
* 修改群名称
*/
private
void
checkGroupName
(
String
weixinGroupId
,
String
groupName
,
String
robotId
,
String
ip
)
{
@Override
public
void
checkGroupName
(
String
weixinGroupId
,
String
groupName
,
String
robotId
,
String
ip
)
{
log
.
info
(
"[checkGroupName] weixinGroupId:{} groupName:{} robotId:{} ip:{} groupQrcodeDTO:{}"
,
weixinGroupId
,
groupQrcodeDao
,
robotId
,
ip
);
if
(
StringUtil
.
isBlank
(
weixinGroupId
)
||
StringUtil
.
isBlank
(
groupName
)
||
StringUtil
.
isBlank
(
robotId
)
||
StringUtil
.
isBlank
(
ip
))
{
return
;
...
...
@@ -691,7 +746,7 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
bookKeywordRecord
.
setSend
(
isSend
);
if
(
bookKeywordRecord
.
getGroupQrcodeId
()
==
null
)
{
GroupQrcode
groupQr
=
groupQrcodeDao
.
getGroupQrcodeByGroupId
(
weixinGroupId
);
if
(
groupQr
!=
null
)
{
if
(
groupQr
!=
null
)
{
bookKeywordRecord
.
setGroupQrcodeId
(
groupQr
.
getId
());
}
}
...
...
@@ -760,15 +815,15 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
@Override
public
Integer
getKeywordCount
(
Long
bookGroupId
,
Long
classifyId
)
{
if
(
bookGroupId
==
null
){
if
(
bookGroupId
==
null
)
{
throw
new
BookBizException
(
BookBizException
.
ERROR
,
"缺少参数bookGroupId"
);
}
return
bookKeywordDao
.
getKeywordCount
(
bookGroupId
,
classifyId
);
}
@Override
public
List
<
ServiceResourceDTO
>
getServiceByWeixinGroup
(
QrWeixinParam
qrWeixinParam
,
Long
classifyId
,
Long
qrcodeId
)
{
public
List
<
ServiceResourceDTO
>
getServiceByWeixinGroup
(
QrWeixinParam
qrWeixinParam
,
Long
classifyId
,
Long
qrcodeId
)
{
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"bookGroupId"
,
qrWeixinParam
.
getBookGroupId
());
List
<
ServiceResourceDTO
>
serviceResourceDTOS
=
ResponesUtils
.
list
(
bookKeywordDao
.
listBy
(
map
,
"getServiceByWeixinGroup"
),
ServiceResourceDTO
.
class
);
...
...
@@ -811,7 +866,7 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
serviceResourceDTOS
.
removeIf
(
vo
->
(
qrWeixinParam
.
getTypeCode
().
equals
(
vo
.
getTypeCode
())
&&
qrWeixinParam
.
getServeId
().
equals
(
vo
.
getFromId
())));
}
List
<
ServiceResourceDTO
>
uniqueResources
=
serviceResourceDTOS
.
stream
().
collect
(
Collectors
.
collectingAndThen
(
Collectors
.
collectingAndThen
(
Collectors
.
toCollection
(()
->
new
TreeSet
<>(
Comparator
.
comparing
(
o
->
o
.
getFromId
()
+
";"
+
o
.
getTypeCode
()))),
ArrayList:
:
new
)
);
return
uniqueResources
;
...
...
pcloud-service-book/src/main/java/com/pcloud/book/mq/topic/WxGroupSendTextListener.java
View file @
ec064861
...
...
@@ -4,13 +4,19 @@ import com.pcloud.book.clock.biz.BookClockKeywordBiz;
import
com.pcloud.book.clock.check.BookClockCheck
;
import
com.pcloud.book.clock.dto.BookClockInfoDTO
;
import
com.pcloud.book.consumer.wechatgroup.WechatGroupConsr
;
import
com.pcloud.book.group.biz.BookGroupClassifyBiz
;
import
com.pcloud.book.group.biz.GroupQrcodeBiz
;
import
com.pcloud.book.group.dto.GroupClassifyQrcodeDTO
;
import
com.pcloud.book.keywords.biz.BookKeywordBiz
;
import
com.pcloud.book.mq.config.MQTopicConumer
;
import
com.pcloud.book.riddle.biz.RiddleRecordBiz
;
import
com.pcloud.book.util.common.ThreadPoolUtils
;
import
com.pcloud.book.weixinclock.biz.WeixinClockBiz
;
import
com.pcloud.common.constant.CacheConstant
;
import
com.pcloud.common.core.aspect.ParamLog
;
import
com.pcloud.common.exceptions.BizException
;
import
com.pcloud.common.utils.ListUtils
;
import
com.pcloud.common.utils.cache.redis.JedisClusterUtils
;
import
com.pcloud.common.utils.string.StringUtil
;
import
com.pcloud.wechatgroup.message.dto.SendTextDTO
;
import
com.sdk.wxgroup.SendMessageTypeEnum
;
...
...
@@ -21,6 +27,8 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
java.util.List
;
import
java.util.Objects
;
import
lombok.extern.slf4j.Slf4j
;
/**
...
...
@@ -38,13 +46,13 @@ public class WxGroupSendTextListener {
@Autowired
private
WechatGroupConsr
wechatGroupConsr
;
@Autowired
private
BookClockKeywordBiz
bookClockKeywordBiz
;
@Autowired
private
BookClockCheck
bookClockCheck
;
@Autowired
private
RiddleRecordBiz
riddleRecordBiz
;
@Autowired
private
WeixinClockBiz
weixinClockBiz
;
@Autowired
private
GroupQrcodeBiz
groupQrcodeBiz
;
@Autowired
private
BookGroupClassifyBiz
bookGroupClassifyBiz
;
/**
* 接收微信用户进群消息
...
...
@@ -56,6 +64,8 @@ public class WxGroupSendTextListener {
if
(
sendTextDTO
==
null
||
sendTextDTO
.
getWechatGroupId
()
==
null
||
sendTextDTO
.
getTextContent
()
==
null
)
return
;
String
wechatUserId
=
sendTextDTO
.
getWechatUserId
();
// 更新群人数和群名称
changeGroupInfo
(
sendTextDTO
);
//校验是否机器人账号
List
<
String
>
allRobotWxIds
=
wechatGroupConsr
.
listAllRobotWxId
();
if
(!
ListUtils
.
isEmpty
(
allRobotWxIds
)
&&
!
allRobotWxIds
.
contains
(
wechatUserId
)
&&
!
StringUtil
.
isEmpty
(
sendTextDTO
.
getTextContent
()))
{
...
...
@@ -64,7 +74,7 @@ public class WxGroupSendTextListener {
weixinClockBiz
.
sendKeywordMessage
(
sendTextDTO
.
getTextContent
().
trim
(),
wechatUserId
,
sendTextDTO
.
getWechatGroupId
(),
sendTextDTO
.
getWxId
(),
sendTextDTO
.
getIp
());
}
else
{
final
long
l
=
System
.
currentTimeMillis
();
bookKeywordBiz
.
sendKeywordMessage
(
sendTextDTO
.
getTextContent
().
trim
(),
sendTextDTO
.
getWechatGroupId
(),
wechatUserId
,
sendTextDTO
.
getWxId
(),
sendTextDTO
.
getIp
(),
sendTextDTO
.
getCode
()
);
bookKeywordBiz
.
sendKeywordMessage
(
sendTextDTO
);
log
.
info
(
"[接收用户发送文本消息] 总耗时:{}ms "
,
System
.
currentTimeMillis
()
-
l
);
}
//猜谜语
...
...
@@ -75,4 +85,22 @@ public class WxGroupSendTextListener {
}
}
/**
* 更新群人数和群名称
* @param sendTextDTO 群消息DTO
*/
private
void
changeGroupInfo
(
SendTextDTO
sendTextDTO
){
// 异步修改群名称
String
finalRobotId
=
sendTextDTO
.
getWxId
();
ThreadPoolUtils
.
OTHER_THREAD_POOL
.
execute
(()
->
{
final
String
weixinGroupId
=
sendTextDTO
.
getWechatGroupId
();
final
String
ip
=
sendTextDTO
.
getIp
();
GroupClassifyQrcodeDTO
classifyQrcodeInfo
=
bookGroupClassifyBiz
.
getClassifyQrcodeInfo
(
weixinGroupId
);
// 处理更新群人数
bookKeywordBiz
.
updateGroupPeopleCount
(
weixinGroupId
,
sendTextDTO
.
getMemberCount
(),
classifyQrcodeInfo
.
getChangeNumber
(),
classifyQrcodeInfo
.
getWeixinQrcodeId
(),
classifyQrcodeInfo
.
getGroupQrcodeId
());
bookKeywordBiz
.
checkGroupName
(
weixinGroupId
,
classifyQrcodeInfo
.
getGroupName
(),
finalRobotId
,
ip
);
});
}
}
pcloud-service-book/src/main/resources/mapper/group/BookGroupClassify.Mapper.xml
View file @
ec064861
...
...
@@ -332,7 +332,8 @@
q.weixin_qrcode_id weixinQrcodeId,
q.qrcode_url qrCodeUrl,
g.join_group_type joinGroupType,
q.group_name groupName
q.group_name groupName,
c.change_number changeNumber
FROM
book_group_classify c
JOIN book_group_qrcode q ON c.id = q.classify_id
...
...
pcloud-service-book/src/main/resources/mapper/group/GroupQrcode.Mapper.xml
View file @
ec064861
...
...
@@ -26,6 +26,10 @@
create_user,create_time,update_time,is_delete,riddle_open
</sql>
<update
id=
"updateGroupCount"
parameterType=
"map"
>
update book_group_qrcode set user_number = #{userNumber} where weixin_group_id = #{weixinGroupId}
</update>
<update
id=
"updateGroupQrcode"
parameterType=
"map"
>
update book_group_qrcode set qrcode_url = #{qrcodeUrl}, update_user = #{updateUser}, update_time = now() where id = #{groupQrcodeId}
</update>
...
...
@@ -206,6 +210,7 @@
q.weixin_group_id weixinGroupId,
q.weixin_qrcode_id weixinQrcodeId,
q.group_name groupName,
q.user_number userNumber,
c.id classifyId
FROM
book_group_qrcode q
...
...
@@ -233,6 +238,16 @@
WHERE id = #{id} and qrcode_state = 1
</update>
<update
id=
"changeQrcodeStateForNotOver"
parameterType=
"map"
>
update
book_group_qrcode
<set>
qrcode_state = #{qrcodeState},
update_time = now()
</set>
WHERE id = #{id} and qrcode_state = 2
</update>
<resultMap
id=
"GroupQrcodeInfoMap"
type=
"GroupQrcodeInfoDTO"
>
<result
column=
"id"
property=
"id"
jdbcType=
"BIGINT"
/>
...
...
pom.xml
View file @
ec064861
...
...
@@ -35,6 +35,7 @@
<pcloud-common-config.version>
2.0.0-SNAPSHOT
</pcloud-common-config.version>
<pcloud-common-core.version>
2.0.0-SNAPSHOT
</pcloud-common-core.version>
<wxgroup-sdk.version>
1.1.0-SNAPSHOT
</wxgroup-sdk.version>
<pcloud-facade.version>
2.0.0-SNAPSHOT
</pcloud-facade.version>
</properties>
</profile>
...
...
@@ -49,6 +50,7 @@
<pcloud-common-config.version>
2.1.0-SNAPSHOT
</pcloud-common-config.version>
<pcloud-common-core.version>
2.1.0-SNAPSHOT
</pcloud-common-core.version>
<wxgroup-sdk.version>
1.0.0-SNAPSHOT
</wxgroup-sdk.version>
<pcloud-facade.version>
2.1.0-SNAPSHOT
</pcloud-facade.version>
</properties>
</profile>
...
...
@@ -62,6 +64,7 @@
<pcloud-common-config.version>
2.1.0-RELEASE
</pcloud-common-config.version>
<pcloud-common-core.version>
2.1.0-RELEASE
</pcloud-common-core.version>
<wxgroup-sdk.version>
1.0.0-RELEASE
</wxgroup-sdk.version>
<pcloud-facade.version>
2.1.0-RELEASE
</pcloud-facade.version>
</properties>
<!-- 设置默认环境 -->
<activation>
...
...
@@ -79,6 +82,7 @@
<pcloud-common-config.version>
2.0.0-SNAPSHOT
</pcloud-common-config.version>
<pcloud-common-core.version>
2.0.0-SNAPSHOT
</pcloud-common-core.version>
<wxgroup-sdk.version>
1.0.0-SNAPSHOT
</wxgroup-sdk.version>
<pcloud-facade.version>
2.1.0-SNAPSHOT
</pcloud-facade.version>
</properties>
</profile>
...
...
@@ -92,6 +96,7 @@
<pcloud-common-config.version>
2.1.1-RELEASE
</pcloud-common-config.version>
<pcloud-common-core.version>
2.1.1-RELEASE
</pcloud-common-core.version>
<wxgroup-sdk.version>
1.1.0-SNAPSHOT
</wxgroup-sdk.version>
<pcloud-facade.version>
2.1.0-RELEASE
</pcloud-facade.version>
</properties>
</profile>
...
...
@@ -102,32 +107,6 @@
<project.reporting.outputEncoding>
UTF-8
</project.reporting.outputEncoding>
<java.version>
1.8
</java.version>
<spring-cloud.version>
Dalston.SR1
</spring-cloud.version>
<pcloud-common-web.version>
2.1.0-RELEASE
</pcloud-common-web.version>
<!-- book -->
<pcloud-facade-book.version>
2.1.0-RELEASE
</pcloud-facade-book.version>
<pcloud-facade-usercenter.version>
2.1.0-RELEASE
</pcloud-facade-usercenter.version>
<pcloud-facade-channelcenter.version>
2.1.0-RELEASE
</pcloud-facade-channelcenter.version>
<pcloud-facade-resourcecenter.version>
2.1.0-RELEASE
</pcloud-facade-resourcecenter.version>
<pcloud-facade-analysisengine.version>
2.1.0-RELEASE
</pcloud-facade-analysisengine.version>
<pcloud-facade-quartz.version>
2.1.0-RELEASE
</pcloud-facade-quartz.version>
<pcloud-facade-appcenter.version>
2.1.0-RELEASE
</pcloud-facade-appcenter.version>
<pcloud-facade-settlement.version>
2.1.0-RELEASE
</pcloud-facade-settlement.version>
<pcloud-facade-message.version>
2.1.0-RELEASE
</pcloud-facade-message.version>
<pcloud-facade-commoncenter.version>
2.1.0-RELEASE
</pcloud-facade-commoncenter.version>
<pcloud-facade-comment.version>
2.1.0-RELEASE
</pcloud-facade-comment.version>
<pcloud-facade-voicemessage.version>
2.1.0-RELEASE
</pcloud-facade-voicemessage.version>
<pcloud-facade-raystask.version>
2.1.0-RELEASE
</pcloud-facade-raystask.version>
<pcloud-facade-contentcenter.version>
2.1.0-RELEASE
</pcloud-facade-contentcenter.version>
<pcloud-facade-tradecenter.version>
2.1.0-RELEASE
</pcloud-facade-tradecenter.version>
<pcloud-facade-readercenter.version>
2.1.0-RELEASE
</pcloud-facade-readercenter.version>
<pcloud-facade-labelcenter.version>
2.1.0-RELEASE
</pcloud-facade-labelcenter.version>
<pcloud-facade-wechatgroup.version>
2.1.0-RELEASE
</pcloud-facade-wechatgroup.version>
<pcloud-facade-promotion.version>
2.1.0-RELEASE
</pcloud-facade-promotion.version>
<pcloud-facade-audioapp.version>
2.1.0-RELEASE
</pcloud-facade-audioapp.version>
<pcloud-facade-videolesson.version>
2.1.0-RELEASE
</pcloud-facade-videolesson.version>
<pcloud-facade-liveapp.version>
2.1.0-RELEASE
</pcloud-facade-liveapp.version>
<pcloud-facade-shareimage.version>
2.1.0-RELEASE
</pcloud-facade-shareimage.version>
<pcloud-facade-convert.version>
2.1.0-RELEASE
</pcloud-facade-convert.version>
</properties>
<dependencyManagement>
...
...
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