新增修改标签日志
This commit is contained in:
@@ -29,9 +29,9 @@ public class CommonConstants {
|
||||
public static final int AN_HOUR_SECONDS = 3600;
|
||||
|
||||
/**
|
||||
* 企业开通锁存活时间
|
||||
* 跟进任务通知缓存时间 1小时
|
||||
*/
|
||||
public static final int ENTERPRISE_OPEN_LOCK_TIMES = 4 * 60 * 60 * 1000;
|
||||
public static final int FOLLOW_TASK_NOTICE_LOCK_TIMES = 60 * 60 * 1000;
|
||||
|
||||
public static final int ONE_DAY_SECONDS = 24 * 60 * 60;
|
||||
|
||||
@@ -103,6 +103,7 @@ public class CommonConstants {
|
||||
public static final int EIGHTY = 80;
|
||||
public static final int NINETY = 90;
|
||||
public static final int HUNDRED = 100;
|
||||
public static final int FIVE_HUNDRED = 100;
|
||||
public static final int ONE_THOUSAND = 1000;
|
||||
|
||||
|
||||
@@ -133,4 +134,6 @@ public class CommonConstants {
|
||||
|
||||
public static final String DAY_START_TIME_SUFFIX = " 00:00:00";
|
||||
|
||||
public static final String FOLLOW_TASK_NOTICE_KEY = "follow_task_notice:{0}:{1}";
|
||||
|
||||
}
|
||||
|
||||
@@ -47,7 +47,9 @@ public enum OperateLogFieldValueEnum {
|
||||
BEFORE_CLERK_INFO_UPDATE("beforeClerkUpdate", "修改前的意向书员工信息"),
|
||||
AFTER_CLERK_INFO_UPDATE("afterClerkUpdate", "修改后的意向书员工信息"),
|
||||
FOLLOW_LOG("followLog", "跟进日志"),
|
||||
FOLLOW_TASK_ID("followTaskId", "跟进任务id")
|
||||
FOLLOW_TASK_ID("followTaskId", "跟进任务id"),
|
||||
ADD_LABELS("addLabels", "新增标签"),
|
||||
REMOVE_LABELS("removeLabels", "移除标签")
|
||||
;
|
||||
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ public enum OperateTypeEnum {
|
||||
USERINFO_UPDATE("userinfo_update", "修改(修改意向信息)", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME, BEFORE_USERINFO_UPDATE, AFTER_USERINFO_UPDATE)),
|
||||
INTENT_INFO_SUBMIT("intent_info_submit", "提交意向申请书", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME, AFTER_BASE_INFO_UPDATE, AFTER_INTENT_INFO_UPDATE, AFTER_CLERK_INFO_UPDATE)),
|
||||
INTENT_INFO_UPDATE("intent_info_update", "修改意向申请书", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME, BEFORE_BASE_INFO_UPDATE, AFTER_BASE_INFO_UPDATE, BEFORE_INTENT_INFO_UPDATE, AFTER_INTENT_INFO_UPDATE, BEFORE_CLERK_INFO_UPDATE, AFTER_CLERK_INFO_UPDATE)),
|
||||
ADD_TAGS("add_tags", "修改意向申请书", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME)),
|
||||
ADD_TAGS("add_tags", "修改意向申请书", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME, ADD_LABELS, REMOVE_LABELS)),
|
||||
ADD_FOLLOW_LOG("add_follow_log", "新增根据日志", Arrays.asList(FOLLOW_LOG)),
|
||||
ADD_FOLLOW_TASK("add_follow_task", "新增跟进任务", Arrays.asList(FOLLOW_TASK_ID))
|
||||
;
|
||||
|
||||
@@ -1,15 +1,21 @@
|
||||
package com.cool.store.dao;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import com.cool.store.constants.CommonConstants;
|
||||
import com.cool.store.dto.follow.FollowTaskNumDTO;
|
||||
import com.cool.store.entity.HyFollowTaskDO;
|
||||
import com.cool.store.enums.FollowTaskStatusEnum;
|
||||
import com.cool.store.mapper.HyFollowTaskMapper;
|
||||
import com.cool.store.utils.CoolDateUtils;
|
||||
import com.github.pagehelper.Page;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.google.common.collect.Lists;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
@@ -140,4 +146,53 @@ public class HyFollowTaskDAO {
|
||||
hyFollowTaskMapper.cancelUndoFollowTask(partnerLineId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取消息通知的跟进人
|
||||
* @param date
|
||||
* @param pageNum
|
||||
* @param pageSize
|
||||
* @return
|
||||
*/
|
||||
public Page<String> getRemindFollowUserIds(Date date, Integer pageNum, Integer pageSize){
|
||||
String startTime = DateUtil.format(date, CoolDateUtils.DATE_FORMAT_DAY) + CommonConstants.DAY_START_TIME_SUFFIX;
|
||||
String endTime = DateUtil.format(date, CoolDateUtils.DATE_FORMAT_DAY) + CommonConstants.DAY_END_TIME_SUFFIX;
|
||||
PageHelper.startPage(pageNum, pageSize);
|
||||
return hyFollowTaskMapper.getRemindFollowUserIds(startTime, endTime);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户任务数量
|
||||
* @param followUserIds
|
||||
* @return
|
||||
*/
|
||||
public List<FollowTaskNumDTO> getUserTaskNum(List<String> followUserIds){
|
||||
if(CollectionUtils.isEmpty(followUserIds)){
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
return hyFollowTaskMapper.getUserTaskNum(followUserIds);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取待完成任务
|
||||
* @param startTime
|
||||
* @param endTime
|
||||
* @param pageNum
|
||||
* @param pageSize
|
||||
* @return
|
||||
*/
|
||||
public Page<HyFollowTaskDO> getUndoTaskPage(String startTime, String endTime, Integer pageNum, Integer pageSize){
|
||||
PageHelper.startPage(pageNum, pageSize);
|
||||
return hyFollowTaskMapper.getUndoTaskPage(startTime, endTime);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新未完成任务的状态到已逾期
|
||||
* @return
|
||||
*/
|
||||
public Integer updateUndoTaskStatusToOverdue(){
|
||||
return hyFollowTaskMapper.updateUndoTaskStatusToOverdue();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.cool.store.mapper;
|
||||
|
||||
import com.cool.store.dto.follow.FollowTaskNumDTO;
|
||||
import com.cool.store.entity.HyFollowTaskDO;
|
||||
import com.github.pagehelper.Page;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
@@ -63,4 +64,33 @@ public interface HyFollowTaskMapper {
|
||||
* @return
|
||||
*/
|
||||
Integer cancelUndoFollowTask(@Param("partnerLineId") Long partnerLineId);
|
||||
|
||||
/**
|
||||
* 获取发送通知的跟进人
|
||||
* @param startTime
|
||||
* @param endTime
|
||||
* @return
|
||||
*/
|
||||
Page<String> getRemindFollowUserIds(@Param("startTime")String startTime, @Param("endTime")String endTime);
|
||||
|
||||
/**
|
||||
* 获取用户任务数量
|
||||
* @param followUserIds
|
||||
* @return
|
||||
*/
|
||||
List<FollowTaskNumDTO> getUserTaskNum(@Param("followUserIds") List<String> followUserIds);
|
||||
|
||||
/**
|
||||
* 获取待完成任务
|
||||
* @param startTime
|
||||
* @param endTime
|
||||
* @return
|
||||
*/
|
||||
Page<HyFollowTaskDO> getUndoTaskPage(@Param("startTime") String startTime, @Param("endTime") String endTime);
|
||||
|
||||
/**
|
||||
* 更新未完成任务的状态
|
||||
* @return
|
||||
*/
|
||||
Integer updateUndoTaskStatusToOverdue();
|
||||
}
|
||||
@@ -165,4 +165,39 @@
|
||||
<update id="cancelUndoFollowTask">
|
||||
update hy_follow_task set task_status = '3' where partner_line_id = #{partnerLineId} and task_status in ('0', '2')
|
||||
</update>
|
||||
|
||||
<select id="getRemindFollowUserIds" resultType="string">
|
||||
select
|
||||
follow_user_id
|
||||
from
|
||||
hy_follow_task
|
||||
where
|
||||
deleted = '0' and (task_status in ('2') or (task_status in ('0') and deadline >= #{startTime} and #{endTime} >= deadline))
|
||||
</select>
|
||||
|
||||
<select id="getUserTaskNum" resultType="com.cool.store.dto.follow.FollowTaskNumDTO">
|
||||
select
|
||||
follow_user_id,
|
||||
sum(if(task_status=2 or (task_status in ('0') and now() >= deadline, 1,0))) as overdueNum,
|
||||
sum(if(task_status=0, 1, 0)) as todoNum
|
||||
from
|
||||
hy_follow_task
|
||||
where
|
||||
follow_user_id in <foreach collection="followUserIds" item="followUserId" separator="," open="(" close=")">#{followUserId}</foreach>
|
||||
group by follow_user_id
|
||||
</select>
|
||||
|
||||
<select id="getUndoTaskPage" resultMap="BaseResultMap">
|
||||
select
|
||||
<include refid="Base_Column_List"/>
|
||||
from
|
||||
hy_follow_task
|
||||
where
|
||||
deleted = '0' and task_status in ('0') and deadline >= #{startTime} and #{endTime} >= deadline
|
||||
</select>
|
||||
|
||||
<update id="updateUndoTaskStatusToOverdue">
|
||||
<![CDATA[ update hy_follow_task set task_status = '2' where task_status = '0' and deadline < now() ]]]>
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.cool.store.dto.follow;
|
||||
|
||||
import com.cool.store.constants.MessageConstants;
|
||||
import com.cool.store.utils.StringUtil;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
|
||||
/**
|
||||
* @author zhangchenbiao
|
||||
* @FileName: FollowTaskNumDTO
|
||||
* @Description:
|
||||
* @date 2023-08-14 16:01
|
||||
*/
|
||||
@Data
|
||||
public class FollowTaskNumDTO {
|
||||
|
||||
@ApiModelProperty("任务跟进人id")
|
||||
private String followUserId;
|
||||
|
||||
@ApiModelProperty("未完成数量")
|
||||
private Integer todoNum;
|
||||
|
||||
@ApiModelProperty("逾期数量")
|
||||
private Integer overdueNum;
|
||||
|
||||
public static String getMessageContent(FollowTaskNumDTO followTask){
|
||||
if(followTask.getTodoNum() > 0 && followTask.getOverdueNum() > 0){
|
||||
return MessageFormat.format(MessageConstants.FOLLOW_TASK_MESSAGE_CONTENT_1, followTask.getTodoNum(), followTask.getOverdueNum());
|
||||
}
|
||||
if(followTask.getTodoNum() == 0 && followTask.getOverdueNum() > 0){
|
||||
return MessageFormat.format(MessageConstants.FOLLOW_TASK_MESSAGE_CONTENT_2, followTask.getOverdueNum());
|
||||
}
|
||||
if(followTask.getTodoNum() > 0 && followTask.getOverdueNum() == 0){
|
||||
return MessageFormat.format(MessageConstants.FOLLOW_TASK_MESSAGE_CONTENT_3, followTask.getTodoNum());
|
||||
}
|
||||
return StringUtil.EMPTY;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -3,6 +3,8 @@ package com.cool.store.dto.log;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author suzhuhong
|
||||
* @Date 2023/7/4 10:05
|
||||
@@ -19,4 +21,8 @@ public class AddTagsDTO {
|
||||
private String operateUserId;
|
||||
|
||||
private String mobile;
|
||||
|
||||
private List<String> addLabels;
|
||||
|
||||
private List<String> removeLabels;
|
||||
}
|
||||
|
||||
@@ -17,6 +17,9 @@ import java.util.*;
|
||||
@Data
|
||||
public class FollowTaskPageVO {
|
||||
|
||||
@ApiModelProperty("任务id")
|
||||
private Long followTaskId;
|
||||
|
||||
@ApiModelProperty("线索id")
|
||||
private Long partnerLineId;
|
||||
|
||||
@@ -35,6 +38,9 @@ public class FollowTaskPageVO {
|
||||
@ApiModelProperty("跟进阶段")
|
||||
private String workflowStage;
|
||||
|
||||
@ApiModelProperty("线索用户id")
|
||||
private String partnerId;
|
||||
|
||||
@ApiModelProperty("线索用户名")
|
||||
private String partnerUsername;
|
||||
|
||||
@@ -51,12 +57,14 @@ public class FollowTaskPageVO {
|
||||
continue;
|
||||
}
|
||||
FollowTaskPageVO result = new FollowTaskPageVO();
|
||||
result.setFollowTaskId(task.getId());
|
||||
result.setPartnerLineId(task.getPartnerLineId());
|
||||
result.setTaskTitle(task.getTaskTitle());
|
||||
result.setCommunicationType(task.getCommunicationType());
|
||||
result.setDeadline(task.getDeadline());
|
||||
result.setTaskStatus(task.getTaskStatus());
|
||||
result.setWorkflowStage(partnerInfo.getWorkflowStage());
|
||||
result.setPartnerId(partnerInfo.getPartnerId());
|
||||
result.setPartnerUsername(partnerInfo.getUsername());
|
||||
result.setPartnerMobile(partnerInfo.getMobile());
|
||||
resultList.add(result);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.cool.store.job;
|
||||
|
||||
import com.cool.store.service.EnterpriseSyncService;
|
||||
import com.cool.store.service.FollowTaskService;
|
||||
import com.cool.store.service.HyPartnerInterviewPlanService;
|
||||
import com.xxl.job.core.context.XxlJobHelper;
|
||||
import com.xxl.job.core.handler.annotation.XxlJob;
|
||||
@@ -26,6 +27,9 @@ public class JobHandler {
|
||||
@Autowired
|
||||
private HyPartnerInterviewPlanService hyPartnerInterviewPlanService;
|
||||
|
||||
@Resource
|
||||
private FollowTaskService followTaskService;
|
||||
|
||||
@XxlJob("syncOrganization")
|
||||
public void syncOrganization(){
|
||||
log.info("组织架构定时同步开始");
|
||||
@@ -76,4 +80,30 @@ public class JobHandler {
|
||||
}
|
||||
}
|
||||
|
||||
@XxlJob("followTaskAnHourAgoRemind")
|
||||
public void followTaskAnHourAgoRemind(){
|
||||
try {
|
||||
log.info("跟进任务前一小时提醒开始");
|
||||
followTaskService.followTaskAnHourAgoRemind();
|
||||
log.info("跟进任务前一小时提醒结束");
|
||||
XxlJobHelper.handleSuccess();
|
||||
}catch (Exception e){
|
||||
log.error("跟进任务前一小时提醒异常",e);
|
||||
XxlJobHelper.log("跟进任务前一小时提醒异常"+e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@XxlJob("followTaskRemind")
|
||||
public void followTaskRemind(){
|
||||
try {
|
||||
log.info("跟进任务提醒开始");
|
||||
followTaskService.followTaskRemind();
|
||||
log.info("跟进任务提醒结束");
|
||||
XxlJobHelper.handleSuccess();
|
||||
}catch (Exception e){
|
||||
log.error("跟进任务提醒异常",e);
|
||||
XxlJobHelper.log("跟进任务提醒异常"+e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -75,4 +75,16 @@ public interface FollowTaskService {
|
||||
* @return
|
||||
*/
|
||||
Integer cancelFollowTask(FollowTaskIdRequest request, String userId);
|
||||
|
||||
/**
|
||||
* 跟进任务前一小时提醒
|
||||
* @return
|
||||
*/
|
||||
void followTaskAnHourAgoRemind();
|
||||
|
||||
/**
|
||||
* 跟进任务每日10点提醒
|
||||
* @return
|
||||
*/
|
||||
void followTaskRemind();
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import com.cool.store.dao.EnterpriseUserDAO;
|
||||
import com.cool.store.dao.HyFollowTaskDAO;
|
||||
import com.cool.store.dao.HyPartnerLineInfoDAO;
|
||||
import com.cool.store.dao.HyPartnerTaskInfoLogDAO;
|
||||
import com.cool.store.dto.follow.FollowTaskNumDTO;
|
||||
import com.cool.store.dto.log.LineLogInfo;
|
||||
import com.cool.store.dto.message.SendCardMessageDTO;
|
||||
import com.cool.store.dto.partner.PartnerSimpleInfoDTO;
|
||||
@@ -23,6 +24,7 @@ import com.cool.store.request.follow.FollowTaskIdRequest;
|
||||
import com.cool.store.request.follow.UpdateFollowTaskRequest;
|
||||
import com.cool.store.service.FollowTaskService;
|
||||
import com.cool.store.utils.CoolDateUtils;
|
||||
import com.cool.store.utils.RedisUtilPool;
|
||||
import com.cool.store.vo.follow.FollowTaskLogVO;
|
||||
import com.cool.store.vo.follow.FollowTaskPageVO;
|
||||
import com.github.pagehelper.Page;
|
||||
@@ -36,10 +38,7 @@ import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@@ -61,6 +60,8 @@ public class FollowTaskServiceImpl implements FollowTaskService {
|
||||
@Resource
|
||||
private EnterpriseUserDAO enterpriseUserDAO;
|
||||
@Resource
|
||||
private RedisUtilPool redisUtilPool;
|
||||
@Resource
|
||||
private ISVHttpRequest isvHttpRequest;
|
||||
@Value("${feishu.notice.link.url:null}")
|
||||
private String linkUrl;
|
||||
@@ -161,6 +162,85 @@ public class FollowTaskServiceImpl implements FollowTaskService {
|
||||
return hyFollowTaskDAO.cancelFollowTask(request.getFollowTaskId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void followTaskAnHourAgoRemind() {
|
||||
//获取一个小时后的任务
|
||||
Boolean hasNext = true;
|
||||
int pageNum = CommonConstants.ONE, pageSize = CommonConstants.HUNDRED;
|
||||
String startTime = DateUtil.format(DateUtils.addMinutes(new Date(), -CommonConstants.FIVE), CoolDateUtils.DATE_FORMAT_SEC);
|
||||
String endTime = DateUtil.format(DateUtils.addMinutes(new Date(), CommonConstants.FIVE), CoolDateUtils.DATE_FORMAT_SEC);
|
||||
while (hasNext){
|
||||
Page<HyFollowTaskDO> undoTaskList = hyFollowTaskDAO.getUndoTaskPage(startTime, endTime, pageNum, pageSize);
|
||||
if(CollectionUtils.isEmpty(undoTaskList)){
|
||||
break;
|
||||
}
|
||||
if(undoTaskList.size() < pageSize){
|
||||
hasNext = false;
|
||||
}
|
||||
pageNum++;
|
||||
List<Long> lineIds = undoTaskList.stream().map(HyFollowTaskDO::getPartnerLineId).distinct().collect(Collectors.toList());
|
||||
Map<Long, PartnerSimpleInfoDTO> partnerSimpleInfoMap = hyPartnerLineInfoDAO.getPartnerSimpleInfoByLineIds(lineIds);
|
||||
for (HyFollowTaskDO followTask : undoTaskList) {
|
||||
PartnerSimpleInfoDTO partnerInfo = partnerSimpleInfoMap.get(followTask.getPartnerLineId());
|
||||
if(Objects.isNull(partnerInfo)){
|
||||
continue;
|
||||
}
|
||||
String lockKey = MessageFormat.format(CommonConstants.FOLLOW_TASK_NOTICE_KEY, followTask.getFollowUserId(), followTask.getId());
|
||||
boolean result = redisUtilPool.setNxExpire(lockKey, DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC), CommonConstants.FOLLOW_TASK_NOTICE_LOCK_TIMES);
|
||||
if(!result){
|
||||
//一小时内发送过不再发送通知
|
||||
continue;
|
||||
}
|
||||
SendCardMessageDTO sendCardMessage = new SendCardMessageDTO();
|
||||
sendCardMessage.setMessageUrl(linkUrl);
|
||||
sendCardMessage.setMessageType(MessageTypeEnum.SCHEDULE_REMINDER);
|
||||
String dateline = DateUtil.format(followTask.getDeadline(), CoolDateUtils.DATE_FORMAT_SEC_2);
|
||||
String content = MessageFormat.format(MessageConstants.FOLLOW_TASK_MESSAGE_CONTENT, dateline, partnerInfo.getUsername(), partnerInfo.getMobile());
|
||||
sendCardMessage.setContent(content);
|
||||
sendCardMessage.setTitle(MessageConstants.FOLLOW_TASK_MESSAGE_TITLE);
|
||||
sendCardMessage.setUserIds(Arrays.asList(followTask.getFollowUserId()));
|
||||
try {
|
||||
isvHttpRequest.sendFeiShuCardMessage(sendCardMessage);
|
||||
} catch (ApiException e) {
|
||||
log.error("跟进任务发送通知失败, {}", JSONObject.toJSONString(followTask));
|
||||
}
|
||||
}
|
||||
}
|
||||
//更新过期的任务状态
|
||||
hyFollowTaskDAO.updateUndoTaskStatusToOverdue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void followTaskRemind() {
|
||||
//获取已逾期的 以及截止时间为当天的任务 的招商经理
|
||||
Boolean hasNext = true;
|
||||
int pageNum = CommonConstants.ONE, pageSize = CommonConstants.HUNDRED;
|
||||
while (hasNext){
|
||||
Page<String> remindFollowUserIds = hyFollowTaskDAO.getRemindFollowUserIds(new Date(), pageNum, pageSize);
|
||||
if(CollectionUtils.isEmpty(remindFollowUserIds)){
|
||||
break;
|
||||
}
|
||||
if(remindFollowUserIds.size() < pageSize){
|
||||
hasNext = false;
|
||||
}
|
||||
pageNum++;
|
||||
List<FollowTaskNumDTO> followTaskList = hyFollowTaskDAO.getUserTaskNum(remindFollowUserIds);
|
||||
for (FollowTaskNumDTO followTask : followTaskList) {
|
||||
SendCardMessageDTO sendCardMessage = new SendCardMessageDTO();
|
||||
sendCardMessage.setMessageUrl(linkUrl);
|
||||
sendCardMessage.setMessageType(MessageTypeEnum.SCHEDULE_REMINDER);
|
||||
sendCardMessage.setContent(FollowTaskNumDTO.getMessageContent(followTask));
|
||||
sendCardMessage.setTitle(MessageConstants.FOLLOW_TASK_MESSAGE_TITLE);
|
||||
sendCardMessage.setUserIds(Arrays.asList(followTask.getFollowUserId()));
|
||||
try {
|
||||
isvHttpRequest.sendFeiShuCardMessage(sendCardMessage);
|
||||
} catch (ApiException e) {
|
||||
log.error("跟进任务发送通知失败, {}", JSONObject.toJSONString(followTask));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 线索校验
|
||||
* @param partnerLineId
|
||||
@@ -183,6 +263,12 @@ public class FollowTaskServiceImpl implements FollowTaskService {
|
||||
if(Objects.isNull(partnerInfo)){
|
||||
return;
|
||||
}
|
||||
String lockKey = MessageFormat.format(CommonConstants.FOLLOW_TASK_NOTICE_KEY, task.getFollowUserId(), task.getId());
|
||||
boolean result = redisUtilPool.setNxExpire(lockKey, DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC), CommonConstants.FOLLOW_TASK_NOTICE_LOCK_TIMES);
|
||||
if(!result){
|
||||
//一小时内发送过不再发送通知
|
||||
return;
|
||||
}
|
||||
String dateline = DateUtil.format(task.getDeadline(), CoolDateUtils.DATE_FORMAT_SEC_2);
|
||||
String content = MessageFormat.format(MessageConstants.FOLLOW_TASK_MESSAGE_CONTENT, dateline, partnerInfo.getUsername(), partnerInfo.getMobile());
|
||||
SendCardMessageDTO sendCardMessage = new SendCardMessageDTO();
|
||||
|
||||
@@ -5,12 +5,10 @@ import cn.hutool.core.date.DateUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.cool.store.constants.CommonConstants;
|
||||
import com.cool.store.constants.RedisConstant;
|
||||
import com.cool.store.context.CurrentUserHolder;
|
||||
import com.cool.store.context.LoginUserInfo;
|
||||
import com.cool.store.context.PartnerUserHolder;
|
||||
import com.cool.store.dao.*;
|
||||
import com.cool.store.dto.log.AddTagsDTO;
|
||||
import com.cool.store.dto.log.BlackListLogDTO;
|
||||
import com.cool.store.dto.log.LineLogInfo;
|
||||
import com.cool.store.dto.log.WantInfoUpdateDTO;
|
||||
import com.cool.store.entity.*;
|
||||
@@ -19,10 +17,7 @@ import com.cool.store.exception.ServiceException;
|
||||
import com.cool.store.mapper.HyPartnerCertificationInfoMapper;
|
||||
import com.cool.store.request.AddTagsRequest;
|
||||
import com.cool.store.request.PartnerBaseInfoRequest;
|
||||
import com.cool.store.service.HyPartnerBaseInfoService;
|
||||
import com.cool.store.service.HyPartnerLineInfoService;
|
||||
import com.cool.store.service.HyPhoneLocationService;
|
||||
import com.cool.store.service.LogService;
|
||||
import com.cool.store.service.*;
|
||||
import com.cool.store.utils.CoolDateUtils;
|
||||
import com.cool.store.utils.RedisUtilPool;
|
||||
import com.cool.store.vo.PartnerBaseInfoVO;
|
||||
@@ -35,8 +30,7 @@ import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@@ -84,6 +78,8 @@ public class HyPartnerBaseInfoServiceImpl implements HyPartnerBaseInfoService {
|
||||
|
||||
@Autowired
|
||||
private LogService logService;
|
||||
@Resource
|
||||
private LabelService labelService;
|
||||
|
||||
|
||||
@Override
|
||||
@@ -92,18 +88,33 @@ public class HyPartnerBaseInfoServiceImpl implements HyPartnerBaseInfoService {
|
||||
if (hyPartnerBaseInfo==null){
|
||||
throw new ServiceException(ErrorCodeEnum.PARTNER_BASE_INFO_NOT_EXIST);
|
||||
}
|
||||
String oldUserPortrait = hyPartnerBaseInfo.getUserPortrait();
|
||||
hyPartnerBaseInfo.setId(addTagsRequest.getPartnerBaseInfoId());
|
||||
hyPartnerBaseInfo.setUserPortrait(CollectionUtils.isNotEmpty(addTagsRequest.getTags())?
|
||||
addTagsRequest.getTags().stream().map(Object::toString).collect(Collectors.joining(CommonConstants.COMMA, CommonConstants.COMMA, CommonConstants.COMMA)):"");
|
||||
hyPartnerBaseInfoDAO.updateByPrimaryKeySelective(hyPartnerBaseInfo);
|
||||
HyPartnerLineInfoDO line = hyPartnerLineInfoDAO.getByPartnerId(hyPartnerBaseInfo.getPartnerId());
|
||||
//添加日志
|
||||
String newUserPortrait = hyPartnerBaseInfo.getUserPortrait();
|
||||
List<String> oldLabels = new ArrayList<>(), newLabels = new ArrayList<>();
|
||||
if (StringUtils.isNotEmpty(oldUserPortrait)){
|
||||
Map<Long, String> userPortraitMap = labelService.getUserPortraitMap(Arrays.asList(oldUserPortrait));
|
||||
oldLabels = userPortraitMap.values().stream().collect(Collectors.toList());
|
||||
}
|
||||
if (StringUtils.isNotEmpty(newUserPortrait)){
|
||||
Map<Long, String> userPortraitMap = labelService.getUserPortraitMap(Arrays.asList(newUserPortrait));
|
||||
newLabels = userPortraitMap.values().stream().collect(Collectors.toList());
|
||||
}
|
||||
List<String> addLabels = new ArrayList<>(newLabels);
|
||||
List<String> removeLabels = new ArrayList<>(oldLabels);
|
||||
addLabels.removeAll(oldLabels);
|
||||
removeLabels.removeAll(newLabels);
|
||||
LineLogInfo lineLogInfo = new LineLogInfo(line.getPartnerId(), line.getId(), user.getUserId(),
|
||||
user.getName(), OperateTypeEnum.ADD_TAGS,
|
||||
WorkflowStageEnum.getWorkflowStageByCode(line.getWorkflowStage()),
|
||||
line.getWorkflowStatus(), "");
|
||||
AddTagsDTO logDTO = AddTagsDTO.builder().operateUserId(user.getUserId()).operateUsername(user.getName())
|
||||
.mobile(user.getMobile()).operateTime(DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC_2)).build();
|
||||
.mobile(user.getMobile()).operateTime(DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC_2)).addLabels(addLabels).removeLabels(removeLabels).build();
|
||||
lineLogInfo.setData(logDTO);
|
||||
hyPartnerTaskInfoLogDAO.addOperateLog(lineLogInfo);
|
||||
return Boolean.TRUE;
|
||||
|
||||
Reference in New Issue
Block a user