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 @@
<groupId>com.pcloud.facade</groupId>
<artifactId>pcloud-facade-book</artifactId>
<version>${pcloud-facade-book.version}</version>
<packaging>jar</packaging>
<name>pcloud-facade-book</name>
......
......@@ -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 +
'}';
}
}
......@@ -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>
......
......@@ -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
......
......@@ -45,6 +45,7 @@ import com.pcloud.book.push.dao.PushGroupDao;
import com.pcloud.book.push.entity.PushGroup;
import com.pcloud.book.riddle.dto.GroupRiddleDTO;
import com.pcloud.book.util.common.ThreadPoolUtils;
import com.pcloud.common.constant.CacheConstant;
import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.page.PageParam;
......@@ -73,6 +74,7 @@ import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
......@@ -119,75 +121,80 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
/**
* 自动更新群人数线程是否开始执行
*/
private static final AtomicBoolean IS_START = new AtomicBoolean(false);
// private static final AtomicBoolean IS_START = new AtomicBoolean(false);
/**
* 处理群人数线程池
*/
private static final ExecutorService SINGLE_THREAD_EXECUTOR = Executors.newSingleThreadExecutor();
// private static final ExecutorService SINGLE_THREAD_EXECUTOR = Executors.newSingleThreadExecutor();
@Override
public Integer updateGroupCount(String wxGroupId, Integer num) {
return groupQrcodeDao.updateGroupCount(wxGroupId, num);
}
/**
* 更新群人数线程
*/
private void updateGroupNum() {
// 若已开始则无需再启动
if(IS_START.get()) {
return;
}
// 若设置时已经为true则代表已经有线程执行成功
final boolean andSet = IS_START.getAndSet(true);
if (andSet) {
return;
}
SINGLE_THREAD_EXECUTOR.execute(() -> {
while (true) {
try{
if (BookBusinessConstants.GROUP_NUM_DTO_MAP.size() < 1) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
log.error("[updateGroupNum] InterruptedException:{}", e);
}
continue;
}
log.info("[更新群人数] start GROUP_NUM_DTO_MAP:{}", BookBusinessConstants.GROUP_NUM_DTO_MAP);
for (Map.Entry<String, AutoUpdateGroupNumDTO> entry : BookBusinessConstants.GROUP_NUM_DTO_MAP.entrySet()) {
final AutoUpdateGroupNumDTO value = entry.getValue();
// 没到时间不执行(小于30s并且小于3个人不执行)
final boolean b = null == value || ((System.currentTimeMillis() + 10) < value.getStartTime().getTime() && value.getNum().get() < 3);
if(b) {
log.info("[更新群人数] null == value:{}", entry);
continue;
}
Integer peopleCounts = WxGroupSDK.getPeopleCounts(value.getWxGroupId(), value.getRobotId(), value.getIp());
if (null == peopleCounts || peopleCounts < 1) {
log.info("[更新群人数] null == peopleCounts || peopleCounts < 1 entry:{}; peopleCounts:{}", entry, peopleCounts);
// 若未获取到将其移除
BookBusinessConstants.GROUP_NUM_DTO_MAP.remove(entry.getKey());
continue;
}
log.info("[更新群人数] entry:{}, peopleCounts:{}", entry, peopleCounts);
groupQrcodeDao.updateUserNumber(value.getWxGroupId(), peopleCounts);
BookBusinessConstants.GROUP_NUM_DTO_MAP.remove(entry.getKey());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
log.error("[updateGroupNum] InterruptedException:{}", e);
}
}
} catch (Exception e) {
log.error("[updateGroupNum] : Exception:{}", e);
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
log.error("[updateGroupNum] InterruptedException:{}", e);
}
}
});
}
// private void updateGroupNum() {
// // 若已开始则无需再启动
// if(IS_START.get()) {
// return;
// }
// // 若设置时已经为true则代表已经有线程执行成功
// final boolean andSet = IS_START.getAndSet(true);
// if (andSet) {
// return;
// }
// SINGLE_THREAD_EXECUTOR.execute(() -> {
// while (true) {
// try{
// if (BookBusinessConstants.GROUP_NUM_DTO_MAP.size() < 1) {
// try {
// Thread.sleep(10000);
// } catch (InterruptedException e) {
// log.error("[updateGroupNum] InterruptedException:{}", e);
// }
// continue;
// }
// log.info("[更新群人数] start GROUP_NUM_DTO_MAP:{}", BookBusinessConstants.GROUP_NUM_DTO_MAP);
// for (Map.Entry<String, AutoUpdateGroupNumDTO> entry : BookBusinessConstants.GROUP_NUM_DTO_MAP.entrySet()) {
// final AutoUpdateGroupNumDTO value = entry.getValue();
// // 没到时间不执行(小于30s并且小于3个人不执行)
// final boolean b = null == value || ((System.currentTimeMillis() + 10) < value.getStartTime().getTime() && value.getNum().get() < 3);
// if(b) {
// log.info("[更新群人数] null == value:{}", entry);
// continue;
// }
// Integer peopleCounts = WxGroupSDK.getPeopleCounts(value.getWxGroupId(), value.getRobotId(), value.getIp());
// if (null == peopleCounts || peopleCounts < 1) {
// log.info("[更新群人数] null == peopleCounts || peopleCounts < 1 entry:{}; peopleCounts:{}", entry, peopleCounts);
// // 若未获取到将其移除
// BookBusinessConstants.GROUP_NUM_DTO_MAP.remove(entry.getKey());
// continue;
// }
// log.info("[更新群人数] entry:{}, peopleCounts:{}", entry, peopleCounts);
// groupQrcodeDao.updateUserNumber(value.getWxGroupId(), peopleCounts);
// BookBusinessConstants.GROUP_NUM_DTO_MAP.remove(entry.getKey());
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// log.error("[updateGroupNum] InterruptedException:{}", e);
// }
// }
// } catch (Exception e) {
// log.error("[updateGroupNum] : Exception:{}", e);
// }
// try {
// Thread.sleep(10000);
// } catch (InterruptedException e) {
// log.error("[updateGroupNum] InterruptedException:{}", e);
// }
// }
// });
// }
@Override
public String getChangeGroupQrCode(Long classifyId) {
......@@ -202,7 +209,7 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
List<ClassifyQrcodeVO> qrcodeByClassify = groupQrcodeDao.getQrcodeByClassifyId(classifyId);
if (CollectionUtils.isEmpty(qrcodeByClassify)) {
// 如果没有群则新增一个
String url = addWechatGroup(classifyId, null);
String url = changeGroupQrCode(classifyId);
log.info("[前端调用切群接口] getChangeGroupQrCode 分类异常没有群 重新分配群classifyId:{} url:{}", classifyId, url);
return url;
}
......@@ -210,7 +217,7 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
List<ClassifyQrcodeVO> collect = qrcodeByClassify.stream().filter(p -> QrcodeStatusEnum.ON_USE.value.equals(p.getQrcodeState())).collect(Collectors.toList());
if (CollectionUtils.isEmpty(collect)) {
// 如果没有使用中群则新增一个
String url = addWechatGroup(classifyId, null);
String url = changeGroupQrCode(classifyId);
log.info("[前端调用切群接口] getChangeGroupQrCode 没有使用中的群 重新分配群classifyId:{} url:{}", classifyId, url);
return url;
}
......@@ -222,7 +229,7 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
//将二维码修改为已满群状态
changeToOverNumber(qrcodeVO.getWeixinQrcodeId(), qrcodeVO.getId());
// 如果没有群则新增一个
String url = addWechatGroup(classifyId, null);
String url = changeGroupQrCode(classifyId);
log.info("[前端调用切群接口] getChangeGroupQrCode 群超出切群人数了,但是没有切群 重新分配群classifyId:{} url:{}", classifyId, url);
return url;
}
......@@ -240,7 +247,7 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
}
if (Objects.isNull(url)) {
// 如果没有群则新增一个
String qrcodeUrl = addWechatGroup(classifyId, null);
String qrcodeUrl = changeGroupQrCode(classifyId);
log.info("[前端调用切群接口] getChangeGroupQrCode 没有可用群 重新分配群classifyId:{} url:{}", classifyId, url);
return qrcodeUrl;
}
......@@ -249,9 +256,37 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
@Override
public String changeGroupQrCode(Long classifyId) {
// 如果没有群则新增一个
String url = addWechatGroup(classifyId, null);
log.info("[直接切群] changeGroupQrCode 直接切群classifyId:{} url:{}", classifyId, url);
return changeGroup(classifyId);
}
private String changeGroup(Long classifyId) {
final String key = CacheConstant.BOOK + "changeGroup:" + classifyId;
final String qrcodeKey = CacheConstant.BOOK + "changeGroupQrCode:" + classifyId;
String url = StringUtil.EMPTY;
final String threadId = Thread.currentThread().getId() + "";
try {
boolean getLock = JedisClusterUtils.setnx(key, threadId);
if (getLock) {
JedisClusterUtils.expire(key, 3);
// 双重校验避免前一个事务未提交
String qrcode = JedisClusterUtils.get(qrcodeKey);
if (StringUtil.isNotBlank(qrcode)) {
return qrcode;
}
// 如果没有群则新增一个
url = addWechatGroup(classifyId, null);
log.info("[直接切群] changeGroupQrCode 直接切群classifyId:{} url:{}", classifyId, url);
// 切群之后将新切群放入缓存5分钟,5分钟内若需要切群则直接从缓存中获取,避免事务未提交,双重判断
JedisClusterUtils.setex(qrcodeKey, 60 * 5, url);
} else {
return url;
}
} finally {
String s = JedisClusterUtils.get(key);
if(StringUtil.isNotBlank(s) && s.contains(threadId)) {
JedisClusterUtils.del(key);
}
}
return url;
}
......@@ -398,12 +433,12 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
log.info("[新增一个用户] : robotId is null weixinGroupId:{},memberCount:{},nickName:{},robotId:{}", weixinGroupId, memberCount, nickName, robotId);
robotIdByGroupId = wechatGroupConsr.getRobotIdByGroupId(weixinGroupId);
}
if(robotIdByGroupId != null){
Integer peopleCounts = WxGroupSDK.getPeopleCounts(weixinGroupId, robotIdByGroupId, ip);
if (peopleCounts != null) {
memberCount = peopleCounts;
}
}
// if(robotIdByGroupId != null){
// Integer peopleCounts = WxGroupSDK.getPeopleCounts(weixinGroupId, robotIdByGroupId, ip);
// if (peopleCounts != null) {
// memberCount = peopleCounts;
// }
// }
//获取群基本信息
GroupQrcodeDTO groupQrcodeDTO = groupQrcodeDao.getGroupQrcodeInfo(weixinGroupId);
log.info("[新增一个用户] groupQrcodeDTO:{}", groupQrcodeDTO);
......@@ -411,21 +446,24 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
return;
}
//更新用户数(由于微信有延迟及时更新可能会数据对不上,所以调用方法延迟30s,统一处理)
AutoUpdateGroupNumDTO numDTO = BookBusinessConstants.GROUP_NUM_DTO_MAP.get(weixinGroupId);
if (null == numDTO){
numDTO = new AutoUpdateGroupNumDTO(weixinGroupId, robotId, ip, new Date());
} else {
numDTO.getNum().incrementAndGet();
numDTO.setRobotId(robotId);
numDTO.setIp(ip);
numDTO.setWxGroupId(weixinGroupId);
numDTO.setStartTime(new Date());
}
BookBusinessConstants.GROUP_NUM_DTO_MAP.put(weixinGroupId, numDTO);
// 发消息时获取的群人数更准确memberCount 20190905
// AutoUpdateGroupNumDTO numDTO = BookBusinessConstants.GROUP_NUM_DTO_MAP.get(weixinGroupId);
// if (null == numDTO){
// numDTO = new AutoUpdateGroupNumDTO(weixinGroupId, robotId, ip, new Date());
// } else {
// numDTO.getNum().incrementAndGet();
// numDTO.setRobotId(robotId);
// numDTO.setIp(ip);
// numDTO.setWxGroupId(weixinGroupId);
// numDTO.setStartTime(new Date());
// }
// BookBusinessConstants.GROUP_NUM_DTO_MAP.put(weixinGroupId, numDTO);
// 启动更新群人数线程
if (!IS_START.get()) {
this.updateGroupNum();
}
// if (!IS_START.get()) {
// this.updateGroupNum();
// }
// 新用户进群时系统消息群人数不准,所以从系统中取然后+1,更新群人数操作会在群消息地方处理
memberCount = groupQrcodeDTO.getUserNumber() + 1;
//如果人数超过限制,重新分配群
if (memberCount >= groupQrcodeDTO.getChangeNumber() && QrcodeStatusEnum.ON_USE.value.equals(groupQrcodeDTO.getQrcodeState())) {
//修改状态,重新分配一个群
......@@ -651,11 +689,20 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
@ParamLog("将二维码改为已满群")
@Transactional(rollbackFor = Exception.class)
public void changeToOverNumber(Long weixinQrcodeId, Long id) {
groupQrcodeDao.updateUseState(id, QrcodeStatusEnum.OVER_NUMBER.value);
@Override
public void changeToOverNumber(Long weixinQrcodeId, Long groupQrcodeId) {
groupQrcodeDao.updateUseState(groupQrcodeId, QrcodeStatusEnum.OVER_NUMBER.value);
weixinQrcodeBiz.updateUseState(weixinQrcodeId, QrcodeStatusEnum.OVER_NUMBER.value);
}
@ParamLog("将二维码改为未满群")
@Transactional(rollbackFor = Exception.class)
@Override
public void changeToNotOverNumber(Long weixinQrcodeId, Long groupQrcodeId) {
groupQrcodeDao.updateUseState(groupQrcodeId, QrcodeStatusEnum.ON_USE.value);
weixinQrcodeBiz.updateUseState(weixinQrcodeId, QrcodeStatusEnum.ON_USE.value);
}
@Override
public List<Long> listQrcodeIdsByLabelQuery(String query, Long proLabelId, Long depLabelId, Long purLabelId) {
Map<String, Object> paramMap = new HashMap<>();
......
......@@ -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:获取群二维码相关信息
......
......@@ -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");
......
......@@ -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 + '\'' +
'}';
}
}
......@@ -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;
......
......@@ -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);
/**
* 关键词统计
......
......@@ -13,16 +13,17 @@ import com.pcloud.book.consumer.resource.ProductConsr;
import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr;
import com.pcloud.book.group.biz.BookGroupBiz;
import com.pcloud.book.group.biz.BookGroupClassifyBiz;
import com.pcloud.book.group.biz.GroupQrcodeBiz;
import com.pcloud.book.group.dao.AppTouchRecordDao;
import com.pcloud.book.group.dao.BookGroupClassifyDao;
import com.pcloud.book.group.dao.BookGroupDao;
import com.pcloud.book.group.dao.GroupQrcodeDao;
import com.pcloud.book.group.dto.BookGroupDTO;
import com.pcloud.book.group.dto.GroupClassifyQrcodeDTO;
import com.pcloud.book.group.dto.GroupQrcodeDTO;
import com.pcloud.book.group.dto.JoinGroupCipherDTO;
import com.pcloud.book.group.entity.AppTouchRecord;
import com.pcloud.book.group.entity.GroupQrcode;
import com.pcloud.book.group.enums.QrcodeStatusEnum;
import com.pcloud.book.group.enums.TouchTypeEnum;
import com.pcloud.book.group.tools.SendWeixinRequestTools;
import com.pcloud.book.group.vo.ClassifyNameVO;
......@@ -67,6 +68,7 @@ import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.resourcecenter.product.dto.ProductDto;
import com.pcloud.resourcecenter.product.dto.ProductTypeDto;
import com.pcloud.wechatgroup.group.dto.RobotReplyDTO;
import com.pcloud.wechatgroup.message.dto.SendTextDTO;
import com.sdk.wxgroup.ChangeNameVO;
import com.sdk.wxgroup.SendMessageTypeEnum;
import com.sdk.wxgroup.WxGroupSDK;
......@@ -131,12 +133,14 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
private QrcodeSceneService qrcodeSceneService;
@Autowired
private BookGroupBiz bookGroupBiz;
@Autowired
private GroupQrcodeBiz groupQrcodeBiz;
@Override
@ParamLog("新增关键词")
@Transactional(rollbackFor = Exception.class)
public void insertKeyword(SetKeywordVO setKeywordVO) {
if(null == setKeywordVO || setKeywordVO.check()) {
if (null == setKeywordVO || setKeywordVO.check()) {
throw new BookBizException(BookBizException.PARAM_IS_NULL, "应用/作品信息为空");
}
if (setKeywordVO.getClassifyId() == null) {
......@@ -166,7 +170,7 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
productConsr.productAutoOnShelves(bookGroupDTO.getChannelId(), productIds);
//新增关键词与分类或者图书的关系
//按群创建
if (setKeywordVO.getSetType() == 1){
if (setKeywordVO.getSetType() == 1) {
BookKeyword bookKeyword = new BookKeyword();
BeanUtils.copyProperties(setKeywordVO, bookKeyword);
bookKeyword.setKeywordId(keyword.getId());
......@@ -182,10 +186,10 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
bookKeyword.setWarehouseId(warehouseId);
bookKeyword.setIsWarehouse(1);
}
if(null == bookKeyword.getIsWarehouse()){
if (null == bookKeyword.getIsWarehouse()) {
bookKeyword.setIsWarehouse(0);
}
if(null == bookKeyword.getWarehouseId()){
if (null == bookKeyword.getWarehouseId()) {
bookKeyword.setWarehouseId(0L);
}
bookKeyword.setIsEdit(1);
......@@ -227,8 +231,8 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
// 书入库一遍,同样的就不要入库了
// setKeywordVO.setChannelId(bookGroupDTO.getChannelId());
// final Long warehouseId = bookKeywordWarehouseBiz.addBookKeyword(setKeywordVO);
cKeyword.setWarehouseId(bookKeyword.getWarehouseId());
cKeyword.setIsWarehouse(1);
cKeyword.setWarehouseId(bookKeyword.getWarehouseId());
cKeyword.setIsWarehouse(1);
}
if (null == cKeyword.getIsWarehouse()) {
cKeyword.setIsWarehouse(0);
......@@ -238,7 +242,7 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
}
if (0 == cKeyword.getClassifyId()) {
cKeyword.setIsEdit(1);
}else {
} else {
cKeyword.setIsEdit(0);
}
bookKeywords.add(cKeyword);
......@@ -252,7 +256,7 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
}
if (0 == bookKeyword.getClassifyId()) {
bookKeyword.setIsEdit(1);
}else {
} else {
bookKeyword.setIsEdit(0);
}
bookKeywords.add(bookKeyword);
......@@ -298,14 +302,14 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
BeanUtils.copyProperties(updateKeywordVO, v);
if (ChannelEnum.APP.value.equals(updateKeywordVO.getServeType())) {
final AppDto baseById = appConsr.getBaseById(updateKeywordVO.getServeId());
if(null == baseById) {
if (null == baseById) {
throw new BookBizException(BookBizException.ID_NOT_EXIST, "应用不存在");
}
v.setTypeCode(baseById.getTypeCode());
}
if (ChannelEnum.PRODUCT.value.equals(updateKeywordVO.getServeType())) {
final ProductDto proBaseById = productConsr.getProBaseById(updateKeywordVO.getServeId());
if(null == proBaseById) {
if (null == proBaseById) {
throw new BookBizException(BookBizException.ID_NOT_EXIST, "作品不存在");
}
v.setTypeCode(proBaseById.getProductTypeCode());
......@@ -332,17 +336,17 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
@Transactional(rollbackFor = Exception.class)
@ParamLog("删除关键词")
public void deleteKeyword(DeleteKeywordVO deleteKeywordVO, Long partyId) {
if (deleteKeywordVO == null || deleteKeywordVO.getIsEdit() == null || deleteKeywordVO.getKeywordId() == null){
throw new BookBizException(BookBizException.ERROR,"缺少必要参数");
if (deleteKeywordVO == null || deleteKeywordVO.getIsEdit() == null || deleteKeywordVO.getKeywordId() == null) {
throw new BookBizException(BookBizException.ERROR, "缺少必要参数");
}
if (deleteKeywordVO.getClassifyId() == null){
if (deleteKeywordVO.getClassifyId() == null) {
deleteKeywordVO.setClassifyId(0L);
}
if (deleteKeywordVO.getIsEdit() == 1){
if (deleteKeywordVO.getIsEdit() == 1) {
keywordDao.deleteById(deleteKeywordVO.getKeywordId(), partyId);
bookKeywordDao.deleteById(deleteKeywordVO.getKeywordId(), partyId);
}else {
bookKeywordDao.deleteKeywords(deleteKeywordVO.getKeywordId(),deleteKeywordVO.getBookGroupId(),deleteKeywordVO.getClassifyId(),partyId);
} else {
bookKeywordDao.deleteKeywords(deleteKeywordVO.getKeywordId(), deleteKeywordVO.getBookGroupId(), deleteKeywordVO.getClassifyId(), partyId);
}
}
......@@ -378,16 +382,16 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
if ("PRODUCT".equalsIgnoreCase(vo.getServeType())) {
productIds.add(vo.getServeId());
}
if (vo.getIsEdit() == null){
if (vo.getIsEdit() == null) {
vo.setIsEdit(1);
}
}
Map<Long, AppDto> app = Maps.newHashMap();
if(!CollectionUtils.isEmpty(appIds)) {
if (!CollectionUtils.isEmpty(appIds)) {
app = appConsr.mapBaseByIds(appIds);
}
Map<Long, ProductDto> proBasesByIds = Maps.newHashMap();
if(!CollectionUtils.isEmpty(productIds)) {
if (!CollectionUtils.isEmpty(productIds)) {
proBasesByIds = productConsr.getProBasesByIds(productIds);
}
final BookGroupDTO dtoById = bookGroupDao.getDTOById(listKeywordParam.getBookGroupId());
......@@ -432,10 +436,18 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
@Override
@ParamLog("关键词消息回复")
public void sendKeywordMessage(String content, String weixinGroupId, String userWxId, String robotId, String ip, Integer code) {
public void sendKeywordMessage(SendTextDTO sendTextDTO) {
if (Objects.isNull(sendTextDTO)) {
return;
}
// 刘娜需求 1001282 群不推送关键词
if (SendMessageTypeEnum.GROUP.getCode().equals(code)) {
this.sendKeywordMessageToGroup(content, weixinGroupId, userWxId, robotId, ip, code);
final String content = sendTextDTO.getTextContent().trim();
final String userWxId = sendTextDTO.getWechatUserId();
final String ip = sendTextDTO.getIp();
final Integer code = sendTextDTO.getCode();
String robotId = sendTextDTO.getWxId();
if (SendMessageTypeEnum.GROUP.getCode().equals(sendTextDTO.getCode())) {
this.sendKeywordMessageToGroup(sendTextDTO);
return;
}
//个人机器人接收消息的时候,weixinGroupId就是userWxId,也就是用户的id,robotId是接收的机器人的id
......@@ -456,8 +468,8 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
for (JoinGroupCipherDTO dto : dtos) {
cIds.add(dto.getClassifyId());
bIds.add(dto.getBookGroupId());
classifyToBookGroupMap.put(dto.getClassifyId(),dto.getBookGroupId());
classifyToQrcodeMap.put(dto.getClassifyId(),dto.getQrcodeId());
classifyToBookGroupMap.put(dto.getClassifyId(), dto.getBookGroupId());
classifyToQrcodeMap.put(dto.getClassifyId(), dto.getQrcodeId());
}
final List<Long> classifyIds = Lists.newArrayList(cIds);
List<ReplyKeywordDTO> replyKeywordDTOs = new ArrayList<>();
......@@ -492,7 +504,7 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
// 处理链接地址
Long classifyId = keywordClassifyIdMap.get(replyKeywordDTO.getKeywordId());
final GroupClassifyQrcodeDTO dto = classifyMap.get(classifyId);
if(null == dto) {
if (null == dto) {
log.info("[关键词消息回复] 分类信息为空 replyKeywordDTO:{}; classifyMap:{}", replyKeywordDTO, classifyMap);
continue;
}
......@@ -533,7 +545,7 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
for (ReplyKeywordDTO dto : replyKeywordDTOs) {
if (ReplyTypeEnum.APP.value.equals(dto.getReplyType()) || ReplyTypeEnum.LINK.value.equals(dto.getReplyType())) {
sb.append(dto.getKeywords()).append(":").append(dto.getShortLinkUrl()).append("\n");
} else if (ReplyTypeEnum.TEXT.value.equals(dto.getReplyType())){
} else if (ReplyTypeEnum.TEXT.value.equals(dto.getReplyType())) {
sb.append(dto.getKeywords()).append(":").append(dto.getContent()).append("\n");
} else if (ReplyTypeEnum.IMAGE.value.equals(dto.getReplyType())) {
SendWeixinRequestTools.sendKeywordMessage(dto, robotId, userWxId, ip, code);
......@@ -561,11 +573,16 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
* 原有的推送群关键词改为推送个人关键词
*/
@ParamLog("群关键词消息回复")
private void sendKeywordMessageToGroup(String content, String weixinGroupId, String userWxId, String robotId, String ip, Integer code) {
//简单过滤非关键词的词
if (StringUtil.isEmpty(content) || content.length() > 20) {
private void sendKeywordMessageToGroup(SendTextDTO sendTextDTO) {
if (Objects.isNull(sendTextDTO)) {
return;
}
final String content = sendTextDTO.getTextContent().trim();
final String weixinGroupId = sendTextDTO.getWechatGroupId();
final String userWxId = sendTextDTO.getWechatUserId();
final String ip = sendTextDTO.getIp();
final Integer code = sendTextDTO.getCode();
String robotId = sendTextDTO.getWxId();
// 若非之前的机器人则不回复普通关键词
final Boolean groupRobot = wechatGroupConsr.isGroupRobot(robotId);
log.info("[wechatGroupConsr.isGroupRobot] robotId:{} groupRobot:{}", robotId, groupRobot);
......@@ -578,9 +595,13 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
log.info("[关键词消息回复] classifyQrcodeInfo is null");
return;
}
ReplyKeywordDTO replyKeywordDTO ;
//简单过滤非关键词的词
if (StringUtil.isEmpty(content) || content.length() > 20) {
return;
}
ReplyKeywordDTO replyKeywordDTO;
final boolean equals = "群主,来个抽奖".equals(content);
if (equals){
if (equals) {
replyKeywordDTO = keywordDao.getByKeyword("群主,来个抽奖");
} else {
//获取匹配关键词
......@@ -627,17 +648,51 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
robotReplyDTO.setWxGroupId(weixinGroupId);
robotReplyDTO.setWxUserId(userWxId);
wechatGroupConsr.addFirstRobotReplyRecord(robotReplyDTO);
// 异步修改群名称
String finalRobotId = robotId;
ThreadPoolUtils.OTHER_THREAD_POOL.execute(() -> {
checkGroupName(weixinGroupId, classifyQrcodeInfo.getGroupName(), finalRobotId, ip);
});
}
/**
* 更新群人数
*/
@Override
public void updateGroupPeopleCount(String wxGroupId, Integer memberCount, Integer changeNumber, Long weixinQrcodeId, Long groupQrcodeId) {
log.info("[更新群人数] updateGroupPeopleCount wxGroupId:{} memberCount:{} changeNumber:{} weixinQrcodeId:{} groupQrcodeId:{}", wxGroupId, memberCount, changeNumber, weixinQrcodeId, groupQrcodeId);
if (Objects.isNull(memberCount) || StringUtil.isBlank(wxGroupId)) {
return;
}
String key = CacheConstant.BOOK + "groupPeopleCount:";
String groupPeopleCount = JedisClusterUtils.hget(key, wxGroupId);
log.info("[更新群人数] updateGroupPeopleCount groupPeopleCount:{}", groupPeopleCount);
// 如果没有缓存或者有缓存但是人数与缓存不一致,代表有更新,则更新数据库
final boolean update = StringUtil.isBlank(groupPeopleCount) || (StringUtil.isNotBlank(groupPeopleCount)
&& Integer.parseInt(groupPeopleCount) > 0 && !groupPeopleCount.equals(memberCount + ""));
if (update) {
JedisClusterUtils.hset(key, wxGroupId, memberCount + "");
// 将二维码改为已满群BookKeywordBizImpl
if (memberCount >= changeNumber) {
groupQrcodeDao.changeQrcodeState(groupQrcodeId, QrcodeStatusEnum.OVER_NUMBER.value);
log.info("[更新群人数] 触发更新大于等于状态 wxGroupId:{} memberCount:{} changeNumber:{} weixinQrcodeId:{} groupQrcodeId:{}", wxGroupId, memberCount, changeNumber, weixinQrcodeId, groupQrcodeId);
} else {
groupQrcodeDao.changeQrcodeStateForNotOver(groupQrcodeId, QrcodeStatusEnum.ON_USE.value);
log.info("[更新群人数] 触发更新小于状态 wxGroupId:{} memberCount:{} changeNumber:{} weixinQrcodeId:{} groupQrcodeId:{}", wxGroupId, memberCount, changeNumber, weixinQrcodeId, groupQrcodeId);
}
if (memberCount >= 100) {
groupQrcodeBiz.changeToOverNumber(weixinQrcodeId, groupQrcodeId);
log.info("[更新群人数] 触发更新满群状态 wxGroupId:{} memberCount:{} changeNumber:{} weixinQrcodeId:{} groupQrcodeId:{}", wxGroupId, memberCount, changeNumber, weixinQrcodeId, groupQrcodeId);
groupQrcodeDao.changeQrcodeState(groupQrcodeId, QrcodeStatusEnum.OVER_NUMBER.value);
} else {
groupQrcodeBiz.changeToNotOverNumber(weixinQrcodeId, groupQrcodeId);
log.info("[更新群人数] 触发更新未满群状态 wxGroupId:{} memberCount:{} changeNumber:{} weixinQrcodeId:{} groupQrcodeId:{}", wxGroupId, memberCount, changeNumber, weixinQrcodeId, groupQrcodeId);
}
groupQrcodeBiz.updateGroupCount(wxGroupId, memberCount);
log.info("[成功更新群人数] updateGroupPeopleCount wxGroupId:{} memberCount:{}", wxGroupId, memberCount);
}
}
/**
* 修改群名称
*/
private void checkGroupName(String weixinGroupId, String groupName, String robotId, String ip) {
@Override
public void checkGroupName(String weixinGroupId, String groupName, String robotId, String ip) {
log.info("[checkGroupName] weixinGroupId:{} groupName:{} robotId:{} ip:{} groupQrcodeDTO:{}", weixinGroupId, groupQrcodeDao, robotId, ip);
if (StringUtil.isBlank(weixinGroupId) || StringUtil.isBlank(groupName) || StringUtil.isBlank(robotId) || StringUtil.isBlank(ip)) {
return;
......@@ -691,7 +746,7 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
bookKeywordRecord.setSend(isSend);
if (bookKeywordRecord.getGroupQrcodeId() == null) {
GroupQrcode groupQr = groupQrcodeDao.getGroupQrcodeByGroupId(weixinGroupId);
if (groupQr!=null){
if (groupQr != null) {
bookKeywordRecord.setGroupQrcodeId(groupQr.getId());
}
}
......@@ -760,15 +815,15 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
@Override
public Integer getKeywordCount(Long bookGroupId, Long classifyId) {
if (bookGroupId == null){
if (bookGroupId == null) {
throw new BookBizException(BookBizException.ERROR, "缺少参数bookGroupId");
}
return bookKeywordDao.getKeywordCount(bookGroupId, classifyId);
}
@Override
public List<ServiceResourceDTO> getServiceByWeixinGroup(QrWeixinParam qrWeixinParam,Long classifyId, Long qrcodeId) {
public List<ServiceResourceDTO> getServiceByWeixinGroup(QrWeixinParam qrWeixinParam, Long classifyId, Long qrcodeId) {
Map<String, Object> map = new HashMap<>();
map.put("bookGroupId", qrWeixinParam.getBookGroupId());
List<ServiceResourceDTO> serviceResourceDTOS = ResponesUtils.list(bookKeywordDao.listBy(map, "getServiceByWeixinGroup"), ServiceResourceDTO.class);
......@@ -811,7 +866,7 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
serviceResourceDTOS.removeIf(vo -> (qrWeixinParam.getTypeCode().equals(vo.getTypeCode()) && qrWeixinParam.getServeId().equals(vo.getFromId())));
}
List<ServiceResourceDTO> uniqueResources = serviceResourceDTOS.stream().collect(
Collectors. collectingAndThen(
Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getFromId() + ";" + o.getTypeCode()))), ArrayList::new)
);
return uniqueResources;
......
......@@ -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);
});
}
}
......@@ -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
......
......@@ -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" />
......
......@@ -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>
......
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