|
|
@@ -1,43 +1,50 @@
|
|
|
package com.fs.company.service.impl;
|
|
|
|
|
|
-import java.math.BigDecimal;
|
|
|
-import java.math.RoundingMode;
|
|
|
-import java.util.*;
|
|
|
-import java.util.concurrent.CompletableFuture;
|
|
|
-import java.util.concurrent.Executor;
|
|
|
-
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
-import com.fs.aicall.domain.TaskInfo;
|
|
|
-import com.fs.aicall.domain.apiresult.Notify;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.fs.aicall.domain.apiresult.PushIIntentionResult;
|
|
|
-import com.fs.aicall.domain.param.getDialogMapDomain;
|
|
|
import com.fs.aicall.service.AiCallService;
|
|
|
import com.fs.common.core.domain.entity.SysDictData;
|
|
|
import com.fs.common.core.redis.RedisCache;
|
|
|
import com.fs.common.utils.DateUtils;
|
|
|
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.fs.common.utils.StringUtils;
|
|
|
+import com.fs.common.utils.spring.SpringUtils;
|
|
|
import com.fs.company.domain.*;
|
|
|
import com.fs.company.mapper.*;
|
|
|
import com.fs.company.service.CompanyWorkflowEngine;
|
|
|
+import com.fs.company.service.ICompanyVoiceRoboticCallLogCallphoneService;
|
|
|
+import com.fs.company.service.ICompanyVoiceRoboticService;
|
|
|
import com.fs.company.vo.*;
|
|
|
import com.fs.company.vo.easycall.EasyCallCallPhoneVO;
|
|
|
-import com.fs.crm.service.ICrmCustomerAnalyzeService;
|
|
|
+import com.fs.core.config.TenantConfigContext;
|
|
|
import com.fs.crm.service.ICrmCustomerPropertyService;
|
|
|
+import com.fs.his.utils.PhoneUtil;
|
|
|
import com.fs.qw.domain.QwUser;
|
|
|
import com.fs.qw.mapper.QwUserMapper;
|
|
|
+import com.fs.sensitive.DTO.AgentSensitiveWordDetectResultDTO;
|
|
|
+import com.fs.sensitive.component.AgentSensitiveWordDetector;
|
|
|
import com.fs.system.service.ISysConfigService;
|
|
|
import com.fs.system.service.impl.SysDictTypeServiceImpl;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
+import org.springframework.context.annotation.Lazy;
|
|
|
import org.springframework.scheduling.annotation.Async;
|
|
|
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
|
|
+import org.springframework.security.core.context.SecurityContextHolder;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
-import com.fs.company.service.ICompanyVoiceRoboticCallLogCallphoneService;
|
|
|
|
|
|
+import java.lang.reflect.Method;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.util.*;
|
|
|
+import java.util.concurrent.CompletableFuture;
|
|
|
+import java.util.concurrent.Executor;
|
|
|
+
|
|
|
+import static com.fs.company.service.impl.call.node.AbstractWorkflowNode.companyVoiceRoboticMapper;
|
|
|
import static com.fs.company.service.impl.call.node.AiCallTaskNode.EASYCALL_WORKFLOW_REDIS_KEY;
|
|
|
|
|
|
/**
|
|
|
@@ -71,13 +78,20 @@ public class CompanyVoiceRoboticCallLogCallphoneServiceImpl extends ServiceImpl<
|
|
|
@Autowired
|
|
|
QwUserMapper qwUserMapper;
|
|
|
@Autowired
|
|
|
- private ICrmCustomerAnalyzeService crmCustomerAnalyzeService;
|
|
|
- @Autowired
|
|
|
@Qualifier("cidWorkFlowExecutor")
|
|
|
private Executor cidWorkFlowExecutor;
|
|
|
|
|
|
@Autowired
|
|
|
SysDictTypeServiceImpl sysDictTypeService;
|
|
|
+ @Autowired
|
|
|
+ @Lazy
|
|
|
+ ICompanyVoiceRoboticService companyVoiceRoboticService;
|
|
|
+ @Autowired
|
|
|
+ CompanyAiWorkflowExecMapper companyAiWorkflowExecMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private AgentSensitiveWordDetector agentSensitiveWordDetector;
|
|
|
+
|
|
|
/**
|
|
|
* 查询调用日志_ai打电话
|
|
|
*
|
|
|
@@ -175,200 +189,309 @@ public class CompanyVoiceRoboticCallLogCallphoneServiceImpl extends ServiceImpl<
|
|
|
|
|
|
@Async("callLogExcutor")
|
|
|
public void asyncHandleCalleeCallBackResult(PushIIntentionResult result, CompanyVoiceRoboticCallees callees) {
|
|
|
- try {
|
|
|
-// String runTaskFlow = callees.getRunTaskFlow();
|
|
|
-// if(StringUtils.isBlank(runTaskFlow)){
|
|
|
-// runTaskFlow = Constants.CELL_PHONE;
|
|
|
-// }else{
|
|
|
-// if (!runTaskFlow.contains(Constants.CELL_PHONE)) {
|
|
|
-// runTaskFlow = runTaskFlow + "," + Constants.CELL_PHONE;
|
|
|
-// }
|
|
|
+// try {
|
|
|
+//// String runTaskFlow = callees.getRunTaskFlow();
|
|
|
+//// if(StringUtils.isBlank(runTaskFlow)){
|
|
|
+//// runTaskFlow = Constants.CELL_PHONE;
|
|
|
+//// }else{
|
|
|
+//// if (!runTaskFlow.contains(Constants.CELL_PHONE)) {
|
|
|
+//// runTaskFlow = runTaskFlow + "," + Constants.CELL_PHONE;
|
|
|
+//// }
|
|
|
+//// }
|
|
|
+//// if(!runTaskFlow.equals(callees.getRunTaskFlow())){
|
|
|
+//// CompanyVoiceRoboticCallees updateCallees = new CompanyVoiceRoboticCallees();
|
|
|
+//// updateCallees.setId(callees.getId());
|
|
|
+//// updateCallees.setRunTaskFlow(runTaskFlow);
|
|
|
+//// companyVoiceRoboticCalleesMapper.updateById(updateCallees);
|
|
|
+//// }
|
|
|
+// String json = configService.selectConfigByKey("cid.config");
|
|
|
+// if (StringUtils.isBlank(json)) {
|
|
|
+// log.error("未配置cid.config");
|
|
|
// }
|
|
|
-// if(!runTaskFlow.equals(callees.getRunTaskFlow())){
|
|
|
-// CompanyVoiceRoboticCallees updateCallees = new CompanyVoiceRoboticCallees();
|
|
|
-// updateCallees.setId(callees.getId());
|
|
|
-// updateCallees.setRunTaskFlow(runTaskFlow);
|
|
|
-// companyVoiceRoboticCalleesMapper.updateById(updateCallees);
|
|
|
+// CidConfigVO cidConfigVO = JSONUtil.toBean(json, CidConfigVO.class);
|
|
|
+//
|
|
|
+// Notify notify = result.getNotify();
|
|
|
+// String uuid = notify.getUuid();
|
|
|
+//
|
|
|
+//
|
|
|
+// if (StringUtils.isNotBlank(uuid)) {
|
|
|
+// getDialogMapDomain getDialogMap = getDialogMapDomain.builder()
|
|
|
+// .uuid(uuid)
|
|
|
+// .build();
|
|
|
+// CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLog = companyVoiceRoboticCallLogCallphoneMapper.selectNoResultLogByCallees(callees);
|
|
|
+//
|
|
|
+// companyVoiceRoboticCallLog.setStatus(2);
|
|
|
+// companyVoiceRoboticCallLog.setResult(JSON.toJSONString(result));
|
|
|
+//
|
|
|
+// CompanyWxClient companyWxClient = companyWxClientServiceImpl.getOne(new QueryWrapper<CompanyWxClient>().eq("robotic_id", callees.getRoboticId()).eq("customer_id", callees.getUserId()));
|
|
|
+// CompanyVoiceRoboticWx roboticWx = companyVoiceRoboticWxServiceImpl.getById(companyWxClient.getRoboticWxId());
|
|
|
+// Long setCompanyUserId = null;
|
|
|
+// if(Integer.valueOf(1).equals(companyWxClient.getIsWeCom())){
|
|
|
+// CompanyWxAccount companyWxAccount = companyWxAccountMapper.selectCompanyWxAccountById(roboticWx.getAccountId());
|
|
|
+// setCompanyUserId = companyWxAccount.getCompanyUserId();
|
|
|
+// }else if(Integer.valueOf(2).equals(companyWxClient.getIsWeCom())){
|
|
|
+// QwUser qwUser = qwUserMapper.selectById(roboticWx.getAccountId());
|
|
|
+// setCompanyUserId = qwUser.getCompanyUserId();
|
|
|
+// }
|
|
|
+//
|
|
|
+// companyVoiceRoboticCallLog.setCompanyUserId(setCompanyUserId);
|
|
|
+// // 调用接口查询通话其他信息
|
|
|
+// TaskInfo dialogMap = aiCallService.getDialogMapNew(getDialogMap, companyVoiceRoboticCallLog.getCompanyId());
|
|
|
+// // 写入其他记录
|
|
|
+// JSONObject telData = dialogMap.getTelData();
|
|
|
+// companyVoiceRoboticCallLog.setRecordPath((String) telData.getOrDefault("recordPath", ""));
|
|
|
+// companyVoiceRoboticCallLog.setContentList(telData.containsKey("contentList") ? telData.getJSONArray("contentList").toJSONString() : "");
|
|
|
+// companyVoiceRoboticCallLog.setCallerNum((String) telData.getOrDefault("callerNum", ""));
|
|
|
+// companyVoiceRoboticCallLog.setCalleeNum((String) telData.getOrDefault("calleeNum", ""));
|
|
|
+// companyVoiceRoboticCallLog.setUuid((String) telData.getOrDefault("uuid", ""));
|
|
|
+// Long createTime = telData.getLong("createTime");
|
|
|
+// companyVoiceRoboticCallLog.setCallCreateTime(createTime);
|
|
|
+// Long answerTime = telData.getLong("answerTime");
|
|
|
+// companyVoiceRoboticCallLog.setCallAnswerTime(answerTime);
|
|
|
+// companyVoiceRoboticCallLog.setIntention((String) telData.getOrDefault("intention", ""));
|
|
|
+// companyVoiceRoboticCallLog.setCallTime(telData.getLong("duration"));
|
|
|
+// BigDecimal callCharge = cidConfigVO.getCallCharge();
|
|
|
+// //
|
|
|
+// if (null == callCharge) {
|
|
|
+// callCharge = DEFAULT_CALL_CHARGE;
|
|
|
+// }
|
|
|
+// //向上取整分钟数
|
|
|
+// BigDecimal divide = new BigDecimal(companyVoiceRoboticCallLog.getCallTime()).divide(ONE_MINUTES_SECOND, 0, RoundingMode.CEILING);
|
|
|
+// BigDecimal multiply = divide.multiply(callCharge);
|
|
|
+// companyVoiceRoboticCallLog.setCost(multiply);
|
|
|
+// baseMapper.updateCompanyVoiceRoboticCallLogCallphone(companyVoiceRoboticCallLog);
|
|
|
+//
|
|
|
+// if (StringUtils.isNotBlank(notify.getUserData())) {
|
|
|
+// JSONObject userData = JSONObject.parseObject(redisCache2.getCacheObject(WORKFLOW_CALL_ONE_REDIS_KEY + notify.getUserData()), JSONObject.class);
|
|
|
+// if (null != userData && userData.containsKey("callBackUuid") && userData.containsKey("workflowInstanceId") && userData.containsKey("nodeKey")) {
|
|
|
+// Map<String, Object> param = new HashMap<>();
|
|
|
+// param.put("callBackUuid", userData.getString("callBackUuid"));
|
|
|
+// param.put("callSource", "callBack");
|
|
|
+// CompletableFuture.runAsync(() -> {
|
|
|
+// companyWorkflowEngine.resumeFromBlockingNode(userData.getString("workflowInstanceId"), userData.getString("nodeKey"), param);
|
|
|
+// }, cidWorkFlowExecutor).thenRun(() -> {
|
|
|
+// redisCache2.deleteObject(WORKFLOW_CALL_ONE_REDIS_KEY + notify.getUserData());
|
|
|
+// });
|
|
|
+// }
|
|
|
+// redisCache2.deleteObject(notify.getUserData());
|
|
|
+// }
|
|
|
// }
|
|
|
- String json = configService.selectConfigByKey("cId.config");
|
|
|
- if (StringUtils.isBlank(json)) {
|
|
|
- log.error("未配置cid.config");
|
|
|
- }
|
|
|
- CidConfigVO cidConfigVO = JSONUtil.toBean(json, CidConfigVO.class);
|
|
|
-
|
|
|
- Notify notify = result.getNotify();
|
|
|
- String uuid = notify.getUuid();
|
|
|
-
|
|
|
-
|
|
|
- if (StringUtils.isNotBlank(uuid)) {
|
|
|
- getDialogMapDomain getDialogMap = getDialogMapDomain.builder()
|
|
|
- .uuid(uuid)
|
|
|
- .build();
|
|
|
- CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLog = companyVoiceRoboticCallLogCallphoneMapper.selectNoResultLogByCallees(callees);
|
|
|
-
|
|
|
- companyVoiceRoboticCallLog.setStatus(2);
|
|
|
- companyVoiceRoboticCallLog.setResult(JSON.toJSONString(result));
|
|
|
-
|
|
|
- CompanyWxClient companyWxClient = companyWxClientServiceImpl.getOne(new QueryWrapper<CompanyWxClient>().eq("robotic_id", callees.getRoboticId()).eq("customer_id", callees.getUserId()));
|
|
|
- CompanyVoiceRoboticWx roboticWx = companyVoiceRoboticWxServiceImpl.getById(companyWxClient.getRoboticWxId());
|
|
|
- Long setCompanyUserId = null;
|
|
|
- if(Integer.valueOf(1).equals(companyWxClient.getIsWeCom())){
|
|
|
- CompanyWxAccount companyWxAccount = companyWxAccountMapper.selectCompanyWxAccountById(roboticWx.getAccountId());
|
|
|
- setCompanyUserId = companyWxAccount.getCompanyUserId();
|
|
|
- }else if(Integer.valueOf(2).equals(companyWxClient.getIsWeCom())){
|
|
|
- QwUser qwUser = qwUserMapper.selectById(roboticWx.getAccountId());
|
|
|
- setCompanyUserId = qwUser.getCompanyUserId();
|
|
|
- }
|
|
|
-
|
|
|
- companyVoiceRoboticCallLog.setCompanyUserId(setCompanyUserId);
|
|
|
- // 调用接口查询通话其他信息
|
|
|
- TaskInfo dialogMap = aiCallService.getDialogMapNew(getDialogMap, companyVoiceRoboticCallLog.getCompanyId());
|
|
|
- // 写入其他记录
|
|
|
- JSONObject telData = dialogMap.getTelData();
|
|
|
- companyVoiceRoboticCallLog.setRecordPath((String) telData.getOrDefault("recordPath", ""));
|
|
|
- companyVoiceRoboticCallLog.setContentList(telData.containsKey("contentList") ? telData.getJSONArray("contentList").toJSONString() : "");
|
|
|
- companyVoiceRoboticCallLog.setCallerNum((String) telData.getOrDefault("callerNum", ""));
|
|
|
- companyVoiceRoboticCallLog.setCalleeNum((String) telData.getOrDefault("calleeNum", ""));
|
|
|
- companyVoiceRoboticCallLog.setUuid((String) telData.getOrDefault("uuid", ""));
|
|
|
- Long createTime = telData.getLong("createTime");
|
|
|
- companyVoiceRoboticCallLog.setCallCreateTime(createTime);
|
|
|
- Long answerTime = telData.getLong("answerTime");
|
|
|
- companyVoiceRoboticCallLog.setCallAnswerTime(answerTime);
|
|
|
- companyVoiceRoboticCallLog.setIntention((String) telData.getOrDefault("intention", ""));
|
|
|
- companyVoiceRoboticCallLog.setCallTime(telData.getLong("duration"));
|
|
|
- BigDecimal callCharge = cidConfigVO.getCallCharge();
|
|
|
- //
|
|
|
- if (null == callCharge) {
|
|
|
- callCharge = DEFAULT_CALL_CHARGE;
|
|
|
- }
|
|
|
- //向上取整分钟数
|
|
|
- BigDecimal divide = new BigDecimal(companyVoiceRoboticCallLog.getCallTime()).divide(ONE_MINUTES_SECOND, 0, RoundingMode.CEILING);
|
|
|
- BigDecimal multiply = divide.multiply(callCharge);
|
|
|
- companyVoiceRoboticCallLog.setCost(multiply);
|
|
|
- baseMapper.updateCompanyVoiceRoboticCallLogCallphone(companyVoiceRoboticCallLog);
|
|
|
-
|
|
|
- if (StringUtils.isNotBlank(notify.getUserData())) {
|
|
|
- JSONObject userData = parseRedisCacheToJsonObject(redisCache2.getCacheObject(WORKFLOW_CALL_ONE_REDIS_KEY + notify.getUserData()));
|
|
|
- if (null != userData && userData.containsKey("callBackUuid") && userData.containsKey("workflowInstanceId") && userData.containsKey("nodeKey")) {
|
|
|
- Map<String, Object> param = new HashMap<>();
|
|
|
- param.put("callBackUuid", userData.getString("callBackUuid"));
|
|
|
- param.put("callSource", "callBack");
|
|
|
- CompletableFuture.runAsync(() -> {
|
|
|
- companyWorkflowEngine.resumeFromBlockingNode(userData.getString("workflowInstanceId"), userData.getString("nodeKey"), param);
|
|
|
- }, cidWorkFlowExecutor).thenRun(() -> {
|
|
|
- redisCache2.deleteObject(WORKFLOW_CALL_ONE_REDIS_KEY + notify.getUserData());
|
|
|
- });
|
|
|
- }
|
|
|
- redisCache2.deleteObject(notify.getUserData());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- } catch (Exception ex) {
|
|
|
- log.error("处理回调结果异常:{}", result, ex);
|
|
|
- }
|
|
|
+//
|
|
|
+// } catch (Exception ex) {
|
|
|
+// log.error("处理回调结果异常:{}", result, ex);
|
|
|
+// }
|
|
|
}
|
|
|
@Async("callLogExcutor")
|
|
|
- public void asyncHandleCalleeCallBackResult4EasyCall(EasyCallCallPhoneVO result, CompanyVoiceRoboticCallees callees) {
|
|
|
+ public void asyncHandleCalleeCallBackResult4EasyCall(EasyCallCallPhoneVO result, Long calleeId) {
|
|
|
try {
|
|
|
- String json = configService.selectConfigByKey("cId.config");
|
|
|
- if (StringUtils.isBlank(json)) {
|
|
|
- log.error("未配置cid.config");
|
|
|
- }
|
|
|
- CidConfigVO cidConfigVO = JSONUtil.toBean(json, CidConfigVO.class);
|
|
|
- if (null != result) {
|
|
|
+
|
|
|
+ CompanyVoiceRoboticCallees callees = companyVoiceRoboticCalleesMapper.selectCompanyVoiceRoboticCalleesById(calleeId);
|
|
|
+ try {
|
|
|
+ String json = configService.selectConfigByKey("cId.config");
|
|
|
+ if (StringUtils.isBlank(json)) {
|
|
|
+ log.error("未配置cid.config");
|
|
|
+ }
|
|
|
+ CidConfigVO cidConfigVO = JSONUtil.toBean(json, CidConfigVO.class);
|
|
|
+ if (null != result) {
|
|
|
// getDialogMapDomain getDialogMap = getDialogMapDomain.builder()
|
|
|
// .uuid(uuid)
|
|
|
// .build();
|
|
|
- CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLog = companyVoiceRoboticCallLogCallphoneMapper.selectNoResultLogByCallees(callees);
|
|
|
-
|
|
|
- companyVoiceRoboticCallLog.setStatus(2);
|
|
|
- companyVoiceRoboticCallLog.setResult(JSON.toJSONString(result));
|
|
|
-
|
|
|
- CompanyWxClient companyWxClient = companyWxClientServiceImpl.getOne(new QueryWrapper<CompanyWxClient>().eq("robotic_id", callees.getRoboticId()).eq("customer_id", callees.getUserId()));
|
|
|
- CompanyVoiceRoboticWx roboticWx = companyVoiceRoboticWxServiceImpl.getById(companyWxClient.getRoboticWxId());
|
|
|
- Long setCompanyUserId = null;
|
|
|
- if(Integer.valueOf(1).equals(companyWxClient.getIsWeCom())){
|
|
|
- CompanyWxAccount companyWxAccount = companyWxAccountMapper.selectCompanyWxAccountById(roboticWx.getAccountId());
|
|
|
- setCompanyUserId = companyWxAccount.getCompanyUserId();
|
|
|
- }else if(Integer.valueOf(2).equals(companyWxClient.getIsWeCom())){
|
|
|
- QwUser qwUser = qwUserMapper.selectById(roboticWx.getAccountId());
|
|
|
- setCompanyUserId = qwUser.getCompanyUserId();
|
|
|
- }
|
|
|
|
|
|
- companyVoiceRoboticCallLog.setCompanyUserId(setCompanyUserId);
|
|
|
- // 调用接口查询通话其他信息
|
|
|
+ CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLog = companyVoiceRoboticCallLogCallphoneMapper.selectNoResultLogByCallees(callees);
|
|
|
+
|
|
|
+ companyVoiceRoboticCallLog.setStatus(2);
|
|
|
+ companyVoiceRoboticCallLog.setResult(JSON.toJSONString(result));
|
|
|
+ companyVoiceRoboticCallLog.setHangupType(result.getUnconnectedReason());
|
|
|
+ CompanyWxClient companyWxClient = companyWxClientServiceImpl.getOne(new QueryWrapper<CompanyWxClient>().eq("robotic_id", callees.getRoboticId()).eq("customer_id", callees.getUserId()));
|
|
|
+ CompanyVoiceRoboticWx roboticWx = companyVoiceRoboticWxServiceImpl.getById(companyWxClient.getRoboticWxId());
|
|
|
+ Long setCompanyUserId = null;
|
|
|
+ if(null != roboticWx){
|
|
|
+ if(Integer.valueOf(1).equals(companyWxClient.getIsWeCom())){
|
|
|
+ CompanyWxAccount companyWxAccount = companyWxAccountMapper.selectCompanyWxAccountById(roboticWx.getAccountId());
|
|
|
+ setCompanyUserId = companyWxAccount.getCompanyUserId();
|
|
|
+ }else if(Integer.valueOf(2).equals(companyWxClient.getIsWeCom())){
|
|
|
+ QwUser qwUser = qwUserMapper.selectById(roboticWx.getAccountId());
|
|
|
+ setCompanyUserId = qwUser.getCompanyUserId();
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ CompanyVoiceRobotic robotic = companyVoiceRoboticMapper.selectCompanyVoiceRoboticById(callees.getRoboticId());
|
|
|
+ setCompanyUserId = robotic.getCompanyUserId();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ companyVoiceRoboticCallLog.setCompanyUserId(setCompanyUserId);
|
|
|
+ // 调用接口查询通话其他信息
|
|
|
// TaskInfo dialogMap = aiCallService.getDialogMapNew(getDialogMap, companyVoiceRoboticCallLog.getCompanyId());
|
|
|
- // 写入其他记录
|
|
|
+ // 写入其他记录
|
|
|
// JSONObject telData = dialogMap.getTelData();
|
|
|
- companyVoiceRoboticCallLog.setRecordPath(result.getWavfile());
|
|
|
- companyVoiceRoboticCallLog.setContentList(result.getDialogue());
|
|
|
- companyVoiceRoboticCallLog.setCallerNum(result.getTelephone());
|
|
|
- companyVoiceRoboticCallLog.setCalleeNum(result.getCallerNumber());
|
|
|
- companyVoiceRoboticCallLog.setUuid(result.getUuid());
|
|
|
- Long createTime = result.getCalloutTime();
|
|
|
- companyVoiceRoboticCallLog.setCallCreateTime(createTime);
|
|
|
- Long answerTime = result.getCallEndTime();
|
|
|
- companyVoiceRoboticCallLog.setCallAnswerTime(answerTime);
|
|
|
- String intention = null;
|
|
|
- if (StringUtils.isNotBlank(result.getDialogue())) {
|
|
|
- try {
|
|
|
- intention = crmCustomerAnalyzeService.aiIntentionDegree(
|
|
|
- result.getDialogue(),
|
|
|
- java.time.LocalTime.now().getLong(java.time.temporal.ChronoField.MILLI_OF_SECOND)
|
|
|
- );
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("easyCall回调日志意向度AI解析失败,uuid={}", result.getUuid(), e);
|
|
|
+ companyVoiceRoboticCallLog.setRecordPath(result.getWavfile());
|
|
|
+ companyVoiceRoboticCallLog.setCallType(2);
|
|
|
+ companyVoiceRoboticCallLog.setContentList(result.getDialogue());
|
|
|
+ companyVoiceRoboticCallLog.setCallerNum(PhoneUtil.encryptPhone(result.getTelephone()));
|
|
|
+ companyVoiceRoboticCallLog.setCalleeNum(result.getCallerNumber());
|
|
|
+ companyVoiceRoboticCallLog.setUuid(result.getUuid());
|
|
|
+ Long createTime = result.getCalloutTime();
|
|
|
+ companyVoiceRoboticCallLog.setCallCreateTime(createTime);
|
|
|
+ Long answerTime = result.getCallEndTime();
|
|
|
+ companyVoiceRoboticCallLog.setCallAnswerTime(answerTime);
|
|
|
+ // 【当前启用】读取 cc_call_phone.intent,再转换为系统字典 intention 数值
|
|
|
+ String intentRaw = StringUtils.isNotBlank(result.getIntent()) ? result.getIntent().trim() : null;
|
|
|
+ String intentf = null;
|
|
|
+ final String intentionLabel = intentRaw;
|
|
|
+ List<SysDictData> customerIntentionLevel = sysDictTypeService.selectDictDataByType("customer_intention_level");
|
|
|
+ if (!isPositiveInteger(intentionLabel)) {
|
|
|
+ Optional<SysDictData> firstDict = customerIntentionLevel.stream().filter(e -> e.getDictLabel().equals(intentionLabel)).findFirst();
|
|
|
+ if (firstDict.isPresent()) {
|
|
|
+ SysDictData sysDictData = firstDict.get();
|
|
|
+ intentf = sysDictData.getDictValue();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ intentf = intentionLabel;
|
|
|
}
|
|
|
- }
|
|
|
- // 历史第三方值(当前不启用,保留用于回滚)
|
|
|
- // String intention = result.getIntent();
|
|
|
- String intentf = null;
|
|
|
- final String intentionLabel = intention;
|
|
|
- List<SysDictData> customerIntentionLevel = sysDictTypeService.selectDictDataByType("customer_intention_level");
|
|
|
- if (!isPositiveInteger(intentionLabel)) {
|
|
|
- Optional<SysDictData> firstDict = customerIntentionLevel.stream().filter(e -> e.getDictLabel().equals(intentionLabel)).findFirst();
|
|
|
- if (firstDict.isPresent()) {
|
|
|
- SysDictData sysDictData = firstDict.get();
|
|
|
- intentf = sysDictData.getDictValue();
|
|
|
+ if (StringUtils.isBlank(intentf)) {
|
|
|
+ intentf = "0";
|
|
|
}
|
|
|
- } else {
|
|
|
- intentf = intentionLabel;
|
|
|
- }
|
|
|
- if (StringUtils.isBlank(intentf)) intentf = "0";
|
|
|
- companyVoiceRoboticCallLog.setIntention(intentf);
|
|
|
- companyVoiceRoboticCallLog.setCallTime(Long.valueOf(result.getTimeLen()/1000));
|
|
|
- BigDecimal callCharge = cidConfigVO.getCallCharge();
|
|
|
- //
|
|
|
- if (null == callCharge) {
|
|
|
- callCharge = DEFAULT_CALL_CHARGE;
|
|
|
- }
|
|
|
- //向上取整分钟数
|
|
|
- BigDecimal divide = new BigDecimal(companyVoiceRoboticCallLog.getCallTime()).divide(ONE_MINUTES_SECOND, 0, RoundingMode.CEILING);
|
|
|
- BigDecimal multiply = divide.multiply(callCharge);
|
|
|
- companyVoiceRoboticCallLog.setCost(multiply);
|
|
|
- baseMapper.updateCompanyVoiceRoboticCallLogCallphone(companyVoiceRoboticCallLog);
|
|
|
- // 更新用户标签
|
|
|
- crmCustomerPropertyService.addPropertyByCallLog(companyVoiceRoboticCallLog);
|
|
|
-
|
|
|
- if (StringUtils.isNotBlank(result.getBizJson())) {
|
|
|
- JSONObject bizJson = JSONObject.parseObject(result.getBizJson());
|
|
|
- JSONObject userData = parseRedisCacheToJsonObject(redisCache2.getCacheObject(EASYCALL_WORKFLOW_REDIS_KEY + bizJson.getString("callBackUuid")));
|
|
|
- if (null != userData && userData.containsKey("callBackUuid") && userData.containsKey("workflowInstanceId") && userData.containsKey("nodeKey")) {
|
|
|
- Map<String, Object> param = new HashMap<>();
|
|
|
- param.put("callBackUuid", userData.getString("callBackUuid"));
|
|
|
- param.put("callSource", "callBack");
|
|
|
- CompletableFuture.runAsync(() -> {
|
|
|
- companyWorkflowEngine.resumeFromBlockingNode(userData.getString("workflowInstanceId"), userData.getString("nodeKey"), param);
|
|
|
- }, cidWorkFlowExecutor).thenRun(() -> {
|
|
|
- redisCache2.deleteObject(EASYCALL_WORKFLOW_REDIS_KEY + bizJson.getString("callBackUuid"));
|
|
|
- });
|
|
|
+ companyVoiceRoboticCallLog.setIntention(intentf);
|
|
|
+
|
|
|
+ // ========== 【历史保留】回滚时可注释上方 EasyCall 逻辑并取消下方对应注释 ==========
|
|
|
+ // 方案A:仅使用 EasyCall intent 字段(改动前的本文件写法)
|
|
|
+// String intention = result.getIntent();
|
|
|
+// String intentf = null;
|
|
|
+// List<SysDictData> customerIntentionLevel = sysDictTypeService.selectDictDataByType("customer_intention_level");
|
|
|
+// if (!isPositiveInteger(intention)) {
|
|
|
+// Optional<SysDictData> firstDict = customerIntentionLevel.stream().filter(e -> e.getDictLabel().equals(intention)).findFirst();
|
|
|
+// if (firstDict.isPresent()) {
|
|
|
+// SysDictData sysDictData = firstDict.get();
|
|
|
+// intentf = sysDictData.getDictValue();
|
|
|
+// }
|
|
|
+// }
|
|
|
+// companyVoiceRoboticCallLog.setIntention(intentf);
|
|
|
+
|
|
|
+ // 方案B:自家 AI 根据 dialogue 计算意向度
|
|
|
+// String intention = null;
|
|
|
+// if (StringUtils.isNotBlank(result.getDialogue())) {
|
|
|
+// try {
|
|
|
+// intention = crmCustomerAnalyzeService.aiIntentionDegree(
|
|
|
+// result.getDialogue(),
|
|
|
+// java.time.LocalTime.now().getLong(java.time.temporal.ChronoField.MILLI_OF_SECOND)
|
|
|
+// );
|
|
|
+// } catch (Exception e) {
|
|
|
+// log.error("easyCall回调日志意向度AI解析失败,uuid={}", result.getUuid(), e);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// String intentf = null;
|
|
|
+// final String intentionLabel = intention;
|
|
|
+// List<SysDictData> customerIntentionLevel = sysDictTypeService.selectDictDataByType("customer_intention_level");
|
|
|
+// if (!isPositiveInteger(intentionLabel)) {
|
|
|
+// Optional<SysDictData> firstDict = customerIntentionLevel.stream().filter(e -> e.getDictLabel().equals(intentionLabel)).findFirst();
|
|
|
+// if (firstDict.isPresent()) {
|
|
|
+// SysDictData sysDictData = firstDict.get();
|
|
|
+// intentf = sysDictData.getDictValue();
|
|
|
+// }
|
|
|
+// } else {
|
|
|
+// intentf = intentionLabel;
|
|
|
+// }
|
|
|
+// if (StringUtils.isBlank(intentf)) {
|
|
|
+// intentf = "0";
|
|
|
+// }
|
|
|
+// companyVoiceRoboticCallLog.setIntention(intentf);
|
|
|
+ if(null != result.getValidTimeLen() && Integer.valueOf(0).compareTo(result.getValidTimeLen()) < 0){
|
|
|
+ BigDecimal divide = new BigDecimal(result.getValidTimeLen()).divide(new BigDecimal(1000), 0, RoundingMode.CEILING);
|
|
|
+ companyVoiceRoboticCallLog.setCallTime(divide.longValue());
|
|
|
+ }
|
|
|
+ BigDecimal callCharge = cidConfigVO.getCallCharge();
|
|
|
+ //
|
|
|
+ if (null == callCharge) {
|
|
|
+ callCharge = DEFAULT_CALL_CHARGE;
|
|
|
+ }
|
|
|
+ //检测空避免报错
|
|
|
+ if(companyVoiceRoboticCallLog.getCallTime()!=null){
|
|
|
+ //向上取整分钟数
|
|
|
+ BigDecimal divide = new BigDecimal(companyVoiceRoboticCallLog.getCallTime()).divide(ONE_MINUTES_SECOND, 0, RoundingMode.CEILING);
|
|
|
+ BigDecimal multiply = divide.multiply(callCharge);
|
|
|
+ companyVoiceRoboticCallLog.setCost(multiply);
|
|
|
+ }
|
|
|
+
|
|
|
+ //检测敏感词语
|
|
|
+ AgentSensitiveWordDetectResultDTO resultDTO = agentSensitiveWordDetector.detectAndHighlight(result.getUuid(), result.getDialogue());
|
|
|
+ if(resultDTO != null && resultDTO.getCheckBoolean()){
|
|
|
+ companyVoiceRoboticCallLog.setIsWarning(1);
|
|
|
+ companyVoiceRoboticCallLog.setContentList(resultDTO.getProcessText());
|
|
|
+ companyVoiceRoboticCallLog.setViolationNum(resultDTO.getViolationCount());
|
|
|
+ }
|
|
|
+
|
|
|
+ //AI外呼 转人工逻辑
|
|
|
+ if(StringUtils.isNotBlank(result.getAcdOpnum()) && !"robot".equalsIgnoreCase(result.getAcdOpnum())){
|
|
|
+ companyVoiceRoboticCallLog.setManualAnswered(1);
|
|
|
+ companyVoiceRoboticCallLog.setHandleFlag(0);
|
|
|
+ companyVoiceRoboticCallLog.setAnsweredExtNum(result.getAcdOpnum());
|
|
|
+ companyVoiceRoboticCallLog.setManualAnsweredTime(result.getManualAnsweredTime());
|
|
|
+ companyVoiceRoboticCallLog.setManualAnsweredTimeLen(result.getManualAnsweredTimeLen());
|
|
|
+ }
|
|
|
+
|
|
|
+ baseMapper.updateCompanyVoiceRoboticCallLogCallphone(companyVoiceRoboticCallLog);
|
|
|
+ // 更新用户标签
|
|
|
+ crmCustomerPropertyService.addPropertyByCallLog(companyVoiceRoboticCallLog);
|
|
|
+
|
|
|
+ if (StringUtils.isNotBlank(result.getBizJson())) {
|
|
|
+ JSONObject bizJson = JSONObject.parseObject(result.getBizJson());
|
|
|
+ JSONObject userData = JSONObject.parseObject(redisCache2.getCacheObject(EASYCALL_WORKFLOW_REDIS_KEY + bizJson.getString("callBackUuid")), JSONObject.class);
|
|
|
+ if (null != userData && userData.containsKey("callBackUuid") && userData.containsKey("workflowInstanceId") && userData.containsKey("nodeKey")) {
|
|
|
+ // 暂停检查:任务暂停中则标记回调已到达但不触发工作流继续执行
|
|
|
+ if (companyVoiceRoboticService.isTaskPaused(callees.getRoboticId())) {
|
|
|
+ log.info("任务暂停中,EasyCall外呼回调数据已保存但不触发工作流继续执行 - taskId: {}, workflowInstanceId: {}",
|
|
|
+ callees.getRoboticId(), userData.getString("workflowInstanceId"));
|
|
|
+ markCallbackReceivedInVariables(userData.getString("workflowInstanceId"));
|
|
|
+ } else {
|
|
|
+ Map<String, Object> param = new HashMap<>();
|
|
|
+ param.put("callBackUuid", userData.getString("callBackUuid"));
|
|
|
+ param.put("callSource", "callBack");
|
|
|
+ CompletableFuture.runAsync(() -> {
|
|
|
+ companyWorkflowEngine.resumeFromBlockingNode(userData.getString("workflowInstanceId"), userData.getString("nodeKey"), param);
|
|
|
+ }, cidWorkFlowExecutor).thenRun(() -> {
|
|
|
+ redisCache2.deleteObject(EASYCALL_WORKFLOW_REDIS_KEY + bizJson.getString("callBackUuid"));
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ redisCache2.deleteObject(bizJson.getString("callBackUuid"));
|
|
|
}
|
|
|
- redisCache2.deleteObject(bizJson.getString("callBackUuid"));
|
|
|
}
|
|
|
+
|
|
|
+ } catch (Exception ex) {
|
|
|
+ log.error("处理回调结果异常:{}", result, ex);
|
|
|
}
|
|
|
|
|
|
- } catch (Exception ex) {
|
|
|
- log.error("处理回调结果异常:{}", result, ex);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("asyncHandleCalleeCallBackResult4EasyCall执行失败", e);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 标记工作流实例的variables中回调已到达(任务暂停时使用,恢复时会检查此标记)
|
|
|
+ */
|
|
|
+ private void markCallbackReceivedInVariables(String workflowInstanceId) {
|
|
|
+ try {
|
|
|
+ CompanyAiWorkflowExec exec = companyAiWorkflowExecMapper.selectByWorkflowInstanceId(workflowInstanceId);
|
|
|
+ if (exec == null) {
|
|
|
+ log.warn("markCallbackReceived: 未找到工作流实例 - workflowInstanceId: {}", workflowInstanceId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String variablesJson = exec.getVariables();
|
|
|
+ JSONObject variables;
|
|
|
+ if (StringUtils.isNotBlank(variablesJson)) {
|
|
|
+ variables = JSONObject.parseObject(variablesJson);
|
|
|
+ } else {
|
|
|
+ variables = new JSONObject();
|
|
|
+ }
|
|
|
+ variables.put("pause_callback_received", true);
|
|
|
+ CompanyAiWorkflowExec update = new CompanyAiWorkflowExec();
|
|
|
+ update.setWorkflowInstanceId(workflowInstanceId);
|
|
|
+ update.setVariables(variables.toJSONString());
|
|
|
+ companyAiWorkflowExecMapper.updateByWorkflowInstanceId(update);
|
|
|
+ log.info("markCallbackReceived: 已标记回调到达 - workflowInstanceId: {}", workflowInstanceId);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("markCallbackReceived: 标记回调到达失败 - workflowInstanceId: {}", workflowInstanceId, e);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -393,58 +516,119 @@ public class CompanyVoiceRoboticCallLogCallphoneServiceImpl extends ServiceImpl<
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public List<CustomerRoboticCallOutCountVO> countRoboticCallOutByCustomerIds(List<Long> customerIds, Long companyId) {
|
|
|
- if (customerIds == null || customerIds.isEmpty()) {
|
|
|
- return Collections.emptyList();
|
|
|
- }
|
|
|
- return baseMapper.countRoboticCallOutByCustomerIds(customerIds, companyId);
|
|
|
+ public List<Long> getCallerIdsByCustomerId(Long customerId) {
|
|
|
+ return companyVoiceRoboticCalleesMapper.getCallerIdsByCustomerId(customerId);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public List<CalleeRoboticCallOutCountVO> countRoboticCallOutByCalleeIds(List<Long> calleeIds, Long roboticId, Long companyId) {
|
|
|
- if (calleeIds == null || calleeIds.isEmpty() || roboticId == null) {
|
|
|
- return Collections.emptyList();
|
|
|
- }
|
|
|
- return baseMapper.countRoboticCallOutByCalleeIds(calleeIds, roboticId, companyId);
|
|
|
+ public List<CompanyVoiceRoboticCallLogCallphone> selectCompanyVoiceRoboticCallPhoneLogGroupList(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone) {
|
|
|
+ return baseMapper.selectCompanyVoiceRoboticCallPhoneLogGroupList(companyVoiceRoboticCallLogCallphone);
|
|
|
}
|
|
|
- /**
|
|
|
- * Redis 中 workflow 回调缓存可能是 String 或已反序列化的 JSONObject,避免 ClassCastException。
|
|
|
- */
|
|
|
- private static JSONObject parseRedisCacheToJsonObject(Object cacheObj) {
|
|
|
- if (cacheObj == null) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- if (cacheObj instanceof JSONObject) {
|
|
|
- return (JSONObject) cacheObj;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public CompanyVoiceRoboticCallLogCount selectCompanyVoiceRoboticCallPhoneLogCount(Long companyId,Long companyUserId) {
|
|
|
+ return baseMapper.selectCompanyVoiceRoboticCallPhoneLogCount(companyId,companyUserId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<CompanyVoiceRoboticCallLogCallPhoneVO> listByRoboticId(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone) {
|
|
|
+ return baseMapper.listByRoboticId(companyVoiceRoboticCallLogCallphone);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void prepareDetailListQuery(CompanyVoiceRoboticCallLogCallphone query, Long companyId) {
|
|
|
+ query.setCompanyId(companyId);
|
|
|
+ prepareDetailPhoneQuery(query);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<CompanyVoiceRoboticCallLogCallPhoneVO> selectDetailList(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone) {
|
|
|
+ List<CompanyVoiceRoboticCallLogCallPhoneVO> list = baseMapper.selectDetailList(companyVoiceRoboticCallLogCallphone);
|
|
|
+ if (list == null || list.isEmpty()) {
|
|
|
+ return list;
|
|
|
}
|
|
|
- if (cacheObj instanceof String) {
|
|
|
- String s = (String) cacheObj;
|
|
|
- if (StringUtils.isBlank(s)) {
|
|
|
- return null;
|
|
|
+ for (CompanyVoiceRoboticCallLogCallPhoneVO vo : list) {
|
|
|
+ if (StringUtils.isNotEmpty(vo.getCallerNum())) {
|
|
|
+ vo.setCallerNum(PhoneUtil.decryptPhoneMk(vo.getCallerNum()));
|
|
|
}
|
|
|
- return JSONObject.parseObject(s);
|
|
|
}
|
|
|
- return JSONObject.parseObject(JSONObject.toJSONString(cacheObj));
|
|
|
+ return list;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public List<Long> getCallerIdsByCustomerId(Long customerId) {
|
|
|
- return companyVoiceRoboticCalleesMapper.getCallerIdsByCustomerId(customerId);
|
|
|
+ public CompanyVoiceRoboticCallLogDetailSummary selectDetailSummary(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone) {
|
|
|
+ CompanyVoiceRoboticCallLogDetailSummary summary = baseMapper.selectDetailSummary(companyVoiceRoboticCallLogCallphone);
|
|
|
+ if (summary == null) {
|
|
|
+ summary = new CompanyVoiceRoboticCallLogDetailSummary();
|
|
|
+ summary.setTotalCount(0L);
|
|
|
+ summary.setSuccessCount(0L);
|
|
|
+ summary.setFailCount(0L);
|
|
|
+ summary.setConnectedCount(0L);
|
|
|
+ summary.setTotalBillingMinute(0L);
|
|
|
+ }
|
|
|
+ if (summary.getTotalBillingMinute() == null) {
|
|
|
+ summary.setTotalBillingMinute(0L);
|
|
|
+ }
|
|
|
+ long total = summary.getTotalCount() == null ? 0L : summary.getTotalCount();
|
|
|
+ long connected = summary.getConnectedCount() == null ? 0L : summary.getConnectedCount();
|
|
|
+ summary.setConnectRate(total > 0 ? (int) Math.round(connected * 100.0 / total) : 0);
|
|
|
+ return summary;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public List<CompanyVoiceRoboticCallLogCallphone> selectCompanyVoiceRoboticCallPhoneLogGroupList(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone) {
|
|
|
- return baseMapper.selectCompanyVoiceRoboticCallPhoneLogGroupList(companyVoiceRoboticCallLogCallphone);
|
|
|
+ public List<CompanyVoiceRoboticCallLogCallPhoneDecryptExportVO> listDecryptPhoneExport(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone) {
|
|
|
+ prepareDetailPhoneQuery(companyVoiceRoboticCallLogCallphone);
|
|
|
+ List<CompanyVoiceRoboticCallLogCallPhoneDecryptQueryVO> rows = baseMapper.listDecryptPhoneExport(companyVoiceRoboticCallLogCallphone);
|
|
|
+ List<CompanyVoiceRoboticCallLogCallPhoneDecryptExportVO> exportList = new ArrayList<>();
|
|
|
+ if (rows == null || rows.isEmpty()) {
|
|
|
+ return exportList;
|
|
|
+ }
|
|
|
+ Map<String, String> intentionLabelMap = buildIntentionLabelMap();
|
|
|
+ for (CompanyVoiceRoboticCallLogCallPhoneDecryptQueryVO row : rows) {
|
|
|
+ CompanyVoiceRoboticCallLogCallPhoneDecryptExportVO vo = new CompanyVoiceRoboticCallLogCallPhoneDecryptExportVO();
|
|
|
+ vo.setRoboticName(row.getRoboticName());
|
|
|
+ vo.setUserName(row.getUserName());
|
|
|
+ vo.setIntention(resolveIntentionLabel(row.getIntention(), intentionLabelMap));
|
|
|
+ vo.setPhone(PhoneUtil.decryptPhone(row.getPhone()));
|
|
|
+ exportList.add(vo);
|
|
|
+ }
|
|
|
+ return exportList;
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public CompanyVoiceRoboticCallLogCount selectCompanyVoiceRoboticCallPhoneLogCount() {
|
|
|
- return baseMapper.selectCompanyVoiceRoboticCallPhoneLogCount();
|
|
|
+ private Map<String, String> buildIntentionLabelMap() {
|
|
|
+ Map<String, String> map = new HashMap<>();
|
|
|
+ List<SysDictData> dictList = sysDictTypeService.selectDictDataByType("customer_intention_level");
|
|
|
+ if (dictList != null) {
|
|
|
+ for (SysDictData dict : dictList) {
|
|
|
+ map.put(dict.getDictValue(), dict.getDictLabel());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return map;
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public List<CompanyVoiceRoboticCallLogCallPhoneVO> listByRoboticId(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone) {
|
|
|
- return baseMapper.listByRoboticId(companyVoiceRoboticCallLogCallphone);
|
|
|
+ private String resolveIntentionLabel(String intention, Map<String, String> intentionLabelMap) {
|
|
|
+ if (StringUtils.isEmpty(intention)) {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ String label = intentionLabelMap.get(intention);
|
|
|
+ if (StringUtils.isNotEmpty(label)) {
|
|
|
+ return label;
|
|
|
+ }
|
|
|
+ return intention;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void prepareDetailPhoneQuery(CompanyVoiceRoboticCallLogCallphone query) {
|
|
|
+ if (StringUtils.isNotEmpty(query.getPhone())) {
|
|
|
+ query.setEncryptedPhone(PhoneUtil.encryptPhone(query.getPhone()));
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotEmpty(query.getIntention()) && "0".equals(query.getIntention())) {
|
|
|
+ query.setIntentionEmpty(true);
|
|
|
+ query.setIntention(null);
|
|
|
+ } else {
|
|
|
+ query.setIntentionEmpty(null);
|
|
|
+ }
|
|
|
}
|
|
|
/**
|
|
|
* 判断整数
|
|
|
@@ -455,4 +639,51 @@ public class CompanyVoiceRoboticCallLogCallphoneServiceImpl extends ServiceImpl<
|
|
|
public boolean isPositiveInteger(String str) {
|
|
|
return str != null && str.matches("[1-9]\\d*");
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<CompanyVoiceRoboticCallLogCallphone> selectManualAnsweredList(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone) {
|
|
|
+ return baseMapper.selectManualAnsweredList(companyVoiceRoboticCallLogCallphone);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int markHandleFlag(Long logId) {
|
|
|
+ CompanyVoiceRoboticCallLogCallphone updateObj = new CompanyVoiceRoboticCallLogCallphone();
|
|
|
+ updateObj.setLogId(logId);
|
|
|
+ updateObj.setHandleFlag(1);
|
|
|
+ return baseMapper.updateCompanyVoiceRoboticCallLogCallphone(updateObj);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getDecryptPhoneByLogId(Long logId) {
|
|
|
+ CompanyVoiceRoboticCallLogCallphone log = selectCompanyVoiceRoboticCallLogCallphoneByLogId(logId);
|
|
|
+ if (log == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ if (log.getCallerId() != null) {
|
|
|
+ CompanyVoiceRoboticCallees callees = companyVoiceRoboticCalleesMapper.selectCompanyVoiceRoboticCalleesById(log.getCallerId());
|
|
|
+ if (callees != null && StringUtils.isNotEmpty(callees.getPhone())) {
|
|
|
+ return PhoneUtil.decryptPhone(callees.getPhone());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotEmpty(log.getCallerNum())) {
|
|
|
+ return PhoneUtil.decryptPhone(log.getCallerNum());
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<CalleeRoboticCallOutCountVO> countRoboticCallOutByCalleeIds(List<Long> calleeIds, Long roboticId, Long companyId) {
|
|
|
+ if (calleeIds == null || calleeIds.isEmpty() || roboticId == null) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ return baseMapper.countRoboticCallOutByCalleeIds(calleeIds, roboticId, companyId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<CustomerRoboticCallOutCountVO> countRoboticCallOutByCustomerIds(List<Long> customerIds, Long companyId) {
|
|
|
+ if (customerIds == null || customerIds.isEmpty()) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ return baseMapper.countRoboticCallOutByCustomerIds(customerIds, companyId);
|
|
|
+ }
|
|
|
}
|