diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/api/TelephoneCallController.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/api/TelephoneCallController.java index f95042d6..d8ce1a0b 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/api/TelephoneCallController.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/api/TelephoneCallController.java @@ -1,9 +1,7 @@ package com.baiye.modules.telemarkting.api; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.baiye.constant.DefaultNumberConstants; @@ -17,7 +15,6 @@ import com.baiye.modules.platform.service.OrganizeService; import com.baiye.modules.system.service.UserService; import com.baiye.modules.telemarkting.entity.dto.*; import com.baiye.modules.telemarkting.service.TelephoneCallService; -import com.baiye.util.RedisUtils; import com.baiye.util.SecurityUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -44,72 +41,54 @@ import java.util.Date; public class TelephoneCallController { private final TelephoneCallService telephoneCallService; - private final OrganizeService organizeService; - private final CompanyService companyService; - private final UserService userService; - private final RedisUtils redisUtils; @PostMapping("/telephone/req") @ApiOperation("拨打电话") public CommonResponse doubleCallReq(@Validated @RequestBody TelephoneCallReqDTO telephoneCallReqDTO) { - String key = "tele:" + telephoneCallReqDTO.getUserData(); - if (redisUtils.get(key) != null) { - return CommonResponse.createByErrorMessage("请一分钟后再拨打此线索"); - } - - if (ObjectUtil.isEmpty(telephoneCallReqDTO)) { - return CommonResponse.createByError(); - } //判断账号是否到期 - Long currentUserId = SecurityUtils.getCurrentUserId(); - Date expirationTime = userService.findExpirationTimeByUserId(currentUserId); - log.info("============== the expirationTime as {} =============", expirationTime); + Date expirationTime = userService.findExpirationTimeByUserId(SecurityUtils.getCurrentUserId()); if (ObjectUtil.isNull(expirationTime) || DateUtil.compare(expirationTime, DateUtil.date()) < DefaultNumberConstants.ZERO_NUMBER) { return CommonResponse.createByErrorMessage("您的账号已到期,请续费后使用"); } Long companyId = SecurityUtils.getCompanyId(); - if (companyId != null) { - Organize organize; - if (telephoneCallReqDTO.getTeamId() == null) { - organize = organizeService.getOrganizeByUserId(telephoneCallReqDTO.getMemberId()); - telephoneCallReqDTO.setTeamId(organize.getId()); - } else { - organize = organizeService.findByOrganizeId(telephoneCallReqDTO.getTeamId()); - } - Company byId = companyService.findById(companyId); - if (organize != null && byId != null) { - //TODO 检查余额 - if (byId.getUserBalance() == null || byId.getUserBalance() <= 0) { - return CommonResponse.createByErrorMessage("余额不足,请充值后使用"); - } - if (organize.getCallMode() != null) { - switch (organize.getCallMode()) { - case DefaultNumberConstants.ZERO_NUMBER: - telephoneCallReqDTO.setCompanyName(byId.getCompanyName().trim()); - return telephoneCallService.doubleCallReq(telephoneCallReqDTO, companyId); - case DefaultNumberConstants.TWO_NUMBER: - if (StringUtils.isBlank(byId.getXGroup()) || StringUtils.isBlank(byId.getTelX())) { - throw new BadRequestException(ResponseCode.AXB_CONFIGURATION_ERROR.getDesc()); - } - telephoneCallReqDTO.setTelX(byId.getTelX()); - telephoneCallReqDTO.setXGroup(byId.getXGroup()); - return telephoneCallService.axbDialNumber(telephoneCallReqDTO, companyId); - case DefaultNumberConstants.ONE_NUMBER: - return telephoneCallService.rollCallReq(telephoneCallReqDTO, companyId); - default: - return CommonResponse.createByErrorMessage("未配置呼叫"); - } + Organize organize; + if (telephoneCallReqDTO.getTeamId() == null) { + organize = organizeService.getOrganizeByUserId(telephoneCallReqDTO.getMemberId()); + telephoneCallReqDTO.setTeamId(organize.getId()); + } else { + organize = organizeService.findByOrganizeId(telephoneCallReqDTO.getTeamId()); + } + Company company = companyService.findById(companyId); + if (ObjectUtil.isNull(organize) || ObjectUtil.isNull(company)) { + return CommonResponse.createByErrorMessage("缺失小组信息或公司信息"); + } + if (company.getUserBalance() == null || company.getUserBalance() <= 0) { + return CommonResponse.createByErrorMessage("余额不足,请充值后使用"); + } + if (organize.getCallMode() == null) { + return CommonResponse.createByErrorMessage("请指定呼叫方式后使用"); + } + //呼叫方式:0:双呼 1:点呼 2:AXB + switch (organize.getCallMode()) { + case DefaultNumberConstants.ZERO_NUMBER: + telephoneCallReqDTO.setCompanyName(company.getCompanyName().trim()); + return telephoneCallService.doubleCallReq(telephoneCallReqDTO, companyId); + case DefaultNumberConstants.TWO_NUMBER: + if (StringUtils.isBlank(company.getXGroup()) || StringUtils.isBlank(company.getTelX())) { + throw new BadRequestException(ResponseCode.AXB_CONFIGURATION_ERROR.getDesc()); } - } + telephoneCallReqDTO.setTelX(company.getTelX()); + telephoneCallReqDTO.setXGroup(company.getXGroup()); + return telephoneCallService.axbDialNumber(telephoneCallReqDTO, companyId); + case DefaultNumberConstants.ONE_NUMBER: + return telephoneCallService.rollCallReq(telephoneCallReqDTO, companyId); + default: + return CommonResponse.createByErrorMessage("未配置呼叫"); } - - redisUtils.set(key, RandomUtil.randomString(4), 60); - - return CommonResponse.createByError(); } @PostMapping("/back/cdrUrl") @@ -168,11 +147,9 @@ public class TelephoneCallController { if (ObjectUtil.isEmpty(rollCallBackDTO) || StrUtil.isEmpty(rollCallBackDTO.getSessionid())) { return CommonResponse.createByErrorMessage("参数为空"); } - log.info("点呼回调:{}", rollCallBackDTO); telephoneCallService.rollCallBack(rollCallBackDTO); } catch (Exception e) { - log.error("点呼回调话单错误 参数 :{}", json); - log.error("点呼回调话单错误,数据解析错误 :{}", e.getMessage()); + log.error("点呼回调话单错误 参数 :{},错误:{}", json, e.getMessage()); return CommonResponse.createByError(); } return CommonResponse.createBySuccess(); diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/dao/ExtensionNumberRepository.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/dao/ExtensionNumberRepository.java index 8b807ab3..83bc5236 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/dao/ExtensionNumberRepository.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/dao/ExtensionNumberRepository.java @@ -42,7 +42,7 @@ public interface ExtensionNumberRepository extends JpaRepository map = new HashMap<>(3); + map.put("requestId", REQUEST_ID); + map.put("company_name", COMPANY_NAME); + map.put("extension_number", number); + + HttpResponse httpResponse = sendReq(JSONUtil.toJsonStr(map)); + JSONObject jsonObject = JSONUtil.parseObj(httpResponse.body()); + if (String.valueOf(DefaultNumberConstants.ZERO_NUMBER).equals(jsonObject.getStr("result"))) { + return jsonObject.getStr("password"); + } else { + log.error("请求分机号sip失败,{}", jsonObject.getStr("reason")); + throw new BadRequestException("导入分机号失败"); + } + } + + private HttpResponse sendReq(String json) { + return HttpRequest.post(URL).body(json).execute(); + } +} diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/httpRequest/RollCallReq.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/httpRequest/RollCallReq.java index a1b46798..ca61049a 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/httpRequest/RollCallReq.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/httpRequest/RollCallReq.java @@ -60,7 +60,7 @@ public class RollCallReq { rollCallSystemDTO.setCdr_url(cdrUrl); rollCallSystemDTO.setDisplay_callee(String.valueOf(doubleCallReq.getDisplay())); rollCallSystemDTO.setDisplay_caller(String.valueOf(doubleCallReq.getDisplay())); - log.info("点呼请求对象:{}", BeanUtil.beanToMap(rollCallSystemDTO)); + log.info("点呼请求参数:{}", BeanUtil.beanToMap(rollCallSystemDTO)); //设置重试机制 int count = 0; @@ -68,7 +68,6 @@ public class RollCallReq { while (count <= flag) { try { String httpResponse = sendCallReq(BeanUtil.beanToMap(rollCallSystemDTO), reqUrl, authorization); - log.info("点呼返回值为 {}", httpResponse); RollCallResponse doubleCallResponse = JSONUtil.toBean(httpResponse, RollCallResponse.class); if (String.valueOf (DefaultNumberConstants.ZERO_NUMBER) @@ -98,13 +97,12 @@ public class RollCallReq { JSONObject json = new JSONObject(); json.putOpt("callid", telephoneCallStopDTO.getSessionid()); JSONObject jsonObject = new JSONObject(); - jsonObject.putOpt("req_id",telephoneCallStopDTO.getCallId()); + jsonObject.putOpt("req_id", telephoneCallStopDTO.getCallId()); jsonObject.putOpt("type", "hangup"); jsonObject.putOpt("bsname", "aibot"); jsonObject.putOpt("body", json); HttpResponse httpResponse = HttpRequest.post(stopUrl).body(JSONUtil.toJsonPrettyStr(jsonObject)).execute(); if (httpResponse.isOk()) { - log.info("请求挂断成功,返回值:{}", httpResponse.body()); return Boolean.TRUE; } else { count++; diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/service/impl/ExtensionNumberServiceImpl.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/service/impl/ExtensionNumberServiceImpl.java index 0929a3b2..c7844241 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/service/impl/ExtensionNumberServiceImpl.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/service/impl/ExtensionNumberServiceImpl.java @@ -18,6 +18,7 @@ import com.baiye.modules.telemarkting.dao.ExtensionUserRepository; import com.baiye.modules.telemarkting.entity.ExtensionDisplay; import com.baiye.modules.telemarkting.entity.ExtensionNumber; import com.baiye.modules.telemarkting.entity.ExtensionUser; +import com.baiye.modules.telemarkting.httpRequest.NumberSipReq; import com.baiye.modules.telemarkting.service.ExtensionNumberService; import com.baiye.util.SecurityUtils; import lombok.extern.slf4j.Slf4j; @@ -48,6 +49,8 @@ public class ExtensionNumberServiceImpl implements ExtensionNumberService { private UserRepository userRepository; @Resource private OrganizeRepository organizeRepository; + @Resource + private NumberSipReq numberSipReq; @Override @Transactional(rollbackFor = Exception.class) @@ -92,6 +95,8 @@ public class ExtensionNumberServiceImpl implements ExtensionNumberService { ExtensionNumber extensionNumber = new ExtensionNumber(); extensionNumber.setNumber(Integer.valueOf(number)); extensionNumber.setCompanyId(companyId); + String sip = numberSipReq.req(number); + extensionNumber.setSip(sip); list.add(extensionNumber); numbers.add(Integer.valueOf(number)); } @@ -186,7 +191,9 @@ public class ExtensionNumberServiceImpl implements ExtensionNumberService { extensionUserRepository.deleteByMemberId(userId); } else { int i = extensionUserRepository.deleteByMemberId(replaceUserId); - if (i > 0) extensionNumberRepository.updateExtensionNumber(0, replaceUserId); + if (i > 0) { + extensionNumberRepository.updateExtensionNumber(0, replaceUserId); + } extensionUserRepository.updateByNumber(userId, replaceUserId); } } @@ -220,7 +227,9 @@ public class ExtensionNumberServiceImpl implements ExtensionNumberService { extensionNumberRepository.updateStatusById(0, extensionUser.getNumber()); } } else { - if (organize.getCallMode() == 1) this.assignExtensionNum(organizeId, userId); + if (organize.getCallMode() == 1) { + this.assignExtensionNum(organizeId, userId); + } } } } diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/service/impl/TelephoneCallServiceImpl.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/service/impl/TelephoneCallServiceImpl.java index 333f7ff1..dda9d696 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/service/impl/TelephoneCallServiceImpl.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/service/impl/TelephoneCallServiceImpl.java @@ -44,7 +44,6 @@ public class TelephoneCallServiceImpl implements TelephoneCallService { @Resource private AxbRequest axbRequest; - @Resource private DoubleCallReq doubleCallReq; @Resource @@ -56,7 +55,7 @@ public class TelephoneCallServiceImpl implements TelephoneCallService { @Resource private SourceClueClient sourceClueClient; @Resource - private ExtensionNumberRepository extensionNumberRepository; + private ExtensionUserRepository extensionUserRepository; @Resource private ExtensionDisplayRepository extensionDisplayRepository; @Resource @@ -206,58 +205,71 @@ public class TelephoneCallServiceImpl implements TelephoneCallService { telephoneCallReqDTO.setRequestId(requestId); if (telephoneCallReqDTO.getDisplay() == null || telephoneCallReqDTO.getTelA() == null) { //获取分机号 - //TODO 新需求,外显号多个 - ExtensionNumber extensionNumber = extensionNumberRepository.selectByMemberId(telephoneCallReqDTO.getMemberId()); - if (extensionNumber == null) { - log.error("未配置分机号"); - return CommonResponse.createByErrorMessage("未配置分机号"); + Integer number = extensionUserRepository.findNumberByMemberId(telephoneCallReqDTO.getMemberId()); + if (number == null) { + return CommonResponse.createByErrorMessage("未分配分机号"); } - ExtensionDisplay extensionDisplay = extensionDisplayRepository.findExtensionDisplayByCompanyId(extensionNumber.getCompanyId()); + ExtensionDisplay extensionDisplay = extensionDisplayRepository.findExtensionDisplayByCompanyId(companyId); if (ObjectUtil.isNull(extensionDisplay)) { return CommonResponse.createByErrorMessage("未配置去显号"); } - telephoneCallReqDTO.setTelA(String.valueOf(extensionNumber.getNumber())); - + telephoneCallReqDTO.setTelA(String.valueOf(number)); + //获取去显号 Long display; - if (telephoneCallReqDTO.getClueType() == DefaultNumberConstants.THREE_NUMBER) { - if (extensionDisplay.getDyDisplay() == null) { - return CommonResponse.createByErrorMessage("未配置抖音去显号"); - } - display = extensionDisplay.getDyDisplay(); - } else if (telephoneCallReqDTO.getClueType() == DefaultNumberConstants.FOUR_NUMBER) { - if (extensionDisplay.getDeliveryDisplay() == null) { - return CommonResponse.createByErrorMessage("未配置投流去显号"); - } - display = extensionDisplay.getDeliveryDisplay(); - } else if (telephoneCallReqDTO.getClueType() == DefaultNumberConstants.FIVE_NUMBER) { - if (extensionDisplay.getTokerDisplay() == null) { - return CommonResponse.createByErrorMessage("未配置拓客去显号"); - } - display = extensionDisplay.getTokerDisplay(); - } else { - if (extensionDisplay.getDisplay() == null) { - return CommonResponse.createByErrorMessage("未配置去显号"); - } - display = extensionDisplay.getDisplay(); + 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); } - //获取线索号 + + //获取被叫号 Clue body; try { body = sourceClueClient.queryDetails(Long.parseLong(telephoneCallReqDTO.getUserData())).getBody(); } catch (Exception e) { - log.error("Method 【rollCallReq】query clue error:{},time:{} ", e.getMessage(), DateUtil.now()); - throw new BadRequestException("查询线索错误"); + log.error("获取被叫号错误:{},time:{} ", e.getMessage(), DateUtil.now()); + throw new BadRequestException("呼叫失败"); } if (ObjectUtil.isNull(body) || StrUtil.isEmpty(body.getNid())) { log.error("未获取到号码"); return CommonResponse.createByErrorMessage("未获取到号码"); } telephoneCallReqDTO.setTelB("474" + telephoneCallReqDTO.getDisplay() + body.getNid()); + //请求呼叫 String reqId = rollCallReq.startReq(telephoneCallReqDTO); + //保存呼叫记录 + CallClueInfo clueInfo = new CallClueInfo(); + clueInfo.setClueId(Long.parseLong(telephoneCallReqDTO.getUserData())); + clueInfo.setTeamId(telephoneCallReqDTO.getTeamId()); + clueInfo.setMemberId(telephoneCallReqDTO.getMemberId()); + clueInfo.setStatus(DefaultNumberConstants.ONE_NUMBER); + clueInfo.setTaskId(telephoneCallReqDTO.getTaskId()); + clueInfo.setCompanyId(companyId); + callClueRepository.save(clueInfo); + //保存呼叫详情 AllCallInfo allCallInfo = new AllCallInfo(); allCallInfo.setSessionId(requestId); allCallInfo.setRequestId(requestId); @@ -267,16 +279,8 @@ public class TelephoneCallServiceImpl implements TelephoneCallService { allCallInfo.setStatus(DefaultNumberConstants.ONE_NUMBER); allCallInfo.setType(DefaultNumberConstants.TWO_NUMBER); allCallInfo.setRecordFlag(DefaultNumberConstants.ZERO_NUMBER); - - CallClueInfo clueInfo = new CallClueInfo(); - clueInfo.setClueId(Long.parseLong(telephoneCallReqDTO.getUserData())); - clueInfo.setTeamId(telephoneCallReqDTO.getTeamId()); - clueInfo.setMemberId(telephoneCallReqDTO.getMemberId()); - clueInfo.setStatus(DefaultNumberConstants.ONE_NUMBER); - clueInfo.setTaskId(telephoneCallReqDTO.getTaskId()); - clueInfo.setCompanyId(companyId); allCallInfoRepository.save(allCallInfo); - callClueRepository.save(clueInfo); + TelephoneCallStopDTO telephoneCallStopDTO = new TelephoneCallStopDTO(); telephoneCallStopDTO.setSessionid(reqId); telephoneCallStopDTO.setCallId(requestId); @@ -303,20 +307,21 @@ public class TelephoneCallServiceImpl implements TelephoneCallService { String otherLeg = rollCallBackDTO.getOtherLeg(); AllCallInfo allCallInfo = allCallInfoRepository.findBySessionId(otherLeg); -// int status = DefaultNumberConstants.ONE_NUMBER; if (ObjectUtil.isNotEmpty(allCallInfo)) { //相同说明是分机号的回调 if (sessionId.equals(otherLeg) && StrUtil.isNotBlank(rollCallBackDTO.getRecord_file_url())) { + log.info("分机回调-点呼:sessionId:{},详情:{}", sessionId, rollCallBackDTO); allCallInfoRepository.updateByRecord(DefaultNumberConstants.ONE_NUMBER, rollCallBackDTO.getRecord_file_url(), allCallInfo.getId()); } else { + log.info("被叫回调-点呼:sessionId:{},详情:{}", sessionId, rollCallBackDTO); //拨打线索号的回调 if (StrUtil.isNotBlank(rollCallBackDTO.getCallee_answer_time())) { - //表示接通 + //表示接通,更新线索状态 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())); - //TODO 实时扣除话费 + //实时扣除话费 callCostCount(allCallInfo.getMemberId(), allCallInfo.getClueId(), allCallInfo.getClueType(), Integer.valueOf(rollCallBackDTO.getDuration()), 2); } else { //更新资源通话状态