跟进任务新增通知

This commit is contained in:
zhangchenbiao
2023-08-14 15:03:27 +08:00
parent f7c446ba8d
commit 634d6ec24e
8 changed files with 85 additions and 16 deletions

View File

@@ -26,6 +26,8 @@ public class CommonConstants {
public static final int NORMAL_LOCK_TIMES = 60 * 1000; public static final int NORMAL_LOCK_TIMES = 60 * 1000;
public static final int AN_HOUR_SECONDS = 3600;
/** /**
* 企业开通锁存活时间 * 企业开通锁存活时间
*/ */
@@ -101,6 +103,7 @@ public class CommonConstants {
public static final int EIGHTY = 80; public static final int EIGHTY = 80;
public static final int NINETY = 90; public static final int NINETY = 90;
public static final int HUNDRED = 100; public static final int HUNDRED = 100;
public static final int ONE_THOUSAND = 1000;
public static final String ONE_STR = "1"; public static final String ONE_STR = "1";

View File

@@ -0,0 +1,17 @@
package com.cool.store.constants;
/**
* @author zhangchenbiao
* @FileName: MessageConstants
* @Description:通知消息常量
* @date 2023-08-14 14:41
*/
public class MessageConstants {
public static final String FOLLOW_TASK_MESSAGE_TITLE = "线索跟进任务";
public static final String FOLLOW_TASK_MESSAGE_CONTENT = "您有一个线索跟进任务将于{0}截止 ,线索信息{1}手机号{2},请及时跟进";
public static final String FOLLOW_TASK_MESSAGE_CONTENT_1 = "您有{0}个线索跟进任务将于今日截止,及{1}个跟进任务已逾期,请及时跟进";
public static final String FOLLOW_TASK_MESSAGE_CONTENT_2 = "您有{0}个跟进任务已逾期,请及时跟进";
public static final String FOLLOW_TASK_MESSAGE_CONTENT_3 = "您有{1}个线索跟进任务将于今日截止,请及时跟进";
}

View File

@@ -63,6 +63,7 @@ public enum ErrorCodeEnum {
PARTNER_BASE_INFO_NOT_EXIST(500009, "加盟商信息不存在!", null), PARTNER_BASE_INFO_NOT_EXIST(500009, "加盟商信息不存在!", null),
LINE_STATUS_NOT_ALLOW_OPERATE(500010, "当前线索状态不允许该操作!", null), LINE_STATUS_NOT_ALLOW_OPERATE(500010, "当前线索状态不允许该操作!", null),
TASK_STATUS_NOT_ALLOW_OPERATE(500011, "当前任务状态不允许该操作!", null), TASK_STATUS_NOT_ALLOW_OPERATE(500011, "当前任务状态不允许该操作!", null),
DATELINE_BEFORE_NOW(500012, "截止时间不能早于当前时间!", null),
INTERVIEW_ENTER_FAIL(1021101, "进入面试间失败", null), INTERVIEW_ENTER_FAIL(1021101, "进入面试间失败", null),
DINGDING_USER_NOT_EXIST(1021102, "用户钉钉信息不存在,无法发起资质审核!", null), DINGDING_USER_NOT_EXIST(1021102, "用户钉钉信息不存在,无法发起资质审核!", null),

View File

@@ -1,12 +1,9 @@
package com.cool.store.utils; package com.cool.store.utils;
import cn.hutool.core.date.DateUtil;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.*; import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;

View File

@@ -1,6 +1,7 @@
package com.cool.store.dao; package com.cool.store.dao;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import com.cool.store.constants.CommonConstants;
import com.cool.store.dto.partner.PartnerBlackListDTO; import com.cool.store.dto.partner.PartnerBlackListDTO;
import com.cool.store.dto.partner.PartnerLineInfoAndBaseInfoDTO; import com.cool.store.dto.partner.PartnerLineInfoAndBaseInfoDTO;
import com.cool.store.dto.partner.StageCountDTO; import com.cool.store.dto.partner.StageCountDTO;
@@ -15,10 +16,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList; import java.util.*;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -199,4 +197,12 @@ public class HyPartnerLineInfoDAO {
return ListUtils.emptyIfNull(partnerList).stream().collect(Collectors.toMap(k->k.getPartnerLineId(), Function.identity(), (k1, k2)->k1)); return ListUtils.emptyIfNull(partnerList).stream().collect(Collectors.toMap(k->k.getPartnerLineId(), Function.identity(), (k1, k2)->k1));
} }
public PartnerSimpleInfoDTO getPartnerSimpleInfoByLineId(Long partnerLineId){
if(Objects.isNull(partnerLineId)){
return null;
}
List<PartnerSimpleInfoDTO> partnerList = hyPartnerLineInfoMapper.getPartnerSimpleInfoByLineIds(Arrays.asList(partnerLineId));
return CollectionUtils.isEmpty(partnerList) ? null : partnerList.get(CommonConstants.ZERO);
}
} }

