|
|
|
@ -5,6 +5,8 @@ import cn.hutool.core.text.CharSequenceUtil;
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
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.exception.BadRequestException;
|
|
|
|
@ -17,7 +19,6 @@ import com.baiye.modules.agent.repository.ChannelCustomRepository;
|
|
|
|
|
import com.baiye.modules.platform.domain.CallDeduct;
|
|
|
|
|
import com.baiye.modules.platform.domain.Clue;
|
|
|
|
|
import com.baiye.modules.platform.repository.CallDeductRepository;
|
|
|
|
|
import com.baiye.modules.platform.service.CompanyService;
|
|
|
|
|
import com.baiye.modules.system.service.UserService;
|
|
|
|
|
import com.baiye.modules.telemarkting.dao.*;
|
|
|
|
|
import com.baiye.modules.telemarkting.entity.*;
|
|
|
|
@ -26,6 +27,7 @@ import com.baiye.modules.telemarkting.httpRequest.AxbRequest;
|
|
|
|
|
import com.baiye.modules.telemarkting.httpRequest.DoubleCallReq;
|
|
|
|
|
import com.baiye.modules.telemarkting.httpRequest.RollCallReq;
|
|
|
|
|
import com.baiye.modules.telemarkting.service.TelephoneCallService;
|
|
|
|
|
import com.baiye.util.RedisUtils;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.springframework.context.ApplicationContext;
|
|
|
|
|
import org.springframework.http.ResponseEntity;
|
|
|
|
@ -37,6 +39,7 @@ import java.util.Arrays;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.Objects;
|
|
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @author wjt
|
|
|
|
@ -63,8 +66,6 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
|
|
|
|
|
@Resource
|
|
|
|
|
private ExtensionDisplayRepository extensionDisplayRepository;
|
|
|
|
|
@Resource
|
|
|
|
|
private CompanyService companyService;
|
|
|
|
|
@Resource
|
|
|
|
|
private CallDeductRepository callDeductRepository;
|
|
|
|
|
@Resource
|
|
|
|
|
private UserService userService;
|
|
|
|
@ -74,6 +75,9 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
|
|
|
|
|
@Resource
|
|
|
|
|
private ChannelCustomRepository channelCustomRepository;
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private RedisUtils redisUtils;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public CommonResponse<TelephoneCallStopDTO> doubleCallReq(TelephoneCallReqDTO doubleCallReq, Long companyId) {
|
|
|
|
|
String requestId = RandomUtil.randomString(10);
|
|
|
|
@ -133,10 +137,10 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
|
|
|
|
|
//实时扣费
|
|
|
|
|
callCostCount(allCallInfo.getMemberId(), allCallInfo.getClueId(), allCallInfo.getClueType(), allCallInfo.getDuration(), DefaultNumberConstants.TWO_NUMBER, whichUserId);
|
|
|
|
|
//更新资源通话状态
|
|
|
|
|
CompletableFuture.runAsync(() -> updateSourceCallStatus(userDate, DefaultNumberConstants.TWO_NUMBER, allCallInfo.getClueType()));
|
|
|
|
|
CompletableFuture.runAsync(() -> updateSourceCallStatus(userDate, DefaultNumberConstants.TWO_NUMBER, allCallInfo.getClueType(), null));
|
|
|
|
|
} else {
|
|
|
|
|
//更新资源通话状态
|
|
|
|
|
CompletableFuture.runAsync(() -> updateSourceCallStatus(userDate, DefaultNumberConstants.ONE_NUMBER, allCallInfo.getClueType()));
|
|
|
|
|
CompletableFuture.runAsync(() -> updateSourceCallStatus(userDate, DefaultNumberConstants.ONE_NUMBER, allCallInfo.getClueType(), null));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -186,64 +190,29 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
|
|
|
|
|
Long whichUserId = user.getWhichUserId();
|
|
|
|
|
Integer surplusPhoneBillByUserId = channelCustomRepository.findSurplusPhoneBillByUserId(whichUserId);
|
|
|
|
|
if (surplusPhoneBillByUserId == null || surplusPhoneBillByUserId <= 0) {
|
|
|
|
|
CommonLog.error("话费不足");
|
|
|
|
|
return CommonResponse.createByErrorMessage("话费不足");
|
|
|
|
|
}
|
|
|
|
|
String requestId = RandomUtil.randomString(10);
|
|
|
|
|
telephoneCallReqDTO.setRequestId(requestId);
|
|
|
|
|
if (telephoneCallReqDTO.getDisplay() == null || telephoneCallReqDTO.getTelA() == null) {
|
|
|
|
|
//获取分机号
|
|
|
|
|
Integer number = extensionUserRepository.findNumberByMemberId(telephoneCallReqDTO.getMemberId());
|
|
|
|
|
if (number == null) {
|
|
|
|
|
return CommonResponse.createByErrorMessage("未分配分机号");
|
|
|
|
|
}
|
|
|
|
|
ExtensionDisplay extensionDisplay = extensionDisplayRepository.findExtensionDisplayByCompanyId(companyId);
|
|
|
|
|
if (ObjectUtil.isNull(extensionDisplay)) {
|
|
|
|
|
return CommonResponse.createByErrorMessage("未配置去显号");
|
|
|
|
|
}
|
|
|
|
|
telephoneCallReqDTO.setTelA(String.valueOf(number));
|
|
|
|
|
//获取去显号
|
|
|
|
|
Long display;
|
|
|
|
|
switch (telephoneCallReqDTO.getClueType()) {
|
|
|
|
|
case DefaultNumberConstants.THREE_NUMBER:
|
|
|
|
|
if (extensionDisplay.getDyDisplay() == null) {
|
|
|
|
|
return CommonResponse.createByErrorMessage("未配置抖音去显号");
|
|
|
|
|
}
|
|
|
|
|
display = extensionDisplay.getDyDisplay();
|
|
|
|
|
break;
|
|
|
|
|
case DefaultNumberConstants.FOUR_NUMBER:
|
|
|
|
|
if (extensionDisplay.getDeliveryDisplay() == null) {
|
|
|
|
|
return CommonResponse.createByErrorMessage("未配置投流去显号");
|
|
|
|
|
}
|
|
|
|
|
display = extensionDisplay.getDeliveryDisplay();
|
|
|
|
|
break;
|
|
|
|
|
case DefaultNumberConstants.FIVE_NUMBER:
|
|
|
|
|
if (extensionDisplay.getTokerDisplay() == null) {
|
|
|
|
|
return CommonResponse.createByErrorMessage("未配置拓客去显号");
|
|
|
|
|
}
|
|
|
|
|
display = extensionDisplay.getTokerDisplay();
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
if (extensionDisplay.getDisplay() == null) {
|
|
|
|
|
return CommonResponse.createByErrorMessage("未配置去显号");
|
|
|
|
|
}
|
|
|
|
|
display = extensionDisplay.getDisplay();
|
|
|
|
|
}
|
|
|
|
|
telephoneCallReqDTO.setDisplay(display);
|
|
|
|
|
//获取去显号和分机号
|
|
|
|
|
getNumberAndDisplay(telephoneCallReqDTO, companyId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//获取被叫号
|
|
|
|
|
CallClueDTO body;
|
|
|
|
|
try {
|
|
|
|
|
body = sourceClueClient.queryDetailsByClueType(Long.parseLong(telephoneCallReqDTO.getUserData()), telephoneCallReqDTO.getClueType()).getBody();
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("获取被叫号错误:{},time:{} ", e.getMessage(), DateUtil.now());
|
|
|
|
|
CommonLog.error("呼叫失败");
|
|
|
|
|
throw new BadRequestException("呼叫失败");
|
|
|
|
|
}
|
|
|
|
|
if (ObjectUtil.isNull(body) || StrUtil.isEmpty(body.getNid())) {
|
|
|
|
|
log.error("未获取到号码");
|
|
|
|
|
CommonLog.error("未获取到号码");
|
|
|
|
|
return CommonResponse.createByErrorMessage("未获取到号码");
|
|
|
|
|
}
|
|
|
|
|
if (body.getMemberId() == null) {
|
|
|
|
|
CommonLog.error("线索未分配");
|
|
|
|
|
return CommonResponse.createByErrorMessage("线索未分配,请刷新后重试");
|
|
|
|
|
}
|
|
|
|
|
telephoneCallReqDTO.setTelB("474" + telephoneCallReqDTO.getDisplay() + body.getNid());
|
|
|
|
@ -256,12 +225,61 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
|
|
|
|
|
CallClueInfo clueInfo = new CallClueInfo().init(Long.parseLong(telephoneCallReqDTO.getUserData()), telephoneCallReqDTO.getTeamId(), telephoneCallReqDTO.getMemberId(), telephoneCallReqDTO.getTaskId(), companyId, DefaultNumberConstants.ONE_NUMBER);
|
|
|
|
|
callClueRepository.save(clueInfo);
|
|
|
|
|
|
|
|
|
|
redisUtils.set(requestId, CommonLog.getTraceId(), 3, TimeUnit.HOURS);
|
|
|
|
|
TelephoneCallStopDTO telephoneCallStopDTO = new TelephoneCallStopDTO();
|
|
|
|
|
telephoneCallStopDTO.setSessionid(reqId);
|
|
|
|
|
telephoneCallStopDTO.setCallId(requestId);
|
|
|
|
|
return CommonResponse.createBySuccess(telephoneCallStopDTO);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void getNumberAndDisplay(TelephoneCallReqDTO telephoneCallReqDTO, Long companyId) {
|
|
|
|
|
//获取分机号
|
|
|
|
|
Integer number = extensionUserRepository.findNumberByMemberId(telephoneCallReqDTO.getMemberId());
|
|
|
|
|
if (number == null) {
|
|
|
|
|
CommonLog.error("未分配分机号");
|
|
|
|
|
throw new BadRequestException("未分配分机号");
|
|
|
|
|
}
|
|
|
|
|
ExtensionDisplay extensionDisplay = extensionDisplayRepository.findExtensionDisplayByCompanyId(companyId);
|
|
|
|
|
if (ObjectUtil.isNull(extensionDisplay)) {
|
|
|
|
|
CommonLog.error("未配置去显号");
|
|
|
|
|
throw new BadRequestException("未配置去显号");
|
|
|
|
|
}
|
|
|
|
|
telephoneCallReqDTO.setTelA(String.valueOf(number));
|
|
|
|
|
//获取去显号
|
|
|
|
|
Long display;
|
|
|
|
|
switch (telephoneCallReqDTO.getClueType()) {
|
|
|
|
|
case DefaultNumberConstants.THREE_NUMBER:
|
|
|
|
|
if (extensionDisplay.getDyDisplay() == null) {
|
|
|
|
|
CommonLog.error("未配置抖音去显号");
|
|
|
|
|
throw new BadRequestException("未配置抖音去显号");
|
|
|
|
|
}
|
|
|
|
|
display = extensionDisplay.getDyDisplay();
|
|
|
|
|
break;
|
|
|
|
|
case DefaultNumberConstants.FOUR_NUMBER:
|
|
|
|
|
if (extensionDisplay.getDeliveryDisplay() == null) {
|
|
|
|
|
CommonLog.error("未配置投流去显号");
|
|
|
|
|
throw new BadRequestException("未配置投流去显号");
|
|
|
|
|
}
|
|
|
|
|
display = extensionDisplay.getDeliveryDisplay();
|
|
|
|
|
break;
|
|
|
|
|
case DefaultNumberConstants.FIVE_NUMBER:
|
|
|
|
|
if (extensionDisplay.getTokerDisplay() == null) {
|
|
|
|
|
CommonLog.error("未配置拓客去显号");
|
|
|
|
|
throw new BadRequestException("未配置拓客去显号");
|
|
|
|
|
}
|
|
|
|
|
display = extensionDisplay.getTokerDisplay();
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
if (extensionDisplay.getDisplay() == null) {
|
|
|
|
|
CommonLog.error("未配置去显号");
|
|
|
|
|
throw new BadRequestException("未配置去显号");
|
|
|
|
|
}
|
|
|
|
|
display = extensionDisplay.getDisplay();
|
|
|
|
|
}
|
|
|
|
|
telephoneCallReqDTO.setDisplay(display);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public CommonResponse<Object> rollCallStop(TelephoneCallStopDTO telephoneCallStopDTO) {
|
|
|
|
|
if (rollCallReq.stopReq(telephoneCallStopDTO)) {
|
|
|
|
@ -278,17 +296,19 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
|
public void rollCallBack(RollCallBackDTO rollCallBackDTO) {
|
|
|
|
|
|
|
|
|
|
String sessionId = rollCallBackDTO.getSessionid();
|
|
|
|
|
String otherLeg = rollCallBackDTO.getOtherLeg();
|
|
|
|
|
String traceId = String.valueOf(redisUtils.get(otherLeg));
|
|
|
|
|
|
|
|
|
|
AllCallInfo allCallInfo = allCallInfoRepository.findBySessionId(otherLeg);
|
|
|
|
|
if (ObjectUtil.isNotEmpty(allCallInfo)) {
|
|
|
|
|
//相同说明是分机号的回调
|
|
|
|
|
if (sessionId.equals(otherLeg) && StrUtil.isNotBlank(rollCallBackDTO.getRecord_file_url())) {
|
|
|
|
|
log.info("分机回调-点呼:otherLeg:{},详情:{}", otherLeg, rollCallBackDTO);
|
|
|
|
|
CommonLog.infoBusinessPartyTypeNewTraceId("分机回调-点呼:" + rollCallBackDTO, BusinessPartyType.DB, traceId);
|
|
|
|
|
allCallInfoRepository.updateByRecord(DefaultNumberConstants.ONE_NUMBER, rollCallBackDTO.getRecord_file_url(), allCallInfo.getId());
|
|
|
|
|
} else {
|
|
|
|
|
log.info("被叫回调-点呼:otherLeg:{},详情:{}", otherLeg, rollCallBackDTO);
|
|
|
|
|
CommonLog.infoBusinessPartyType("被叫回调-点呼:" + rollCallBackDTO, BusinessPartyType.DB);
|
|
|
|
|
UserDto user = userService.findById(allCallInfo.getMemberId());
|
|
|
|
|
Long whichUserId = user.getWhichUserId();
|
|
|
|
|
boolean status;
|
|
|
|
@ -298,13 +318,13 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
|
|
|
|
|
callClueRepository.updateByStatus(DefaultNumberConstants.TWO_NUMBER, allCallInfo.getClueId());
|
|
|
|
|
allCallInfoRepository.updateByDurationAndStatus(DefaultNumberConstants.TWO_NUMBER, Integer.valueOf(rollCallBackDTO.getDuration()), allCallInfo.getId());
|
|
|
|
|
//更新资源通话状态
|
|
|
|
|
CompletableFuture.runAsync(() -> updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.TWO_NUMBER, allCallInfo.getClueType()));
|
|
|
|
|
CompletableFuture.runAsync(() -> updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.TWO_NUMBER, allCallInfo.getClueType(), traceId));
|
|
|
|
|
//实时扣除话费
|
|
|
|
|
callCostCount(allCallInfo.getMemberId(), allCallInfo.getClueId(), allCallInfo.getClueType(), Integer.valueOf(rollCallBackDTO.getDuration()), 2, whichUserId);
|
|
|
|
|
status = true;
|
|
|
|
|
} else {
|
|
|
|
|
//更新资源通话状态
|
|
|
|
|
CompletableFuture.runAsync(() -> updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.ONE_NUMBER, allCallInfo.getClueType()));
|
|
|
|
|
CompletableFuture.runAsync(() -> updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.ONE_NUMBER, allCallInfo.getClueType(), traceId));
|
|
|
|
|
status = false;
|
|
|
|
|
}
|
|
|
|
|
if (Arrays.asList(ClueTypeConstants.TOKER_TYPE).contains(allCallInfo.getClueType())) {
|
|
|
|
@ -322,14 +342,17 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
|
|
|
|
|
* @param clueId 资源ID
|
|
|
|
|
* @param status 1:未接听 2:已接通
|
|
|
|
|
*/
|
|
|
|
|
private void updateSourceCallStatus(Long clueId, Integer status, Integer clueType) {
|
|
|
|
|
private void updateSourceCallStatus(Long clueId, Integer status, Integer clueType, String traceId) {
|
|
|
|
|
ClueMiddle clueMiddle = new ClueMiddle();
|
|
|
|
|
clueMiddle.setClueId(clueId);
|
|
|
|
|
clueMiddle.setClueCallStatus(status);
|
|
|
|
|
clueMiddle.setOptimisticVersion(DefaultNumberConstants.THREE_NUMBER);
|
|
|
|
|
clueMiddle.setNewestCallTime(new Date());
|
|
|
|
|
clueMiddle.setClueType(clueType);
|
|
|
|
|
sourceClueClient.update(clueMiddle);
|
|
|
|
|
int code = sourceClueClient.update(clueMiddle).getStatus();
|
|
|
|
|
if (code != 0) {
|
|
|
|
|
CommonLog.infoTraceId("通话同步状态错误", traceId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -405,6 +428,8 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
|
|
|
|
|
if (num > 0) {
|
|
|
|
|
save.setStatus(true);
|
|
|
|
|
callDeductRepository.save(save);
|
|
|
|
|
} else {
|
|
|
|
|
CommonLog.error("话费扣除失败,记录id:" + save.getId());
|
|
|
|
|
}
|
|
|
|
|
// else {
|
|
|
|
|
// updateBalance(mul, companyId, version + 1, save);
|
|
|
|
|