소스 검색

cid流程

zyy 2 주 전
부모
커밋
97e093aaca

+ 2 - 0
fs-service/src/main/java/com/fs/company/domain/CompanyVoiceRoboticCallLogSendmsg.java

@@ -78,6 +78,8 @@ public class CompanyVoiceRoboticCallLogSendmsg extends BaseEntity{
     @TableField(exist = false)
     private List<Long> callerIds;
 
+    private String callbackUuid;
+
     public static CompanyVoiceRoboticCallLogSendmsg initCallLog( String runParam, Long keyId, Long taskId,Long companyId,Long companyUserId,Long tempId) {
         CompanyVoiceRoboticCallLogSendmsg log = new CompanyVoiceRoboticCallLogSendmsg();
         log.callerId = keyId;

+ 1 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyVoiceRoboticService.java

@@ -48,6 +48,7 @@ public interface ICompanyVoiceRoboticService extends IService<CompanyVoiceRoboti
     CalltaskcreateaiCustomizeResult callPhoneOne(Long roboticId,Long callerId);
     CalltaskcreateaiCustomizeResult workflowCallPhoneOne(Long roboticId, Long callerId, ExecutionContext context, AiCallConfigVO callConfigVo);
     void sendMsgOne(Long roboticId,Long callerId);
+    void workflowSendSmsOne(Long roboticId, Long callerId, ExecutionContext context);
 
     /**
      * 修改机器人外呼任务

+ 94 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyVoiceRoboticServiceImpl.java

@@ -54,6 +54,7 @@ import java.util.stream.Collectors;
 public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRoboticMapper, CompanyVoiceRobotic> implements ICompanyVoiceRoboticService {
 
     private static final String NODE_RUN_KEY = "aicall:node:run:";
+    public static final String WORKFLOW_SMS_ONE_REDIS_KEY = "workflow:sms:one:";
 
     private final CompanyVoiceRoboticMapper companyVoiceRoboticMapper;
     private final AiCallService aiCallService;
@@ -393,6 +394,99 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
 
     }
 
+    @Override
+    public void workflowSendSmsOne(Long roboticId, Long callerId, ExecutionContext context) {
+        try {
+            CompanyVoiceRobotic robotic = companyVoiceRoboticMapper.selectById(roboticId);
+            CompanyVoiceRoboticCallees callees = companyVoiceRoboticCalleesMapper.selectById(callerId);
+            //callbackUuid(短信回执预留)
+            String callbackUuid = UUID.randomUUID().toString();
+            JSONObject userDataJson = new JSONObject();
+            userDataJson.put("callbackUuid", callbackUuid);
+            userDataJson.put("nodeKey", context.getCurrentNodeKey());
+            userDataJson.put("workflowInstanceId", context.getWorkflowInstanceId());
+            userDataJson.put("callerId", callerId);
+            context.setVariable("smsCallbackUuid", callbackUuid);
+            redisCache2.setCacheObject(WORKFLOW_SMS_ONE_REDIS_KEY + callbackUuid,userDataJson.toJSONString());
+            //构建短信参数
+            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(wx.getSmsTempId()));
+            if (temp != null && temp.getStatus().equals(1) && temp.getIsAudit().equals(1)) {
+                CompanySms sms=companySmsService.selectCompanySmsByCompanyId(wxAccount.getCompanyId());
+                if(sms!=null){
+                    if(sms.getRemainSmsCount()>0){
+                        SmsSendBatchParam smsSendBatchParam = new SmsSendBatchParam();
+                        smsSendBatchParam.setCompanyId(wxAccount.getCompanyId());
+                        smsSendBatchParam.setCompanyUserId(wxAccount.getCompanyUserId());
+                        smsSendBatchParam.setSmsType(temp.getTempType());
+                        smsSendBatchParam.setTempCode(temp.getTempCode());
+                        smsSendBatchParam.setContent(temp.getContent());
+                        smsSendBatchParam.setSenderName(wxAccount.getWxNickName());
+                        smsSendBatchParam.setCustomerIds(new Long[]{callees.getUserId()});
+                        //记录工作流级短信日志
+                        JSONObject runParam = (JSONObject) JSON.toJSON(smsSendBatchParam);
+                        runParam.put("temp", temp);
+                        CompanyVoiceRoboticCallLogSendmsg addLog = CompanyVoiceRoboticCallLogSendmsg.initCallLog(
+                                runParam.toJSONString(),
+                                callerId,
+                                roboticId,
+                                wxAccount.getCompanyId(),
+                                wxAccount.getCompanyUserId(),
+                                temp.getTempId()
+                        );
+                        try{
+                            sendMsgBatch(temp,smsSendBatchParam);
+                            addLog.setStatus(1);
+                            addLog.setCallbackUuid(callbackUuid);
+                        } catch(Exception ex){
+                            addLog.setStatus(3);
+                            addLog.setResult(ex.getMessage());
+                            log.error("sendMsgOne异常:",ex);
+                        }
+                        int smsContentLen = getSmsContentLen(smsSendBatchParam);
+                        addLog.setContentLen(smsContentLen);
+                        companyVoiceRoboticCallLogSendmsgService.asyncInsertCompanyVoiceRoboticCallLog(addLog);
+                    }
+                    else{
+                        log.error("剩余短信数量不足,请充值:task:{},companyId:{}",roboticId,wxAccount.getCompanyId());
+                        throw new RuntimeException("剩余短信数量不足,请充值");
+                    }
+                }
+                else{
+                    log.error("请充值:task:{},companyId:{}",roboticId,robotic.getCompanyId());
+                    throw new RuntimeException("请充值");
+                }
+
+                if(StringUtils.isNotBlank(callees.getRunTaskFlow())){
+                    callees.setRunTaskFlow(callees.getRunTaskFlow() + "," + Constants.SEND_MSG);
+                    callees.setIsSendMsg(1);
+                }else{
+                    callees.setRunTaskFlow(Constants.SEND_MSG);
+                }
+                companyVoiceRoboticCalleesMapper.updateById(callees);
+                Integer unfulfilledTaskCount = companyVoiceRoboticCalleesMapper.getRoboticIsDoneByRoboticIdAndTaskFlow(roboticId, Constants.SEND_MSG);
+                //全部完成才更新任务状态
+                if(unfulfilledTaskCount.compareTo(0) == 0){
+                    if(StringUtils.isNotBlank(robotic.getRunTaskFlow())){
+                        robotic.setRunTaskFlow(robotic.getRunTaskFlow() + "," + Constants.SEND_MSG);
+                    }else{
+                        robotic.setRunTaskFlow(Constants.SEND_MSG);
+                    }
+                    companyVoiceRoboticMapper.updateById(robotic);
+                }
+            } else {
+                log.error("模板未审核:task:{},smsTemp:{}", roboticId, temp);
+                throw new RuntimeException("模板未审核");
+            }
+        } catch (Exception ex) {
+            log.error("workflowSendSmsOne 异常 roboticId:{} callerId:{}",roboticId, callerId, ex);
+            throw new RuntimeException(ex);
+        }
+    }
+
+
     @Synchronized
     public void sendMsgOne(Long roboticId,Long callerId){
         try{

+ 20 - 2
fs-service/src/main/java/com/fs/company/service/impl/call/node/AiSendMsgTaskNode.java

@@ -1,5 +1,6 @@
 package com.fs.company.service.impl.call.node;
 
+import com.alibaba.fastjson.JSONObject;
 import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.domain.CompanyAiWorkflowExec;
 import com.fs.company.domain.CompanyVoiceRoboticBusiness;
@@ -7,8 +8,11 @@ import com.fs.company.domain.CompanyWorkflowEdge;
 import com.fs.company.domain.CompanyWorkflowNode;
 import com.fs.company.mapper.CompanyWorkflowNodeMapper;
 import com.fs.company.param.ExecutionContext;
+import com.fs.company.service.ICompanyVoiceRoboticService;
 import com.fs.company.service.IWorkflowNode;
+import com.fs.company.vo.AiCallConfigVO;
 import com.fs.company.vo.ExecutionResult;
+import com.fs.enums.ExecutionStatusEnum;
 import com.fs.enums.NodeTypeEnum;
 import lombok.extern.slf4j.Slf4j;
 
@@ -24,6 +28,8 @@ import java.util.Map;
 public class AiSendMsgTaskNode extends AbstractWorkflowNode {
     private static final CompanyWorkflowNodeMapper companyWorkflowNodeMapper = SpringUtils.getBean(CompanyWorkflowNodeMapper.class);
 
+    private ICompanyVoiceRoboticService companyVoiceRoboticService;
+
     public AiSendMsgTaskNode(String nodeKey, String nodeName, Map<String, Object> properties) {
         super(nodeKey, nodeName, properties);
     }
@@ -67,17 +73,29 @@ public class AiSendMsgTaskNode extends AbstractWorkflowNode {
                     context.getWorkflowInstanceId(), business.getRoboticId(), business.getCalleeId());
             
             // TODO: 这里可以添加实际的发送短信逻辑
+            companyVoiceRoboticService.workflowSendSmsOne(business.getRoboticId(), business.getCalleeId(),context);
             // 更新业务表的发短信动作标记
             companyVoiceRoboticBusinessMapper.updateActionCount(3, business.getRoboticId(),
                     business.getCalleeId(), null);
-            
+
+            //如果需要等待回调,可以在doContinue方法中处理回调逻辑,并在回调时执行下一个节点
+            if(false){
+                super.asyncWorkflowForBlockingNode(context.getWorkflowInstanceId(), context.getCurrentNodeKey(), context, ExecutionStatusEnum.PAUSED);
+                return ExecutionResult.paused()
+                        .outputData(context.getVariables())
+                        .nextNodeKey("").build();
+            }
+
+            //如果不需要等待回调,直接执行下一个节点
             log.info("短信发送成功 - workflowInstanceId: {}", context.getWorkflowInstanceId());
             //CompanyVoiceRoboticServiceImpl.sendMsgOne()
             // 获取下一个节点并执行
             CompanyAiWorkflowExec exec = companyAiWorkflowExecMapper.selectByWorkflowInstanceId(context.getWorkflowInstanceId());
             List<CompanyWorkflowEdge> edges = companyWorkflowEdgeMapper.selectListByWorkflowIdAndNodeKey(
                     exec.getWorkflowId(), nodeKey);
-            
+
+            // 直接执行下一个节点
+            //如果需要等待回调,可以在doContinue方法中处理回调逻辑,并在回调时执行下一个节点
             if (edges != null && !edges.isEmpty()) {
                 // 直接执行下一个节点
                 super.runNextNode(context, edges.get(0));