线索赔付

master
wjt 1 year ago
parent 5f9023bfbc
commit 037252120a

@ -1,5 +1,6 @@
package com.baiye.modules.telemarkting.api;
import com.baiye.annotation.Inner;
import com.baiye.annotation.Log;
import com.baiye.http.CommonResponse;
import com.baiye.modules.telemarkting.entity.dto.ClueBoostQueryCriteria;
@ -38,4 +39,21 @@ public class ClueBoostController {
return CommonResponse.createBySuccess();
}
@ApiOperation("赔付详情")
@GetMapping("/compensateInfo")
@Inner(value = false)
public CommonResponse<Object> compensateInfo(@RequestParam("clueId") Long clueId) {
return clueBoostService.queryCurrentStatus(clueId);
}
@ApiOperation("赔付详情")
@GetMapping("/testCall")
@Inner(value = false)
public CommonResponse<Object> testCall(@RequestParam("clueId") Long clueId
, @RequestParam("memberId") Long memberId
, @RequestParam("whichUserId") Long whichUserId
, @RequestParam("status") Boolean status) {
clueBoostService.testCall(clueId, memberId, whichUserId, status);
return CommonResponse.createBySuccess();
}
}

@ -25,11 +25,6 @@ public interface AllCallInfoRepository extends JpaRepository<AllCallInfo, Long>,
*/
AllCallInfo findBySessionId(String sessionId);
@Modifying
@Query(value = "update AllCallInfo d set d.status =?1 where d.sessionId = ?2")
void updateByStatus(Integer status, String sessionId);
/**
*
*
@ -102,4 +97,14 @@ public interface AllCallInfoRepository extends JpaRepository<AllCallInfo, Long>,
*/
@Query(value = "select a from AllCallInfo a where a.clueId = ?1 order by a.createTime desc ")
List<AllCallInfo> findAllByClueId(Long clueId);
/**
* 线
*
* @param clueId
* @param status
* @return
*/
Integer countByClueIdAndStatus(Long clueId, Integer status);
}

@ -16,5 +16,7 @@ public interface ClueBoostRepository extends JpaRepository<ClueBoost, Long>, Jpa
@Modifying
@Query("UPDATE ClueBoost set status = ?1 where id in ?2")
Integer updateStatusByIds(Boolean status, Set<Long> ids);
Integer updateStatusByIds(Integer status, Set<Long> ids);
ClueBoost findByClueId(Long clueId);
}

