Commit 6c55a284 by 阮思源

Merge branch 'feat-1002332' into 'master'

1002332统一关键词回复覆盖用户消息所有类型,缄默时长覆盖用户消息所有类型

See merge request rays/pcloud-book!396
parents 7fd44367 71db3b3e
......@@ -238,4 +238,14 @@ public class BookApplication {
public Binding someUserScanBookGroupBind(){
return RabbitMQFactory.bindingExchange(someUserScanBookGroupQueue(), MQTopicProducer.SOME_USER_SCAN_BOOK_GROUP);
}
@Bean
public Queue wxGroupSendNotTextQueue() {
return RabbitMQFactory.queueBuilder(MQTopicConumer.WXGROUP_SEND_NOT_TEXT);
}
@Bean
public Binding wxGroupSendNotTextBind() {
return RabbitMQFactory.bindingExchange(wxGroupSendNotTextQueue(), MQTopicProducer.WXGROUP_SEND_NOT_TEXT);
}
}
......@@ -7,6 +7,7 @@ import com.pcloud.book.keywords.dto.ReplyKeywordDTO;
import com.pcloud.book.keywords.dto.ServiceResourceDTO;
import com.pcloud.book.keywords.entity.BookKeyword;
import com.pcloud.book.keywords.vo.*;
import com.pcloud.book.pcloudkeyword.entity.PcloudRobot;
import com.pcloud.common.page.PageBeanNew;
import com.pcloud.wechatgroup.message.dto.SendTextDTO;
import com.sdk.wxgroup.SendMessageTypeEnum;
......@@ -145,4 +146,18 @@ public interface BookKeywordBiz {
*/
String appendUrlParams(String content, Map<String,String> map);
/**
* 非关键词响应
*/
void sendPcloudNotKeyWord(String userWxId, String ip, Integer code, String robotId,Long pcloudClassifyId);
/**
* 缄默处理
*/
void silenceProcess(String userWxId, Integer code, String robotId);
/**
* 自动唤醒处理
*/
void robotWakeUp(String userWxId, String ip, Integer code, String robotId);
}
package com.pcloud.book.keywords.biz.impl;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.pcloud.appcenter.app.dto.AppDto;
......@@ -42,6 +43,9 @@ import com.pcloud.book.group.tools.SendWeixinRequestTools;
import com.pcloud.book.group.vo.ClassifyNameVO;
import com.pcloud.book.group.vo.ClassifyVO;
import com.pcloud.book.group.vo.ListClassifyVO;
import com.pcloud.book.guide.dto.PcloudGuideDelayDto;
import com.pcloud.book.guide.dto.WakeUpInfoDto;
import com.pcloud.book.guide.mapper.PcloudRobotSilenceMapper;
import com.pcloud.book.keywords.biz.BookKeywordBiz;
import com.pcloud.book.keywords.dao.*;
import com.pcloud.book.keywords.dto.KeywordDTO;
......@@ -126,6 +130,9 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static com.pcloud.book.guide.constant.PcloudGuideRedisConstant.PCLOUD_GUIDE_SUFFIX;
import static com.pcloud.book.guide.constant.PcloudGuideRedisConstant.PCLOUD_ROBOT_WAKE_UP_SUFFIX;
/**
* @author lily
* @date 2019/4/25 10:47
......@@ -208,6 +215,9 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
private PcloudKeywordClassifyDao pcloudKeywordClassifyDao;
@Autowired
private PcloudRobotDao pcloudRobotDao;
@Autowired
private PcloudRobotSilenceMapper pcloudRobotSilenceMapper;
@Value("${wechat.group.link.prefix}")
private String wechatGroupLinkPrefix;
/**
......@@ -700,22 +710,8 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
}
}else {
//走非关键词
List<PcloudNotKeyword> notKeywords = pcloudNotKeywordDao.getPcloudNotKeywordList(pcloudClassifyId);
if (!ListUtils.isEmpty(notKeywords)){
for (PcloudNotKeyword pcloudNotKeyword : notKeywords){
List<PcloudKeywordReply> replies = pcloudKeywordReplyDao.getByRelevance(RelevanceTypeEnum.NOT_KEYWORD.value, pcloudNotKeyword.getId());
if (ListUtils.isEmpty(replies)){
continue;
}
if (MethodEnum.RANDOM.value.equals(pcloudNotKeyword.getMethod())){
replies = Arrays.asList(replies.get(new Random().nextInt(replies.size())));
}
for (PcloudKeywordReply reply:replies){
sendPcloudKeywordReply(reply, robotId, userWxId, ip, code);
}
}
}
//非关键词响应
sendPcloudNotKeyWord(userWxId,ip,code,robotId,pcloudClassifyId);
}
}
......@@ -1025,6 +1021,27 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
return content;
}
@ParamLog("非关键词响应")
@Override
public void sendPcloudNotKeyWord(String userWxId, String ip, Integer code, String robotId,Long pcloudClassifyId) {
//走非关键词
List<PcloudNotKeyword> notKeywords = pcloudNotKeywordDao.getPcloudNotKeywordList(pcloudClassifyId);
if (!ListUtils.isEmpty(notKeywords)){
for (PcloudNotKeyword pcloudNotKeyword : notKeywords){
List<PcloudKeywordReply> replies = pcloudKeywordReplyDao.getByRelevance(RelevanceTypeEnum.NOT_KEYWORD.value, pcloudNotKeyword.getId());
if (ListUtils.isEmpty(replies)){
continue;
}
if (MethodEnum.RANDOM.value.equals(pcloudNotKeyword.getMethod())){
replies = Arrays.asList(replies.get(new Random().nextInt(replies.size())));
}
for (PcloudKeywordReply reply:replies){
sendPcloudKeywordReply(reply, robotId, userWxId, ip, code);
}
}
}
}
private String appendParams(Map<String, String> map) {
Set<String> keys = map.keySet();
StringBuilder sb = new StringBuilder();
......@@ -1842,4 +1859,46 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
String ip = Optional.ofNullable(groupVersion.get(wechatGroupId)).orElse(new BookWxQrcodeDTO()).getWechatGroupIp();
return ip;
}
/**
* 机器人缄默设置处理
*/
@Override
public void silenceProcess(String userWxId, Integer code, String robotId) {
// 个人号消息 用户发送:wechatCreateUser!=wxId,小号发送wechatCreateUser=wxId
if (SendMessageTypeEnum.SELF.getCode().equals(code) && !userWxId.equals(robotId)) {
// 从缓存中获取缄默信息
if(JedisClusterUtils.hexists(robotId+PCLOUD_GUIDE_SUFFIX,userWxId)){
Integer duration = pcloudRobotSilenceMapper.getSilenceDurationByRobotWxId(robotId);
if (duration == null) {
duration = 0;
}
String hget = JedisClusterUtils.hget(robotId + PCLOUD_GUIDE_SUFFIX, userWxId);
PcloudGuideDelayDto pcloudGuideDelayDto = JSONObject.parseObject(hget, PcloudGuideDelayDto.class);
pcloudGuideDelayDto.setSendTime(new Date());
// duration
pcloudGuideDelayDto.setDuration(duration);
JedisClusterUtils.hset(robotId+PCLOUD_GUIDE_SUFFIX,userWxId,JSONObject.toJSONString(pcloudGuideDelayDto));
}
}
}
/**
* 机器人自动唤醒配置
*/
@Override
public void robotWakeUp(String userWxId, String ip, Integer code, String robotId) {
// 个人号 用户回复消息
String userId = userWxId;
if (SendMessageTypeEnum.SELF.getCode().equals(code) && !userId.equals(robotId)) {
PcloudRobot byWxId = pcloudRobotDao.getByWxId(robotId);
if (byWxId != null && byWxId.getWakeUp() == 1) {
// 向缓存中写入用户与小号最后一次聊天时间
WakeUpInfoDto wakeUpInfoDto = new WakeUpInfoDto();
wakeUpInfoDto.setIp(ip);
wakeUpInfoDto.setTime(new Date());
JedisClusterUtils.hset(robotId + PCLOUD_ROBOT_WAKE_UP_SUFFIX, userId, JSONObject.toJSONString(wakeUpInfoDto));
}
}
}
}
......@@ -85,4 +85,9 @@ public class MQTopicConumer {
*/
public static final String CONSUMER_SOME_USER_SCAN_BOOK_GROUP = PREFIX + MQTopicProducer.SOME_USER_SCAN_BOOK_GROUP;
/**
* 发送非文本消息
*/
public static final String WXGROUP_SEND_NOT_TEXT = PREFIX + MQTopicProducer.WXGROUP_SEND_NOT_TEXT;
}
package com.pcloud.book.mq.topic;
import com.pcloud.book.keywords.biz.BookKeywordBiz;
import com.pcloud.book.mq.config.MQTopicConumer;
import com.pcloud.book.pcloudkeyword.dao.PcloudRobotDao;
import com.pcloud.book.pcloudkeyword.entity.PcloudRobot;
import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.wechatgroup.message.dto.SendNotTextDTO;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Slf4j
@Component("wxGroupSendNotTextListener")
@RabbitListener(queues = MQTopicConumer.WXGROUP_SEND_NOT_TEXT)
public class WxGroupSendNotTextListener {
private static final Logger LOGGER = LoggerFactory.getLogger(WxGroupSendNotTextListener.class);
@Autowired
private BookKeywordBiz bookKeywordBiz;
@Autowired
private PcloudRobotDao pcloudRobotDao;
@ParamLog("接收用户发送非文本消息")
@RabbitHandler
public void onMessage(SendNotTextDTO sendNotTextDTO) throws BizException {
try {
String userWxId = sendNotTextDTO.getWechatCreateUser();
String ip = sendNotTextDTO.getIp();
Integer code = sendNotTextDTO.getCode();
String robotId = sendNotTextDTO.getWxId();
if (StringUtil.isEmpty(userWxId)||StringUtil.isEmpty(robotId)||StringUtil.isEmpty(ip)){
return;
}
// 缄默设置处理
bookKeywordBiz.silenceProcess(userWxId, code, robotId);
// 机器人自动唤醒
bookKeywordBiz.robotWakeUp(userWxId, ip, code, robotId);
//判断是否为平台端小号
PcloudRobot pcloudRobot = pcloudRobotDao.getByWxId(sendNotTextDTO.getWxId());
if (pcloudRobot!=null){
//发送非关键词
Long pcloudClassifyId=pcloudRobot.getKeywordClassifyId();
bookKeywordBiz.sendPcloudNotKeyWord(userWxId,ip,code,robotId,pcloudClassifyId);
}
} catch (Exception e) {
LOGGER.error("接收用户发送非文本消息失败" + e.getMessage(), e);
}
}
}
......@@ -58,10 +58,6 @@ public class WxGroupSendTextListener {
private BookGroupClassifyBiz bookGroupClassifyBiz;
@Autowired
private ReadingActivityBiz readingActivityBiz;
@Autowired
private PcloudRobotSilenceMapper pcloudRobotSilenceMapper;
@Autowired
private PcloudRobotDao pcloudRobotDao;
/**
* 接收微信用户进群消息
......@@ -76,9 +72,9 @@ public class WxGroupSendTextListener {
// 更新群人数和群名称
changeGroupInfo(sendTextDTO);
// 缄默设置处理
silenceProcess(sendTextDTO);
bookKeywordBiz.silenceProcess(sendTextDTO.getWechatUserId(), sendTextDTO.getCode(), sendTextDTO.getWxId());
// 机器人自动唤醒
robotWakeUp(sendTextDTO);
bookKeywordBiz.robotWakeUp(sendTextDTO.getWechatUserId(), sendTextDTO.getIp(), sendTextDTO.getCode(), sendTextDTO.getWxId());
//校验是否机器人账号
List<String> allRobotWxIds = wechatGroupConsr.listAllRobotWxId();
if (!ListUtils.isEmpty(allRobotWxIds) && !allRobotWxIds.contains(wechatUserId) && !StringUtil.isEmpty(sendTextDTO.getTextContent())) {
......@@ -98,46 +94,6 @@ public class WxGroupSendTextListener {
}
}
/**
* 机器人自动唤醒配置
*/
private void robotWakeUp(SendTextDTO sendTextDTO) {
// 个人号 用户回复消息
String robotId = sendTextDTO.getWxId();
String userId = sendTextDTO.getWechatUserId();
if (SendMessageTypeEnum.SELF.getCode().equals(sendTextDTO.getCode()) && !userId.equals(robotId)) {
PcloudRobot byWxId = pcloudRobotDao.getByWxId(robotId);
if (byWxId != null && byWxId.getWakeUp() == 1) {
// 向缓存中写入用户与小号最后一次聊天时间
WakeUpInfoDto wakeUpInfoDto = new WakeUpInfoDto();
wakeUpInfoDto.setIp(sendTextDTO.getIp());
wakeUpInfoDto.setTime(new Date());
JedisClusterUtils.hset(robotId + PCLOUD_ROBOT_WAKE_UP_SUFFIX, userId, JSONObject.toJSONString(wakeUpInfoDto));
}
}
}
/**
* 机器人缄默设置处理
*/
private void silenceProcess(SendTextDTO sendTextDTO) {
// 个人号消息 用户发送:wechatCreateUser!=wxId,小号发送wechatCreateUser=wxId
if (SendMessageTypeEnum.SELF.getCode().equals(sendTextDTO.getCode()) && !sendTextDTO.getWechatUserId().equals(sendTextDTO.getWxId())) {
// 从缓存中获取缄默信息
if(JedisClusterUtils.hexists(sendTextDTO.getWxId()+PCLOUD_GUIDE_SUFFIX,sendTextDTO.getWechatUserId())){
Integer duration = pcloudRobotSilenceMapper.getSilenceDurationByRobotWxId(sendTextDTO.getWxId());
if (duration == null) {
duration = 0;
}
String hget = JedisClusterUtils.hget(sendTextDTO.getWxId() + PCLOUD_GUIDE_SUFFIX, sendTextDTO.getWechatUserId());
PcloudGuideDelayDto pcloudGuideDelayDto = JSONObject.parseObject(hget, PcloudGuideDelayDto.class);
pcloudGuideDelayDto.setSendTime(new Date());
// duration
pcloudGuideDelayDto.setDuration(duration);
JedisClusterUtils.hset(sendTextDTO.getWxId()+PCLOUD_GUIDE_SUFFIX,sendTextDTO.getWechatUserId(),JSONObject.toJSONString(pcloudGuideDelayDto));
}
}
}
/**
* 更新群人数和群名称
......
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