吴树波 il y a 3 semaines
Parent
commit
d77c62092e
100 fichiers modifiés avec 5237 ajouts et 379 suppressions
  1. 0 1
      fs-ad-api/src/main/java/com/fs/app/controller/CommonController.java
  2. 1 1
      fs-ad-api/src/main/java/com/fs/app/mq/RocketMQAiMsgService.java
  3. 1 1
      fs-ad-api/src/main/java/com/fs/app/mq/RocketMQConsumerService.java
  4. 1 1
      fs-ad-api/src/main/java/com/fs/app/mq/RocketMQConsumerServiceByQw.java
  5. 14 6
      fs-ad-api/src/main/java/com/fs/framework/config/DataSourceConfig.java
  6. 1 1
      fs-ad-api/src/main/java/com/fs/framework/config/DruidConfig.java
  7. 78 0
      fs-admin/src/main/java/com/fs/ad/controller/AdCallbackController.java
  8. 11 0
      fs-admin/src/main/java/com/fs/ad/controller/AdSiteController.java
  9. 97 0
      fs-admin/src/main/java/com/fs/ad/controller/AdUploadLogController.java
  10. 0 71
      fs-admin/src/main/java/com/fs/api/controller/CompanyAPIController.java
  11. 0 197
      fs-admin/src/main/java/com/fs/api/controller/IndexStatisticsController.java
  12. 106 0
      fs-admin/src/main/java/com/fs/company/controller/CompanyVoiceDialogController.java
  13. 208 0
      fs-admin/src/main/java/com/fs/company/controller/CompanyVoiceRoboticController.java
  14. 97 0
      fs-admin/src/main/java/com/fs/company/controller/CompanyVoiceRoboticWxController.java
  15. 115 0
      fs-admin/src/main/java/com/fs/company/controller/CompanyWxAccountController.java
  16. 125 0
      fs-admin/src/main/java/com/fs/company/controller/CompanyWxClientController.java
  17. 104 0
      fs-admin/src/main/java/com/fs/company/controller/CompanyWxDialogController.java
  18. 143 0
      fs-admin/src/main/java/com/fs/company/controller/CompanyWxUserController.java
  19. 107 0
      fs-admin/src/main/java/com/fs/company/controller/CompanyWxUserGroupController.java
  20. 6 17
      fs-company/src/main/java/com/fs/company/controller/CompanyLoginController.java
  21. 18 49
      fs-company/src/main/java/com/fs/company/controller/CompanyMenuController.java
  22. 20 4
      fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java
  23. 2 0
      fs-service-system/src/main/java/com/fs/ad/domain/AdSite.java
  24. 22 0
      fs-service-system/src/main/java/com/fs/ad/domain/AdUploadLog.java
  25. 7 3
      fs-service-system/src/main/java/com/fs/ad/service/impl/AdHtmlClickLogServiceImpl.java
  26. 1 2
      fs-service-system/src/main/java/com/fs/ad/service/impl/AdUploadLogServiceImpl.java
  27. 11 0
      fs-service-system/src/main/java/com/fs/aicall/AiCallController.java
  28. 11 0
      fs-service-system/src/main/java/com/fs/aicall/config/AiCallConfig.java
  29. 25 0
      fs-service-system/src/main/java/com/fs/aicall/config/bean/AiCallBeanServiceConfig.java
  30. 10 0
      fs-service-system/src/main/java/com/fs/aicall/domain/BaseDomain.java
  31. 15 0
      fs-service-system/src/main/java/com/fs/aicall/domain/TaskInfo.java
  32. 11 0
      fs-service-system/src/main/java/com/fs/aicall/domain/apiresult/Authentication.java
  33. 37 0
      fs-service-system/src/main/java/com/fs/aicall/domain/apiresult/Content.java
  34. 34 0
      fs-service-system/src/main/java/com/fs/aicall/domain/apiresult/Notify.java
  35. 11 0
      fs-service-system/src/main/java/com/fs/aicall/domain/apiresult/PushIIntentionResult.java
  36. 17 0
      fs-service-system/src/main/java/com/fs/aicall/domain/param/CalleeDomain.java
  37. 118 0
      fs-service-system/src/main/java/com/fs/aicall/domain/param/CalltaskcreateaiCustomizeDomain.java
  38. 17 0
      fs-service-system/src/main/java/com/fs/aicall/domain/param/EditDialogDomain.java
  39. 13 0
      fs-service-system/src/main/java/com/fs/aicall/domain/param/getDialogMapDomain.java
  40. 17 0
      fs-service-system/src/main/java/com/fs/aicall/domain/result/CalltaskcreateaiCustomizeResult.java
  41. 16 0
      fs-service-system/src/main/java/com/fs/aicall/domain/result/EditDialogResult.java
  42. 17 0
      fs-service-system/src/main/java/com/fs/aicall/domain/result/GetairobotResult.java
  43. 28 0
      fs-service-system/src/main/java/com/fs/aicall/domain/result/QueryCallTaskInfoResult.java
  44. 31 0
      fs-service-system/src/main/java/com/fs/aicall/domain/result/getDialogMapResult.java
  45. 13 0
      fs-service-system/src/main/java/com/fs/aicall/params/AiobChangeTashStatusParam.java
  46. 24 0
      fs-service-system/src/main/java/com/fs/aicall/params/AiobImportPhoneParam.java
  47. 13 0
      fs-service-system/src/main/java/com/fs/aicall/params/RobotParams.java
  48. 155 0
      fs-service-system/src/main/java/com/fs/aicall/service/AiCallService.java
  49. 93 0
      fs-service-system/src/main/java/com/fs/aicall/utils/AiCallUtils.java
  50. 104 0
      fs-service-system/src/main/java/com/fs/aicall/utils/AiobApiUtils.java
  51. 74 0
      fs-service-system/src/main/java/com/fs/aicall/utils/AiobPhoneEncryption.java
  52. 41 0
      fs-service-system/src/main/java/com/fs/aicall/utils/AiobTokenUtils.java
  53. 66 0
      fs-service-system/src/main/java/com/fs/aicall/utils/Md5Utils.java
  54. 13 0
      fs-service-system/src/main/java/com/fs/aicall/vo/AiobBackVo.java
  55. 129 0
      fs-service-system/src/main/java/com/fs/aicall/vo/AiobBaiduTaskVo.java
  56. 64 0
      fs-service-system/src/main/java/com/fs/aicall/vo/AiobCalleData.java
  57. 13 0
      fs-service-system/src/main/java/com/fs/aicall/vo/AiobImportPhoneVo.java
  58. 15 0
      fs-service-system/src/main/java/com/fs/aicall/vo/AiobTaskData.java
  59. 18 0
      fs-service-system/src/main/java/com/fs/aicall/vo/RawJsonDeserializer.java
  60. 70 0
      fs-service-system/src/main/java/com/fs/aicall/vo/RobotVo.java
  61. 34 0
      fs-service-system/src/main/java/com/fs/aiob/domain/AiobBaiduCallApi.java
  62. 30 0
      fs-service-system/src/main/java/com/fs/aiob/domain/AiobBaiduEncryption.java
  63. 160 0
      fs-service-system/src/main/java/com/fs/aiob/domain/AiobBaiduTask.java
  64. 62 0
      fs-service-system/src/main/java/com/fs/aiob/mapper/AiobBaiduCallApiMapper.java
  65. 62 0
      fs-service-system/src/main/java/com/fs/aiob/mapper/AiobBaiduEncryptionMapper.java
  66. 62 0
      fs-service-system/src/main/java/com/fs/aiob/mapper/AiobBaiduTaskMapper.java
  67. 62 0
      fs-service-system/src/main/java/com/fs/aiob/service/IAiobBaiduCallApiService.java
  68. 62 0
      fs-service-system/src/main/java/com/fs/aiob/service/IAiobBaiduEncryptionService.java
  69. 70 0
      fs-service-system/src/main/java/com/fs/aiob/service/IAiobBaiduTaskService.java
  70. 94 0
      fs-service-system/src/main/java/com/fs/aiob/service/impl/AiobBaiduCallApiServiceImpl.java
  71. 94 0
      fs-service-system/src/main/java/com/fs/aiob/service/impl/AiobBaiduEncryptionServiceImpl.java
  72. 472 0
      fs-service-system/src/main/java/com/fs/aiob/service/impl/AiobBaiduTaskServiceImpl.java
  73. 11 12
      fs-service-system/src/main/java/com/fs/baidu/service/impl/BdAccountServiceImpl.java
  74. 2 2
      fs-service-system/src/main/java/com/fs/bdAdv/mapper/FsAdvSemMapper.java
  75. 5 0
      fs-service-system/src/main/java/com/fs/bdAdv/param/FsAdvSemStatisticsByDayParam.java
  76. 1 2
      fs-service-system/src/main/java/com/fs/bdAdv/service/IFsAdvSemService.java
  77. 3 3
      fs-service-system/src/main/java/com/fs/bdAdv/service/impl/FsAdvSemServiceImpl.java
  78. 1 0
      fs-service-system/src/main/java/com/fs/common/param/SmsSendParam.java
  79. 2 1
      fs-service-system/src/main/java/com/fs/company/domain/CompanyTcmReport.java
  80. 49 0
      fs-service-system/src/main/java/com/fs/company/domain/CompanyVoiceDialog.java
  81. 110 0
      fs-service-system/src/main/java/com/fs/company/domain/CompanyVoiceRobotic.java
  82. 60 0
      fs-service-system/src/main/java/com/fs/company/domain/CompanyVoiceRoboticCallees.java
  83. 61 0
      fs-service-system/src/main/java/com/fs/company/domain/CompanyVoiceRoboticWx.java
  84. 62 0
      fs-service-system/src/main/java/com/fs/company/domain/CompanyWxAccount.java
  85. 44 0
      fs-service-system/src/main/java/com/fs/company/domain/CompanyWxChat.java
  86. 99 0
      fs-service-system/src/main/java/com/fs/company/domain/CompanyWxClient.java
  87. 32 0
      fs-service-system/src/main/java/com/fs/company/domain/CompanyWxDialog.java
  88. 61 0
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyVoiceDialogMapper.java
  89. 71 0
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyVoiceRoboticCalleesMapper.java
  90. 67 0
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyVoiceRoboticMapper.java
  91. 68 0
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyVoiceRoboticWxMapper.java
  92. 70 0
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyWxAccountMapper.java
  93. 62 0
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyWxChatMapper.java
  94. 71 0
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyWxClientMapper.java
  95. 62 0
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyWxDialogMapper.java
  96. 0 5
      fs-service-system/src/main/java/com/fs/company/service/ICompanyMenuService.java
  97. 64 0
      fs-service-system/src/main/java/com/fs/company/service/ICompanyVoiceDialogService.java
  98. 64 0
      fs-service-system/src/main/java/com/fs/company/service/ICompanyVoiceRoboticCalleesService.java
  99. 78 0
      fs-service-system/src/main/java/com/fs/company/service/ICompanyVoiceRoboticService.java
  100. 64 0
      fs-service-system/src/main/java/com/fs/company/service/ICompanyVoiceRoboticWxService.java

+ 0 - 1
fs-ad-api/src/main/java/com/fs/app/controller/CommonController.java

@@ -6,7 +6,6 @@ import com.fs.ad.enums.AdUploadType;
 import com.fs.ad.service.IAdHtmlClickLogService;
 import com.fs.common.core.domain.R;
 import com.fs.qw.vo.AdUploadVo;
-import com.fs.wxUser.service.ICompanyWxUserService;
 import io.swagger.annotations.Api;
 import jdk.nashorn.internal.ir.annotations.Ignore;
 import lombok.AllArgsConstructor;

+ 1 - 1
fs-ad-api/src/main/java/com/fs/app/mq/RocketMQAiMsgService.java

@@ -1,4 +1,4 @@
-//package com.fs.app.mq;
+package com.fs.app.mq;//package com.fs.app.mq;
 //
 //import cn.hutool.json.JSONUtil;
 //import com.alibaba.fastjson.JSON;

+ 1 - 1
fs-ad-api/src/main/java/com/fs/app/mq/RocketMQConsumerService.java

@@ -14,7 +14,7 @@ import org.springframework.stereotype.Service;
 @Slf4j
 @Service
 @AllArgsConstructor
