修改呼叫信息保存逻辑

master
wujingtao 3 years ago
parent 4e248c5324
commit 443ac3c909

@ -9,7 +9,6 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.http.CommonResponse;
import com.baiye.model.enums.CallStatusEnum;
import com.baiye.modules.report.entity.dto.StatisticalReportDTO;
import com.baiye.modules.report.entity.dto.UploadTaskDTO;
import com.baiye.modules.report.entity.vo.MemberInfoVO;
@ -20,8 +19,9 @@ import com.baiye.modules.system.domain.User;
import com.baiye.modules.system.repository.OrganizeRepository;
import com.baiye.modules.system.repository.TaskRepository;
import com.baiye.modules.system.repository.UserRepository;
import com.baiye.modules.telemarkting.dao.AllCallInfoRepository;
import com.baiye.modules.telemarkting.dao.CallClueRepository;
import com.baiye.modules.telemarkting.dao.DoubleCallRepository;
import com.baiye.modules.telemarkting.entity.AllCallInfo;
import com.baiye.modules.telemarkting.entity.CallClueInfo;
import com.baiye.modules.telemarkting.entity.DoubleCallInfo;
import com.baiye.util.DateTimeUtil;
@ -45,7 +45,7 @@ public class ReportServiceImpl implements ReportService {
@Resource
private CallClueRepository callClueRepository;
@Resource
private DoubleCallRepository doubleCallRepository;
private AllCallInfoRepository allCallInfoRepository;
@Resource
private TaskRepository taskRepository;
@Resource
@ -471,11 +471,11 @@ public class ReportServiceImpl implements ReportService {
for (CallClueInfo info : callClueInfos) {
//接通时才会有通话时长
long clueId = info.getClueId();
List<DoubleCallInfo> doubleCallInfo = doubleCallRepository.selectAllByTimeAndClueId(begin, end, clueId);
List<AllCallInfo> doubleCallInfo = allCallInfoRepository.selectAllByTimeAndClueId(begin, end, clueId);
//统计通话时长
int doubleClueTime = 0;
if (CollUtil.isNotEmpty(doubleCallInfo)) {
doubleClueTime = doubleCallInfo.stream().mapToInt(DoubleCallInfo::getDuration).sum();
doubleClueTime = doubleCallInfo.stream().mapToInt(AllCallInfo::getDuration).sum();
if (doubleClueTime > 0) {
//有通话时长 说明电话打通
turnOnNum++;

@ -0,0 +1,62 @@
package com.baiye.modules.telemarkting.api;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.baiye.http.CommonResponse;
import com.baiye.modules.telemarkting.entity.dto.DoubleCallBackDTO;
import com.baiye.modules.telemarkting.entity.dto.DoubleCallReqDTO;
import com.baiye.modules.telemarkting.entity.dto.RollCallBackDTO;
import com.baiye.modules.telemarkting.service.RollCallService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author wujingtao
* @date 2022/02/10
*/
@Slf4j
@RestController
@RequestMapping("/api")
@Api(tags = "对接点呼")
@RequiredArgsConstructor
public class RollCallController {
@Resource
private RollCallService rollCallService;
@PostMapping("/roll/req")
@ApiOperation("请求接入点呼")
public CommonResponse<Object> rollCallReq(@Validated @RequestBody DoubleCallReqDTO doubleCallReq) {
if (ObjectUtil.isEmpty(doubleCallReq)) {
return CommonResponse.createByError();
}
return rollCallService.rollCallReq(doubleCallReq);
}
@PostMapping("/roll/cdrUrl")
@ApiOperation("点呼系统回调话单")
public CommonResponse<String> doubleCallBack(@RequestBody String json) {
try {
RollCallBackDTO rollCallBackDTO = JSONUtil.toBean(json, RollCallBackDTO.class);
if (ObjectUtil.isEmpty(rollCallBackDTO) || StrUtil.isEmpty(rollCallBackDTO.getSessionid())) {
return CommonResponse.createByErrorMessage("参数为空");
}
log.info("=======点呼回调话单: {}", rollCallBackDTO);
rollCallService.rollCallBack(rollCallBackDTO);
} catch (Exception e) {
log.error("点呼回调话单错误 参数 {}", json);
log.error("点呼回调话单错误,数据解析错误 {}", e.getMessage());
return CommonResponse.createByError();
}
return CommonResponse.createBySuccess();
}
}

@ -1,6 +1,6 @@
package com.baiye.modules.telemarkting.dao;
import com.baiye.modules.telemarkting.entity.DoubleCallInfo;
import com.baiye.modules.telemarkting.entity.AllCallInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
@ -10,11 +10,11 @@ import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author wjt
* @date 2021/12/06
* @author wujingtao
* @date 2022/02/10
*/
@Repository
public interface DoubleCallRepository extends JpaRepository<DoubleCallInfo, Long>, JpaSpecificationExecutor<DoubleCallInfo> {
public interface AllCallInfoRepository extends JpaRepository<AllCallInfo, Long>, JpaSpecificationExecutor<AllCallInfo> {
/**
* id
@ -22,7 +22,7 @@ public interface DoubleCallRepository extends JpaRepository<DoubleCallInfo, Long
* @param sessionId
* @return
*/
DoubleCallInfo findBySessionId(String sessionId);
AllCallInfo findBySessionId(String sessionId);
/**
*
@ -32,11 +32,11 @@ public interface DoubleCallRepository extends JpaRepository<DoubleCallInfo, Long
* @param id
* @return
*/
@Query(value = "select * from tb_double_call d where (d.create_time between ?1 and ?2) and d.clue_id = ?3", nativeQuery = true)
List<DoubleCallInfo> selectAllByTimeAndClueId(String beginTime, String endTime, Long id);
@Query(value = "select * from tb_call_info d where (d.create_time between ?1 and ?2) and d.clue_id = ?3", nativeQuery = true)
List<AllCallInfo> selectAllByTimeAndClueId(String beginTime, String endTime, Long id);
@Modifying
@Query(value = "update DoubleCallInfo d set d.status =?1 where d.sessionId = ?2")
@Query(value = "update AllCallInfo d set d.status =?1 where d.sessionId = ?2")
void updateByStatus(Integer status, String sessionId);
/**
@ -47,7 +47,6 @@ public interface DoubleCallRepository extends JpaRepository<DoubleCallInfo, Long
* @param status
* @return
*/
@Query(value = "select d from DoubleCallInfo d where d.clueId=?1 and d.memberId=?2 and d.status=?3")
List<DoubleCallInfo> findByClueIdAndMemberId(Long clueId, Long memberId, Integer status);
@Query(value = "select d from AllCallInfo d where d.clueId=?1 and d.memberId=?2 and d.status=?3")
List<AllCallInfo> findByClueIdAndMemberId(Long clueId, Long memberId, Integer status);
}

@ -0,0 +1,73 @@
package com.baiye.modules.telemarkting.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
/**
* @author wujingtao
* @date 2022/02/10
*
*/
@Getter
@Setter
@Entity
@Table(name = "tb_call_info")
@EntityListeners(AuditingEntityListener.class)
public class AllCallInfo implements Serializable {
private static final long serialVersionUID = -4568384407605608189L;
@Id
@ApiModelProperty(value = "主键id自动递增")
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "status")
@ApiModelProperty(value = "状态")
private Integer status;
@Column(name = "type")
@ApiModelProperty(value = "类型")
private Integer type;
@Column(name = "session_id")
@ApiModelProperty(value = "回调的sessionId")
private String sessionId;
@Column(name = "request_id")
@ApiModelProperty(value = "请求的唯一id")
private String requestId;
@Column(name = "clue_id")
@ApiModelProperty(value = "线索id")
private Long clueId;
@Column(name = "member_id")
@ApiModelProperty(value = "所属人id")
private Long memberId;
@LastModifiedDate
@Column(name = "create_time")
@ApiModelProperty(value = "创建时间")
private Date createTime;
@Column(name = "duration")
@ApiModelProperty(value = "通话时长")
private Integer duration = 0;
@Column(name = "record_flag")
@ApiModelProperty(value = "该字段用于录音标识 0未有 1有")
private Integer recordFlag;
@Column(name = "record_file_download_url")
@ApiModelProperty(value = "录音下载地址")
private String recordFileDownloadUrl;
}

@ -0,0 +1,30 @@
package com.baiye.modules.telemarkting.entity.dto;
import lombok.Data;
/**
* @author wujingtao
* @date 2022/02/10
*/
@Data
public class RollCallBackDTO {
private String reqid;
private String caller;
private String callee;
private String display_caller;
private String display_callee;
private String sessionid;
private String duration;
private String record_file_url;
private String caller_start_time;
private String caller_ring_time;
private String caller_answer_time;
private String callee_start_time;
private String callee_ring_time;
private String callee_answer_time;
private String hangup_time;
private String hangup_reason;
private String extval1;
private String extval2;
private String extval3;
}

@ -0,0 +1,21 @@
package com.baiye.modules.telemarkting.entity.dto;
import lombok.Data;
/**
* @author wujingtao
* @date 2022/02/10
*/
@Data
public class RollCallSystemDTO {
private String sig;
private String appid;
private String req_id;
private String caller;
private String callee;
private String display_caller;
private String display_callee;
private String is_record;
private String transfer_tel;
private String cdr_url;
}

@ -0,0 +1,27 @@
package com.baiye.modules.telemarkting.service;
import com.baiye.http.CommonResponse;
import com.baiye.modules.telemarkting.entity.dto.DoubleCallReqDTO;
import com.baiye.modules.telemarkting.entity.dto.RollCallBackDTO;
/**
* @author wujingtao
* @date 2022/02/10
*
*/
public interface RollCallService {
/**
*
*
* @param doubleCallReq
* @return
*/
CommonResponse<Object> rollCallReq(DoubleCallReqDTO doubleCallReq);
/**
*
*
* @param rollCallBackDTO
*/
void rollCallBack(RollCallBackDTO rollCallBackDTO);
}

@ -10,16 +10,16 @@ import com.baiye.feign.SourceClueClient;
import com.baiye.http.CommonResponse;
import com.baiye.model.enums.CallStatusEnum;
import com.baiye.modules.system.domain.Clue;
import com.baiye.modules.telemarkting.dao.AllCallInfoRepository;
import com.baiye.modules.telemarkting.dao.CallClueRepository;
import com.baiye.modules.telemarkting.dao.DoubleCallRepository;
import com.baiye.modules.telemarkting.entity.AllCallInfo;
import com.baiye.modules.telemarkting.entity.CallClueInfo;
import com.baiye.modules.telemarkting.entity.DoubleCallInfo;
import com.baiye.modules.telemarkting.entity.dto.DoubleCallBackDTO;
import com.baiye.modules.telemarkting.entity.dto.DoubleCallBackStatusDTO;
import com.baiye.modules.telemarkting.entity.dto.DoubleCallReqDTO;
import com.baiye.modules.telemarkting.entity.dto.DoubleCallStopDTO;
import com.baiye.modules.telemarkting.entity.vo.CallRecordsVO;
import com.baiye.modules.telemarkting.httpRequest.CallReq;
import com.baiye.modules.telemarkting.httpRequest.DoubleCallReq;
import com.baiye.modules.telemarkting.service.DoubleCallService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -39,9 +39,9 @@ import java.util.Objects;
@Slf4j
public class DoubleCallServiceImpl implements DoubleCallService {
@Resource
private CallReq callReq;
private DoubleCallReq doubleCallReq;
@Resource
private DoubleCallRepository doubleCallRepository;
private AllCallInfoRepository allCallInfoRepository;
@Resource
private CallClueRepository callClueRepository;
@Resource
@ -56,16 +56,23 @@ public class DoubleCallServiceImpl implements DoubleCallService {
return CommonResponse.createByErrorMessage("未获取到号码");
}
doubleCallReq.setTelB(body.getNid());
String sessionId = callReq.startReq(doubleCallReq);
String sessionId = this.doubleCallReq.startReq(doubleCallReq);
log.info("=============================sessionId {}", sessionId);
if (StrUtil.isNotBlank(sessionId)) {
DoubleCallInfo doubleCallInfo = new DoubleCallInfo();
doubleCallInfo.setSessionId(sessionId);
doubleCallInfo.setRequestId(requestId);
doubleCallInfo.setClueId(Long.parseLong(doubleCallReq.getUserData()));
doubleCallInfo.setMemberId(doubleCallReq.getMemberId());
doubleCallInfo.setStatus(DefaultNumberConstants.ONE_NUMBER);
// DoubleCallInfo doubleCallInfo = new DoubleCallInfo();
// doubleCallInfo.setSessionId(sessionId);
// doubleCallInfo.setRequestId(requestId);
// doubleCallInfo.setClueId(Long.parseLong(doubleCallReq.getUserData()));
// doubleCallInfo.setMemberId(doubleCallReq.getMemberId());
// doubleCallInfo.setStatus(DefaultNumberConstants.ONE_NUMBER);
AllCallInfo allCallInfo = new AllCallInfo();
allCallInfo.setSessionId(sessionId);
allCallInfo.setRequestId(requestId);
allCallInfo.setClueId(Long.parseLong(doubleCallReq.getUserData()));
allCallInfo.setMemberId(doubleCallReq.getMemberId());
allCallInfo.setStatus(DefaultNumberConstants.ONE_NUMBER);
allCallInfo.setType(DefaultNumberConstants.ONE_NUMBER);
CallClueInfo clueInfo = new CallClueInfo();
clueInfo.setClueId(Long.parseLong(doubleCallReq.getUserData()));
@ -74,7 +81,7 @@ public class DoubleCallServiceImpl implements DoubleCallService {
clueInfo.setStatus(DefaultNumberConstants.ONE_NUMBER);
clueInfo.setTaskId(doubleCallReq.getTaskId());
doubleCallRepository.save(doubleCallInfo);
allCallInfoRepository.save(allCallInfo);
callClueRepository.save(clueInfo);
} else {
return CommonResponse.createByError();
@ -85,10 +92,14 @@ public class DoubleCallServiceImpl implements DoubleCallService {
@Override
public void doubleCallBack(DoubleCallBackDTO doubleCallBack) {
String sessionId = doubleCallBack.getSessionId();
DoubleCallInfo doubleCallInfo = doubleCallRepository.findBySessionId(sessionId);
if (ObjectUtil.isNotEmpty(doubleCallInfo)) {
BeanUtil.copyProperties(doubleCallBack, doubleCallInfo);
doubleCallRepository.save(doubleCallInfo);
AllCallInfo allCallInfo = allCallInfoRepository.findBySessionId(sessionId);
if (ObjectUtil.isNotEmpty(allCallInfo)) {
// BeanUtil.copyProperties(doubleCallBack, doubleCallInfo);
// doubleCallRepository.save(doubleCallInfo);
allCallInfo.setDuration(doubleCallBack.getDuration());
allCallInfo.setRecordFlag(doubleCallBack.getRecordFlag());
allCallInfo.setRecordFileDownloadUrl(doubleCallBack.getRecordFileDownloadUrl());
allCallInfoRepository.save(allCallInfo);
}
}
@ -102,13 +113,13 @@ public class DoubleCallServiceImpl implements DoubleCallService {
if (CallStatusEnum.ANSWER.getDescription().equals(flag)) {
int status = CallStatusEnum.ANSWER.getValue();
callClueRepository.updateByStatus(status, userDate);
doubleCallRepository.updateByStatus(status, sessionId);
allCallInfoRepository.updateByStatus(status, sessionId);
}
}
@Override
public CommonResponse<Object> doubleCallStop(DoubleCallStopDTO doubleCallStopDTO) {
if (callReq.stopReq(doubleCallStopDTO)) {
if (doubleCallReq.stopReq(doubleCallStopDTO)) {
return CommonResponse.createBySuccess();
}
return CommonResponse.createByError();
@ -120,10 +131,10 @@ public class DoubleCallServiceImpl implements DoubleCallService {
log.error("参数不能为空clueId:{} ,memberId:{}", clueId, memberId);
return CommonResponse.createByErrorMessage("参数不能为空");
}
List<DoubleCallInfo> calls = doubleCallRepository.findByClueIdAndMemberId(clueId, memberId, DefaultNumberConstants.TWO_NUMBER);
List<AllCallInfo> calls = allCallInfoRepository.findByClueIdAndMemberId(clueId, memberId, DefaultNumberConstants.TWO_NUMBER);
List<CallRecordsVO> list = new ArrayList<>();
if (CollUtil.isNotEmpty(calls)) {
for (DoubleCallInfo info : calls) {
for (AllCallInfo info : calls) {
CallRecordsVO v = new CallRecordsVO();
BeanUtil.copyProperties(info, v);
list.add(v);

@ -0,0 +1,97 @@
package com.baiye.modules.telemarkting.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.feign.SourceClueClient;
import com.baiye.http.CommonResponse;
import com.baiye.modules.system.domain.Clue;
import com.baiye.modules.telemarkting.dao.AllCallInfoRepository;
import com.baiye.modules.telemarkting.dao.CallClueRepository;
import com.baiye.modules.telemarkting.entity.AllCallInfo;
import com.baiye.modules.telemarkting.entity.CallClueInfo;
import com.baiye.modules.telemarkting.entity.dto.DoubleCallReqDTO;
import com.baiye.modules.telemarkting.entity.dto.RollCallBackDTO;
import com.baiye.modules.telemarkting.httpRequest.RollCallReq;
import com.baiye.modules.telemarkting.service.RollCallService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
/**
* @author wujingtao
* @date 2022/02/10
*/
@Service
@Slf4j
public class RollCallServiceImpl implements RollCallService {
@Resource
private AllCallInfoRepository allCallInfoRepository;
@Resource
private CallClueRepository callClueRepository;
@Resource
private SourceClueClient sourceClueClient;
@Resource
private RollCallReq rollCallReq;
@Override
public CommonResponse<Object> rollCallReq(DoubleCallReqDTO doubleCallReq) {
String requestId = RandomUtil.randomString(10);
doubleCallReq.setRequestId(requestId);
// Clue body = sourceClueClient.queryDetails(Long.parseLong(doubleCallReq.getUserData())).getBody();
// if (ObjectUtil.isNull(body) || StrUtil.isEmpty(body.getNid())) {
// return CommonResponse.createByErrorMessage("未获取到号码");
// }
// doubleCallReq.setTelB(body.getNid());
doubleCallReq.setTelB("13003658692");
String sessionId = rollCallReq.startReq(doubleCallReq);
log.info("=============================sessionId {}", sessionId);
if (StrUtil.isNotBlank(sessionId)) {
AllCallInfo allCallInfo = new AllCallInfo();
allCallInfo.setSessionId(sessionId);
allCallInfo.setRequestId(requestId);
allCallInfo.setClueId(Long.parseLong(doubleCallReq.getUserData()));
allCallInfo.setMemberId(doubleCallReq.getMemberId());
allCallInfo.setStatus(DefaultNumberConstants.ONE_NUMBER);
allCallInfo.setType(DefaultNumberConstants.ONE_NUMBER);
allCallInfo.setRecordFlag(DefaultNumberConstants.ZERO_NUMBER);
CallClueInfo clueInfo = new CallClueInfo();
clueInfo.setClueId(Long.parseLong(doubleCallReq.getUserData()));
clueInfo.setTeamId(doubleCallReq.getTeamId());
clueInfo.setMemberId(doubleCallReq.getMemberId());
clueInfo.setStatus(DefaultNumberConstants.ONE_NUMBER);
clueInfo.setTaskId(doubleCallReq.getTaskId());
allCallInfoRepository.save(allCallInfo);
callClueRepository.save(clueInfo);
} else {
return CommonResponse.createByError();
}
return CommonResponse.createBySuccess(sessionId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void rollCallBack(RollCallBackDTO rollCallBackDTO) {
String sessionId = rollCallBackDTO.getSessionid();
AllCallInfo allCallInfo = allCallInfoRepository.findBySessionId(sessionId);
if (ObjectUtil.isNotEmpty(allCallInfo)) {
if (StrUtil.isBlank(rollCallBackDTO.getDuration())) {
//表示接通
callClueRepository.updateByStatus(DefaultNumberConstants.TWO_NUMBER, allCallInfo.getClueId());
allCallInfo.setStatus(DefaultNumberConstants.TWO_NUMBER);
allCallInfo.setDuration(Integer.valueOf(rollCallBackDTO.getDuration()));
allCallInfo.setRecordFlag(DefaultNumberConstants.ONE_NUMBER);
allCallInfo.setRecordFileDownloadUrl(rollCallBackDTO.getRecord_file_url());
}
allCallInfoRepository.save(allCallInfo);
}
}
}
Loading…
Cancel
Save