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 { ...@@ -238,34 +238,4 @@ public class BookApplication {
public Binding someUserScanBookGroupBind(){ public Binding someUserScanBookGroupBind(){
return RabbitMQFactory.bindingExchange(someUserScanBookGroupQueue(), MQTopicProducer.SOME_USER_SCAN_BOOK_GROUP); 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; package com.pcloud.book.guide.biz;
import com.pcloud.book.guide.vo.Create4RobotVO; import com.pcloud.book.guide.vo.*;
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.common.page.PageBeanNew; import com.pcloud.common.page.PageBeanNew;
public interface PcloudGuideBiz { public interface PcloudGuideBiz {
...@@ -22,4 +18,6 @@ public interface PcloudGuideBiz { ...@@ -22,4 +18,6 @@ public interface PcloudGuideBiz {
void updateSeqNum(UpdateSeqNumVO updateSeqNumVO); void updateSeqNum(UpdateSeqNumVO updateSeqNumVO);
void create4Robot(Create4RobotVO create4RobotVO); void create4Robot(Create4RobotVO create4RobotVO);
void setSilenceDuration(RobotSilenceVO robotSilenceVO);
} }
...@@ -6,15 +6,12 @@ import com.pcloud.book.guide.entity.PcloudGuide; ...@@ -6,15 +6,12 @@ import com.pcloud.book.guide.entity.PcloudGuide;
import com.pcloud.book.guide.entity.PcloudGuideMessage; import com.pcloud.book.guide.entity.PcloudGuideMessage;
import com.pcloud.book.guide.mapper.PcloudGuideMapper; import com.pcloud.book.guide.mapper.PcloudGuideMapper;
import com.pcloud.book.guide.mapper.PcloudGuideMessageMapper; import com.pcloud.book.guide.mapper.PcloudGuideMessageMapper;
import com.pcloud.book.guide.vo.Create4RobotVO; import com.pcloud.book.guide.mapper.PcloudRobotSilenceMapper;
import com.pcloud.book.guide.vo.CreatePcloudGuideVO; import com.pcloud.book.guide.vo.*;
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.common.page.PageBeanNew; import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.utils.BeanUtils; import com.pcloud.common.utils.BeanUtils;
import com.pcloud.common.utils.ListUtils; import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.string.StringUtil;
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 org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -31,6 +28,9 @@ public class PcloudGuideBizImpl implements PcloudGuideBiz { ...@@ -31,6 +28,9 @@ public class PcloudGuideBizImpl implements PcloudGuideBiz {
@Autowired @Autowired
private PcloudGuideMessageMapper pcloudGuideMessageMapper; private PcloudGuideMessageMapper pcloudGuideMessageMapper;
@Autowired
private PcloudRobotSilenceMapper pcloudRobotSilenceMapper;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Integer addPcloudGuide(CreatePcloudGuideVO createPcloudGuideVO) { public Integer addPcloudGuide(CreatePcloudGuideVO createPcloudGuideVO) {
...@@ -156,4 +156,12 @@ public class PcloudGuideBizImpl implements PcloudGuideBiz { ...@@ -156,4 +156,12 @@ public class PcloudGuideBizImpl implements PcloudGuideBiz {
pcloudGuideMessageMapper.batchInsert(list); 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; ...@@ -6,20 +6,34 @@ import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
/**
* 平台端引导语 延时发送信息
* @author Gui_q
*/
@Data @Data
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Builder @Builder
public class PcloudGuideDelayMsgDto { public class PcloudGuideDelayDto {
private PcloudGuideMessageVO pcloudGuideMessageVO;
private String robotId; private Date sendTime;
private String wxId; private Integer spanTime;
private String ip; private String ip;
private String userWxId;
private String robotWxId;
private Integer code; 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; ...@@ -7,11 +7,14 @@ import com.pcloud.book.guide.vo.CreatePcloudGuideVO;
import com.pcloud.book.guide.vo.PcloudGuideVO; import com.pcloud.book.guide.vo.PcloudGuideVO;
import com.pcloud.book.guide.vo.UpdatePcloudGuideVO; import com.pcloud.book.guide.vo.UpdatePcloudGuideVO;
import com.pcloud.book.guide.vo.UpdateSeqNumVO; import com.pcloud.book.guide.vo.UpdateSeqNumVO;
import com.pcloud.book.guide.vo.RobotSilenceVO;
import com.pcloud.common.dto.ResponseDto; import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.page.PageBeanNew; import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.permission.PermissionException; import com.pcloud.common.permission.PermissionException;
import com.pcloud.common.utils.SessionUtil; import com.pcloud.common.utils.SessionUtil;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
...@@ -83,4 +86,16 @@ public class PcloudGuideFacadeImpl { ...@@ -83,4 +86,16 @@ public class PcloudGuideFacadeImpl {
pcloudGuideBiz.create4Robot(create4RobotVO); pcloudGuideBiz.create4Robot(create4RobotVO);
return new ResponseDto<>(); 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 { ...@@ -31,4 +31,6 @@ public interface PcloudGuideMapper {
void updateSeqNum(@Param("id") Integer pcloudGuideId, @Param("seqNum") Integer seqNum); void updateSeqNum(@Param("id") Integer pcloudGuideId, @Param("seqNum") Integer seqNum);
List<PcloudGuide> listByRobotId(String robotId); 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; ...@@ -34,10 +34,11 @@ import com.pcloud.book.group.enums.CipherTypeEnum;
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.GroupQrcodeBaseInfoVO; 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.entity.PcloudGuide;
import com.pcloud.book.guide.mapper.PcloudGuideMapper; import com.pcloud.book.guide.mapper.PcloudGuideMapper;
import com.pcloud.book.guide.mapper.PcloudGuideMessageMapper; 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.guide.vo.PcloudGuideMessageVO;
import com.pcloud.book.keywords.biz.BookGuideBiz; import com.pcloud.book.keywords.biz.BookGuideBiz;
import com.pcloud.book.keywords.biz.BookKeywordBiz; import com.pcloud.book.keywords.biz.BookKeywordBiz;
...@@ -81,11 +82,7 @@ import com.sdk.wxgroup.SendMessageTypeEnum; ...@@ -81,11 +82,7 @@ import com.sdk.wxgroup.SendMessageTypeEnum;
import com.sdk.wxgroup.SendPicMessageVO; import com.sdk.wxgroup.SendPicMessageVO;
import com.sdk.wxgroup.SendTextMessageVO; import com.sdk.wxgroup.SendTextMessageVO;
import com.sdk.wxgroup.WxGroupSDK; 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.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -100,13 +97,11 @@ import java.util.Date; ...@@ -100,13 +97,11 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j; 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.PcloudGuideRedisConstant.PCLOUD_GUIDE_SUFFIX;
import static com.pcloud.book.guide.constant.DelayQueueConstant.BOOK_DELAY_EXCHANGE;
/** /**
* @author lily * @author lily
...@@ -166,7 +161,7 @@ public class BookGuideBizImpl implements BookGuideBiz { ...@@ -166,7 +161,7 @@ public class BookGuideBizImpl implements BookGuideBiz {
@Autowired @Autowired
private PcloudGuideMapper pcloudGuideMapper; private PcloudGuideMapper pcloudGuideMapper;
@Autowired @Autowired
private RabbitTemplate rabbitTemplate; private PcloudRobotSilenceMapper pcloudRobotSilenceMapper;
@Value("${system.env}") @Value("${system.env}")
private String envStr; private String envStr;
...@@ -335,22 +330,18 @@ public class BookGuideBizImpl implements BookGuideBiz { ...@@ -335,22 +330,18 @@ public class BookGuideBizImpl implements BookGuideBiz {
paramMap.put("robotWxId", robotId); paramMap.put("robotWxId", robotId);
PcloudRobot pcloudRobot = (PcloudRobot)pcloudRobotDao.getBy(paramMap, "getByRobotWxId"); PcloudRobot pcloudRobot = (PcloudRobot)pcloudRobotDao.getBy(paramMap, "getByRobotWxId");
if (null != pcloudRobot) { if (null != pcloudRobot) {
List<PcloudGuide> list = pcloudGuideMapper.listByRobotId(robotId); PcloudGuide pcloudGuide= pcloudGuideMapper.getFirstByRobotId(robotId,0);
if (!ListUtils.isEmpty(list)) { log.info("[sendFriendGuide] 新增好友,推送引导语: {}", pcloudGuide);
AtomicInteger timeSpan = new AtomicInteger(); if (pcloudGuide != null) {
list.forEach(pcloudGuide -> { List<PcloudGuideMessageVO> messageVOList = pcloudGuideMessageMapper.listByGuideId(pcloudGuide.getId());
timeSpan.addAndGet(pcloudGuide.getTimeSpan() == null ? 0 : pcloudGuide.getTimeSpan());
List<PcloudGuideMessageVO> messageVOList = pcloudGuideMessageMapper.listByGuideId(pcloudGuide.getId()); PcloudGuideDelayDto guideDelayDto = PcloudGuideDelayDto.builder().sendTime(new Date()).duration(0)
messageVOList.forEach(message -> { .spanTime((pcloudGuide.getTimeSpan() == null ? 0 : pcloudGuide.getTimeSpan())).num(1)
PcloudGuideDelayMsgDto msgDto = PcloudGuideDelayMsgDto.builder().pcloudGuideMessageVO(message) .userWxId(agreeAddUserDTO.getUserWxId()).robotWxId(robotId).ip(ip).code(code).msgList(messageVOList).build();
.code(code).ip(ip).robotId(robotId).wxId(userWxId).build(); // 加好友 清除历史
MessageProperties properties = new MessageProperties(); JedisClusterUtils.hdel(agreeAddUserDTO.getRobotWxId() + PCLOUD_GUIDE_SUFFIX, agreeAddUserDTO.getUserWxId());
properties.setContentType("text/plain"); log.info("[sendFriendGuide] 向缓存中写入延迟发送的引导语:{}", JSONObject.toJSONString(guideDelayDto));
properties.setExpiration(String.valueOf(timeSpan.get() * 1000)); JedisClusterUtils.hset(agreeAddUserDTO.getRobotWxId() + PCLOUD_GUIDE_SUFFIX, agreeAddUserDTO.getUserWxId(), JSONObject.toJSONString(guideDelayDto));
Message mqMessage = MessageBuilder.withBody(JSONObject.toJSONString(msgDto).getBytes()).andProperties(properties).build();
rabbitTemplate.convertAndSend(BOOK_DELAY_EXCHANGE, BOOK_DELAY_DEAD_LETTER_KEY, mqMessage);
});
});
} }
return; return;
} }
......
package com.pcloud.book.mq.topic; package com.pcloud.book.mq.topic;
import com.alibaba.fastjson.JSONObject;
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.BookGroupClassifyBiz;
import com.pcloud.book.group.dto.GroupClassifyQrcodeDTO; 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.keywords.biz.BookKeywordBiz;
import com.pcloud.book.mq.config.MQTopicConumer; import com.pcloud.book.mq.config.MQTopicConumer;
import com.pcloud.book.reading.biz.ReadingActivityBiz; import com.pcloud.book.reading.biz.ReadingActivityBiz;
...@@ -12,10 +15,11 @@ import com.pcloud.book.weixinclock.biz.WeixinClockBiz; ...@@ -12,10 +15,11 @@ import com.pcloud.book.weixinclock.biz.WeixinClockBiz;
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;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitHandler;
...@@ -23,9 +27,10 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener; ...@@ -23,9 +27,10 @@ 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.Date;
import java.util.List; import java.util.List;
import lombok.extern.slf4j.Slf4j; import static com.pcloud.book.guide.constant.PcloudGuideRedisConstant.PCLOUD_GUIDE_SUFFIX;
/** /**
* @author lily * @author lily
...@@ -49,6 +54,8 @@ public class WxGroupSendTextListener { ...@@ -49,6 +54,8 @@ public class WxGroupSendTextListener {
private BookGroupClassifyBiz bookGroupClassifyBiz; private BookGroupClassifyBiz bookGroupClassifyBiz;
@Autowired @Autowired
private ReadingActivityBiz readingActivityBiz; private ReadingActivityBiz readingActivityBiz;
@Autowired
private PcloudRobotSilenceMapper pcloudRobotSilenceMapper;
/** /**
* 接收微信用户进群消息 * 接收微信用户进群消息
...@@ -62,6 +69,8 @@ public class WxGroupSendTextListener { ...@@ -62,6 +69,8 @@ public class WxGroupSendTextListener {
String wechatUserId = sendTextDTO.getWechatUserId(); String wechatUserId = sendTextDTO.getWechatUserId();
// 更新群人数和群名称 // 更新群人数和群名称
changeGroupInfo(sendTextDTO); changeGroupInfo(sendTextDTO);
// 缄默设置处理
silenceProcess(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())) {
...@@ -82,6 +91,28 @@ public class WxGroupSendTextListener { ...@@ -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 * @param sendTextDTO 群消息DTO
*/ */
......
...@@ -2,7 +2,7 @@ package com.pcloud.book.pcloudkeyword.biz.impl; ...@@ -2,7 +2,7 @@ package com.pcloud.book.pcloudkeyword.biz.impl;
import com.pcloud.book.base.exception.BookBizException; import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.consumer.content.ResourceConsr; 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.biz.PcloudRobotBiz;
import com.pcloud.book.pcloudkeyword.dao.PcloudKeywordClassifyDao; import com.pcloud.book.pcloudkeyword.dao.PcloudKeywordClassifyDao;
import com.pcloud.book.pcloudkeyword.dao.PcloudRobotDao; import com.pcloud.book.pcloudkeyword.dao.PcloudRobotDao;
...@@ -28,7 +28,10 @@ import org.springframework.beans.factory.annotation.Value; ...@@ -28,7 +28,10 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; 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") @Component("pcloudRobotBiz")
public class PcloudRobotBizImpl implements PcloudRobotBiz { public class PcloudRobotBizImpl implements PcloudRobotBiz {
...@@ -45,6 +48,8 @@ public class PcloudRobotBizImpl implements PcloudRobotBiz { ...@@ -45,6 +48,8 @@ public class PcloudRobotBizImpl implements PcloudRobotBiz {
private PcloudRobotQrcodeDao pcloudRobotQrcodeDao; private PcloudRobotQrcodeDao pcloudRobotQrcodeDao;
@Value("${wechat.group.link.prefix}") @Value("${wechat.group.link.prefix}")
private String wechatLinkPrefix; private String wechatLinkPrefix;
@Autowired
private PcloudRobotSilenceMapper pcloudRobotSilenceMapper;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
...@@ -120,6 +125,7 @@ public class PcloudRobotBizImpl implements PcloudRobotBiz { ...@@ -120,6 +125,7 @@ public class PcloudRobotBizImpl implements PcloudRobotBiz {
public PcloudRobot getPcloudRobot(Long id) { public PcloudRobot getPcloudRobot(Long id) {
PcloudRobot pcloudRobot = pcloudRobotDao.getById(id); PcloudRobot pcloudRobot = pcloudRobotDao.getById(id);
if(pcloudRobot != null) { if(pcloudRobot != null) {
pcloudRobot.setSilenceDuration(pcloudRobotSilenceMapper.getSilenceDurationByRobotWxId(pcloudRobot.getWxId()));
List<PcloudRobotWelcome> robotWelcomeList = pcloudRobotWelcomeDao.getRobotWelcomeListByPcloudRobotId(pcloudRobot.getId()); List<PcloudRobotWelcome> robotWelcomeList = pcloudRobotWelcomeDao.getRobotWelcomeListByPcloudRobotId(pcloudRobot.getId());
fillRobotWelcome(robotWelcomeList); fillRobotWelcome(robotWelcomeList);
pcloudRobot.setRobotWelcomeList(robotWelcomeList); pcloudRobot.setRobotWelcomeList(robotWelcomeList);
......
...@@ -43,4 +43,7 @@ public class PcloudRobot extends BaseEntity { ...@@ -43,4 +43,7 @@ public class PcloudRobot extends BaseEntity {
@ApiModelProperty("小号回复欢迎语") @ApiModelProperty("小号回复欢迎语")
private List<PcloudRobotWelcome> robotWelcomeList; private List<PcloudRobotWelcome> robotWelcomeList;
@ApiModelProperty("缄默时长")
private Integer silenceDuration;
} }
...@@ -186,4 +186,16 @@ ...@@ -186,4 +186,16 @@
ORDER BY ORDER BY
seq_num ASC seq_num ASC
</select> </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> </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