|
@@ -6,11 +6,10 @@ import com.fs.common.utils.StringUtils;
|
|
|
import com.fs.common.utils.spring.SpringUtils;
|
|
import com.fs.common.utils.spring.SpringUtils;
|
|
|
import com.fs.company.domain.*;
|
|
import com.fs.company.domain.*;
|
|
|
import com.fs.company.enums.BusinessTypeEnum;
|
|
import com.fs.company.enums.BusinessTypeEnum;
|
|
|
-import com.fs.company.mapper.CompanyVoiceRoboticCallLogCallphoneMapper;
|
|
|
|
|
-import com.fs.company.mapper.CompanyVoiceRoboticCalleesMapper;
|
|
|
|
|
-import com.fs.company.mapper.CompanyWorkflowNodeMapper;
|
|
|
|
|
|
|
+import com.fs.company.mapper.*;
|
|
|
import com.fs.company.param.CompanyVoiceRoboticCallBlacklistCheckParam;
|
|
import com.fs.company.param.CompanyVoiceRoboticCallBlacklistCheckParam;
|
|
|
import com.fs.company.param.ExecutionContext;
|
|
import com.fs.company.param.ExecutionContext;
|
|
|
|
|
+import com.fs.company.service.CompanyWorkflowEngine;
|
|
|
import com.fs.company.service.ICompanyVoiceRoboticCallBlacklistService;
|
|
import com.fs.company.service.ICompanyVoiceRoboticCallBlacklistService;
|
|
|
import com.fs.company.service.ICompanyVoiceRoboticService;
|
|
import com.fs.company.service.ICompanyVoiceRoboticService;
|
|
|
import com.fs.company.service.easycall.IEasyCallService;
|
|
import com.fs.company.service.easycall.IEasyCallService;
|
|
@@ -27,6 +26,7 @@ import com.fs.crm.domain.CrmCustomer;
|
|
|
import com.fs.crm.service.ICrmCustomerService;
|
|
import com.fs.crm.service.ICrmCustomerService;
|
|
|
import com.fs.enums.ExecutionStatusEnum;
|
|
import com.fs.enums.ExecutionStatusEnum;
|
|
|
import com.fs.enums.NodeTypeEnum;
|
|
import com.fs.enums.NodeTypeEnum;
|
|
|
|
|
+import com.fs.enums.TaskTypeEnum;
|
|
|
import com.fs.his.config.CidPhoneConfig;
|
|
import com.fs.his.config.CidPhoneConfig;
|
|
|
import com.fs.system.service.ISysConfigService;
|
|
import com.fs.system.service.ISysConfigService;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
@@ -45,6 +45,9 @@ public class AiCallTaskNode extends AbstractWorkflowNode {
|
|
|
private static final ICompanyVoiceRoboticService companyVoiceRoboticService = SpringUtils.getBean(ICompanyVoiceRoboticService.class);
|
|
private static final ICompanyVoiceRoboticService companyVoiceRoboticService = SpringUtils.getBean(ICompanyVoiceRoboticService.class);
|
|
|
/** EasyCallCenter365 外呼服务 */
|
|
/** EasyCallCenter365 外呼服务 */
|
|
|
private static final IEasyCallService easyCallService = SpringUtils.getBean(IEasyCallService.class);
|
|
private static final IEasyCallService easyCallService = SpringUtils.getBean(IEasyCallService.class);
|
|
|
|
|
+ private static final CompanyConfigMapper companyConfigMapper = SpringUtils.getBean(CompanyConfigMapper.class);
|
|
|
|
|
+ private static final CompanySiptaskInfoMapper companySiptaskInfoMapper = SpringUtils.getBean(CompanySiptaskInfoMapper.class);
|
|
|
|
|
+ private static final CompanyWorkflowEngine companyWorkflowEngine = SpringUtils.getBean(CompanyWorkflowEngine.class);
|
|
|
/** 被叫人表 Mapper,用于获取手机号 */
|
|
/** 被叫人表 Mapper,用于获取手机号 */
|
|
|
private static final CompanyVoiceRoboticCalleesMapper companyVoiceRoboticCalleesMapper = SpringUtils.getBean(CompanyVoiceRoboticCalleesMapper.class);
|
|
private static final CompanyVoiceRoboticCalleesMapper companyVoiceRoboticCalleesMapper = SpringUtils.getBean(CompanyVoiceRoboticCalleesMapper.class);
|
|
|
private static final CompanyVoiceRoboticCallLogCallphoneServiceImpl companyVoiceRoboticCallLogCallphoneService = SpringUtils.getBean(CompanyVoiceRoboticCallLogCallphoneServiceImpl.class);
|
|
private static final CompanyVoiceRoboticCallLogCallphoneServiceImpl companyVoiceRoboticCallLogCallphoneService = SpringUtils.getBean(CompanyVoiceRoboticCallLogCallphoneServiceImpl.class);
|
|
@@ -156,6 +159,7 @@ public class AiCallTaskNode extends AbstractWorkflowNode {
|
|
|
//如果没有节点可执行通路 条件均不满足 则标记流程为中断
|
|
//如果没有节点可执行通路 条件均不满足 则标记流程为中断
|
|
|
if(runnableCount < 1){
|
|
if(runnableCount < 1){
|
|
|
super.updateWorkflowStatus(context.getWorkflowInstanceId(), ExecutionStatusEnum.INTERRUPT);
|
|
super.updateWorkflowStatus(context.getWorkflowInstanceId(), ExecutionStatusEnum.INTERRUPT);
|
|
|
|
|
+ super.taskFinish(context);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
return null;
|
|
@@ -260,6 +264,16 @@ public class AiCallTaskNode extends AbstractWorkflowNode {
|
|
|
private void workflowCallPhoneOne4EasyCall(Long roboticId,Long calleeId, ExecutionContext context, AiCallConfigVO callConfigVo) {
|
|
private void workflowCallPhoneOne4EasyCall(Long roboticId,Long calleeId, ExecutionContext context, AiCallConfigVO callConfigVo) {
|
|
|
|
|
|
|
|
CompanyVoiceRobotic robotic = companyVoiceRoboticMapper.selectById(roboticId);
|
|
CompanyVoiceRobotic robotic = companyVoiceRoboticMapper.selectById(roboticId);
|
|
|
|
|
+ String callBackUrl = "";
|
|
|
|
|
+ try{
|
|
|
|
|
+ CompanyConfig companyConfig = companyConfigMapper.selectCompanyConfigByKey(robotic.getCompanyId(), "cId.config");
|
|
|
|
|
+ CidPhoneConfig cidConf = JSONObject.parseObject(companyConfig.getConfigValue(), CidPhoneConfig.class);
|
|
|
|
|
+ if(null != cidConf && StringUtils.isNotBlank(cidConf.getCallbackUrl())){
|
|
|
|
|
+ callBackUrl = cidConf.getCallbackUrl();
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception ex){
|
|
|
|
|
+ log.error("获取公司Cid配置失败:{}", ex);
|
|
|
|
|
+ }
|
|
|
// 1. 生成回调唯一标识符,后续回调时通过此 uuid 匹配对应的流程实例
|
|
// 1. 生成回调唯一标识符,后续回调时通过此 uuid 匹配对应的流程实例
|
|
|
String callBackUuid = UUID.randomUUID().toString();
|
|
String callBackUuid = UUID.randomUUID().toString();
|
|
|
// 将回调信息写入 Redis,保存 1 天
|
|
// 将回调信息写入 Redis,保存 1 天
|
|
@@ -293,42 +307,44 @@ public class AiCallTaskNode extends AbstractWorkflowNode {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 3. 构建创建任务参数(AI 外呼模式:taskType=1)
|
|
// 3. 构建创建任务参数(AI 外呼模式:taskType=1)
|
|
|
- EasyCallCreateTaskParam createParam = new EasyCallCreateTaskParam();
|
|
|
|
|
- // 任务名称:使用工作流实例 ID + 被叫人 ID 组合,保证唯一性
|
|
|
|
|
- createParam.setBatchName(robotic.getName() + "_" + context.getWorkflowInstanceId() + "_" + calleeId);
|
|
|
|
|
- if (null != callConfigVo.getMaxConcurrency())
|
|
|
|
|
- createParam.setThreadNum(Long.valueOf(callConfigVo.getMaxConcurrency()));
|
|
|
|
|
- else {
|
|
|
|
|
- createParam.setThreadNum(3L);
|
|
|
|
|
- }
|
|
|
|
|
- // AI 外呼模式
|
|
|
|
|
- createParam.setTaskType(1);
|
|
|
|
|
- // 外呼线路(网关)
|
|
|
|
|
- createParam.setGatewayId(callConfigVo.getGatewayId());
|
|
|
|
|
- // 大模型底座
|
|
|
|
|
- createParam.setLlmAccountId(callConfigVo.getLlmAccountId());
|
|
|
|
|
- // 音色编号
|
|
|
|
|
- createParam.setVoiceCode(callConfigVo.getVoiceCode());
|
|
|
|
|
- // 音色来源(如未配置默认留空,由 EasyCallCenter365 使用默认值)
|
|
|
|
|
- createParam.setVoiceSource(callConfigVo.getVoiceSource());
|
|
|
|
|
- // 技能组(转人工客服分组,可选)
|
|
|
|
|
- createParam.setGroupId(callConfigVo.getBusiGroupId());
|
|
|
|
|
-
|
|
|
|
|
- JSONObject runParam = (JSONObject) JSON.toJSON(createParam);
|
|
|
|
|
- runParam.put("companyId", robotic.getCompanyId());
|
|
|
|
|
- CompanyVoiceRoboticCallLogCallphone addLog = CompanyVoiceRoboticCallLogCallphone.initCallLog(
|
|
|
|
|
- runParam.toJSONString(), calleeId, roboticId, robotic.getCompanyId());
|
|
|
|
|
|
|
+// EasyCallCreateTaskParam createParam = new EasyCallCreateTaskParam();
|
|
|
|
|
+// // 任务名称:使用工作流实例 ID + 被叫人 ID 组合,保证唯一性
|
|
|
|
|
+// createParam.setBatchName(robotic.getName() + "_" + context.getWorkflowInstanceId() + "_" + calleeId);
|
|
|
|
|
+// if (null != callConfigVo.getMaxConcurrency())
|
|
|
|
|
+// createParam.setThreadNum(Long.valueOf(callConfigVo.getMaxConcurrency()));
|
|
|
|
|
+// else {
|
|
|
|
|
+// createParam.setThreadNum(3L);
|
|
|
|
|
+// }
|
|
|
|
|
+// // AI 外呼模式
|
|
|
|
|
+// createParam.setTaskType(1);
|
|
|
|
|
+// // 外呼线路(网关)
|
|
|
|
|
+// createParam.setGatewayId(callConfigVo.getGatewayId());
|
|
|
|
|
+// // 大模型底座
|
|
|
|
|
+// createParam.setLlmAccountId(callConfigVo.getLlmAccountId());
|
|
|
|
|
+// // 音色编号
|
|
|
|
|
+// createParam.setVoiceCode(callConfigVo.getVoiceCode());
|
|
|
|
|
+// // 音色来源(如未配置默认留空,由 EasyCallCenter365 使用默认值)
|
|
|
|
|
+// createParam.setVoiceSource(callConfigVo.getVoiceSource());
|
|
|
|
|
+// // 技能组(转人工客服分组,可选)
|
|
|
|
|
+// createParam.setGroupId(callConfigVo.getBusiGroupId());
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
// 4. 调用 EasyCallCenter365 创建任务接口
|
|
// 4. 调用 EasyCallCenter365 创建任务接口
|
|
|
// companyId 传 null 是因为 EasyCallCenter365 是全局地址,不需要按公司隔离
|
|
// companyId 传 null 是因为 EasyCallCenter365 是全局地址,不需要按公司隔离
|
|
|
- log.info("workflowCallPhoneOne4EasyCall: 创建 EasyCall 任务 - workflowInstanceId: {}, calleeId: {}",
|
|
|
|
|
- context.getWorkflowInstanceId(), calleeId);
|
|
|
|
|
- EasyCallTaskVO task = easyCallService.createTask(createParam, null);
|
|
|
|
|
- if (task == null || task.getBatchId() == null) {
|
|
|
|
|
- log.error("workflowCallPhoneOne4EasyCall: 创建 EasyCall 任务失败 - workflowInstanceId: {}",
|
|
|
|
|
- context.getWorkflowInstanceId());
|
|
|
|
|
- throw new RuntimeException("EasyCallCenter365 创建任务失败");
|
|
|
|
|
|
|
+// log.info("workflowCallPhoneOne4EasyCall: 创建 EasyCall 任务 - workflowInstanceId: {}, calleeId: {}",
|
|
|
|
|
+// context.getWorkflowInstanceId(), calleeId);
|
|
|
|
|
+// EasyCallTaskVO task = easyCallService.createTask(createParam, null);
|
|
|
|
|
+// if (task == null || task.getBatchId() == null) {
|
|
|
|
|
+// log.error("workflowCallPhoneOne4EasyCall: 创建 EasyCall 任务失败 - workflowInstanceId: {}",
|
|
|
|
|
+// context.getWorkflowInstanceId());
|
|
|
|
|
+// throw new RuntimeException("EasyCallCenter365 创建任务失败");
|
|
|
|
|
+// }
|
|
|
|
|
+ Long batchId = getTaskBatchId(robotic.getId(), context.getCurrentNodeKey(), context.getWorkflowInstanceId());
|
|
|
|
|
+ if(null == batchId ){
|
|
|
|
|
+ log.error("workflowCallPhoneOne4EasyCall: 获取 EasyCall 任务批次ID失败 - workflowInstanceId: {}",context.getWorkflowInstanceId());
|
|
|
|
|
+ throw new RuntimeException("任务批次ID失败");
|
|
|
}
|
|
}
|
|
|
- Long batchId = task.getBatchId();
|
|
|
|
|
|
|
+
|
|
|
log.info("workflowCallPhoneOne4EasyCall: EasyCall 任务创建成功 - batchId: {}", batchId);
|
|
log.info("workflowCallPhoneOne4EasyCall: EasyCall 任务创建成功 - batchId: {}", batchId);
|
|
|
|
|
|
|
|
// 5. 将被叫号码加入任务名单(使用通用追加接口,支持传入业务数据)
|
|
// 5. 将被叫号码加入任务名单(使用通用追加接口,支持传入业务数据)
|
|
@@ -338,7 +354,7 @@ public class AiCallTaskNode extends AbstractWorkflowNode {
|
|
|
EasyCallPhoneItemVO phoneItem = new EasyCallPhoneItemVO();
|
|
EasyCallPhoneItemVO phoneItem = new EasyCallPhoneItemVO();
|
|
|
phoneItem.setPhoneNum(callees.getPhone());
|
|
phoneItem.setPhoneNum(callees.getPhone());
|
|
|
// bizJson 默认传入客户姓名占位,运行时可根据实际业务填充
|
|
// bizJson 默认传入客户姓名占位,运行时可根据实际业务填充
|
|
|
- phoneItem.setBizJson(new JSONObject().fluentPut("custName", callees.getUserName()).fluentPut("callBackUuid",callBackUuid));
|
|
|
|
|
|
|
+ phoneItem.setBizJson(new JSONObject().fluentPut("custName", callees.getUserName()).fluentPut("callBackUuid",callBackUuid).fluentPut("callBackUrl",callBackUrl));
|
|
|
addListParam.setPhoneList(Collections.singletonList(phoneItem));
|
|
addListParam.setPhoneList(Collections.singletonList(phoneItem));
|
|
|
easyCallService.addCommonCallList(addListParam, null);
|
|
easyCallService.addCommonCallList(addListParam, null);
|
|
|
log.info("workflowCallPhoneOne4EasyCall: 名单追加成功 - batchId: {}, phone: {}",
|
|
log.info("workflowCallPhoneOne4EasyCall: 名单追加成功 - batchId: {}, phone: {}",
|
|
@@ -347,6 +363,10 @@ public class AiCallTaskNode extends AbstractWorkflowNode {
|
|
|
// 6. 启动外呼任务
|
|
// 6. 启动外呼任务
|
|
|
easyCallService.startTask(batchId, null);
|
|
easyCallService.startTask(batchId, null);
|
|
|
log.info("workflowCallPhoneOne4EasyCall: 任务启动成功 - batchId: {}", batchId);
|
|
log.info("workflowCallPhoneOne4EasyCall: 任务启动成功 - batchId: {}", batchId);
|
|
|
|
|
+ JSONObject runParam = (JSONObject) JSON.toJSON(addListParam);
|
|
|
|
|
+ runParam.put("companyId", robotic.getCompanyId());
|
|
|
|
|
+ CompanyVoiceRoboticCallLogCallphone addLog = CompanyVoiceRoboticCallLogCallphone.initCallLog(
|
|
|
|
|
+ runParam.toJSONString(), calleeId, roboticId, robotic.getCompanyId());
|
|
|
addLog.setStatus(1);
|
|
addLog.setStatus(1);
|
|
|
addLog.setCallbackUuid(callBackUuid);
|
|
addLog.setCallbackUuid(callBackUuid);
|
|
|
companyVoiceRoboticCallLogCallphoneService.asyncInsertCompanyVoiceRoboticCallLog(addLog);
|
|
companyVoiceRoboticCallLogCallphoneService.asyncInsertCompanyVoiceRoboticCallLog(addLog);
|
|
@@ -374,6 +394,22 @@ public class AiCallTaskNode extends AbstractWorkflowNode {
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取siptaskid
|
|
|
|
|
+ * @param roboticId
|
|
|
|
|
+ * @param nodeKey
|
|
|
|
|
+ * @param workflowInstanceId
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ public Long getTaskBatchId(Long roboticId, String nodeKey, String workflowInstanceId){
|
|
|
|
|
+ CompanySiptaskInfo sipTaskInfo = companySiptaskInfoMapper.selectSipTaskInfoByTaskIdAndNodeKey(roboticId, nodeKey);
|
|
|
|
|
+ if(null != sipTaskInfo && null != sipTaskInfo.getBatchId()){
|
|
|
|
|
+ return sipTaskInfo.getBatchId();
|
|
|
|
|
+ }
|
|
|
|
|
+ //没有的情况下创建任务并返回
|
|
|
|
|
+ CompanyAiWorkflowExec companyAiWorkflowExec = companyAiWorkflowExecMapper.selectByWorkflowInstanceId(workflowInstanceId);
|
|
|
|
|
+ return companyWorkflowEngine.createSipTask(roboticId, companyAiWorkflowExec.getWorkflowId());
|
|
|
|
|
+ }
|
|
|
// @Override
|
|
// @Override
|
|
|
// protected void postExecute(ExecutionContext context, ExecutionResult result) {
|
|
// protected void postExecute(ExecutionContext context, ExecutionResult result) {
|
|
|
// super.postExecute(context, result);
|
|
// super.postExecute(context, result);
|