View File

@@ -85,12 +85,6 @@ public class MyIntrospectedTableMyBatis3Impl extends IntrospectedTableMyBatis3Im
} }
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append(calculateJavaClientImplementationPackage());
sb.append('.');
sb.append(getTableNameFromConfigFile());
sb.append("DAOImpl"); //$NON-NLS-1$
setDAOImplementationType(sb.toString());
sb.setLength(0); sb.setLength(0);
sb.append(calculateJavaClientInterfacePackage()); sb.append(calculateJavaClientInterfacePackage());
sb.append('.'); sb.append('.');

View File

@@ -45,9 +45,10 @@ public class UpdateFollowTaskRequest {
@ApiModelProperty("任务截止时间") @ApiModelProperty("任务截止时间")
private Date deadline; private Date deadline;
public static HyFollowTaskDO convertDO(UpdateFollowTaskRequest request){ public static HyFollowTaskDO convertDO(Long partnerLineId, UpdateFollowTaskRequest request){
HyFollowTaskDO result = new HyFollowTaskDO(); HyFollowTaskDO result = new HyFollowTaskDO();
result.setId(request.getFollowTaskId()); result.setId(request.getFollowTaskId());
result.setPartnerLineId(partnerLineId);
result.setTaskTitle(request.getTaskTitle()); result.setTaskTitle(request.getTaskTitle());
result.setCommunicationType(request.getCommunicationType()); result.setCommunicationType(request.getCommunicationType());
result.setDeadline(request.getDeadline()); result.setDeadline(request.getDeadline());

View File

@@ -1,31 +1,42 @@
package com.cool.store.service.impl; package com.cool.store.service.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.cool.store.constants.CommonConstants; import com.cool.store.constants.CommonConstants;
import com.cool.store.constants.MessageConstants;
import com.cool.store.dao.EnterpriseUserDAO; import com.cool.store.dao.EnterpriseUserDAO;
import com.cool.store.dao.HyFollowTaskDAO; import com.cool.store.dao.HyFollowTaskDAO;
import com.cool.store.dao.HyPartnerLineInfoDAO; import com.cool.store.dao.HyPartnerLineInfoDAO;
import com.cool.store.dao.HyPartnerTaskInfoLogDAO; import com.cool.store.dao.HyPartnerTaskInfoLogDAO;
import com.cool.store.dto.log.LineLogInfo; import com.cool.store.dto.log.LineLogInfo;
import com.cool.store.dto.message.SendCardMessageDTO;
import com.cool.store.dto.partner.PartnerSimpleInfoDTO; import com.cool.store.dto.partner.PartnerSimpleInfoDTO;
import com.cool.store.entity.HyFollowTaskDO; import com.cool.store.entity.HyFollowTaskDO;
import com.cool.store.entity.HyPartnerLineInfoDO; import com.cool.store.entity.HyPartnerLineInfoDO;
import com.cool.store.enums.*; import com.cool.store.enums.*;
import com.cool.store.exception.ApiException;
import com.cool.store.exception.ServiceException; import com.cool.store.exception.ServiceException;
import com.cool.store.http.ISVHttpRequest;
import com.cool.store.request.follow.AddFollowLogRequest; import com.cool.store.request.follow.AddFollowLogRequest;
import com.cool.store.request.follow.AddFollowTaskRequest; import com.cool.store.request.follow.AddFollowTaskRequest;
import com.cool.store.request.follow.FollowTaskIdRequest; import com.cool.store.request.follow.FollowTaskIdRequest;
import com.cool.store.request.follow.UpdateFollowTaskRequest; import com.cool.store.request.follow.UpdateFollowTaskRequest;
import com.cool.store.service.FollowTaskService; import com.cool.store.service.FollowTaskService;
import com.cool.store.utils.CoolDateUtils;
import com.cool.store.vo.follow.FollowTaskLogVO; import com.cool.store.vo.follow.FollowTaskLogVO;
import com.cool.store.vo.follow.FollowTaskPageVO; import com.cool.store.vo.follow.FollowTaskPageVO;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@@ -37,6 +48,7 @@ import java.util.stream.Collectors;
* @Description: * @Description:
* @date 2023-08-10 11:10 * @date 2023-08-10 11:10
*/ */
@Slf4j
@Service @Service
public class FollowTaskServiceImpl implements FollowTaskService { public class FollowTaskServiceImpl implements FollowTaskService {
@@ -48,6 +60,10 @@ public class FollowTaskServiceImpl implements FollowTaskService {
private HyPartnerTaskInfoLogDAO hyPartnerTaskInfoLogDAO; private HyPartnerTaskInfoLogDAO hyPartnerTaskInfoLogDAO;
@Resource @Resource
private EnterpriseUserDAO enterpriseUserDAO; private EnterpriseUserDAO enterpriseUserDAO;
@Resource
private ISVHttpRequest isvHttpRequest;
@Value("${feishu.notice.link.url:null}")
private String linkUrl;
@Override @Override
public PageInfo<FollowTaskPageVO> getFollowTaskPage(Integer pageNum, Integer pageSize, Integer taskStatus, String queryDate, String followUserId) { public PageInfo<FollowTaskPageVO> getFollowTaskPage(Integer pageNum, Integer pageSize, Integer taskStatus, String queryDate, String followUserId) {
@@ -87,6 +103,9 @@ public class FollowTaskServiceImpl implements FollowTaskService {
@Override @Override
public Long addFollowTask(AddFollowTaskRequest request, String userId) { public Long addFollowTask(AddFollowTaskRequest request, String userId) {
if(request.getDeadline().getTime() < System.currentTimeMillis()){
throw new ServiceException(ErrorCodeEnum.DATELINE_BEFORE_NOW);
}
HyPartnerLineInfoDO lineInfo = checkLine(request.getPartnerLineId()); HyPartnerLineInfoDO lineInfo = checkLine(request.getPartnerLineId());
HyFollowTaskDO task = AddFollowTaskRequest.convertDO(request); HyFollowTaskDO task = AddFollowTaskRequest.convertDO(request);
task.setFollowUserId(lineInfo.getInvestmentManager()); task.setFollowUserId(lineInfo.getInvestmentManager());
@@ -97,6 +116,10 @@ public class FollowTaskServiceImpl implements FollowTaskService {
jsonObject.put(OperateLogFieldValueEnum.FOLLOW_TASK_ID.getCode(), followTaskId); jsonObject.put(OperateLogFieldValueEnum.FOLLOW_TASK_ID.getCode(), followTaskId);
lineLogInfo.setData(jsonObject); lineLogInfo.setData(jsonObject);
hyPartnerTaskInfoLogDAO.addOperateLog(lineLogInfo); hyPartnerTaskInfoLogDAO.addOperateLog(lineLogInfo);
if((request.getDeadline().getTime() - System.currentTimeMillis()) /CommonConstants.ONE_THOUSAND < CommonConstants.AN_HOUR_SECONDS){
//一小时内的任务立即发送通知
sendMessage(task);
}
return followTaskId; return followTaskId;
} }
@@ -106,8 +129,15 @@ public class FollowTaskServiceImpl implements FollowTaskService {
if(!FollowTaskStatusEnum.TODO.getCode().equals(followTask.getTaskStatus())){ if(!FollowTaskStatusEnum.TODO.getCode().equals(followTask.getTaskStatus())){
throw new ServiceException(ErrorCodeEnum.TASK_STATUS_NOT_ALLOW_OPERATE); throw new ServiceException(ErrorCodeEnum.TASK_STATUS_NOT_ALLOW_OPERATE);
} }
if(Objects.nonNull(request.getDeadline()) && request.getDeadline().getTime() < System.currentTimeMillis()){
throw new ServiceException(ErrorCodeEnum.DATELINE_BEFORE_NOW);
}
checkLine(followTask.getPartnerLineId()); checkLine(followTask.getPartnerLineId());
HyFollowTaskDO task = UpdateFollowTaskRequest.convertDO(request); HyFollowTaskDO task = UpdateFollowTaskRequest.convertDO(followTask.getPartnerLineId(), request);
if(!request.getDeadline().equals(followTask.getDeadline()) && (request.getDeadline().getTime() - System.currentTimeMillis()) / CommonConstants.ONE_THOUSAND < CommonConstants.AN_HOUR_SECONDS){
//一小时内的任务立即发送通知
sendMessage(task);
}
return hyFollowTaskDAO.updateFollowTask(task); return hyFollowTaskDAO.updateFollowTask(task);
} }
@@ -136,7 +166,7 @@ public class FollowTaskServiceImpl implements FollowTaskService {
* @param partnerLineId * @param partnerLineId
* @return * @return
*/ */
public HyPartnerLineInfoDO checkLine(Long partnerLineId){ private HyPartnerLineInfoDO checkLine(Long partnerLineId){
HyPartnerLineInfoDO lineInfo = hyPartnerLineInfoDAO.selectByPrimaryKeySelective(partnerLineId); HyPartnerLineInfoDO lineInfo = hyPartnerLineInfoDAO.selectByPrimaryKeySelective(partnerLineId);
if(Objects.isNull(lineInfo) || lineInfo.getDeleted()){ if(Objects.isNull(lineInfo) || lineInfo.getDeleted()){
throw new ServiceException(ErrorCodeEnum.LINE_ID_IS_NOT_EXIST); throw new ServiceException(ErrorCodeEnum.LINE_ID_IS_NOT_EXIST);
@@ -147,4 +177,24 @@ public class FollowTaskServiceImpl implements FollowTaskService {
} }
return lineInfo; return lineInfo;
} }
private void sendMessage(HyFollowTaskDO task){
PartnerSimpleInfoDTO partnerInfo = hyPartnerLineInfoDAO.getPartnerSimpleInfoByLineId(task.getPartnerLineId());
if(Objects.isNull(partnerInfo)){
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();
sendCardMessage.setMessageUrl(linkUrl);
sendCardMessage.setMessageType(MessageTypeEnum.SCHEDULE_REMINDER);
sendCardMessage.setContent(content);
sendCardMessage.setTitle(MessageConstants.FOLLOW_TASK_MESSAGE_TITLE);
sendCardMessage.setUserIds(Arrays.asList(task.getFollowUserId()));
try {
isvHttpRequest.sendFeiShuCardMessage(sendCardMessage);
} catch (ApiException e) {
log.error("跟进任务发送通知失败, {}", JSONObject.toJSONString(task));
}
}
} }