@ -43,8 +43,8 @@ public class ClueBoost {
private Long whichUserId;
@Column(name = "status")
@ApiModelProperty(value = "是否赔付")
private Boolean status;
@ApiModelProperty(value = "1-一阶段 2-二阶段 3-满足未赔付 4-满足已赔付")
private Integer status=1;
@Column(name = "create_time")
@ApiModelProperty(value = "创建时间")
@ -54,14 +54,29 @@ public class ClueBoost {
@ApiModelProperty(value = "修改时间")
private Date updateTime;
public ClueBoost addClueBoost(Long clueId, Long memberId, Integer clueType, Long whichUserId) {
@Column(name = "first_time")
@ApiModelProperty(value = "第一次未接通时间")
private Date firstTime;
@Column(name = "last_time")
@ApiModelProperty(value = "最近一次未接通时间")
private Date lastTime;
@Column(name = "call_num")
@ApiModelProperty(value = "拨打次数")
private Integer callNum;
public ClueBoost addClueBoost(Long clueId, Long memberId, Integer clueType, Long whichUserId, Date firstTime) {
this.setClueId(clueId);
this.setMemberId(memberId);
this.setClueType(clueType);
this.setCreateTime(DateUtil.date());
this.setUpdateTime(DateUtil.date());
this.setWhichUserId(whichUserId);
this.setStatus(false);
this.setStatus(1);
this.setFirstTime(firstTime);
this.setLastTime(firstTime);
this.setCallNum(1);
return this;
}
}

@ -38,12 +38,14 @@ public class ClueBoostDTO {
*/
private Boolean status;
public ClueBoostDTO addClueBoostDTO(Long clueId, Long memberId, Long whichUserId, Integer clueType, Boolean status) {
public ClueBoostDTO addClueBoostDTO(Long clueId, Long memberId, Long whichUserId, Integer clueType, Boolean status, Date firstTime) {
this.setClueId(clueId);
this.setMemberId(memberId);
this.setWhichUserId(whichUserId);
this.setClueType(clueType);
this.setStatus(status);
this.setFirstTime(firstTime);
this.setLastTime(firstTime);
return this;
}
}

@ -13,7 +13,7 @@ import java.util.List;
@Data
public class ClueBoostQueryCriteria {
@Query
private Boolean status = false;
private Integer status = 3;
@Query
private Long whichUserId;

@ -0,0 +1,17 @@
package com.baiye.modules.telemarkting.entity.vo;
import lombok.Data;
/**
* @author wjt
* @date 2023/6/27
* 线
*/
@Data
public class ClueBoostVO {
private Integer status;
private String firstTime;
private String secondTime;
private String thirdTime;
}

@ -1,5 +1,6 @@
package com.baiye.modules.telemarkting.service;
import com.baiye.http.CommonResponse;
import com.baiye.modules.telemarkting.entity.dto.ClueBoostQueryCriteria;
import org.springframework.data.domain.Pageable;
@ -14,4 +15,8 @@ public interface ClueBoostService {
Object queryAll(ClueBoostQueryCriteria clueBoostQueryCriteria, Pageable pageable);
void compensate(Set<Long> ids);
CommonResponse<Object> queryCurrentStatus(Long clueId);
void testCall(Long clueId,Long memberId,Long whichUserId,Boolean status);
}

@ -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;
}
}

@ -1,5 +1,6 @@
package com.baiye.modules.telemarkting.service.impl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
@ -8,7 +9,6 @@ import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.baiye.common.CommonLog;
import com.baiye.constant.BusinessPartyType;
import com.baiye.constant.ClueTypeConstants;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.constant.KeyFieldConstants;
import com.baiye.exception.BadRequestException;
@ -38,7 +38,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Date;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
@ -326,8 +325,8 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
CompletableFuture.runAsync(() -> updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.ONE_NUMBER, allCallInfo.getClueType(), traceId));
status = false;
}
if (Arrays.asList(ClueTypeConstants.TOKER_TYPE).contains(allCallInfo.getClueType())) {
ClueBoostDTO clueBoostDTO = new ClueBoostDTO().addClueBoostDTO(allCallInfo.getClueId(), allCallInfo.getMemberId(), whichUserId, allCallInfo.getClueType(), null);
if (allCallInfo.getClueType() == DefaultNumberConstants.FOUR_NUMBER) {
ClueBoostDTO clueBoostDTO = new ClueBoostDTO().addClueBoostDTO(allCallInfo.getClueId(), allCallInfo.getMemberId(), whichUserId, allCallInfo.getClueType(), null, DateUtil.date());
clueBoostDTO.setStatus(status);
applicationContext.publishEvent(clueBoostDTO);
}
@ -432,9 +431,10 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
CompletableFuture.runAsync(() -> updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.ONE_NUMBER, allCallInfo.getClueType(), traceId));
status = false;
}
DateTime date = DateUtil.date();
//投流的才能享受赔付
if (allCallInfo.getClueType() == DefaultNumberConstants.FOUR_NUMBER) {
ClueBoostDTO clueBoostDTO = new ClueBoostDTO().addClueBoostDTO(allCallInfo.getClueId(), allCallInfo.getMemberId(), whichUserId, allCallInfo.getClueType(), null);
ClueBoostDTO clueBoostDTO = new ClueBoostDTO().addClueBoostDTO(allCallInfo.getClueId(), allCallInfo.getMemberId(), whichUserId, allCallInfo.getClueType(), null, date);
clueBoostDTO.setStatus(status);
applicationContext.publishEvent(clueBoostDTO);
}
@ -445,7 +445,7 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
allCallInfo.setRecordFlag(0);
allCallInfo.setRecordFileDownloadUrl(null);
}
allCallInfo.setCreateTime(DateUtil.date());
allCallInfo.setCreateTime(date);
int between = (int) DateUtil.between(response.getCalllog().getCallerRingTime(), response.getCalllog().getHangupTime(), DateUnit.SECOND);
allCallInfo.setExtensionRingTime(between);
allCallInfoRepository.save(allCallInfo);

Loading…
Cancel
Save