lmx hace 1 mes
padre
commit
c9fc453b2d
Se han modificado 26 ficheros con 1679 adiciones y 103 borrados
  1. 5 0
      fs-company/pom.xml
  2. 1 1
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  3. 32 0
      fs-company/src/test/java/com/mixLiu/test/mixLiuTester.java
  4. 2 2
      fs-quartz/src/main/java/com/fs/quartz/config/ScheduleConfig.java
  5. 2 0
      fs-service/src/main/java/com/fs/aicall/domain/BaseDomain.java
  6. 14 0
      fs-service/src/main/java/com/fs/aicall/service/AiCallService.java
  7. 2 2
      fs-service/src/main/java/com/fs/common/service/impl/SmsServiceImpl.java
  8. 72 0
      fs-service/src/main/java/com/fs/company/domain/CompanyVoiceRoboticCallLogAddwx.java
  9. 111 0
      fs-service/src/main/java/com/fs/company/domain/CompanyVoiceRoboticCallLogCallphone.java
  10. 85 0
      fs-service/src/main/java/com/fs/company/domain/CompanyVoiceRoboticCallLogSendmsg.java
  11. 2 0
      fs-service/src/main/java/com/fs/company/domain/CompanyVoiceRoboticWx.java
  12. 61 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyVoiceRoboticCallLogAddwxMapper.java
  13. 67 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyVoiceRoboticCallLogCallphoneMapper.java
  14. 61 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyVoiceRoboticCallLogSendmsgMapper.java
  15. 61 0
      fs-service/src/main/java/com/fs/company/service/ICompanyVoiceRoboticCallLogAddwxService.java
  16. 61 0
      fs-service/src/main/java/com/fs/company/service/ICompanyVoiceRoboticCallLogCallphoneService.java
  17. 61 0
      fs-service/src/main/java/com/fs/company/service/ICompanyVoiceRoboticCallLogSendmsgService.java
  18. 108 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyVoiceRoboticCallLogAddwxServiceImpl.java
  19. 182 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyVoiceRoboticCallLogCallphoneServiceImpl.java
  20. 111 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyVoiceRoboticCallLogSendmsgServiceImpl.java
  21. 114 25
      fs-service/src/main/java/com/fs/company/service/impl/CompanyVoiceRoboticServiceImpl.java
  22. 1 0
      fs-service/src/main/java/com/fs/company/vo/RoboticWxVo.java
  23. 95 0
      fs-service/src/main/resources/mapper/company/CompanyVoiceRoboticCallLogAddwxMapper.xml
  24. 152 0
      fs-service/src/main/resources/mapper/company/CompanyVoiceRoboticCallLogCallphoneMapper.xml
  25. 110 0
      fs-service/src/main/resources/mapper/company/CompanyVoiceRoboticCallLogSendmsgMapper.xml
  26. 106 73
      fs-wx-task/src/main/java/com/fs/app/service/WxTaskService.java

+ 5 - 0
fs-company/pom.xml

@@ -56,6 +56,11 @@
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+        </dependency>
+
         <!-- SpringBoot 拦截器 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 1 - 1
fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java

@@ -737,7 +737,7 @@ public class CompanyUserController extends BaseController {
 
     @ApiOperation("校验客服是否注册新的im")
     @PostMapping("/accountCheck")
-    public R accountCheck(@RequestBody Map<String, String> userIdMap){
+    public R accountCheck(@RequestBody Map<String, String> userIdMap) throws  Exception{
         //获取管理员token
         String userId = userIdMap.get("userId");
         String adminToken = openIMService.getAdminToken();

+ 32 - 0
fs-company/src/test/java/com/mixLiu/test/mixLiuTester.java

@@ -0,0 +1,32 @@
+package com.mixLiu.test;
+
+import com.fs.FsCompanyApplication;
+import com.fs.aicall.domain.TaskInfo;
+import com.fs.aicall.domain.param.getDialogMapDomain;
+import com.fs.aicall.service.AiCallService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = FsCompanyApplication.class)
+@RequiredArgsConstructor
+@Slf4j
+public class mixLiuTester {
+
+    @Autowired
+    AiCallService aiCallService;
+
+    @Test
+    public void testQuery(){
+        getDialogMapDomain getDialogMap = getDialogMapDomain.builder()
+                .uuid("9aa78108-f123-11f0-a543-e1463f771d05")
+                .build();
+        TaskInfo dialogMap = aiCallService.getDialogMapNew(getDialogMap, 329L);
+        log.info("{}",dialogMap);
+    }
+}

+ 2 - 2
fs-quartz/src/main/java/com/fs/quartz/config/ScheduleConfig.java

@@ -50,8 +50,8 @@ public class ScheduleConfig
         // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
         factory.setOverwriteExistingJobs(true);
         // 设置自动启动,默认为true
-        factory.setAutoStartup(true);
-//        factory.setAutoStartup(false);
+//        factory.setAutoStartup(true);
+        factory.setAutoStartup(false);
 
         return factory;
     }

+ 2 - 0
fs-service/src/main/java/com/fs/aicall/domain/BaseDomain.java

@@ -1,5 +1,6 @@
 package com.fs.aicall.domain;
 
+import com.alibaba.fastjson.JSONObject;
 import lombok.Data;
 
 @Data
@@ -7,4 +8,5 @@ public class BaseDomain {
     private String seq;
     private String userData;
 
+    private JSONObject telData;
 }

+ 14 - 0
fs-service/src/main/java/com/fs/aicall/service/AiCallService.java

@@ -42,6 +42,16 @@ public class AiCallService {
             return t;
         };
     }