-@RocketMQMessageListener(topic = "${rocketmq.consumer.topic}", consumerGroup = "${rocketmq.consumer.group}")
+//@RocketMQMessageListener(topic = "${rocketmq.consumer.topic}", consumerGroup = "${rocketmq.consumer.group}")
 public class RocketMQConsumerService implements RocketMQListener<String> {
 
     private final IAdHtmlClickLogService  adHtmlClickLogService;

+ 1 - 1
fs-ad-api/src/main/java/com/fs/app/mq/RocketMQConsumerServiceByQw.java

@@ -1,4 +1,4 @@
-//package com.fs.app.mq;
+package com.fs.app.mq;//package com.fs.app.mq;
 //
 //import com.alibaba.fastjson.JSON;
 //import com.fs.ad.service.IAdHtmlClickLogService;

+ 14 - 6
fs-ad-api/src/main/java/com/fs/framework/config/DataSourceConfig.java

@@ -22,6 +22,12 @@ import java.util.Map;
 @Configuration
 public class DataSourceConfig {
 
+    @Bean
+    @ConfigurationProperties(prefix = "spring.datasource.clickhouse")
+    public DataSource clickhouseDataSource() {
+        return new DruidDataSource();
+    }
+
     @Bean
     @ConfigurationProperties(prefix = "spring.datasource.mysql.druid.master")
     public DataSource masterDataSource() {
@@ -29,18 +35,20 @@ public class DataSourceConfig {
     }
 
     @Bean
-    @ConfigurationProperties(prefix = "spring.datasource.sop.druid.master")
-    public DataSource sopDataSource() {
+    @ConfigurationProperties(prefix = "spring.datasource.mysql.druid.slave")
+    public DataSource slaveDataSource() {
         return new DruidDataSource();
     }
 
-
     @Bean
     @Primary
-    public DynamicDataSource dataSource(@Qualifier("sopDataSource") DataSource sopDataSource,
-                                        @Qualifier("masterDataSource") DataSource masterDataSource) {
+    public DynamicDataSource dataSource(@Qualifier("clickhouseDataSource") DataSource clickhouseDataSource,
+                                        @Qualifier("masterDataSource") DataSource masterDataSource,
+                                        @Qualifier("slaveDataSource") DataSource slaveDataSource) {
         Map<Object, Object> targetDataSources = new HashMap<>();
-        targetDataSources.put(DataSourceType.SOP.name(), sopDataSource); // Ensure matching key
+        targetDataSources.put(DataSourceType.MASTER, masterDataSource);
+        targetDataSources.put(DataSourceType.SLAVE, slaveDataSource);
+        targetDataSources.put(DataSourceType.CLICKHOUSE.name(), clickhouseDataSource); // Ensure matching key
         return new DynamicDataSource(masterDataSource, targetDataSources);
     }
 

+ 1 - 1
fs-ad-api/src/main/java/com/fs/framework/config/DruidConfig.java

@@ -1,4 +1,4 @@
-//package com.fs.framework.config;
+package com.fs.framework.config;//package com.fs.framework.config;
 //
 //import com.alibaba.druid.pool.DruidDataSource;
 //import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;

+ 78 - 0
fs-admin/src/main/java/com/fs/ad/controller/AdCallbackController.java

@@ -0,0 +1,78 @@
+package com.fs.ad.controller;//package com.fs.ad.controller;
+//
+//import com.alibaba.fastjson.JSON;
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.fs.ad.domain.AdHtmlUrl;
+//import com.fs.ad.mapper.AdHtmlUrlMapper;
+//import com.fs.ad.service.IAdHtmlClickLogService;
+//import com.fs.ad.yk.utils.ApiUtils;
+//import com.fs.ad.yk.vo.DataBackVo;
+//import com.fs.baidu.api.BaiduApis;
+//import com.fs.baidu.api.ConvertData;
+//import com.fs.baidu.vo.AdClickCallbackVo;
+//import com.fs.common.core.controller.BaseController;
+//import com.fs.common.core.domain.R;
+//import com.fs.common.utils.StringUtils;
+//import lombok.AllArgsConstructor;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.web.bind.annotation.*;
+//
+///**
+// * 知识库Controller
+// *
+// * @author fs
+// * @date 2024-04-21
+// */
+//@Slf4j
+//@AllArgsConstructor
+//@RestController
+//@RequestMapping("/baidu")
+//public class AdCallbackController extends BaseController {
+//
+//    private final AdHtmlUrlMapper adHtmlUrlMapper;
+//    private final IAdHtmlClickLogService adHtmlClickLogService;
+//    private final BaiduApis baiduApis;
+//
+//    //百度-页面点击接口
+//    @GetMapping("/callback")
+//    public R callback(String url, String no, String bdVid, String t) {
+//        if(StringUtils.isEmpty(no) || StringUtils.isEmpty(bdVid)) {
+//            return R.ok();
+//        }
+//        adHtmlClickLogService.addLog(url, no, bdVid, t, 0);
+//        Runnable runnable = () -> ConvertData.uploadConvertData(url, Integer.parseInt(t));
+//        runnable.run();
+//        return R.ok();
+//    }
+//    // 百度点击监听返回接口
+//    @GetMapping("/clickCallback")
+//    public R clickCallback(AdClickCallbackVo vo){
+//        log.info("百度监听地址返回数据:{}", JSON.toJSONString(vo));
+//        adHtmlClickLogService.setLog(vo, "67", 0);
+//        return R.ok();
+//    }
+//    @GetMapping("/getTemplate")
+//    public R getTemplate(String no){
+//        AdHtmlUrl htmlUrl = adHtmlUrlMapper.selectOne(new QueryWrapper<AdHtmlUrl>().eq("no", no));
+//        if(htmlUrl == null){
+//            return R.error("错误编号");
+//        }
+//        return R.ok().put("images", htmlUrl.getImages().split(",")).put("json", StringUtils.isNotEmpty(htmlUrl.getDataJson()) ? JSON.parseObject(htmlUrl.getDataJson()) : null);
+//    }
+//    @GetMapping("/syncPlan")
+//    public R syncPlan(){
+//        baiduApis.listAccount(1L);
+//        return R.ok();
+//    }
+//
+//
+//    @GetMapping("/youkuClickCallback")
+//    public R youkuClickCallback(AdClickCallbackVo vo){
+//        log.info("优酷监听地址返回数据:{}", JSON.toJSONString(vo));
+//        adHtmlClickLogService.setLog(vo, "wechat", 1);
+////        ApiUtils.dataBack(DataBackVo.builder().trackId(vo.getBd_vid()).creativeId(vo.getAid()).build());
+//        return R.ok();
+//    }
+//
+//
+//}

+ 11 - 0
fs-admin/src/main/java/com/fs/ad/controller/AdSiteController.java

@@ -5,6 +5,7 @@ import com.fs.ad.service.IAdSiteService;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.poi.ExcelUtil;
@@ -39,6 +40,16 @@ public class AdSiteController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 查询站点管理列表
+     */
+    @PreAuthorize("@ss.hasPermi('ad:adSite:list')")
+    @GetMapping("/listAll")
+    public R listAll(AdSite adSite){
+        List<AdSite> list = adSiteService.selectAdSiteList(adSite);
+        return R.ok().put("data", list);
+    }
+
     /**
      * 导出站点管理列表
      */

+ 97 - 0
fs-admin/src/main/java/com/fs/ad/controller/AdUploadLogController.java

@@ -0,0 +1,97 @@
+package com.fs.ad.controller;
+
+import com.fs.ad.domain.AdUploadLog;
+import com.fs.ad.service.IAdUploadLogService;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 百度回传日志Controller
+ * 
+ * @author fs
+ * @date 2025-03-14
+ */
+@RestController
+@RequestMapping("/ad/AdUploadLog")
+public class AdUploadLogController extends BaseController
+{
+    @Autowired
+    private IAdUploadLogService adUploadLogService;
+
+    /**
+     * 查询百度回传日志列表
+     */
+    @PreAuthorize("@ss.hasPermi('ad:AdUploadLog:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(AdUploadLog adUploadLog)
+    {
+        startPage();
+        List<AdUploadLog> list = adUploadLogService.selectAdUploadLogList(adUploadLog);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出百度回传日志列表
+     */
+    @PreAuthorize("@ss.hasPermi('ad:AdUploadLog:export')")
+    @Log(title = "百度回传日志", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(AdUploadLog adUploadLog)
+    {
+        List<AdUploadLog> list = adUploadLogService.selectAdUploadLogList(adUploadLog);
+        ExcelUtil<AdUploadLog> util = new ExcelUtil<AdUploadLog>(AdUploadLog.class);
+        return util.exportExcel(list, "百度回传日志数据");
+    }
+
+    /**
+     * 获取百度回传日志详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('ad:AdUploadLog:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(adUploadLogService.selectAdUploadLogById(id));
+    }
+
+    /**
+     * 新增百度回传日志
+     */
+    @PreAuthorize("@ss.hasPermi('ad:AdUploadLog:add')")
+    @Log(title = "百度回传日志", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody AdUploadLog adUploadLog)
+    {
+        return toAjax(adUploadLogService.insertAdUploadLog(adUploadLog));
+    }
+
+    /**
+     * 修改百度回传日志
+     */
+    @PreAuthorize("@ss.hasPermi('ad:AdUploadLog:edit')")
+    @Log(title = "百度回传日志", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody AdUploadLog adUploadLog)
+    {
+        return toAjax(adUploadLogService.updateAdUploadLog(adUploadLog));
+    }
+
+    /**
+     * 删除百度回传日志
+     */
+    @PreAuthorize("@ss.hasPermi('ad:AdUploadLog:remove')")
+    @Log(title = "百度回传日志", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(adUploadLogService.deleteAdUploadLogByIds(ids));
+    }
+}

+ 0 - 71
fs-admin/src/main/java/com/fs/api/controller/CompanyAPIController.java

@@ -1,71 +0,0 @@
-package com.fs.api.controller;
-
-import com.fs.api.param.ExpressParam;
-import com.fs.api.param.OrderListParam;
-import com.fs.api.vo.ExpressVO;
-import com.fs.api.vo.OrderListVO;
-import com.fs.common.core.controller.BaseController;
-import com.fs.common.core.domain.R;
-import com.fs.common.exception.CustomException;
-import com.fs.company.domain.Company;
-import com.fs.company.service.ICompanyService;
-import com.fs.store.service.*;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.List;
-
-/**
- * 订单Controller
- *
- * @author fs
- * @date 2022-03-15
- */
-@RestController
-@RequestMapping("/api")
-public class CompanyAPIController extends BaseController
-{
-    @Autowired
-    private ICompanyService companyService;
-    @Autowired
-    private IFsStoreOrderService storeOrderService;
-    @Autowired
-    private IFsExpressService expressService;
-
-    private Company checkCompany(HttpServletRequest request){
-        String appId=request.getHeader("appId");
-        String appKey=request.getHeader("appKey");
-        if(appId==null){
-            throw new CustomException("appId不能为空");
-        }
-        if(appKey==null){
-            throw new CustomException("appKey不能为空");
-        }
-        Company company=companyService.selectCompanyByAppId(appId);
-        if(company==null){
-            throw new CustomException("appId不存在");
-        }
-        return company;
-    }
-
-    @GetMapping("/getOrderList")
-    public R getOrderList(OrderListParam param, HttpServletRequest request)
-    {
-        Company company=checkCompany(request);
-        param.setCompanyId(company.getCompanyId());
-        List<OrderListVO> list = storeOrderService.selectCompanyStoreOrderListAPI(param);
-        return R.ok().put("data",list);
-    }
-
-
-    @GetMapping("/getExpressInfo")
-    public R getExpressInfo(ExpressParam param, HttpServletRequest request) {
-        Company company=checkCompany(request);
-        List<ExpressVO> list = expressService.getExpressInfoAPI(param);
-        return R.ok().put("data",list);
-    }
-
-
-
-}

+ 0 - 197
fs-admin/src/main/java/com/fs/api/controller/IndexStatisticsController.java

@@ -1,197 +0,0 @@
-package com.fs.api.controller;
-
-import com.fs.common.core.redis.RedisCache;
-import com.fs.statis.StatisticsRedisConstant;
-import com.fs.statis.dto.*;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-import com.fs.common.core.domain.R;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static com.fs.statis.StatisticsRedisConstant.*;
-
-/**
- * 首页-统计
- */
-@RestController
-@RequestMapping("/index/statistics")
-public class IndexStatisticsController {
-    @Autowired
-    private RedisCache redisCache;
-    /**
-     * 分析概览
-     */
-    @PostMapping("/analysisPreview")
-    public R analysisPreview(@RequestBody AnalysisPreviewQueryDTO param){
-        AnalysisPreviewDTO analysisPreviewDTO = null;
-        Integer type = param.getType();
-        Integer userType = param.getUserType();
-
-        if(type == null) {
-            type = 0;
-        }
-
-        if(userType == null) {
-            userType = 0;
-        }
-        analysisPreviewDTO = redisCache.getCacheObject(String.format("%s:%d:%d",DATA_OVERVIEW_DEALER_ANALYSISPREVIEW,type,userType));
-
-        return R.ok().put("data",analysisPreviewDTO);
-    }
-
-
-    /**
-     * 消费余额
-     */
-    @GetMapping("/rechargeComsumption")
-    public R rechargeComsumption(){
-        ConsumptionBalanceDataDTO consumptionBalanceDataDTO = redisCache.getCacheObject(StatisticsRedisConstant.DATA_OVERVIEW_DEALER_BALANCE);
-
-        return R.ok().put("data", consumptionBalanceDataDTO);
-    }
-
-    /**
-     * 获取统计流量
-     * @return
-     */
-    @GetMapping("/trafficLog")
-    public R getTrafficLog(){
-        TrafficLogDTO trafficLogDTO = redisCache.getCacheObject(DATA_OVERVIEW_TRAFFIC_LOG);
-        return R.ok().put("data",trafficLogDTO);
-    }
-
-    /**
-     * 观看趋势
-     */
-    @PostMapping("/watchEndPlayTrend")
-    public R watchEndPlayTrend(@RequestBody AnalysisPreviewQueryDTO param){
-        Integer type = param.getType();
-        Integer userType = param.getUserType();
-
-        if(type == null) {
-            type = 0;
-        }
-        if(userType == null){
-            userType = 0;
-        }
-        String key = String.format("%s:%d:%d", DATA_OVERVIEW_DEALER_CHARTS, type,userType);
-        List<DeaMemberTopTenDTO> deaMemberTopTenDTOS = redisCache.getCacheObject(key);
-        return R.ok().put("data", deaMemberTopTenDTOS);
-    }
-
-    /**
-     * 经销商会员观看
-     */
-    @PostMapping("/deaMemberTopTen")
-    public R deaMemberTopTen(@RequestBody AnalysisPreviewQueryDTO param){
-        Integer type = param.getType();
-        Integer statisticalType = param.getStatisticalType();
-        Integer userType = param.getUserType();
-
-        if(type == null) {
-            type = 0;
-        }
-        if(userType == null){
-            userType = 0;
-        }
-
-        List<DeaMemberTopTenDTO> deaMemberTopTenDTOS = redisCache.getCacheObject(String.format("%s:%d:%d:%d", CHARTS_MEMBER_TOP_TEN_WATCH, type, statisticalType,userType));
-        if(deaMemberTopTenDTOS == null){
-            deaMemberTopTenDTOS = new ArrayList<>();
-        }
-        return R.ok().put("data", deaMemberTopTenDTOS);
-    }
-
-    /**
-     * 奖励金额top10
-     */
-    @PostMapping("/rewardMoneyTopTen")
-    public R rewardMoneyTopTen(@RequestBody AnalysisPreviewQueryDTO param){
-        Integer type = param.getType();
-        Integer dataType = param.getDataType();
-        Integer userType = param.getUserType();
-
-        List<RewardMoneyTopTenDTO> rewardMoneyTopTenDTOS = redisCache.getCacheObject( String.format("%s:%d:%d:%d", CHARTS_REWARD_MONEY_TOP_TEN, type,dataType,userType));
-        return R.ok().put("data", rewardMoneyTopTenDTOS);
-    }
-
-    /**
-     * 答题红包金额趋势图
-     */
-    @PostMapping("/rewardMoneyTrend")
-    public R rewardMoneyTrend(@RequestBody AnalysisPreviewQueryDTO param){
-        Integer type = param.getType();
-        Integer userType = param.getUserType();
-        List<RewardMoneyTrendDTO> rewardMoneyTrendDTOS = redisCache.getCacheObject( String.format("%s:%d:%d", CHARTS_REWARD_MONEY_TREND, type,userType));
-        return R.ok().put("data", rewardMoneyTrendDTOS);
-    }
-
-    /**
-     * 课程观看top10
-     */
-    @PostMapping("/watchCourseTopTen")
-    public R watchCourseTopTen(@RequestBody AnalysisPreviewQueryDTO param){
-        Integer type = param.getType();
-        String sort = param.getSort();
-        Integer statisticalType = param.getStatisticalType();
-        Integer userType = param.getUserType();
-
-        List<CourseStatsDTO> courseStatsDTOS = redisCache.getCacheObject(String.format("%s:%d:%d:%d:%s", CHARTS_WATCH_TOP_TEN, type,statisticalType,userType,sort));
-        return R.ok().put("data", courseStatsDTOS);
-    }
-
-    /**
-     * 数据概览
-     */
-    @GetMapping("/dealerAggregated")
-    public R dealerAggregated(){
-        DealerAggregatedDTO dealerAggregatedDTO = redisCache.getCacheObject(StatisticsRedisConstant.DATA_OVERVIEW_DEALER_AGGREGATED);
-
-        return R.ok().put("data",dealerAggregatedDTO);
-    }
-
-    /**
-     * 短信余额
-     */
-    @GetMapping("/smsBalance")
-    public R smsBalance(){
-        Long smsBalance = redisCache.getCacheObject(StatisticsRedisConstant.DATA_OVERVIEW_DEALER_SMS_BALANCE);
-
-        return R.ok().put("data", smsBalance);
-    }
-
-
-    /**
-     * 授权信息
-     */
-    @GetMapping("/authorizationInfo")
-    public R authorizationInfo(){
-        AuthorizationInfoDTO authorizationInfoDTO = redisCache.getCacheObject(StatisticsRedisConstant.DATA_OVERVIEW_DEALER_AUTHORIZATION_INFO);
-
-        return R.ok().put("data", authorizationInfoDTO);
-    }
-
-
-    /**
-     * 当月订单数统计
-     * @return
-     */
-    @GetMapping("/thisMonthOrderCount")
-    public R thisMonthOrderCount(){
-        R result = redisCache.getCacheObject(StatisticsRedisConstant.THIS_MONTH_ORDER_COUNT);
-        return result;
-    }
-
-    /**
-     * 当月收益统计
-     * @return
-     */
-
-    @GetMapping("/thisMonthRecvCount")
-    public R thisMonthRecvCount(){
-        R result = redisCache.getCacheObject(StatisticsRedisConstant.THIS_MONTH_RECV_COUNT);
-        return result;
-    }
-}

+ 106 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanyVoiceDialogController.java

@@ -0,0 +1,106 @@
+package com.fs.company.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.domain.CompanyVoiceDialog;
+import com.fs.company.service.ICompanyVoiceDialogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * AI外呼话术Controller
+ * 
+ * @author fs
+ * @date 2024-12-04
+ */
+@RestController
+@RequestMapping("/company/companyVoiceDialog")
+public class CompanyVoiceDialogController extends BaseController
+{
+    @Autowired
+    private ICompanyVoiceDialogService companyVoiceDialogService;
+
+    /**
+     * 查询AI外呼话术列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:companyVoiceDialog:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CompanyVoiceDialog companyVoiceDialog)
+    {
+        startPage();
+        List<CompanyVoiceDialog> list = companyVoiceDialogService.selectCompanyVoiceDialogList(companyVoiceDialog);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出AI外呼话术列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:companyVoiceDialog:export')")
+    @Log(title = "AI外呼话术", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(CompanyVoiceDialog companyVoiceDialog)
+    {
+        List<CompanyVoiceDialog> list = companyVoiceDialogService.selectCompanyVoiceDialogList(companyVoiceDialog);
+        ExcelUtil<CompanyVoiceDialog> util = new ExcelUtil<CompanyVoiceDialog>(CompanyVoiceDialog.class);
+        return util.exportExcel(list, "dialog");
+    }
+
+    /**
+     * 获取AI外呼话术详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:companyVoiceDialog:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(companyVoiceDialogService.selectCompanyVoiceDialogById(id));
+    }
+
+    /**
+     * 新增AI外呼话术
+     */
+    @PreAuthorize("@ss.hasPermi('system:companyVoiceDialog:add')")
+    @Log(title = "AI外呼话术", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CompanyVoiceDialog companyVoiceDialog)
+    {
+        return toAjax(companyVoiceDialogService.insertCompanyVoiceDialog(companyVoiceDialog));
+    }
+
+    /**
+     * 修改AI外呼话术
+     */
+    @PreAuthorize("@ss.hasPermi('system:companyVoiceDialog:edit')")
+    @Log(title = "AI外呼话术", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CompanyVoiceDialog companyVoiceDialog)
+    {
+        return toAjax(companyVoiceDialogService.updateCompanyVoiceDialog(companyVoiceDialog));
+    }
+
+    /**
+     * 删除AI外呼话术
+     */
+    @PreAuthorize("@ss.hasPermi('system:companyVoiceDialog:remove')")
+    @Log(title = "AI外呼话术", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(companyVoiceDialogService.deleteCompanyVoiceDialogByIds(ids));
+    }
+    /**
+     * 获取话术配置链接
+     */
+    @PreAuthorize("@ss.hasPermi('system:companyVoiceDialog:list')")
+    @Log(title = "话术配置链接", businessType = BusinessType.DELETE)
+	@GetMapping("/getConfigUrl")
+    public AjaxResult getConfigUrl(Long id){
+        return AjaxResult.success("", companyVoiceDialogService.getConfigUrl(id));
+    }
+}

+ 208 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanyVoiceRoboticController.java

@@ -0,0 +1,208 @@
+package com.fs.company.controller;
+
+import com.fs.aicall.domain.TaskInfo;
+import com.fs.aicall.domain.apiresult.PushIIntentionResult;
+import com.fs.aicall.domain.result.EditDialogResult;
+import com.fs.aicall.domain.result.GetairobotResult;
+import com.fs.aicall.domain.result.QueryCallTaskInfoResult;
+import com.fs.aicall.service.AiCallService;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.domain.CompanyVoiceRobotic;
+import com.fs.company.domain.CompanyVoiceRoboticCallees;
+import com.fs.company.domain.CompanyVoiceRoboticWx;
+import com.fs.company.service.ICompanyVoiceRoboticCalleesService;
+import com.fs.company.service.ICompanyVoiceRoboticService;
+import com.fs.company.service.ICompanyVoiceRoboticWxService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 机器人外呼任务Controller
+ * 
+ * @author fs
+ * @date 2024-12-04
+ */
+@RestController
+@RequestMapping("/company/companyVoiceRobotic")
+public class CompanyVoiceRoboticController extends BaseController
+{
+    @Autowired
+    private ICompanyVoiceRoboticService companyVoiceRoboticService;
+    @Autowired
+    private ICompanyVoiceRoboticCalleesService companyVoiceRoboticCalleesService;
+    @Autowired
+    private AiCallService aiCallService;
+    @Autowired
+    private ICompanyVoiceRoboticWxService companyVoiceRoboticWxService;
+
+    /**
+     * 查询机器人外呼任务列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:companyVoiceRobotic:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CompanyVoiceRobotic companyVoiceRobotic){
+        startPage();
+        List<CompanyVoiceRobotic> list = companyVoiceRoboticService.selectCompanyVoiceRoboticList(companyVoiceRobotic);
+        return getDataTable(list);
+    }
+    /**
+     * 查询机器人外呼任务列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:companyVoiceRobotic:list')")
+    @GetMapping("/listAll")
+    public R listAll(CompanyVoiceRobotic companyVoiceRobotic){
+        return R.ok().put("data", companyVoiceRoboticService.selectCompanyVoiceRoboticList(companyVoiceRobotic));
+    }
+    @PreAuthorize("@ss.hasPermi('system:companyVoiceRobotic:list')")
+    @GetMapping("/calleesList")
+    public TableDataInfo calleesList(Long id){
+        startPage();
+        List<CompanyVoiceRoboticCallees> list = companyVoiceRoboticCalleesService.selectCompanyVoiceRoboticCalleesListByRoboticId(id);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('system:companyVoiceRobotic:list')")
+    @GetMapping("/wxList")
+    public TableDataInfo wxList(Long id){
+        startPage();
+        List<CompanyVoiceRoboticWx> list = companyVoiceRoboticWxService.selectWxList(id);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出机器人外呼任务列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:companyVoiceRobotic:export')")
+    @Log(title = "机器人外呼任务", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(CompanyVoiceRobotic companyVoiceRobotic)
+    {
+        List<CompanyVoiceRobotic> list = companyVoiceRoboticService.selectCompanyVoiceRoboticList(companyVoiceRobotic);
+        ExcelUtil<CompanyVoiceRobotic> util = new ExcelUtil<CompanyVoiceRobotic>(CompanyVoiceRobotic.class);
+        return util.exportExcel(list, "robotic");
+    }
+
+    /**
+     * 获取机器人外呼任务详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:companyVoiceRobotic:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(companyVoiceRoboticService.selectCompanyVoiceRoboticById(id));
+    }
+
+    /**
+     * 新增机器人外呼任务
+     */
+    @PreAuthorize("@ss.hasPermi('system:companyVoiceRobotic:add')")
+    @Log(title = "机器人外呼任务", businessType = BusinessType.INSERT)
+    @PostMapping
+    @Transactional
+    public AjaxResult add(@RequestBody CompanyVoiceRobotic companyVoiceRobotic)
+    {
+        return toAjax(companyVoiceRoboticService.insertCompanyVoiceRobotic(companyVoiceRobotic));
+    }
+
+    /**
+     * 修改机器人外呼任务
+     */
+    @PreAuthorize("@ss.hasPermi('system:companyVoiceRobotic:edit')")
+    @Log(title = "机器人外呼任务", businessType = BusinessType.UPDATE)
+    @PutMapping
+    @Transactional
+    public AjaxResult edit(@RequestBody CompanyVoiceRobotic companyVoiceRobotic)
+    {
+        return toAjax(companyVoiceRoboticService.updateCompanyVoiceRobotic(companyVoiceRobotic));
+    }
+
+    /**
+     * 删除机器人外呼任务
+     */
+    @PreAuthorize("@ss.hasPermi('system:companyVoiceRobotic:remove')")
+    @Log(title = "机器人外呼任务", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(companyVoiceRoboticService.deleteCompanyVoiceRoboticByIds(ids));
+    }
+    /**
+     * 删除机器人外呼任务
+     */
+	@GetMapping("/getTypes")
+    public R getTypes(){
+        List<GetairobotResult> getairobotlist = aiCallService.getairobotlist();
+        List<EditDialogResult> editDialogResults = aiCallService.queryDialog();
+        return R.ok().put("robot", getairobotlist).put("dialog", editDialogResults);
+    }
+    /**
+     * 查询状态
+     */
+    @GetMapping("/statusList")
+    public R statusList(String ids){
+        List<String> list = Arrays.stream(ids.split(",")).filter(StringUtils::isNotEmpty).collect(Collectors.toList());
+        return R.ok().put("data", list.stream().map(e -> aiCallService.queryCallTaskInfo(TaskInfo.builder().taskID(e).build())).collect(Collectors.toMap(QueryCallTaskInfoResult::getTaskID, e -> e)));
+    }
+    /**
+     * 启动任务
+     */
+	@GetMapping("/startRobotic")
+    public R startRobotic(String taskId){
+        aiCallService.startCallTask(TaskInfo.builder().taskID(taskId).build());
+        return R.ok();
+    }
+    /**
+     * 停止任务
+     */
+	@GetMapping("/stopRobotic")
+    public R stopRobotic(String taskId){
+        aiCallService.stopCallTask(TaskInfo.builder().taskID(taskId).build());
+        return R.ok();
+    }
+    /**
+     * 员工列表
+     */
+	@GetMapping("/companyUserList")
+    public R qwUserList(){
+        return R.ok().put("data", companyVoiceRoboticService.qwUserList());
+    }
+
+    /**
+     * 外呼回调
+     */
+	@PostMapping("/callerResult")
+    public R callerResult(@RequestBody PushIIntentionResult result){
+        companyVoiceRoboticService.callerResult(result);
+        return R.ok();
+    }
+    /**
+     * 外呼回调
+     */
+	@GetMapping("/test")
+    public R test(Long id){
+//        companyVoiceRoboticService.test(id);
+        companyVoiceRoboticService.dispenseWx(id);
+        return R.ok();
+    }
+    /**
+     * 外呼回调
+     */
+	@PostMapping("/addScheme")
+    public R addWx(@RequestBody CompanyVoiceRobotic companyVoiceRobotic){
+        companyVoiceRoboticService.addWx(companyVoiceRobotic);
+        return R.ok();
+    }
+}

+ 97 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanyVoiceRoboticWxController.java

@@ -0,0 +1,97 @@
+package com.fs.company.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.domain.CompanyVoiceRoboticWx;
+import com.fs.company.service.ICompanyVoiceRoboticWxService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * AI外呼任务加微方式Controller
+ * 
+ * @author fs
+ * @date 2024-12-06
+ */
+@RestController
+@RequestMapping("/company/VoiceRoboticWx")
+public class CompanyVoiceRoboticWxController extends BaseController
+{
+    @Autowired
+    private ICompanyVoiceRoboticWxService companyVoiceRoboticWxService;
+
+    /**
+     * 查询AI外呼任务加微方式列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:VoiceRoboticWx:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CompanyVoiceRoboticWx companyVoiceRoboticWx)
+    {
+        startPage();
+        List<CompanyVoiceRoboticWx> list = companyVoiceRoboticWxService.selectCompanyVoiceRoboticWxList(companyVoiceRoboticWx);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出AI外呼任务加微方式列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:VoiceRoboticWx:export')")
+    @Log(title = "AI外呼任务加微方式", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(CompanyVoiceRoboticWx companyVoiceRoboticWx)
+    {
+        List<CompanyVoiceRoboticWx> list = companyVoiceRoboticWxService.selectCompanyVoiceRoboticWxList(companyVoiceRoboticWx);
+        ExcelUtil<CompanyVoiceRoboticWx> util = new ExcelUtil<CompanyVoiceRoboticWx>(CompanyVoiceRoboticWx.class);
+        return util.exportExcel(list, "VoiceRoboticWx");
+    }
+
+    /**
+     * 获取AI外呼任务加微方式详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('company:VoiceRoboticWx:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(companyVoiceRoboticWxService.selectCompanyVoiceRoboticWxById(id));
+    }
+
+    /**
+     * 新增AI外呼任务加微方式
+     */
+    @PreAuthorize("@ss.hasPermi('company:VoiceRoboticWx:add')")
+    @Log(title = "AI外呼任务加微方式", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CompanyVoiceRoboticWx companyVoiceRoboticWx)
+    {
+        return toAjax(companyVoiceRoboticWxService.insertCompanyVoiceRoboticWx(companyVoiceRoboticWx));
+    }
+
+    /**
+     * 修改AI外呼任务加微方式
+     */
+    @PreAuthorize("@ss.hasPermi('company:VoiceRoboticWx:edit')")
+    @Log(title = "AI外呼任务加微方式", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CompanyVoiceRoboticWx companyVoiceRoboticWx)
+    {
+        return toAjax(companyVoiceRoboticWxService.updateCompanyVoiceRoboticWx(companyVoiceRoboticWx));
+    }
+
+    /**
+     * 删除AI外呼任务加微方式
+     */
+    @PreAuthorize("@ss.hasPermi('company:VoiceRoboticWx:remove')")
+    @Log(title = "AI外呼任务加微方式", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(companyVoiceRoboticWxService.deleteCompanyVoiceRoboticWxByIds(ids));
+    }
+}

+ 115 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanyWxAccountController.java

@@ -0,0 +1,115 @@
+package com.fs.company.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.domain.CompanyWxAccount;
+import com.fs.company.service.ICompanyWxAccountService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 企微账号Controller
+ * 
+ * @author fs
+ * @date 2024-12-09
+ */
+@RestController
+@RequestMapping("/company/companyWx")
+public class CompanyWxAccountController extends BaseController
+{
+    @Autowired
+    private ICompanyWxAccountService companyWxEnterpriseAccountService;
+
+    /**
+     * 查询企微账号列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:companyWx:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CompanyWxAccount companyWxAccount)
+    {
+        startPage();
+        List<CompanyWxAccount> list = companyWxEnterpriseAccountService.selectCompanyWxAccountList(companyWxAccount);
+        return getDataTable(list);
+    }
+    /**
+     * 查询企微账号列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:companyWx:list')")
+    @GetMapping("/listAll")
+    public R listAll(CompanyWxAccount companyWxAccount){
+        List<CompanyWxAccount> list = companyWxEnterpriseAccountService.selectCompanyWxAccountList(companyWxAccount);
+        return R.ok().put("data", list);
+    }
+
+    /**
+     * 导出企微账号列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:companyWx:export')")
+    @Log(title = "企微账号", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(CompanyWxAccount companyWxAccount)
+    {
+        List<CompanyWxAccount> list = companyWxEnterpriseAccountService.selectCompanyWxAccountList(companyWxAccount);
+        ExcelUtil<CompanyWxAccount> util = new ExcelUtil<CompanyWxAccount>(CompanyWxAccount.class);
+        return util.exportExcel(list, "companyWx");
+    }
+
+    /**
+     * 获取企微账号详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('company:companyWx:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(companyWxEnterpriseAccountService.selectCompanyWxAccountById(id));
+    }
+
+    /**
+     * 新增企微账号
+     */
+    @PreAuthorize("@ss.hasPermi('company:companyWx:add')")
+    @Log(title = "企微账号", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CompanyWxAccount companyWxAccount)
+    {
+        return toAjax(companyWxEnterpriseAccountService.insertCompanyWxAccount(companyWxAccount));
+    }
+
+    /**
+     * 修改企微账号
+     */
+    @PreAuthorize("@ss.hasPermi('company:companyWx:edit')")
+    @Log(title = "企微账号", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CompanyWxAccount companyWxAccount)
+    {
+        return toAjax(companyWxEnterpriseAccountService.updateCompanyWxAccount(companyWxAccount));
+    }
+
+    /**
+     * 删除企微账号
+     */
+    @PreAuthorize("@ss.hasPermi('company:companyWx:remove')")
+    @Log(title = "企微账号", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(companyWxEnterpriseAccountService.deleteCompanyWxAccountByIds(ids));
+    }
+    /**
+     * 删除企微账号
+     */
+    @PreAuthorize("@ss.hasPermi('company:companyWx:list')")
+	@GetMapping("/companyListAll")
+    public R companyListAll(){
+        return R.ok().put("data", companyWxEnterpriseAccountService.companyListAll());
+    }
+}

+ 125 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanyWxClientController.java

@@ -0,0 +1,125 @@
+package com.fs.company.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.domain.CompanyWxClient;
+import com.fs.company.service.ICompanyVoiceRoboticService;
+import com.fs.company.service.ICompanyWxClientService;
+import com.fs.company.vo.AddWxClientVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 添加个微信账号Controller
+ * 
+ * @author fs
+ * @date 2024-12-09
+ */
+@RestController
+@RequestMapping("/company/companyClient")
+public class CompanyWxClientController extends BaseController
+{
+    @Autowired
+    private ICompanyWxClientService companyWxClientService;
+    @Autowired
+    private ICompanyVoiceRoboticService companyVoiceRoboticService;
+
+    /**
+     * 查询添加个微信账号列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:companyClient:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CompanyWxClient companyWxClient){
+        startPage();
+        List<CompanyWxClient> list = companyWxClientService.selectCompanyWxClientList(companyWxClient);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出添加个微信账号列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:companyClient:export')")
+    @Log(title = "添加个微信账号", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(CompanyWxClient companyWxClient)
+    {
+        List<CompanyWxClient> list = companyWxClientService.selectCompanyWxClientList(companyWxClient);
+        ExcelUtil<CompanyWxClient> util = new ExcelUtil<CompanyWxClient>(CompanyWxClient.class);
+        return util.exportExcel(list, "companyClient");
+    }
+
+    /**
+     * 获取添加个微信账号详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('company:companyClient:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(companyWxClientService.selectCompanyWxClientById(id));
+    }
+
+    /**
+     * 新增添加个微信账号
+     */
+    @PreAuthorize("@ss.hasPermi('company:companyClient:add')")
+    @Log(title = "添加个微信账号", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CompanyWxClient companyWxClient)
+    {
+        return toAjax(companyWxClientService.insertCompanyWxClient(companyWxClient));
+    }
+
+    /**
+     * 修改添加个微信账号
+     */
+    @PreAuthorize("@ss.hasPermi('company:companyClient:edit')")
+    @Log(title = "添加个微信账号", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CompanyWxClient companyWxClient)
+    {
+        return toAjax(companyWxClientService.updateCompanyWxClient(companyWxClient));
+    }
+
+    /**
+     * 删除添加个微信账号
+     */
+    @PreAuthorize("@ss.hasPermi('company:companyClient:remove')")
+    @Log(title = "添加个微信账号", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids){
+        return toAjax(companyWxClientService.deleteCompanyWxClientByIds(ids));
+    }
+
+
+    @PostMapping("/addWxClient")
+    @Transactional
+    public R addWxClient(@RequestBody AddWxClientVo vo){
+        companyVoiceRoboticService.addCompany(vo);
+        return R.ok();
+    }
+    @GetMapping("/addWxStatistics")
+    @Transactional
+    public R addWxStatistics(CompanyWxClient companyWxClient){
+        List<CompanyWxClient> clients = companyWxClientService.selectCompanyWxClientList(companyWxClient);
+        LocalDate now = LocalDate.now();
+        return R.ok()
+                .put("totalNum", clients.size())
+                .put("toDayAddNum", clients.stream().filter(e -> e.getIsAdd() == 1 && e.getAddTime() != null && e.getAddTime().toLocalDate().equals(now)).count());
+    }
+
+    @GetMapping("/toDayAddWxAccountList")
+    @Transactional
+    public R toDayAddWxAccountList(Long companyId, Long accountId){
+        return R.ok().put("data", companyWxClientService.toDayAddWxAccountList(companyId, accountId, 0));
+    }
+}

+ 104 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanyWxDialogController.java

@@ -0,0 +1,104 @@
+package com.fs.company.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.domain.CompanyWxDialog;
+import com.fs.company.service.ICompanyWxDialogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 添加微信话术Controller
+ * 
+ * @author fs
+ * @date 2024-12-06
+ */
+@RestController
+@RequestMapping("/company/wxDialog")
+public class CompanyWxDialogController extends BaseController
+{
+    @Autowired
+    private ICompanyWxDialogService companyWxDialogService;
+
+    /**
+     * 查询添加微信话术列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxDialog:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CompanyWxDialog companyWxDialog)
+    {
+        startPage();
+        List<CompanyWxDialog> list = companyWxDialogService.selectCompanyWxDialogList(companyWxDialog);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('company:wxDialog:list')")
+    @GetMapping("/listAll")
+    public R listAll(CompanyWxDialog companyWxDialog){
+        return R.ok().put("data", companyWxDialogService.selectCompanyWxDialogList(companyWxDialog));
+    }
+
+    /**
+     * 导出添加微信话术列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxDialog:export')")
+    @Log(title = "添加微信话术", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(CompanyWxDialog companyWxDialog)
+    {
+        List<CompanyWxDialog> list = companyWxDialogService.selectCompanyWxDialogList(companyWxDialog);
+        ExcelUtil<CompanyWxDialog> util = new ExcelUtil<CompanyWxDialog>(CompanyWxDialog.class);
+        return util.exportExcel(list, "wxDialog");
+    }
+
+    /**
+     * 获取添加微信话术详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxDialog:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(companyWxDialogService.selectCompanyWxDialogById(id));
+    }
+
+    /**
+     * 新增添加微信话术
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxDialog:add')")
+    @Log(title = "添加微信话术", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CompanyWxDialog companyWxDialog)
+    {
+        return toAjax(companyWxDialogService.insertCompanyWxDialog(companyWxDialog));
+    }
+
+    /**
+     * 修改添加微信话术
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxDialog:edit')")
+    @Log(title = "添加微信话术", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CompanyWxDialog companyWxDialog)
+    {
+        return toAjax(companyWxDialogService.updateCompanyWxDialog(companyWxDialog));
+    }
+
+    /**
+     * 删除添加微信话术
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxDialog:remove')")
+    @Log(title = "添加微信话术", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(companyWxDialogService.deleteCompanyWxDialogByIds(ids));
+    }
+}

+ 143 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanyWxUserController.java

@@ -0,0 +1,143 @@
+package com.fs.company.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.qw.param.CompanyWxUserAddGroupParam;
+import com.fs.wxUser.domain.CompanyWxUser;
+import com.fs.wxUser.param.CompanyWxUserBindFsUserParam;
+import com.fs.wxUser.param.CompanyWxUserParam;
+import com.fs.wxUser.service.ICompanyWxUserService;
+import com.fs.wxUser.vo.CompanyWxUserVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 个微用户Controller
+ * 
+ * @author fs
+ * @date 2024-10-22
+ */
+@RestController
+@RequestMapping("/company/wxUser")
+public class CompanyWxUserController extends BaseController
+{
+    @Autowired
+    private ICompanyWxUserService companyWxUserService;
+
+    /**
+     * 查询个微用户列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxUser:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CompanyWxUserParam param)
+    {
+        startPage();
+        List<CompanyWxUserVO> list = companyWxUserService.selectCompanyWxUserListVO(param);
+        return getDataTable(list);
+    }
+    @PreAuthorize("@ss.hasPermi('company:wxUser:list')")
+    @GetMapping("/listAll")
+    public R listAll(CompanyWxUserParam param)
+    {
+        return R.ok().put("data", companyWxUserService.selectCompanyWxUserListVO(param));
+    }
+
+    /**
+     * 导出个微用户列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxUser:export')")
+    @Log(title = "个微用户", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(CompanyWxUserParam param)
+    {
+        List<CompanyWxUserVO> list = companyWxUserService.selectCompanyWxUserListVO(param);
+        ExcelUtil<CompanyWxUserVO> util = new ExcelUtil<CompanyWxUserVO>(CompanyWxUserVO.class);
+        return util.exportExcel(list, "个微用户数据");
+    }
+
+    /**
+     * 获取个微用户详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxUser:query')")
+    @GetMapping(value = "/{userId}")
+    public AjaxResult getInfo(@PathVariable("userId") Long userId)
+    {
+        return AjaxResult.success(companyWxUserService.selectCompanyWxUserByUserId(userId));
+    }
+
+    /**
+     * 新增个微用户
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxUser:add')")
+    @Log(title = "个微用户", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CompanyWxUser companyWxUser)
+    {
+        return toAjax(companyWxUserService.insertCompanyWxUser(companyWxUser));
+    }
+
+    /**
+     * 修改个微用户
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxUser:edit')")
+    @Log(title = "个微用户", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CompanyWxUser companyWxUser)
+    {
+        return toAjax(companyWxUserService.updateCompanyWxUser(companyWxUser));
+    }
+
+    /**
+     * 删除个微用户
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxUser:remove')")
+    @Log(title = "个微用户", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{userIds}")
+    public AjaxResult remove(@PathVariable Long[] userIds)
+    {
+        return toAjax(companyWxUserService.deleteCompanyWxUserByUserIds(userIds));
+    }
+
+    /**
+    *  绑定小程序id
+    */
+    @PutMapping("/bindMiniUserId")
+    public R bindUserId(@RequestBody CompanyWxUserBindFsUserParam param)
+    {
+        return companyWxUserService.updateCompanyWxUserBindFsUser(param);
+    }
+
+    /**
+    * 批量添加分组
+    */
+
+    @PreAuthorize("@ss.hasPermi('company:wxUser:addGroup')")
+    @Log(title = "批量添加分组", businessType = BusinessType.INSERT)
+    @PostMapping("/addGroup")
+    public R addGroup(@RequestBody CompanyWxUserAddGroupParam param)
+    {
+
+        return companyWxUserService.addGroup(param);
+    }
+
+    /**
+    * 批量移除分组
+    */
+    @PreAuthorize("@ss.hasPermi('company:wxUser:delGroup')")
+    @Log(title = "批量移除分组", businessType = BusinessType.INSERT)
+    @PostMapping("/delGroup")
+    public R delGroup(@RequestBody CompanyWxUserAddGroupParam param)
+    {
+
+        return companyWxUserService.delGroup(param);
+    }
+
+}

+ 107 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanyWxUserGroupController.java

@@ -0,0 +1,107 @@
+package com.fs.company.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.wxUser.domain.CompanyWxUserGroup;
+import com.fs.wxUser.service.ICompanyWxUserGroupService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 个微 分组Controller
+ *
+ * @author fs
+ * @date 2024-10-25
+ */
+@RestController
+@RequestMapping("/company/wxUserGroup")
+public class CompanyWxUserGroupController extends BaseController
+{
+    @Autowired
+    private ICompanyWxUserGroupService companyWxUserGroupService;
+    /**
+     * 查询个微 分组列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxUserGroup:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CompanyWxUserGroup companyWxUserGroup)
+    {
+        startPage();
+        List<CompanyWxUserGroup> list = companyWxUserGroupService.selectCompanyWxUserGroupList(companyWxUserGroup);
+        return getDataTable(list);
+    }
+
+    //查询个微分组-添加sop任务-个微-选择的分组(不要权限版)
+    @GetMapping("/sopList")
+    public TableDataInfo sopList(CompanyWxUserGroup companyWxUserGroup)
+    {
+        startPage();
+        List<CompanyWxUserGroup> list = companyWxUserGroupService.selectCompanyWxUserGroupList(companyWxUserGroup);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出个微 分组列表
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxUserGroup:export')")
+    @Log(title = "个微 分组", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(CompanyWxUserGroup companyWxUserGroup)
+    {
+        List<CompanyWxUserGroup> list = companyWxUserGroupService.selectCompanyWxUserGroupList(companyWxUserGroup);
+        ExcelUtil<CompanyWxUserGroup> util = new ExcelUtil<CompanyWxUserGroup>(CompanyWxUserGroup.class);
+        return util.exportExcel(list, "个微 分组数据");
+    }
+
+    /**
+     * 获取个微 分组详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxUserGroup:query')")
+    @GetMapping(value = "/{groupId}")
+    public AjaxResult getInfo(@PathVariable("groupId") Long groupId)
+    {
+        return AjaxResult.success(companyWxUserGroupService.selectCompanyWxUserGroupByGroupId(groupId));
+    }
+
+    /**
+     * 新增个微 分组
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxUserGroup:add')")
+    @Log(title = "个微 分组", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CompanyWxUserGroup companyWxUserGroup)
+    {
+        return toAjax(companyWxUserGroupService.insertCompanyWxUserGroup(companyWxUserGroup));
+    }
+
+    /**
+     * 修改个微 分组
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxUserGroup:edit')")
+    @Log(title = "个微 分组", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CompanyWxUserGroup companyWxUserGroup)
+    {
+        return toAjax(companyWxUserGroupService.updateCompanyWxUserGroup(companyWxUserGroup));
+    }
+
+    /**
+     * 删除个微 分组
+     */
+    @PreAuthorize("@ss.hasPermi('company:wxUserGroup:remove')")
+    @Log(title = "个微 分组", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{groupIds}")
+    public AjaxResult remove(@PathVariable Long[] groupIds)
+    {
+        return toAjax(companyWxUserGroupService.deleteCompanyWxUserGroupByGroupIds(groupIds));
+    }
+
+
+}

+ 6 - 17
fs-company/src/main/java/com/fs/company/controller/CompanyLoginController.java

@@ -25,12 +25,9 @@ import java.util.Set;
 
 /**
  * 登录验证
- *
-
  */
 @RestController
-public class CompanyLoginController
-{
+public class CompanyLoginController {
     @Autowired
     private CompanyLoginService loginService;
 
@@ -52,8 +49,7 @@ public class CompanyLoginController
      * @return 结果
      */
     @PostMapping("/login")
-    public AjaxResult login(@RequestBody LoginBody loginBody)
-    {
+    public AjaxResult login(@RequestBody LoginBody loginBody) {
         if (!PatternUtils.checkPassword(loginBody.getPassword())) {
             return AjaxResult.error("密码格式不正确,需包含字母、数字和特殊字符,长度为 8-20 位");
         }
@@ -85,8 +81,7 @@ public class CompanyLoginController
      * @return 用户信息
      */
     @GetMapping("getInfo")
-    public AjaxResult getInfo()
-    {
+    public AjaxResult getInfo() {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         CompanyUser user = loginUser.getUser();
         // 角色集合
@@ -108,18 +103,12 @@ public class CompanyLoginController
      * @return 路由信息
      */
     @GetMapping("getRouters")
-    public AjaxResult getRouters()
-    {
+    public AjaxResult getRouters() {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
-        Long companyId =  loginUser.getCompany().getCompanyId();
+        Long companyId = loginUser.getCompany().getCompanyId();
         // 用户信息
         CompanyUser user = loginUser.getUser();
-        List<CompanyMenu> menus = new ArrayList<>();
-        if (companyId.equals(174L)){
-            menus = menuService.selectMenuTreeByCompany(user.getUserId(), loginUser.getUser().isAdmin());
-        }else {
-            menus = menuService.selectMenuTreeByUserId(user.getUserId(), loginUser.getUser().isAdmin());
-        }
+        List<CompanyMenu> menus = menuService.selectMenuTreeByUserId(user.getUserId(), loginUser.getUser().isAdmin());
         return AjaxResult.success(menuService.buildMenus(menus));
     }
 

+ 18 - 49
fs-company/src/main/java/com/fs/company/controller/CompanyMenuController.java

@@ -24,13 +24,10 @@ import java.util.List;
 
 /**
  * 菜单信息
- *
-
  */
 @RestController
 @RequestMapping("/company/menu")
-public class CompanyMenuController extends BaseController
-{
+public class CompanyMenuController extends BaseController {
     @Autowired
     private ICompanyMenuService menuService;
 
@@ -42,17 +39,11 @@ public class CompanyMenuController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('company:menu:list')")
     @GetMapping("/list")
-    public AjaxResult list(CompanyMenu menu)
-    {
+    public AjaxResult list(CompanyMenu menu) {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         Long userId = loginUser.getUser().getUserId();
         Long companyId = loginUser.getCompany().getCompanyId();
-        List<CompanyMenu> menus = new ArrayList<>();
-        if (companyId.equals(174L)){
-            menus = menuService.selectMenuList(menu, userId,loginUser.getUser().getUserType());
-        }else {
-            menus = menuService.selectMenuListByCompany(menu, userId,loginUser.getUser().getUserType());
-        }
+        List<CompanyMenu> menus = menuService.selectMenuList(menu, userId, loginUser.getUser().getUserType());
 
         return AjaxResult.success(menus);
     }
@@ -62,8 +53,7 @@ public class CompanyMenuController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('company:menu:query')")
     @GetMapping(value = "/{menuId}")
-    public AjaxResult getInfo(@PathVariable Long menuId)
-    {
+    public AjaxResult getInfo(@PathVariable Long menuId) {
         return AjaxResult.success(menuService.selectCompanyMenuById(menuId));
     }
 
@@ -71,17 +61,11 @@ public class CompanyMenuController extends BaseController
      * 获取菜单下拉树列表
      */
     @GetMapping("/treeselect")
-    public AjaxResult treeselect(CompanyMenu menu)
-    {
+    public AjaxResult treeselect(CompanyMenu menu) {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         Long userId = loginUser.getUser().getUserId();
         Long companyId = loginUser.getCompany().getCompanyId();
-        List<CompanyMenu> menus = new ArrayList<>();
-        if (companyId.equals(174L)){
-            menus = menuService.selectMenuList(menu, userId,loginUser.getUser().getUserType());
-        }else {
-            menus = menuService.selectMenuListByCompany(menu, userId,loginUser.getUser().getUserType());
-        }
+        List<CompanyMenu> menus = menuService.selectMenuList(menu, userId, loginUser.getUser().getUserType());
         return AjaxResult.success(menuService.buildMenuTreeSelect(menus));
     }
 
@@ -89,18 +73,12 @@ public class CompanyMenuController extends BaseController
      * 加载对应角色菜单列表树
      */
     @GetMapping(value = "/roleMenuTreeselect/{roleId}")
-    public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)
-    {
+    public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId) {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         CompanyMenu menu = new CompanyMenu();
         Long companyId = loginUser.getCompany().getCompanyId();
         Long userId = loginUser.getUser().getUserId();
-        List<CompanyMenu> menus = new ArrayList<>();
-        if (companyId.equals(174L)){
-            menus = menuService.selectMenuList(menu, userId,loginUser.getUser().getUserType());
-        }else {
-            menus = menuService.selectMenuListByCompany(menu, userId,loginUser.getUser().getUserType());
-        }
+        List<CompanyMenu> menus = menuService.selectMenuList(menu, userId, loginUser.getUser().getUserType());
         AjaxResult ajax = AjaxResult.success();
         ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId));
         ajax.put("menus", menuService.buildMenuTreeSelect(menus));
@@ -113,11 +91,9 @@ public class CompanyMenuController extends BaseController
     @PreAuthorize("@ss.hasPermi('company:menu:add')")
     @Log(title = "菜单管理", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@Validated @RequestBody CompanyMenu menu)
-    {
-       if (UserConstants.YES_FRAME.equals(menu.getIsFrame())
-                && !StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS))
-        {
+    public AjaxResult add(@Validated @RequestBody CompanyMenu menu) {
+        if (UserConstants.YES_FRAME.equals(menu.getIsFrame())
+                && !StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS)) {
             return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
         }
         menu.setCreateBy(SecurityUtils.getUsername());
@@ -130,15 +106,11 @@ public class CompanyMenuController extends BaseController
     @PreAuthorize("@ss.hasPermi('company:menu:edit')")
     @Log(title = "菜单管理", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@Validated @RequestBody CompanyMenu menu)
-    {
-         if (UserConstants.YES_FRAME.equals(menu.getIsFrame())
-                && !StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS))
-        {
+    public AjaxResult edit(@Validated @RequestBody CompanyMenu menu) {
+        if (UserConstants.YES_FRAME.equals(menu.getIsFrame())
+                && !StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS)) {
             return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
-        }
-        else if (menu.getMenuId().equals(menu.getParentId()))
-        {
+        } else if (menu.getMenuId().equals(menu.getParentId())) {
             return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");
         }
         menu.setUpdateBy(SecurityUtils.getUsername());
@@ -151,14 +123,11 @@ public class CompanyMenuController extends BaseController
     @PreAuthorize("@ss.hasPermi('company:menu:remove')")
     @Log(title = "菜单管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{menuId}")
-    public AjaxResult remove(@PathVariable("menuId") Long menuId)
-    {
-        if (menuService.hasChildByMenuId(menuId))
-        {
+    public AjaxResult remove(@PathVariable("menuId") Long menuId) {
+        if (menuService.hasChildByMenuId(menuId)) {
             return AjaxResult.error("存在子菜单,不允许删除");
         }
-        if (menuService.checkMenuExistRole(menuId))
-        {
+        if (menuService.checkMenuExistRole(menuId)) {
             return AjaxResult.error("菜单已分配,不允许删除");
         }
         return toAjax(menuService.deleteCompanyMenuById(menuId));

+ 20 - 4
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java

@@ -30,10 +30,7 @@ import com.fs.qw.service.IQwExternalContactService;
 import com.fs.qw.service.IQwGroupChatService;
 import com.fs.qw.service.IQwGroupChatUserService;
 import com.fs.qw.service.impl.QwExternalContactServiceImpl;
-import com.fs.qw.vo.QwSopChatTempSetting;
-import com.fs.qw.vo.QwSopCourseFinishTempSetting;
-import com.fs.qw.vo.QwSopRuleTimeVO;
-import com.fs.qw.vo.QwSopTempSetting;
+import com.fs.qw.vo.*;
 import com.fs.sop.domain.*;
 import com.fs.sop.dto.QwCreateLinkByAppDTO;
 import com.fs.sop.mapper.*;
@@ -283,6 +280,14 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         if (array.length > 0) {
             List<QwGroupChat> qwGroupChatList = qwGroupChatService.selectQwGroupChatByChatIds(array);
             List<QwGroupChatUser> qwGroupChatUserList = qwGroupChatUserService.selectQwGroupChatUserByChatIds(array);
+            List<String> groupChatUserIds = PubFun.listToNewList(qwGroupChatUserList, QwGroupChatUser::getUserId);
+            if(!groupChatUserIds.isEmpty()){
+                List<GroupUserExternalVo> userList = qwExternalContactMapper.selectByGroupUser(groupChatUserIds);
+                Map<String, List<GroupUserExternalVo>> userMap = PubFun.listToMapByGroupList(userList, GroupUserExternalVo::getExternalUserId);
+                qwGroupChatUserList.forEach(e -> {
+                    e.setUserList(userMap.getOrDefault(e.getUserId(), Collections.emptyList()));
+                });
+            }
             Map<String, List<QwGroupChatUser>> chatUserMap = PubFun.listToMapByGroupList(qwGroupChatUserList, QwGroupChatUser::getChatId);
             qwGroupChatList.stream().filter(e -> chatUserMap.containsKey(e.getChatId())).forEach(e -> e.setChatUserList(chatUserMap.get(e.getChatId())));
             groupChatMap = PubFun.listToMapByGroupObject(qwGroupChatList, QwGroupChat::getChatId);
@@ -640,6 +645,17 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
             ruleTimeVO.setType(2);
             if (content.getIndex() == 0) {
                 QwSopLogs sopLogs = createBaseLog(formattedSendTime, logVo, ruleTimeVO, groupChat.getChatId(), groupChat.getName(), null);
+                try {
+                    groupChat.getChatUserList().stream().filter(e -> e.getUserList() != null && !e.getUserList().isEmpty()).forEach(e -> {
+                        Map<String, GroupUserExternalVo> userMap = PubFun.listToMapByGroupObject(e.getUserList(), GroupUserExternalVo::getUserId);
+                        GroupUserExternalVo vo = userMap.get(groupChat.getOwner());
+                        if(vo != null && vo.getId() != null){
+                            addWatchLogIfNeeded(sopLogs, videoId, courseId, sendTime, qwUserId, companyUserId, companyId, vo.getId().toString(), logVo);
+                        }
+                    });
+                }catch (Exception e){
+                    log.error("群聊创建看课记录失败!", e);
+                }
                 handleLogBasedOnType(sopLogs, content, logVo, sendTime, courseId, videoId,
                         type, qwUserId, companyUserId, companyId, groupChat.getChatId(), welcomeText, qwUserName, null, true);
             } else {

+ 2 - 0
fs-service-system/src/main/java/com/fs/ad/domain/AdSite.java

@@ -54,5 +54,7 @@ public class AdSite extends BaseEntityTow {
     private String domain;
     @TableField(exist = false)
     private String workUrl;
+    @TableField(exist = false)
+    private String linkName;
 
 }

+ 22 - 0
fs-service-system/src/main/java/com/fs/ad/domain/AdUploadLog.java

@@ -1,12 +1,19 @@
 package com.fs.ad.domain;
 
+import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
 import lombok.Data;
 import com.fs.common.core.domain.BaseEntity;
 import lombok.EqualsAndHashCode;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Date;
+
 /**
  * 百度回传日志对象 ad_upload_log
  *
@@ -52,5 +59,20 @@ public class AdUploadLog{
     @Excel(name = "广告唯一ID")
     private String vid;
 
+    /** 创建时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @TableField(exist = false)
+    private String siteName;
+    @TableField(exist = false)
+    private String siteUrl;
+    @TableField(exist = false)
+    private String accountName;
+    @TableField(exist = false)
+    private LocalDate startDate;
+    @TableField(exist = false)
+    private LocalDate endDate;
+
 
 }

+ 7 - 3
fs-service-system/src/main/java/com/fs/ad/service/impl/AdHtmlClickLogServiceImpl.java

@@ -156,6 +156,12 @@ public class AdHtmlClickLogServiceImpl extends ServiceImpl<AdHtmlClickLogMapper,
                 }
             }
             if(one != null){
+                String uploadType = clickType.name();
+                Integer i = adUploadLogMapper.selectCount(new QueryWrapper<AdUploadLog>().eq("vid", one.getVid()).like("upload_type", uploadType));
+                if(i > 0){
+                    log.info("vid:{}, {}已经上传次数{}", one.getVid(), uploadType, i);
+                    return;
+                }
                 switch (type){
                     case 0: // 百度
                         uploadBaiDu(one, clickType);
@@ -164,9 +170,7 @@ public class AdHtmlClickLogServiceImpl extends ServiceImpl<AdHtmlClickLogMapper,
                     case 2:// 爱奇艺
                         uploadIqiyi(one, clickType);
                 }
-                String uploadType = clickType.name();
-                String s = (StringUtils.isEmpty(one.getUploadType()) ? "" : one.getUploadType()) + "," + uploadType;
-                one.setUploadType(Arrays.stream(s.split(",")).map(String::trim).filter(StringUtils::isNotEmpty).distinct().collect(Collectors.joining(",")));
+                one.setUploadType(uploadType);
                 saveLog(key, one, type);
 
                 AdUploadLog adUploadLog = new AdUploadLog();

+ 1 - 2
fs-service-system/src/main/java/com/fs/ad/service/impl/AdUploadLogServiceImpl.java

@@ -38,8 +38,7 @@ public class AdUploadLogServiceImpl extends ServiceImpl<AdUploadLogMapper, AdUpl
      * @return 百度回传日志
      */
     @Override
-    public List<AdUploadLog> selectAdUploadLogList(AdUploadLog adUploadLog)
-    {
+    public List<AdUploadLog> selectAdUploadLogList(AdUploadLog adUploadLog){
         return baseMapper.selectAdUploadLogList(adUploadLog);
     }
 

+ 11 - 0
fs-service-system/src/main/java/com/fs/aicall/AiCallController.java

@@ -0,0 +1,11 @@
+package com.fs.aicall;
+
+
+import com.fs.aicall.domain.apiresult.PushIIntentionResult;
+
+public class AiCallController {
+
+    public void callNotify(PushIIntentionResult result){
+
+    }
+}

+ 11 - 0
fs-service-system/src/main/java/com/fs/aicall/config/AiCallConfig.java

@@ -0,0 +1,11 @@
+package com.fs.aicall.config;
+
+import lombok.Data;
+
+@Data
+public class AiCallConfig {
+    private String customer;
+    private String password;
+    private String url;
+    private String dialogUrl;
+}

+ 25 - 0
fs-service-system/src/main/java/com/fs/aicall/config/bean/AiCallBeanServiceConfig.java

@@ -0,0 +1,25 @@
+package com.fs.aicall.config.bean;
+
+import com.fs.aicall.service.AiCallService;
+import com.fs.company.domain.CompanyVoiceApi;
+import com.fs.company.service.ICompanyVoiceApiService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.List;
+
+@Configuration
+public class AiCallBeanServiceConfig {
+    @Autowired
+    private ICompanyVoiceApiService companyVoiceApiService;
+
+    @Bean
+    public AiCallService aiCallService() {
+        CompanyVoiceApi param = new CompanyVoiceApi();
+        param.setApiType("2");
+        List<CompanyVoiceApi> list = companyVoiceApiService.selectCompanyVoiceApiList(param);
+        if(list.isEmpty()) return null;
+        return AiCallService.builder().config(list.get(0)).build();
+    }
+}

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

@@ -0,0 +1,10 @@
+package com.fs.aicall.domain;
+
+import lombok.Data;
+
+@Data
+public class BaseDomain {
+    private String seq;
+    private String userData;
+
+}

+ 15 - 0
fs-service-system/src/main/java/com/fs/aicall/domain/TaskInfo.java

@@ -0,0 +1,15 @@
+package com.fs.aicall.domain;
+
+import lombok.*;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class TaskInfo extends BaseDomain {
+
+    private String taskID;
+    private String taskName;
+
+}

+ 11 - 0
fs-service-system/src/main/java/com/fs/aicall/domain/apiresult/Authentication.java

@@ -0,0 +1,11 @@
+package com.fs.aicall.domain.apiresult;
+
+import lombok.Data;
+
+@Data
+public class Authentication {
+    private String customer;
+    private String timestamp;
+    private String seq;
+    private String digest;
+}

+ 37 - 0
fs-service-system/src/main/java/com/fs/aicall/domain/apiresult/Content.java

@@ -0,0 +1,37 @@
+package com.fs.aicall.domain.apiresult;
+
+import lombok.Data;
+
+@Data
+public class Content {
+
+    //	对话对象	Int	0-机器人 1-被叫客户
+    private Integer side;
+    //	录音地址	String	-
+    private String recordURL;
+    //	匹配回答	String	-
+    private String matched_answer;
+    //	话术子场景ID	Int	-
+    private Integer scenceID;
+    //	创建时间	String	微秒级时间戳
+    private String createTime;
+    //	匹配场景关键词	String	-
+    private String matched_word;
+    //	话术子场景唯一标识ID	String	-
+    private String action_id;
+    //	回答内容2	String	-
+    private String content2;
+    //	回答内容1	String	-
+    private String content1;
+    //	话术ID	Int	-
+    private Integer dialog_id;
+    //	ID	Int	-
+    private Integer id;
+    //	回答内容	String	-
+    private String text;
+    //	错误状态	String	-
+    private String error_status;
+    //	状态	String	-
+    private String status;
+
+}

+ 34 - 0
fs-service-system/src/main/java/com/fs/aicall/domain/apiresult/Notify.java

@@ -0,0 +1,34 @@
+package com.fs.aicall.domain.apiresult;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Notify {
+    // 标识
+    private String type;
+    //主叫号码
+    private String callerNum;
+    //被叫号码
+    private String calleeNum;
+    //创建时间
+    private String createTime;
+    //呼叫接通时间
+    private String answerTime;
+    //对话图uuid
+    private String uuid;
+    //对画图详情
+//    private String contentList;
+    private List<Content> contentList;
+    //客户分类
+    private String intention;
+    //任务ID
+    private String taskID;
+    //录音地址
+    private String recordFile;
+    //客户资料自定义字段(可选参数)
+//    private Map<String, Object> field;
+    //用户数据
+    private String userData;
+}

+ 11 - 0
fs-service-system/src/main/java/com/fs/aicall/domain/apiresult/PushIIntentionResult.java

@@ -0,0 +1,11 @@
+package com.fs.aicall.domain.apiresult;
+
+import lombok.Data;
+
+@Data
+public class PushIIntentionResult {
+
+    private Authentication authentication;
+    private Notify notify;
+
+}

+ 17 - 0
fs-service-system/src/main/java/com/fs/aicall/domain/param/CalleeDomain.java

@@ -0,0 +1,17 @@
+package com.fs.aicall.domain.param;
+
+import com.fs.aicall.domain.BaseDomain;
+import lombok.*;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class CalleeDomain extends BaseDomain {
+
+    private String number;
+    private String userData;
+    private String param;
+
+}

+ 118 - 0
fs-service-system/src/main/java/com/fs/aicall/domain/param/CalltaskcreateaiCustomizeDomain.java

@@ -0,0 +1,118 @@
+package com.fs.aicall.domain.param;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fs.aicall.domain.BaseDomain;
+import lombok.*;
+
+import java.util.List;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class CalltaskcreateaiCustomizeDomain extends BaseDomain {
+    /*
+    机器人组ID	Int	Y	-	-
+     */
+    private Long robot;
+    /*
+    话术ID	Int	Y	-	-
+     */
+    private Long dialogID;
+    /*
+    模式	Int	Y	-	只有 7 ,8
+     */
+    private Long mode;
+    /*
+    短信模板名称	String	N	-	通过【querySmsTemplates=查询短信模板信息】接口可获得
+     */
+    private String templateID;
+    /*
+    班组ID	Int	N	-	只有mode 为8 的情况下,必填
+     */
+    private String agentGroup;
+    /*
+    被叫号码	Array	Y	1-1000	Array 数组
+     */
+    private List<CalleeDomain> callees;
+    /*
+    主叫号码	Array	N	1-1000	主叫号码 和 主叫分组ID 必传其中一个,都传情况下,以 主叫分组ID为主
+     */
+    private List<CalleeDomain> callers;
+    /*
+    主叫分组ID	Int	N	-	主叫号码 和 主叫分组ID 必传其中一个,都传情况下,以 主叫分组ID为主
+     */
+    @JsonProperty("CIDGroupID")
+    private String CIDGroupID = "3";
+    /*
+    任务名称	String	N	-	-
+     */
+    private String taskName = "测试任务1";
+    /*
+    呼叫倍率	String	N	-	1-5
+     */
+    private Long multiplier;
+    /*
+    呼叫基准模式	String	N	-	0 机器人 1 班组
+     */
+    private String robot_concurrence_mode;
+    /*
+    是否开启自动重呼	Int	N	-	0否 1是
+     */
+    private Long autoRecall;
+    /*
+    是否使用TTS将变量转换为语音	Int	N	-	0否 1是,不传默认为1
+     */
+    private String ttsTransfer;
+    /*
+    重呼次数	Int	N	-	最大5 0表示不自动重呼
+     */
+    private Long recallTimes;
+    /*
+    自动启动	Int	N	-	0否 1是 只在被叫名单列表中有TTS变量的情况下生效
+     */
+    private String autoStart;
+    /*
+    时间段1	Array	N	0,1,2,3,4,5,6	0表示周天 1-6表示周一到周六
+     */
+    private List<String> weekday1;
+    /*
+    时间段1的开始时间	String	N	08:00	如果传入weekday1后,必填 格式为HH:ii
+     */
+    private String startTime1;
+    /*
+    时间段1的结束时间	String	N	18:00	如果传入weekday1后,必填 格式为HH:ii
+     */
+    private String endTime1;
+    /*
+    时间段2	Array	N	0,1,2,3,4,5,6	0表示周天 1-6表示周一到周六
+     */
+    private String weekday2;
+    /*
+    时间段2的开始时间	String	N	08:00	如果传入weekday2后,必填 格式为HH:ii
+     */
+    private String startTime2;
+    /*
+    时间段2的结束时间	String	N	18:00	如果传入weekday2后,必填 格式为HH:ii
+     */
+    private String endTime2;
+    /*
+    时间段3	Array	N	0,1,2,3,4,5,6	0表示周天 1-6表示周一到周六
+     */
+    private String weekday3;
+    /*
+    时间段2的开始时间	String	N	08:00	如果传入weekday3后,必填 格式为HH:ii
+     */
+    private String startTime3;
+    /*
+    时间段2的结束时间	String	N	18:00	如果传入weekday3后,必填 格式为HH:ii
+     */
+    private String endTime3;
+    /*
+    是否为多个联系人名单任务,主要用于重呼时检查数据	Int	N	-	0否 1是,不传默认为0
+     */
+    private String multipleContacts;
+
+
+}

+ 17 - 0
fs-service-system/src/main/java/com/fs/aicall/domain/param/EditDialogDomain.java

@@ -0,0 +1,17 @@
+package com.fs.aicall.domain.param;
+
+import com.fs.aicall.domain.BaseDomain;
+import lombok.*;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class EditDialogDomain extends BaseDomain {
+
+    private Long id;
+    private String name;
+    private String remark;
+
+}

+ 13 - 0
fs-service-system/src/main/java/com/fs/aicall/domain/param/getDialogMapDomain.java

@@ -0,0 +1,13 @@
+package com.fs.aicall.domain.param;
+
+import com.fs.aicall.domain.BaseDomain;
+import lombok.*;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class getDialogMapDomain extends BaseDomain {
+    private String uuid;
+}

+ 17 - 0
fs-service-system/src/main/java/com/fs/aicall/domain/result/CalltaskcreateaiCustomizeResult.java

@@ -0,0 +1,17 @@
+package com.fs.aicall.domain.result;
+
+import com.fs.aicall.domain.BaseDomain;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CalltaskcreateaiCustomizeResult extends BaseDomain {
+    /** 创建ai外呼任务呼叫名单 */
+    private String report;
+    /** 外呼任务名称 */
+    private String taskName;
+    /** 外呼任务ID */
+    private Long taskID;
+
+}

+ 16 - 0
fs-service-system/src/main/java/com/fs/aicall/domain/result/EditDialogResult.java

@@ -0,0 +1,16 @@
+package com.fs.aicall.domain.result;
+
+import com.fs.aicall.domain.BaseDomain;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class EditDialogResult extends BaseDomain {
+
+    private Long id;
+    private String name;
+    private String remark;
+    private String callNum;
+
+}

+ 17 - 0
fs-service-system/src/main/java/com/fs/aicall/domain/result/GetairobotResult.java

@@ -0,0 +1,17 @@
+package com.fs.aicall.domain.result;
+
+import com.fs.aicall.domain.BaseDomain;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class GetairobotResult extends BaseDomain {
+    /** 机器人ID */
+    private String id;
+    /** 数量 */
+    private Integer num;
+    /** 鸣潮 */
+    private String name;
+
+}

+ 28 - 0
fs-service-system/src/main/java/com/fs/aicall/domain/result/QueryCallTaskInfoResult.java

@@ -0,0 +1,28 @@
+package com.fs.aicall.domain.result;
+
+import com.fs.aicall.domain.BaseDomain;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class QueryCallTaskInfoResult extends BaseDomain {
+
+    private String taskID;
+    private String taskName;
+    /** 呼叫任务预计呼叫总数 */
+    private String calleeAmount;
+    /** 呼叫任务已呼叫数 */
+    private String calledAmount;
+    /** 呼叫任务剩余呼叫数 */
+    private String calleeResidue;
+    /**
+     * 呼叫任务状态
+     * 0-未启动
+     * 1-运行中
+     * 2-已暂停
+     * 3-已停止
+    */
+    private String runningStatus;
+
+}

+ 31 - 0
fs-service-system/src/main/java/com/fs/aicall/domain/result/getDialogMapResult.java

@@ -0,0 +1,31 @@
+package com.fs.aicall.domain.result;
+
+import com.fs.aicall.domain.BaseDomain;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class getDialogMapResult extends BaseDomain {
+
+    private String intention;
+    private String createTime;
+    private String answerTime;
+    private String uuid;
+    private String callerNum;
+    private String calleeNum;
+    private List<ContentList> contentList;
+    private String recordPath;
+
+
+    @Data
+    static class ContentList{
+        private String side;
+        private String id;
+        private String recordURL;
+        private String createTime;
+        private String text;
+    }
+}

+ 13 - 0
fs-service-system/src/main/java/com/fs/aicall/params/AiobChangeTashStatusParam.java

@@ -0,0 +1,13 @@
+package com.fs.aicall.params;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class AiobChangeTashStatusParam {
+
+    private String taskId;
+    private Integer taskStatus;
+
+}

+ 24 - 0
fs-service-system/src/main/java/com/fs/aicall/params/AiobImportPhoneParam.java

@@ -0,0 +1,24 @@
+package com.fs.aicall.params;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class AiobImportPhoneParam {
+
+    private String taskId;
+    private Integer secretType = 1;
+    private String secretId;
+    private List<CustomerInfoList> customerInfoList;
+
+    @Data
+    public static class CustomerInfoList{
+        private String extJson;
+        private String mobile;
+        private String address;
+        private Map<String, String> var;
+    }
+
+}

+ 13 - 0
fs-service-system/src/main/java/com/fs/aicall/params/RobotParams.java

@@ -0,0 +1,13 @@
+package com.fs.aicall.params;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class RobotParams {
+    private String robotName;
+    private Integer pn;
+    private Integer ps;
+
+}

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

@@ -0,0 +1,155 @@
+package com.fs.aicall.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fs.aicall.config.AiCallConfig;
+import com.fs.aicall.domain.BaseDomain;
+import com.fs.aicall.domain.TaskInfo;
+import com.fs.aicall.domain.param.CalltaskcreateaiCustomizeDomain;
+import com.fs.aicall.domain.param.EditDialogDomain;
+import com.fs.aicall.domain.param.getDialogMapDomain;
+import com.fs.aicall.domain.result.CalltaskcreateaiCustomizeResult;
+import com.fs.aicall.domain.result.EditDialogResult;
+import com.fs.aicall.domain.result.GetairobotResult;
+import com.fs.aicall.domain.result.QueryCallTaskInfoResult;
+import com.fs.aicall.utils.AiCallUtils;
+import com.fs.company.domain.CompanyVoiceApi;
+
+import java.util.List;
+import java.util.function.Function;
+
+public class AiCallService {
+
+
+    private final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+    private final AiCallUtils utils;
+    public AiCallService(AiCallUtils utils) {
+        this.utils = utils;
+    }
+    public static Builder builder(){
+        return new Builder();
+    }
+    public static class Builder {
+
+        private  AiCallUtils utils;
+
+        public Builder config(CompanyVoiceApi api) {
+            JSONObject jsonObject = JSONObject.parseObject(api.getApiJson());
+            AiCallConfig config = new AiCallConfig();
+            config.setCustomer(jsonObject.getString("account"));
+            config.setPassword(jsonObject.getString("password"));
+            config.setUrl(jsonObject.getString("url"));
+            config.setDialogUrl(jsonObject.getString("dialogUrl"));
+            this.utils = new AiCallUtils(config);
+            return this;
+        }
+
+        public AiCallService build() {
+            return new AiCallService(this.utils);
+        }
+    }
+
+    public String getDialogUrl(){
+        return utils.getDialogUrl();
+    }
+
+
+    private <T extends BaseDomain> Function<JSONObject, T> getObj(Class<T> clazz){
+        return getObj("data", clazz);
+    }
+    private <T extends BaseDomain> Function<JSONObject, List<T>> getList(Class<T> clazz){
+        return getList("list", clazz);
+    }
+    private <T extends BaseDomain> Function<JSONObject, T> getObj(String attr, Class<T> clazz){
+        return e -> {
+            T t = e.getJSONObject(attr).toJavaObject(clazz);
+            t.setUserData(e.getString("userData"));
+            t.setSeq(e.getString("seq"));
+            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);
+            String userData = e.getString("userData");
+            String seq = e.getString("seq");
+            list.forEach(t -> {
+                t.setUserData(userData);
+                t.setSeq(seq);
+            });
+            return list;
+        };
+    }
+
+    /**
+     * 登录
+     */
+    public String getToken(){
+        return utils.send("login", e -> e.getString("token"));
+    }
+
+    /**
+     * 获取机器人列表
+     */
+    public List<GetairobotResult> getairobotlist(){
+        return utils.send("getairobotlist", getList(GetairobotResult.class));
+    }
+
+    /**
+     * 获取话术列表
+     */
+    public List<EditDialogResult> queryDialog(){
+        return utils.send("queryDialog", getList("data", EditDialogResult.class));
+    }
+    /**
+     * 获取话术详情
+     */
+    public EditDialogResult getDialog(){
+        return utils.send("getDialog", getObj(EditDialogResult.class));
+    }
+
+    /**
+     * 修改/添加话术
+     * @param param 话术参数
+     */
+    public EditDialogResult editDialog(EditDialogDomain param){
+        return utils.send("editDialog", OBJECT_MAPPER.valueToTree(param), getObj(EditDialogResult.class));
+    }
+
+    /**
+     * 创建机器人外呼任务
+     * @param param 参数
+     */
+    public CalltaskcreateaiCustomizeResult calltaskcreateaiCustomize(CalltaskcreateaiCustomizeDomain param){
+        return utils.send("calltaskcreateaiCustomize", OBJECT_MAPPER.valueToTree(param), getObj(CalltaskcreateaiCustomizeResult.class));
+    }
+    /**
+     * 查询外呼任务状态信息
+     * @param param 参数
+     */
+    public QueryCallTaskInfoResult queryCallTaskInfo(TaskInfo param){
+        return utils.send("queryCallTaskInfo", OBJECT_MAPPER.valueToTree(param), getObj(QueryCallTaskInfoResult.class));
+    }
+    /**
+     * 启动外呼任务
+     * @param param 参数
+     */
+    public TaskInfo startCallTask(TaskInfo param){
+        return utils.send("startCallTask", OBJECT_MAPPER.valueToTree(param), getObj(TaskInfo.class));
+    }
+    /**
+     * 停止外呼任务
+     * @param param 参数
+     */
+    public TaskInfo stopCallTask(TaskInfo param){
+        return utils.send("stopCallTask", OBJECT_MAPPER.valueToTree(param), getObj(TaskInfo.class));
+    }
+    /**
+     * 对话图查询(uuid)
+     * @param param 参数
+     */
+    public TaskInfo getDialogMap(getDialogMapDomain param){
+        return utils.send("getDialogMap", OBJECT_MAPPER.valueToTree(param), getObj("telData", TaskInfo.class));
+    }
+
+}

+ 93 - 0
fs-service-system/src/main/java/com/fs/aicall/utils/AiCallUtils.java

@@ -0,0 +1,93 @@
+package com.fs.aicall.utils;
+
+
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.fs.aicall.config.AiCallConfig;
+import lombok.extern.slf4j.Slf4j;
+
+import java.time.Instant;
+import java.util.function.Function;
+
+@Slf4j
+public class AiCallUtils {
+
+    private final AiCallConfig config;
+    private final static ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+    public AiCallUtils(AiCallConfig config) {
+        this.config = config;
+    }
+
+    public String getDialogUrl(){
+        return config.getDialogUrl();
+    }
+
+    public String encrypt(String customer, long timestamp, int seq, String password) {
+
+        // 获取输入字符串的字节数组
+        byte[] messageDigest = Md5Utils.md5(customer + "@" + timestamp + "@" + seq + "@" + password);
+        // 将字节数组转为十六进制字符串
+        StringBuilder hexString = new StringBuilder();
+        for (byte b : messageDigest) {
+            // 将每个字节转换为两位的十六进制表示
+            String hex = Integer.toHexString(0xFF & b);
+            if (hex.length() == 1) {
+                hexString.append("0");
+            }
+            hexString.append(hex);
+        }
+        // 返回 MD5 加密后的字符串
+        return hexString.toString();
+    }
+
+    public String getParams(ObjectNode params){
+        try {
+            long timestamp = Instant.now().getEpochSecond();
+            int seq = RandomUtil.randomInt(1000, 1000000);
+            ObjectNode rootNode = OBJECT_MAPPER.createObjectNode();
+            rootNode.putObject("authentication")
+                    .put("customer", config.getCustomer())
+                    .put("timestamp", timestamp)
+                    .put("seq", seq)
+                    .put("digest", encrypt(config.getCustomer(), timestamp, seq, config.getPassword()));
+            if(params == null){
+                rootNode.putObject("request").put("seq", seq);
+            }else{
+                rootNode.set("request", params);
+            }
+            return OBJECT_MAPPER.writeValueAsString(rootNode);
+        }catch (Exception e){
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+    public <T> T send(String addr, Function<JSONObject, T> dataFun){
+        return send(addr, null, dataFun);
+    }
+    public <T> T send(String addr, ObjectNode params, Function<JSONObject, T> dataFun){
+        String url = config.getUrl() + addr;
+        String body = getParams(params);
+        HttpRequest request = HttpUtil.createPost(url).body(body);
+        request.header("Accept", "application/json");
+        request.header("Content-Type", "application/json");
+        HttpResponse execute = request.execute();
+        JSONObject json = JSON.parseObject(execute.body());
+        JSONObject result = json.getJSONObject("result");
+        if(!"0".equals(result.getString("error"))){
+            log.error("AI外呼接口异常数据:{}", json);
+            throw new RuntimeException(result.getString("msg"));
+        }
+        return dataFun.apply(json.getJSONObject("data").getJSONObject("response"));
+    }
+
+
+
+
+}

+ 104 - 0
fs-service-system/src/main/java/com/fs/aicall/utils/AiobApiUtils.java

@@ -0,0 +1,104 @@
+package com.fs.aicall.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fs.aicall.params.AiobChangeTashStatusParam;
+import com.fs.aicall.params.AiobImportPhoneParam;
+import com.fs.aicall.params.RobotParams;
+import com.fs.aicall.vo.AiobBaiduTaskVo;
+import com.fs.aicall.vo.AiobImportPhoneVo;
+import com.fs.aicall.vo.RobotVo;
+import com.fs.aiob.domain.AiobBaiduTask;
+import com.fs.common.exception.base.BaseException;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Component
+@AllArgsConstructor
+public class AiobApiUtils {
+    private static String ACCESS_KEY = "c91145dd1b474ea58d34cdd1d6065b30";
+    private static String SECRET_KEY = "3f417df5795b4bb09c21a47c688d0c7f";
+
+    private static final RestTemplate restTemplate = new RestTemplate();
+    private final AiobTokenUtils aiobTokenUtils;
+
+    public void createTask(AiobBaiduTask task) {
+        String url = "https://aiob-open.baidu.com/api/v3/console/apitask/create";
+        AiobBaiduTaskVo aiobBaiduTaskVo = new AiobBaiduTaskVo();
+        BeanUtils.copyProperties(task, aiobBaiduTaskVo);
+        if(task.getForbidDialDate() != null && !task.getForbidDialDate().isEmpty()){
+            aiobBaiduTaskVo.setForbidDialDate(Arrays.stream(task.getForbidDialDate().split(",")).map(Integer::parseInt).collect(Collectors.toList()));
+        }
+        JSONObject send = send(HttpMethod.POST, ACCESS_KEY, SECRET_KEY, url, aiobBaiduTaskVo);
+        task.setTaskId(send.getString("taskId"));
+    }
+    public List<AiobImportPhoneVo> importPhone(AiobImportPhoneParam vo) {
+        String url = "https://aiob-open.baidu.com/api/v3/console/apitask/import";
+        JSONObject send = send(HttpMethod.POST, ACCESS_KEY, SECRET_KEY, url, vo);
+        return send.getJSONArray("resList").toJavaList(AiobImportPhoneVo.class);
+    }
+    public List<RobotVo> getRobotList() {
+        String url = "https://aiob-open.baidu.com/api/v1/robot/list";
+        JSONObject result = send(HttpMethod.GET, ACCESS_KEY, SECRET_KEY, url, RobotParams.builder().pn(1).ps(100).build());
+        return result.getJSONArray("list").toJavaList(RobotVo.class);
+    }
+    public void changeStatus(String taskId, Integer status) {
+        String url = "https://aiob-open.baidu.com/api/v3/console/apitask/task/status/update";
+        send(HttpMethod.POST, ACCESS_KEY, SECRET_KEY, url, AiobChangeTashStatusParam.builder().taskId(taskId).taskStatus(status).build());
+    }
+
+    public void deleteTask(List<String> taskIds) {
+        taskIds.forEach(this::deleteTask);
+    }
+    public void deleteTask(String taskId) {
+        String url = "https://aiob-open.baidu.com/api/v3/console/apitask/delete";
+        Map<String, String> param = new HashMap<>();
+        param.put("taskId", taskId);
+        send(HttpMethod.POST, ACCESS_KEY, SECRET_KEY, url, param);
+    }
+
+
+    public  <T> JSONObject send(HttpMethod type, String accessKey, String secretKey, String url, T t) {
+        String token = aiobTokenUtils.getToken(accessKey, secretKey);
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Content-Type", "application/json;charset:utf-8;");  // 添加认证头
+        headers.add("Authorization", token);
+        // 2. 创建 HttpEntity 对象,将请求头放入其中
+        HttpEntity<String> entity = new HttpEntity<>(JSONObject.toJSONString(t), headers);
+        // 3. 使用 RestTemplate 发送请求
+        ResponseEntity<String> response = restTemplate.exchange(url, type, entity, String.class);
+        JSONObject jsonObject = JSON.parseObject(response.getBody());
+        if(jsonObject.getInteger("code") != 200){
+            throw new BaseException(jsonObject.getString("msg"));
+        }
+        return jsonObject.getJSONObject("data");
+    }
+
+
+//    public static void main(String[] args) {
+////        System.out.println(getRobotList());
+//        AiobBaiduTask task = new AiobBaiduTask();
+//        task.setTaskName("测试接口创建");
+//        task.setRobotId("5114c2c9-70f9-45e5-b637-15eb31b10c8d");
+//        task.setDialStartDate(LocalDate.now());
+//        task.setDialStartTime(LocalTime.of(9, 0));
+//        task.setDialEndTime(LocalTime.of(20, 0));
+//        task.setIsOpenEmptyNum(false);
+//        task.setIsOpenPhoneDown(false);
+//        task.setIsOpenRepeatFilter(true);
+//        createTask(task);
+//        System.out.println(task);
+//    }
+}

+ 74 - 0
fs-service-system/src/main/java/com/fs/aicall/utils/AiobPhoneEncryption.java

@@ -0,0 +1,74 @@
+package com.fs.aicall.utils;
+
+import com.fs.common.exception.base.BaseException;
+import com.fs.common.utils.StringUtils;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+
+public class AiobPhoneEncryption {
+
+    public static final String CHARSET = "utf-8";
+    private static final String AES = "AES";
+    private static final String ALGORITHM = "AES/ECB/PKCS5Padding";
+
+    public static void main(String[] args) throws IOException {
+        // 电话 密钥
+//        System.out.println(encryptAES("15532271587", "426k201008394512"));
+    }
+
+    /**
+     * 加密
+     * plainText 电话号码
+     * password 密钥
+     */
+    public static String encryptAES(String plainText, String password) {
+        String cipherText = plainText;
+        if (StringUtils.isNotBlank(plainText) && StringUtils.isNotBlank(password)) {
+            byte[] cipherBytes = null;
+            try {
+                cipherBytes = encryptAES(plainText.getBytes(CHARSET), password.getBytes(CHARSET));
+            } catch (UnsupportedEncodingException e) {
+                throw new BaseException("加密错误");
+            }
+            cipherText = byte2HexText(cipherBytes);
+        }
+
+        return cipherText;
+    }
+
+    private static byte[] encryptAES(byte[] plainBytes, byte[] password) {
+        byte[] cipherBytes = null;
+        try {
+            if (plainBytes != null && password != null) {
+                SecretKeySpec skeySpec = new SecretKeySpec(password, AES);
+                Cipher cipher = Cipher.getInstance(ALGORITHM);
+                cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
+                cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
+
+                cipherBytes = cipher.doFinal(plainBytes);
+            }
+        } catch (Exception e) {
+            throw new BaseException("加密错误");
+        }
+
+        return cipherBytes;
+    }
+
+    private static String byte2HexText(byte[] bytes) {
+        StringBuilder hexText = new StringBuilder();
+        String strTmp;
+        for (byte aByte : bytes) {
+            strTmp = (Integer.toHexString(aByte & 0XFF));
+            if (strTmp.length() == 1) {
+                hexText.append("0").append(strTmp);
+            } else {
+                hexText.append(strTmp);
+            }
+        }
+        return hexText.toString().toUpperCase();
+    }
+
+}

+ 41 - 0
fs-service-system/src/main/java/com/fs/aicall/utils/AiobTokenUtils.java

@@ -0,0 +1,41 @@
+package com.fs.aicall.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fs.baidu.utils.HttpUtils;
+import com.fs.common.core.redis.RedisCacheT;
+import com.fs.common.exception.base.BaseException;
+import com.fs.common.utils.StringUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Component
+@AllArgsConstructor
+public class AiobTokenUtils {
+
+    private static final String ACC_TOKEN_KEY = "aiob:baidu:token:";
+    private final RedisCacheT<String> redisCache;
+
+    public String getToken(String accessKey, String secretKey) {
+        String key = ACC_TOKEN_KEY + accessKey;
+        String token = redisCache.getCacheObject(key);
+        if(StringUtils.isNotEmpty(token)){
+            return token;
+        }
+        Map<String, Object> request = new HashMap<>();
+        request.put("accessKey", accessKey);
+        request.put("secretKey", secretKey);
+        JSONObject jsonObject = HttpUtils.sendPost("https://aiob-open.baidu.com/api/v2/getToken", request);
+        if(jsonObject.getInteger("code") != 200){
+            throw new BaseException(jsonObject.getString("msg"));
+        }
+        JSONObject data = jsonObject.getJSONObject("data");
+        token = data.getString("accessToken");
+        redisCache.setCacheObject(key, token, data.getLongValue("expiresTime"), TimeUnit.MINUTES);
+        return token;
+    }
+
+}

+ 66 - 0
fs-service-system/src/main/java/com/fs/aicall/utils/Md5Utils.java

@@ -0,0 +1,66 @@
+package com.fs.aicall.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.security.MessageDigest;
+
+/**
+ * Md5加密方法
+ * 
+ 
+ */
+public class Md5Utils
+{
+    private static final Logger log = LoggerFactory.getLogger(Md5Utils.class);
+
+    public static byte[] md5(String s){
+        MessageDigest algorithm;
+        try
+        {
+            algorithm = MessageDigest.getInstance("MD5");
+            algorithm.reset();
+            algorithm.update(s.getBytes("UTF-8"));
+            byte[] messageDigest = algorithm.digest();
+            return messageDigest;
+        }
+        catch (Exception e)
+        {
+            log.error("MD5 Error...", e);
+        }
+        return null;
+    }
+
+    private static final String toHex(byte hash[])
+    {
+        if (hash == null)
+        {
+            return null;
+        }
+        StringBuffer buf = new StringBuffer(hash.length * 2);
+        int i;
+
+        for (i = 0; i < hash.length; i++)
+        {
+            if ((hash[i] & 0xff) < 0x10)
+            {
+                buf.append("0");
+            }
+            buf.append(Long.toString(hash[i] & 0xff, 16));
+        }
+        return buf.toString();
+    }
+
+    public static String hash(String s)
+    {
+        try
+        {
+            return new String(toHex(md5(s)).getBytes("UTF-8"), "UTF-8");
+        }
+        catch (Exception e)
+        {
+            log.error("not supported charset...{}", e);
+            return s;
+        }
+    }
+}

+ 13 - 0
fs-service-system/src/main/java/com/fs/aicall/vo/AiobBackVo.java

@@ -0,0 +1,13 @@
+package com.fs.aicall.vo;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import lombok.Data;
+
+@Data
+public class AiobBackVo {
+    //回调数据类型, 0-任务呼叫单通电话回调 1-号码组终态回调 2-任务状态变更回调 3-实时呼叫单通电话回调
+    private Integer callbackType;
+    @JsonDeserialize(using = RawJsonDeserializer.class)
+    private String data; // 使用 JsonNode 接收原始数据
+
+}

+ 129 - 0
fs-service-system/src/main/java/com/fs/aicall/vo/AiobBaiduTaskVo.java

@@ -0,0 +1,129 @@
+package com.fs.aicall.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.List;
+
+/**
+ * 百度AI外呼任务对象 aiob_baidu_task
+ *
+ * @author fs
+ * @date 2025-03-20
+ */
+@Data
+public class AiobBaiduTaskVo{
+
+
+    /** 任务ID */
+    @Excel(name = "任务ID")
+    private String taskId;
+
+    /** 任务名称 */
+    @Excel(name = "任务名称")
+    private String taskName;
+
+    /** 外呼机器人唯一标识 */
+    @Excel(name = "外呼机器人唯一标识")
+    private String robotId;
+
+    /** 任务呼叫开始日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "任务呼叫开始日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private LocalDate dialStartDate;
+
+    /** 任务呼叫结束日期,如:XXXXX,默认为空,表示不限制终止时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "任务呼叫结束日期,如:XXXXX,默认为空,表示不限制终止时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private LocalDate dialEndDate;
+
+    /** 呼叫开始时间,时间范围为【09:00,20:00】 */
+    @JsonFormat(pattern = "HH:mm")
+    @Excel(name = "呼叫开始时间,时间范围为【09:00,20:00】", width = 30, dateFormat = "yyyy-MM-dd")
+    private LocalTime dialStartTime;
+
+    /** 呼叫结束时间,时间范围为【09:00,20:00】 */
+    @JsonFormat(pattern = "HH:mm")
+    @Excel(name = "呼叫结束时间,时间范围为【09:00,20:00】", width = 30, dateFormat = "yyyy-MM-dd")
+    private LocalTime dialEndTime;
+
+    /** 禁呼日期, 99-节假日;1-周一;2-周二;3-周三;4-周四;5-周五;6-周六;0-周日,默认为空,表示不限制禁呼日期 */
+    @Excel(name = "禁呼日期, 99-节假日;1-周一;2-周二;3-周三;4-周四;5-周五;6-周六;0-周日,默认为空,表示不限制禁呼日期")
+    private List<Integer> forbidDialDate;
+
+    /** 禁呼时间,默认为空,表示不限制禁呼时间 */
+    @Excel(name = "禁呼时间,默认为空,表示不限制禁呼时间")
+    private String forbidDialTime;
+
+    /** 主叫号码,默认为空,表示将随机获取可用号码进行外呼 */
+    @Excel(name = "主叫号码,默认为空,表示将随机获取可用号码进行外呼")
+    private String callerNums;
+
+    /** 保底主叫号码,默认为空,非空则开启了归属地匹配且在指定主叫中没找到匹配号码则默认用此外呼 */
+    @Excel(name = "保底主叫号码,默认为空,非空则开启了归属地匹配且在指定主叫中没找到匹配号码则默认用此外呼")
+    private String lastCallerNums;
+
+    /** 1-触发黑名单后该号码组不再拨打;2-触发黑名单后该号码不再拨打;默认为空,即不过滤黑名单 */
+    @Excel(name = "1-触发黑名单后该号码组不再拨打;2-触发黑名单后该号码不再拨打;默认为空,即不过滤黑名单")
+    private Integer blackListStrategy;
+
+    /** 终态策略,0-存在接通 1-全部接通 2-存在完成 3-全部完成,默认为0,即存在接通 */
+    @Excel(name = "终态策略,0-存在接通 1-全部接通 2-存在完成 3-全部完成,默认为0,即存在接通")
+    private Integer finalStrategy;
+
+    /** 拨打策略:0-批量 1-逐个/轮流 2-逐个/顺序,默认为0,即批量 */
+    @Excel(name = "拨打策略:0-批量 1-逐个/轮流 2-逐个/顺序,默认为0,即批量")
+    private Integer callStrategy;
+
+    /** 重试次数,整数,且 N ≤ 3,默认为空,表示不重试 */
+    @Excel(name = "重试次数,整数,且 N ≤ 3,默认为空,表示不重试")
+    private Integer retryTimes;
+
+    /** 重试间隔时间,单位min,0≤ N ≤720 */
+    @Excel(name = "重试间隔时间,单位min,0≤ N ≤720")
+    private Integer retryInterval;
+
+    /** 0:空闲通路弹性调节;1:最低保障通路数;2:固定通路数,默认为0 */
+    @Excel(name = "0:空闲通路弹性调节;1:最低保障通路数;2:固定通路数,默认为0")
+    private Integer isSetCapacity;
+
+    /** 设置通路数大小,N为 整数,且 N ≤ 任务可用通路数和,默认为0,即空闲通路弹性调节 */
+    @Excel(name = "设置通路数大小,N为 整数,且 N ≤ 任务可用通路数和,默认为0,即空闲通路弹性调节")
+    private Integer taskCapacity;
+
+    /** 是否开启24小时空号检测 */
+    @Excel(name = "是否开启24小时空号检测")
+    private Boolean isOpenEmptyNum = false;
+
+    /** 是否开启12小时内停机检测 */
+    @Excel(name = "是否开启12小时内停机检测")
+    private Boolean isOpenPhoneDown = false;
+
+    /** 是否开启重复号码过滤,true为开启,false为关闭 */
+    @Excel(name = "是否开启重复号码过滤,true为开启,false为关闭")
+    private Boolean isOpenRepeatFilter = true;
+
+    /** 号码类型过滤 1-400号码;2-800号码;3-手机号码;4-固话;5-95号码;6-96号码;7-其他 */
+    @Excel(name = "号码类型过滤 1-400号码;2-800号码;3-手机号码;4-固话;5-95号码;6-96号码;7-其他")
+    private String numTypeFilterList;
+
+    /** 发送短信策略集合,smsAutographId为短信签名ID,smsTemplateId为短信模板ID,smsStrategy为短信触发策略,1-接通后挂机触发;2-未接通后挂机触发 */
+    @Excel(name = "发送短信策略集合,smsAutographId为短信签名ID,smsTemplateId为短信模板ID,smsStrategy为短信触发策略,1-接通后挂机触发;2-未接通后挂机触发")
+    private String smsStrategyV1;
+
+    /** 默认false 是否开启任务回调 */
+    @Excel(name = "默认false 是否开启任务回调")
+    private Boolean taskDataCallback;
+
+    /** 任务级回调地址设置 */
+    @Excel(name = "任务级回调地址设置")
+    private String callBackUrl;
+
+    /** 任务拨号完成后是否进入完成状态 */
+    @Excel(name = "任务拨号完成后是否进入完成状态")
+    private Integer callFinishTaskEnd;
+
+}

+ 64 - 0
fs-service-system/src/main/java/com/fs/aicall/vo/AiobCalleData.java

@@ -0,0 +1,64 @@
+package com.fs.aicall.vo;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class AiobCalleData {
+    private String sessionId;
+    private Long tenantId;
+    private String taskId;
+    private String taskName;
+    private String robotId;
+    private String robotName;
+    private Long memberId;
+    private String mobile;
+    private Integer callTimes;
+    private String callerNum;
+    private Integer endType;
+    private Integer callType;
+    private String endTypeReason;
+    private String contactUUID;
+    private Long fileId;
+    private CollectInfo collectInfo;
+    private List<Record> record;
+    private Integer durationTimeLen;
+    private Integer ringingTimeLen;
+    private Integer talkingTimeLen;
+    private Long startTime;
+    private Long ringStartTime;
+    private Long talkingStartTime;
+    private Long endTime;
+    private String intent;
+    private List<String> action;
+    private Boolean isRobotHangup;
+    private Map<String, Object> dialogVar;
+    private Map<String, Object> smsVar;
+    private String extJson;
+    private Integer transResult;
+    private String sipCode;
+    private String sipInfo;
+    private Map<String, Object> tagExtractInfo;
+
+    @Data
+    public static class CollectInfo {
+        private String hungupnode;
+        // 根据实际信息收集内容扩展字段
+    }
+
+    @Data
+    public static class Record {
+        private String role;
+        private Long timestamp;
+        private String contextText;
+        private String intent;
+        private String start;
+        private String stop;
+        private Long timeLen;
+        private Boolean interrupted;
+        private String interruptedTime;
+        private Boolean silent;
+    }
+}

+ 13 - 0
fs-service-system/src/main/java/com/fs/aicall/vo/AiobImportPhoneVo.java

@@ -0,0 +1,13 @@
+package com.fs.aicall.vo;
+
+import lombok.Data;
+
+@Data
+public class AiobImportPhoneVo {
+
+     private Boolean status;
+     private String extJson;
+     private String reason;
+     private Long taskMemberId;
+
+}

+ 15 - 0
fs-service-system/src/main/java/com/fs/aicall/vo/AiobTaskData.java

@@ -0,0 +1,15 @@
+package com.fs.aicall.vo;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class AiobTaskData {
+
+    private Long tenantId;
+    private Long taskId;
+    private Integer taskStatus;
+    private LocalDateTime updateTime;
+    private String reason;
+}

+ 18 - 0
fs-service-system/src/main/java/com/fs/aicall/vo/RawJsonDeserializer.java

@@ -0,0 +1,18 @@
+package com.fs.aicall.vo;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+
+import java.io.IOException;
+
+public class RawJsonDeserializer extends JsonDeserializer<String> {
+    @Override
+    public String deserialize(JsonParser jp, DeserializationContext ctxt)
+            throws IOException, JsonProcessingException {
+        JsonNode node = jp.getCodec().readTree(jp);
+        return node.toString(); // 将 JSON 对象转换为字符串
+    }
+}

+ 70 - 0
fs-service-system/src/main/java/com/fs/aicall/vo/RobotVo.java

@@ -0,0 +1,70 @@
+package com.fs.aicall.vo;
+
+import lombok.Data;
+
+@Data
+public class RobotVo {
+    // 机器人ID
+    private String robotId;
+    // 机器人名称
+    private String robotName;
+    // 机器人呼叫类型,1-呼入,3-呼出
+    private Integer callType;
+    // 机器人行业id ,如下所示
+    /*
+        通用:4f7aaba5-8e39-498a-8d50-3d996c4ab0e2
+        银行:ed0165dc-d0eb-46d4-adf7-4c26b05db167
+        保险:2e3c886e-3dc7-4b10-b3f7-62746a017995
+        电信运营商:b68abfa2-c674-4988-8bc5-5b52615be374
+        能源:4709e482-dda6-4011-8329-d875e6edd902
+        教育:70457676-d79a-4b02-b744-7e2485356fc5
+        通信:0b0b7dc4-7cfc-4d9e-8c4a-aba2482ca14d
+        电商:4cf99f6d-f33b-4f99-930c-a894e7d81d9a
+        消费金融:fae57be2-6d80-4cf9-b69e-825a9507ab29
+        航空:05dc9f87-5e4d-408b-a75d-2894eac69f14
+     */
+    private String industryId;
+    private String industryName;
+    // 	创建人id
+    private Long createUserId;
+    // 发布状态,1-未发布,2-发布中,3-发布成功,4-发布失败
+    private Integer publishState;
+    // 发布人id
+    private Long publishUserId;
+
+    public void setIndustryId(String industryId) {
+        this.industryId = industryId;
+        switch (industryId){
+            case "4f7aaba5-8e39-498a-8d50-3d996c4ab0e2":
+                this.industryName = "通用";
+                break;
+            case "ed0165dc-d0eb-46d4-adf7-4c26b05db167":
+                this.industryName = "银行";
+                break;
+            case "2e3c886e-3dc7-4b10-b3f7-62746a017995":
+                this.industryName = "保险";
+                break;
+            case "b68abfa2-c674-4988-8bc5-5b52615be374":
+                this.industryName = "电信运营商";
+                break;
+            case "4709e482-dda6-4011-8329-d875e6edd902":
+                this.industryName = "能源";
+                break;
+            case "70457676-d79a-4b02-b744-7e2485356fc5":
+                this.industryName = "教育";
+                break;
+            case "0b0b7dc4-7cfc-4d9e-8c4a-aba2482ca14d":
+                this.industryName = "通信";
+                break;
+            case "4cf99f6d-f33b-4f99-930c-a894e7d81d9a":
+                this.industryName = "电商";
+                break;
+            case "fae57be2-6d80-4cf9-b69e-825a9507ab29":
+                this.industryName = "消费金融";
+                break;
+            case "05dc9f87-5e4d-408b-a75d-2894eac69f14":
+                this.industryName = "航空";
+                break;
+        }
+    }
+}

+ 34 - 0
fs-service-system/src/main/java/com/fs/aiob/domain/AiobBaiduCallApi.java

@@ -0,0 +1,34 @@
+package com.fs.aiob.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 百度外呼接口配置对象 aiob_baidu_call_api
+ *
+ * @author fs
+ * @date 2025-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AiobBaiduCallApi extends BaseEntity{
+
+    /** id */
+    private Long id;
+
+    /** 名称 */
+    @Excel(name = "名称")
+    private String name;
+
+    /** $column.columnComment */
+    @Excel(name = "名称")
+    private String accessKey;
+
+    /** $column.columnComment */
+    @Excel(name = "名称")
+    private String secretKey;
+
+
+}

+ 30 - 0
fs-service-system/src/main/java/com/fs/aiob/domain/AiobBaiduEncryption.java

@@ -0,0 +1,30 @@
+package com.fs.aiob.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 百度AI外呼加密对象 aiob_baidu_encryption
+ *
+ * @author fs
+ * @date 2025-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AiobBaiduEncryption extends BaseEntity{
+
+    /** id */
+    private Long id;
+
+    /** 秘钥ID */
+    @Excel(name = "秘钥ID")
+    private String secretId;
+
+    /** 秘钥 */
+    @Excel(name = "秘钥")
+    private String secretKey;
+
+
+}

+ 160 - 0
fs-service-system/src/main/java/com/fs/aiob/domain/AiobBaiduTask.java

@@ -0,0 +1,160 @@
+package com.fs.aiob.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import com.fs.company.vo.RoboticWxVo;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.List;
+
+/**
+ * 百度AI外呼任务对象 aiob_baidu_task
+ *
+ * @author fs
+ * @date 2025-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AiobBaiduTask extends BaseEntity{
+
+    /** id */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /** 任务ID */
+    @Excel(name = "1个微2企微")
+    private Integer type;
+
+    /** 任务ID */
+    @Excel(name = "任务ID")
+    private String taskId;
+
+    /** 任务名称 */
+    @Excel(name = "任务名称")
+    private String taskName;
+
+    /** 外呼机器人唯一标识 */
+    @Excel(name = "外呼机器人唯一标识")
+    private String robotId;
+
+    /** 任务呼叫开始日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "任务呼叫开始日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private LocalDate dialStartDate;
+
+    /** 任务呼叫结束日期,如:XXXXX,默认为空,表示不限制终止时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "任务呼叫结束日期,如:XXXXX,默认为空,表示不限制终止时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private LocalDate dialEndDate;
+
+    /** 呼叫开始时间,时间范围为【09:00,20:00】 */
+    @JsonFormat(pattern = "HH:mm")
+    @Excel(name = "呼叫开始时间,时间范围为【09:00,20:00】", width = 30, dateFormat = "yyyy-MM-dd")
+    private LocalTime dialStartTime;
+
+    /** 呼叫结束时间,时间范围为【09:00,20:00】 */
+    @JsonFormat(pattern = "HH:mm")
+    @Excel(name = "呼叫结束时间,时间范围为【09:00,20:00】", width = 30, dateFormat = "yyyy-MM-dd")
+    private LocalTime dialEndTime;
+
+    /** 禁呼日期, 99-节假日;1-周一;2-周二;3-周三;4-周四;5-周五;6-周六;0-周日,默认为空,表示不限制禁呼日期 */
+    @Excel(name = "禁呼日期, 99-节假日;1-周一;2-周二;3-周三;4-周四;5-周五;6-周六;0-周日,默认为空,表示不限制禁呼日期")
+    private String forbidDialDate;
+
+    /** 禁呼时间,默认为空,表示不限制禁呼时间 */
+    @Excel(name = "禁呼时间,默认为空,表示不限制禁呼时间")
+    private String forbidDialTime;
+
+    /** 主叫号码,默认为空,表示将随机获取可用号码进行外呼 */
+    @Excel(name = "主叫号码,默认为空,表示将随机获取可用号码进行外呼")
+    private String callerNums;
+
+    /** 保底主叫号码,默认为空,非空则开启了归属地匹配且在指定主叫中没找到匹配号码则默认用此外呼 */
+    @Excel(name = "保底主叫号码,默认为空,非空则开启了归属地匹配且在指定主叫中没找到匹配号码则默认用此外呼")
+    private String lastCallerNums;
+
+    /** 1-触发黑名单后该号码组不再拨打;2-触发黑名单后该号码不再拨打;默认为空,即不过滤黑名单 */
+    @Excel(name = "1-触发黑名单后该号码组不再拨打;2-触发黑名单后该号码不再拨打;默认为空,即不过滤黑名单")
+    private Integer blackListStrategy;
+
+    /** 终态策略,0-存在接通 1-全部接通 2-存在完成 3-全部完成,默认为0,即存在接通 */
+    @Excel(name = "终态策略,0-存在接通 1-全部接通 2-存在完成 3-全部完成,默认为0,即存在接通")
+    private Integer finalStrategy;
+
+    /** 拨打策略:0-批量 1-逐个/轮流 2-逐个/顺序,默认为0,即批量 */
+    @Excel(name = "拨打策略:0-批量 1-逐个/轮流 2-逐个/顺序,默认为0,即批量")
+    private Integer callStrategy;
+
+    /** 重试次数,整数,且 N ≤ 3,默认为空,表示不重试 */
+    @Excel(name = "重试次数,整数,且 N ≤ 3,默认为空,表示不重试")
+    private Integer retryTimes;
+
+    /** 重试间隔时间,单位min,0≤ N ≤720 */
+    @Excel(name = "重试间隔时间,单位min,0≤ N ≤720")
+    private Integer retryInterval;
+
+    /** 0:空闲通路弹性调节;1:最低保障通路数;2:固定通路数,默认为0 */
+    @Excel(name = "0:空闲通路弹性调节;1:最低保障通路数;2:固定通路数,默认为0")
+    private Integer isSetCapacity;
+
+    /** 设置通路数大小,N为 整数,且 N ≤ 任务可用通路数和,默认为0,即空闲通路弹性调节 */
+    @Excel(name = "设置通路数大小,N为 整数,且 N ≤ 任务可用通路数和,默认为0,即空闲通路弹性调节")
+    private Integer taskCapacity;
+
+    /** 是否开启24小时空号检测 */
+    @Excel(name = "是否开启24小时空号检测")
+    private Boolean isOpenEmptyNum = false;
+
+    /** 是否开启12小时内停机检测 */
+    @Excel(name = "是否开启12小时内停机检测")
+    private Boolean isOpenPhoneDown = false;
+
+    /** 是否开启重复号码过滤,true为开启,false为关闭 */
+    @Excel(name = "是否开启重复号码过滤,true为开启,false为关闭")
+    private Boolean isOpenRepeatFilter = true;
+
+    /** 号码类型过滤 1-400号码;2-800号码;3-手机号码;4-固话;5-95号码;6-96号码;7-其他 */
+    @Excel(name = "号码类型过滤 1-400号码;2-800号码;3-手机号码;4-固话;5-95号码;6-96号码;7-其他")
+    private String numTypeFilterList;
+
+    /** 发送短信策略集合,smsAutographId为短信签名ID,smsTemplateId为短信模板ID,smsStrategy为短信触发策略,1-接通后挂机触发;2-未接通后挂机触发 */
+    @Excel(name = "发送短信策略集合,smsAutographId为短信签名ID,smsTemplateId为短信模板ID,smsStrategy为短信触发策略,1-接通后挂机触发;2-未接通后挂机触发")
+    private String smsStrategyV1;
+
+    /** 默认false 是否开启任务回调 */
+    @Excel(name = "默认false 是否开启任务回调")
+    private Boolean taskDataCallback;
+
+    /** 任务级回调地址设置 */
+    @Excel(name = "任务级回调地址设置")
+    private String callBackUrl;
+
+    /** 任务拨号完成后是否进入完成状态 */
+    @Excel(name = "任务拨号完成后是否进入完成状态")
+    private Integer callFinishTaskEnd;
+    // 任务状态1-待启动 2-执行中 3-已暂停 4-已完成
+    private Integer taskStatus;
+    // 变更备注
+    private String updateReason;
+    // 变更备注
+    private Integer addType;
+
+    @TableField(exist = false)
+    private List<String> userIds;
+    @TableField(exist = false)
+    private Integer num;
+
+    @TableField(exist = false)
+    private List<RoboticWxVo> qwUserList;
+
+    @TableField(exist = false)
+    private List<String> workUrl;
+
+}

+ 62 - 0
fs-service-system/src/main/java/com/fs/aiob/mapper/AiobBaiduCallApiMapper.java

@@ -0,0 +1,62 @@
+package com.fs.aiob.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.aiob.domain.AiobBaiduCallApi;
+
+import java.util.List;
+
+/**
+ * 百度外呼接口配置Mapper接口
+ * 
+ * @author fs
+ * @date 2025-03-20
+ */
+public interface AiobBaiduCallApiMapper extends BaseMapper<AiobBaiduCallApi>{
+    /**
+     * 查询百度外呼接口配置
+     * 
+     * @param id 百度外呼接口配置主键
+     * @return 百度外呼接口配置
+     */
+    AiobBaiduCallApi selectAiobBaiduCallApiById(Long id);
+
+    /**
+     * 查询百度外呼接口配置列表
+     * 
+     * @param aiobBaiduCallApi 百度外呼接口配置
+     * @return 百度外呼接口配置集合
+     */
+    List<AiobBaiduCallApi> selectAiobBaiduCallApiList(AiobBaiduCallApi aiobBaiduCallApi);
+
+    /**
+     * 新增百度外呼接口配置
+     * 
+     * @param aiobBaiduCallApi 百度外呼接口配置
+     * @return 结果
+     */
+    int insertAiobBaiduCallApi(AiobBaiduCallApi aiobBaiduCallApi);
+
+    /**
+     * 修改百度外呼接口配置
+     * 
+     * @param aiobBaiduCallApi 百度外呼接口配置
+     * @return 结果
+     */
+    int updateAiobBaiduCallApi(AiobBaiduCallApi aiobBaiduCallApi);
+
+    /**
+     * 删除百度外呼接口配置
+     * 
+     * @param id 百度外呼接口配置主键
+     * @return 结果
+     */
+    int deleteAiobBaiduCallApiById(Long id);
+
+    /**
+     * 批量删除百度外呼接口配置
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteAiobBaiduCallApiByIds(Long[] ids);
+}

+ 62 - 0
fs-service-system/src/main/java/com/fs/aiob/mapper/AiobBaiduEncryptionMapper.java

@@ -0,0 +1,62 @@
+package com.fs.aiob.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.aiob.domain.AiobBaiduEncryption;
+
+import java.util.List;
+
+/**
+ * 百度AI外呼加密Mapper接口
+ * 
+ * @author fs
+ * @date 2025-03-20
+ */
+public interface AiobBaiduEncryptionMapper extends BaseMapper<AiobBaiduEncryption>{
+    /**
+     * 查询百度AI外呼加密
+     * 
+     * @param id 百度AI外呼加密主键
+     * @return 百度AI外呼加密
+     */
+    AiobBaiduEncryption selectAiobBaiduEncryptionById(Long id);
+
+    /**
+     * 查询百度AI外呼加密列表
+     * 
+     * @param aiobBaiduEncryption 百度AI外呼加密
+     * @return 百度AI外呼加密集合
+     */
+    List<AiobBaiduEncryption> selectAiobBaiduEncryptionList(AiobBaiduEncryption aiobBaiduEncryption);
+
+    /**
+     * 新增百度AI外呼加密
+     * 
+     * @param aiobBaiduEncryption 百度AI外呼加密
+     * @return 结果
+     */
+    int insertAiobBaiduEncryption(AiobBaiduEncryption aiobBaiduEncryption);
+
+    /**
+     * 修改百度AI外呼加密
+     * 
+     * @param aiobBaiduEncryption 百度AI外呼加密
+     * @return 结果
+     */
+    int updateAiobBaiduEncryption(AiobBaiduEncryption aiobBaiduEncryption);
+
+    /**
+     * 删除百度AI外呼加密
+     * 
+     * @param id 百度AI外呼加密主键
+     * @return 结果
+     */
+    int deleteAiobBaiduEncryptionById(Long id);
+
+    /**
+     * 批量删除百度AI外呼加密
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteAiobBaiduEncryptionByIds(Long[] ids);
+}

+ 62 - 0
fs-service-system/src/main/java/com/fs/aiob/mapper/AiobBaiduTaskMapper.java

@@ -0,0 +1,62 @@
+package com.fs.aiob.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.aiob.domain.AiobBaiduTask;
+
+import java.util.List;
+
+/**
+ * 百度AI外呼任务Mapper接口
+ * 
+ * @author fs
+ * @date 2025-03-20
+ */
+public interface AiobBaiduTaskMapper extends BaseMapper<AiobBaiduTask>{
+    /**
+     * 查询百度AI外呼任务
+     * 
+     * @param id 百度AI外呼任务主键
+     * @return 百度AI外呼任务
+     */
+    AiobBaiduTask selectAiobBaiduTaskById(Long id);
+
+    /**
+     * 查询百度AI外呼任务列表
+     * 
+     * @param aiobBaiduTask 百度AI外呼任务
+     * @return 百度AI外呼任务集合
+     */
+    List<AiobBaiduTask> selectAiobBaiduTaskList(AiobBaiduTask aiobBaiduTask);
+
+    /**
+     * 新增百度AI外呼任务
+     * 
+     * @param aiobBaiduTask 百度AI外呼任务
+     * @return 结果
+     */
+    int insertAiobBaiduTask(AiobBaiduTask aiobBaiduTask);
+
+    /**
+     * 修改百度AI外呼任务
+     * 
+     * @param aiobBaiduTask 百度AI外呼任务
+     * @return 结果
+     */
+    int updateAiobBaiduTask(AiobBaiduTask aiobBaiduTask);
+
+    /**
+     * 删除百度AI外呼任务
+     * 
+     * @param id 百度AI外呼任务主键
+     * @return 结果
+     */
+    int deleteAiobBaiduTaskById(Long id);
+
+    /**
+     * 批量删除百度AI外呼任务
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteAiobBaiduTaskByIds(Long[] ids);
+}

+ 62 - 0
fs-service-system/src/main/java/com/fs/aiob/service/IAiobBaiduCallApiService.java

@@ -0,0 +1,62 @@
+package com.fs.aiob.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.aiob.domain.AiobBaiduCallApi;
+
+import java.util.List;
+
+/**
+ * 百度外呼接口配置Service接口
+ * 
+ * @author fs
+ * @date 2025-03-20
+ */
+public interface IAiobBaiduCallApiService extends IService<AiobBaiduCallApi>{
+    /**
+     * 查询百度外呼接口配置
+     * 
+     * @param id 百度外呼接口配置主键
+     * @return 百度外呼接口配置
+     */
+    AiobBaiduCallApi selectAiobBaiduCallApiById(Long id);
+
+    /**
+     * 查询百度外呼接口配置列表
+     * 
+     * @param aiobBaiduCallApi 百度外呼接口配置
+     * @return 百度外呼接口配置集合
+     */
+    List<AiobBaiduCallApi> selectAiobBaiduCallApiList(AiobBaiduCallApi aiobBaiduCallApi);
+
+    /**
+     * 新增百度外呼接口配置
+     * 
+     * @param aiobBaiduCallApi 百度外呼接口配置
+     * @return 结果
+     */
+    int insertAiobBaiduCallApi(AiobBaiduCallApi aiobBaiduCallApi);
+
+    /**
+     * 修改百度外呼接口配置
+     * 
+     * @param aiobBaiduCallApi 百度外呼接口配置
+     * @return 结果
+     */
+    int updateAiobBaiduCallApi(AiobBaiduCallApi aiobBaiduCallApi);
+
+    /**
+     * 批量删除百度外呼接口配置
+     * 
+     * @param ids 需要删除的百度外呼接口配置主键集合
+     * @return 结果
+     */
+    int deleteAiobBaiduCallApiByIds(Long[] ids);
+
+    /**
+     * 删除百度外呼接口配置信息
+     * 
+     * @param id 百度外呼接口配置主键
+     * @return 结果
+     */
+    int deleteAiobBaiduCallApiById(Long id);
+}

+ 62 - 0
fs-service-system/src/main/java/com/fs/aiob/service/IAiobBaiduEncryptionService.java

@@ -0,0 +1,62 @@
+package com.fs.aiob.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.aiob.domain.AiobBaiduEncryption;
+
+import java.util.List;
+
+/**
+ * 百度AI外呼加密Service接口
+ * 
+ * @author fs
+ * @date 2025-03-20
+ */
+public interface IAiobBaiduEncryptionService extends IService<AiobBaiduEncryption>{
+    /**
+     * 查询百度AI外呼加密
+     * 
+     * @param id 百度AI外呼加密主键
+     * @return 百度AI外呼加密
+     */
+    AiobBaiduEncryption selectAiobBaiduEncryptionById(Long id);
+
+    /**
+     * 查询百度AI外呼加密列表
+     * 
+     * @param aiobBaiduEncryption 百度AI外呼加密
+     * @return 百度AI外呼加密集合
+     */
+    List<AiobBaiduEncryption> selectAiobBaiduEncryptionList(AiobBaiduEncryption aiobBaiduEncryption);
+
+    /**
+     * 新增百度AI外呼加密
+     * 
+     * @param aiobBaiduEncryption 百度AI外呼加密
+     * @return 结果
+     */
+    int insertAiobBaiduEncryption(AiobBaiduEncryption aiobBaiduEncryption);
+
+    /**
+     * 修改百度AI外呼加密
+     * 
+     * @param aiobBaiduEncryption 百度AI外呼加密
+     * @return 结果
+     */
+    int updateAiobBaiduEncryption(AiobBaiduEncryption aiobBaiduEncryption);
+
+    /**
+     * 批量删除百度AI外呼加密
+     * 
+     * @param ids 需要删除的百度AI外呼加密主键集合
+     * @return 结果
+     */
+    int deleteAiobBaiduEncryptionByIds(Long[] ids);
+
+    /**
+     * 删除百度AI外呼加密信息
+     * 
+     * @param id 百度AI外呼加密主键
+     * @return 结果
+     */
+    int deleteAiobBaiduEncryptionById(Long id);
+}

+ 70 - 0
fs-service-system/src/main/java/com/fs/aiob/service/IAiobBaiduTaskService.java

@@ -0,0 +1,70 @@
+package com.fs.aiob.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.aicall.vo.AiobCalleData;
+import com.fs.aicall.vo.AiobTaskData;
+import com.fs.aiob.domain.AiobBaiduTask;
+
+import java.util.List;
+
+/**
+ * 百度AI外呼任务Service接口
+ * 
+ * @author fs
+ * @date 2025-03-20
+ */
+public interface IAiobBaiduTaskService extends IService<AiobBaiduTask>{
+    /**
+     * 查询百度AI外呼任务
+     * 
+     * @param id 百度AI外呼任务主键
+     * @return 百度AI外呼任务
+     */
+    AiobBaiduTask selectAiobBaiduTaskById(Long id);
+
+    /**
+     * 查询百度AI外呼任务列表
+     * 
+     * @param aiobBaiduTask 百度AI外呼任务
+     * @return 百度AI外呼任务集合
+     */
+    List<AiobBaiduTask> selectAiobBaiduTaskList(AiobBaiduTask aiobBaiduTask);
+
+    /**
+     * 新增百度AI外呼任务
+     * 
+     * @param aiobBaiduTask 百度AI外呼任务
+     * @return 结果
+     */
+    int insertAiobBaiduTask(AiobBaiduTask aiobBaiduTask);
+
+    /**
+     * 修改百度AI外呼任务
+     * 
+     * @param aiobBaiduTask 百度AI外呼任务
+     * @return 结果
+     */
+    int updateAiobBaiduTask(AiobBaiduTask aiobBaiduTask);
+
+    /**
+     * 批量删除百度AI外呼任务
+     * 
+     * @param ids 需要删除的百度AI外呼任务主键集合
+     * @return 结果
+     */
+    int deleteAiobBaiduTaskByIds(Long[] ids);
+
+    /**
+     * 删除百度AI外呼任务信息
+     * 
+     * @param id 百度AI外呼任务主键
+     * @return 结果
+     */
+    int deleteAiobBaiduTaskById(Long id);
+
+    void back(AiobCalleData vo);
+
+    void updateStatus(AiobTaskData vo);
+
+    void changeStatus(String taskId, Integer status);
+}

+ 94 - 0
fs-service-system/src/main/java/com/fs/aiob/service/impl/AiobBaiduCallApiServiceImpl.java

@@ -0,0 +1,94 @@
+package com.fs.aiob.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.aiob.domain.AiobBaiduCallApi;
+import com.fs.aiob.mapper.AiobBaiduCallApiMapper;
+import com.fs.aiob.service.IAiobBaiduCallApiService;
+import com.fs.common.utils.DateUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 百度外呼接口配置Service业务层处理
+ * 
+ * @author fs
+ * @date 2025-03-20
+ */
+@Service
+public class AiobBaiduCallApiServiceImpl extends ServiceImpl<AiobBaiduCallApiMapper, AiobBaiduCallApi> implements IAiobBaiduCallApiService {
+
+    /**
+     * 查询百度外呼接口配置
+     * 
+     * @param id 百度外呼接口配置主键
+     * @return 百度外呼接口配置
+     */
+    @Override
+    public AiobBaiduCallApi selectAiobBaiduCallApiById(Long id)
+    {
+        return baseMapper.selectAiobBaiduCallApiById(id);
+    }
+
+    /**
+     * 查询百度外呼接口配置列表
+     * 
+     * @param aiobBaiduCallApi 百度外呼接口配置
+     * @return 百度外呼接口配置
+     */
+    @Override
+    public List<AiobBaiduCallApi> selectAiobBaiduCallApiList(AiobBaiduCallApi aiobBaiduCallApi)
+    {
+        return baseMapper.selectAiobBaiduCallApiList(aiobBaiduCallApi);
+    }
+
+    /**
+     * 新增百度外呼接口配置
+     * 
+     * @param aiobBaiduCallApi 百度外呼接口配置
+     * @return 结果
+     */
+    @Override
+    public int insertAiobBaiduCallApi(AiobBaiduCallApi aiobBaiduCallApi)
+    {
+        aiobBaiduCallApi.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertAiobBaiduCallApi(aiobBaiduCallApi);
+    }
+
+    /**
+     * 修改百度外呼接口配置
+     * 
+     * @param aiobBaiduCallApi 百度外呼接口配置
+     * @return 结果
+     */
+    @Override
+    public int updateAiobBaiduCallApi(AiobBaiduCallApi aiobBaiduCallApi)
+    {
+        aiobBaiduCallApi.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateAiobBaiduCallApi(aiobBaiduCallApi);
+    }
+
+    /**
+     * 批量删除百度外呼接口配置
+     * 
+     * @param ids 需要删除的百度外呼接口配置主键
+     * @return 结果
+     */
+    @Override
+    public int deleteAiobBaiduCallApiByIds(Long[] ids)
+    {
+        return baseMapper.deleteAiobBaiduCallApiByIds(ids);
+    }
+
+    /**
+     * 删除百度外呼接口配置信息
+     * 
+     * @param id 百度外呼接口配置主键
+     * @return 结果
+     */
+    @Override
+    public int deleteAiobBaiduCallApiById(Long id)
+    {
+        return baseMapper.deleteAiobBaiduCallApiById(id);
+    }
+}

+ 94 - 0
fs-service-system/src/main/java/com/fs/aiob/service/impl/AiobBaiduEncryptionServiceImpl.java

@@ -0,0 +1,94 @@
+package com.fs.aiob.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.aiob.domain.AiobBaiduEncryption;
+import com.fs.aiob.mapper.AiobBaiduEncryptionMapper;
+import com.fs.aiob.service.IAiobBaiduEncryptionService;
+import com.fs.common.utils.DateUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 百度AI外呼加密Service业务层处理
+ * 
+ * @author fs
+ * @date 2025-03-20
+ */
+@Service
+public class AiobBaiduEncryptionServiceImpl extends ServiceImpl<AiobBaiduEncryptionMapper, AiobBaiduEncryption> implements IAiobBaiduEncryptionService {
+
+    /**
+     * 查询百度AI外呼加密
+     * 
+     * @param id 百度AI外呼加密主键
+     * @return 百度AI外呼加密
+     */
+    @Override
+    public AiobBaiduEncryption selectAiobBaiduEncryptionById(Long id)
+    {
+        return baseMapper.selectAiobBaiduEncryptionById(id);
+    }
+
+    /**
+     * 查询百度AI外呼加密列表
+     * 
+     * @param aiobBaiduEncryption 百度AI外呼加密
+     * @return 百度AI外呼加密
+     */
+    @Override
+    public List<AiobBaiduEncryption> selectAiobBaiduEncryptionList(AiobBaiduEncryption aiobBaiduEncryption)
+    {
+        return baseMapper.selectAiobBaiduEncryptionList(aiobBaiduEncryption);
+    }
+
+    /**
+     * 新增百度AI外呼加密
+     * 
+     * @param aiobBaiduEncryption 百度AI外呼加密
+     * @return 结果
+     */
+    @Override
+    public int insertAiobBaiduEncryption(AiobBaiduEncryption aiobBaiduEncryption)
+    {
+        aiobBaiduEncryption.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertAiobBaiduEncryption(aiobBaiduEncryption);
+    }
+
+    /**
+     * 修改百度AI外呼加密
+     * 
+     * @param aiobBaiduEncryption 百度AI外呼加密
+     * @return 结果
+     */
+    @Override
+    public int updateAiobBaiduEncryption(AiobBaiduEncryption aiobBaiduEncryption)
+    {
+        aiobBaiduEncryption.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateAiobBaiduEncryption(aiobBaiduEncryption);
+    }
+
+    /**
+     * 批量删除百度AI外呼加密
+     * 
+     * @param ids 需要删除的百度AI外呼加密主键
+     * @return 结果
+     */
+    @Override
+    public int deleteAiobBaiduEncryptionByIds(Long[] ids)
+    {
+        return baseMapper.deleteAiobBaiduEncryptionByIds(ids);
+    }
+
+    /**
+     * 删除百度AI外呼加密信息
+     * 
+     * @param id 百度AI外呼加密主键
+     * @return 结果
+     */
+    @Override
+    public int deleteAiobBaiduEncryptionById(Long id)
+    {
+        return baseMapper.deleteAiobBaiduEncryptionById(id);
+    }
+}

+ 472 - 0
fs-service-system/src/main/java/com/fs/aiob/service/impl/AiobBaiduTaskServiceImpl.java

@@ -0,0 +1,472 @@
+package com.fs.aiob.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.aicall.params.AiobImportPhoneParam;
+import com.fs.aicall.utils.AiobApiUtils;
+import com.fs.aicall.utils.AiobPhoneEncryption;
+import com.fs.aicall.vo.AiobCalleData;
+import com.fs.aicall.vo.AiobImportPhoneVo;
+import com.fs.aicall.vo.AiobTaskData;
+import com.fs.aiob.domain.AiobBaiduEncryption;
+import com.fs.aiob.domain.AiobBaiduTask;
+import com.fs.aiob.mapper.AiobBaiduTaskMapper;
+import com.fs.aiob.service.IAiobBaiduEncryptionService;
+import com.fs.aiob.service.IAiobBaiduTaskService;
+import com.fs.common.core.domain.BaseEntityTow;
+import com.fs.common.exception.base.BaseException;
+import com.fs.common.service.ISmsService;
+import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.PubFun;
+import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.CompanySmsTemp;
+import com.fs.company.domain.CompanyVoiceRoboticCallees;
+import com.fs.company.domain.CompanyVoiceRoboticWx;
+import com.fs.company.domain.CompanyWxClient;
+import com.fs.company.mapper.CompanyVoiceRoboticCalleesMapper;
+import com.fs.company.mapper.CompanyVoiceRoboticWxMapper;
+import com.fs.company.service.ICompanySmsTempService;
+import com.fs.company.service.ICompanyVoiceRoboticCalleesService;
+import com.fs.company.service.ICompanyVoiceRoboticWxService;
+import com.fs.company.service.impl.CompanyWxClientServiceImpl;
+import com.fs.crm.domain.CrmCustomer;
+import com.fs.crm.mapper.CrmCustomerMapper;
+import com.fs.common.param.SmsSendParam;
+import com.fs.crm.service.impl.CrmCustomerServiceImpl;
+import com.fs.his.config.AddWxConfig;
+import com.fs.qw.domain.QwWorkLink;
+import com.fs.qw.service.IQwWorkLinkService;
+import com.fs.system.mapper.SysDictDataMapper;
+import com.fs.system.service.ISysConfigService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * 百度AI外呼任务Service业务层处理
+ * 
+ * @author fs
+ * @date 2025-03-20
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class AiobBaiduTaskServiceImpl extends ServiceImpl<AiobBaiduTaskMapper, AiobBaiduTask> implements IAiobBaiduTaskService {
+
+
+    private final AiobApiUtils aiobApiUtils;
+    private final IAiobBaiduEncryptionService aiobBaiduEncryptionService;
+    private final CrmCustomerServiceImpl crmCustomerService;
+    private final CompanyVoiceRoboticCalleesMapper companyVoiceRoboticCalleesMapper;
+    private final ICompanyVoiceRoboticCalleesService companyVoiceRoboticCalleesService;
+    private final CrmCustomerMapper crmCustomerMapper;
+    private final ICompanyVoiceRoboticWxService companyVoiceRoboticWxService;
+    private final CompanyWxClientServiceImpl companyWxClientServiceImpl;
+    private final ISysConfigService configService;
+    private final SysDictDataMapper sysDictDataMapper;
+    private final CompanyVoiceRoboticWxMapper companyVoiceRoboticWxMapper;
+    private final IQwWorkLinkService qwWorkLinkService;
+    private final ISmsService smsService;
+    private final ICompanySmsTempService smsTempService;
+
+    /**
+     * 查询百度AI外呼任务
+     * 
+     * @param id 百度AI外呼任务主键
+     * @return 百度AI外呼任务
+     */
+    @Override
+    public AiobBaiduTask selectAiobBaiduTaskById(Long id)
+    {
+        return baseMapper.selectAiobBaiduTaskById(id);
+    }
+
+    /**
+     * 查询百度AI外呼任务列表
+     * 
+     * @param aiobBaiduTask 百度AI外呼任务
+     * @return 百度AI外呼任务
+     */
+    @Override
+    public List<AiobBaiduTask> selectAiobBaiduTaskList(AiobBaiduTask aiobBaiduTask)
+    {
+        return baseMapper.selectAiobBaiduTaskList(aiobBaiduTask);
+    }
+
+    /**
+     * 新增百度AI外呼任务
+     * 
+     * @param aiobBaiduTask 百度AI外呼任务
+     * @return 结果
+     */
+    @Override
+    public int insertAiobBaiduTask(AiobBaiduTask aiobBaiduTask){
+        List<CrmCustomer> customerList;
+        if(StringUtils.isNotEmpty(aiobBaiduTask.getUserIds())){
+            customerList = crmCustomerService.selectCrmCustomerListByIds(String.join(",", aiobBaiduTask.getUserIds()));
+        }else{
+            customerList = new ArrayList<>();
+        }
+//        if(customerList.isEmpty()){
+//            throw new BaseException("拨打电话不能为空");
+//        }
+        aiobBaiduTask.setCreateTime(DateUtils.getNowDate());
+        // 创建任务
+        aiobApiUtils.createTask(aiobBaiduTask);
+        int insert = baseMapper.insert(aiobBaiduTask);
+        // 保存外呼电话列表
+        List<CompanyVoiceRoboticCallees> calleesList = customerList.stream().map(e -> {
+            CompanyVoiceRoboticCallees entity = new CompanyVoiceRoboticCallees();
+            entity.setUserId(e.getCustomerId());
+            entity.setType(1);
+            entity.setUserName(e.getCustomerName());
+            entity.setPhone(e.getMobile());
+            entity.setRoboticId(aiobBaiduTask.getId());
+            return entity;
+        }).collect(Collectors.toList());
+        companyVoiceRoboticCalleesMapper.deleteByRoboticId(aiobBaiduTask.getId());
+        if(!calleesList.isEmpty()){
+            companyVoiceRoboticCalleesMapper.insertCompanyVoiceRoboticCalleesList(calleesList);
+        }
+        List<AiobBaiduEncryption> list = aiobBaiduEncryptionService.list();
+        if(list.isEmpty()){
+            throw new BaseException("密码加密不能为空");
+        }
+        AiobBaiduEncryption aiobBaiduEncryption = list.get(0);
+        if(!calleesList.isEmpty()){
+            AiobImportPhoneParam phoneVo = new AiobImportPhoneParam();
+            phoneVo.setTaskId(aiobBaiduTask.getTaskId());
+            phoneVo.setSecretType(1);
+            phoneVo.setSecretId(aiobBaiduEncryption.getSecretId());
+            phoneVo.setCustomerInfoList(calleesList.stream().map(e -> {
+                AiobImportPhoneParam.CustomerInfoList info = new AiobImportPhoneParam.CustomerInfoList();
+                info.setExtJson(e.getId().toString());
+                info.setMobile(AiobPhoneEncryption.encryptAES(e.getPhone(), aiobBaiduEncryption.getSecretKey()));
+                return info;
+            }).collect(Collectors.toList()));
+            Map<String, CompanyVoiceRoboticCallees> calleesMap = PubFun.listToMapByGroupObject(calleesList, e -> e.getId().toString());
+            List<AiobImportPhoneVo> importPhoneVos = aiobApiUtils.importPhone(phoneVo);
+            importPhoneVos.forEach(e -> {
+                CompanyVoiceRoboticCallees callees = calleesMap.get(e.getExtJson());
+                callees.setTaskMemberId(e.getTaskMemberId());
+                callees.setImportStatus(e.getStatus());
+                callees.setReason(e.getReason());
+            });
+            companyVoiceRoboticCalleesService.updateBatchById(calleesList);
+        }
+        addQw(aiobBaiduTask);
+        if(aiobBaiduTask.getType() == 2){
+            dispenseQw(aiobBaiduTask.getId());
+//            new Thread(() -> dispenseQw(aiobBaiduTask.getId())).start();
+        }
+        return insert;
+    }
+    private void addQw(AiobBaiduTask task) {
+        List<CompanyVoiceRoboticWx> collect;
+        if(task.getType() == 1){
+            // 设置加微微信列表
+            collect = task.getQwUserList().stream().map(e -> {
+                CompanyVoiceRoboticWx entity = new CompanyVoiceRoboticWx();
+                entity.setAddType(task.getType());
+                entity.setIntention(e.getIntention());
+                entity.setAccountId(e.getCompanyUserId());
+                entity.setWxDialogId(e.getWxDialogId());
+                return entity;
+            }).collect(Collectors.toList());
+        }else{
+            collect = task.getWorkUrl().stream().map(e -> {
+                CompanyVoiceRoboticWx entity = new CompanyVoiceRoboticWx();
+                entity.setAddType(task.getType());
+                entity.setIntention(e);
+                return entity;
+            }).collect(Collectors.toList());
+        }
+        collect.forEach(e -> {
+            e.setRoboticId(task.getId());
+            e.setType(1);
+        });
+        companyVoiceRoboticWxService.saveBatch(collect);
+    }
+
+    /**
+     * 修改百度AI外呼任务
+     * 
+     * @param aiobBaiduTask 百度AI外呼任务
+     * @return 结果
+     */
+    @Override
+    public int updateAiobBaiduTask(AiobBaiduTask aiobBaiduTask)
+    {
+        aiobBaiduTask.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateAiobBaiduTask(aiobBaiduTask);
+    }
+
+    /**
+     * 批量删除百度AI外呼任务
+     * 
+     * @param ids 需要删除的百度AI外呼任务主键
+     * @return 结果
+     */
+    @Override
+    public int deleteAiobBaiduTaskByIds(Long[] ids){
+        List<AiobBaiduTask> taskList = list(new QueryWrapper<AiobBaiduTask>().in("id", ids));
+        if(taskList.stream().anyMatch(e -> e.getTaskStatus() == 2)){
+            throw new BaseException("任务正在执行无法删除");
+        }
+        int i = baseMapper.deleteAiobBaiduTaskByIds(ids);
+        aiobApiUtils.deleteTask(PubFun.listToNewList(taskList, AiobBaiduTask::getTaskId));
+        return i;
+    }
+
+    /**
+     * 删除百度AI外呼任务信息
+     * 
+     * @param id 百度AI外呼任务主键
+     * @return 结果
+     */
+    @Override
+    public int deleteAiobBaiduTaskById(Long id)
+    {
+        return baseMapper.deleteAiobBaiduTaskById(id);
+    }
+
+    @Override
+    public void back(AiobCalleData vo) {
+        log.info("进入外呼回调:{}", JSON.toJSONString(vo));
+        // 接通
+        if(vo.getEndType() == 1) pushDialogContent(vo);
+        // 未接通
+        if(vo.getEndType() == 0) pushBilling(vo);
+        // 是否全部回调完毕
+        CompanyVoiceRoboticCallees callee = getResultCalleeInfo(vo);
+        AiobBaiduTask byId = getById(callee.getRoboticId());
+        // 企微
+        if(byId.getType() == 2){
+            CrmCustomer crmCustomer = crmCustomerMapper.selectCrmCustomerById(callee.getUserId());
+            SmsSendParam param = new SmsSendParam();
+            param.setCustomerId(crmCustomer.getCustomerId());
+            param.setTempCode("aiob-wok-link");
+            param.setCompanyId(crmCustomer.getCompanyId());
+            param.setCompanyUserId(crmCustomer.getCustomerUserId());
+            param.setSmsType(2);
+            param.setMobile(callee.getPhone());
+            CompanySmsTemp temp=smsTempService.selectCompanySmsTempByCode(param.getTempCode());
+            param.setContent(temp.getContent());
+            CompanyWxClient one = companyWxClientServiceImpl.getOne(new QueryWrapper<CompanyWxClient>().eq("add_type", 2).eq("robotic_id", callee.getRoboticId()).eq("customer_id", callee.getUserId()));
+            param.setWorkUrl(one.getWorkUrl());
+            smsService.sendSms(param);
+        }
+        if(byId.getType() == 1){
+            long count = companyVoiceRoboticCalleesMapper.countByRoboticIdNotUuid(callee.getRoboticId());
+            if(count == 0){
+                new Thread(() -> dispenseWx(callee.getRoboticId())).start();
+            }
+        }
+    }
+
+    @Override
+    public void updateStatus(AiobTaskData vo) {
+        if(vo.getTaskId() == null) return;
+        AiobBaiduTask task = getOne(new QueryWrapper<AiobBaiduTask>().eq("task_id", vo.getTaskId()));
+        if(task == null) return;
+        task.setTaskStatus(vo.getTaskStatus());
+        task.setUpdateReason(vo.getReason());
+        updateById(task);
+    }
+
+    @Override
+    public void changeStatus(String taskId, Integer status) {
+        aiobApiUtils.changeStatus(taskId, status);
+        AiobTaskData vo = new AiobTaskData();
+        vo.setTaskId(Long.parseLong(taskId));
+        vo.setTaskStatus(status);
+        vo.setReason("等待任务状态同步中");
+        updateStatus(vo);
+    }
+
+    public void pushDialogContent(AiobCalleData vo){
+        String intention = "无";
+        String tagName = "意向等级";
+        if(vo.getTagExtractInfo() != null && !vo.getTagExtractInfo().isEmpty() && vo.getTagExtractInfo().containsKey(tagName) && vo.getTagExtractInfo().get(tagName) != null){
+            intention = vo.getTagExtractInfo().get(tagName).toString();
+        }
+        CompanyVoiceRoboticCallees callee = getResultCalleeInfo(vo);
+        callee.setUuid(vo.getSessionId());
+        callee.setIntention(intention);
+        if(vo.getRecord() != null && !vo.getRecord().isEmpty()){
+            callee.setJson(JSON.toJSONString(vo.getRecord()));
+        }
+        callee.setResult(1);
+        companyVoiceRoboticCalleesMapper.updateById(callee);
+        CrmCustomer crmCustomer = crmCustomerMapper.selectCrmCustomerById(callee.getUserId());
+        crmCustomer.setIntention(intention);
+        crmCustomerMapper.updateById(crmCustomer);
+    }
+    public void pushBilling(AiobCalleData vo){
+        CompanyVoiceRoboticCallees callee = getResultCalleeInfo(vo);
+        callee.setResult(1);
+        companyVoiceRoboticCalleesMapper.updateById(callee);
+    }
+    public CompanyVoiceRoboticCallees getResultCalleeInfo(AiobCalleData vo){
+        if(StringUtils.isEmpty(vo.getExtJson())){
+            log.error("回调错误,未找到拨打手机号记录:{}", vo);
+            throw new BaseException("回调错误");
+        }
+        CompanyVoiceRoboticCallees callee = companyVoiceRoboticCalleesMapper.selectCompanyVoiceRoboticCalleesById(Long.parseLong(vo.getExtJson()));
+        if(callee == null){
+            log.error("回调错误,未找到拨打手机号记录:{}", vo);
+            throw new BaseException("回调错误");
+        }
+        return callee;
+    }
+
+    public void dispenseQw(Long roboticId){
+        // 拨打电话列表
+        List<CompanyVoiceRoboticCallees> calleesList = companyVoiceRoboticCalleesMapper.selectByRoboticId(roboticId);
+        // 分配任务列表
+        List<CompanyVoiceRoboticWx> roboticWxList = companyVoiceRoboticWxMapper.selectByRoboticId(roboticId);
+        // 客户列表
+        List<CrmCustomer> customerList = crmCustomerMapper.selectCrmCustomerListByIds(calleesList.stream().map(e -> e.getUserId().toString()).collect(Collectors.joining(",")));
+        Map<Long, CrmCustomer> customerMap = PubFun.listToMapByGroupObject(customerList, CrmCustomer::getCustomerId);
+
+        List<Long> workIds = PubFun.listToNewList(roboticWxList, e -> Long.parseLong(e.getIntention()));
+        List<QwWorkLink> workLinkList = qwWorkLinkService.list(new QueryWrapper<QwWorkLink>().in("id", workIds));
+        Map<Long, QwWorkLink> workLinkMap = PubFun.listToMapByGroupObject(workLinkList, BaseEntityTow::getId);
+
+        AtomicInteger i = new AtomicInteger();
+        List<CompanyWxClient> collect = calleesList.stream().map(e -> {
+            int index = i.getAndIncrement();
+            if(index == roboticWxList.size() - 1){
+                i.set(0);
+            }
+            CompanyVoiceRoboticWx wx = roboticWxList.get(index);
+
+            CrmCustomer customers = customerMap.get(e.getUserId());
+            e.setDistribute(1);
+            CompanyWxClient companyWxClient = new CompanyWxClient();
+
+            wx.setNum(wx.getNum() + 1);
+            companyWxClient.setRoboticWxId(wx.getId());
+            // 任务ID
+            companyWxClient.setRoboticId(roboticId);
+            companyWxClient.setAddType(2);
+            // 客户名称
+            companyWxClient.setNickName(customers.getCustomerName());
+            // 手机号
+            companyWxClient.setPhone(customers.getMobile());
+            // 微信号
+            companyWxClient.setWxNo(customers.getWeixin());
+            // 微信号
+            companyWxClient.setCustomerId(customers.getCustomerId());
+
+            companyWxClient.setIntention(wx.getIntention());
+
+            return companyWxClient;
+        }).collect(Collectors.toList());
+
+
+//        List<CompanyWxClient> collect = roboticWxList.stream().map(e -> {
+//            CompanyVoiceRoboticCallees companyVoiceRoboticCallees = calleesList.get(i.getAndIncrement());
+//            CrmCustomer customers = customerMap.get(companyVoiceRoboticCallees.getUserId());
+//            companyVoiceRoboticCallees.setDistribute(1);
+//            CompanyWxClient companyWxClient = new CompanyWxClient();
+//            // 任务ID
+//            companyWxClient.setRoboticId(roboticId);
+//            companyWxClient.setAddType(2);
+//            // 客户名称
+//            companyWxClient.setNickName(customers.getCustomerName());
+//            // 手机号
+//            companyWxClient.setPhone(customers.getMobile());
+//            // 微信号
+//            companyWxClient.setWxNo(customers.getWeixin());
+//            // 微信号
+//            companyWxClient.setCustomerId(customers.getCustomerId());
+//
+//            companyWxClient.setIntention(e.getIntention());
+//
+//            return companyWxClient;
+//        }).collect(Collectors.toList());
+        companyVoiceRoboticCalleesService.updateBatchById(calleesList);
+        companyVoiceRoboticWxService.updateBatchById(roboticWxList);
+        companyWxClientServiceImpl.saveBatch(collect);
+//        collect.forEach(e -> {
+//            QwWorkLink qwWorkLink = workLinkMap.get(Long.parseLong(e.getIntention()));
+//            e.setWorkShortNo("QW-" + IdUtil.simpleUUID());
+//            String url = qwWorkShortLinkService.addWxLink(qwWorkLink, e.getWorkShortNo());
+//            e.setWorkUrl(url);
+//        });
+        companyWxClientServiceImpl.updateBatchById(collect);
+
+
+    }
+    public void dispenseWx(Long roboticId){
+        String json=configService.selectConfigByKey("add.wx");
+        AddWxConfig bean = JSONUtil.toBean(json, AddWxConfig.class);
+        Integer addWxNum = bean.getDayAddNum();
+        // 任务详情
+        // 拨打电话列表
+        List<CompanyVoiceRoboticCallees> calleesList = companyVoiceRoboticCalleesMapper.selectByRoboticId(roboticId);
+        if(calleesList.isEmpty()) return;
+        calleesList = calleesList.stream().filter(e -> StringUtils.isNotEmpty(e.getIntention()) && e.getDistribute() == 0).collect(Collectors.toList());
+        if(calleesList.isEmpty()) return;
+        Map<Long, CompanyVoiceRoboticCallees> calleesMap = PubFun.listToMapByGroupObject(calleesList, CompanyVoiceRoboticCallees::getUserId);
+        // 分配任务列表
+        List<CompanyVoiceRoboticWx> roboticWxList = companyVoiceRoboticWxMapper.selectByRoboticId(roboticId).stream().filter(e-> e.getAddNum() < addWxNum).collect(Collectors.toList());
+        // 客户列表
+        List<CrmCustomer> customerList = crmCustomerMapper.selectCrmCustomerListByIds(calleesList.stream().map(e -> e.getUserId().toString()).collect(Collectors.joining(",")));
+        Map<String, List<CrmCustomer>> customerMap = PubFun.listToMapByGroupList(customerList, CrmCustomer::getIntention);
+        Map<String, List<CompanyVoiceRoboticWx>> roboticWxMap = PubFun.listToMapByGroupList(roboticWxList, CompanyVoiceRoboticWx::getIntention);
+        // 循环客户
+        List<CompanyWxClient> collect = customerMap.entrySet().stream().filter(e -> roboticWxMap.containsKey(e.getKey())).flatMap(map -> {
+            String k = map.getKey();
+            List<CrmCustomer> v = map.getValue();
+            // 对应销售账号列表
+            List<CompanyVoiceRoboticWx> wxList = roboticWxMap.get(k);
+            // 组装任务数据
+            return v.stream().map(e -> {
+                CompanyVoiceRoboticCallees companyVoiceRoboticCallees = calleesMap.get(e.getCustomerId());
+                companyVoiceRoboticCallees.setDistribute(1);
+                CompanyWxClient companyWxClient = new CompanyWxClient();
+                // 绑定销售
+                bindCompany(companyWxClient, wxList, addWxNum);
+                // 任务ID
+                companyWxClient.setRoboticId(roboticId);
+                companyWxClient.setAddType(1);
+                // 客户名称
+                companyWxClient.setNickName(e.getCustomerName());
+                // 手机号
+                companyWxClient.setPhone(e.getMobile());
+                // 微信号
+                companyWxClient.setWxNo(e.getWeixin());
+                // 微信号
+                companyWxClient.setCustomerId(e.getCustomerId());
+                // 意向
+                companyWxClient.setIntention(e.getIntention());
+                return companyWxClient;
+            });
+        }).collect(Collectors.toList());
+        companyVoiceRoboticCalleesService.updateBatchById(calleesList);
+        companyVoiceRoboticWxService.updateBatchById(roboticWxList);
+        companyWxClientServiceImpl.saveBatch(collect);
+    }
+    // 绑定销售
+    private static void bindCompany(CompanyWxClient client, List<CompanyVoiceRoboticWx> wxList, Integer addWxNum) {
+        List<CompanyVoiceRoboticWx> wx = wxList.stream().filter(f -> f.getNum() < addWxNum).collect(Collectors.toList());
+        // 绑定销售,添加值达到阈值后设置为空,等待下次绑定
+        if (!wx.isEmpty()) {
+            CompanyVoiceRoboticWx companyVoiceRoboticWx = wx.get(0);
+            companyVoiceRoboticWx.setNum(companyVoiceRoboticWx.getNum() + 1);
+            client.setDialogId(companyVoiceRoboticWx.getWxDialogId());
+            client.setRoboticWxId(companyVoiceRoboticWx.getId());
+        }
+    }
+}

+ 11 - 12
fs-service-system/src/main/java/com/fs/baidu/service/impl/BdAccountServiceImpl.java

@@ -35,8 +35,6 @@ import com.fs.qw.param.ConversionStatisticsParam;
 import com.fs.qw.result.QwExternalContactLogTableVo;
 import com.fs.qw.result.QwExternalContactLogVo;
 import com.fs.qw.service.IQwExternalContactService;
-import com.fs.store.domain.FsStoreOrder;
-import com.fs.store.service.IFsStoreOrderService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import com.fs.baidu.mapper.BdAccountMapper;
@@ -55,7 +53,7 @@ public class BdAccountServiceImpl extends ServiceImpl<BdAccountMapper, BdAccount
 
     private final IQwExternalContactService qwExternalContactService;
     private final IFsCourseWatchLogService fsCourseWatchLogService;
-    private final IFsStoreOrderService fsStoreOrderService;
+//    private final IFsStoreOrderService fsStoreOrderService;
     private final IBdPlanService bdPlanService;
     private final IBdUnitService bdUnitService;
     private final IBdCreativeService bdCreativeService;
@@ -187,16 +185,17 @@ public class BdAccountServiceImpl extends ServiceImpl<BdAccountMapper, BdAccount
             finisList = finisList.stream().filter(e -> watchList.containsKey(e.getId())).collect(Collectors.toList());
 
         }
-        Map<Long, FsStoreOrder> orderMap;
-        if(!list.isEmpty()){
-            List<Long> fsUserIdList = PubFun.listToNewList(list, QwExternalContactLogVo::getFsUserId);
-            List<FsStoreOrder> fsOrderList = fsStoreOrderService.selectFsStoreOrderStatisticsByUserId(fsUserIdList);
-            orderMap = PubFun.listToMapByGroupObject(fsOrderList, FsStoreOrder::getUserId);
-        }else{
-            orderMap = new HashMap<>();
-        }
+//        Map<Long, FsStoreOrder> orderMap;
+//        if(!list.isEmpty()){
+//            List<Long> fsUserIdList = PubFun.listToNewList(list, QwExternalContactLogVo::getFsUserId);
+//            List<FsStoreOrder> fsOrderList = fsStoreOrderService.selectFsStoreOrderStatisticsByUserId(fsUserIdList);
+//            orderMap = PubFun.listToMapByGroupObject(fsOrderList, FsStoreOrder::getUserId);
+//        }else{
+//            orderMap = new HashMap<>();
+//        }
         // 是否完课
-        List<QwExternalContactLogVo> orderList = list.stream().filter(e -> orderMap.containsKey(e.getFsUserId())).collect(Collectors.toList());
+//        List<QwExternalContactLogVo> orderList = list.stream().filter(e -> orderMap.containsKey(e.getFsUserId())).collect(Collectors.toList());
+        List<QwExternalContactLogVo> orderList = list;
         R result = R.ok();
         switch (param.getType()) {
             case 0: // 默认12个月

+ 2 - 2
fs-service-system/src/main/java/com/fs/bdAdv/mapper/FsAdvSemMapper.java

@@ -1,12 +1,12 @@
 package com.fs.bdAdv.mapper;
 
+import java.util.List;
+
 import com.fs.bdAdv.domain.FsAdvSem;
 import com.fs.bdAdv.param.FsAdvSemStatisticsByDayParam;
 import com.fs.bdAdv.vo.FsAdvSemStatisticsByDayVo;
 import org.apache.ibatis.annotations.Select;
 
-import java.util.List;
-
 /**
  * App广告投流Mapper接口
  *

+ 5 - 0
fs-service-system/src/main/java/com/fs/bdAdv/param/FsAdvSemStatisticsByDayParam.java

@@ -1,8 +1,13 @@
 package com.fs.bdAdv.param;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.core.domain.BaseEntity;
 import com.fs.crm.param.BaseQueryParam;
+import com.fs.his.param.BaseParam;
 import lombok.Data;
 
+import java.util.Date;
+
 @Data
 public class FsAdvSemStatisticsByDayParam extends BaseQueryParam {
     private String dateMax;

+ 1 - 2
fs-service-system/src/main/java/com/fs/bdAdv/service/IFsAdvSemService.java

@@ -1,11 +1,10 @@
 package com.fs.bdAdv.service;
 
+import java.util.List;
 import com.fs.bdAdv.domain.FsAdvSem;
 import com.fs.bdAdv.param.FsAdvSemStatisticsByDayParam;
 import com.fs.bdAdv.vo.FsAdvSemStatisticsByDayVo;
 
-import java.util.List;
-
 /**
  * App广告投流Service接口
  *

+ 3 - 3
fs-service-system/src/main/java/com/fs/bdAdv/service/impl/FsAdvSemServiceImpl.java

@@ -1,15 +1,15 @@
 package com.fs.bdAdv.service.impl;
 
+import java.util.List;
+
 import com.fs.bdAdv.domain.FsAdvSem;
 import com.fs.bdAdv.mapper.FsAdvSemMapper;
 import com.fs.bdAdv.param.FsAdvSemStatisticsByDayParam;
-import com.fs.bdAdv.service.IFsAdvSemService;
 import com.fs.bdAdv.vo.FsAdvSemStatisticsByDayVo;
 import com.fs.common.utils.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-
-import java.util.List;
+import com.fs.bdAdv.service.IFsAdvSemService;
 
 /**
  * App广告投流Service业务层处理

+ 1 - 0
fs-service-system/src/main/java/com/fs/common/param/SmsSendParam.java

@@ -21,5 +21,6 @@ public class SmsSendParam implements Serializable {
     private String content;
 
     private String cardUrl; //名片链接
+    private String workUrl; //名片链接
 
 }

+ 2 - 1
fs-service-system/src/main/java/com/fs/company/domain/CompanyTcmReport.java

@@ -1,11 +1,12 @@
 package com.fs.company.domain;
 
-import java.math.BigDecimal;
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
+import java.math.BigDecimal;
+
 /**
  * 中医档期业绩报表对象 company_tcm_report
  *

+ 49 - 0
fs-service-system/src/main/java/com/fs/company/domain/CompanyVoiceDialog.java

@@ -0,0 +1,49 @@
+package com.fs.company.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * AI外呼话术对象 company_voice_dialog
+ * 
+ * @author fs
+ * @date 2024-12-04
+ */
+@Data
+public class CompanyVoiceDialog {
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private Long id;
+
+    /** 名称 */
+    @Excel(name = "名称")
+    private String name;
+
+    /** 接口返回名称 */
+    @Excel(name = "三方名称")
+    private String resultName;
+
+    /** 接口返回ID */
+    @Excel(name = "三方ID")
+    private Long resultId;
+
+    /** 绑定号码 */
+    @Excel(name = "绑定号码")
+    private String callNum;
+
+    /** 创建人 */
+    @Excel(name = "创建人")
+    private Long createUser;
+
+
+    /** 创建时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /** 备注 */
+    private String remark;
+}

+ 110 - 0
fs-service-system/src/main/java/com/fs/company/domain/CompanyVoiceRobotic.java

@@ -0,0 +1,110 @@
+package com.fs.company.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.company.vo.RoboticWxVo;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 机器人外呼任务对象 company_voice_robotic
+ *
+ * @author fs
+ * @date 2024-12-04
+ */
+@Data
+public class CompanyVoiceRobotic {
+    private static final long serialVersionUID = 1L;
+
+    /** ID */
+    private Long id;
+
+    /** 任务名称 */
+    @Excel(name = "任务名称")
+    private String name;
+
+    /** 三方任务名称 */
+    @Excel(name = "三方任务名称")
+    private String taskName;
+
+    /** 三方任务ID */
+    @Excel(name = "三方任务ID")
+    private Long taskId;
+
+    /** 机器人ID */
+    @Excel(name = "机器人ID")
+    private Long robot;
+
+    /** 话术ID */
+    @Excel(name = "话术ID")
+    private Long dialogId;
+
+    /** 模式 */
+    @Excel(name = "模式")
+    private Long mode;
+
+    /** 呼叫倍率;1-5 */
+    @Excel(name = "呼叫倍率;1-5")
+    private Long multiplier;
+
+    /** 是否开启自动重呼;0否 1是 */
+    @Excel(name = "是否开启自动重呼;0否 1是")
+    private Long autoRecall;
+
+    /** 重呼次数;最大5 0表示不自动重呼 */
+    @Excel(name = "重呼次数;最大5 0表示不自动重呼")
+    private Long recallTimes;
+
+    /** 主叫分组ID */
+    @Excel(name = "主叫分组ID")
+    private Long cidGroupId;
+
+    /** 时间段星期;0表示周天 1-6表示周一到周六 */
+    @Excel(name = "时间段星期;0表示周天 1-6表示周一到周六")
+    private String weekDay1;
+
+    /** 开始时间 */
+    @Excel(name = "开始时间")
+    private String startTime1;
+
+    /** 结束时间 */
+    @Excel(name = "结束时间")
+    private String endTime1;
+
+    /** 时间段星期;0表示周天 1-6表示周一到周六 */
+    @Excel(name = "时间段星期;0表示周天 1-6表示周一到周六")
+    private String weekDay2;
+
+    /** 开始时间 */
+    @Excel(name = "开始时间")
+    private String startTime2;
+
+    /** 结束时间 */
+    @Excel(name = "结束时间")
+    private String endTime2;
+
+    /** 结束时间 */
+    @Excel(name = "加微方式0平均1意向")
+    private Integer addType;
+
+    /** 创建人 */
+    @Excel(name = "创建人")
+    private Long createUser;
+    /** 创建人 */
+    @Excel(name = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+    @TableField(exist = false)
+    private List<String> userIds;
+    @TableField(exist = false)
+    private List<RoboticWxVo> qwUserList;
+
+    @TableField(exist = false)
+    private Map<String, Object> params;
+    @TableField(exist = false)
+    private Integer num;
+}

+ 60 - 0
fs-service-system/src/main/java/com/fs/company/domain/CompanyVoiceRoboticCallees.java

@@ -0,0 +1,60 @@
+package com.fs.company.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+/**
+ * 任务外呼电话对象 company_voice_robotic_callees
+ * 
+ * @author fs
+ * @date 2024-12-04
+ */
+@Data
+public class CompanyVoiceRoboticCallees{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    @Excel(name = "类型;0天天1百度")
+    private Integer type;
+
+    /** 用户ID */
+    @Excel(name = "用户ID")
+    private Long userId;
+
+    /** 电话号码 */
+    @Excel(name = "用户名称")
+    private String userName;
+
+    /** 电话号码 */
+    @Excel(name = "电话号码")
+    private String phone;
+
+    /** 任务ID */
+    @Excel(name = "任务ID")
+    private Long roboticId;
+
+    /** 变量列表;TTS变量字段,变量使用#拼接 */
+    @Excel(name = "变量列表;TTS变量字段,变量使用#拼接")
+    private String params;
+
+    @Excel(name = "对话图uuid")
+    private String uuid;
+
+    @Excel(name = "意向")
+    private String intention;
+    @Excel(name = "是否回调0否1是")
+    private Integer result;
+    @Excel(name = "是否分配0否1是")
+    private Integer distribute;
+    @Excel(name = "通话记录")
+    private String json;
+    @Excel(name = "通话记录")
+    private Long taskMemberId;
+    @Excel(name = "通话记录")
+    private Boolean importStatus;
+    private String reason;
+}

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

@@ -0,0 +1,61 @@
+package com.fs.company.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntityTow;
+import lombok.Data;
+
+/**
+ * AI外呼任务加微方式对象 company_voice_robotic_wx
+ * 
+ * @author fs
+ * @date 2024-12-06
+ */
+@Data
+public class CompanyVoiceRoboticWx extends BaseEntityTow {
+    private static final long serialVersionUID = 1L;
+
+    /** 意向 */
+    @Excel(name = "类型;0天天1百度")
+    private Integer type;
+    @Excel(name = "加微类型1个微2企微")
+    private Integer addType;
+    @Excel(name = "意向")
+    private String intention;
+
+    /** 分配企微用户 */
+    @Excel(name = "任务ID")
+    private Long roboticId;
+
+    /** 分配企微用户 */
+    @Excel(name = "分配企微用户")
+    private Long accountId;
+
+    /** 加微话术 */
+    @Excel(name = "加微话术")
+    private Long wxDialogId;
+
+    /** 分配数量 */
+    @Excel(name = "分配数量")
+    private Integer num;
+
+    /** 添加数量 */
+    @Excel(name = "添加数量")
+    private Integer addNum;
+
+
+    @TableField(exist = false)
+    private String wxNickName;
+    @TableField(exist = false)
+    private String wxNo;
+    @TableField(exist = false)
+    private String phone;
+    @TableField(exist = false)
+    private String companyUserName;
+    @TableField(exist = false)
+    private String corpId;
+    @TableField(exist = false)
+    private String dialogName;
+    @TableField(exist = false)
+    private int indexNumber;
+}

+ 62 - 0
fs-service-system/src/main/java/com/fs/company/domain/CompanyWxAccount.java

@@ -0,0 +1,62 @@
+package com.fs.company.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.Map;
+
+/**
+ * 企微账号对象 company_wx_account
+ * 
+ * @author fs
+ * @date 2024-12-09
+ */
+@Data
+public class CompanyWxAccount {
+
+    /** id */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /** 微信昵称 */
+    @Excel(name = "微信昵称")
+    private String wxNickName;
+
+    /** 电话号码 */
+    @Excel(name = "电话号码")
+    private String phone;
+
+    /** 微信号 */
+    @Excel(name = "微信号")
+    private String wxNo;
+
+    /** 销售人员ID */
+    @Excel(name = "销售人员ID")
+    private Long companyUserId;
+
+    /** 销售人员ID */
+    @Excel(name = "销售人员ID")
+    private LocalDateTime addTime;
+
+    /** 销售人员ID */
+    @Excel(name = "销售人员ID")
+    private LocalDateTime nextTime;
+
+    /** 销售人员ID */
+    @Excel(name = "销售人员ID")
+    private Integer toDayNum;
+
+    /** 创建人 */
+    @Excel(name = "创建人")
+    private Long createUser;
+
+    @TableField(exist = false)
+    private String companyUserName;
+    /** 请求参数 */
+    @TableField(exist = false)
+    private Map<String, Object> params;
+}

+ 44 - 0
fs-service-system/src/main/java/com/fs/company/domain/CompanyWxChat.java

@@ -0,0 +1,44 @@
+package com.fs.company.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntityTow;
+import lombok.Data;
+
+/**
+ * 个微聊天对象 company_wx_chat
+ *
+ * @author fs
+ * @date 2025-01-15
+ */
+@Data
+public class CompanyWxChat extends BaseEntityTow
+{
+    /** 个微用户ID */
+    @Excel(name = "个微用户ID")
+    private Long wxUserId;
+
+    /** 企业ID */
+    @Excel(name = "企业ID")
+    private Long companyId;
+
+    /** 企业用户ID */
+    @Excel(name = "企业用户ID")
+    private Long companyUserId;
+
+    /** 消息JSON */
+    @Excel(name = "消息JSON")
+    private String msgJson;
+
+    /** 消息内容 */
+    @Excel(name = "消息内容")
+    private String content;
+
+    /** 消息类型 1文本 */
+    @Excel(name = "消息类型 1文本")
+    private Integer msgType;
+
+    /** 发送类型 1用户发送 2企业用户发送 */
+    @Excel(name = "发送类型 1用户发送 2企业用户发送")
+    private Integer sendType;
+
+}

+ 99 - 0
fs-service-system/src/main/java/com/fs/company/domain/CompanyWxClient.java

@@ -0,0 +1,99 @@
+package com.fs.company.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntityTow;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 添加个微信账号对象 company_wx_client
+ * 
+ * @author fs
+ * @date 2024-12-09
+ */
+@Data
+public class CompanyWxClient extends BaseEntityTow
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 任务ID */
+    @Excel(name = "任务ID")
+    private Long roboticId;
+    @Excel(name = "添加类型1个微2企微")
+    private Integer addType;
+    /** 分配企微账号ID */
+    @Excel(name = "分配企微账号ID")
+    private Long roboticWxId;
+    /** 客户ID */
+    @Excel(name = "客户ID")
+    private Long customerId;
+    /** 话术ID */
+    @Excel(name = "话术ID")
+    private Long dialogId;
+
+    /** 昵称 */
+    @Excel(name = "昵称")
+    private String nickName;
+
+    /** 头像 */
+    @Excel(name = "头像")
+    private String avatar;
+
+    /** 手机号 */
+    @Excel(name = "手机号")
+    private String phone;
+
+    /** 微信号 */
+    @Excel(name = "微信号")
+    private String wxNo;
+
+    /** 微信号 */
+    @Excel(name = "微信号")
+    private String wxName;
+
+    /** 客户意向 */
+    @Excel(name = "客户意向")
+    private String intention;
+
+    /** 客户意向 */
+    @Excel(name = "获客链接")
+    private String workUrl;
+
+    @Excel(name = "获客链接短链编号")
+    private String workShortNo;
+
+    /** 是否添加;0否1是 */
+    @Excel(name = "是否添加;0否1是2待添加3作废")
+    private Integer isAdd;
+
+    /** 是否添加;0否1是 */
+    private Integer checkCount;
+
+    /** 是否添加;0否1是 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime nextCheckTime;
+
+    /** 添加时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "添加时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private LocalDateTime addTime;
+
+    @TableField(exist = false)
+    private String wxNickName;
+    @TableField(exist = false)
+    private String dialogName;
+    @TableField(exist = false)
+    private String templateDetails;
+    @TableField(exist = false)
+    private String template;
+    @TableField(exist = false)
+    private String roboticName;
+    @TableField(exist = false)
+    private String memo;
+    @TableField(exist = false)
+    private Long companyUserId;
+
+}

+ 32 - 0
fs-service-system/src/main/java/com/fs/company/domain/CompanyWxDialog.java

@@ -0,0 +1,32 @@
+package com.fs.company.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntityTow;
+import lombok.Data;
+
+/**
+ * 添加微信话术对象 company_wx_dialog
+ * 
+ * @author fs
+ * @date 2024-12-06
+ */
+@Data
+public class CompanyWxDialog extends BaseEntityTow {
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /** 名称 */
+    @Excel(name = "名称")
+    private String name;
+
+    /** 模板 */
+    @Excel(name = "模板")
+    private String templateDetails;
+
+
+}

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

@@ -0,0 +1,61 @@
+package com.fs.company.mapper;
+
+import com.fs.company.domain.CompanyVoiceDialog;
+
+import java.util.List;
+
+/**
+ * AI外呼话术Mapper接口
+ * 
+ * @author fs
+ * @date 2024-12-04
+ */
+public interface CompanyVoiceDialogMapper {
+    /**
+     * 查询AI外呼话术
+     * 
+     * @param id AI外呼话术ID
+     * @return AI外呼话术
+     */
+    public CompanyVoiceDialog selectCompanyVoiceDialogById(Long id);
+
+    /**
+     * 查询AI外呼话术列表
+     * 
+     * @param companyVoiceDialog AI外呼话术
+     * @return AI外呼话术集合
+     */
+    public List<CompanyVoiceDialog> selectCompanyVoiceDialogList(CompanyVoiceDialog companyVoiceDialog);
+
+    /**
+     * 新增AI外呼话术
+     * 
+     * @param companyVoiceDialog AI外呼话术
+     * @return 结果
+     */
+    public int insertCompanyVoiceDialog(CompanyVoiceDialog companyVoiceDialog);
+
+    /**
+     * 修改AI外呼话术
+     * 
+     * @param companyVoiceDialog AI外呼话术
+     * @return 结果
+     */
+    public int updateCompanyVoiceDialog(CompanyVoiceDialog companyVoiceDialog);
+
+    /**
+     * 删除AI外呼话术
+     * 
+     * @param id AI外呼话术ID
+     * @return 结果
+     */
+    public int deleteCompanyVoiceDialogById(Long id);
+
+    /**
+     * 批量删除AI外呼话术
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteCompanyVoiceDialogByIds(Long[] ids);
+}

+ 71 - 0
fs-service-system/src/main/java/com/fs/company/mapper/CompanyVoiceRoboticCalleesMapper.java

@@ -0,0 +1,71 @@
+package com.fs.company.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.company.domain.CompanyVoiceRoboticCallees;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 任务外呼电话Mapper接口
+ * 
+ * @author fs
+ * @date 2024-12-04
+ */
+public interface CompanyVoiceRoboticCalleesMapper extends BaseMapper<CompanyVoiceRoboticCallees> {
+    /**
+     * 查询任务外呼电话
+     * 
+     * @param id 任务外呼电话ID
+     * @return 任务外呼电话
+     */
+    public CompanyVoiceRoboticCallees selectCompanyVoiceRoboticCalleesById(Long id);
+
+    /**
+     * 查询任务外呼电话列表
+     * 
+     * @param companyVoiceRoboticCallees 任务外呼电话
+     * @return 任务外呼电话集合
+     */
+    public List<CompanyVoiceRoboticCallees> selectCompanyVoiceRoboticCalleesList(CompanyVoiceRoboticCallees companyVoiceRoboticCallees);
+
+    /**
+     * 新增任务外呼电话
+     * 
+     * @param companyVoiceRoboticCallees 任务外呼电话
+     * @return 结果
+     */
+    public int insertCompanyVoiceRoboticCallees(CompanyVoiceRoboticCallees companyVoiceRoboticCallees);
+
+    /**
+     * 修改任务外呼电话
+     * 
+     * @param companyVoiceRoboticCallees 任务外呼电话
+     * @return 结果
+     */
+    public int updateCompanyVoiceRoboticCallees(CompanyVoiceRoboticCallees companyVoiceRoboticCallees);
+
+    /**
+     * 删除任务外呼电话
+     * 
+     * @param id 任务外呼电话ID
+     * @return 结果
+     */
+    public int deleteCompanyVoiceRoboticCalleesById(Long id);
+
+    /**
+     * 批量删除任务外呼电话
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteCompanyVoiceRoboticCalleesByIds(Long[] ids);
+
+    void insertCompanyVoiceRoboticCalleesList(@Param("list") List<CompanyVoiceRoboticCallees> list);
+
+    List<CompanyVoiceRoboticCallees> selectByRoboticId(@Param("id") Long id);
+
+    void deleteByRoboticId(@Param("id") Long id);
+
+    long countByRoboticIdNotUuid(@Param("roboticId") Long roboticId);
+}

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

@@ -0,0 +1,67 @@
+package com.fs.company.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.company.domain.CompanyVoiceRobotic;
+import com.fs.company.vo.CompanyVoiceRoboticQwUserListVo;
+
+import java.util.List;
+
+/**
+ * 机器人外呼任务Mapper接口
+ * 
+ * @author fs
+ * @date 2024-12-04
+ */
+public interface CompanyVoiceRoboticMapper extends BaseMapper<CompanyVoiceRobotic> {
+    /**
+     * 查询机器人外呼任务
+     * 
+     * @param id 机器人外呼任务ID
+     * @return 机器人外呼任务
+     */
+    public CompanyVoiceRobotic selectCompanyVoiceRoboticById(Long id);
+
+    /**
+     * 查询机器人外呼任务列表
+     * 
+     * @param companyVoiceRobotic 机器人外呼任务
+     * @return 机器人外呼任务集合
+     */
+    public List<CompanyVoiceRobotic> selectCompanyVoiceRoboticList(CompanyVoiceRobotic companyVoiceRobotic);
+    public List<CompanyVoiceRobotic> selectCompanyVoiceRoboticListCompany(CompanyVoiceRobotic companyVoiceRobotic);
+
+    /**
+     * 新增机器人外呼任务
+     * 
+     * @param companyVoiceRobotic 机器人外呼任务
+     * @return 结果
+     */
+    public int insertCompanyVoiceRobotic(CompanyVoiceRobotic companyVoiceRobotic);
+
+    /**
+     * 修改机器人外呼任务
+     * 
+     * @param companyVoiceRobotic 机器人外呼任务
+     * @return 结果
+     */
+    public int updateCompanyVoiceRobotic(CompanyVoiceRobotic companyVoiceRobotic);
+
+    /**
+     * 删除机器人外呼任务
+     * 
+     * @param id 机器人外呼任务ID
+     * @return 结果
+     */
+    public int deleteCompanyVoiceRoboticById(Long id);
+
+    /**
+     * 批量删除机器人外呼任务
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteCompanyVoiceRoboticByIds(Long[] ids);
+
+    List<CompanyVoiceRoboticQwUserListVo> qwUserList();
+    List<CompanyVoiceRoboticQwUserListVo> qwUserListCompany(CompanyVoiceRobotic companyVoiceRobotic);
+}

+ 68 - 0
fs-service-system/src/main/java/com/fs/company/mapper/CompanyVoiceRoboticWxMapper.java

@@ -0,0 +1,68 @@
+package com.fs.company.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.company.domain.CompanyVoiceRoboticWx;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * AI外呼任务加微方式Mapper接口
+ * 
+ * @author fs
+ * @date 2024-12-06
+ */
+public interface CompanyVoiceRoboticWxMapper extends BaseMapper<CompanyVoiceRoboticWx> {
+    /**
+     * 查询AI外呼任务加微方式
+     * 
+     * @param id AI外呼任务加微方式ID
+     * @return AI外呼任务加微方式
+     */
+    public CompanyVoiceRoboticWx selectCompanyVoiceRoboticWxById(Long id);
+
+    /**
+     * 查询AI外呼任务加微方式列表
+     * 
+     * @param companyVoiceRoboticWx AI外呼任务加微方式
+     * @return AI外呼任务加微方式集合
+     */
+    public List<CompanyVoiceRoboticWx> selectCompanyVoiceRoboticWxList(CompanyVoiceRoboticWx companyVoiceRoboticWx);
+
+    /**
+     * 新增AI外呼任务加微方式
+     * 
+     * @param companyVoiceRoboticWx AI外呼任务加微方式
+     * @return 结果
+     */
+    public int insertCompanyVoiceRoboticWx(CompanyVoiceRoboticWx companyVoiceRoboticWx);
+
+    /**
+     * 修改AI外呼任务加微方式
+     * 
+     * @param companyVoiceRoboticWx AI外呼任务加微方式
+     * @return 结果
+     */
+    public int updateCompanyVoiceRoboticWx(CompanyVoiceRoboticWx companyVoiceRoboticWx);
+
+    /**
+     * 删除AI外呼任务加微方式
+     * 
+     * @param id AI外呼任务加微方式ID
+     * @return 结果
+     */
+    public int deleteCompanyVoiceRoboticWxById(Long id);
+
+    /**
+     * 批量删除AI外呼任务加微方式
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteCompanyVoiceRoboticWxByIds(Long[] ids);
+
+    void insertList(@Param("list") List<CompanyVoiceRoboticWx> list);
+
+    List<CompanyVoiceRoboticWx> selectByRoboticId(@Param("id") Long id);
+
+}

+ 70 - 0
fs-service-system/src/main/java/com/fs/company/mapper/CompanyWxAccountMapper.java

@@ -0,0 +1,70 @@
+package com.fs.company.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.domain.CompanyWxAccount;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 企微账号Mapper接口
+ * 
+ * @author fs
+ * @date 2024-12-09
+ */
+public interface CompanyWxAccountMapper extends BaseMapper<CompanyWxAccount> {
+    /**
+     * 查询企微账号
+     * 
+     * @param id 企微账号ID
+     * @return 企微账号
+     */
+    public CompanyWxAccount selectCompanyWxAccountById(Long id);
+
+    /**
+     * 查询企微账号列表
+     * 
+     * @param companyWxAccount 企微账号
+     * @return 企微账号集合
+     */
+    public List<CompanyWxAccount> selectCompanyWxAccountList(CompanyWxAccount companyWxAccount);
+    public List<CompanyWxAccount> selectCompanyWxAccountListCompany(CompanyWxAccount companyWxAccount);
+
+    /**
+     * 新增企微账号
+     * 
+     * @param companyWxAccount 企微账号
+     * @return 结果
+     */
+    public int insertCompanyWxAccount(CompanyWxAccount companyWxAccount);
+
+    /**
+     * 修改企微账号
+     * 
+     * @param companyWxAccount 企微账号
+     * @return 结果
+     */
+    public int updateCompanyWxAccount(CompanyWxAccount companyWxAccount);
+
+    /**
+     * 删除企微账号
+     * 
+     * @param id 企微账号ID
+     * @return 结果
+     */
+    public int deleteCompanyWxAccountById(Long id);
+
+    /**
+     * 批量删除企微账号
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteCompanyWxAccountByIds(Long[] ids);
+
+    List<CompanyUser> companyListAll();
+    List<CompanyUser> companyListAllCompany(CompanyUser companyUser);
+
+    CompanyWxAccount selectByCompanyUserAndWxNo(@Param("userId") Long userId, @Param("wxNo") String wxNo);
+}

+ 62 - 0
fs-service-system/src/main/java/com/fs/company/mapper/CompanyWxChatMapper.java

@@ -0,0 +1,62 @@
+package com.fs.company.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.company.domain.CompanyWxChat;
+
+import java.util.List;
+
+/**
+ * 个微聊天Mapper接口
+ * 
+ * @author fs
+ * @date 2025-01-15
+ */
+public interface CompanyWxChatMapper extends BaseMapper<CompanyWxChat> {
+    /**
+     * 查询个微聊天
+     * 
+     * @param id 个微聊天主键
+     * @return 个微聊天
+     */
+    public CompanyWxChat selectCompanyWxChatById(Long id);
+
+    /**
+     * 查询个微聊天列表
+     * 
+     * @param companyWxChat 个微聊天
+     * @return 个微聊天集合
+     */
+    public List<CompanyWxChat> selectCompanyWxChatList(CompanyWxChat companyWxChat);
+
+    /**
+     * 新增个微聊天
+     * 
+     * @param companyWxChat 个微聊天
+     * @return 结果
+     */
+    public int insertCompanyWxChat(CompanyWxChat companyWxChat);
+
+    /**
+     * 修改个微聊天
+     * 
+     * @param companyWxChat 个微聊天
+     * @return 结果
+     */
+    public int updateCompanyWxChat(CompanyWxChat companyWxChat);
+
+    /**
+     * 删除个微聊天
+     * 
+     * @param id 个微聊天主键
+     * @return 结果
+     */
+    public int deleteCompanyWxChatById(Long id);
+
+    /**
+     * 批量删除个微聊天
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteCompanyWxChatByIds(Long[] ids);
+}

+ 71 - 0
fs-service-system/src/main/java/com/fs/company/mapper/CompanyWxClientMapper.java

@@ -0,0 +1,71 @@
+package com.fs.company.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.domain.CompanyWxClient;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 添加个微信账号Mapper接口
+ * 
+ * @author fs
+ * @date 2024-12-09
+ */
+public interface CompanyWxClientMapper extends BaseMapper<CompanyWxClient> {
+    /**
+     * 查询添加个微信账号
+     * 
+     * @param id 添加个微信账号ID
+     * @return 添加个微信账号
+     */
+    public CompanyWxClient selectCompanyWxClientById(Long id);
+
+    /**
+     * 查询添加个微信账号列表
+     * 
+     * @param companyWxClient 添加个微信账号
+     * @return 添加个微信账号集合
+     */
+    public List<CompanyWxClient> selectCompanyWxClientList(CompanyWxClient companyWxClient);
+    public List<CompanyWxClient> selectCompanyWxClientListCompany(CompanyWxClient companyWxClient);
+
+    /**
+     * 新增添加个微信账号
+     * 
+     * @param companyWxClient 添加个微信账号
+     * @return 结果
+     */
+    public int insertCompanyWxClient(CompanyWxClient companyWxClient);
+
+    /**
+     * 修改添加个微信账号
+     * 
+     * @param companyWxClient 添加个微信账号
+     * @return 结果
+     */
+    public int updateCompanyWxClient(CompanyWxClient companyWxClient);
+
+    /**
+     * 删除添加个微信账号
+     * 
+     * @param id 添加个微信账号ID
+     * @return 结果
+     */
+    public int deleteCompanyWxClientById(Long id);
+
+    /**
+     * 批量删除添加个微信账号
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteCompanyWxClientByIds(Long[] ids);
+
+    List<CompanyWxClient> toDayAddWxAccountList(@Param("companyId") Long companyId, @Param("accountId") Long accountId, @Param("addType") Integer addType);
+
+    CompanyUser selectCompanyByAccountId(@Param("wxId") Long wxId);
+
+    List<CompanyWxClient> listCompanyIds(@Param("ids") String[] ids);
+}

+ 62 - 0
fs-service-system/src/main/java/com/fs/company/mapper/CompanyWxDialogMapper.java

@@ -0,0 +1,62 @@
+package com.fs.company.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.company.domain.CompanyWxDialog;
+
+import java.util.List;
+
+/**
+ * 添加微信话术Mapper接口
+ * 
+ * @author fs
+ * @date 2024-12-06
+ */
+public interface CompanyWxDialogMapper extends BaseMapper<CompanyWxDialog> {
+    /**
+     * 查询添加微信话术
+     * 
+     * @param id 添加微信话术ID
+     * @return 添加微信话术
+     */
+    public CompanyWxDialog selectCompanyWxDialogById(Long id);
+
+    /**
+     * 查询添加微信话术列表
+     * 
+     * @param companyWxDialog 添加微信话术
+     * @return 添加微信话术集合
+     */
+    public List<CompanyWxDialog> selectCompanyWxDialogList(CompanyWxDialog companyWxDialog);
+
+    /**
+     * 新增添加微信话术
+     * 
+     * @param companyWxDialog 添加微信话术
+     * @return 结果
+     */
+    public int insertCompanyWxDialog(CompanyWxDialog companyWxDialog);
+
+    /**
+     * 修改添加微信话术
+     * 
+     * @param companyWxDialog 添加微信话术
+     * @return 结果
+     */
+    public int updateCompanyWxDialog(CompanyWxDialog companyWxDialog);
+
+    /**
+     * 删除添加微信话术
+     * 
+     * @param id 添加微信话术ID
+     * @return 结果
+     */
+    public int deleteCompanyWxDialogById(Long id);
+
+    /**
+     * 批量删除添加微信话术
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteCompanyWxDialogByIds(Long[] ids);
+}

+ 0 - 5
fs-service-system/src/main/java/com/fs/company/service/ICompanyMenuService.java

@@ -1,7 +1,6 @@
 package com.fs.company.service;
 
 import com.fs.company.domain.CompanyMenu;
-
 import com.fs.company.domain.CompanyMenuTreeSelect;
 import com.fs.system.vo.RouterVO;
 
@@ -66,16 +65,12 @@ public interface ICompanyMenuService
 
     List<CompanyMenu> selectMenuTreeByUserId(Long userId, boolean admin);
 
-    List<CompanyMenu> selectMenuTreeByCompany(Long userId, boolean admin);
-
     List<RouterVO> buildMenus(List<CompanyMenu> menus);
 
     Collection<? extends String> selectMenuPermsByUserId(Long userId);
 
     List<CompanyMenu> selectMenuList(CompanyMenu menu, Long userId, String userType);
 
-    List<CompanyMenu> selectMenuListByCompany(CompanyMenu menu, Long userId, String userType);
-
     List<CompanyMenuTreeSelect> buildMenuTreeSelect(List<CompanyMenu> menus);
 
     public List<CompanyMenu> buildMenuTree(List<CompanyMenu> menus);

+ 64 - 0
fs-service-system/src/main/java/com/fs/company/service/ICompanyVoiceDialogService.java

@@ -0,0 +1,64 @@
+package com.fs.company.service;
+
+import com.fs.company.domain.CompanyVoiceDialog;
+
+import java.util.List;
+
+/**
+ * AI外呼话术Service接口
+ * 
+ * @author fs
+ * @date 2024-12-04
+ */
+public interface ICompanyVoiceDialogService 
+{
+    /**
+     * 查询AI外呼话术
+     * 
+     * @param id AI外呼话术ID
+     * @return AI外呼话术
+     */
+    public CompanyVoiceDialog selectCompanyVoiceDialogById(Long id);
+
+    /**
+     * 查询AI外呼话术列表
+     * 
+     * @param companyVoiceDialog AI外呼话术
+     * @return AI外呼话术集合
+     */
+    public List<CompanyVoiceDialog> selectCompanyVoiceDialogList(CompanyVoiceDialog companyVoiceDialog);
+
+    /**
+     * 新增AI外呼话术
+     * 
+     * @param companyVoiceDialog AI外呼话术
+     * @return 结果
+     */
+    public int insertCompanyVoiceDialog(CompanyVoiceDialog companyVoiceDialog);
+
+    /**
+     * 修改AI外呼话术
+     * 
+     * @param companyVoiceDialog AI外呼话术
+     * @return 结果
+     */
+    public int updateCompanyVoiceDialog(CompanyVoiceDialog companyVoiceDialog);
+
+    /**
+     * 批量删除AI外呼话术
+     * 
+     * @param ids 需要删除的AI外呼话术ID
+     * @return 结果
+     */
+    public int deleteCompanyVoiceDialogByIds(Long[] ids);
+
+    /**
+     * 删除AI外呼话术信息
+     * 
+     * @param id AI外呼话术ID
+     * @return 结果
+     */
+    public int deleteCompanyVoiceDialogById(Long id);
+
+    String getConfigUrl(Long id);
+}

+ 64 - 0
fs-service-system/src/main/java/com/fs/company/service/ICompanyVoiceRoboticCalleesService.java

@@ -0,0 +1,64 @@
+package com.fs.company.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.company.domain.CompanyVoiceRoboticCallees;
+
+import java.util.List;
+
+/**
+ * 任务外呼电话Service接口
+ * 
+ * @author fs
+ * @date 2024-12-04
+ */
+public interface ICompanyVoiceRoboticCalleesService extends IService<CompanyVoiceRoboticCallees> {
+    /**
+     * 查询任务外呼电话
+     * 
+     * @param id 任务外呼电话ID
+     * @return 任务外呼电话
+     */
+    public CompanyVoiceRoboticCallees selectCompanyVoiceRoboticCalleesById(Long id);
+
+    /**
+     * 查询任务外呼电话列表
+     * 
+     * @param companyVoiceRoboticCallees 任务外呼电话
+     * @return 任务外呼电话集合
+     */
+    public List<CompanyVoiceRoboticCallees> selectCompanyVoiceRoboticCalleesList(CompanyVoiceRoboticCallees companyVoiceRoboticCallees);
+
+    /**
+     * 新增任务外呼电话
+     * 
+     * @param companyVoiceRoboticCallees 任务外呼电话
+     * @return 结果
+     */
+    public int insertCompanyVoiceRoboticCallees(CompanyVoiceRoboticCallees companyVoiceRoboticCallees);
+
+    /**
+     * 修改任务外呼电话
+     * 
+     * @param companyVoiceRoboticCallees 任务外呼电话
+     * @return 结果
+     */
+    public int updateCompanyVoiceRoboticCallees(CompanyVoiceRoboticCallees companyVoiceRoboticCallees);
+
+    /**
+     * 批量删除任务外呼电话
+     * 
+     * @param ids 需要删除的任务外呼电话ID
+     * @return 结果
+     */
+    public int deleteCompanyVoiceRoboticCalleesByIds(Long[] ids);
+
+    /**
+     * 删除任务外呼电话信息
+     * 
+     * @param id 任务外呼电话ID
+     * @return 结果
+     */
+    public int deleteCompanyVoiceRoboticCalleesById(Long id);
+
+    List<CompanyVoiceRoboticCallees> selectCompanyVoiceRoboticCalleesListByRoboticId(Long id);
+}

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

@@ -0,0 +1,78 @@
+package com.fs.company.service;
+
+import com.fs.aicall.domain.apiresult.PushIIntentionResult;
+import com.fs.company.domain.CompanyVoiceRobotic;
+import com.fs.company.vo.AddWxClientVo;
+import com.fs.company.vo.CompanyVoiceRoboticQwUserListVo;
+
+import java.util.List;
+
+/**
+ * 机器人外呼任务Service接口
+ * 
+ * @author fs
+ * @date 2024-12-04
+ */
+public interface ICompanyVoiceRoboticService 
+{
+    /**
+     * 查询机器人外呼任务
+     * 
+     * @param id 机器人外呼任务ID
+     * @return 机器人外呼任务
+     */
+    public CompanyVoiceRobotic selectCompanyVoiceRoboticById(Long id);
+
+    /**
+     * 查询机器人外呼任务列表
+     * 
+     * @param companyVoiceRobotic 机器人外呼任务
+     * @return 机器人外呼任务集合
+     */
+    public List<CompanyVoiceRobotic> selectCompanyVoiceRoboticList(CompanyVoiceRobotic companyVoiceRobotic);
+    public List<CompanyVoiceRobotic> selectCompanyVoiceRoboticListCompany(CompanyVoiceRobotic companyVoiceRobotic);
+
+    /**
+     * 新增机器人外呼任务
+     * 
+     * @param companyVoiceRobotic 机器人外呼任务
+     * @return 结果
+     */
+    public int insertCompanyVoiceRobotic(CompanyVoiceRobotic companyVoiceRobotic);
+
+    /**
+     * 修改机器人外呼任务
+     * 
+     * @param companyVoiceRobotic 机器人外呼任务
+     * @return 结果
+     */
+    public int updateCompanyVoiceRobotic(CompanyVoiceRobotic companyVoiceRobotic);
+
+    /**
+     * 批量删除机器人外呼任务
+     * 
+     * @param ids 需要删除的机器人外呼任务ID
+     * @return 结果
+     */
+    public int deleteCompanyVoiceRoboticByIds(Long[] ids);
+
+    /**
+     * 删除机器人外呼任务信息
+     * 
+     * @param id 机器人外呼任务ID
+     * @return 结果
+     */
+    public int deleteCompanyVoiceRoboticById(Long id);
+
+    List<CompanyVoiceRoboticQwUserListVo> qwUserList();
+    List<CompanyVoiceRoboticQwUserListVo> qwUserListCompany(CompanyVoiceRobotic companyVoiceRobotic);
+
+    void callerResult(PushIIntentionResult result);
+
+    void test(Long id);
+    void dispenseWx(Long id);
+
+    void addCompany(AddWxClientVo vo);
+
+    void addWx(CompanyVoiceRobotic companyVoiceRobotic);
+}

+ 64 - 0
fs-service-system/src/main/java/com/fs/company/service/ICompanyVoiceRoboticWxService.java

@@ -0,0 +1,64 @@
+package com.fs.company.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.company.domain.CompanyVoiceRoboticWx;
+
+import java.util.List;
+
+/**
+ * AI外呼任务加微方式Service接口
+ * 
+ * @author fs
+ * @date 2024-12-06
+ */
+public interface ICompanyVoiceRoboticWxService extends IService<CompanyVoiceRoboticWx> {
+    /**
+     * 查询AI外呼任务加微方式
+     * 
+     * @param id AI外呼任务加微方式ID
+     * @return AI外呼任务加微方式
+     */
+    public CompanyVoiceRoboticWx selectCompanyVoiceRoboticWxById(Long id);
+
+    /**
+     * 查询AI外呼任务加微方式列表
+     * 
+     * @param companyVoiceRoboticWx AI外呼任务加微方式
+     * @return AI外呼任务加微方式集合
+     */
+    public List<CompanyVoiceRoboticWx> selectCompanyVoiceRoboticWxList(CompanyVoiceRoboticWx companyVoiceRoboticWx);
+
+    /**
+     * 新增AI外呼任务加微方式
+     * 
+     * @param companyVoiceRoboticWx AI外呼任务加微方式
+     * @return 结果
+     */
+    public int insertCompanyVoiceRoboticWx(CompanyVoiceRoboticWx companyVoiceRoboticWx);
+
+    /**
+     * 修改AI外呼任务加微方式
+     * 
+     * @param companyVoiceRoboticWx AI外呼任务加微方式
+     * @return 结果
+     */
+    public int updateCompanyVoiceRoboticWx(CompanyVoiceRoboticWx companyVoiceRoboticWx);
+
+    /**
+     * 批量删除AI外呼任务加微方式
+     * 
+     * @param ids 需要删除的AI外呼任务加微方式ID
+     * @return 结果
+     */
+    public int deleteCompanyVoiceRoboticWxByIds(Long[] ids);
+
+    /**
+     * 删除AI外呼任务加微方式信息
+     * 
+     * @param id AI外呼任务加微方式ID
+     * @return 结果
+     */
+    public int deleteCompanyVoiceRoboticWxById(Long id);
+
+    List<CompanyVoiceRoboticWx> selectWxList(Long id);
+}

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff