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
d9792ac9
Commit
d9792ac9
authored
Sep 06, 2019
by
裴大威
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat 1、切群加锁 2、接受消息同步群人数
parent
24583fb5
Show whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
401 additions
and
263 deletions
+401
-263
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
+133
-86
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
+95
-40
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 @
d9792ac9
...
...
@@ -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 @
d9792ac9
...
...
@@ -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 @
d9792ac9
...
...
@@ -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 @
d9792ac9
...
...
@@ -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 @
d9792ac9
...
...
@@ -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
)
{
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
;
}
// 如果没有群则新增一个
String
url
=
addWechatGroup
(
classifyId
,
null
);
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 @
d9792ac9
...
...
@@ -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 @
d9792ac9
...
...
@@ -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 @
d9792ac9
...
...
@@ -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 @
d9792ac9
...
...
@@ -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 @
d9792ac9
...
...
@@ -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 @
d9792ac9
...
...
@@ -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
);
...
...
@@ -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,7 +815,7 @@ 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
);
...
...
@@ -768,7 +823,7 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
@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 @
d9792ac9
...
...
@@ -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 @
d9792ac9
...
...
@@ -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 @
d9792ac9
...
...
@@ -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 @
d9792ac9
...
...
@@ -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