Commit 3f52348b by 桂前礼

个人号缄默时长的自定义配置

parent 8ce16ecf
package com.pcloud.book.guide.vo;
import lombok.Data;
@Data
public class RobotSilenceVO {
private String robotWxId;
private Integer silenceDuration;
}
......@@ -238,34 +238,4 @@ public class BookApplication {
public Binding someUserScanBookGroupBind(){
return RabbitMQFactory.bindingExchange(someUserScanBookGroupQueue(), MQTopicProducer.SOME_USER_SCAN_BOOK_GROUP);
}
@Bean
public DirectExchange pcloudGuideDelayExchange(){
return new DirectExchange(BOOK_DELAY_EXCHANGE,true,false);
}
@Bean
public Queue pcloudGuideDelayMessageQueue(){
return QueueBuilder.durable(BOOK_DELAY_QUEUE).build();
}
@Bean
public Binding pcloudGuideDelayQueueBinding(){
return new Binding(BOOK_DELAY_QUEUE, Binding.DestinationType.QUEUE, BOOK_DELAY_EXCHANGE, BOOK_DELAY_KEY, null);
}
@Bean
public Queue pcloudGuideDelayDeadLetterQueue(){
Map<String, Object> properties = new HashMap<>();
properties.put("x-dead-letter-exchange", BOOK_DELAY_EXCHANGE);
properties.put("x-dead-letter-routing-key", BOOK_DELAY_KEY);
return QueueBuilder.durable(BOOK_DELAY_DEAD_LETTER_QUEUE).withArguments(properties).build();
}
@Bean
public Binding pcloudGuideDelayDeadLetterQueueBinding(){
return new Binding(BOOK_DELAY_DEAD_LETTER_QUEUE, Binding.DestinationType.QUEUE, BOOK_DELAY_EXCHANGE, BOOK_DELAY_DEAD_LETTER_KEY, null);
}
}
package com.pcloud.book.guide.biz;
import com.pcloud.book.guide.vo.Create4RobotVO;
import com.pcloud.book.guide.vo.CreatePcloudGuideVO;
import com.pcloud.book.guide.vo.PcloudGuideVO;
import com.pcloud.book.guide.vo.UpdatePcloudGuideVO;
import com.pcloud.book.guide.vo.UpdateSeqNumVO;
import com.pcloud.book.guide.vo.*;
import com.pcloud.common.page.PageBeanNew;
public interface PcloudGuideBiz {
......@@ -22,4 +18,6 @@ public interface PcloudGuideBiz {
void updateSeqNum(UpdateSeqNumVO updateSeqNumVO);
void create4Robot(Create4RobotVO create4RobotVO);
void setSilenceDuration(RobotSilenceVO robotSilenceVO);
}
......@@ -6,15 +6,12 @@ import com.pcloud.book.guide.entity.PcloudGuide;
import com.pcloud.book.guide.entity.PcloudGuideMessage;
import com.pcloud.book.guide.mapper.PcloudGuideMapper;
import com.pcloud.book.guide.mapper.PcloudGuideMessageMapper;
import com.pcloud.book.guide.vo.Create4RobotVO;
import com.pcloud.book.guide.vo.CreatePcloudGuideVO;
import com.pcloud.book.guide.vo.PcloudGuideMessageVO;
import com.pcloud.book.guide.vo.PcloudGuideVO;
import com.pcloud.book.guide.vo.UpdatePcloudGuideVO;
import com.pcloud.book.guide.vo.UpdateSeqNumVO;
import com.pcloud.book.guide.mapper.PcloudRobotSilenceMapper;
import com.pcloud.book.guide.vo.*;
import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.utils.BeanUtils;
import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.string.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
......@@ -31,6 +28,9 @@ public class PcloudGuideBizImpl implements PcloudGuideBiz {
@Autowired
private PcloudGuideMessageMapper pcloudGuideMessageMapper;
@Autowired
private PcloudRobotSilenceMapper pcloudRobotSilenceMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public Integer addPcloudGuide(CreatePcloudGuideVO createPcloudGuideVO) {
......@@ -156,4 +156,12 @@ public class PcloudGuideBizImpl implements PcloudGuideBiz {
pcloudGuideMessageMapper.batchInsert(list);
}
}
@Override
public void setSilenceDuration(RobotSilenceVO robotSilenceVO) {
if (StringUtil.isEmpty(robotSilenceVO.getRobotWxId())) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "参数错误!");
}
pcloudRobotSilenceMapper.setSilenceDuration(robotSilenceVO.getRobotWxId(), robotSilenceVO.getSilenceDuration());
}
}
package com.pcloud.book.guide.constant;
/**
* 平台端引导语发送 缓存常量
* @author Gui_q
*/
public class PcloudGuideRedisConstant {
public static final String PCLOUD_GUIDE_SUFFIX = "_PCLOUD_GUIDE_DELAY_PUSH";
public static final String PCLOUD_GUIDE_LOCK = "PCLOUD_GUIDE_SILENCE_RUNNER_IMPL_LOCK";
}
......@@ -6,20 +6,34 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
/**
* 平台端引导语 延时发送信息
* @author Gui_q
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class PcloudGuideDelayMsgDto {
private PcloudGuideMessageVO pcloudGuideMessageVO;
public class PcloudGuideDelayDto {
private String robotId;
private Date sendTime;
private String wxId;
private Integer spanTime;
private String ip;
private String userWxId;
private String robotWxId;
private Integer code;
private Integer num;
private Integer duration;
private List<PcloudGuideMessageVO> msgList;
}
package com.pcloud.book.guide.entity;
import java.util.Date;
public class PcloudRobotSilence {
private Integer id;
private String robotWxId;
private Integer silenceDuration;
private Date createTime;
private Date updateTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRobotWxId() {
return robotWxId;
}
public void setRobotWxId(String robotWxId) {
this.robotWxId = robotWxId == null ? null : robotWxId.trim();
}
public Integer getSilenceDuration() {
return silenceDuration;
}
public void setSilenceDuration(Integer silenceDuration) {
this.silenceDuration = silenceDuration;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
\ No newline at end of file
......@@ -7,11 +7,14 @@ import com.pcloud.book.guide.vo.CreatePcloudGuideVO;
import com.pcloud.book.guide.vo.PcloudGuideVO;
import com.pcloud.book.guide.vo.UpdatePcloudGuideVO;
import com.pcloud.book.guide.vo.UpdateSeqNumVO;
import com.pcloud.book.guide.vo.RobotSilenceVO;
import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.permission.PermissionException;
import com.pcloud.common.utils.SessionUtil;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
......@@ -83,4 +86,16 @@ public class PcloudGuideFacadeImpl {
pcloudGuideBiz.create4Robot(create4RobotVO);
return new ResponseDto<>();
}
@ApiOperation("机器人小号设置缄默时长")
@PostMapping("/setSilenceDuration")
ResponseDto<?> setSilenceDuration(
@RequestHeader("token") @ApiParam("token信息") String token,
@RequestBody @ApiParam("机器人小号缄默信息") RobotSilenceVO robotSilenceVO
)throws BizException, PermissionException{
SessionUtil.getInfoToken4Redis(token);
pcloudGuideBiz.setSilenceDuration(robotSilenceVO);
return new ResponseDto<>();
}
}
package com.pcloud.book.guide.listener;
import com.alibaba.fastjson.JSONObject;
import com.pcloud.book.guide.dto.PcloudGuideDelayMsgDto;
import com.pcloud.book.guide.vo.PcloudGuideMessageVO;
import com.pcloud.book.keywords.enums.ReplyTypeEnum;
import com.sdk.wxgroup.SendPicMessageVO;
import com.sdk.wxgroup.SendTextMessageVO;
import com.sdk.wxgroup.WxGroupSDK;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;
import static com.pcloud.book.guide.constant.DelayQueueConstant.BOOK_DELAY_QUEUE;
/**
* 平台端 个人号 引导语 延时消息监听
*/
@Slf4j
@Component
public class PcloudGuideListener {
@RabbitListener(queues = BOOK_DELAY_QUEUE)
@RabbitHandler
public void activeRemind(@Payload String body) {
PcloudGuideDelayMsgDto msgDto = JSONObject.parseObject(body, PcloudGuideDelayMsgDto.class);
PcloudGuideMessageVO message = msgDto.getPcloudGuideMessageVO();
Integer replyType = message.getReplyType();
if (ReplyTypeEnum.TEXT.value.equals(replyType)){
SendTextMessageVO sendTextMessageVO = new SendTextMessageVO();
sendTextMessageVO.setContent(message.getContent());
sendTextMessageVO.setAltId(msgDto.getRobotId());
sendTextMessageVO.setWxGroupId(msgDto.getWxId());
sendTextMessageVO.setIp(msgDto.getIp());
sendTextMessageVO.setCode(msgDto.getCode());
WxGroupSDK.sendTextMessage(sendTextMessageVO);
}
if (ReplyTypeEnum.IMAGE.value.equals(replyType)) {
SendPicMessageVO sendPicMessageVO = new SendPicMessageVO();
sendPicMessageVO.setPicUrl(message.getPicUrl());
sendPicMessageVO.setAltId(msgDto.getRobotId());
sendPicMessageVO.setWxGroupId(msgDto.getWxId());
sendPicMessageVO.setIp(msgDto.getIp());
sendPicMessageVO.setCode(msgDto.getCode());
WxGroupSDK.sendPicMessage(sendPicMessageVO);
}
}
}
......@@ -31,4 +31,6 @@ public interface PcloudGuideMapper {
void updateSeqNum(@Param("id") Integer pcloudGuideId, @Param("seqNum") Integer seqNum);
List<PcloudGuide> listByRobotId(String robotId);
PcloudGuide getFirstByRobotId(@Param("robotId") String robotId, @Param("num") int num);
}
\ No newline at end of file
package com.pcloud.book.guide.mapper;
import com.pcloud.book.guide.entity.PcloudRobotSilence;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public interface PcloudRobotSilenceMapper {
int deleteByPrimaryKey(Integer id);
int insert(PcloudRobotSilence record);
int insertSelective(PcloudRobotSilence record);
PcloudRobotSilence selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(PcloudRobotSilence record);
int updateByPrimaryKey(PcloudRobotSilence record);
/**
* 查询所有平台端 引导语 缄默设置相关的机器人
*/
List<String> listRobots();
/**
* 根据机器人wxid获取缄默时长
*/
Integer getSilenceDurationByRobotWxId(@Param("wxId") String wxId);
/**
* 设置机器人缄默时长
*/
void setSilenceDuration(@Param("robotWxId") String robotWxId, @Param("silenceDuration") Integer silenceDuration);
}
\ No newline at end of file
package com.pcloud.book.guide.runner;
import com.alibaba.fastjson.JSONObject;
import com.pcloud.book.guide.dto.PcloudGuideDelayDto;
import com.pcloud.book.guide.entity.PcloudGuide;
import com.pcloud.book.guide.mapper.PcloudGuideMapper;
import com.pcloud.book.guide.mapper.PcloudGuideMessageMapper;
import com.pcloud.book.guide.mapper.PcloudRobotSilenceMapper;
import com.pcloud.book.guide.vo.PcloudGuideMessageVO;
import com.pcloud.book.keywords.enums.ReplyTypeEnum;
import com.pcloud.common.utils.DateUtils;
import com.pcloud.common.utils.cache.redis.JedisClusterUtils;
import com.sdk.wxgroup.SendPicMessageVO;
import com.sdk.wxgroup.SendTextMessageVO;
import com.sdk.wxgroup.WxGroupSDK;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static com.pcloud.book.guide.constant.PcloudGuideRedisConstant.PCLOUD_GUIDE_LOCK;
import static com.pcloud.book.guide.constant.PcloudGuideRedisConstant.PCLOUD_GUIDE_SUFFIX;
/**
* 小睿引导语 间隔发送
*/
@Slf4j
@Component
public class PcloudGuideSilenceRunnerImpl implements ApplicationRunner {
@Autowired
private PcloudRobotSilenceMapper pcloudRobotSilenceMapper;
@Autowired
private PcloudGuideMapper pcloudGuideMapper;
@Autowired
private PcloudGuideMessageMapper pcloudGuideMessageMapper;
@Override
public void run(ApplicationArguments applicationArguments) throws Exception {
log.info("[项目启动后 定时检查引导与推送]");
if (!JedisClusterUtils.setnx(PCLOUD_GUIDE_LOCK, PCLOUD_GUIDE_LOCK)) {
JedisClusterUtils.expire(PCLOUD_GUIDE_LOCK, 15 * 60);
return;
}
new Thread(() -> {
log.info("[PcloudGuideSilenceRunnerImpl] 线程启动成功");
while (true) {
try {
Thread.sleep(1000);
List<String> robots = pcloudRobotSilenceMapper.listRobots();
for (String robotWxid : robots) {
Map<String, String> friends = JedisClusterUtils.hgetAll(robotWxid + PCLOUD_GUIDE_SUFFIX);
if (friends == null) {
continue;
}
Set<String> userSet = friends.keySet();
for (String userId : userSet) {
PcloudGuideDelayDto pcloudGuideDelayDto = JSONObject.parseObject(friends.get(userId), PcloudGuideDelayDto.class);
// 超时 推送引导语
if (!DateUtils.addSecond(pcloudGuideDelayDto.getSendTime(), pcloudGuideDelayDto.getSpanTime() + pcloudGuideDelayDto.getDuration()).after(new Date())) {
// 发送消息
for (PcloudGuideMessageVO message : pcloudGuideDelayDto.getMsgList()) {
Integer replyType = message.getReplyType();
if (ReplyTypeEnum.TEXT.value.equals(replyType)) {
SendTextMessageVO sendTextMessageVO = new SendTextMessageVO();
sendTextMessageVO.setContent(message.getContent());
sendTextMessageVO.setAltId(pcloudGuideDelayDto.getRobotWxId());
sendTextMessageVO.setWxGroupId(pcloudGuideDelayDto.getUserWxId());
sendTextMessageVO.setIp(pcloudGuideDelayDto.getIp());
sendTextMessageVO.setCode(pcloudGuideDelayDto.getCode());
WxGroupSDK.sendTextMessage(sendTextMessageVO);
}
if (ReplyTypeEnum.IMAGE.value.equals(replyType)) {
SendPicMessageVO sendPicMessageVO = new SendPicMessageVO();
sendPicMessageVO.setPicUrl(message.getPicUrl());
sendPicMessageVO.setAltId(pcloudGuideDelayDto.getRobotWxId());
sendPicMessageVO.setWxGroupId(pcloudGuideDelayDto.getUserWxId());
sendPicMessageVO.setIp(pcloudGuideDelayDto.getIp());
sendPicMessageVO.setCode(pcloudGuideDelayDto.getCode());
WxGroupSDK.sendPicMessage(sendPicMessageVO);
}
}
// 向缓存中写入下一条
PcloudGuide pcloudGuide = pcloudGuideMapper.getFirstByRobotId(pcloudGuideDelayDto.getRobotWxId(), pcloudGuideDelayDto.getNum() + 1);
if (pcloudGuide != null) {
List<PcloudGuideMessageVO> messageVOList = pcloudGuideMessageMapper.listByGuideId(pcloudGuide.getId());
PcloudGuideDelayDto guideDelayDto = PcloudGuideDelayDto.builder().sendTime(new Date()).duration(0)
.spanTime((pcloudGuide.getTimeSpan() == null ? 0 : pcloudGuide.getTimeSpan())).num(pcloudGuideDelayDto.getNum() + 1)
.robotWxId(pcloudGuideDelayDto.getRobotWxId()).ip(pcloudGuideDelayDto.getIp()).code(pcloudGuideDelayDto.getCode()).msgList(messageVOList).build();
JedisClusterUtils.hset(pcloudGuideDelayDto.getRobotWxId() + PCLOUD_GUIDE_SUFFIX, pcloudGuideDelayDto.getUserWxId(), JSONObject.toJSONString(guideDelayDto));
} else {
// 最后一条 删除缓存
JedisClusterUtils.hdel(pcloudGuideDelayDto.getRobotWxId() + PCLOUD_GUIDE_SUFFIX, userId);
}
}
}
}
} catch (InterruptedException e) {
log.error("引导语延时发送,处理失败", e);
}
}
}).start();
}
}
......@@ -34,10 +34,11 @@ import com.pcloud.book.group.enums.CipherTypeEnum;
import com.pcloud.book.group.enums.TouchTypeEnum;
import com.pcloud.book.group.tools.SendWeixinRequestTools;
import com.pcloud.book.group.vo.GroupQrcodeBaseInfoVO;
import com.pcloud.book.guide.dto.PcloudGuideDelayMsgDto;
import com.pcloud.book.guide.dto.PcloudGuideDelayDto;
import com.pcloud.book.guide.entity.PcloudGuide;
import com.pcloud.book.guide.mapper.PcloudGuideMapper;
import com.pcloud.book.guide.mapper.PcloudGuideMessageMapper;
import com.pcloud.book.guide.mapper.PcloudRobotSilenceMapper;
import com.pcloud.book.guide.vo.PcloudGuideMessageVO;
import com.pcloud.book.keywords.biz.BookGuideBiz;
import com.pcloud.book.keywords.biz.BookKeywordBiz;
......@@ -81,11 +82,7 @@ import com.sdk.wxgroup.SendMessageTypeEnum;
import com.sdk.wxgroup.SendPicMessageVO;
import com.sdk.wxgroup.SendTextMessageVO;
import com.sdk.wxgroup.WxGroupSDK;
import com.sdk.wxgroup.*;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -100,13 +97,11 @@ import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import static com.pcloud.book.guide.constant.DelayQueueConstant.BOOK_DELAY_DEAD_LETTER_KEY;
import static com.pcloud.book.guide.constant.DelayQueueConstant.BOOK_DELAY_EXCHANGE;
import static com.pcloud.book.guide.constant.PcloudGuideRedisConstant.PCLOUD_GUIDE_SUFFIX;
/**
* @author lily
......@@ -166,7 +161,7 @@ public class BookGuideBizImpl implements BookGuideBiz {
@Autowired
private PcloudGuideMapper pcloudGuideMapper;
@Autowired
private RabbitTemplate rabbitTemplate;
private PcloudRobotSilenceMapper pcloudRobotSilenceMapper;
@Value("${system.env}")
private String envStr;
......@@ -335,22 +330,18 @@ public class BookGuideBizImpl implements BookGuideBiz {
paramMap.put("robotWxId", robotId);
PcloudRobot pcloudRobot = (PcloudRobot)pcloudRobotDao.getBy(paramMap, "getByRobotWxId");
if (null != pcloudRobot) {
List<PcloudGuide> list = pcloudGuideMapper.listByRobotId(robotId);
if (!ListUtils.isEmpty(list)) {
AtomicInteger timeSpan = new AtomicInteger();
list.forEach(pcloudGuide -> {
timeSpan.addAndGet(pcloudGuide.getTimeSpan() == null ? 0 : pcloudGuide.getTimeSpan());
PcloudGuide pcloudGuide= pcloudGuideMapper.getFirstByRobotId(robotId,0);
log.info("[sendFriendGuide] 新增好友,推送引导语: {}", pcloudGuide);
if (pcloudGuide != null) {
List<PcloudGuideMessageVO> messageVOList = pcloudGuideMessageMapper.listByGuideId(pcloudGuide.getId());
messageVOList.forEach(message -> {
PcloudGuideDelayMsgDto msgDto = PcloudGuideDelayMsgDto.builder().pcloudGuideMessageVO(message)
.code(code).ip(ip).robotId(robotId).wxId(userWxId).build();
MessageProperties properties = new MessageProperties();
properties.setContentType("text/plain");
properties.setExpiration(String.valueOf(timeSpan.get() * 1000));
Message mqMessage = MessageBuilder.withBody(JSONObject.toJSONString(msgDto).getBytes()).andProperties(properties).build();
rabbitTemplate.convertAndSend(BOOK_DELAY_EXCHANGE, BOOK_DELAY_DEAD_LETTER_KEY, mqMessage);
});
});
PcloudGuideDelayDto guideDelayDto = PcloudGuideDelayDto.builder().sendTime(new Date()).duration(0)
.spanTime((pcloudGuide.getTimeSpan() == null ? 0 : pcloudGuide.getTimeSpan())).num(1)
.userWxId(agreeAddUserDTO.getUserWxId()).robotWxId(robotId).ip(ip).code(code).msgList(messageVOList).build();
// 加好友 清除历史
JedisClusterUtils.hdel(agreeAddUserDTO.getRobotWxId() + PCLOUD_GUIDE_SUFFIX, agreeAddUserDTO.getUserWxId());
log.info("[sendFriendGuide] 向缓存中写入延迟发送的引导语:{}", JSONObject.toJSONString(guideDelayDto));
JedisClusterUtils.hset(agreeAddUserDTO.getRobotWxId() + PCLOUD_GUIDE_SUFFIX, agreeAddUserDTO.getUserWxId(), JSONObject.toJSONString(guideDelayDto));
}
return;
}
......
package com.pcloud.book.mq.topic;
import com.alibaba.fastjson.JSONObject;
import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr;
import com.pcloud.book.group.biz.BookGroupClassifyBiz;
import com.pcloud.book.group.dto.GroupClassifyQrcodeDTO;
import com.pcloud.book.guide.dto.PcloudGuideDelayDto;
import com.pcloud.book.guide.mapper.PcloudRobotSilenceMapper;
import com.pcloud.book.keywords.biz.BookKeywordBiz;
import com.pcloud.book.mq.config.MQTopicConumer;
import com.pcloud.book.reading.biz.ReadingActivityBiz;
......@@ -12,10 +15,11 @@ import com.pcloud.book.weixinclock.biz.WeixinClockBiz;
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;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
......@@ -23,9 +27,10 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import static com.pcloud.book.guide.constant.PcloudGuideRedisConstant.PCLOUD_GUIDE_SUFFIX;
/**
* @author lily
......@@ -49,6 +54,8 @@ public class WxGroupSendTextListener {
private BookGroupClassifyBiz bookGroupClassifyBiz;
@Autowired
private ReadingActivityBiz readingActivityBiz;
@Autowired
private PcloudRobotSilenceMapper pcloudRobotSilenceMapper;
/**
* 接收微信用户进群消息
......@@ -62,6 +69,8 @@ public class WxGroupSendTextListener {
String wechatUserId = sendTextDTO.getWechatUserId();
// 更新群人数和群名称
changeGroupInfo(sendTextDTO);
// 缄默设置处理
silenceProcess(sendTextDTO);
//校验是否机器人账号
List<String> allRobotWxIds = wechatGroupConsr.listAllRobotWxId();
if (!ListUtils.isEmpty(allRobotWxIds) && !allRobotWxIds.contains(wechatUserId) && !StringUtil.isEmpty(sendTextDTO.getTextContent())) {
......@@ -82,6 +91,28 @@ public class WxGroupSendTextListener {
}
/**
* 机器人缄默设置处理
*/
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));
}
}
}
/**
* 更新群人数和群名称
* @param sendTextDTO 群消息DTO
*/
......
......@@ -2,7 +2,7 @@ package com.pcloud.book.pcloudkeyword.biz.impl;
import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.consumer.content.ResourceConsr;
import com.pcloud.book.keywords.enums.ReplyTypeEnum;
import com.pcloud.book.guide.mapper.PcloudRobotSilenceMapper;
import com.pcloud.book.pcloudkeyword.biz.PcloudRobotBiz;
import com.pcloud.book.pcloudkeyword.dao.PcloudKeywordClassifyDao;
import com.pcloud.book.pcloudkeyword.dao.PcloudRobotDao;
......@@ -28,7 +28,10 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component("pcloudRobotBiz")
public class PcloudRobotBizImpl implements PcloudRobotBiz {
......@@ -45,6 +48,8 @@ public class PcloudRobotBizImpl implements PcloudRobotBiz {
private PcloudRobotQrcodeDao pcloudRobotQrcodeDao;
@Value("${wechat.group.link.prefix}")
private String wechatLinkPrefix;
@Autowired
private PcloudRobotSilenceMapper pcloudRobotSilenceMapper;
@Override
@Transactional(rollbackFor = Exception.class)
......@@ -120,6 +125,7 @@ public class PcloudRobotBizImpl implements PcloudRobotBiz {
public PcloudRobot getPcloudRobot(Long id) {
PcloudRobot pcloudRobot = pcloudRobotDao.getById(id);
if(pcloudRobot != null) {
pcloudRobot.setSilenceDuration(pcloudRobotSilenceMapper.getSilenceDurationByRobotWxId(pcloudRobot.getWxId()));
List<PcloudRobotWelcome> robotWelcomeList = pcloudRobotWelcomeDao.getRobotWelcomeListByPcloudRobotId(pcloudRobot.getId());
fillRobotWelcome(robotWelcomeList);
pcloudRobot.setRobotWelcomeList(robotWelcomeList);
......
......@@ -43,4 +43,7 @@ public class PcloudRobot extends BaseEntity {
@ApiModelProperty("小号回复欢迎语")
private List<PcloudRobotWelcome> robotWelcomeList;
@ApiModelProperty("缄默时长")
private Integer silenceDuration;
}
......@@ -186,4 +186,16 @@
ORDER BY
seq_num ASC
</select>
<select id="getFirstByRobotId" resultMap="BaseResultMap">
SELECT
id, time_span, seq_num
FROM
pcloud_guide
WHERE
robot_wx_id = #{robotId}
ORDER BY
seq_num ASC
LIMIT #{num}, 1
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.pcloud.book.guide.mapper.PcloudRobotSilenceMapper" >
<resultMap id="BaseResultMap" type="com.pcloud.book.guide.entity.PcloudRobotSilence" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="robot_wx_id" property="robotWxId" jdbcType="VARCHAR" />
<result column="silence_duration" property="silenceDuration" jdbcType="INTEGER" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="Base_Column_List" >
id, robot_wx_id, silence_duration, create_time, update_time
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
<include refid="Base_Column_List" />
from pcloud_robot_silence
where id = #{id,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
delete from pcloud_robot_silence
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.pcloud.book.guide.entity.PcloudRobotSilence" >
insert into pcloud_robot_silence (id, robot_wx_id, silence_duration,
create_time, update_time)
values (#{id,jdbcType=INTEGER}, #{robotWxId,jdbcType=VARCHAR}, #{silenceDuration,jdbcType=INTEGER},
#{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP})
</insert>
<insert id="insertSelective" parameterType="com.pcloud.book.guide.entity.PcloudRobotSilence" >
insert into pcloud_robot_silence
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="id != null" >
id,
</if>
<if test="robotWxId != null" >
robot_wx_id,
</if>
<if test="silenceDuration != null" >
silence_duration,
</if>
<if test="createTime != null" >
create_time,
</if>
<if test="updateTime != null" >
update_time,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="id != null" >
#{id,jdbcType=INTEGER},
</if>
<if test="robotWxId != null" >
#{robotWxId,jdbcType=VARCHAR},
</if>
<if test="silenceDuration != null" >
#{silenceDuration,jdbcType=INTEGER},
</if>
<if test="createTime != null" >
#{createTime,jdbcType=TIMESTAMP},
</if>
<if test="updateTime != null" >
#{updateTime,jdbcType=TIMESTAMP},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.pcloud.book.guide.entity.PcloudRobotSilence" >
update pcloud_robot_silence
<set >
<if test="robotWxId != null" >
robot_wx_id = #{robotWxId,jdbcType=VARCHAR},
</if>
<if test="silenceDuration != null" >
silence_duration = #{silenceDuration,jdbcType=INTEGER},
</if>
<if test="createTime != null" >
create_time = #{createTime,jdbcType=TIMESTAMP},
</if>
<if test="updateTime != null" >
update_time = #{updateTime,jdbcType=TIMESTAMP},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKey" parameterType="com.pcloud.book.guide.entity.PcloudRobotSilence" >
update pcloud_robot_silence
set robot_wx_id = #{robotWxId,jdbcType=VARCHAR},
silence_duration = #{silenceDuration,jdbcType=INTEGER},
create_time = #{createTime,jdbcType=TIMESTAMP},
update_time = #{updateTime,jdbcType=TIMESTAMP}
where id = #{id,jdbcType=INTEGER}
</update>
<!--查询所有平台端 引导语 缄默设置相关的机器人-->
<select id="listRobots" resultType="java.lang.String">
SELECT robot_wx_id FROM pcloud_robot_silence UNION SELECT robot_wx_id FROM pcloud_guide
</select>
<!--根据机器人wxid获取缄默时长-->
<select id="getSilenceDurationByRobotWxId" resultType="java.lang.Integer">
SELECT silence_duration FROM pcloud_robot_silence WHERE robot_wx_id = #{wxId}
</select>
<!--设置机器人缄默时长-->
<update id="setSilenceDuration">
INSERT INTO pcloud_robot_silence (robot_wx_id,silence_duration,create_time) VALUE(#{robotWxId},#{silenceDuration},NOW())
ON DUPLICATE KEY UPDATE robot_wx_id=#{robotWxId},silence_duration=#{silenceDuration},update_time=NOW()
</update>
</mapper>
\ No newline at end of file
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