|
|
@@ -18,14 +18,8 @@ import com.fs.common.exception.base.BaseException;
|
|
|
import com.fs.common.service.impl.SmsServiceImpl;
|
|
|
import com.fs.common.utils.*;
|
|
|
import com.fs.company.domain.*;
|
|
|
-import com.fs.company.mapper.CompanyVoiceRoboticCalleesMapper;
|
|
|
-import com.fs.company.mapper.CompanyVoiceRoboticMapper;
|
|
|
-import com.fs.company.mapper.CompanyVoiceRoboticWxMapper;
|
|
|
-import com.fs.company.mapper.CompanyWxClientMapper;
|
|
|
-import com.fs.company.service.ICompanySmsService;
|
|
|
-import com.fs.company.service.ICompanyVoiceRoboticCallLogService;
|
|
|
-import com.fs.company.service.ICompanyVoiceRoboticService;
|
|
|
-import com.fs.company.service.ICompanyWxAccountService;
|
|
|
+import com.fs.company.mapper.*;
|
|
|
+import com.fs.company.service.*;
|
|
|
import com.fs.company.vo.AddWxClientVo;
|
|
|
import com.fs.company.vo.CompanyVoiceRoboticQwUserListVo;
|
|
|
import com.fs.company.vo.RoboticWxAccountVo;
|
|
|
@@ -39,7 +33,9 @@ import com.fs.system.service.ISysConfigService;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import lombok.Synchronized;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
@@ -81,7 +77,14 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
|
|
|
private final CompanySmsTempServiceImpl smsTempService;
|
|
|
private final ICompanySmsService companySmsService;
|
|
|
private final CompanyWxClientMapper companyWxClientMapper;
|
|
|
- private final ICompanyVoiceRoboticCallLogService companyVoiceRoboticCallLogService;
|
|
|
+ private final CompanyVoiceRoboticCallLogCallphoneServiceImpl companyVoiceRoboticCallLogCallphoneService;
|
|
|
+ private final CompanyWxAccountMapper companyWxAccountMapper;
|
|
|
+
|
|
|
+ private final ICompanyWxClientService companyWxClientService;
|
|
|
+ private final CompanyVoiceRoboticWxServiceImpl companyVoiceRoboticWxServiceImpl;
|
|
|
+ private final CompanyVoiceRoboticCallLogSendmsgServiceImpl companyVoiceRoboticCallLogSendmsgService;
|
|
|
+
|
|
|
+ private final ICompanyUserService companyUserService;
|
|
|
/**
|
|
|
* 查询机器人外呼任务
|
|
|
*
|
|
|
@@ -129,6 +132,7 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
|
|
|
entity.setRoboticId(companyVoiceRobotic.getId());
|
|
|
entity.setAccountId(e.getCompanyUserId());
|
|
|
entity.setWxDialogId(e.getWxDialogId());
|
|
|
+ entity.setSmsTempId(e.getSmsTempId());
|
|
|
return entity;
|
|
|
}).collect(Collectors.toList());
|
|
|
companyVoiceRoboticWxService.saveBatch(collect);
|
|
|
@@ -165,7 +169,7 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
|
|
|
if(customerList.isEmpty()){
|
|
|
throw new BaseException("拨打电话不能为空");
|
|
|
}
|
|
|
- List<CompanyVoiceRoboticCallLog> addLogs = new ArrayList<>();
|
|
|
+ List<CompanyVoiceRoboticCallLogCallphone> addLogs = new ArrayList<>();
|
|
|
// 构建三方接口请求数据
|
|
|
CalltaskcreateaiCustomizeDomain param = new CalltaskcreateaiCustomizeDomain();
|
|
|
param.setRobot(companyVoiceRobotic.getRobot());
|
|
|
@@ -205,12 +209,12 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
|
|
|
runParam.put("companyId", companyVoiceRobotic.getCompanyId());
|
|
|
String runPString = runParam.toJSONString();
|
|
|
calleesList.forEach(call -> {
|
|
|
- CompanyVoiceRoboticCallLog addLog = CompanyVoiceRoboticCallLog.initCallLogByType(Constants.CELL_PHONE,
|
|
|
- runPString, call.getId(), companyVoiceRobotic.getId());
|
|
|
+ CompanyVoiceRoboticCallLogCallphone addLog = CompanyVoiceRoboticCallLogCallphone.initCallLog(
|
|
|
+ runPString, call.getId(), companyVoiceRobotic.getId(),companyVoiceRobotic.getCompanyId());
|
|
|
addLog.setStatus(1);
|
|
|
addLogs.add(addLog);
|
|
|
});
|
|
|
- companyVoiceRoboticCallLogService.asyncInsertCompanyVoiceRoboticCallLogBatch(addLogs);
|
|
|
+ companyVoiceRoboticCallLogCallphoneService.asyncInsertCompanyVoiceRoboticCallLogBatch(addLogs);
|
|
|
// 设置返回数据
|
|
|
companyVoiceRobotic.setTaskId(result.getTaskID());
|
|
|
companyVoiceRobotic.setTaskName(result.getTaskName());
|
|
|
@@ -248,12 +252,12 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
|
|
|
}
|
|
|
JSONObject runParam = (JSONObject) JSON.toJSON(param);
|
|
|
runParam.put("companyId",robotic.getCompanyId());
|
|
|
- CompanyVoiceRoboticCallLog addLog = CompanyVoiceRoboticCallLog.initCallLogByType(Constants.CELL_PHONE,
|
|
|
- runParam.toJSONString(), callerId, roboticId);
|
|
|
+ CompanyVoiceRoboticCallLogCallphone addLog = CompanyVoiceRoboticCallLogCallphone.initCallLog(
|
|
|
+ runParam.toJSONString(), callerId, roboticId,robotic.getCompanyId());
|
|
|
// 请求外呼接口
|
|
|
CalltaskcreateaiCustomizeResult result = aiCallService.calltaskcreateaiCustomize(param, robotic.getCompanyId());
|
|
|
addLog.setStatus(1);
|
|
|
- companyVoiceRoboticCallLogService.asyncInsertCompanyVoiceRoboticCallLog(addLog);
|
|
|
+ companyVoiceRoboticCallLogCallphoneService.asyncInsertCompanyVoiceRoboticCallLog(addLog);
|
|
|
// 设置返回数据
|
|
|
// robotic.setTaskId(result.getTaskID());
|
|
|
// robotic.setTaskName(result.getTaskName());
|
|
|
@@ -293,16 +297,17 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
|
|
|
CompanyVoiceRobotic robotic = companyVoiceRoboticMapper.selectById(roboticId);
|
|
|
CompanyVoiceRoboticCallees callees = companyVoiceRoboticCalleesMapper.selectById(callerId);
|
|
|
CompanyWxClient wxClient = companyWxClientMapper.selectOneByRoboticIdAndUserId(roboticId,callees.getUserId());
|
|
|
+ CompanyVoiceRoboticWx wx = companyVoiceRoboticWxService.getById(wxClient.getRoboticWxId());
|
|
|
CompanyWxAccount wxAccount = companyWxAccountService.selectCompanyWxAccountById(wxClient.getAccountId());
|
|
|
- CompanySmsTemp temp= smsTempService.selectCompanySmsTempById(Long.valueOf(robotic.getSmsTempId()));
|
|
|
+ CompanySmsTemp temp= smsTempService.selectCompanySmsTempById(Long.valueOf(wx.getSmsTempId()));
|
|
|
if(temp!=null&&temp.getStatus().equals(1)&&temp.getIsAudit().equals(1)){
|
|
|
- CompanySms sms=companySmsService.selectCompanySmsByCompanyId(robotic.getCompanyId());
|
|
|
+ CompanySms sms=companySmsService.selectCompanySmsByCompanyId(wxAccount.getCompanyId());
|
|
|
if(sms!=null){
|
|
|
if(sms.getRemainSmsCount()>0){
|
|
|
SmsSendBatchParam smsSendBatchParam=new SmsSendBatchParam();
|
|
|
smsSendBatchParam.setSmsType(temp.getTempType());
|
|
|
- smsSendBatchParam.setCompanyId(robotic.getCompanyId());
|
|
|
- smsSendBatchParam.setCompanyUserId(robotic.getCompanyUserId());
|
|
|
+ smsSendBatchParam.setCompanyId(wxAccount.getCompanyId());
|
|
|
+ smsSendBatchParam.setCompanyUserId(wxAccount.getCompanyUserId());
|
|
|
smsSendBatchParam.setTempCode(temp.getTempCode());
|
|
|
Long[] ids=new Long[1];
|
|
|
ids[0]=callees.getUserId();
|
|
|
@@ -311,17 +316,19 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
|
|
|
smsSendBatchParam.setSenderName(wxAccount.getWxNickName());
|
|
|
JSONObject runParam = (JSONObject) JSON.toJSON(smsSendBatchParam);
|
|
|
runParam.put("temp",temp);
|
|
|
- CompanyVoiceRoboticCallLog addLog = CompanyVoiceRoboticCallLog.initCallLogByType(Constants.SEND_MSG,
|
|
|
- runParam.toJSONString(), callerId, roboticId);
|
|
|
+ CompanyVoiceRoboticCallLogSendmsg addLog = CompanyVoiceRoboticCallLogSendmsg.initCallLog(
|
|
|
+ runParam.toJSONString(), callerId, roboticId,wxAccount.getCompanyId(),wxAccount.getCompanyUserId(),temp.getTempId());
|
|
|
addLog.setStatus(2);
|
|
|
try{
|
|
|
sendMsgBatch(temp,smsSendBatchParam);
|
|
|
- }catch(Exception ex){
|
|
|
+ } catch(Exception ex){
|
|
|
addLog.setStatus(3);
|
|
|
addLog.setResult(ex.getMessage());
|
|
|
log.error("sendMsgOne异常:",ex);
|
|
|
}
|
|
|
- companyVoiceRoboticCallLogService.asyncInsertCompanyVoiceRoboticCallLog(addLog);
|
|
|
+ int smsContentLen = getSmsContentLen(smsSendBatchParam);
|
|
|
+ addLog.setContentLen(smsContentLen);
|
|
|
+ companyVoiceRoboticCallLogSendmsgService.asyncInsertCompanyVoiceRoboticCallLog(addLog);
|
|
|
//如果选择的是名片短链接模版 update by qxj 2023年05月26日10:45:28
|
|
|
// if(StringUtils.isNotEmpty(param.getCardUrl())){
|
|
|
// smsSendBatchParam.setCardUrl(param.getCardUrl());
|
|
|
@@ -367,6 +374,26 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public int getSmsContentLen(SmsSendBatchParam param){
|
|
|
+ CompanyUser companyUser=companyUserService.selectCompanyUserById(param.getCompanyUserId());
|
|
|
+
|
|
|
+ CrmCustomer crmCustomer=crmCustomerService.selectCrmCustomerById(param.getCustomerIds()[0].longValue());
|
|
|
+ String content=param.getContent();
|
|
|
+ if(StringUtils.isNotEmpty(crmCustomer.getCustomerName())){
|
|
|
+ content=content.replace("${sms.csName}",crmCustomer.getCustomerName());
|
|
|
+ }
|
|
|
+ if(companyUser!=null&& StringUtils.isNotEmpty(companyUser.getPhonenumber())){
|
|
|
+ content=content.replace("${sms.phoneNumber}",companyUser.getPhonenumber());
|
|
|
+ }
|
|
|
+ if(StringUtils.isNotEmpty(param.getCardUrl())){
|
|
|
+ content=content.replace("${sms.cardUrl}",param.getCardUrl());
|
|
|
+ }
|
|
|
+ if(StringUtils.isNotEmpty(param.getSenderName())){
|
|
|
+ content=content.replace("${sms.senderName}",param.getSenderName());
|
|
|
+ }
|
|
|
+ return content.length();
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 发送短信
|
|
|
* @param temp
|
|
|
@@ -435,7 +462,7 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
|
|
|
// // 是否全部回调完毕
|
|
|
CompanyVoiceRoboticCallees callee = getResultCalleeInfo(notify);
|
|
|
//更新调用日志
|
|
|
- companyVoiceRoboticCallLogService.asyncHandleCalleeCallBackResult(result,callee);
|
|
|
+ companyVoiceRoboticCallLogCallphoneService.asyncHandleCalleeCallBackResult(result,callee);
|
|
|
long count = companyVoiceRoboticCalleesMapper.countByRoboticIdNotUuid(callee.getRoboticId());
|
|
|
if(count == 0){
|
|
|
// new Thread(() -> dispenseWx(callee.getRoboticId())).start();
|
|
|
@@ -463,6 +490,11 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
|
|
|
CrmCustomer crmCustomer = crmCustomerMapper.selectCrmCustomerById(callee.getUserId());
|
|
|
crmCustomer.setIntention(intention);
|
|
|
crmCustomerMapper.updateById(crmCustomer);
|
|
|
+ CompanyVoiceRobotic companyVoiceRobotic = companyVoiceRoboticMapper.selectCompanyVoiceRoboticById(callee.getRoboticId());
|
|
|
+ //平均分配时 已经完成了分配 不需要走下面的分配动作
|
|
|
+ if(Integer.valueOf(0).equals(companyVoiceRobotic.getAddType())){
|
|
|
+ return;
|
|
|
+ }
|
|
|
List<CompanyVoiceRoboticWx> roboticWxList = companyVoiceRoboticWxMapper.selectByRoboticId(callee.getRoboticId(), intention);
|
|
|
List<CompanyWxAccount> accountList = new ArrayList<>(companyWxAccountService.listByIds(PubFun.listToNewList(roboticWxList, CompanyVoiceRoboticWx::getAccountId)));
|
|
|
Map<Long, CompanyWxAccount> accountMap = PubFun.listToMapByGroupObject(accountList, CompanyWxAccount::getId);
|
|
|
@@ -597,6 +629,63 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
|
|
|
CompanyVoiceRobotic robotic = getById(id);
|
|
|
robotic.setTaskStatus(1);
|
|
|
updateById(robotic);
|
|
|
+ //根据任务加微方式决定是否直接分配微信 平均时 直接分配用户
|
|
|
+ if(Integer.valueOf(0).equals(robotic.getAddType())){
|
|
|
+ allocateWx(robotic);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分配账号
|
|
|
+ * @param robotic
|
|
|
+ */
|
|
|
+ @Transactional
|
|
|
+ public List<CompanyWxClient> allocateWx(CompanyVoiceRobotic robotic) {
|
|
|
+ List<CompanyWxClient> resArr = new ArrayList<>();
|
|
|
+ //找到任务指定的微信用户
|
|
|
+ List<CompanyVoiceRoboticWx> companyVoiceRoboticWxes = companyVoiceRoboticWxMapper.selectByRoboticIdWithGroupBy(robotic.getId());
|
|
|
+ Integer totalSize = 0;
|
|
|
+ if (null != companyVoiceRoboticWxes && !companyVoiceRoboticWxes.isEmpty()) {
|
|
|
+ totalSize = companyVoiceRoboticWxes.size();
|
|
|
+ } else {
|
|
|
+ log.error("分配对象空,数据异常");
|
|
|
+ throw new RuntimeException("没有找到任务指定的微信用户");
|
|
|
+ }
|
|
|
+ List<CompanyWxAccount> accountIds = companyWxAccountMapper.selectBatchIds(PubFun.listToNewList(companyVoiceRoboticWxes, CompanyVoiceRoboticWx::getAccountId));
|
|
|
+ Map<Long, CompanyWxAccount> accountMap = PubFun.listToMapByGroupObject(accountIds, CompanyWxAccount::getId);
|
|
|
+ List<CompanyWxClient> companyWxClients = companyWxClientMapper.selectListByRoboticId(robotic.getId());
|
|
|
+ List<Long> ids = PubFun.listToNewList(companyWxClients, CompanyWxClient::getCustomerId);
|
|
|
+ List<CrmCustomer> crmCustomerList = crmCustomerService.selectCrmCustomerListByIds(ids.stream().map(e -> e + "").collect(Collectors.joining(",")));
|
|
|
+ Map<Long, CrmCustomer> customerMap = PubFun.listToMapByGroupObject(crmCustomerList, CrmCustomer::getCustomerId);
|
|
|
+ if (null == companyWxClients || companyWxClients.isEmpty()) {
|
|
|
+ log.error("分配个微空,数据异常");
|
|
|
+ throw new RuntimeException("没有找到需要分配微信用户");
|
|
|
+ }
|
|
|
+ Integer allocateIndex = 0;
|
|
|
+ List<CompanyVoiceRoboticWx> updateCompanyVoiceRoboticWxList = new ArrayList<>();
|
|
|
+ //分配客户
|
|
|
+ for (CompanyWxClient companyWxClient : companyWxClients) {
|
|
|
+ CompanyVoiceRoboticWx wx = companyVoiceRoboticWxes.get(allocateIndex++ % totalSize);
|
|
|
+ CompanyWxAccount account = accountMap.get(wx.getAccountId());
|
|
|
+ CrmCustomer crmCustomer = customerMap.get(companyWxClient.getCustomerId());
|
|
|
+ companyWxClient.setRoboticWxId(wx.getId());
|
|
|
+ companyWxClient.setAccountId(wx.getAccountId());
|
|
|
+ companyWxClient.setDialogId(wx.getWxDialogId());
|
|
|
+ companyWxClient.setCompanyUserId(account.getCompanyUserId());
|
|
|
+ companyWxClient.setNickName(crmCustomer.getCustomerName());
|
|
|
+ companyWxClient.setPhone(crmCustomer.getMobile());
|
|
|
+ resArr.add(companyWxClient);
|
|
|
+ if (wx.getNum() == null) {
|
|
|
+ wx.setNum(1);
|
|
|
+ } else {
|
|
|
+ wx.setNum(wx.getNum() + 1);
|
|
|
+ }
|
|
|
+ updateCompanyVoiceRoboticWxList.add(wx);
|
|
|
+ }
|
|
|
+ //保存数据库
|
|
|
+ companyWxClientService.updateBatchById(companyWxClients);
|
|
|
+ companyVoiceRoboticWxServiceImpl.updateBatchById(updateCompanyVoiceRoboticWxList);
|
|
|
+ return resArr;
|
|
|
}
|
|
|
|
|
|
|