+    private <T extends BaseDomain> Function<JSONObject, T> getObjWithTelData(String attr, Class<T> clazz){
+        return e -> {
+            T t = e.getJSONObject(attr).toJavaObject(clazz);
+            t.setUserData(e.getString("userData"));
+            t.setSeq(e.getString("seq"));
+            t.setTelData(e.getJSONObject("telData"));
+            return t;
+        };
+    }
+
     private <T extends BaseDomain> Function<JSONObject, List<T>> getList(String attr, Class<T> clazz){
         return e -> {
             List<T> list = e.getJSONArray(attr).toJavaList(clazz);
@@ -125,6 +135,10 @@ public class AiCallService {
     public TaskInfo getDialogMap(getDialogMapDomain param, Long companyId){
         return AiCallUtils.send("getDialogMap", OBJECT_MAPPER.valueToTree(param), getObj("telData", TaskInfo.class), companyId);
     }
+
+    public TaskInfo getDialogMapNew(getDialogMapDomain param, Long companyId){
+        return AiCallUtils.send("getDialogMap", OBJECT_MAPPER.valueToTree(param), getObjWithTelData("telData", TaskInfo.class), companyId);
+    }
     /**
      * 获取主叫分组
      * @param param 参数

+ 2 - 2
fs-service/src/main/java/com/fs/common/service/impl/SmsServiceImpl.java

@@ -653,8 +653,8 @@ public class SmsServiceImpl implements ISmsService
             if(StringUtils.isNotEmpty(param.getCardUrl())){
                 content=content.replace("${sms.cardUrl}",param.getCardUrl());
             }
-            if(StringUtils.isNotEmpty(param.getCardUrl())){
-                content=content.replace("${sms.cardUrl}",param.getCardUrl());
+            if(StringUtils.isNotEmpty(param.getSenderName())){
+                content=content.replace("${sms.senderName}",param.getSenderName());
             }
 
             String urls= null;

+ 72 - 0
fs-service/src/main/java/com/fs/company/domain/CompanyVoiceRoboticCallLogAddwx.java

@@ -0,0 +1,72 @@
+package com.fs.company.domain;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import com.fs.common.constant.Constants;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 调用日志_加微信对象 company_voice_robotic_call_log_addwx
+ *
+ * @author fs
+ * @date 2026-01-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CompanyVoiceRoboticCallLogAddwx extends BaseEntity{
+
+    /** $column.columnComment */
+    @TableId(value = "log_id", type = IdType.AUTO)
+    private Long logId;
+
+    /** 任务id */
+    @Excel(name = "任务id")
+    private Long roboticId;
+
+    /** wx_client_id */
+    @Excel(name = "wx_client_id")
+    private Long wxClientId;
+
+
+    /** 记录调用时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "记录调用时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date runTime;
+
+    /** 调用参数 */
+    @Excel(name = "调用参数")
+    private String runParam;
+
+    /** 执行结果 */
+    @Excel(name = "执行结果")
+    private String result;
+
+    /** 执行状态:1、执行中,2、执行成功,3、执行失败 */
+    @Excel(name = "执行状态:1、执行中,2、执行成功,3、执行失败")
+    private Integer status;
+
+    /** 公司id */
+    @Excel(name = "公司id")
+    private Long companyId;
+
+    /** 个微账号id */
+    @Excel(name = "个微账号id")
+    private Long wxAccountId;
+    public static CompanyVoiceRoboticCallLogAddwx initCallLog( String runParam, Long keyId, Long taskId,Long wxAccountId,Long companyId) {
+        CompanyVoiceRoboticCallLogAddwx log = new CompanyVoiceRoboticCallLogAddwx();
+        log.wxClientId = keyId;
+        log.runParam = runParam;
+        log.roboticId = taskId;
+        log.runTime = new Date();
+        log.wxAccountId = wxAccountId;
+        log.companyId = companyId;
+        return log;
+    }
+
+}

+ 111 - 0
fs-service/src/main/java/com/fs/company/domain/CompanyVoiceRoboticCallLogCallphone.java

@@ -0,0 +1,111 @@
+package com.fs.company.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 调用日志_ai打电话对象 company_voice_robotic_call_log_callphone
+ *
+ * @author fs
+ * @date 2026-01-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CompanyVoiceRoboticCallLogCallphone extends BaseEntity{
+
+    /** $column.columnComment */
+    @TableId(value = "log_id", type = IdType.AUTO)
+    private Long logId;
+
+    /** 任务id */
+    @Excel(name = "任务id")
+    private Long roboticId;
+
+    /** caller_id */
+    @Excel(name = "caller_id")
+    private Long callerId;
+
+    /** 记录调用时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "记录调用时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date runTime;
+
+    /** 调用参数 */
+    @Excel(name = "调用参数")
+    private String runParam;
+
+    /** 回调返回结果 */
+    @Excel(name = "回调返回结果")
+    private String result;
+
+    /** 执行状态:1、执行中,2、执行成功,3、执行失败 */
+    @Excel(name = "执行状态:1、执行中,2、执行成功,3、执行失败")
+    private Integer status;
+
+    /** 录音地址 */
+    @Excel(name = "录音地址")
+    private String recordPath;
+
+    /** 通话详细列表 */
+    @Excel(name = "通话详细列表")
+    private String contentList;
+
+    /** 客户号码 */
+    @Excel(name = "客户号码")
+    private String callerNum;
+
+    /** 话术号码 */
+    @Excel(name = "话术号码")
+    private String calleeNum;
+
+    /** 通话的唯一标识 */
+    @Excel(name = "通话的唯一标识")
+    private String uuid;
+
+    /** 呼入时间 */
+    @Excel(name = "呼入时间")
+    private Long callCreateTime;
+
+    /** 应答时间 */
+    @Excel(name = "应答时间")
+    private Long callAnswerTime;
+
+    /** 客户类型 */
+    @Excel(name = "客户类型")
+    private String intention;
+
+    /** 公司id */
+    @Excel(name = "公司id")
+    private Long companyId;
+
+    /** 销售id */
+    @Excel(name = "销售id")
+    private Long companyUserId;
+
+    /** 通话时长,单位秒 */
+    @Excel(name = "通话时长,单位秒")
+    private Long callTime;
+
+    /** 花费金额 */
+    @Excel(name = "花费金额")
+    private BigDecimal cost;
+
+    public static CompanyVoiceRoboticCallLogCallphone initCallLog( String runParam, Long keyId, Long taskId,Long companyId) {
+        CompanyVoiceRoboticCallLogCallphone log = new CompanyVoiceRoboticCallLogCallphone();
+        log.callerId = keyId;
+        log.runParam = runParam;
+        log.roboticId = taskId;
+        log.runTime = new Date();
+        log.companyId = companyId;
+        return log;
+    }
+
+}

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

@@ -0,0 +1,85 @@
+package com.fs.company.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 调用日志_发送短信对象 company_voice_robotic_call_log_sendmsg
+ *
+ * @author fs
+ * @date 2026-01-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CompanyVoiceRoboticCallLogSendmsg extends BaseEntity{
+
+    /** $column.columnComment */
+    @TableId(value = "log_id", type = IdType.AUTO)
+    private Long logId;
+
+    /** 任务id */
+    @Excel(name = "任务id")
+    private Long roboticId;
+
+    /** caller_id */
+    @Excel(name = "caller_id")
+    private Long callerId;
+
+    /** 记录调用时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "记录调用时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date runTime;
+
+    /** 调用参数 */
+    @Excel(name = "调用参数")
+    private String runParam;
+
+    /** 执行结果 */
+    @Excel(name = "执行结果")
+    private String result;
+
+    /** 执行状态:1、执行中,2、执行成功,3、执行失败 */
+    @Excel(name = "执行状态:1、执行中,2、执行成功,3、执行失败")
+    private Integer status;
+
+    /** 公司id */
+    @Excel(name = "公司id")
+    private Long companyId;
+
+    /** 销售id */
+    @Excel(name = "销售id")
+    private Long companyUserId;
+
+    /** 发送短信模板id */
+    @Excel(name = "发送短信模板id")
+    private Long tempId;
+
+    /** 花费金额 */
+    @Excel(name = "花费金额")
+    private BigDecimal cost;
+
+    /** 内容长度 */
+    @Excel(name = "内容长度")
+    private Integer contentLen;
+
+    public static CompanyVoiceRoboticCallLogSendmsg initCallLog( String runParam, Long keyId, Long taskId,Long companyId,Long companyUserId,Long tempId) {
+        CompanyVoiceRoboticCallLogSendmsg log = new CompanyVoiceRoboticCallLogSendmsg();
+        log.callerId = keyId;
+        log.runParam = runParam;
+        log.roboticId = taskId;
+        log.runTime = new Date();
+        log.companyId = companyId;
+        log.companyUserId = companyUserId;
+        log.tempId = tempId;
+        return log;
+    }
+
+}

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

@@ -56,4 +56,6 @@ public class CompanyVoiceRoboticWx extends BaseEntityTow {
     private int indexNumber;
     @TableField(exist = false)
     private CompanyWxAccount account;
+    //配置短信模板id
+    private Integer smsTempId;
 }

+ 61 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyVoiceRoboticCallLogAddwxMapper.java

@@ -0,0 +1,61 @@
+package com.fs.company.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.company.domain.CompanyVoiceRoboticCallLogAddwx;
+
+/**
+ * 调用日志_加微信Mapper接口
+ * 
+ * @author fs
+ * @date 2026-01-15
+ */
+public interface CompanyVoiceRoboticCallLogAddwxMapper extends BaseMapper<CompanyVoiceRoboticCallLogAddwx>{
+    /**
+     * 查询调用日志_加微信
+     * 
+     * @param logId 调用日志_加微信主键
+     * @return 调用日志_加微信
+     */
+    CompanyVoiceRoboticCallLogAddwx selectCompanyVoiceRoboticCallLogAddwxByLogId(Long logId);
+
+    /**
+     * 查询调用日志_加微信列表
+     * 
+     * @param companyVoiceRoboticCallLogAddwx 调用日志_加微信
+     * @return 调用日志_加微信集合
+     */
+    List<CompanyVoiceRoboticCallLogAddwx> selectCompanyVoiceRoboticCallLogAddwxList(CompanyVoiceRoboticCallLogAddwx companyVoiceRoboticCallLogAddwx);
+
+    /**
+     * 新增调用日志_加微信
+     * 
+     * @param companyVoiceRoboticCallLogAddwx 调用日志_加微信
+     * @return 结果
+     */
+    int insertCompanyVoiceRoboticCallLogAddwx(CompanyVoiceRoboticCallLogAddwx companyVoiceRoboticCallLogAddwx);
+
+    /**
+     * 修改调用日志_加微信
+     * 
+     * @param companyVoiceRoboticCallLogAddwx 调用日志_加微信
+     * @return 结果
+     */
+    int updateCompanyVoiceRoboticCallLogAddwx(CompanyVoiceRoboticCallLogAddwx companyVoiceRoboticCallLogAddwx);
+
+    /**
+     * 删除调用日志_加微信
+     * 
+     * @param logId 调用日志_加微信主键
+     * @return 结果
+     */
+    int deleteCompanyVoiceRoboticCallLogAddwxByLogId(Long logId);
+
+    /**
+     * 批量删除调用日志_加微信
+     * 
+     * @param logIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteCompanyVoiceRoboticCallLogAddwxByLogIds(Long[] logIds);
+}

+ 67 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyVoiceRoboticCallLogCallphoneMapper.java

@@ -0,0 +1,67 @@
+package com.fs.company.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.company.domain.CompanyVoiceRoboticCallLogCallphone;
+import com.fs.company.domain.CompanyVoiceRoboticCallees;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 调用日志_ai打电话Mapper接口
+ * 
+ * @author fs
+ * @date 2026-01-15
+ */
+public interface CompanyVoiceRoboticCallLogCallphoneMapper extends BaseMapper<CompanyVoiceRoboticCallLogCallphone>{
+    /**
+     * 查询调用日志_ai打电话
+     * 
+     * @param logId 调用日志_ai打电话主键
+     * @return 调用日志_ai打电话
+     */
+    CompanyVoiceRoboticCallLogCallphone selectCompanyVoiceRoboticCallLogCallphoneByLogId(Long logId);
+
+    /**
+     * 查询调用日志_ai打电话列表
+     * 
+     * @param companyVoiceRoboticCallLogCallphone 调用日志_ai打电话
+     * @return 调用日志_ai打电话集合
+     */
+    List<CompanyVoiceRoboticCallLogCallphone> selectCompanyVoiceRoboticCallLogCallphoneList(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone);
+
+    /**
+     * 新增调用日志_ai打电话
+     * 
+     * @param companyVoiceRoboticCallLogCallphone 调用日志_ai打电话
+     * @return 结果
+     */
+    int insertCompanyVoiceRoboticCallLogCallphone(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone);
+
+    /**
+     * 修改调用日志_ai打电话
+     * 
+     * @param companyVoiceRoboticCallLogCallphone 调用日志_ai打电话
+     * @return 结果
+     */
+    int updateCompanyVoiceRoboticCallLogCallphone(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone);
+
+    /**
+     * 删除调用日志_ai打电话
+     * 
+     * @param logId 调用日志_ai打电话主键
+     * @return 结果
+     */
+    int deleteCompanyVoiceRoboticCallLogCallphoneByLogId(Long logId);
+
+    /**
+     * 批量删除调用日志_ai打电话
+     * 
+     * @param logIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteCompanyVoiceRoboticCallLogCallphoneByLogIds(Long[] logIds);
+
+    CompanyVoiceRoboticCallLogCallphone selectNoResultLogByCallees(CompanyVoiceRoboticCallees callees);
+
+    CompanyVoiceRoboticCallLogCallphone selectLogByRoboticIdAndCallerId(@Param("roboticId") Long roboticId,@Param("callerId") Long callerId);
+}

+ 61 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyVoiceRoboticCallLogSendmsgMapper.java

@@ -0,0 +1,61 @@
+package com.fs.company.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.company.domain.CompanyVoiceRoboticCallLogSendmsg;
+
+/**
+ * 调用日志_发送短信Mapper接口
+ * 
+ * @author fs
+ * @date 2026-01-15
+ */
+public interface CompanyVoiceRoboticCallLogSendmsgMapper extends BaseMapper<CompanyVoiceRoboticCallLogSendmsg>{
+    /**
+     * 查询调用日志_发送短信
+     * 
+     * @param logId 调用日志_发送短信主键
+     * @return 调用日志_发送短信
+     */
+    CompanyVoiceRoboticCallLogSendmsg selectCompanyVoiceRoboticCallLogSendmsgByLogId(Long logId);
+
+    /**
+     * 查询调用日志_发送短信列表
+     * 
+     * @param companyVoiceRoboticCallLogSendmsg 调用日志_发送短信
+     * @return 调用日志_发送短信集合
+     */
+    List<CompanyVoiceRoboticCallLogSendmsg> selectCompanyVoiceRoboticCallLogSendmsgList(CompanyVoiceRoboticCallLogSendmsg companyVoiceRoboticCallLogSendmsg);
+
+    /**
+     * 新增调用日志_发送短信
+     * 
+     * @param companyVoiceRoboticCallLogSendmsg 调用日志_发送短信
+     * @return 结果
+     */
+    int insertCompanyVoiceRoboticCallLogSendmsg(CompanyVoiceRoboticCallLogSendmsg companyVoiceRoboticCallLogSendmsg);
+
+    /**
+     * 修改调用日志_发送短信
+     * 
+     * @param companyVoiceRoboticCallLogSendmsg 调用日志_发送短信
+     * @return 结果
+     */
+    int updateCompanyVoiceRoboticCallLogSendmsg(CompanyVoiceRoboticCallLogSendmsg companyVoiceRoboticCallLogSendmsg);
+
+    /**
+     * 删除调用日志_发送短信
+     * 
+     * @param logId 调用日志_发送短信主键
+     * @return 结果
+     */
+    int deleteCompanyVoiceRoboticCallLogSendmsgByLogId(Long logId);
+
+    /**
+     * 批量删除调用日志_发送短信
+     * 
+     * @param logIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteCompanyVoiceRoboticCallLogSendmsgByLogIds(Long[] logIds);
+}

+ 61 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyVoiceRoboticCallLogAddwxService.java

@@ -0,0 +1,61 @@
+package com.fs.company.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.company.domain.CompanyVoiceRoboticCallLogAddwx;
+
+/**
+ * 调用日志_加微信Service接口
+ * 
+ * @author fs
+ * @date 2026-01-15
+ */
+public interface ICompanyVoiceRoboticCallLogAddwxService extends IService<CompanyVoiceRoboticCallLogAddwx>{
+    /**
+     * 查询调用日志_加微信
+     * 
+     * @param logId 调用日志_加微信主键
+     * @return 调用日志_加微信
+     */
+    CompanyVoiceRoboticCallLogAddwx selectCompanyVoiceRoboticCallLogAddwxByLogId(Long logId);
+
+    /**
+     * 查询调用日志_加微信列表
+     * 
+     * @param companyVoiceRoboticCallLogAddwx 调用日志_加微信
+     * @return 调用日志_加微信集合
+     */
+    List<CompanyVoiceRoboticCallLogAddwx> selectCompanyVoiceRoboticCallLogAddwxList(CompanyVoiceRoboticCallLogAddwx companyVoiceRoboticCallLogAddwx);
+
+    /**
+     * 新增调用日志_加微信
+     * 
+     * @param companyVoiceRoboticCallLogAddwx 调用日志_加微信
+     * @return 结果
+     */
+    int insertCompanyVoiceRoboticCallLogAddwx(CompanyVoiceRoboticCallLogAddwx companyVoiceRoboticCallLogAddwx);
+
+    /**
+     * 修改调用日志_加微信
+     * 
+     * @param companyVoiceRoboticCallLogAddwx 调用日志_加微信
+     * @return 结果
+     */
+    int updateCompanyVoiceRoboticCallLogAddwx(CompanyVoiceRoboticCallLogAddwx companyVoiceRoboticCallLogAddwx);
+
+    /**
+     * 批量删除调用日志_加微信
+     * 
+     * @param logIds 需要删除的调用日志_加微信主键集合
+     * @return 结果
+     */
+    int deleteCompanyVoiceRoboticCallLogAddwxByLogIds(Long[] logIds);
+
+    /**
+     * 删除调用日志_加微信信息
+     * 
+     * @param logId 调用日志_加微信主键
+     * @return 结果
+     */
+    int deleteCompanyVoiceRoboticCallLogAddwxByLogId(Long logId);
+}

+ 61 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyVoiceRoboticCallLogCallphoneService.java

@@ -0,0 +1,61 @@
+package com.fs.company.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.company.domain.CompanyVoiceRoboticCallLogCallphone;
+
+/**
+ * 调用日志_ai打电话Service接口
+ * 
+ * @author fs
+ * @date 2026-01-15
+ */
+public interface ICompanyVoiceRoboticCallLogCallphoneService extends IService<CompanyVoiceRoboticCallLogCallphone>{
+    /**
+     * 查询调用日志_ai打电话
+     * 
+     * @param logId 调用日志_ai打电话主键
+     * @return 调用日志_ai打电话
+     */
+    CompanyVoiceRoboticCallLogCallphone selectCompanyVoiceRoboticCallLogCallphoneByLogId(Long logId);
+
+    /**
+     * 查询调用日志_ai打电话列表
+     * 
+     * @param companyVoiceRoboticCallLogCallphone 调用日志_ai打电话
+     * @return 调用日志_ai打电话集合
+     */
+    List<CompanyVoiceRoboticCallLogCallphone> selectCompanyVoiceRoboticCallLogCallphoneList(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone);
+
+    /**
+     * 新增调用日志_ai打电话
+     * 
+     * @param companyVoiceRoboticCallLogCallphone 调用日志_ai打电话
+     * @return 结果
+     */
+    int insertCompanyVoiceRoboticCallLogCallphone(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone);
+
+    /**
+     * 修改调用日志_ai打电话
+     * 
+     * @param companyVoiceRoboticCallLogCallphone 调用日志_ai打电话
+     * @return 结果
+     */
+    int updateCompanyVoiceRoboticCallLogCallphone(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone);
+
+    /**
+     * 批量删除调用日志_ai打电话
+     * 
+     * @param logIds 需要删除的调用日志_ai打电话主键集合
+     * @return 结果
+     */
+    int deleteCompanyVoiceRoboticCallLogCallphoneByLogIds(Long[] logIds);
+
+    /**
+     * 删除调用日志_ai打电话信息
+     * 
+     * @param logId 调用日志_ai打电话主键
+     * @return 结果
+     */
+    int deleteCompanyVoiceRoboticCallLogCallphoneByLogId(Long logId);
+}

+ 61 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyVoiceRoboticCallLogSendmsgService.java

@@ -0,0 +1,61 @@
+package com.fs.company.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.company.domain.CompanyVoiceRoboticCallLogSendmsg;
+
+/**
+ * 调用日志_发送短信Service接口
+ * 
+ * @author fs
+ * @date 2026-01-15
+ */
+public interface ICompanyVoiceRoboticCallLogSendmsgService extends IService<CompanyVoiceRoboticCallLogSendmsg>{
+    /**
+     * 查询调用日志_发送短信
+     * 
+     * @param logId 调用日志_发送短信主键
+     * @return 调用日志_发送短信
+     */
+    CompanyVoiceRoboticCallLogSendmsg selectCompanyVoiceRoboticCallLogSendmsgByLogId(Long logId);
+
+    /**
+     * 查询调用日志_发送短信列表
+     * 
+     * @param companyVoiceRoboticCallLogSendmsg 调用日志_发送短信
+     * @return 调用日志_发送短信集合
+     */
+    List<CompanyVoiceRoboticCallLogSendmsg> selectCompanyVoiceRoboticCallLogSendmsgList(CompanyVoiceRoboticCallLogSendmsg companyVoiceRoboticCallLogSendmsg);
+
+    /**
+     * 新增调用日志_发送短信
+     * 
+     * @param companyVoiceRoboticCallLogSendmsg 调用日志_发送短信
+     * @return 结果
+     */
+    int insertCompanyVoiceRoboticCallLogSendmsg(CompanyVoiceRoboticCallLogSendmsg companyVoiceRoboticCallLogSendmsg);
+
+    /**
+     * 修改调用日志_发送短信
+     * 
+     * @param companyVoiceRoboticCallLogSendmsg 调用日志_发送短信
+     * @return 结果
+     */
+    int updateCompanyVoiceRoboticCallLogSendmsg(CompanyVoiceRoboticCallLogSendmsg companyVoiceRoboticCallLogSendmsg);
+
+    /**
+     * 批量删除调用日志_发送短信
+     * 
+     * @param logIds 需要删除的调用日志_发送短信主键集合
+     * @return 结果
+     */
+    int deleteCompanyVoiceRoboticCallLogSendmsgByLogIds(Long[] logIds);
+
+    /**
+     * 删除调用日志_发送短信信息
+     * 
+     * @param logId 调用日志_发送短信主键
+     * @return 结果
+     */
+    int deleteCompanyVoiceRoboticCallLogSendmsgByLogId(Long logId);
+}

+ 108 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyVoiceRoboticCallLogAddwxServiceImpl.java

@@ -0,0 +1,108 @@
+package com.fs.company.service.impl;
+
+import java.util.Date;
+import java.util.List;
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.company.domain.CompanyVoiceRoboticCallLog;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import com.fs.company.mapper.CompanyVoiceRoboticCallLogAddwxMapper;
+import com.fs.company.domain.CompanyVoiceRoboticCallLogAddwx;
+import com.fs.company.service.ICompanyVoiceRoboticCallLogAddwxService;
+
+/**
+ * 调用日志_加微信Service业务层处理
+ * 
+ * @author fs
+ * @date 2026-01-15
+ */
+@Service
+@Slf4j
+public class CompanyVoiceRoboticCallLogAddwxServiceImpl extends ServiceImpl<CompanyVoiceRoboticCallLogAddwxMapper, CompanyVoiceRoboticCallLogAddwx> implements ICompanyVoiceRoboticCallLogAddwxService {
+
+    /**
+     * 查询调用日志_加微信
+     * 
+     * @param logId 调用日志_加微信主键
+     * @return 调用日志_加微信
+     */
+    @Override
+    public CompanyVoiceRoboticCallLogAddwx selectCompanyVoiceRoboticCallLogAddwxByLogId(Long logId)
+    {
+        return baseMapper.selectCompanyVoiceRoboticCallLogAddwxByLogId(logId);
+    }
+
+    /**
+     * 查询调用日志_加微信列表
+     * 
+     * @param companyVoiceRoboticCallLogAddwx 调用日志_加微信
+     * @return 调用日志_加微信
+     */
+    @Override
+    public List<CompanyVoiceRoboticCallLogAddwx> selectCompanyVoiceRoboticCallLogAddwxList(CompanyVoiceRoboticCallLogAddwx companyVoiceRoboticCallLogAddwx)
+    {
+        return baseMapper.selectCompanyVoiceRoboticCallLogAddwxList(companyVoiceRoboticCallLogAddwx);
+    }
+
+    /**
+     * 新增调用日志_加微信
+     * 
+     * @param companyVoiceRoboticCallLogAddwx 调用日志_加微信
+     * @return 结果
+     */
+    @Override
+    public int insertCompanyVoiceRoboticCallLogAddwx(CompanyVoiceRoboticCallLogAddwx companyVoiceRoboticCallLogAddwx)
+    {
+        companyVoiceRoboticCallLogAddwx.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertCompanyVoiceRoboticCallLogAddwx(companyVoiceRoboticCallLogAddwx);
+    }
+
+    /**
+     * 修改调用日志_加微信
+     * 
+     * @param companyVoiceRoboticCallLogAddwx 调用日志_加微信
+     * @return 结果
+     */
+    @Override
+    public int updateCompanyVoiceRoboticCallLogAddwx(CompanyVoiceRoboticCallLogAddwx companyVoiceRoboticCallLogAddwx)
+    {
+        return baseMapper.updateCompanyVoiceRoboticCallLogAddwx(companyVoiceRoboticCallLogAddwx);
+    }
+
+    /**
+     * 批量删除调用日志_加微信
+     * 
+     * @param logIds 需要删除的调用日志_加微信主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanyVoiceRoboticCallLogAddwxByLogIds(Long[] logIds)
+    {
+        return baseMapper.deleteCompanyVoiceRoboticCallLogAddwxByLogIds(logIds);
+    }
+
+    /**
+     * 删除调用日志_加微信信息
+     * 
+     * @param logId 调用日志_加微信主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanyVoiceRoboticCallLogAddwxByLogId(Long logId)
+    {
+        return baseMapper.deleteCompanyVoiceRoboticCallLogAddwxByLogId(logId);
+    }
+
+    @Async("callLogExcutor")
+    public void asyncInsertCompanyVoiceRoboticCallLog(CompanyVoiceRoboticCallLogAddwx companyVoiceRoboticCallLog) {
+        try{
+            companyVoiceRoboticCallLog.setCreateTime(DateUtils.getNowDate());
+            baseMapper.insertCompanyVoiceRoboticCallLogAddwx(companyVoiceRoboticCallLog);
+        } catch (Exception e) {
+            log.error("记录任务执行日志失败:失败数据:{}",companyVoiceRoboticCallLog, e);
+        }
+    }
+}

+ 182 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyVoiceRoboticCallLogCallphoneServiceImpl.java

@@ -0,0 +1,182 @@
+package com.fs.company.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+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.fs.aicall.domain.apiresult.PushIIntentionResult;
+import com.fs.aicall.domain.param.getDialogMapDomain;
+import com.fs.aicall.service.AiCallService;
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.company.domain.*;
+import com.fs.company.mapper.CompanyWxAccountMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import com.fs.company.mapper.CompanyVoiceRoboticCallLogCallphoneMapper;
+import com.fs.company.service.ICompanyVoiceRoboticCallLogCallphoneService;
+
+/**
+ * 调用日志_ai打电话Service业务层处理
+ *
+ * @author fs
+ * @date 2026-01-15
+ */
+@Service
+@Slf4j
+public class CompanyVoiceRoboticCallLogCallphoneServiceImpl extends ServiceImpl<CompanyVoiceRoboticCallLogCallphoneMapper, CompanyVoiceRoboticCallLogCallphone> implements ICompanyVoiceRoboticCallLogCallphoneService {
+
+    @Autowired
+    CompanyVoiceRoboticCallLogCallphoneMapper companyVoiceRoboticCallLogCallphoneMapper;
+    @Autowired
+    CompanyWxClientServiceImpl companyWxClientServiceImpl;
+    @Autowired
+    CompanyVoiceRoboticWxServiceImpl companyVoiceRoboticWxServiceImpl;
+    @Autowired
+    CompanyWxAccountMapper companyWxAccountMapper;
+
+    /**
+     * 查询调用日志_ai打电话
+     *
+     * @param logId 调用日志_ai打电话主键
+     * @return 调用日志_ai打电话
+     */
+    @Override
+    public CompanyVoiceRoboticCallLogCallphone selectCompanyVoiceRoboticCallLogCallphoneByLogId(Long logId) {
+        return baseMapper.selectCompanyVoiceRoboticCallLogCallphoneByLogId(logId);
+    }
+
+    /**
+     * 查询调用日志_ai打电话列表
+     *
+     * @param companyVoiceRoboticCallLogCallphone 调用日志_ai打电话
+     * @return 调用日志_ai打电话
+     */
+    @Override
+    public List<CompanyVoiceRoboticCallLogCallphone> selectCompanyVoiceRoboticCallLogCallphoneList(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone) {
+        return baseMapper.selectCompanyVoiceRoboticCallLogCallphoneList(companyVoiceRoboticCallLogCallphone);
+    }
+
+    /**
+     * 新增调用日志_ai打电话
+     *
+     * @param companyVoiceRoboticCallLogCallphone 调用日志_ai打电话
+     * @return 结果
+     */
+    @Override
+    public int insertCompanyVoiceRoboticCallLogCallphone(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone) {
+        companyVoiceRoboticCallLogCallphone.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertCompanyVoiceRoboticCallLogCallphone(companyVoiceRoboticCallLogCallphone);
+    }
+
+    /**
+     * 修改调用日志_ai打电话
+     *
+     * @param companyVoiceRoboticCallLogCallphone 调用日志_ai打电话
+     * @return 结果
+     */
+    @Override
+    public int updateCompanyVoiceRoboticCallLogCallphone(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone) {
+        return baseMapper.updateCompanyVoiceRoboticCallLogCallphone(companyVoiceRoboticCallLogCallphone);
+    }
+
+    /**
+     * 批量删除调用日志_ai打电话
+     *
+     * @param logIds 需要删除的调用日志_ai打电话主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanyVoiceRoboticCallLogCallphoneByLogIds(Long[] logIds) {
+        return baseMapper.deleteCompanyVoiceRoboticCallLogCallphoneByLogIds(logIds);
+    }
+
+    /**
+     * 删除调用日志_ai打电话信息
+     *
+     * @param logId 调用日志_ai打电话主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanyVoiceRoboticCallLogCallphoneByLogId(Long logId) {
+        return baseMapper.deleteCompanyVoiceRoboticCallLogCallphoneByLogId(logId);
+    }
+
+    /**
+     * 异步记录任务执行日志
+     *
+     * @param callPhoneLog
+     */
+    @Async("callLogExcutor")
+    public void asyncInsertCompanyVoiceRoboticCallLog(CompanyVoiceRoboticCallLogCallphone callPhoneLog) {
+        try {
+            callPhoneLog.setCreateTime(DateUtils.getNowDate());
+            baseMapper.insertCompanyVoiceRoboticCallLogCallphone(callPhoneLog);
+        } catch (Exception e) {
+            log.error("记录任务执行日志失败:失败数据:{}", callPhoneLog, e);
+        }
+    }
+
+
+    @Autowired
+    AiCallService aiCallService;
+
+    @Async("callLogExcutor")
+    public void asyncHandleCalleeCallBackResult(PushIIntentionResult result, CompanyVoiceRoboticCallees callees) {
+        try {
+            Notify notify = result.getNotify();
+            String uuid = notify.getUuid();
+            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());
+            CompanyWxAccount companyWxAccount = companyWxAccountMapper.selectCompanyWxAccountById(roboticWx.getAccountId());
+            companyVoiceRoboticCallLog.setCompanyUserId(companyWxAccount.getCompanyUserId());
+
+            // 调用接口查询通话其他信息
+            TaskInfo dialogMap = aiCallService.getDialogMapNew(getDialogMap, companyVoiceRoboticCallLog.getCompanyId());
+            // 写入其他记录
+            JSONObject telData = dialogMap.getTelData();
+            companyVoiceRoboticCallLog.setRecordPath((String) telData.getOrDefault("recordPath", ""));
+            companyVoiceRoboticCallLog.setContentList((String) telData.getOrDefault("contentList", ""));
+            companyVoiceRoboticCallLog.setCallerNum((String) telData.getOrDefault("callerNum", ""));
+            companyVoiceRoboticCallLog.setCalleeNum((String) telData.getOrDefault("calleeNum", ""));
+            companyVoiceRoboticCallLog.setUuid((String) telData.getOrDefault("uuid", ""));
+            Long createTime = (Long) telData.getOrDefault("createTime", null);
+            companyVoiceRoboticCallLog.setCallCreateTime(createTime);
+            Long answerTime = (Long) telData.getOrDefault("answerTime", null);
+            companyVoiceRoboticCallLog.setCallAnswerTime(answerTime);
+            companyVoiceRoboticCallLog.setIntention((String) telData.getOrDefault("intention", ""));
+            companyVoiceRoboticCallLog.setCallTime((Long) telData.getOrDefault("duration", null));
+
+            baseMapper.updateCompanyVoiceRoboticCallLogCallphone(companyVoiceRoboticCallLog);
+        } catch (Exception ex) {
+            log.error("处理回调结果异常:{}", result, ex);
+        }
+    }
+    @Async("callLogExcutor")
+    public void asyncInsertCompanyVoiceRoboticCallLogBatch(List<CompanyVoiceRoboticCallLogCallphone> list) {
+        try{
+            list.stream().forEach(i->i.setCreateTime(new Date()));
+            this.saveBatch(list);
+        } catch (Exception e) {
+            log.error("批量记录任务执行日志失败:失败数据:{}",list, e);
+        }
+    }
+
+    public CompanyVoiceRoboticCallLogCallphone selectLogByRoboticIdAndCallerId(Long roboticId,Long callerId){
+            return  baseMapper.selectLogByRoboticIdAndCallerId(roboticId,callerId);
+    }
+}

+ 111 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyVoiceRoboticCallLogSendmsgServiceImpl.java

@@ -0,0 +1,111 @@
+package com.fs.company.service.impl;
+
+import java.util.List;
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.company.domain.CompanyVoiceRoboticCallLogCallphone;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import com.fs.company.mapper.CompanyVoiceRoboticCallLogSendmsgMapper;
+import com.fs.company.domain.CompanyVoiceRoboticCallLogSendmsg;
+import com.fs.company.service.ICompanyVoiceRoboticCallLogSendmsgService;
+
+/**
+ * 调用日志_发送短信Service业务层处理
+ * 
+ * @author fs
+ * @date 2026-01-15
+ */
+@Service
+@Slf4j
+public class CompanyVoiceRoboticCallLogSendmsgServiceImpl extends ServiceImpl<CompanyVoiceRoboticCallLogSendmsgMapper, CompanyVoiceRoboticCallLogSendmsg> implements ICompanyVoiceRoboticCallLogSendmsgService {
+
+    /**
+     * 查询调用日志_发送短信
+     * 
+     * @param logId 调用日志_发送短信主键
+     * @return 调用日志_发送短信
+     */
+    @Override
+    public CompanyVoiceRoboticCallLogSendmsg selectCompanyVoiceRoboticCallLogSendmsgByLogId(Long logId)
+    {
+        return baseMapper.selectCompanyVoiceRoboticCallLogSendmsgByLogId(logId);
+    }
+
+    /**
+     * 查询调用日志_发送短信列表
+     * 
+     * @param companyVoiceRoboticCallLogSendmsg 调用日志_发送短信
+     * @return 调用日志_发送短信
+     */
+    @Override
+    public List<CompanyVoiceRoboticCallLogSendmsg> selectCompanyVoiceRoboticCallLogSendmsgList(CompanyVoiceRoboticCallLogSendmsg companyVoiceRoboticCallLogSendmsg)
+    {
+        return baseMapper.selectCompanyVoiceRoboticCallLogSendmsgList(companyVoiceRoboticCallLogSendmsg);
+    }
+
+    /**
+     * 新增调用日志_发送短信
+     * 
+     * @param companyVoiceRoboticCallLogSendmsg 调用日志_发送短信
+     * @return 结果
+     */
+    @Override
+    public int insertCompanyVoiceRoboticCallLogSendmsg(CompanyVoiceRoboticCallLogSendmsg companyVoiceRoboticCallLogSendmsg)
+    {
+        companyVoiceRoboticCallLogSendmsg.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertCompanyVoiceRoboticCallLogSendmsg(companyVoiceRoboticCallLogSendmsg);
+    }
+
+    /**
+     * 修改调用日志_发送短信
+     * 
+     * @param companyVoiceRoboticCallLogSendmsg 调用日志_发送短信
+     * @return 结果
+     */
+    @Override
+    public int updateCompanyVoiceRoboticCallLogSendmsg(CompanyVoiceRoboticCallLogSendmsg companyVoiceRoboticCallLogSendmsg)
+    {
+        return baseMapper.updateCompanyVoiceRoboticCallLogSendmsg(companyVoiceRoboticCallLogSendmsg);
+    }
+
+    /**
+     * 批量删除调用日志_发送短信
+     * 
+     * @param logIds 需要删除的调用日志_发送短信主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanyVoiceRoboticCallLogSendmsgByLogIds(Long[] logIds)
+    {
+        return baseMapper.deleteCompanyVoiceRoboticCallLogSendmsgByLogIds(logIds);
+    }
+
+    /**
+     * 删除调用日志_发送短信信息
+     * 
+     * @param logId 调用日志_发送短信主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanyVoiceRoboticCallLogSendmsgByLogId(Long logId)
+    {
+        return baseMapper.deleteCompanyVoiceRoboticCallLogSendmsgByLogId(logId);
+    }
+
+    /**
+     * 异步记录任务执行日志
+     * @param sendMsgLog
+     */
+    @Async("callLogExcutor")
+    public void asyncInsertCompanyVoiceRoboticCallLog(CompanyVoiceRoboticCallLogSendmsg sendMsgLog) {
+        try{
+            sendMsgLog.setCreateTime(DateUtils.getNowDate());
+            baseMapper.insertCompanyVoiceRoboticCallLogSendmsg(sendMsgLog);
+        } catch (Exception e) {
+            log.error("记录任务执行日志失败:失败数据:{}",sendMsgLog, e);
+        }
+    }
+}

+ 114 - 25
fs-service/src/main/java/com/fs/company/service/impl/CompanyVoiceRoboticServiceImpl.java

@@ -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;
     }
 
 

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

@@ -7,5 +7,6 @@ public class RoboticWxVo {
     private String intention;
     private Long companyUserId;
     private Long wxDialogId;
+    private Integer smsTempId;
 
 }

+ 95 - 0
fs-service/src/main/resources/mapper/company/CompanyVoiceRoboticCallLogAddwxMapper.xml

@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.company.mapper.CompanyVoiceRoboticCallLogAddwxMapper">
+    
+    <resultMap type="CompanyVoiceRoboticCallLogAddwx" id="CompanyVoiceRoboticCallLogAddwxResult">
+        <result property="logId"    column="log_id"    />
+        <result property="roboticId"    column="robotic_id"    />
+        <result property="wxClientId"    column="wx_client_id"    />
+        <result property="runTime"    column="run_time"    />
+        <result property="runParam"    column="run_param"    />
+        <result property="result"    column="result"    />
+        <result property="status"    column="status"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="companyId"    column="company_id"    />
+        <result property="wxAccountId"    column="wx_account_id"    />
+    </resultMap>
+
+    <sql id="selectCompanyVoiceRoboticCallLogAddwxVo">
+        select log_id, robotic_id, wx_client_id, run_time, run_param, result, status, create_time, company_id, wx_account_id from company_voice_robotic_call_log_addwx
+    </sql>
+
+    <select id="selectCompanyVoiceRoboticCallLogAddwxList" parameterType="CompanyVoiceRoboticCallLogAddwx" resultMap="CompanyVoiceRoboticCallLogAddwxResult">
+        <include refid="selectCompanyVoiceRoboticCallLogAddwxVo"/>
+        <where>  
+            <if test="roboticId != null "> and robotic_id = #{roboticId}</if>
+            <if test="wxClientId != null "> and wx_client_id = #{wxClientId}</if>
+            <if test="runTime != null "> and run_time = #{runTime}</if>
+            <if test="runParam != null  and runParam != ''"> and run_param = #{runParam}</if>
+            <if test="result != null  and result != ''"> and result = #{result}</if>
+            <if test="status != null "> and status = #{status}</if>
+            <if test="companyId != null "> and company_id = #{companyId}</if>
+            <if test="wxAccountId != null "> and wx_account_id = #{wxAccountId}</if>
+        </where>
+    </select>
+    
+    <select id="selectCompanyVoiceRoboticCallLogAddwxByLogId" parameterType="Long" resultMap="CompanyVoiceRoboticCallLogAddwxResult">
+        <include refid="selectCompanyVoiceRoboticCallLogAddwxVo"/>
+        where log_id = #{logId}
+    </select>
+        
+    <insert id="insertCompanyVoiceRoboticCallLogAddwx" parameterType="CompanyVoiceRoboticCallLogAddwx" useGeneratedKeys="true" keyProperty="logId">
+        insert into company_voice_robotic_call_log_addwx
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="roboticId != null">robotic_id,</if>
+            <if test="wxClientId != null">wx_client_id,</if>
+            <if test="runTime != null">run_time,</if>
+            <if test="runParam != null">run_param,</if>
+            <if test="result != null">result,</if>
+            <if test="status != null">status,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="companyId != null">company_id,</if>
+            <if test="wxAccountId != null">wx_account_id,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="roboticId != null">#{roboticId},</if>
+            <if test="wxClientId != null">#{wxClientId},</if>
+            <if test="runTime != null">#{runTime},</if>
+            <if test="runParam != null">#{runParam},</if>
+            <if test="result != null">#{result},</if>
+            <if test="status != null">#{status},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="companyId != null">#{companyId},</if>
+            <if test="wxAccountId != null">#{wxAccountId},</if>
+         </trim>
+    </insert>
+
+    <update id="updateCompanyVoiceRoboticCallLogAddwx" parameterType="CompanyVoiceRoboticCallLogAddwx">
+        update company_voice_robotic_call_log_addwx
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="roboticId != null">robotic_id = #{roboticId},</if>
+            <if test="wxClientId != null">wx_client_id = #{wxClientId},</if>
+            <if test="runTime != null">run_time = #{runTime},</if>
+            <if test="runParam != null">run_param = #{runParam},</if>
+            <if test="result != null">result = #{result},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="companyId != null">company_id = #{companyId},</if>
+            <if test="wxAccountId != null">wx_account_id = #{wxAccountId},</if>
+        </trim>
+        where log_id = #{logId}
+    </update>
+
+    <delete id="deleteCompanyVoiceRoboticCallLogAddwxByLogId" parameterType="Long">
+        delete from company_voice_robotic_call_log_addwx where log_id = #{logId}
+    </delete>
+
+    <delete id="deleteCompanyVoiceRoboticCallLogAddwxByLogIds" parameterType="String">
+        delete from company_voice_robotic_call_log_addwx where log_id in 
+        <foreach item="logId" collection="array" open="(" separator="," close=")">
+            #{logId}
+        </foreach>
+    </delete>
+</mapper>

+ 152 - 0
fs-service/src/main/resources/mapper/company/CompanyVoiceRoboticCallLogCallphoneMapper.xml

@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.company.mapper.CompanyVoiceRoboticCallLogCallphoneMapper">
+    
+    <resultMap type="CompanyVoiceRoboticCallLogCallphone" id="CompanyVoiceRoboticCallLogCallphoneResult">
+        <result property="logId"    column="log_id"    />
+        <result property="roboticId"    column="robotic_id"    />
+        <result property="callerId"    column="caller_id"    />
+        <result property="runTime"    column="run_time"    />
+        <result property="runParam"    column="run_param"    />
+        <result property="result"    column="result"    />
+        <result property="status"    column="status"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="recordPath"    column="record_path"    />
+        <result property="contentList"    column="content_list"    />
+        <result property="callerNum"    column="caller_num"    />
+        <result property="calleeNum"    column="callee_num"    />
+        <result property="uuid"    column="uuid"    />
+        <result property="callCreateTime"    column="call_create_time"    />
+        <result property="callAnswerTime"    column="call_answer_time"    />
+        <result property="intention"    column="intention"    />
+        <result property="companyId"    column="company_id"    />
+        <result property="companyUserId"    column="company_user_id"    />
+        <result property="callTime"    column="call_time"    />
+        <result property="cost"    column="cost"    />
+    </resultMap>
+
+    <sql id="selectCompanyVoiceRoboticCallLogCallphoneVo">
+        select log_id, robotic_id, caller_id, run_time, run_param, result, status, create_time, record_path, content_list, caller_num, callee_num, uuid, call_create_time, call_answer_time, intention, company_id, company_user_id, call_time, cost from company_voice_robotic_call_log_callphone
+    </sql>
+
+    <select id="selectCompanyVoiceRoboticCallLogCallphoneList" parameterType="CompanyVoiceRoboticCallLogCallphone" resultMap="CompanyVoiceRoboticCallLogCallphoneResult">
+        <include refid="selectCompanyVoiceRoboticCallLogCallphoneVo"/>
+        <where>  
+            <if test="roboticId != null "> and robotic_id = #{roboticId}</if>
+            <if test="callerId != null "> and caller_id = #{callerId}</if>
+            <if test="runTime != null "> and run_time = #{runTime}</if>
+            <if test="runParam != null  and runParam != ''"> and run_param = #{runParam}</if>
+            <if test="result != null  and result != ''"> and result = #{result}</if>
+            <if test="status != null "> and status = #{status}</if>
+            <if test="recordPath != null  and recordPath != ''"> and record_path = #{recordPath}</if>
+            <if test="contentList != null  and contentList != ''"> and content_list = #{contentList}</if>
+            <if test="callerNum != null  and callerNum != ''"> and caller_num = #{callerNum}</if>
+            <if test="calleeNum != null  and calleeNum != ''"> and callee_num = #{calleeNum}</if>
+            <if test="uuid != null  and uuid != ''"> and uuid = #{uuid}</if>
+            <if test="callCreateTime != null "> and call_create_time = #{callCreateTime}</if>
+            <if test="callAnswerTime != null "> and call_answer_time = #{callAnswerTime}</if>
+            <if test="intention != null  and intention != ''"> and intention = #{intention}</if>
+            <if test="companyId != null "> and company_id = #{companyId}</if>
+            <if test="companyUserId != null "> and company_user_id = #{companyUserId}</if>
+            <if test="callTime != null "> and call_time = #{callTime}</if>
+            <if test="cost != null "> and cost = #{cost}</if>
+        </where>
+    </select>
+    
+    <select id="selectCompanyVoiceRoboticCallLogCallphoneByLogId" parameterType="Long" resultMap="CompanyVoiceRoboticCallLogCallphoneResult">
+        <include refid="selectCompanyVoiceRoboticCallLogCallphoneVo"/>
+        where log_id = #{logId}
+    </select>
+        
+    <insert id="insertCompanyVoiceRoboticCallLogCallphone" parameterType="CompanyVoiceRoboticCallLogCallphone" useGeneratedKeys="true" keyProperty="logId">
+        insert into company_voice_robotic_call_log_callphone
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="roboticId != null">robotic_id,</if>
+            <if test="callerId != null">caller_id,</if>
+            <if test="runTime != null">run_time,</if>
+            <if test="runParam != null">run_param,</if>
+            <if test="result != null">result,</if>
+            <if test="status != null">status,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="recordPath != null">record_path,</if>
+            <if test="contentList != null">content_list,</if>
+            <if test="callerNum != null">caller_num,</if>
+            <if test="calleeNum != null">callee_num,</if>
+            <if test="uuid != null">uuid,</if>
+            <if test="callCreateTime != null">call_create_time,</if>
+            <if test="callAnswerTime != null">call_answer_time,</if>
+            <if test="intention != null">intention,</if>
+            <if test="companyId != null">company_id,</if>
+            <if test="companyUserId != null">company_user_id,</if>
+            <if test="callTime != null">call_time,</if>
+            <if test="cost != null">cost,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="roboticId != null">#{roboticId},</if>
+            <if test="callerId != null">#{callerId},</if>
+            <if test="runTime != null">#{runTime},</if>
+            <if test="runParam != null">#{runParam},</if>
+            <if test="result != null">#{result},</if>
+            <if test="status != null">#{status},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="recordPath != null">#{recordPath},</if>
+            <if test="contentList != null">#{contentList},</if>
+            <if test="callerNum != null">#{callerNum},</if>
+            <if test="calleeNum != null">#{calleeNum},</if>
+            <if test="uuid != null">#{uuid},</if>
+            <if test="callCreateTime != null">#{callCreateTime},</if>
+            <if test="callAnswerTime != null">#{callAnswerTime},</if>
+            <if test="intention != null">#{intention},</if>
+            <if test="companyId != null">#{companyId},</if>
+            <if test="companyUserId != null">#{companyUserId},</if>
+            <if test="callTime != null">#{callTime},</if>
+            <if test="cost != null">#{cost},</if>
+         </trim>
+    </insert>
+
+    <update id="updateCompanyVoiceRoboticCallLogCallphone" parameterType="CompanyVoiceRoboticCallLogCallphone">
+        update company_voice_robotic_call_log_callphone
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="roboticId != null">robotic_id = #{roboticId},</if>
+            <if test="callerId != null">caller_id = #{callerId},</if>
+            <if test="runTime != null">run_time = #{runTime},</if>
+            <if test="runParam != null">run_param = #{runParam},</if>
+            <if test="result != null">result = #{result},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="recordPath != null">record_path = #{recordPath},</if>
+            <if test="contentList != null">content_list = #{contentList},</if>
+            <if test="callerNum != null">caller_num = #{callerNum},</if>
+            <if test="calleeNum != null">callee_num = #{calleeNum},</if>
+            <if test="uuid != null">uuid = #{uuid},</if>
+            <if test="callCreateTime != null">call_create_time = #{callCreateTime},</if>
+            <if test="callAnswerTime != null">call_answer_time = #{callAnswerTime},</if>
+            <if test="intention != null">intention = #{intention},</if>
+            <if test="companyId != null">company_id = #{companyId},</if>
+            <if test="companyUserId != null">company_user_id = #{companyUserId},</if>
+            <if test="callTime != null">call_time = #{callTime},</if>
+            <if test="cost != null">cost = #{cost},</if>
+        </trim>
+        where log_id = #{logId}
+    </update>
+
+    <delete id="deleteCompanyVoiceRoboticCallLogCallphoneByLogId" parameterType="Long">
+        delete from company_voice_robotic_call_log_callphone where log_id = #{logId}
+    </delete>
+
+    <delete id="deleteCompanyVoiceRoboticCallLogCallphoneByLogIds" parameterType="String">
+        delete from company_voice_robotic_call_log_callphone where log_id in 
+        <foreach item="logId" collection="array" open="(" separator="," close=")">
+            #{logId}
+        </foreach>
+    </delete>
+
+    <select id="selectNoResultLogByCallees" parameterType="com.fs.company.domain.CompanyVoiceRoboticCallees"  resultType="CompanyVoiceRoboticCallLogCallphone">
+        select * from company_voice_robotic_call_log_callphone where robotic_id = #{roboticId} And caller_id = #{id} And status = 1
+    </select>
+    <select id="selectLogByRoboticIdAndCallerId"   resultType="CompanyVoiceRoboticCallLogCallphone">
+        select * from company_voice_robotic_call_log_callphone where robotic_id = #{roboticId} And caller_id = #{callerId}
+    </select>
+</mapper>

+ 110 - 0
fs-service/src/main/resources/mapper/company/CompanyVoiceRoboticCallLogSendmsgMapper.xml

@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.company.mapper.CompanyVoiceRoboticCallLogSendmsgMapper">
+    
+    <resultMap type="CompanyVoiceRoboticCallLogSendmsg" id="CompanyVoiceRoboticCallLogSendmsgResult">
+        <result property="logId"    column="log_id"    />
+        <result property="roboticId"    column="robotic_id"    />
+        <result property="callerId"    column="caller_id"    />
+        <result property="runTime"    column="run_time"    />
+        <result property="runParam"    column="run_param"    />
+        <result property="result"    column="result"    />
+        <result property="status"    column="status"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="companyId"    column="company_id"    />
+        <result property="companyUserId"    column="company_user_id"    />
+        <result property="tempId"    column="temp_id"    />
+        <result property="cost"    column="cost"    />
+        <result property="contentLen"    column="content_len"    />
+    </resultMap>
+
+    <sql id="selectCompanyVoiceRoboticCallLogSendmsgVo">
+        select log_id, robotic_id, caller_id, run_time, run_param, result, status, create_time, company_id, company_user_id, temp_id, cost, content_len from company_voice_robotic_call_log_sendmsg
+    </sql>
+
+    <select id="selectCompanyVoiceRoboticCallLogSendmsgList" parameterType="CompanyVoiceRoboticCallLogSendmsg" resultMap="CompanyVoiceRoboticCallLogSendmsgResult">
+        <include refid="selectCompanyVoiceRoboticCallLogSendmsgVo"/>
+        <where>  
+            <if test="roboticId != null "> and robotic_id = #{roboticId}</if>
+            <if test="callerId != null "> and caller_id = #{callerId}</if>
+            <if test="runTime != null "> and run_time = #{runTime}</if>
+            <if test="runParam != null  and runParam != ''"> and run_param = #{runParam}</if>
+            <if test="result != null  and result != ''"> and result = #{result}</if>
+            <if test="status != null "> and status = #{status}</if>
+            <if test="companyId != null "> and company_id = #{companyId}</if>
+            <if test="companyUserId != null "> and company_user_id = #{companyUserId}</if>
+            <if test="tempId != null "> and temp_id = #{tempId}</if>
+            <if test="cost != null "> and cost = #{cost}</if>
+            <if test="contentLen != null "> and content_len = #{contentLen}</if>
+        </where>
+    </select>
+    
+    <select id="selectCompanyVoiceRoboticCallLogSendmsgByLogId" parameterType="Long" resultMap="CompanyVoiceRoboticCallLogSendmsgResult">
+        <include refid="selectCompanyVoiceRoboticCallLogSendmsgVo"/>
+        where log_id = #{logId}
+    </select>
+        
+    <insert id="insertCompanyVoiceRoboticCallLogSendmsg" parameterType="CompanyVoiceRoboticCallLogSendmsg" useGeneratedKeys="true" keyProperty="logId">
+        insert into company_voice_robotic_call_log_sendmsg
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="roboticId != null">robotic_id,</if>
+            <if test="callerId != null">caller_id,</if>
+            <if test="runTime != null">run_time,</if>
+            <if test="runParam != null">run_param,</if>
+            <if test="result != null">result,</if>
+            <if test="status != null">status,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="companyId != null">company_id,</if>
+            <if test="companyUserId != null">company_user_id,</if>
+            <if test="tempId != null">temp_id,</if>
+            <if test="cost != null">cost,</if>
+            <if test="contentLen != null">content_len,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="roboticId != null">#{roboticId},</if>
+            <if test="callerId != null">#{callerId},</if>
+            <if test="runTime != null">#{runTime},</if>
+            <if test="runParam != null">#{runParam},</if>
+            <if test="result != null">#{result},</if>
+            <if test="status != null">#{status},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="companyId != null">#{companyId},</if>
+            <if test="companyUserId != null">#{companyUserId},</if>
+            <if test="tempId != null">#{tempId},</if>
+            <if test="cost != null">#{cost},</if>
+            <if test="contentLen != null">#{contentLen},</if>
+         </trim>
+    </insert>
+
+    <update id="updateCompanyVoiceRoboticCallLogSendmsg" parameterType="CompanyVoiceRoboticCallLogSendmsg">
+        update company_voice_robotic_call_log_sendmsg
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="roboticId != null">robotic_id = #{roboticId},</if>
+            <if test="callerId != null">caller_id = #{callerId},</if>
+            <if test="runTime != null">run_time = #{runTime},</if>
+            <if test="runParam != null">run_param = #{runParam},</if>
+            <if test="result != null">result = #{result},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="companyId != null">company_id = #{companyId},</if>
+            <if test="companyUserId != null">company_user_id = #{companyUserId},</if>
+            <if test="tempId != null">temp_id = #{tempId},</if>
+            <if test="cost != null">cost = #{cost},</if>
+            <if test="contentLen != null">content_len = #{contentLen},</if>
+        </trim>
+        where log_id = #{logId}
+    </update>
+
+    <delete id="deleteCompanyVoiceRoboticCallLogSendmsgByLogId" parameterType="Long">
+        delete from company_voice_robotic_call_log_sendmsg where log_id = #{logId}
+    </delete>
+
+    <delete id="deleteCompanyVoiceRoboticCallLogSendmsgByLogIds" parameterType="String">
+        delete from company_voice_robotic_call_log_sendmsg where log_id in 
+        <foreach item="logId" collection="array" open="(" separator="," close=")">
+            #{logId}
+        </foreach>
+    </delete>
+</mapper>

+ 106 - 73
fs-wx-task/src/main/java/com/fs/app/service/WxTaskService.java

@@ -17,9 +17,7 @@ import com.fs.company.service.ICompanyVoiceRoboticService;
 import com.fs.company.service.ICompanyWxAccountService;
 import com.fs.company.service.ICompanyWxClientService;
 import com.fs.company.service.ICompanyWxDialogService;
-import com.fs.company.service.impl.CompanyVoiceRoboticCallLogServiceImpl;
-import com.fs.company.service.impl.CompanyVoiceRoboticCalleesServiceImpl;
-import com.fs.company.service.impl.CompanyVoiceRoboticWxServiceImpl;
+import com.fs.company.service.impl.*;
 import com.fs.company.util.ObjectPlaceholderResolver;
 import com.fs.company.vo.SendMsgVo;
 import com.fs.course.config.WxConfig;
@@ -66,7 +64,8 @@ public class WxTaskService {
     private final CompanyWxAccountMapper companyWxAccountMapper;
     private final CompanyVoiceRoboticCalleesServiceImpl companyVoiceRoboticCalleesServiceImpl;
     private RedissonClient redissonClient;
-
+    private final CompanyVoiceRoboticServiceImpl companyVoiceRoboticServiceImpl;
+    private final CompanyVoiceRoboticCallLogCallphoneServiceImpl companyVoiceRoboticCallLogCallphoneService;
     private final ExecutorService cidExcutor = new ThreadPoolExecutor(
             32,
             64,
@@ -121,8 +120,8 @@ public class WxTaskService {
                     runParam.put("mobile",crmCustomer.getMobile());
                     runParam.put("txt",newTxt);
                     runParam.put("clientId",client.getId());
-                    CompanyVoiceRoboticCallLog addLog = CompanyVoiceRoboticCallLog.initCallLogByType(Constants.ADD_WX,
-                            runParam.toJSONString(),client.getId(),client.getRoboticId());
+                    CompanyVoiceRoboticCallLogAddwx addLog = CompanyVoiceRoboticCallLogAddwx.initCallLog(
+                            runParam.toJSONString(),client.getId(),client.getRoboticId(),e.getId(),e.getCompanyId());
                     log.info("ROBOTIC-ID:{},CLIENT-ID:{},执行加微:{},客户:{}-{},使用话术:{}", client.getRoboticId(), client.getId(), e.getId(), client.getCustomerId(), crmCustomer.getCustomerName(), dialog.getName());
                     if(vo.isSuccess()){
                         e.setLastAddWxTime(LocalDateTime.now());
@@ -273,7 +272,7 @@ public class WxTaskService {
                     case Constants.ADD_WX:
                         //第一步是调用添加微信步骤
                         if(StringUtils.isBlank(e.getRunTaskFlow()) && StringUtils.isNotBlank(e.getTaskFlow()) && e.getTaskFlow().startsWith(Constants.ADD_WX)){
-                            allocateWx(e);
+                            companyVoiceRoboticServiceImpl.allocateWx(e);
 //                            CompletableFuture.supplyAsync(()->{
 //                                //分配个微账号
 //                                return allocateWx(e);
@@ -326,59 +325,60 @@ public class WxTaskService {
         log.info("===========CID任务执行完成===========");
     }
 
-    /**
-     * 分配账号
-     * @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) {
-            new CompanyVoiceRoboticWx();
-            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;
-    }
+//    /**
+//     * 分配账号
+//     * @param robotic
+//     */
+//    @Transactional
+//    @Deprecated
+//    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) {
+//            new CompanyVoiceRoboticWx();
+//            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;
+//    }
 
     /**
      * 单个任务执行且为单条执行对象
@@ -390,6 +390,7 @@ public class WxTaskService {
         //查询任务执行情况
         CompanyVoiceRoboticCallees data = companyVoiceRoboticCalleesMapper.selectDataByCalleesId(callerId);
         CompanyVoiceRobotic robotic = companyVoiceRoboticMapper.selectCompanyVoiceRoboticById(roboticId);
+        String taskFlow = data.getTaskFlow();
         if( null == data || null == robotic ){
             log.error("没有查询到任务执行数据,roboticId:{},callerId:{}",roboticId,callerId);
             return null;
@@ -399,8 +400,8 @@ public class WxTaskService {
             return null;
         }
         String nextTask;
-        if (StringUtils.isNotBlank(data.getRunTaskFlow()) && StringUtils.isNotBlank(data.getTaskFlow())) {
-            nextTask = getNextTaskOptimized(data.getTaskFlow(), data.getRunTaskFlow());
+        if (StringUtils.isNotBlank(data.getRunTaskFlow()) && StringUtils.isNotBlank(taskFlow)) {
+            nextTask = getNextTaskOptimized(taskFlow, data.getRunTaskFlow());
         } else {
             return null;
         }
@@ -415,15 +416,36 @@ public class WxTaskService {
             switch (nextTask) {
                 case Constants.CELL_PHONE:
                     companyVoiceRoboticService.callPhoneOne(roboticId, callerId);
-                    nextTaskOptimized = getNextTaskOptimized(data.getTaskFlow(), data.getRunTaskFlow() + "," + Constants.CELL_PHONE);
+                    nextTaskOptimized = getNextTaskOptimized(taskFlow, data.getRunTaskFlow() + "," + Constants.CELL_PHONE);
                     break;
 //            case Constants.ADD_WX:
 //                companyVoiceRoboticService.addWxOne();
 //                break;
                 case Constants.SEND_MSG:
-                    companyVoiceRoboticService.sendMsgOne(roboticId, callerId);
-                    nextTaskOptimized = getNextTaskOptimized(data.getTaskFlow(), data.getRunTaskFlow() + "," + Constants.SEND_MSG);
-                    break;
+                    if(Integer.valueOf(0).equals(data.getIsSendMsg())){
+                        //发送短信前一个任务如果是打电话 等待电话打完以后再执行发送
+                        String lastTaskOptimized = getLastTaskOptimized(taskFlow);
+                        if(Constants.CELL_PHONE.equals(lastTaskOptimized)){
+                            //是否打电话结束有回调值 完成电话动作以后执行下一步
+                            CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone = companyVoiceRoboticCallLogCallphoneService.selectLogByRoboticIdAndCallerId(roboticId, callerId);
+                            if(null != companyVoiceRoboticCallLogCallphone && companyVoiceRoboticCallLogCallphone.getStatus() == 1){
+                                nextTaskOptimized = "wait callPhone";
+                                break;
+                            }
+//                            todo AI电话执行失败了 是否执行发送短信
+//                            if(null != companyVoiceRoboticCallLogCallphone && companyVoiceRoboticCallLogCallphone.getStatus() == 3){
+//                                nextTaskOptimized = "error callPhone";
+//                                break;
+//                            }
+                        }
+                        companyVoiceRoboticService.sendMsgOne(roboticId, callerId);
+                        nextTaskOptimized = getNextTaskOptimized(taskFlow, data.getRunTaskFlow() + "," + Constants.SEND_MSG);
+                        break;
+                    } else{
+                        log.info("不再需要发送短信处理,roboticId:{},callerId:{}",roboticId,callerId);
+                        nextTaskOptimized = getNextTaskOptimized(taskFlow, data.getRunTaskFlow() + "," + Constants.SEND_MSG);
+                        break;
+                    }
             }
         } catch (Exception ex){
             log.error("执行任务异常,roboticId:{},callerId:{},nextTask:{}",roboticId,callerId,nextTask,ex);
@@ -434,7 +456,7 @@ public class WxTaskService {
             return nextTaskOptimized;
         }else{
             //任务执行完了 没有下一步 直接完成任务
-            companyVoiceRoboticMapper.finishRobotic(roboticId);
+//            companyVoiceRoboticMapper.finishRobotic(roboticId);
             return null;
         }
 
@@ -464,6 +486,15 @@ public class WxTaskService {
         return null;
     }
 
+    /**
+     * 获取最后一个执行的任务
+     * @param taskFlow
+     * @return
+     */
+    public String getLastTaskOptimized(String taskFlow){
+        return taskFlow.substring(taskFlow.lastIndexOf(",") + 1);
+    }
+
     /**
      * 调用下一个任务
      */
@@ -513,16 +544,18 @@ public class WxTaskService {
 
     @Autowired
     CompanyVoiceRoboticCallLogServiceImpl companyVoiceRoboticCallLogService;
+
+    @Autowired
+    CompanyVoiceRoboticCallLogAddwxServiceImpl companyVoiceRoboticCallLogAddwxService;
     /**
-     * 记录任务执行日志
-     * @param companyVoiceRoboticCallLog
+     * 记录任务执行日志 addWx
+     * @param logAddwx
      */
-
-    public void asyncSaveCompanyVoiceRoboticCallLog(CompanyVoiceRoboticCallLog companyVoiceRoboticCallLog){
+    public void asyncSaveCompanyVoiceRoboticCallLog(CompanyVoiceRoboticCallLogAddwx logAddwx){
         try{
-            companyVoiceRoboticCallLogService.asyncInsertCompanyVoiceRoboticCallLog(companyVoiceRoboticCallLog);
+            companyVoiceRoboticCallLogAddwxService.asyncInsertCompanyVoiceRoboticCallLog(logAddwx);
         }catch (Exception ex){
-            log.error("记录任务执行日志失败:失败数据:{}",companyVoiceRoboticCallLog, ex);
+            log.error("记录任务执行日志失败:失败数据:{}",logAddwx, ex);
         }
     }
 }