|
|
|
@ -1,23 +1,25 @@
|
|
|
|
|
package com.baiye.modules.telemarkting.service.impl;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
|
|
import cn.hutool.core.date.DateTime;
|
|
|
|
|
import cn.hutool.core.date.DateUnit;
|
|
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
import com.baiye.common.CommonLog;
|
|
|
|
|
import com.baiye.constant.DefaultNumberConstants;
|
|
|
|
|
import com.baiye.feign.SourceClueClient;
|
|
|
|
|
import com.baiye.http.CommonResponse;
|
|
|
|
|
import com.baiye.modules.agent.repository.ChannelCustomRepository;
|
|
|
|
|
import com.baiye.modules.telemarkting.dao.AllCallInfoRepository;
|
|
|
|
|
import com.baiye.modules.telemarkting.dao.ClueBoostRecordRepository;
|
|
|
|
|
import com.baiye.modules.telemarkting.dao.ClueBoostRepository;
|
|
|
|
|
import com.baiye.modules.telemarkting.entity.ClueBoost;
|
|
|
|
|
import com.baiye.modules.telemarkting.entity.ClueBoostRecord;
|
|
|
|
|
import com.baiye.modules.telemarkting.entity.dto.ClueBoostDTO;
|
|
|
|
|
import com.baiye.modules.telemarkting.entity.dto.ClueBoostQueryCriteria;
|
|
|
|
|
import com.baiye.modules.telemarkting.entity.vo.ClueBoostVO;
|
|
|
|
|
import com.baiye.modules.telemarkting.service.ClueBoostService;
|
|
|
|
|
import com.baiye.util.PageUtil;
|
|
|
|
|
import com.baiye.util.QueryHelp;
|
|
|
|
|
import com.baiye.util.RedisUtils;
|
|
|
|
|
import com.baiye.util.SecurityUtils;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.springframework.context.event.EventListener;
|
|
|
|
@ -31,7 +33,6 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @author wjt
|
|
|
|
@ -42,10 +43,6 @@ import java.util.concurrent.TimeUnit;
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class ClueBoostServiceImpl implements ClueBoostService {
|
|
|
|
|
|
|
|
|
|
private static final String KEY = "boost:";
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private RedisUtils redisUtils;
|
|
|
|
|
@Resource
|
|
|
|
|
private ClueBoostRepository clueBoostRepository;
|
|
|
|
|
@Resource
|
|
|
|
@ -54,6 +51,8 @@ public class ClueBoostServiceImpl implements ClueBoostService {
|
|
|
|
|
private ChannelCustomRepository channelCustomRepository;
|
|
|
|
|
@Resource
|
|
|
|
|
private ClueBoostRecordRepository clueBoostRecordRepository;
|
|
|
|
|
@Resource
|
|
|
|
|
private AllCallInfoRepository allCallInfoRepository;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Object queryAll(ClueBoostQueryCriteria clueBoostQueryCriteria, Pageable pageable) {
|
|
|
|
@ -66,7 +65,7 @@ public class ClueBoostServiceImpl implements ClueBoostService {
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
|
public void compensate(Set<Long> ids) {
|
|
|
|
|
Integer integer = clueBoostRepository.updateStatusByIds(true, ids);
|
|
|
|
|
Integer integer = clueBoostRepository.updateStatusByIds(DefaultNumberConstants.FOUR_NUMBER, ids);
|
|
|
|
|
Long currentUserId = SecurityUtils.getCurrentUserId();
|
|
|
|
|
channelCustomRepository.updateSurplusNumByUserId(currentUserId, integer);
|
|
|
|
|
|
|
|
|
@ -79,61 +78,124 @@ public class ClueBoostServiceImpl implements ClueBoostService {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 时间比较 精确到分钟
|
|
|
|
|
* 返回当前线索的赔付阶段 1: 0-24小时内拨打第一次 2: 0-24小时内拨打第二次 3: 24-48小时内拨打一次
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public CommonResponse<Object> queryCurrentStatus(Long clueId) {
|
|
|
|
|
ClueBoost clueBoost = clueBoostRepository.findByClueId(clueId);
|
|
|
|
|
if (ObjectUtil.isNotEmpty(clueBoost)) {
|
|
|
|
|
ClueBoostVO clueBoostVO = new ClueBoostVO();
|
|
|
|
|
if (clueBoost.getStatus() == DefaultNumberConstants.ONE_NUMBER) {
|
|
|
|
|
clueBoostVO.setStatus(DefaultNumberConstants.ONE_NUMBER);
|
|
|
|
|
} else if (clueBoost.getStatus() == DefaultNumberConstants.TWO_NUMBER) {
|
|
|
|
|
clueBoostVO.setStatus(DefaultNumberConstants.TWO_NUMBER);
|
|
|
|
|
} else {
|
|
|
|
|
clueBoostVO.setStatus(DefaultNumberConstants.THREE_NUMBER);
|
|
|
|
|
}
|
|
|
|
|
Date firstTime = clueBoost.getFirstTime();
|
|
|
|
|
clueBoostVO.setFirstTime(DateUtil.format(firstTime, "MM-dd HH:mm"));
|
|
|
|
|
DateTime dateTime = DateUtil.offsetMinute(firstTime, 61);
|
|
|
|
|
DateTime dateTime1 = DateUtil.offsetMinute(firstTime, 24 * 60 - 1);
|
|
|
|
|
String second = DateUtil.format(dateTime, "MM-dd HH:mm") + "至" + DateUtil.format(dateTime1, "MM-dd HH:mm");
|
|
|
|
|
clueBoostVO.setSecondTime(second);
|
|
|
|
|
DateTime dateTime2 = DateUtil.offsetMinute(dateTime1, 62);
|
|
|
|
|
DateTime dateTime3 = DateUtil.offsetMinute(firstTime, 48 * 60 - 1);
|
|
|
|
|
String third = DateUtil.format(dateTime2, "MM-dd HH:mm") + "至" + DateUtil.format(dateTime3, "MM-dd HH:mm");
|
|
|
|
|
clueBoostVO.setThirdTime(third);
|
|
|
|
|
return CommonResponse.createBySuccess(clueBoostVO);
|
|
|
|
|
}
|
|
|
|
|
return CommonResponse.createBySuccess();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void testCall(Long clueId, Long memberId, Long whichUserId, Boolean status) {
|
|
|
|
|
ClueBoostDTO clueBoostDTO = new ClueBoostDTO().addClueBoostDTO(clueId, memberId, whichUserId, 4, null, DateUtil.date());
|
|
|
|
|
clueBoostDTO.setStatus(status);
|
|
|
|
|
boost(clueBoostDTO);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 时间比较 精确到秒
|
|
|
|
|
*
|
|
|
|
|
* @param startTime 开始时间
|
|
|
|
|
* @param endTime 结束时间
|
|
|
|
|
* @param interval 间隔小时
|
|
|
|
|
*/
|
|
|
|
|
private Boolean timeCompare(Date startTime, Date endTime, int interval) {
|
|
|
|
|
long between = DateUtil.between(startTime, endTime, DateUnit.MINUTE, true);
|
|
|
|
|
long i = interval * 60L;
|
|
|
|
|
private static Boolean timeCompare(Date startTime, Date endTime, int interval) {
|
|
|
|
|
long between = DateUtil.between(startTime, endTime, DateUnit.SECOND, true);
|
|
|
|
|
long i = interval * 60L * 60L;
|
|
|
|
|
return between <= i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@EventListener(ClueBoostDTO.class)
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
|
public void boost(ClueBoostDTO clueBoostDTO) {
|
|
|
|
|
Object o = redisUtils.get(KEY + clueBoostDTO.getClueId());
|
|
|
|
|
if (ObjectUtil.isNotEmpty(o)) {
|
|
|
|
|
if (clueBoostDTO.getStatus()) {
|
|
|
|
|
redisUtils.del(KEY + clueBoostDTO.getClueId());
|
|
|
|
|
return;
|
|
|
|
|
ClueBoost byClueId = clueBoostRepository.findByClueId(clueBoostDTO.getClueId());
|
|
|
|
|
if (ObjectUtil.isEmpty(byClueId)) {
|
|
|
|
|
if (!clueBoostDTO.getStatus() && !isConnectInfo(clueBoostDTO.getClueId())) {
|
|
|
|
|
//持久化
|
|
|
|
|
ClueBoost clueBoostNew = new ClueBoost().addClueBoost(clueBoostDTO.getClueId(), clueBoostDTO.getMemberId(), clueBoostDTO.getClueType(), clueBoostDTO.getWhichUserId(), clueBoostDTO.getFirstTime());
|
|
|
|
|
clueBoostRepository.save(clueBoostNew);
|
|
|
|
|
}
|
|
|
|
|
//redis数据
|
|
|
|
|
ClueBoostDTO clueBoost = BeanUtil.toBean(o, ClueBoostDTO.class);
|
|
|
|
|
} else {
|
|
|
|
|
Date lastTime = byClueId.getLastTime();
|
|
|
|
|
Date firstTime = byClueId.getFirstTime();
|
|
|
|
|
Integer callNum = byClueId.getCallNum();
|
|
|
|
|
//当前拨打时间
|
|
|
|
|
Date lastTimeNew = clueBoostDTO.getLastTime();
|
|
|
|
|
dealBoostClue(lastTime, firstTime, callNum, lastTimeNew, byClueId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//上一次拨打距离当前时间间隔1小时
|
|
|
|
|
Date lastTime = clueBoost.getLastTime();
|
|
|
|
|
if (timeCompare(lastTime, DateUtil.date(), DefaultNumberConstants.ONE_NUMBER)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//第一次拨打后 24小时内需2通
|
|
|
|
|
Date firstTime = clueBoost.getFirstTime();
|
|
|
|
|
Integer callNum = clueBoost.getCallNum();
|
|
|
|
|
if (timeCompare(firstTime, DateUtil.date(), DefaultNumberConstants.TWENTY_FOUR)) {
|
|
|
|
|
clueBoost.setCallNum(callNum + 1);
|
|
|
|
|
clueBoost.setLastTime(DateUtil.date());
|
|
|
|
|
redisUtils.set(KEY + clueBoostDTO.getClueId(), clueBoost, 48, TimeUnit.HOURS);
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
private void dealBoostClue(Date lastTime, Date firstTime, Integer callNum, Date lastTimeNew, ClueBoost clueBoost) {
|
|
|
|
|
if (clueBoost.getStatus() > DefaultNumberConstants.TWO_NUMBER) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//判断距离上一次拨打时间是否超过1小时
|
|
|
|
|
if (timeCompare(lastTime, DateUtil.date(), DefaultNumberConstants.ONE_NUMBER)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//第一次拨打后 24小时内需2通
|
|
|
|
|
if (timeCompare(firstTime, lastTimeNew, DefaultNumberConstants.TWENTY_FOUR)) {
|
|
|
|
|
clueBoost.setCallNum(callNum + 1);
|
|
|
|
|
clueBoost.setLastTime(lastTimeNew);
|
|
|
|
|
clueBoost.setStatus(DefaultNumberConstants.TWO_NUMBER);
|
|
|
|
|
clueBoostRepository.save(clueBoost);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//第一次拨打后 48小时内需1通
|
|
|
|
|
if (timeCompare(firstTime, lastTimeNew, DefaultNumberConstants.FORTY_EIGHT)) {
|
|
|
|
|
if (callNum < DefaultNumberConstants.TWO_NUMBER) {
|
|
|
|
|
//重置
|
|
|
|
|
clueBoost.setCallNum(DefaultNumberConstants.ONE_NUMBER);
|
|
|
|
|
clueBoost.setLastTime(lastTimeNew);
|
|
|
|
|
clueBoost.setFirstTime(lastTimeNew);
|
|
|
|
|
clueBoost.setStatus(DefaultNumberConstants.ONE_NUMBER);
|
|
|
|
|
clueBoostRepository.save(clueBoost);
|
|
|
|
|
return;
|
|
|
|
|
} else if (timeCompare(firstTime, DateUtil.date(), DefaultNumberConstants.FORTY_EIGHT)) {
|
|
|
|
|
if (callNum >= DefaultNumberConstants.TWO_NUMBER) {
|
|
|
|
|
//满足补量
|
|
|
|
|
ClueBoost clueBoostNew = new ClueBoost().addClueBoost(clueBoost.getClueId(), clueBoost.getMemberId(), clueBoost.getClueType(), clueBoostDTO.getWhichUserId());
|
|
|
|
|
// 修改线索为冻结
|
|
|
|
|
sourceClueClient.updateTalkClueFreeze(clueBoost.getClueId(), true);
|
|
|
|
|
clueBoostRepository.save(clueBoostNew);
|
|
|
|
|
CommonLog.info("赔付线索.id=" + clueBoost.getClueId());
|
|
|
|
|
redisUtils.del(KEY + clueBoostDTO.getClueId());
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 1.满足补量 2.修改线索为冻结
|
|
|
|
|
sourceClueClient.updateTalkClueFreeze(clueBoost.getClueId(), true);
|
|
|
|
|
clueBoost.setCallNum(clueBoost.getCallNum() + 1);
|
|
|
|
|
clueBoost.setLastTime(lastTimeNew);
|
|
|
|
|
clueBoost.setStatus(DefaultNumberConstants.THREE_NUMBER);
|
|
|
|
|
clueBoostRepository.save(clueBoost);
|
|
|
|
|
|
|
|
|
|
CommonLog.info("赔付线索.id=" + clueBoost.getClueId());
|
|
|
|
|
}
|
|
|
|
|
if (!clueBoostDTO.getStatus()) {
|
|
|
|
|
clueBoostDTO.setLastTime(DateUtil.date());
|
|
|
|
|
clueBoostDTO.setFirstTime(DateUtil.date());
|
|
|
|
|
clueBoostDTO.setCallNum(1);
|
|
|
|
|
redisUtils.set(KEY + clueBoostDTO.getClueId(), clueBoostDTO, 24, TimeUnit.HOURS);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 是否有接通记录
|
|
|
|
|
*/
|
|
|
|
|
public Boolean isConnectInfo(Long clueId) {
|
|
|
|
|
Integer count = allCallInfoRepository.countByClueIdAndStatus(clueId, DefaultNumberConstants.TWO_NUMBER);
|
|
|
|
|
return count > 0;
|
|
|
|
|
}
|
|
|
|
|
}
|