Commit f61b6db3 by 裴大威

Merge branch 'feat-1002426' into 'master'

1002426定制化服务进度

See merge request rays/pcloud-book!461
parents 681afce7 d494acde
package com.pcloud.book.personalstage.biz;
import com.pcloud.book.personalstage.dto.PersonalStageDTO;
import com.pcloud.book.personalstage.dto.PersonalStageProgressDTO;
import com.pcloud.book.personalstage.entity.PersonalStage;
import com.pcloud.common.core.mq.DelayQueueDTO;
......@@ -48,9 +49,11 @@ public interface PersonalStageBiz {
void nextStageAddStageUserAndWakeupDelay(String robotId, String userWxId, String ip, Long personalStageId);
void sendNotKeywordReply(String robotId, String userWxId, String ip, Long personalStageId);
void sendNotKeywordReply(String robotId, String userWxId, String ip, Long personalStageId, Long personalStageUserId);
void sendNotKeywordFusingReply(String robotId, String userWxId, String ip, Long personalStageId);
void dealDelayFusingFinish(DelayQueueDTO dto);
PersonalStageProgressDTO getPersonalProgress(String wxUserId, Long personalStageUserId);
}
package com.pcloud.book.personalstage.biz.impl;
import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr;
import com.pcloud.book.keywords.enums.ReplyTypeEnum;
import com.pcloud.book.mq.delay.DelayMessageSender;
import com.pcloud.book.pcloudkeyword.dao.PcloudRobotClassifyDao;
......@@ -14,6 +15,7 @@ import com.pcloud.book.personalstage.constant.PersonalStageConstant;
import com.pcloud.book.personalstage.dao.PersonalStageDao;
import com.pcloud.book.personalstage.dao.PersonalStageJumpDao;
import com.pcloud.book.personalstage.dao.PersonalStageJumpKeywordDao;
import com.pcloud.book.personalstage.dao.PersonalStageProgressMessageDao;
import com.pcloud.book.personalstage.dao.PersonalStageReplyDao;
import com.pcloud.book.personalstage.dao.PersonalStageReplyItemDao;
import com.pcloud.book.personalstage.dao.PersonalStageUserDao;
......@@ -21,8 +23,10 @@ import com.pcloud.book.personalstage.dao.PersonalStageWakeupDao;
import com.pcloud.book.personalstage.dto.FusingFinishDelayDTO;
import com.pcloud.book.personalstage.dto.PersonalStageDTO;
import com.pcloud.book.personalstage.dto.PersonalStageJumpKeywordDto;
import com.pcloud.book.personalstage.dto.PersonalStageProgressDTO;
import com.pcloud.book.personalstage.dto.WakeupDelayDTO;
import com.pcloud.book.personalstage.entity.PersonalStage;
import com.pcloud.book.personalstage.entity.PersonalStageProgressMessage;
import com.pcloud.book.personalstage.entity.PersonalStageReply;
import com.pcloud.book.personalstage.entity.PersonalStageReplyItem;
import com.pcloud.book.personalstage.entity.PersonalStageUser;
......@@ -33,9 +37,12 @@ import com.pcloud.book.personalstage.enums.StageReplyRelevEnum;
import com.pcloud.book.personalstage.utils.CacheUtils;
import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.core.mq.DelayQueueDTO;
import com.pcloud.common.utils.DateUtils;
import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.cache.redis.JedisClusterUtils;
import com.pcloud.common.utils.httpclient.UrlUtils;
import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.wechatgroup.group.dto.GroupUserDTO;
import com.sdk.wxgroup.SendMessageTypeEnum;
import com.sdk.wxgroup.SendPicMessageVO;
import com.sdk.wxgroup.SendTextMessageVO;
......@@ -46,11 +53,13 @@ import org.springframework.beans.factory.annotation.Autowired;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.page.PageBean;
import com.pcloud.common.page.PageParam;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.HashMap;
......@@ -87,6 +96,18 @@ public class PersonalStageBizImpl implements PersonalStageBiz {
private PersonalStageJumpKeywordDao personalStageJumpKeywordDao;
@Autowired
private PersonalStageJumpBiz personalStageJumpBiz;
@Autowired
private WechatGroupConsr wechatGroupConsr;
@Autowired
private PersonalStageProgressMessageDao personalStageProgressMessageDao;
@Value("${wechat.group.link.prefix}")
private String wechatLinkPrefix;
private final static String PERSONAL_STAGE_PROJECT_PROGRESS_TEMPLATE = "${PROGRESS_URL}";
// 项目进度路由
private final static String PERSONAL_STAGE_PROJECT_PROGRESS = "/personalCenter/projectProgress";
@Transactional(rollbackFor = Exception.class)
......@@ -290,7 +311,7 @@ public class PersonalStageBizImpl implements PersonalStageBiz {
last.setNotKeywordSendCount(notKeywordSendCount+1);
last.setState(PersonalStageUserStateEnum.NORMAL.value);
personalStageUserDao.update(last);
sendNotKeywordReply(robotId,userWxId,ip,personalStage.getId());
sendNotKeywordReply(robotId,userWxId,ip,personalStage.getId(), last.getId());
}
}
}
......@@ -299,7 +320,7 @@ public class PersonalStageBizImpl implements PersonalStageBiz {
if (!iskeyword&&!hasRecord){
//走正常非关键词回复并且新增记录
LOGGER.info("走正常非关键词回复并且新增记录");
sendNotKeywordReply(robotId,userWxId,ip,personalStage.getId());
sendNotKeywordReply(robotId,userWxId,ip,personalStage.getId(), last.getId());
PcloudRobot pcloudRobot = pcloudRobotDao.getByWxId(robotId);
Long robotClassifyId=pcloudRobot.getRobotType().longValue();
PersonalStage firstStage = personalStageDao.getFirstStage(robotClassifyId);
......@@ -479,7 +500,7 @@ public class PersonalStageBizImpl implements PersonalStageBiz {
@ParamLog("非关键词回复")
@Override
public void sendNotKeywordReply(String robotId, String userWxId, String ip, Long personalStageId) {
public void sendNotKeywordReply(String robotId, String userWxId, String ip, Long personalStageId, Long personalStageUserId) {
List<Long> ids = personalStageReplyDao.getIdsByRelevance(StageReplyRelevEnum.STAGE_NOT_KEYWORD.value, personalStageId);
if (ListUtils.isEmpty(ids)){
return;
......@@ -490,9 +511,34 @@ public class PersonalStageBizImpl implements PersonalStageBiz {
if (ListUtils.isEmpty(items)){
return;
}
// 替换进度链接
replaceProjectProgressUrl(items,robotId,userWxId,personalStageUserId);
sendReplyItems(items,robotId,userWxId,ip);
}
@ParamLog("尝试插入单号")
private void tryInsertNumber(Long personalStageUserId) {
String requireNumber = DateUtils.formatDate(new Date(), "yyyyMMddHHmmss").concat(String.valueOf((int)((Math.random()*9+1)*100000)));
personalStageUserDao.updateRequireNumber(personalStageUserId, requireNumber);
}
@ParamLog("替换进度链接")
private void replaceProjectProgressUrl(List<PersonalStageReplyItem> items, String robotId, String userWxId, Long personalStageUserId) {
boolean insertNumber = false;
for (PersonalStageReplyItem item : items){
if(ReplyTypeEnum.TEXT.value.equals(item.getReplyType())){
if(!insertNumber && item.getContent().indexOf(PERSONAL_STAGE_PROJECT_PROGRESS_TEMPLATE) > -1){
insertNumber = true;
}
String longUrl = wechatLinkPrefix.concat(PERSONAL_STAGE_PROJECT_PROGRESS).concat("?wxUserId=" + userWxId + "&robotId=" + robotId + "&personalStageUserId=" + personalStageUserId);
item.setContent(item.getContent().replace(PERSONAL_STAGE_PROJECT_PROGRESS_TEMPLATE, UrlUtils.getShortUrl4Own(longUrl)));
}
}
if(insertNumber){
tryInsertNumber(personalStageUserId);
}
}
@ParamLog("非关键词熔断回复")
@Override
public void sendNotKeywordFusingReply(String robotId, String userWxId, String ip, Long personalStageId) {
......@@ -587,4 +633,32 @@ public class PersonalStageBizImpl implements PersonalStageBiz {
//刪除发送非关键词次数緩存
JedisClusterUtils.del(PersonalStageConstant.USER_SEND_KEYWORD_COUNT_LOCK + personalStageId + "_" + wxId);
}
@Override
public PersonalStageProgressDTO getPersonalProgress(String wxUserId, Long personalStageUserId) {
PersonalStageProgressDTO personalStageProgressDTO = new PersonalStageProgressDTO();
PersonalStageUser personalStageUser = personalStageUserDao.getById(personalStageUserId);
if(personalStageUser == null){
return personalStageProgressDTO;
}
Date startTime = personalStageUser.getCreateTime();
GroupUserDTO groupUserDTO = wechatGroupConsr.getWxUserInfoByWxUserId(wxUserId);
personalStageProgressDTO.setWxUserId(wxUserId);
personalStageProgressDTO.setHeadPic(groupUserDTO.getHeadPic());
personalStageProgressDTO.setNickName(groupUserDTO.getNickName());
personalStageProgressDTO.setSex(groupUserDTO.getSex());
personalStageProgressDTO.setRequireNumber(personalStageUser.getRequireNumber());
List<PersonalStageProgressMessage> personalStageProgressMessages = personalStageProgressMessageDao.getPersonalProgress(startTime);
if (!ListUtils.isEmpty(personalStageProgressMessages)){
setProgressTime(personalStageProgressMessages,startTime);
personalStageProgressDTO.setPersonalStageProgressMessageList(personalStageProgressMessages);
}
return personalStageProgressDTO;
}
private void setProgressTime(List<PersonalStageProgressMessage> personalStageProgressMessages, Date startTime) {
personalStageProgressMessages.stream().forEach(e ->{
e.setProgressTime(DateUtils.addMinute(startTime,e.getMinutes()));
});
}
}
package com.pcloud.book.personalstage.dao;
import com.pcloud.book.personalstage.entity.PersonalStageProgressMessage;
import com.pcloud.common.core.dao.BaseDao;
import java.util.Date;
import java.util.List;
/**
* (PersonalStageProgressMessage)表数据库访问层
*
* @author zyq
* @since 2020-02-24 15:57:48
*/
public interface PersonalStageProgressMessageDao extends BaseDao<PersonalStageProgressMessage> {
List<PersonalStageProgressMessage> getPersonalProgress(Date startTime);
}
\ No newline at end of file
......@@ -8,4 +8,6 @@ public interface PersonalStageUserDao extends BaseDao<PersonalStageUser> {
PersonalStageUser getLast(String wxId, String robotId, Long personalStageId);
Integer getNotKeywordSendCount(String wxId, String robotId, Long personalStageId);
void updateRequireNumber(Long personalStageUserId, String requireNumber);
}
\ No newline at end of file
package com.pcloud.book.personalstage.dao.impl;
import com.pcloud.book.personalstage.entity.PersonalStageProgressMessage;
import com.pcloud.book.personalstage.dao.PersonalStageProgressMessageDao;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
/**
* (PersonalStageProgressMessage)表数据库访问层
*
* @author zyq
* @since 2020-02-24 15:57:48
*/
@Repository("personalStageProgressMessageDaoImpl")
public class PersonalStageProgressMessageDaoImpl extends BaseDaoImpl<PersonalStageProgressMessage> implements PersonalStageProgressMessageDao {
@Override
public List<PersonalStageProgressMessage> getPersonalProgress(Date startTime) {
return getSessionTemplate().selectList(getStatement("getPersonalProgress"),startTime);
}
}
\ No newline at end of file
......@@ -28,4 +28,12 @@ public class PersonalStageUserDaoImpl extends BaseDaoImpl<PersonalStageUser> imp
map.put("personalStageId", personalStageId);
return super.getSessionTemplate().selectOne(getStatement("getNotKeywordSendCount"), map);
}
@Override
public void updateRequireNumber(Long personalStageUserId, String requireNumber) {
Map<String, Object> map = new HashMap<>();
map.put("personalStageUserId", personalStageUserId);
map.put("requireNumber", requireNumber);
super.getSessionTemplate().update(getStatement("updateRequireNumber"), map);
}
}
package com.pcloud.book.personalstage.dto;
import com.pcloud.book.personalstage.entity.PersonalStageProgressMessage;
import java.util.List;
import lombok.Data;
@Data
public class PersonalStageProgressDTO {
/**
* 微信用户ID
*/
private String wxUserId;
/**
* 昵称
*/
private String nickName;
/**
* 头像
*/
private String headPic;
/**
* 性别
*/
private Integer sex;
/**
* 小号id
*/
private String robotId;
//需求单号
private String requireNumber;
private List<PersonalStageProgressMessage> personalStageProgressMessageList;
}
package com.pcloud.book.personalstage.entity;
import java.util.Date;
import java.math.BigDecimal;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.pcloud.common.entity.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* (PersonalStageProgressMessage)实体类
*
* @author zyq
* @since 2020-02-24 15:57:48
*/
@Data
public class PersonalStageProgressMessage extends BaseEntity {
private static final long serialVersionUID = 783203450632034209L;
private String content;
private Integer minutes;
@JsonFormat(
pattern = "yyyy-MM-dd HH:mm:ss",
timezone = "GMT+8"
)
private Date progressTime;
}
\ No newline at end of file
......@@ -30,4 +30,7 @@ public class PersonalStageUser extends BaseEntity {
@ApiModelProperty("用户非关键词发送次数")
private Integer notKeywordSendCount;
@ApiModelProperty("需求单号")
private String requireNumber;
}
\ No newline at end of file
package com.pcloud.book.personalstage.facade;
import com.pcloud.book.personalstage.biz.PersonalStageBiz;
import com.pcloud.book.personalstage.dto.PersonalStageProgressDTO;
import com.pcloud.book.personalstage.entity.PersonalStage;
import com.pcloud.book.personalstage.entity.PersonalStageProgressMessage;
import com.pcloud.book.personalstage.enums.JumpTypeEnum;
import com.pcloud.book.personalstage.vo.request.CreateStageJumpRequestVO;
import com.pcloud.book.personalstage.vo.request.UpdateStageJumpRequestVO;
......@@ -185,4 +187,11 @@ public class PersonalStageFacade {
return new ResponseDto<>();
}
@ApiOperation("获取进度")
@GetMapping("getPersonalProgress")
public ResponseDto<?> getPersonalProgress(@RequestParam("wxUserId") String wxUserId,@RequestParam("personalStageUserId") Long personalStageUserId) throws PermissionException, BizException{
PersonalStageProgressDTO personalStageProgressDTO = personalStageBiz.getPersonalProgress(wxUserId, personalStageUserId);
return new ResponseDto<>(personalStageProgressDTO);
}
}
<?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.personalstage.dao.impl.PersonalStageProgressMessageDaoImpl">
<resultMap id="BaseResultMap" type="com.pcloud.book.personalstage.entity.PersonalStageProgressMessage">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="content" property="content" jdbcType="VARCHAR"/>
<result column="minutes" property="minutes" 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, content, minutes, create_time, update_time
</sql>
<select id="getById" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM personal_stage_progress_message
WHERE id = #{id}
</select>
<select id="getList" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM personal_stage_progress_message
</select>
<insert id="insert" keyProperty="id" useGeneratedKeys="true">
INSERT INTO personal_stage_progress_message(
content,
minutes,
create_time,
update_time
) VALUES (
#{content, jdbcType=VARCHAR},
#{minutes, jdbcType=INTEGER},
#{createTime, jdbcType=TIMESTAMP},
#{updateTime, jdbcType=TIMESTAMP}
)
</insert>
<insert id="batchInsert" keyProperty="id" useGeneratedKeys="true">
INSERT INTO personal_stage_progress_message (
content,
minutes,
create_time,
update_time
) VALUES
<foreach collection="list" item="item" separator=",">
(
#{content, jdbcType=VARCHAR},
#{minutes, jdbcType=INTEGER},
#{createTime, jdbcType=TIMESTAMP},
#{updateTime, jdbcType=TIMESTAMP}
)
</foreach>
</insert>
<!--通过主键修改数据-->
<update id="update">
UPDATE personal_stage_progress_message
<set>
<if test="content != null and content != ''">
content = #{content},
</if>
<if test="minutes != null">
minutes = #{minutes},
</if>
<if test="createTime != null">
create_time = #{createTime},
</if>
<if test="updateTime != null">
update_time = #{updateTime},
</if>
</set>
WHERE id = #{id}
</update>
<!--通过主键删除-->
<delete id="deleteById">
DELETE FROM personal_stage_progress_message where id = #{id}
</delete>
<select id="getPersonalProgress" parameterType="date" resultType="com.pcloud.book.personalstage.entity.PersonalStageProgressMessage">
select
id,
content,
minutes
from
personal_stage_progress_message
where
TIMESTAMPDIFF(MINUTE,#{startTime}, now()) &gt;= minutes
order by id asc
</select>
</mapper>
\ No newline at end of file
......@@ -12,10 +12,11 @@
<result property="notKeywordSendCount" column="not_keyword_send_count" jdbcType="INTEGER"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
<result property="requireNumber" column="require_number" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id, personal_stage_id, wx_id, robot_id, robot_classify_id, state, not_keyword_send_count, create_time,update_time
id, personal_stage_id, wx_id, robot_id, robot_classify_id, state, not_keyword_send_count, create_time,update_time,require_number
</sql>
<select id="getById" resultMap="BaseResultMap" parameterType="java.lang.Long">
......@@ -80,6 +81,12 @@
where id = #{id,jdbcType=BIGINT}
</update>
<update id="updateRequireNumber" parameterType="map">
UPDATE personal_stage_user
SET require_number = #{requireNumber}
WHERE id = #{personalStageUserId} AND (require_number is null OR require_number='')
</update>
<select id="getLast" parameterType="map" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/>
from personal_stage_user
......
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