Commit ec064861 by 裴大威

Merge branch 'hotfix-changegroup' into 'master'

feat 1、切群加锁 2、接受消息同步群人数

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