Commit 0aa654a6 by 裴大威

Merge branch 'feat-1002399' into 'master'

feat-1002402: 个人号分类加排序 feat 102399 feat 2364

See merge request rays/pcloud-book!439
parents 9de2455e 4be01c9b
...@@ -19,4 +19,10 @@ public class RobotClassifyDTO { ...@@ -19,4 +19,10 @@ public class RobotClassifyDTO {
@ApiModelProperty("小号编号") @ApiModelProperty("小号编号")
private String uniqueNumber; private String uniqueNumber;
@ApiModelProperty("小号状态(1:上线 2:离线)")
private Integer state;
@ApiModelProperty("小号真是状态(1:上线 2:离线)")
private Integer realStatus;
} }
...@@ -248,4 +248,17 @@ public class BookApplication { ...@@ -248,4 +248,17 @@ public class BookApplication {
public Binding wxGroupSendNotTextBind() { public Binding wxGroupSendNotTextBind() {
return RabbitMQFactory.bindingExchange(wxGroupSendNotTextQueue(), MQTopicProducer.WXGROUP_SEND_NOT_TEXT); return RabbitMQFactory.bindingExchange(wxGroupSendNotTextQueue(), MQTopicProducer.WXGROUP_SEND_NOT_TEXT);
} }
/**
* 监听小号真实状态
*/
@Bean
public Queue wxGroupRealStatusQueue() {
return RabbitMQFactory.queueBuilder(MQTopicConumer.ROBOT_REAL_STATUS);
}
@Bean
public Binding wxGroupRealStatusBind() {
return RabbitMQFactory.bindingExchange(wxGroupRealStatusQueue(), MQTopicProducer.ROBOT_REAL_STATUS);
}
} }
...@@ -16,6 +16,11 @@ public class BookBusinessConstants { ...@@ -16,6 +16,11 @@ public class BookBusinessConstants {
public static final Map<String, AutoUpdateGroupNumDTO> GROUP_NUM_DTO_MAP = new ConcurrentHashMap<>(128); public static final Map<String, AutoUpdateGroupNumDTO> GROUP_NUM_DTO_MAP = new ConcurrentHashMap<>(128);
/** /**
* 小号上次心跳时间缓存
*/
public static final String ACTIVE_ROBOT_CACHE_KEY_PREFIX = "activerobot:";
/**
* 收款状态 * 收款状态
*/ */
public enum CollectionStatus { public enum CollectionStatus {
......
...@@ -11,6 +11,11 @@ public class MQTopicConumer { ...@@ -11,6 +11,11 @@ public class MQTopicConumer {
private static final String PREFIX = "consumer.book."; private static final String PREFIX = "consumer.book.";
/** /**
* 小号状态
*/
public static final String ROBOT_REAL_STATUS = PREFIX + MQTopicProducer.ROBOT_REAL_STATUS;
/**
* 清除录音消费者 * 清除录音消费者
*/ */
public static final String DELETE_VIDEO = PREFIX + MQTopicProducer.DELETE_VIDEO; public static final String DELETE_VIDEO = PREFIX + MQTopicProducer.DELETE_VIDEO;
......
package com.pcloud.book.mq.topic;
import com.pcloud.book.group.biz.GroupQrcodeBiz;
import com.pcloud.book.mq.config.MQTopicConumer;
import com.pcloud.book.pcloudkeyword.biz.PcloudRobotBiz;
import com.pcloud.book.reading.biz.ReadingActivityBiz;
import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.wechatgroup.message.dto.AddWXGroupDTO;
import com.pcloud.wechatgroup.selfrobot.dto.RobotStatusDTO;
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;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
@RabbitListener(queues = MQTopicConumer.ROBOT_REAL_STATUS)
public class RobotRealStatusListener {
@Resource
private PcloudRobotBiz pcloudRobotBiz;
/**
* 处理小号真实状态
*/
@ParamLog(value = "处理小号真实状态", isAfterReturn = false)
@RabbitHandler
public void onMessage(RobotStatusDTO dto) throws BizException {
try {
pcloudRobotBiz.changeRobotRealStatus(dto.getWxId(), dto.getStatus());
} catch (Exception e) {
log.error("接收微信用户进群消息失败" + e.getMessage(), e);
}
}
}
...@@ -14,6 +14,11 @@ import java.util.Map; ...@@ -14,6 +14,11 @@ import java.util.Map;
public interface PcloudRobotBiz { public interface PcloudRobotBiz {
/**
* 校验小号真是状态
*/
void changeRobotRealStatus(String wxId, Integer status);
void createPcloudRobot(PcloudRobot pcloudRobot); void createPcloudRobot(PcloudRobot pcloudRobot);
void updatePcloudRobot(PcloudRobot pcloudRobot); void updatePcloudRobot(PcloudRobot pcloudRobot);
......
...@@ -3,6 +3,7 @@ package com.pcloud.book.pcloudkeyword.biz.impl; ...@@ -3,6 +3,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.consumer.wechatgroup.WechatGroupConsr; import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr;
import com.pcloud.book.group.constant.BookBusinessConstants;
import com.pcloud.book.guide.biz.PcloudGuideBiz; import com.pcloud.book.guide.biz.PcloudGuideBiz;
import com.pcloud.book.guide.biz.PcloudRobotWakeUpBiz; import com.pcloud.book.guide.biz.PcloudRobotWakeUpBiz;
import com.pcloud.book.guide.mapper.PcloudRobotSilenceMapper; import com.pcloud.book.guide.mapper.PcloudRobotSilenceMapper;
...@@ -31,6 +32,7 @@ import com.pcloud.common.page.PageParam; ...@@ -31,6 +32,7 @@ import com.pcloud.common.page.PageParam;
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.QrcodeUtils; import com.pcloud.common.utils.QrcodeUtils;
import com.pcloud.common.utils.cache.redis.JedisClusterUtils;
import com.pcloud.common.utils.httpclient.UrlUtils; import com.pcloud.common.utils.httpclient.UrlUtils;
import com.pcloud.common.utils.string.StringUtil; import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.contentcenter.resource.dto.ResourceDTO; import com.pcloud.contentcenter.resource.dto.ResourceDTO;
...@@ -53,6 +55,7 @@ import java.util.ArrayList; ...@@ -53,6 +55,7 @@ import java.util.ArrayList;
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.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Component("pcloudRobotBiz") @Component("pcloudRobotBiz")
...@@ -96,6 +99,38 @@ public class PcloudRobotBizImpl implements PcloudRobotBiz { ...@@ -96,6 +99,38 @@ public class PcloudRobotBizImpl implements PcloudRobotBiz {
@Autowired @Autowired
private WechatGroupConsr wechatGroupConsr; private WechatGroupConsr wechatGroupConsr;
@ParamLog(value = "[changeRobotRealStatus]", isAfterReturn = false)
@Override
@Transactional(rollbackFor = {Exception.class})
public void changeRobotRealStatus(String wxId, Integer status) {
PcloudRobot robot = pcloudRobotDao.getByWxId(wxId);
if (Objects.isNull(robot)) {
return;
}
if (!status.equals(robot.getRealStatus())) {
pcloudRobotDao.updateRealStatus(wxId, status);
}
// 如果小号上线则缓存7s,心跳频率5s
if (1 == status) {
JedisClusterUtils.hset(BookBusinessConstants.ACTIVE_ROBOT_CACHE_KEY_PREFIX, wxId, String.valueOf(System.currentTimeMillis() + 7 * 1000));
}
// 处理无响应的上线状态小号,更新为下线
List<RobotClassifyDTO> allPcloudRobot = pcloudRobotDao.getAllPcloudRobot();
List<String> ids = allPcloudRobot.stream().filter(x -> 1 == x.getRealStatus()).map(RobotClassifyDTO::getWxId).collect(Collectors.toList());
Map<String, String> map = JedisClusterUtils.hgetAll(BookBusinessConstants.ACTIVE_ROBOT_CACHE_KEY_PREFIX);
for (String id : ids) {
String s = map.get(id);
if (null == s) {
JedisClusterUtils.hset(BookBusinessConstants.ACTIVE_ROBOT_CACHE_KEY_PREFIX, id, String.valueOf(System.currentTimeMillis() + 7 * 1000));
continue;
}
// 如果超时没有收到心跳则下线
if (System.currentTimeMillis() > Long.parseLong(s)) {
pcloudRobotDao.updateRealStatus(id, 2);
}
}
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void createPcloudRobot(PcloudRobot pcloudRobot) { public void createPcloudRobot(PcloudRobot pcloudRobot) {
......
...@@ -9,6 +9,11 @@ import java.util.Map; ...@@ -9,6 +9,11 @@ import java.util.Map;
public interface PcloudRobotDao extends BaseDao<PcloudRobot> { public interface PcloudRobotDao extends BaseDao<PcloudRobot> {
/**
* c++心跳程序自动修改真实状态
*/
void updateRealStatus(String wxId, Integer realStatus);
PcloudRobot getByWxId(String wxId); PcloudRobot getByWxId(String wxId);
PcloudRobot getPcloudRobotByType(Integer robotType); PcloudRobot getPcloudRobotByType(Integer robotType);
......
package com.pcloud.book.pcloudkeyword.dao.impl; package com.pcloud.book.pcloudkeyword.dao.impl;
import com.google.common.collect.Maps;
import com.pcloud.book.pcloudKeyword.dto.RobotClassifyDTO; import com.pcloud.book.pcloudKeyword.dto.RobotClassifyDTO;
import com.pcloud.book.pcloudkeyword.dao.PcloudRobotDao; import com.pcloud.book.pcloudkeyword.dao.PcloudRobotDao;
import com.pcloud.book.pcloudkeyword.entity.PcloudRobot; import com.pcloud.book.pcloudkeyword.entity.PcloudRobot;
import com.pcloud.common.core.dao.BaseDaoImpl; import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -13,6 +16,14 @@ import java.util.Map; ...@@ -13,6 +16,14 @@ import java.util.Map;
public class PcloudRobotDaoImpl extends BaseDaoImpl<PcloudRobot> implements PcloudRobotDao { public class PcloudRobotDaoImpl extends BaseDaoImpl<PcloudRobot> implements PcloudRobotDao {
@Override @Override
public void updateRealStatus(String wxId, Integer realStatus) {
Map<String, Object> map = Maps.newHashMap();
map.put("realStatus", realStatus);
map.put("wxId", wxId);
this.getSqlSession().update("updateRealStatus", map);
}
@Override
public PcloudRobot getByWxId(String wxId) { public PcloudRobot getByWxId(String wxId) {
return super.getSqlSession().selectOne(getStatement("getByWxId"), wxId); return super.getSqlSession().selectOne(getStatement("getByWxId"), wxId);
} }
......
...@@ -44,6 +44,9 @@ public class PcloudRobot extends BaseEntity { ...@@ -44,6 +44,9 @@ public class PcloudRobot extends BaseEntity {
@ApiModelProperty("状态:1 在线 2 离线") @ApiModelProperty("状态:1 在线 2 离线")
private Integer state; private Integer state;
@ApiModelProperty("真实状态:1 在线 2 离线")
private Integer realStatus;
@ApiModelProperty("小号回复欢迎语") @ApiModelProperty("小号回复欢迎语")
private List<PcloudRobotWelcome> robotWelcomeList; private List<PcloudRobotWelcome> robotWelcomeList;
......
<?xml version="1.0" encoding="UTF-8" ?> <?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" > <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.pcloud.book.pcloudkeyword.dao.impl.PcloudRobotDaoImpl" > <mapper namespace="com.pcloud.book.pcloudkeyword.dao.impl.PcloudRobotDaoImpl" >
<resultMap id="BaseResultMap" type="PcloudRobot" > <resultMap id="BaseResultMap" type="com.pcloud.book.pcloudkeyword.entity.PcloudRobot" >
<id column="id" property="id" jdbcType="INTEGER" /> <id column="id" property="id" jdbcType="INTEGER" />
<result column="wx_id" property="wxId" jdbcType="VARCHAR" /> <result column="wx_id" property="wxId" jdbcType="VARCHAR" />
<result column="nick_name" property="nickName" jdbcType="VARCHAR" /> <result column="nick_name" property="nickName" jdbcType="VARCHAR" />
...@@ -10,12 +10,13 @@ ...@@ -10,12 +10,13 @@
<result column="robot_type" jdbcType="INTEGER" property="robotType" /> <result column="robot_type" jdbcType="INTEGER" property="robotType" />
<result column="keyword_classify_id" jdbcType="BIGINT" property="keywordClassifyId" /> <result column="keyword_classify_id" jdbcType="BIGINT" property="keywordClassifyId" />
<result column="state" property="state" jdbcType="INTEGER" /> <result column="state" property="state" jdbcType="INTEGER" />
<result column="real_status" property="realStatus" jdbcType="INTEGER" />
<result column="wake_up" property="wakeUp" jdbcType="INTEGER" /> <result column="wake_up" property="wakeUp" jdbcType="INTEGER" />
<result column="unique_number" property="uniqueNumber" jdbcType="VARCHAR"/> <result column="unique_number" property="uniqueNumber" jdbcType="VARCHAR"/>
<result column="welcome_duration" property="welcomeDuration" jdbcType="INTEGER" /> <result column="welcome_duration" property="welcomeDuration" jdbcType="INTEGER" />
</resultMap> </resultMap>
<sql id="Base_Column_List" > <sql id="Base_Column_List" >
id, wx_id, nick_name, head, qrcode_url, robot_type, keyword_classify_id, state, wake_up, unique_number,welcome_duration id, wx_id, nick_name, head, qrcode_url, robot_type, keyword_classify_id, state, real_status, wake_up, unique_number,welcome_duration
</sql> </sql>
<insert id="insert" parameterType="PcloudRobot" useGeneratedKeys="true" keyProperty="id"> <insert id="insert" parameterType="PcloudRobot" useGeneratedKeys="true" keyProperty="id">
...@@ -27,6 +28,7 @@ ...@@ -27,6 +28,7 @@
robot_type, robot_type,
keyword_classify_id, keyword_classify_id,
state, state,
real_status,
wake_up, wake_up,
unique_number, unique_number,
welcome_duration welcome_duration
...@@ -39,6 +41,7 @@ ...@@ -39,6 +41,7 @@
#{robotType,jdbcType=INTEGER}, #{robotType,jdbcType=INTEGER},
#{keywordClassifyId,jdbcType=BIGINT}, #{keywordClassifyId,jdbcType=BIGINT},
#{state,jdbcType=INTEGER}, #{state,jdbcType=INTEGER},
#{realStatus,jdbcType=INTEGER},
#{wakeUp,jdbcType=INTEGER}, #{wakeUp,jdbcType=INTEGER},
#{uniqueNumber, jdbcType=VARCHAR}, #{uniqueNumber, jdbcType=VARCHAR},
#{welcomeDuration, jdbcType=INTEGER} #{welcomeDuration, jdbcType=INTEGER}
...@@ -69,6 +72,9 @@ ...@@ -69,6 +72,9 @@
<if test="state != null"> <if test="state != null">
state = #{state,jdbcType=INTEGER}, state = #{state,jdbcType=INTEGER},
</if> </if>
<if test="realStatus != null">
real_status = #{realStatus,jdbcType=INTEGER},
</if>
<if test="wakeUp != null"> <if test="wakeUp != null">
wake_up = #{wakeUp,jdbcType=INTEGER}, wake_up = #{wakeUp,jdbcType=INTEGER},
</if> </if>
...@@ -103,6 +109,9 @@ ...@@ -103,6 +109,9 @@
<if test="state != null"> <if test="state != null">
state = #{state,jdbcType=INTEGER}, state = #{state,jdbcType=INTEGER},
</if> </if>
<if test="realStatus != null">
real_status = #{realStatus,jdbcType=INTEGER},
</if>
<if test="wakeUp != null"> <if test="wakeUp != null">
wake_up = #{wakeUp,jdbcType=INTEGER}, wake_up = #{wakeUp,jdbcType=INTEGER},
</if> </if>
...@@ -122,6 +131,12 @@ ...@@ -122,6 +131,12 @@
where id=#{id} where id=#{id}
</update> </update>
<update id="updateRealStatus" parameterType="map">
update pcloud_robot set
real_status = #{realStatus}
where wx_id=#{wxId}
</update>
<select id="getById" parameterType="long" resultMap="BaseResultMap"> <select id="getById" parameterType="long" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/> select <include refid="Base_Column_List"/>
from pcloud_robot where id=#{id} from pcloud_robot where id=#{id}
...@@ -136,6 +151,7 @@ ...@@ -136,6 +151,7 @@
r.qrcode_url qrcodeUrl, r.qrcode_url qrcodeUrl,
r.robot_type robotType, r.robot_type robotType,
r.state state, r.state state,
r.real_status realStatus,
r.unique_number uniqueNumber r.unique_number uniqueNumber
FROM FROM
pcloud_robot r pcloud_robot r
...@@ -162,7 +178,7 @@ ...@@ -162,7 +178,7 @@
</select> </select>
<select id="getPcloudKeywordRobotIds" resultType="string"> <select id="getPcloudKeywordRobotIds" resultType="string">
select wx_id from pcloud_robot where state = 1 select wx_id from pcloud_robot where state = 1 and real_status = 1
</select> </select>
<select id="getByRobotWxId" parameterType="string" resultMap="BaseResultMap"> <select id="getByRobotWxId" parameterType="string" resultMap="BaseResultMap">
...@@ -182,6 +198,7 @@ ...@@ -182,6 +198,7 @@
from pcloud_robot from pcloud_robot
where robot_type = #{robotType} where robot_type = #{robotType}
and state = 1 and state = 1
and real_status = 1
limit 1 limit 1
</select> </select>
...@@ -222,6 +239,8 @@ ...@@ -222,6 +239,8 @@
p.nick_name nickName, p.nick_name nickName,
p.robot_type classifyId, p.robot_type classifyId,
p.unique_number uniqueNumber, p.unique_number uniqueNumber,
p.state state,
p.real_status realStatus,
pr.classify_name classifyName pr.classify_name classifyName
from from
pcloud_robot p pcloud_robot p
...@@ -248,6 +267,7 @@ ...@@ -248,6 +267,7 @@
#{item} #{item}
</foreach> </foreach>
and state = 1 and state = 1
and real_status = 1
</select> </select>
<select id="getRobotCountByClassifyId" parameterType="long" resultType="int"> <select id="getRobotCountByClassifyId" parameterType="long" resultType="int">
......
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